OTRSAppointmentCalendar
5.0.3
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Fixed: Error in calendar if UserLogin contain Unicode character (bug#12493).
Fixed: restore default settings button missing when view changed in ResourceOverview.
Fixed: iCal copied URL from OTRS Calendar does not update in iCloud (bug#12667).
Fixed: Assigned appointments notification is not translated (bug#12945).
Fixed: OTRSAppointmentCalendar Module sends an update notification when an event is deleted (bug#12958).
Fixed: Useless "Description" widget in sidebar (bug#12943).
Fixed: OTRS notification option for OTRS Business Solution™ Feature are shown in the free (bug#13035).
Fixed: Repeating appointments not linked to origin ticket (bug#12592).
Fixes and improvements for unit tests / selenium tests.
Translated location hover title.
Improved link object module for calendar appointments.
Updated package description.
Updated translations.
Build for OTRSAppointmentCalendar 5 patch level 2.
Build for OTRSAppointmentCalendar 5.
The Appointment Calendar package.
Das Terminkalender-Paket.
A naptár csomag.
Модул за календаре и термине.
Modul za kalendare i termine.
5.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Minimum framework version for this package is <strong><u>5.0.14</u></strong>. Please make sure you have updated the framework before installing this package!<br/>
<br/>
<br/>
<strong>REQUIRED PERL MODULES</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>Willkommen</strong>
<br/>
<br/>
Sie sind dabei das OTRS Paket OTRSAppointmentCalendar zu installieren.<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Die minimale OTRS Frameworkversion für dieses Paket ist <strong><u>5.0.14</u></strong>. Bitte stellen Sie sicher, dass Sie das Framework vor der Installation dieses Pakets aktualisiert haben!<br/>
<br/>
<br/>
<strong>BENÖTIGTEN PERLMODULE</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az OTRSAppointmentCalendar OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
A legkisebb keretrendszer-verzió ehhez a csomaghoz az <strong><u>5.0.14</u></strong>. Győződjön meg arról, hogy frissítette-e a keretrendszert ezen csomag telepítése előtt!<br/>
<br/>
<br/>
<strong>SZÜKSÉGES PERL MODUL</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ДОБРОДОШЛИ</strong>
<br/>
<br/>
Ово је инсталација OTRS пакета OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Најмања подржана верзија система за овај пакет је <strong><u>5.0.14</u></strong>. Проверите да ли сте освежили ваш систем пре инсталације пакета!<br/>
<br/>
<br/>
<strong>ОБАВЕЗНИ ПЕРЛ МОДУЛИ</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>DOBRODOŠLI</strong>
<br/>
<br/>
Ovo je instalacija OTRS paketa OTRSAppointmentCalendar.<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Najmanja podržana verzija sistema za ovaj paket je <strong><u>5.0.14</u></strong>. Proverite da li ste osvežili vaš sistem pre instalacije paketa!<br/>
<br/>
<br/>
<strong>OBAVEZNI PERL MODULI</strong>
<br/>
<br/>
DateTime v0.52+<br/>
DateTime::TimeZone v1.08+<br/>
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>УПОЗОРЕЊЕ</strong>
<br/>
<br/>
Уколико деинсталирате овај пакет, све табеле у бази података које су креиране приликом инсталације ће бити обрисане.
Сви подаци из ових табела биће неповратно изгубљени.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>UPOZORENJE</strong>
<br/>
<br/>
Ukoliko deinstalerate ovaj paket, sve tabele u bazi podataka koje su kreirane prilikom instalacije će biti obrisane.
Svi podaci iz ovih tabela biće nepovratno izgubljeni.
<br/>
<br/>
((enjoy))<br/>
<br/>
DateTime
DateTime::TimeZone
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeInstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUpgrade();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeUninstall();
$Kernel::OM->Get('var::packagesetup::OTRSAppointmentCalendar')->CodeReinstall();
2017-10-10 09:52:26
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQdWJsaWNGcm9udGVuZDo6TW9kdWxlIyMjUHVibGljQ2FsZW5kYXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlB1YmxpYyBjYWxlbmRhci48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+UHVibGljIENhbGVuZGFyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+T3ZlcnZpZXc8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+Q2FsZW5kYXI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NzU8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+Q2FsZW5kYXIgT3ZlcnZpZXc8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz42MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5SZXNvdXJjZSBPdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPExpbmtPcHRpb24+Y2xhc3M9Ik9UUlNCdXNpbmVzc1JlcXVpcmVkIjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz43MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBuZXcgYXBwb2ludG1lbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPk5ldyBBcHBvaW50bWVudDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7U3ViYWN0aW9uPUFwcG9pbnRtZW50Q3JlYXRlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLm1pbi5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPnRoaXJkcGFydHkvZnVsbGNhbGVuZGFyLXNjaGVkdWxlci0xLjQuMC9zY2hlZHVsZXIubWluLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+Q29yZS5BcHBvaW50bWVudENhbGVuZGFyLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PnRoaXJkcGFydHkvbW9tZW50anMtMi4xMy4wL21vbWVudC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci1zY2hlZHVsZXItMS40LjAvc2NoZWR1bGVyLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9jbGlwYm9hcmQuanMtMS41LjEyL2NsaXBib2FyZC5taW4uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEVkaXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPkVkaXQgYXBwb2ludG1lbnQ8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+PC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEFwcG9pbnRtZW50TGlzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBsaXN0PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudFBsdWdpblNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5QbHVnaW4gc2VhcmNoPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNhbGVuZGFyIG1hbmFnZSBzY3JlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZSBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBDYWxlbmRhcnM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q2FsZW5kYXI8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWUgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgQ2FsZW5kYXJzPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPExpbmtPcHRpb24+PC9MaW5rT3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+Q2FsZW5kYXI8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkwMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPENTUz5Db3JlLkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLmNzczwvQ1NTPgogICAgICAgICAgICAgICAgICAgIDxDU1M+dGhpcmRwYXJ0eS9zcGVjdHJ1bS0xLjguMC9zcGVjdHJ1bS5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2NsaXBib2FyZC5qcy0xLjUuMTIvY2xpcGJvYXJkLm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L3NwZWN0cnVtLTEuOC4wL3NwZWN0cnVtLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBcHBvaW50bWVudEltcG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0IEFwcG9pbnRtZW50czwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5DYWxlbmRhcjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckxpbWl0T3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXGQrIj4xMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyQ29sb3JzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDAwMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMUUxRTFFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzNBM0EzQTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM1NDU0NTM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNkU2RTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg3ODY4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4ODg3ODc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jQTA5RkEwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0I4QjhCODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNEMEQwRDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRThFOEU4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTExMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODk0ODAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg4ODUwMTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM0NTg0MDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDI4NDAxPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAxODQ0ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMDg2ODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA0QTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwMTg4ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM0OTFBODg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jODkxRTg4PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Izg5MTY0ODwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjIxMDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY4ODAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkEwMzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4M0Y5MDI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDVGODAyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAzRjk4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiMwMEZERkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jMDA4Q0ZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzAwMkVGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM4OTMxRkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkYzOUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGMjk4NzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNGRjcyNkU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkZDRTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGRkI2RDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNDRUZBNkU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNjhGOTZFPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzY4RkRGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiM2OEZCRDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jNkFDRkZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+IzZFNzZGRjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPiNEMjc4RkY8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT4jRkY3QUZGPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+I0ZGN0ZEMzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4jIyMwMTAwLVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW48L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVVJMIj4mbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSVzPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMTIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Tm9ybWFsPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6Q29tcGxleFRhYmxlOjpTZXR0aW5nc1Zpc2liaWxpdHkjIyNBcHBvaW50bWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmUgQWN0aW9ucyB3aGVyZSBhIHNldHRpbmdzIGJ1dHRvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxpbmtlZCBvYmplY3RzIHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXNlIEFjdGlvbnMgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgdGhlIGZvbGxvd2luZyBKUyBhbmQgQ1NTIGZpbGVzOiBDb3JlLkFsbG9jYXRpb25MaXN0LmNzcywgQ29yZS5VSS5BbGxvY2F0aW9uTGlzdC5qcywgQ29yZS5VSS5UYWJsZS5Tb3J0LmpzLCBDb3JlLkFnZW50LlRhYmxlRmlsdGVycy5qcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BZ2VudFRpY2tldFpvb208L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6Q29tcGxleFRhYmxlIyMjQXBwb2ludG1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50LnBtPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0Q29sdW1ucyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FsZW5kYXJOYW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXJ0VGltZSI+MjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbmRUaW1lIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2F0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5vdGlmaWNhdGlvblRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2hhbmdlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpb3JpdHkiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhbGVuZGFyTmFtZSI+MTAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj4xMTA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU3RhcnRUaW1lIj4xMjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW5kVGltZSI+MTMwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2F0aW9uIj4xNDA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm90aWZpY2F0aW9uVGltZSI+MTUwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNoYW5nZWQiPjE2MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDcmVhdGVkIj4xNzA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6SW1wb3J0OjpSZWN1cnJpbmdNb250aHNMaW1pdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PVFJTIGRvZXNuJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJcZCsiPjEyMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAxMDAtRmlyc3RSZXNwb25zZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iS2V5Ij5GaXJzdFJlc3BvbnNlVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5GaXJzdCByZXNwb25zZSB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0U0xBVXBkYXRlfFRpY2tldFF1ZXVlVXBkYXRlfFRpY2tldFN0YXRlVXBkYXRlfFRpY2tldENyZWF0ZXxBcnRpY2xlQ3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXJrIj5FPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRUeXBlIyMjMDIwMC1VcGRhdGVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+VXBkYXRlVGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5VcGRhdGUgdGltZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFNMQVVwZGF0ZXxUaWNrZXRRdWV1ZVVwZGF0ZXxUaWNrZXRTdGF0ZVVwZGF0ZXxUaWNrZXRDcmVhdGV8QXJ0aWNsZUNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFyayI+RTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZSMjIzAzMDAtU29sdXRpb25UaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+U29sdXRpb25UaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPlNvbHV0aW9uIHRpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRTTEFVcGRhdGV8VGlja2V0UXVldWVVcGRhdGV8VGlja2V0U3RhdGVVcGRhdGV8VGlja2V0Q3JlYXRlfEFydGljbGVDcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwNDAwLVBlbmRpbmdUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6UGVuZGluZ1RpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSI+UGVuZGluZ1RpbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+UGVuZGluZyB0aW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+VGlja2V0UGVuZGluZ1RpbWVVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPlA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFR5cGUjIyMwNTAwLUR5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RHluYW1pY0ZpZWxkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXkiPkR5bmFtaWNGaWVsZF8lczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljRmllbGRfJXM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXREeW5hbWljRmllbGRVcGRhdGVfLio8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hcmsiPkQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFNlYXJjaFBhcmFtIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlRpdGxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlcyIgVHJhbnNsYXRhYmxlPSIxIj5UeXBlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZXMiIFRyYW5zbGF0YWJsZT0iMSI+U3RhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXRlVHlwZSIgVHJhbnNsYXRhYmxlPSIxIj5TdGF0ZSB0eXBlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0aWVzIiBUcmFuc2xhdGFibGU9IjEiPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlcyIgVHJhbnNsYXRhYmxlPSIxIj5TZXJ2aWNlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTTEFzIiBUcmFuc2xhdGFibGU9IjEiPlNMQTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTG9ja3MiIFRyYW5zbGF0YWJsZT0iMSI+TG9jayBzdGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT3duZXJJRHMiIFRyYW5zbGF0YWJsZT0iMSI+T3duZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlc3BvbnNpYmxlSURzIiBUcmFuc2xhdGFibGU9IjEiPlJlc3BvbnNpYmxlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lcklEIiBUcmFuc2xhdGFibGU9IjEiPkN1c3RvbWVySUQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVyVXNlckxvZ2luIiBUcmFuc2xhdGFibGU9IjEiPkN1c3RvbWVyIHVzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyb20iIFRyYW5zbGF0YWJsZT0iMSI+RnJvbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVG8iIFRyYW5zbGF0YWJsZT0iMSI+VG88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNjIiBUcmFuc2xhdGFibGU9IjEiPkNjPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdWJqZWN0IiBUcmFuc2xhdGFibGU9IjEiPlN1YmplY3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJvZHkiIFRyYW5zbGF0YWJsZT0iMSI+Qm9keTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXR0YWNobWVudE5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QXR0YWNobWVudCBOYW1lPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDwhLS0gbm90aWZpY2F0aW9ucyAtLT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCMjI0V2ZW50T2JqZWN0VHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+Q2FsZW5kYXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJFdmVudHMjIyNDYWxlbmRhciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW48L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5DYWxlbmRhckNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNhbGVuZGFyVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkV2ZW50cyMjI0FwcG9pbnRtZW50IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkFwcG9pbnRtZW50Q3JlYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXBwb2ludG1lbnRVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BcHBvaW50bWVudERlbGV0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCMjIzEwMC1Ob3RpZmljYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6Tm90aWZpY2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KEFwcG9pbnRtZW50Q3JlYXRlfEFwcG9pbnRtZW50VXBkYXRlfEFwcG9pbnRtZW50RGVsZXRlfEFwcG9pbnRtZW50Tm90aWZpY2F0aW9ufENhbGVuZGFyQ3JlYXRlfENhbGVuZGFyVXBkYXRlKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIG5vdGlmaWNhdGlvbnMgdWkgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIGFkbWluIGFyZWEgb2YgT1RSUy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgTm90aWZpY2F0aW9uczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5BZG1pbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE1vZHVsZT5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+QXBwb2ludG1lbnQgTm90aWZpY2F0aW9uczwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPlN5c3RlbTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+Q29yZS5BZ2VudC5BZG1pbi5Ob3RpZmljYXRpb25FdmVudC5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LkFkbWluLk5vdGlmaWNhdGlvbkV2ZW50LmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6OkFkbWluOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQjIyNSaWNoVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Vc2VzIHJpY2h0ZXh0IGZvciB2aWV3aW5nIGFuZCBlZGl0aW5nIHRpY2tldCBub3RpZmljYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpBZG1pbk5vdGlmaWNhdGlvbkV2ZW50PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpBZG1pbjo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IyMjUmljaFRleHRXaWR0aCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB3aWR0aCBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29tcG9uZW50IGZvciB0aGlzIHNjcmVlbi4gRW50ZXIgbnVtYmVyIChwaXhlbHMpIG9yIHBlcmNlbnQgdmFsdWUgKHJlbGF0aXZlKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeXGQrJT8kIj42MjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCMjI1JpY2hUZXh0SGVpZ2h0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhlaWdodCBmb3IgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29tcG9uZW50IGZvciB0aGlzIHNjcmVlbi4gRW50ZXIgbnVtYmVyIChwaXhlbHMpIG9yIHBlcmNlbnQgdmFsdWUgKHJlbGF0aXZlKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSJeXGQrJT8kIj4zMjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHJlZmVyZW5jZXNHcm91cHMjIyNBcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6QXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29sdW1uIj5Ob3RpZmljYXRpb24gU2V0dGluZ3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPkFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiIFRyYW5zbGF0YWJsZT0iMSI+Q2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+QWRtaW5BcHBvaW50bWVudE5vdGlmY2F0aW9uRXZlbnRUcmFuc3BvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjgwMDE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5vdGlmaWNhdGlvbjo6Q2hhcmFjdGVyc1BlckxpbmUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBwZXIgbGluZSB1c2VkIGluIGNhc2UgYW4gSFRNTCBhcnRpY2xlIHByZXZpZXcgcmVwbGFjZW1lbnQgb24gVGVtcGxhdGVHZW5lcmF0b3IgZm9yIEV2ZW50Tm90aWZpY2F0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjgwPC9TdHJpbmc+PCEtLSBkZWZhdWx0IDEgaG91ciAtLT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPCEtLSBub3RpZmljYXRpb24gdHJhbnNwb3J0cyAtLT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0IyMjRW1haWwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgbm90aWZpY2F0aW9uIHRyYW5zcG9ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkVtYWlsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkVtYWlsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uIj5mYSBmYS1lbnZlbG9wZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MTAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJc09UUlNCdXNpbmVzc1RyYW5zcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRFbmFibGVkQnlEZWZhdWx0Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCMjI05vdGlmaWNhdGlvblZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgbm90aWZpY2F0aW9uIHRyYW5zcG9ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6Ok5vdGlmaWNhdGlvblZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+V2ViIFZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb24iPmZhIGZhLXRoLWxpc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjExMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSXNPVFJTQnVzaW5lc3NUcmFuc3BvcnQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQjIyNTTVMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgbm90aWZpY2F0aW9uIHRyYW5zcG9ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46OkFkbWluTm90aWZpY2F0aW9uRXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OlNNUzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5TTVMgKFNob3J0IE1lc3NhZ2UgU2VydmljZSk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb24iPmZhIGZhLW1vYmlsZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MTIwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJc09UUlNCdXNpbmVzc1RyYW5zcG9ydCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRFbmFibGVkQnlEZWZhdWx0Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQXBwb2ludG1lbnRDYWxlbmRhcjo6RXZlbnRNb2R1bGVQb3N0IyMjMjAwLVRpY2tldEFwcG9pbnRtZW50cyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXBwb2ludG1lbnRDYWxlbmRhcjo6RXZlbnQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUaWNrZXRBcHBvaW50bWVudHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5BcHBvaW50bWVudFVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8IS0tIGRhc2hib2FyZCB3aWRnZXQgLS0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJEYXNoYm9hcmRCYWNrZW5kIyMjMDUwMC1BcHBvaW50bWVudENhbGVuZGFyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBkYXNoYm9hcmQgYmFja2VuZC4gIkxpbWl0IiBkZWZpbmVzIHRoZSBudW1iZXIgb2YgZW50cmllcyBkaXNwbGF5ZWQgYnkgZGVmYXVsdC4gIkdyb3VwIiBpcyB1c2VkIHRvIHJlc3RyaWN0IGFjY2VzcyB0byB0aGUgcGx1Z2luIChlLiBnLiBHcm91cDogYWRtaW47Z3JvdXAxO2dyb3VwMjspLiAiRGVmYXVsdCIgaW5kaWNhdGVzIGlmIHRoZSBwbHVnaW4gaXMgZW5hYmxlZCBieSBkZWZhdWx0IG9yIGlmIHRoZSB1c2VyIG5lZWRzIHRvIGVuYWJsZSBpdCBtYW51YWxseS4gIkNhY2hlVFRMTG9jYWwiIGRlZmluZXMgdGhlIGNhY2hlIGV4cGlyYXRpb24gcGVyaW9kIGluIG1pbnV0ZXMgZm9yIHRoZSBwbHVnaW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpEYXNoYm9hcmQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6RGFzaGJvYXJkOjpBcHBvaW50bWVudENhbGVuZGFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5BcHBvaW50bWVudHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3dFbWFpbCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWRsZU1pbnV0ZXMiPjYwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3J0QnkiPlVzZXJGdWxsbmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRmlsdGVyIj5Ub2RheTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPkNvbnRlbnRTbWFsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGltaXQiPjEwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYWNoZVRUTExvY2FsIj41PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDwhLS0gYXBwb2ludG1lbnQgY3JlYXRpb24gbGlua2VkIHRvIGV4dGVybmFsIG9iamVjdHMgLS0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzU1MC1BcHBvaW50bWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+T1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51OjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPk5ldyBBcHBvaW50bWVudDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj5BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O1N1YmFjdGlvbj1BcHBvaW50bWVudENyZWF0ZTtQbHVnaW5LZXk9MDEwMC1UaWNrZXQ7T2JqZWN0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBvcHVwVHlwZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbHVzdGVyTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5NaXNjZWxsYW5lb3VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbHVzdGVyUHJpb3JpdHkiPjgwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+T3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlIFRyYW5zbGF0YWJsZT0iMSI+QWdlbmRhIE92ZXJ2aWV3PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNhbGVuZGFyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+YWRtaW48L0dyb3VwPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk92ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkFnZW5kYSBPdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxMaW5rT3B0aW9uPjwvTGlua09wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkNhbGVuZGFyPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz42NTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxDU1M+dGhpcmRwYXJ0eS9mdWxsY2FsZW5kYXItMy4wLjEvZnVsbGNhbGVuZGFyLm1pbi5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQXBwb2ludG1lbnRDYWxlbmRhci5jc3M8L0NTUz4KICAgICAgICAgICAgICAgICAgICA8Q1NTPkNvcmUuQXBwb2ludG1lbnRDYWxlbmRhci5BZ2VuZGEuY3NzPC9DU1M+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+dGhpcmRwYXJ0eS9tb21lbnRqcy0yLjEzLjAvbW9tZW50Lm1pbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD50aGlyZHBhcnR5L2Z1bGxjYWxlbmRhci0zLjAuMS9mdWxsY2FsZW5kYXIuanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQWdlbnRBcHBvaW50bWVudEVkaXQ6OkxvY2F0aW9uOjpMaW5rIyMjMS1Hb29nbGVNYXBzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkFwcG9pbnRtZW50Q2FsZW5kYXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTQ2xhc3MiPkdvb2dsZU1hcHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+X2JsYW5rPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUZXh0IiBUcmFuc2xhdGFibGU9IjEiPkxvY2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJVUkwiPmh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz96PTcmYW1wO3E9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uTmFtZSI+ZmEtZ2xvYmUgZmEtbGc8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkV2ZW50TW9kdWxlUG9zdCMjIzk1MC1UaWNrZXRBcHBvaW50bWVudHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPk9UUlNBcHBvaW50bWVudENhbGVuZGFyPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlRpY2tldEFwcG9pbnRtZW50czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPlRpY2tldFNMQVVwZGF0ZXxUaWNrZXRRdWV1ZVVwZGF0ZXxUaWNrZXRTdGF0ZVVwZGF0ZXxUaWNrZXRDcmVhdGV8QXJ0aWNsZUNyZWF0ZXxUaWNrZXRQZW5kaW5nVGltZVVwZGF0ZXxUaWNrZXREeW5hbWljRmllbGRVcGRhdGVfLio8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRyYW5zYWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBDbGFzczo6UmV0dXJuVmFsdWU7CgoKPWhlYWQxIE5BTUUKCkNsYXNzOjpSZXR1cm5WYWx1ZSAtIEEgcmV0dXJuLXZhbHVlIG9iamVjdCB0aGF0IGxldHMgeW91IHRyZWF0IGl0IAphcyBhcyBhIGJvb2xlYW4sIGFycmF5IG9yIG9iamVjdAoKPWhlYWQxIERFU0NSSVBUSU9OCgpDbGFzczo6UmV0dXJuVmFsdWUgaXMgYSAiY2xldmVyIiByZXR1cm4gdmFsdWUgb2JqZWN0IHRoYXQgY2FuIGFsbG93CmNvZGUgY2FsbGluZyB5b3VyIHJvdXRpbmUgdG8gZXhwZWN0OgogICAgYSBib29sZWFuIHZhbHVlIChkaWQgaXQgZmFpbCkKb3IgIGEgbGlzdCAod2hhdCBhcmUgdGhlIHJldHVybiB2YWx1ZXMpCgo9aGVhZDEgRVhBTVBMRQoKICAgIHN1YiBkZW1vIHsKICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKICAgICAgICBteSAkcmV0ID0gQ2xhc3M6OlJldHVyblZhbHVlLT5uZXcoKTsKICAgICAgICAkcmV0LT5hc19hcnJheSgnMCcsICdObyByZXN1bHRzIGZvdW5kJyk7CiAgICAKICAgICAgICB1bmxlc3MoJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXQtPmFzX2Vycm9yKGVycm5vID0+ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPT4gIllvdSBkaWRuJ3Qgc3VwcGx5IGEgcGFyYW1ldGVyLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYWNrdHJhY2UgPT4gMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4oJHJldC0+cmV0dXJuX3ZhbHVlKTsKICAgIH0KCiAgICBpZiAoZGVtbygnZm9vJykpeyAKICAgICAgICBwcmludCAidGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggb25lIHBhcmFtZXRlciI7CiAgICB9CiAgICBpZiAoZGVtbygpKSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIHN1Y2NlZWRlZCB3aXRoIDAgcGFyYW10ZXJzLiBzaG91bGRuJ3QgaGFwcGVuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQgIlRoZSByb3V0aW5lIGZhaWxlZCB3aXRoIDAgcGFyYW1ldGVycyAoYXMgaXQgc2hvdWxkKS4iOwogICAgfQoKCiAgICBteSAkcmV0dXJuID0gZGVtbygpOwogICAgaWYgKCRyZXR1cm4pIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgc3VjY2VlZGVkIHdpdGggMCBwYXJhbXRlcnMuIHNob3VsZG4ndCBoYXBwZW4iOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAiVGhlIHJvdXRpbmUgZmFpbGVkIHdpdGggMCBwYXJhbWV0ZXJzIChhcyBpdCBzaG91bGQpLiAiLgogICAgICAgICAgICAgICJTdGFjayB0cmFjZTpcbiIuCiAgICAgICAgJHJldHVybi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4zID0gZGVtbygnZm9vJyk7CiAgICBwcmludCAiVGhlIHJvdXRpbmUgZ290ICIuam9pbignLCcsQHJldHVybjMpLgogICAgICAgICAgIndoZW4gYXNraW5nIGZvciBkZW1vJ3MgcmVzdWx0cyBhcyBhbiBhcnJheSI7CgoKICAgIG15ICRyZXR1cm4yID0gZGVtbygnZm9vJyk7CgogICAgdW5sZXNzICgkcmV0dXJuMikgewogICAgICAgIHByaW50ICJUaGUgcm91dGluZSBmYWlsZWQgd2l0aCBhIHBhcmFtZXRlci4gc2hvdWxkbid0IGhhcHBlbi4iLgogICAgICAgICAgICAgIlN0YWNrIHRyYWNlOlxuIi4KICAgICAgICAkcmV0dXJuMi0+YmFja3RyYWNlOwogICAgfQoKICAgIG15IEByZXR1cm4yX2FycmF5ID0gQHskcmV0dXJuMn07ICMgVE9ETzogZG9lcyB0aGlzIHdvcmsKICAgIG15IEByZXR1cm4yX2FycmF5MiA9ICRyZXR1cm4yLT5hc19hcnJheTsKCgo9Y3V0CgoKdXNlIEV4cG9ydGVyOwoKdXNlIHZhcnMgcXcvJFZFUlNJT04gQEVYUE9SVCBASVNBLzsKCkBJU0EgPSBxdy9FeHBvcnRlci87CkBFWFBPUlQgPSBxdyAvJnJldHVybl92YWx1ZS87CnVzZSBDYXJwOwp1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CnVzZSBEYXRhOjpEdW1wZXI7CgoKJFZFUlNJT04gPSAnMC41NSc7CgoKdXNlIG92ZXJsb2FkICdib29sJyA9PiBcJmVycm9yX2NvbmRpdGlvbjsKdXNlIG92ZXJsb2FkICciIicgPT4gXCZlcnJvcl9jb25kaXRpb247CnVzZSBvdmVybG9hZCAnZXEnID0+IFwmbXlfZXE7CnVzZSBvdmVybG9hZCAnQHt9JyA9PiBcJmFzX2FycmF5Owp1c2Ugb3ZlcmxvYWQgJ2ZhbGxiYWNrJyA9PiBcJmFzX2FycmF5OwoKCj1oZWFkMSBNRVRIT0RTIAoKPWl0ZW0gbmV3CgpJbnN0YW50aWF0ZSBhIG5ldyBDbGFzczo6UmV0dXJuVmFsdWUgb2JqZWN0Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRzZWxmID0ge307CiAgICBibGVzcygkc2VsZik7CiAgICByZXR1cm4oJHNlbGYpOwp9CgpzdWIgbXlfZXEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmICh3YW50YXJyYXkoKSkgewogICAgICAgIHJldHVybigkc2VsZi0+YXNfYXJyYXkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKCRzZWxmKTsKICAgIH0gICAgCn0KCj1pdGVtIGFzX2FycmF5CgpSZXR1cm4gdGhlICdhc19hcnJheScgYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0IGFzIGFuIGFycmF5LgoKPWN1dAoKCj1pdGVtIGFzX2FycmF5IFtBUlJBWV0KCklmICRzZWxmIGlzIGNhbGxlZCBpbiBhbiBhcnJheSBjb250ZXh0LCByZXR1cm5zIHRoZSBhcnJheSBzcGVjaWZpZWQgaW4gQVJSQVkKCj1jdXQKCnN1YiBhc19hcnJheSB7CgogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIGlmIChAXykgeyAKICAgICAgICBAeyRzZWxmLT57J2FzX2FycmF5J319ID0gKEBfKTsKICAgIH0KICAgIHJldHVybihAeyRzZWxmLT57J2FzX2FycmF5J319KTsKfQoKCj1pdGVtIGFzX2Vycm9yIEhBU0gKClR1cm5zIHRoaXMgcmV0dXJuLXZhbHVlIG9iamVjdCBpbnRvICBhbiBlcnJvciByZXR1cm4gb2JqZWN0LiAgVEFrZXMgdGhyZWUgcGFyYW1ldGVyczoKCiAgICBtZXNzYWdlCiAgICBkb19iYWNrdHJhY2UKICAgIGVycm5vIAoKICAgICdtZXNzYWdlJyBpcyBhIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgZXhwbGFpbmluZyB3aGF0J3MgZ29pbmcgb24KCiAgICAnZG9fYmFja3RyYWNlJyBpcyBhIGJvb2xlYW4uIElmIGl0J3MgdHJ1ZSwgYSBjYXJwLXN0eWxlIGJhY2t0cmFjZSB3aWxsIGJlIAogICAgc3RvcmVkIGluICRzZWxmLT57J2JhY2t0cmFjZSd9LiBJdCBkZWZhdWx0cyB0byB0cnVlCgogICAgZXJybm8gYW5kIG1lc3NhZ2UgZGVmYXVsdCB0byB1bmRlZi4gZXJybm8gX211c3RfIGJlIHNwZWNpZmllZC4gCiAgICBJdCdzIGEgbnVtZXJpYyBlcnJvciBudW1iZXIuICBBbnkgdHJ1ZSBpbnRlZ2VyIHZhbHVlICB3aWxsIGNhdXNlIHRoZSAKICAgIG9iamVjdCB0byBldmFsdWF0ZSB0byBmYWxzZSBpbiBhIHNjYWxhciBjb250ZXh0LiBBdCBmaXJzdCwgdGhpcyBtYXkgbG9vayBhIAogICAgYml0IGNvdW50ZXJpbnR1aXRpdmUsIGJ1dCBpdCBtZWFucyB0aGF0IHlvdSBjYW4gaGF2ZSBlcnJvciBjb2RlcyBhbmQgc3RpbGwgCiAgICBhbGxvdyBzaW1wbGUgdXNlIG9mIHlvdXIgZnVuY3Rpb25zIGluIGEgc3R5bGUgbGlrZSB0aGlzOgoKCiAgICAgICAgaWYgKCRvYmotPmRvX3NvbWV0aGluZykgewogICAgICAgICAgICBwcmludCAiWWF5ISBpdCB3b3JrZWQiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICJTb3JyeS4gdGhlcmUncyBiZWVuIGFuIGVycm9yLiI7CiAgICAgICAgfQoKCiAgICAgICAgYXMgd2VsbCBhcyBtb3JlIGNvbXBsZXggdXNlIGxpa2UgdGhpczoKCiAgICAgICAgbXkgJHJldHZhbCA9ICRvYmotPmRvX3NvbWV0aGluZzsKICAgICAgICAKICAgICAgICBpZiAoJHJldHZhbCkgewogICAgICAgICAgICBwcmludCAiWWF5LiB3ZSBkaWQgc29tZXRoaW5nXG4iOwogICAgICAgICAgICBteSAoJGZvbywgJGJhciwgJGJheikgPSBAeyRyZXR2YWx9OwogICAgICAgICAgICBteSAkaHVtYW5fcmVhZGFibGVfcmV0dXJuID0gJHJldHZhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHJldHZhbC0+ZXJybm8gPT0gMjApIHsKICAgICAgICAgICAgICAgIGRpZSAiRmFpbGVkIHdpdGggZXJyb3IgMjAgKE5vdCBlbm91Z2ggbW9ua2V5cykuIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRpZSAgJHJldHZhbC0+YmFja3RyYWNlOyAjIERpZSBhbmQgcHJpbnQgb3V0IGEgYmFja3RyYWNlIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCgo9Y3V0CgpzdWIgYXNfZXJyb3IgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKCBlcnJubyA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICBtZXNzYWdlID0+IHVuZGVmLAogICAgICAgICAgICAgICAgIGRvX2JhY2t0cmFjZSA9PiAxLAogICAgICAgICAgICAgICAgIEBfKTsKCiAgICB1bmxlc3MoJGFyZ3N7J2Vycm5vJ30pIHsKICAgICAgICBjYXJwICIkc2VsZiAtPiBhc19lcnJvciBjYWxsZWQgd2l0aG91dCBhbiAnZXJybm8nIHBhcmFtZXRlciI7CiAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICB9CgogICAgJHNlbGYtPnsnZXJybm8nfSA9ICRhcmdzeydlcnJubyd9OwogICAgJHNlbGYtPnsnZXJyb3JfbWVzc2FnZSd9ID0gJGFyZ3N7J21lc3NhZ2UnfTsKICAgIGlmICgkYXJnc3snZG9fYmFja3RyYWNlJ30pIHsKICAgICAgICAjIFVzZSBjYXJwJ3MgaW50ZXJuYWwgYmFja3RyYWNlIG1ldGhvZHMsIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIHRoZW0gb3Vyc2VsdmVzCiAgICAgICAgIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoaWdub3JlX3BhY2thZ2UgPT4gJ0NsYXNzOjpSZXR1cm5WYWx1ZScpOwoKICAgICAgICAkc2VsZi0+eydiYWNrdHJhY2UnfSA9ICR0cmFjZS0+YXNfc3RyaW5nOyAjIGxpa2UgY2FycAogICAgfQoKICAgIHJldHVybigxKTsKfQoKCj1pdGVtIGVycm5vIAoKUmV0dXJucyB0aGUgZXJybm8gaWYgdGhlcmUncyBiZWVuIGFuIGVycm9yLiBPdGhlcndpc2UsIHJldHVybiB1bmRlZgoKPWN1dAoKc3ViIGVycm5vIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICByZXR1cm4gKCRzZWxmLT57J2Vycm5vJ30pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICByZXR1cm4odW5kZWYpOwogICAgIH0KfQoKCj1pdGVtIGVycm9yX21lc3NhZ2UKCklmIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UuCgo9Y3V0CgpzdWIgZXJyb3JfbWVzc2FnZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm9yX21lc3NhZ2UnfSkgewogICAgICAgIHJldHVybigkc2VsZi0+eydlcnJvcl9tZXNzYWdlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKCj1pdGVtIGJhY2t0cmFjZQoKSWYgdGhlcmUncyBiZWVuIGFuIGVycm9yIGFuZCB3ZSBhc2tlZCBmb3IgYSBiYWNrdHJhY2UsIHJldHVybiB0aGUgYmFja3RyYWNlLiAKT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYuCgo9Y3V0CgpzdWIgYmFja3RyYWNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoJHNlbGYtPnsnYmFja3RyYWNlJ30pIHsKICAgICAgICByZXR1cm4oJHNlbGYtPnsnYmFja3RyYWNlJ30pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuKHVuZGVmKTsKICAgIH0KfQoKPWN1dAoKPWl0ZW0gZXJyb3JfY29uZGl0aW9uCgpJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIHJldHVybiB1bmRlZi4gT3RoZXJ3aXNlIHJldHVybiAxCgo9Y3V0CgpzdWIgZXJyb3JfY29uZGl0aW9uIHsgCiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKCRzZWxmLT57J2Vycm5vJ30pIHsKICAgICAgICAgICAgcmV0dXJuICh1bmRlZik7CiAgICAgICAgfQogICAgICAgIGVsc2lmICh3YW50YXJyYXkoKSkgewogICAgICAgICAgICByZXR1cm4oQHskc2VsZi0+eydhc19hcnJheSd9fSk7CiAgICAgICAgfQogICAgICAgZWxzZSB7IAogICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICB9ICAgICAKfQoKc3ViIHJldHVybl92YWx1ZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgaWYgKHdhbnRhcnJheSkgewogICAgICAgICByZXR1cm4gKCRzZWxmLT5hc19hcnJheSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgIHJldHVybiAoJHNlbGYpOwogICAgfQp9CgoKPWhlYWQxIEFVVEhPUgogICAgCiAgICBKZXNzZSBWaW5jZW50IDxqZXNzZUBiZXN0cHJhY3RpY2FsLmNvbT4KCj1oZWFkMSBCVUdTCgogICAgVGhpcyBtb2R1bGUgaGFzLCBhcyB5ZXQsIG5vdCBiZWVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLiBJIHRoaW5nCiAgICBpdCBzaG91bGQgd29yaywgYnV0IGhhdmUgbmV2ZXIgYmVuY2htYXJrZWQgaXQuIEkgaGF2ZSBub3QgeWV0IHVzZWQKICAgIGl0IGV4dGVuc2l2ZWx5LCB0aG91Z2ggSSBkbyBwbGFuIHRvIGluIHRoZSBub3QtdG9vLWRpc3RhbnQgZnV0dXJlLgogICAgSWYgeW91IGhhdmUgcXVlc3Rpb25zIG9yIGNvbW1lbnRzLCAgcGxlYXNlIHdyaXRlIG1lLgoKICAgIElmIHlvdSBuZWVkIHRvIHJlcG9ydCBhIGJ1ZywgcGxlYXNlIHNlbmQgbWFpbCB0byAKICAgIDxidWctY2xhc3MtcmV0dXJudmFsdWVAcnQuY3Bhbi5vcmc+IG9yIHJlcG9ydCB5b3VyIGVycm9yIG9uIHRoZSB3ZWIKICAgIGF0IGh0dHA6Ly9ydC5jcGFuLm9yZy8KCj1oZWFkMSBDT1BZUklHSFQKCiAgICBDb3B5cmlnaHQgKGMpIDIwMDIsMjAwMywyMDA1LDIwMDcgSmVzc2UgVmluY2VudCA8amVzc2VAYmVzdHByYWN0aWNhbC5jb20+CiAgICBZb3UgbWF5IHVzZSwgbW9kaWZ5LCBmb2xkLCBzcGluZGxlIG9yIG11dGlsYXRlIHRoaXMgbW9kdWxlIHVuZGVyCiAgICB0aGUgc2FtZSB0ZXJtcyBhcyBwZXJsIGl0c2VsZi4KCj1oZWFkMSBTRUUgQUxTTwoKICAgIENsYXNzOjpSZXR1cm5WYWx1ZSBpc24ndCBhbiBleGNlcHRpb24gaGFuZGxlci4gSWYgaXQgZG9lc24ndAogICAgZG8gd2hhdCB5b3Ugd2FudCwgeW91IG1pZ2h0IHdhbnQgbG9vayBhdCBvbmUgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwogICAgYmVsb3c6CgogICAgRXJyb3IsIEV4Y2VwdGlvbiwgRXhjZXB0aW9ucywgRXhjZXB0aW9uczo6Q2xhc3MKCiAgICBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGxvb2sgYXQgQ29udGV4dHVhbDo6UmV0dXJuLCBhbm90aGVyIGltcGxlbWVudGF0aW9uCiAgICBvZiB0aGUgc2FtZSBjb25jZXB0IGFzIHRoaXMgbW9kdWxlLgoKPWN1dAoKMTsK
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I7CnJlcXVpcmUgNS4wMDUwMjsKdXNlIHN0cmljdDsKJENsYXNzOjpBY2Nlc3Nvcjo6VkVSU0lPTiA9ICcwLjM0JzsKCnN1YiBuZXcgewogICAgbXkoJHByb3RvLCAkZmllbGRzKSA9IEBfOwogICAgbXkoJGNsYXNzKSA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICRmaWVsZHMgPSB7fSB1bmxlc3MgZGVmaW5lZCAkZmllbGRzOwoKICAgICMgbWFrZSBhIGNvcHkgb2YgJGZpZWxkcy4KICAgIGJsZXNzIHslJGZpZWxkc30sICRjbGFzczsKfQoKc3ViIG1rX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncncnLCBAZmllbGRzKTsKfQoKaWYgKGV2YWwgeyByZXF1aXJlIFN1Yjo6TmFtZSB9KSB7CiAgICBTdWI6Ok5hbWUtPmltcG9ydDsKfQoKewogICAgbm8gc3RyaWN0ICdyZWZzJzsKCiAgICBzdWIgaW1wb3J0IHsKICAgICAgICBteSAoJGNsYXNzLCBAd2hhdCkgPSBAXzsKICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgIGZvciAoQHdoYXQpIHsKICAgICAgICAgICAgaWYgKC9eKD86YW50bGVyc3xtb29zZS0/bGlrZSkkL2kpIHsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6aGFzIn0gPSBzdWIgewogICAgICAgICAgICAgICAgICAgIG15ICgkZiwgJWFyZ3MpID0gQF87CiAgICAgICAgICAgICAgICAgICAgJGNhbGxlci0+X21rX2FjY2Vzc29ycygoJGFyZ3N7aXN9fHwicnciKSwgJGYpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICp7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9ID0gc3ViIHsKICAgICAgICAgICAgICAgICAgICBAeyIke2NhbGxlcn06OklTQSJ9ID0gQF87CiAgICAgICAgICAgICAgICAgICAgdW5sZXNzIChncmVwICRfLT5jYW4oIl9ta19hY2Nlc3NvcnMiKSwgQF8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyIke2NhbGxlcn06OklTQSJ9LCAkY2xhc3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICMgd2UnbGwgdXNlIHRoZWlyIEBJU0EgYXMgYSBkZWZhdWx0LCBpbiBjYXNlIGl0IGhhcHBlbnMgdG8gYmUKICAgICAgICAgICAgICAgICMgc2V0IGFscmVhZHkKICAgICAgICAgICAgICAgICZ7IiR7Y2FsbGVyfTo6ZXh0ZW5kcyJ9KEB7IiR7Y2FsbGVyfTo6SVNBIn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN1YiBmb2xsb3dfYmVzdF9wcmFjdGljZSB7CiAgICAgICAgbXkoJHNlbGYpID0gQF87CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRzZWxmIHx8ICRzZWxmOwogICAgICAgICp7IiR7Y2xhc3N9OjphY2Nlc3Nvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9hY2Nlc3Nvcl9uYW1lX2ZvcjsKICAgICAgICAqeyIke2NsYXNzfTo6bXV0YXRvcl9uYW1lX2ZvciJ9ICA9IFwmYmVzdF9wcmFjdGljZV9tdXRhdG9yX25hbWVfZm9yOwogICAgfQoKICAgIHN1YiBfbWtfYWNjZXNzb3JzIHsKICAgICAgICBteSgkc2VsZiwgJGFjY2VzcywgQGZpZWxkcykgPSBAXzsKICAgICAgICBteSAkY2xhc3MgPSByZWYgJHNlbGYgfHwgJHNlbGY7CiAgICAgICAgbXkgJHJhID0gJGFjY2VzcyBlcSAncncnIHx8ICRhY2Nlc3MgZXEgJ3JvJzsKICAgICAgICBteSAkd2EgPSAkYWNjZXNzIGVxICdydycgfHwgJGFjY2VzcyBlcSAnd28nOwoKICAgICAgICBmb3JlYWNoIG15ICRmaWVsZCAoQGZpZWxkcykgewogICAgICAgICAgICBteSAkYWNjZXNzb3JfbmFtZSA9ICRzZWxmLT5hY2Nlc3Nvcl9uYW1lX2ZvcigkZmllbGQpOwogICAgICAgICAgICBteSAkbXV0YXRvcl9uYW1lID0gJHNlbGYtPm11dGF0b3JfbmFtZV9mb3IoJGZpZWxkKTsKICAgICAgICAgICAgaWYoICRhY2Nlc3Nvcl9uYW1lIGVxICdERVNUUk9ZJyBvciAkbXV0YXRvcl9uYW1lIGVxICdERVNUUk9ZJyApIHsKICAgICAgICAgICAgICAgICRzZWxmLT5fY2FycCgiSGF2aW5nIGEgZGF0YSBhY2Nlc3NvciBuYW1lZCBERVNUUk9ZICBpbiAnJGNsYXNzJyBpcyB1bndpc2UuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRhY2Nlc3Nvcl9uYW1lIGVxICRtdXRhdG9yX25hbWUpIHsKICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIGlmICgkcmEgJiYgJHdhKSB7CiAgICAgICAgICAgICAgICAgICAgJGFjY2Vzc29yID0gJHNlbGYtPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKICAgICAgICAgICAgICAgIH0gZWxzaWYgKCRyYSkgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkZnVsbG5hbWUgPSAiJHtjbGFzc306OiRhY2Nlc3Nvcl9uYW1lIjsKICAgICAgICAgICAgICAgIG15ICRzdWJuYW1lZCA9IDA7CiAgICAgICAgICAgICAgICB1bmxlc3MgKGRlZmluZWQgJnskZnVsbG5hbWV9KSB7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG5hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAkc3VibmFtZWQgPSAxOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxuYW1lfSA9ICRhY2Nlc3NvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkYWNjZXNzb3JfbmFtZSBlcSAkZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAjIHRoZSBvbGQgYmVoYXZpb3VyCiAgICAgICAgICAgICAgICAgICAgbXkgJGFsaWFzID0gIiR7Y2xhc3N9OjpfJHtmaWVsZH1fYWNjZXNzb3IiOwogICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUoJGFsaWFzLCAkYWNjZXNzb3IpIGlmIGRlZmluZWQgJnN1Ym5hbWUgYW5kIG5vdCAkc3VibmFtZWQ7CiAgICAgICAgICAgICAgICAgICAgKnskYWxpYXN9ID0gJGFjY2Vzc29yIHVubGVzcyBkZWZpbmVkICZ7JGFsaWFzfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRmdWxsYWNjbmFtZSA9ICIke2NsYXNzfTo6JGFjY2Vzc29yX25hbWUiOwogICAgICAgICAgICAgICAgbXkgJGZ1bGxtdXRuYW1lID0gIiR7Y2xhc3N9OjokbXV0YXRvcl9uYW1lIjsKICAgICAgICAgICAgICAgIGlmICgkcmEgYW5kIG5vdCBkZWZpbmVkICZ7JGZ1bGxhY2NuYW1lfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRhY2Nlc3NvciA9ICRzZWxmLT5tYWtlX3JvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbGFjY25hbWUsICRhY2Nlc3NvcikgaWYgZGVmaW5lZCAmc3VibmFtZTsKICAgICAgICAgICAgICAgICAgICAqeyRmdWxsYWNjbmFtZX0gPSAkYWNjZXNzb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHdhIGFuZCBub3QgZGVmaW5lZCAmeyRmdWxsbXV0bmFtZX0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkbXV0YXRvciA9ICRzZWxmLT5tYWtlX3dvX2FjY2Vzc29yKCRmaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgc3VibmFtZSgkZnVsbG11dG5hbWUsICRtdXRhdG9yKSBpZiBkZWZpbmVkICZzdWJuYW1lOwogICAgICAgICAgICAgICAgICAgICp7JGZ1bGxtdXRuYW1lfSA9ICRtdXRhdG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKfQoKc3ViIG1rX3JvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygncm8nLCBAZmllbGRzKTsKfQoKc3ViIG1rX3dvX2FjY2Vzc29ycyB7CiAgICBteSgkc2VsZiwgQGZpZWxkcykgPSBAXzsKCiAgICAkc2VsZi0+X21rX2FjY2Vzc29ycygnd28nLCBAZmllbGRzKTsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICJnZXRfJGZpZWxkIjsKfQoKc3ViIGJlc3RfcHJhY3RpY2VfbXV0YXRvcl9uYW1lX2ZvciB7CiAgICBteSAoJGNsYXNzLCAkZmllbGQpID0gQF87CiAgICByZXR1cm4gInNldF8kZmllbGQiOwp9CgpzdWIgYWNjZXNzb3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIG11dGF0b3JfbmFtZV9mb3IgewogICAgbXkgKCRjbGFzcywgJGZpZWxkKSA9IEBfOwogICAgcmV0dXJuICRmaWVsZDsKfQoKc3ViIHNldCB7CiAgICBteSgkc2VsZiwgJGtleSkgPSBzcGxpY2UoQF8sIDAsIDIpOwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gJF9bMF07CiAgICB9CiAgICBlbHNpZihAXyA+IDEpIHsKICAgICAgICAkc2VsZi0+eyRrZXl9ID0gW0BfXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT5fY3JvYWsoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWQiKTsKICAgIH0KfQoKc3ViIGdldCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIGlmKEBfID09IDEpIHsKICAgICAgICByZXR1cm4gJHNlbGYtPnskX1swXX07CiAgICB9CiAgICBlbHNpZiggQF8gPiAxICkgewogICAgICAgIHJldHVybiBAeyRzZWxmfXtAX307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X2Nyb2FrKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHJlY2VpdmVkIik7CiAgICB9Cn0KCnN1YiBtYWtlX2FjY2Vzc29yIHsKICAgIG15ICgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgICAgICBpZihAXykgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3JvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICBteSAkY2FsbGVyID0gY2FsbGVyOwogICAgICAgICAgICAkc2VsZi0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgICAgIHVubGVzcyAoQF8pIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJHNlbGYtPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgIH0KICAgIH07Cn0KCgp1c2UgQ2FycCAoKTsKCnN1YiBfY2FycCB7CiAgICBteSAoJHNlbGYsICRtc2cpID0gQF87CiAgICBDYXJwOjpjYXJwKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgpzdWIgX2Nyb2FrIHsKICAgIG15ICgkc2VsZiwgJG1zZykgPSBAXzsKICAgIENhcnA6OmNyb2FrKCRtc2cgfHwgJHNlbGYpOwogICAgcmV0dXJuOwp9CgoxOwoKX19FTkRfXwoKPWhlYWQxIE5BTUUKCiAgQ2xhc3M6OkFjY2Vzc29yIC0gQXV0b21hdGVkIGFjY2Vzc29yIGdlbmVyYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgRm9vLT5ta19hY2Nlc3NvcnMocXcobmFtZSByb2xlIHNhbGFyeSkpOwoKICAjIG9yIGlmIHlvdSBwcmVmZXIgYSBNb29zZS1saWtlIGludGVyZmFjZS4uLgogCiAgcGFja2FnZSBGb287CiAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgaGFzIG5hbWUgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIlN0ciIgKTsKICBoYXMgcm9sZSA9PiAoIGlzID0+ICJydyIsIGlzYSA9PiAiU3RyIiApOwogIGhhcyBzYWxhcnkgPT4gKCBpcyA9PiAicnciLCBpc2EgPT4gIk51bSIgKTsKCiAgIyBNZWFud2hpbGUsIGluIGEgbmVhcmJ5IHBpZWNlIG9mIGNvZGUhCiAgIyBDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgbmV3KCkuCiAgbXkgJG1wID0gRm9vLT5uZXcoeyBuYW1lID0+ICJNYXJ0eSIsIHJvbGUgPT4gIkpBUEgiIH0pOwoKICBteSAkam9iID0gJG1wLT5yb2xlOyAgIyBnZXRzICRtcC0+e3JvbGV9CiAgJG1wLT5zYWxhcnkoNDAwMDAwKTsgICMgc2V0cyAkbXAtPntzYWxhcnl9ID0gNDAwMDAwICMgSSB3aXNoCiAgCiAgIyBsaWtlIG15IEBpbmZvID0gQHskbXB9e3F3KG5hbWUgcm9sZSl9CiAgbXkgQGluZm8gPSAkbXAtPmdldChxdyhuYW1lIHJvbGUpKTsKICAKICAjICRtcC0+e3NhbGFyeX0gPSA0MDAwMDAKICAkbXAtPnNldCgnc2FsYXJ5JywgNDAwMDAwKTsKCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIGF1dG9tYWdpY2FsbHkgZ2VuZXJhdGVzIGFjY2Vzc29ycy9tdXRhdG9ycyBmb3IgeW91ciBjbGFzcy4KCk1vc3Qgb2YgdGhlIHRpbWUsIHdyaXRpbmcgYWNjZXNzb3JzIGlzIGFuIGV4ZXJjaXNlIGluIGN1dHRpbmcgYW5kCnBhc3RpbmcuICBZb3UgdXN1YWxseSB3aW5kIHVwIHdpdGggYSBzZXJpZXMgb2YgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgc3ViIG5hbWUgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgaWYoQF8pIHsKICAgICAgICAgICAgJHNlbGYtPntuYW1lfSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntuYW1lfTsKICAgIH0KCiAgICBzdWIgc2FsYXJ5IHsKICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgICAgIGlmKEBfKSB7CiAgICAgICAgICAgICRzZWxmLT57c2FsYXJ5fSA9ICRfWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNlbGYtPntzYWxhcnl9OwogICAgfQoKICAjIGV0Yy4uLgoKT25lIGZvciBlYWNoIHBpZWNlIG9mIGRhdGEgaW4geW91ciBvYmplY3QuICBXaGlsZSBzb21lIHdpbGwgYmUgdW5pcXVlLApkb2luZyB2YWx1ZSBjaGVja3MgYW5kIHNwZWNpYWwgc3RvcmFnZSB0cmlja3MsIG1vc3Qgd2lsbCBzaW1wbHkgYmUKZXhlcmNpc2VzIGluIHJlcGV0aXRpb24uICBOb3Qgb25seSBpcyBpdCBCYWQgU3R5bGUgdG8gaGF2ZSBhIGJ1bmNoIG9mCnJlcGV0aXRpb3VzIGNvZGUsIGJ1dCBpdCdzIGFsc28gc2ltcGx5IG5vdCBsYXp5LCB3aGljaCBpcyB0aGUgcmVhbAp0cmFnZWR5LgoKSWYgeW91IG1ha2UgeW91ciBtb2R1bGUgYSBzdWJjbGFzcyBvZiBDbGFzczo6QWNjZXNzb3IgYW5kIGRlY2xhcmUgeW91cgphY2Nlc3NvciBmaWVsZHMgd2l0aCBta19hY2Nlc3NvcnMoKSB0aGVuIHlvdSdsbCBmaW5kIHlvdXJzZWxmIHdpdGggYQpzZXQgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWNjZXNzb3JzIHdoaWNoIGNhbiBldmVuIGJlCmN1c3RvbWl6ZWQhCgpUaGUgYmFzaWMgc2V0IHVwIGlzIHZlcnkgc2ltcGxlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCBxdyhmYXIgYmFyIGNhcikgKTsKCkRvbmUuICBGb28gbm93IGhhcyBzaW1wbGUgZmFyKCksIGJhcigpIGFuZCBjYXIoKSBhY2Nlc3NvcnMKZGVmaW5lZC4KCkFsdGVybmF0aXZlbHksIGlmIHlvdSB3YW50IHRvIGZvbGxvdyBEYW1pYW4ncyBJPGJlc3QgcHJhY3RpY2U+IGd1aWRlbGluZXMgCnlvdSBjYW4gdXNlOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+Zm9sbG93X2Jlc3RfcHJhY3RpY2U7CiAgICBGb28tPm1rX2FjY2Vzc29ycyggcXcoZmFyIGJhciBjYXIpICk7CgpCPE5vdGU6PiB5b3UgbXVzdCBjYWxsIEM8Zm9sbG93X2Jlc3RfcHJhY3RpY2U+IGJlZm9yZSBjYWxsaW5nIEM8bWtfYWNjZXNzb3JzPi4KCj1oZWFkMiBNb29zZS1saWtlCgpCeSBwb3B1bGFyIGRlbWFuZCB3ZSBub3cgaGF2ZSBhIHNpbXBsZSBNb29zZS1saWtlIGludGVyZmFjZS4gIFlvdSBjYW4gbm93IGRvOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIENsYXNzOjpBY2Nlc3NvciAiYW50bGVycyI7CiAgICBoYXMgZmFyID0+ICggaXMgPT4gInJ3IiApOwogICAgaGFzIGJhciA9PiAoIGlzID0+ICJydyIgKTsKICAgIGhhcyBjYXIgPT4gKCBpcyA9PiAicnciICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4KCj1oZWFkMSBDT05TVFJVQ1RPUgoKQ2xhc3M6OkFjY2Vzc29yIHByb3ZpZGVzIGEgYmFzaWMgY29uc3RydWN0b3IsIEM8bmV3Pi4gIEl0IGdlbmVyYXRlcyBhCmhhc2gtYmFzZWQgb2JqZWN0IGFuZCBjYW4gYmUgY2FsbGVkIGFzIGVpdGhlciBhIGNsYXNzIG1ldGhvZCBvciBhbgpvYmplY3QgbWV0aG9kLiAgCgo9aGVhZDIgbmV3CgogICAgbXkgJG9iaiA9IEZvby0+bmV3OwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldzsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoXCVmaWVsZHMpOwogICAgbXkgJG9iaiA9ICRvdGhlcl9vYmotPm5ldyhcJWZpZWxkcyk7CgpJdCB0YWtlcyBhbiBvcHRpb25hbCAlZmllbGRzIGhhc2ggd2hpY2ggaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZQpvYmplY3QgKGhhbmR5IGlmIHlvdSB1c2UgcmVhZC1vbmx5IGFjY2Vzc29ycykuICBUaGUgZmllbGRzIG9mIHRoZSBoYXNoCmNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzIG9mIHlvdXIgYWNjZXNzb3JzLCBzby4uLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKCdmb28nKTsKCiAgICBteSAkb2JqID0gRm9vLT5uZXcoeyBmb28gPT4gNDIgfSk7CiAgICBwcmludCAkb2JqLT5mb287ICAgICMgNDIKCmhvd2V2ZXIgJWZpZWxkcyBjYW4gY29udGFpbiBhbnl0aGluZywgbmV3KCkgd2lsbCBzaG92ZSB0aGVtIGFsbCBpbnRvCnlvdXIgb2JqZWN0LgoKPWhlYWQxIE1BS0lORyBBQ0NFU1NPUlMKCj1oZWFkMiBmb2xsb3dfYmVzdF9wcmFjdGljZQoKSW4gRGFtaWFuJ3MgUGVybCBCZXN0IFByYWN0aWNlcyBib29rIGhlIHJlY29tbWVuZHMgc2VwYXJhdGUgZ2V0IGFuZCBzZXQgbWV0aG9kcwp3aXRoIHRoZSBwcmVmaXggc2V0XyBhbmQgZ2V0XyB0byBtYWtlIGl0IGV4cGxpY2l0IHdoYXQgeW91IGludGVuZCB0byBkby4gIElmIHlvdQp3YW50IHRvIGNyZWF0ZSB0aG9zZSBhY2Nlc3NvciBtZXRob2RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lcywgY2FsbDoKCiAgICBfX1BBQ0tBR0VfXy0+Zm9sbG93X2Jlc3RfcHJhY3RpY2UKCkI8YmVmb3JlPiB5b3UgY2FsbCBhbnkgb2YgdGhlIGFjY2Vzc29yLW1ha2luZyBtZXRob2RzLgoKPWhlYWQyIGFjY2Vzc29yX25hbWVfZm9yIC8gbXV0YXRvcl9uYW1lX2ZvcgoKWW91IG1heSBoYXZlIHlvdXIgb3duIGNyYXp5IGlkZWFzIGZvciB0aGUgbmFtZXMgb2YgdGhlIGFjY2Vzc29ycywgc28geW91IGNhbgptYWtlIHRob3NlIGhhcHBlbiBieSBvdmVycmlkaW5nIEM8YWNjZXNzb3JfbmFtZV9mb3I+IGFuZCBDPG11dGF0b3JfbmFtZV9mb3I+IGluCnlvdXIgc3ViY2xhc3MuICAoSSBjb3BpZWQgdGhhdCBpZGVhIGZyb20gQ2xhc3M6OkRCSS4pCgo9aGVhZDIgbWtfYWNjZXNzb3JzCgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhAZmllbGRzKTsKClRoaXMgY3JlYXRlcyBhY2Nlc3Nvci9tdXRhdG9yIG1ldGhvZHMgZm9yIGVhY2ggbmFtZWQgZmllbGQgZ2l2ZW4gaW4KQGZpZWxkcy4gIEZvcmVhY2ggZmllbGQgaW4gQGZpZWxkcyBpdCB3aWxsIGdlbmVyYXRlIHR3byBhY2Nlc3NvcnMuCk9uZSBjYWxsZWQgImZpZWxkKCkiIGFuZCB0aGUgb3RoZXIgY2FsbGVkICJfZmllbGRfYWNjZXNzb3IoKSIuICBGb3IKZXhhbXBsZToKCiAgICAjIEdlbmVyYXRlcyBmb28oKSwgX2Zvb19hY2Nlc3NvcigpLCBiYXIoKSBhbmQgX2Jhcl9hY2Nlc3NvcigpLgogICAgX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycyhxdyhmb28gYmFyKSk7CgpTZWUgTDxDQVZFQVRTIEFORCBUUklDS1MvIk92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMiPgpmb3IgZGV0YWlscy4KCj1oZWFkMiBta19yb19hY2Nlc3NvcnMKCiAgX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycyhAcmVhZF9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHJlYWQtb25seSBhY2Nlc3NvcnMKKGllLiB0cnVlIGFjY2Vzc29ycykuICBJZiB5b3UgYXR0ZW1wdCB0byBzZXQgYSB2YWx1ZSB3aXRoIHRoZXNlCmFjY2Vzc29ycyBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gIEl0IG9ubHkgdXNlcyBnZXQoKSBhbmQgbm90CnNldCgpLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfcm9fYWNjZXNzb3JzKHF3KGZvbyBiYXIpKTsKCiAgICAjIExldCdzIGFzc3VtZSB3ZSBoYXZlIGFuIG9iamVjdCAkZm9vIG9mIGNsYXNzIEZvby4uLgogICAgcHJpbnQgJGZvby0+Zm9vOyAgIyBvaywgcHJpbnRzIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiAkZm9vLT57Zm9vfSBpcwogICAgJGZvby0+Zm9vKDQyKTsgICAgIyBCT09NISAgTmF1Z2h0eSB5b3UuCgoKPWhlYWQyIG1rX3dvX2FjY2Vzc29ycwoKICBfX1BBQ0tBR0VfXy0+bWtfd29fYWNjZXNzb3JzKEB3cml0ZV9vbmx5X2ZpZWxkcyk7CgpTYW1lIGFzIG1rX2FjY2Vzc29ycygpIGV4Y2VwdCBpdCB3aWxsIGdlbmVyYXRlIHdyaXRlLW9ubHkgYWNjZXNzb3JzCihpZS4gbXV0YXRvcnMpLiAgSWYgeW91IGF0dGVtcHQgdG8gcmVhZCBhIHZhbHVlIHdpdGggdGhlc2UgYWNjZXNzb3JzCml0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLiAgSXQgb25seSB1c2VzIHNldCgpIGFuZCBub3QgZ2V0KCkuCgpCPE5PVEU+IEknbSBub3QgZW50aXJlbHkgc3VyZSB3aHkgdGhpcyBpcyB1c2VmdWwsIGJ1dCBJJ20gc3VyZSBzb21lb25lCndpbGwgbmVlZCBpdC4gIElmIHlvdSd2ZSBmb3VuZCBhIHVzZSwgbGV0IG1lIGtub3cuICBSaWdodCBub3cgaXQncyBoZXJlCmZvciBvcnRob2dpbmFsaXR5IGFuZCBiZWNhdXNlIGl0J3MgZWFzeSB0byBpbXBsZW1lbnQuCgogICAgcGFja2FnZSBGb287CiAgICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpOwogICAgRm9vLT5ta193b19hY2Nlc3NvcnMocXcoZm9vIGJhcikpOwoKICAgICMgTGV0J3MgYXNzdW1lIHdlIGhhdmUgYW4gb2JqZWN0ICRmb28gb2YgY2xhc3MgRm9vLi4uCiAgICAkZm9vLT5mb28oNDIpOyAgICAgICMgT0suICBTZXRzICRzZWxmLT57Zm9vfSA9IDQyCiAgICBwcmludCAkZm9vLT5mb287ICAgICMgQk9PTSEgIENhbid0IHJlYWQgZnJvbSB0aGlzIGFjY2Vzc29yLgoKPWhlYWQxIE1vb3NlIQoKSWYgeW91IHByZWZlciBhIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhY2Nlc3NvcnMsIHlvdSBjYW4gdXNlIEM8aGFzPiBieQppbXBvcnRpbmcgdGhpcyBtb2R1bGUgbGlrZSB0aGlzOgoKICB1c2UgQ2xhc3M6OkFjY2Vzc29yICJhbnRsZXJzIjsKCm9yCgogIHVzZSBDbGFzczo6QWNjZXNzb3IgIm1vb3NlLWxpa2UiOwoKVGhlbiB5b3UgY2FuIGRlY2xhcmUgYWNjZXNzb3JzIGxpa2UgdGhpczoKCiAgaGFzIGFscGhhID0+ICggaXMgPT4gInJ3IiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGJldGEgID0+ICggaXMgPT4gInJvIiwgaXNhID0+ICJTdHIiICk7CiAgaGFzIGdhbW1hID0+ICggaXMgPT4gIndvIiwgaXNhID0+ICJTdHIiICk7CgpDdXJyZW50bHkgb25seSB0aGUgQzxpcz4gYXR0cmlidXRlIGlzIHN1cHBvcnRlZC4gIEFuZCBvdXIgQzxpcz4gYWxzbyBzdXBwb3J0cwp0aGUgIndvIiB2YWx1ZSB0byBtYWtlIGEgd3JpdGUtb25seSBhY2Nlc3Nvci4KCklmIHlvdSBhcmUgdXNpbmcgdGhlIE1vb3NlLWxpa2UgaW50ZXJmYWNlIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIEM8ZXh0ZW5kcz4KcmF0aGVyIHRoYW4gdHdlYWtpbmcgeW91ciBDPEBJU0E+IGRpcmVjdGx5LiAgQmFzaWNhbGx5LCByZXBsYWNlCgogIEBJU0EgPSBxdy9Gb28gQmFyLzsKCndpdGgKCiAgZXh0ZW5kcyhxdy9Gb28gQmFyLyk7Cgo9aGVhZDEgREVUQUlMUwoKQW4gYWNjZXNzb3IgZ2VuZXJhdGVkIGJ5IENsYXNzOjpBY2Nlc3NvciBsb29rcyBzb21ldGhpbmcgbGlrZQp0aGlzOgoKICAgICMgWW91ciBmb28gbWF5IHZhcnkuCiAgICBzdWIgZm9vIHsKICAgICAgICBteSgkc2VsZikgPSBzaGlmdDsKICAgICAgICBpZihAXykgeyAgICAjIHNldAogICAgICAgICAgICByZXR1cm4gJHNlbGYtPnNldCgnZm9vJywgQF8pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5nZXQoJ2ZvbycpOwogICAgICAgIH0KICAgIH0KClZlcnkgc2ltcGxlLiAgQWxsIGl0IGRvZXMgaXMgZGV0ZXJtaW5lIGlmIHlvdSdyZSB3YW50aW5nIHRvIHNldCBhCnZhbHVlIG9yIGdldCBhIHZhbHVlIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLgpDbGFzczo6QWNjZXNzb3IgcHJvdmlkZXMgZGVmYXVsdCBnZXQoKSBhbmQgc2V0KCkgbWV0aG9kcyB3aGljaAp5b3VyIGNsYXNzIGNhbiBvdmVycmlkZS4gIFRoZXkncmUgZGV0YWlsZWQgbGF0ZXIuCgo9aGVhZDIgTW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgYWNjZXNzb3IKClJhdGhlciB0aGFuIGFjdHVhbGx5IG1vZGlmeWluZyB0aGUgYWNjZXNzb3IgaXRzZWxmLCBpdCBpcyBtdWNoIG1vcmUKc2Vuc2libGUgdG8gc2ltcGx5IG92ZXJyaWRlIHRoZSB0d28ga2V5IG1ldGhvZHMgd2hpY2ggdGhlIGFjY2Vzc29yCmNhbGxzLiAgTmFtZWx5IHNldCgpIGFuZCBnZXQoKS4KCklmIHlvdSAtcmVhbGx5LSB3YW50IHRvLCB5b3UgY2FuIG92ZXJyaWRlIG1ha2VfYWNjZXNzb3IoKS4KCj1oZWFkMiBzZXQKCiAgICAkb2JqLT5zZXQoJGtleSwgJHZhbHVlKTsKICAgICRvYmotPnNldCgka2V5LCBAdmFsdWVzKTsKCnNldCgpIGRlZmluZXMgaG93IGdlbmVyYWxseSBvbmUgc3RvcmVzIGRhdGEgaW4gdGhlIG9iamVjdC4KCm92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSBob3cgZGF0YSBpcyBzdG9yZWQgYnkgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDIgZ2V0CgogICAgJHZhbHVlICA9ICRvYmotPmdldCgka2V5KTsKICAgIEB2YWx1ZXMgPSAkb2JqLT5nZXQoQGtleXMpOwoKZ2V0KCkgZGVmaW5lcyBob3cgZGF0YSBpcyByZXRyZWl2ZWQgZnJvbSB5b3VyIG9iamVjdHMuCgpvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgaG93IGl0IGlzIHJldHJlaXZlZC4KCj1oZWFkMiBtYWtlX2FjY2Vzc29yCgogICAgJGFjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2VfYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmZXJlbmNlIHdoaWNoIGFjdHMgYXMgYW4gYWNjZXNzb3IgZm9yIHRoZSBnaXZlbgokZmllbGQuICBJdCBjYWxscyBnZXQoKSBhbmQgc2V0KCkuCgpJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLCB0cnkgb3ZlcnJpZGluZwpnZXQoKSBhbmQgc2V0KCkgYmVmb3JlIHlvdSBzdGFydCBtdWNraW5nIHdpdGggbWFrZV9hY2Nlc3NvcigpLgoKPWhlYWQyIG1ha2Vfcm9fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfcm9fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IKdGhlIGdpdmVuICRmaWVsZC4gIEl0IG9ubHkgY2FsbHMgZ2V0KCkuCgpPdmVycmlkZSBnZXQoKSB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKPWhlYWQyIG1ha2Vfd29fYWNjZXNzb3IKCiAgICAkcmVhZF9vbmx5X2FjY2Vzc29yID0gX19QQUNLQUdFX18tPm1ha2Vfd29fYWNjZXNzb3IoJGZpZWxkKTsKCkdlbmVyYXRlcyBhIHN1YnJvdXRpbmUgcmVmcmVuY2Ugd2hpY2ggYWN0cyBhcyBhIHdyaXRlLW9ubHkgYWNjZXNzb3IKKG11dGF0b3IpIGZvciB0aGUgZ2l2ZW4gJGZpZWxkLiAgSXQgb25seSBjYWxscyBzZXQoKS4KCk92ZXJyaWRlIHNldCgpIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgeW91ciBhY2Nlc3NvcnMuCgo9aGVhZDEgRVhDRVBUSU9OUwoKSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgQ2xhc3M6OkFjY2Vzc29yIHdpbGwgd2FybiBvciBkaWUgYnkgY2FsbGluZyBDYXJwOjpjYXJwCm9yIENhcnA6OmNyb2FrLiAgSWYgeW91IGRvbid0IGxpa2UgdGhpcyB5b3UgY2FuIG92ZXJyaWRlIF9jYXJwKCkgYW5kIF9jcm9haygpIGluCnlvdXIgc3ViY2xhc3MgYW5kIGRvIHdoYXRldmVyIGVsc2UgeW91IHdhbnQuCgo9aGVhZDEgRUZGSUNJRU5DWQoKQ2xhc3M6OkFjY2Vzc29yIGRvZXMgbm90IGVtcGxveSBhbiBhdXRvbG9hZGVyLCB0aHVzIGl0IGlzIG11Y2ggZmFzdGVyCnRoYW4geW91J2QgdGhpbmsuICBJdHMgZ2VuZXJhdGVkIG1ldGhvZHMgaW5jdXIgbm8gc3BlY2lhbCBwZW5hbHR5IG92ZXIKb25lcyB5b3UnZCB3cml0ZSB5b3Vyc2VsZi4KCiAgYWNjZXNzb3JzOgogICAgICAgICAgICAgIFJhdGUgIEJhc2ljICAgRmFzdCBGYXN0ZXIgRGlyZWN0CiAgQmFzaWMgICAzNjc1ODkvcyAgICAgLS0gICAtNTElICAgLTU1JSAgIC04OSUKICBGYXN0ICAgIDc0Nzk2NC9zICAgMTAzJSAgICAgLS0gICAgLTklICAgLTc3JQogIEZhc3RlciAgODE5MTk5L3MgICAxMjMlICAgIDEwJSAgICAgLS0gICAtNzUlCiAgRGlyZWN0IDMyNDU4ODcvcyAgIDc4MyUgICAzMzQlICAgMjk2JSAgICAgLS0KCiAgbXV0YXRvcnM6CiAgICAgICAgICAgICAgUmF0ZSAgICBBY2MgICBGYXN0IEZhc3RlciBEaXJlY3QKICBBY2MgICAgIDI2NTU2NC9zICAgICAtLSAgIC01NCUgICAtNjMlICAgLTkxJQogIEZhc3QgICAgNTczNDM5L3MgICAxMTYlICAgICAtLSAgIC0yMSUgICAtODAlCiAgRmFzdGVyICA3MjQ3MTAvcyAgIDE3MyUgICAgMjYlICAgICAtLSAgIC03NSUKICBEaXJlY3QgMjg2MDk3OS9zICAgOTc3JSAgIDM5OSUgICAyOTUlICAgICAtLQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IGlzIGZhc3RlciB0aGFuIG1ldGhvZHMgd3JpdHRlbiBieSBhbiBhdmVyYWdlIHByb2dyYW1tZXIKKHdoZXJlICJhdmVyYWdlIiBpcyBiYXNlZCBvbiBTY2h3ZXJuJ3MgZXhhbXBsZSBjb2RlKS4KCkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbiBhdmVyYWdlLCBidXQgbW9yZSBmbGV4aWJsZS4KCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdGVyIGlzIGV2ZW4gZmFzdGVyIHRoYW4gQ2xhc3M6OkFjY2Vzc29yOjpGYXN0LiAgSXQgdXNlcyBhbgphcnJheSBpbnRlcm5hbGx5LCBub3QgYSBoYXNoLiAgVGhpcyBjb3VsZCBiZSBhIGdvb2Qgb3IgYmFkIGZlYXR1cmUgZGVwZW5kaW5nIG9uCnlvdXIgcG9pbnQgb2Ygdmlldy4KCkRpcmVjdCBoYXNoIGFjY2VzcyBpcywgb2YgY291cnNlLCBtdWNoIGZhc3RlciB0aGFuIGFsbCBvZiB0aGVzZSwgYnV0IGl0CnByb3ZpZGVzIG5vIGVuY2Fwc3VsYXRpb24uCgpPZiBjb3Vyc2UsIGl0J3Mgbm90IGFzIHNpbXBsZSBhcyBzYXlpbmcgIkNsYXNzOjpBY2Nlc3NvciBpcyBzbG93ZXIgdGhhbgphdmVyYWdlIi4gIFRoZXNlIGFyZSBiZW5jaG1hcmtzIGZvciBhIHNpbXBsZSBhY2Nlc3Nvci4gIElmIHlvdXIgYWNjZXNzb3JzIGRvCmFueSBzb3J0IG9mIGNvbXBsaWNhdGVkIHdvcmsgKHN1Y2ggYXMgdGFsa2luZyB0byBhIGRhdGFiYXNlIG9yIHdyaXRpbmcgdG8gYQpmaWxlKSB0aGUgdGltZSBzcGVudCBkb2luZyB0aGF0IHdvcmsgd2lsbCBxdWlja2x5IHN3YW1wIHRoZSB0aW1lIHNwZW5kIGp1c3QKY2FsbGluZyB0aGUgYWNjZXNzb3IuICBJbiB0aGF0IGNhc2UsIENsYXNzOjpBY2Nlc3NvciBhbmQgdGhlIG9uZXMgeW91IHdyaXRlCndpbGwgYmUgcm91Z2hseSB0aGUgc2FtZSBzcGVlZC4KCgo9aGVhZDEgRVhBTVBMRVMKCkhlcmUncyBhbiBleGFtcGxlIG9mIGdlbmVyYXRpbmcgYW4gYWNjZXNzb3IgZm9yIGV2ZXJ5IHB1YmxpYyBmaWVsZCBvZgp5b3VyIGNsYXNzLgoKICAgIHBhY2thZ2UgQWx0b2lkczsKICAgIAogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yIENsYXNzOjpGaWVsZHMpOwogICAgdXNlIGZpZWxkcyBxdyhjdXJpb3VzbHkgc3Ryb25nIG1pbnRzKTsKICAgIEFsdG9pZHMtPm1rX2FjY2Vzc29ycyggQWx0b2lkcy0+c2hvd19maWVsZHMoJ1B1YmxpYycpICk7CgogICAgc3ViIG5ldyB7CiAgICAgICAgbXkgJHByb3RvID0gc2hpZnQ7CiAgICAgICAgbXkgJGNsYXNzID0gcmVmICRwcm90byB8fCAkcHJvdG87CiAgICAgICAgcmV0dXJuIGZpZWxkczo6bmV3KCRjbGFzcyk7CiAgICB9CgogICAgbXkgQWx0b2lkcyAkdGluID0gQWx0b2lkcy0+bmV3OwoKICAgICR0aW4tPmN1cmlvdXNseSgnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInKTsKICAgIHByaW50ICR0aW4tPntjdXJpb3VzbHl9OyAgICAjIHByaW50cyAnQ3VyaW91c2VyIGFuZCBjdXJpb3VzZXInCgogICAgCiAgICAjIFN1YmNsYXNzaW5nIHdvcmtzLCB0b28uCiAgICBwYWNrYWdlIE1pbnQ6OlNudWZmOwogICAgdXNlIGJhc2UgcXcoQWx0b2lkcyk7CgogICAgbXkgTWludDo6U251ZmYgJHBvdWNoID0gTWludDo6U251ZmYtPm5ldzsKICAgICRwb3VjaC0+c3Ryb25nKCdCbG93IHlvdXIgaGVhZCBvZmYhJyk7CiAgICBwcmludCAkcG91Y2gtPntzdHJvbmd9OyAgICAgIyBwcmludHMgJ0Jsb3cgeW91ciBoZWFkIG9mZiEnCgoKSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgYWx0ZXJpbmcgdGhlIGJlaGF2aW9yIG9mIHlvdXIgYWNjZXNzb3JzLgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KHRoaXMgdGhhdCB1cCBkb3duKSk7CgogICAgc3ViIGdldCB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBnZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIkdldHRpbmcgQF9cbiI7CgogICAgICAgICRzZWxmLT5TVVBFUjo6Z2V0KEBfKTsKICAgIH0KCiAgICBzdWIgc2V0IHsKICAgICAgICBteSAoJHNlbGYsICRrZXkpID0gc3BsaWNlKEBfLCAwLCAyKTsKCiAgICAgICAgIyBOb3RlIGV2ZXJ5IHRpbWUgc29tZW9uZSBzZXRzIHNvbWUgZGF0YS4KICAgICAgICBwcmludCBTVERFUlIgIlNldHRpbmcgJGtleSB0byBAX1xuIjsKCiAgICAgICAgJHNlbGYtPlNVUEVSOjpzZXQoJGtleSwgQF8pOwogICAgfQoKCj1oZWFkMSBDQVZFQVRTIEFORCBUUklDS1MKCkNsYXNzOjpBY2Nlc3NvciBoYXMgdG8gZG8gc29tZSBpbnRlcm5hbCB3YWNraW5lc3MgdG8gZ2V0IGl0cwpqb2IgZG9uZSBxdWlja2x5IGFuZCBlZmZpY2llbnRseS4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlcmUncyBhIGZldwp0cmlja3MgYW5kIHRyYXBzIG9uZSBtdXN0IGtub3cgYWJvdXQuCgpIZXksIG5vdGhpbmcncyBwZXJmZWN0LgoKPWhlYWQyIERvbid0IG1ha2UgYSBmaWVsZCBjYWxsZWQgREVTVFJPWQoKVGhpcyBpcyBiYWQuICBTaW5jZSBERVNUUk9ZIGlzIGEgbWFnaWNhbCBtZXRob2QgaXQgd291bGQgYmUgYmFkIGZvciB1cwp0byBkZWZpbmUgYW4gYWNjZXNzb3IgdXNpbmcgdGhhdCBuYW1lLiAgQ2xhc3M6OkFjY2Vzc29yIHdpbGwKY2FycCBpZiB5b3UgdHJ5IHRvIHVzZSBpdCB3aXRoIGEgZmllbGQgbmFtZWQgIkRFU1RST1kiLgoKPWhlYWQyIE92ZXJyaWRpbmcgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvcnMKCllvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGUgYXV0b2dlbmVyYXRlZCBhY2Nlc3NvciB3aXRoIHlvdXIgb3duLCB5ZXQKaGF2ZSB5b3VyIGN1c3RvbSBhY2Nlc3NvciBjYWxsIHRoZSBkZWZhdWx0IG9uZS4gIEZvciBpbnN0YW5jZSwgbWF5YmUKeW91IHdhbnQgdG8gaGF2ZSBhbiBhY2Nlc3NvciB3aGljaCBjaGVja3MgaXRzIGlucHV0LiAgTm9ybWFsbHksIG9uZQp3b3VsZCBleHBlY3QgdGhpcyB0byB3b3JrOgoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIEZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgICMgT25seSBhY2NlcHQgYWRkcmVzc2VzIHdoaWNoIGxvb2sgdmFsaWQuCiAgICBzdWIgZW1haWwgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwogICAgICAgIG15KCRlbWFpbCkgPSBAXzsKCiAgICAgICAgaWYoIEBfICkgeyAgIyBTZXR0aW5nCiAgICAgICAgICAgIHJlcXVpcmUgRW1haWw6OlZhbGlkOwogICAgICAgICAgICB1bmxlc3MoIEVtYWlsOjpWYWxpZC0+YWRkcmVzcygkZW1haWwpICkgewogICAgICAgICAgICAgICAgY2FycCgiJGVtYWlsIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgYWRkcmVzcy4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxmLT5TVVBFUjo6ZW1haWwoQF8pOwogICAgfQoKVGhlcmUncyBhIHN1YnRsZSBwcm9ibGVtIGluIHRoZSBsYXN0IGV4YW1wbGUsIGFuZCBpdCdzIGluIHRoaXMgbGluZToKCiAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjplbWFpbChAXyk7CgpJZiB3ZSBsb29rIGF0IGhvdyBGb28gd2FzIGRlZmluZWQsIGl0IGNhbGxlZCBta19hY2Nlc3NvcnMoKSB3aGljaApzdHVjayBlbWFpbCgpIHJpZ2h0IGludG8gRm9vJ3MgbmFtZXNwYWNlLiAgVGhlcmUgKmlzKiBubwpTVVBFUjo6ZW1haWwoKSB0byBkZWxlZ2F0ZSB0byEgIFR3byB3YXlzIGFyb3VuZCB0aGlzLi4uIGZpcnN0IGlzIHRvCm1ha2UgYSAicHVyZSIgYmFzZSBjbGFzcyBmb3IgRm9vLiAgVGhpcyBwdXJlIGNsYXNzIHdpbGwgZ2VuZXJhdGUgdGhlCmFjY2Vzc29ycyBhbmQgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IHN1cGVyIGNsYXNzIGZvciBGb28gdG8gdXNlOgoKICAgIHBhY2thZ2UgUHVyZTo6T3JnYW5pYzo6Rm9vOwogICAgdXNlIGJhc2UgcXcoQ2xhc3M6OkFjY2Vzc29yKTsKICAgIFB1cmU6Ok9yZ2FuaWM6OkZvby0+bWtfYWNjZXNzb3JzKHF3KGVtYWlsIHRoaXMgdGhhdCB3aGF0ZXZlcikpOwoKICAgIHBhY2thZ2UgRm9vOwogICAgdXNlIGJhc2UgcXcoUHVyZTo6T3JnYW5pYzo6Rm9vKTsKCkFuZCBub3cgRm9vOjplbWFpbCgpIGNhbiBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkClB1cmU6Ok9yZ2FuaWM6OkZvbzo6ZW1haWwoKSBhbmQgdXNlIGl0IGFzIFNVUEVSOjplbWFpbCgpLgoKVGhpcyBpcyBwcm9iYWJseSB0aGUgbW9zdCBvYnZpb3VzIHNvbHV0aW9uIHRvIGV2ZXJ5b25lIGJ1dCBtZS4KSW5zdGVhZCwgd2hhdCBmaXJzdCBtYWRlIHNlbnNlIHRvIG1lIHdhcyBmb3IgbWtfYWNjZXNzb3JzKCkgdG8gZGVmaW5lCmFuIGFsaWFzIG9mIGVtYWlsKCksIF9lbWFpbF9hY2Nlc3NvcigpLiAgVXNpbmcgdGhpcyBzb2x1dGlvbiwKRm9vOjplbWFpbCgpIHdvdWxkIGJlIHdyaXR0ZW4gd2l0aDoKCiAgICByZXR1cm4gJHNlbGYtPl9lbWFpbF9hY2Nlc3NvcihAXyk7CgppbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCBTVVBFUjo6ZW1haWwoKS4KCgo9aGVhZDEgQVVUSE9SUwoKQ29weXJpZ2h0IDIwMDkgTWFydHkgUGF1bGV5IDxtYXJ0eStwZXJsQGthc2VpLmNvbT4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCnRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiAgVGhhdCBtZWFucyBlaXRoZXIgKGEpIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBvciAoYikgdGhlIEFydGlzdGljIExpY2Vuc2UuCgo9aGVhZDIgT1JJR0lOQUwgQVVUSE9SCgpNaWNoYWVsIEcgU2Nod2VybiA8c2Nod2VybkBwb2JveC5jb20+Cgo9aGVhZDIgVEhBTktTCgpMaXogYW5kIFJVWiBmb3IgcGVyZm9ybWFuY2UgdHdlYWtzLgoKVGVscywgZm9yIGhpcyBiaWcgZmVhdHVyZSByZXF1ZXN0L2J1ZyByZXBvcnQuCgpWYXJpb3VzIHByZXNlbnRlcnMgYXQgWUFQQzo6QXNpYSAyMDA5IGZvciBjcml0aWNpc2luZyB0aGUgbm9uLU1vb3NlIGludGVyZmFjZS4KCj1oZWFkMSBTRUUgQUxTTwoKU2VlIEw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiBhbmQgTDxDbGFzczo6QWNjZXNzb3I6OkZhc3Rlcj4gaWYgc3BlZWQgaXMgbW9yZQppbXBvcnRhbnQgdGhhbiBmbGV4aWJpbGl0eS4KClRoZXNlIGFyZSBzb21lIG1vZHVsZXMgd2hpY2ggZG8gc2ltaWxhciB0aGluZ3MgaW4gZGlmZmVyZW50IHdheXMKTDxDbGFzczo6U3RydWN0PiwgTDxDbGFzczo6TWV0aG9kbWFrZXI+LCBMPENsYXNzOjpHZW5lcmF0ZT4sCkw8Q2xhc3M6OkNsYXNzPiwgTDxDbGFzczo6Q29udHJhY3Q+LCBMPE1vb3NlPiwgTDxNb3VzZT4KClNlZSBMPENsYXNzOjpEQkk+IGZvciBhbiBleGFtcGxlIG9mIHRoaXMgbW9kdWxlIGluIHVzZS4KCj1jdXQK
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwpvdXIgJFZFUlNJT04gPSAnMC4wMSc7CgpzdWIgbWFrZV9hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICAjIEJ1aWxkIGEgY2xvc3VyZSBhcm91bmQgJGZpZWxkLgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkoJHNlbGYpID0gc2hpZnQ7CgogICAgICAgIGlmIChAXykgewogICAgICAgICAgICAkc2VsZi0+c2V0KCRmaWVsZCwgQF8pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHNlbGYtPmdldCgkZmllbGQpOwogICAgICAgIH0KICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnNldCgkZmllbGQsIEBfKTsKICAgICAgICAgICAgcmV0dXJuICRzZWxmOwogICAgICAgIH0KICAgIH07Cn0KCjE7Cl9fRU5EX18KCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgLSBtYWtlIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KCBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQgKTsKIF9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMocXcoIGZvbyBiYXIgYmF6ICkpOwoKIG15ICRmb28gPSBGb28tPm5ldy0+Zm9vKDEpLT5iYXIoMiktPmJheig0KTsKIHByaW50ICRmb28tPmJhcjsgIyBwcmludHMgMgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIGNoYWluZWQgYWNjZXNzb3IgaXMgb25lIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIG9iamVjdCB3aGVuIGNhbGxlZAp3aXRoIHBhcmFtZXRlcnMgKHRvIHNldCksIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdoZW4gY2FsbGVkIHdpdGgKbm8gYXJndW1lbnRzLgoKVGhpcyBtb2R1bGUgc3ViY2xhc3NlcyBDbGFzczo6QWNjZXNzb3IgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgc2FtZQpta19hY2Nlc3NvcnMgaW50ZXJmYWNlLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q+Cgo9Y3V0Cg==
cGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3InOwp1c2Ugc3RyaWN0OwokQ2xhc3M6OkFjY2Vzc29yOjpGYXN0OjpWRVJTSU9OID0gJzAuMzQnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSBpZiBzY2FsYXIoQF8pID09IDE7CiAgICAgICAgcmV0dXJuICRfWzBdLT57JGZpZWxkfSAgPSBzY2FsYXIoQF8pID09IDIgPyAkX1sxXSA6IFtAX1sxLi4kI19dXTsKICAgIH07Cn0KCgpzdWIgbWFrZV9yb19hY2Nlc3NvciB7CiAgICBteSgkY2xhc3MsICRmaWVsZCkgPSBAXzsKCiAgICByZXR1cm4gc3ViIHsKICAgICAgICByZXR1cm4gJF9bMF0tPnskZmllbGR9IGlmIEBfID09IDE7CiAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAkX1swXS0+X2Nyb2FrKCInJGNhbGxlcicgY2Fubm90IGFsdGVyIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiBvYmplY3RzIG9mIGNsYXNzICckY2xhc3MnIik7CiAgICB9Owp9CgoKc3ViIG1ha2Vfd29fYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgaWYgKEBfID09IDEpIHsKICAgICAgICAgICAgbXkgJGNhbGxlciA9IGNhbGxlcjsKICAgICAgICAgICAgJF9bMF0tPl9jcm9haygiJyRjYWxsZXInIGNhbm5vdCBhY2Nlc3MgdGhlIHZhbHVlIG9mICckZmllbGQnIG9uIG9iamVjdHMgb2YgY2xhc3MgJyRjbGFzcyciKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkX1swXS0+eyRmaWVsZH0gPSAkX1sxXSBpZiBAXyA9PSAyOwogICAgICAgICAgICByZXR1cm4gKHNoaWZ0KS0+eyRmaWVsZH0gPSBcQF87CiAgICAgICAgfQogICAgfTsKfQoKCjE7CgpfX0VORF9fCgo9aGVhZDEgTkFNRQoKQ2xhc3M6OkFjY2Vzc29yOjpGYXN0IC0gRmFzdGVyLCBidXQgbGVzcyBleHBhbmRhYmxlLCBhY2Nlc3NvcnMKCj1oZWFkMSBTWU5PUFNJUwoKICBwYWNrYWdlIEZvbzsKICB1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3I6OkZhc3QpOwoKICAjIFRoZSByZXN0IGlzIHRoZSBzYW1lIGFzIENsYXNzOjpBY2Nlc3NvciBidXQgd2l0aG91dCBzZXQoKSBhbmQgZ2V0KCkuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgaXMgYSBmYXN0ZXIgYnV0IGxlc3MgZXhwYW5kYWJsZSB2ZXJzaW9uIG9mIENsYXNzOjpBY2Nlc3Nvci4KQ2xhc3M6OkFjY2Vzc29yJ3MgZ2VuZXJhdGVkIGFjY2Vzc29ycyByZXF1aXJlIHR3byBtZXRob2QgY2FsbHMgdG8gYWNjb21waXNoCnRoZWlyIHRhc2sgKG9uZSBmb3IgdGhlIGFjY2Vzc29yLCBhbm90aGVyIGZvciBnZXQoKSBvciBzZXQoKSkuCkNsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBlbGltaW5hdGVzIGNhbGxpbmcgc2V0KCkvZ2V0KCkgYW5kIGRvZXMgdGhlIGFjY2VzcyBpdHNlbGYsCnJlc3VsdGluZyBpbiBhIHNvbWV3aGF0IGZhc3RlciBhY2Nlc3Nvci4KClRoZSBkb3duc2lkZSBpcyB0aGF0IHlvdSBjYW4ndCBlYXNpbHkgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHlvdXIKYWNjZXNzb3JzLCBub3IgY2FuIHlvdXIgc3ViY2xhc3Nlcy4gIE9mIGNvdXJzZSwgc2hvdWxkIHlvdSBuZWVkIHRoaXMKbGF0ZXIsIHlvdSBjYW4gYWx3YXlzIHN3YXAgb3V0IENsYXNzOjpBY2Nlc3Nvcjo6RmFzdCBmb3IKQ2xhc3M6OkFjY2Vzc29yLgoKUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQ2xhc3M6OkFjY2Vzc29yIGZvciBtb3JlIGluZm8uCgo9aGVhZDEgRUZGSUNJRU5DWQoKTDxDbGFzczo6QWNjZXNzb3IvRUZGSUNJRU5DWT4gZm9yIGFuIGVmZmljaWVuY3kgY29tcGFyaXNvbi4KCj1oZWFkMSBBVVRIT1JTCgpDb3B5cmlnaHQgMjAwNyBNYXJ0eSBQYXVsZXkgPG1hcnR5K3BlcmxAa2FzZWkuY29tPgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuICBUaGF0IG1lYW5zIGVpdGhlciAoYSkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIG9yIChiKSB0aGUgQXJ0aXN0aWMgTGljZW5zZS4KCj1oZWFkMiBPUklHSU5BTCBBVVRIT1IKCk1pY2hhZWwgRyBTY2h3ZXJuIDxzY2h3ZXJuQHBvYm94LmNvbT4KCj1oZWFkMSBTRUUgQUxTTwoKTDxDbGFzczo6QWNjZXNzb3I+Cgo9Y3V0Cg==
dXNlIHN0cmljdDsKcGFja2FnZSBDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3Q7CnVzZSBiYXNlICdDbGFzczo6QWNjZXNzb3I6OkZhc3QnOwoKc3ViIG1ha2VfYWNjZXNzb3IgewogICAgbXkoJGNsYXNzLCAkZmllbGQpID0gQF87CgogICAgcmV0dXJuIHN1YiB7CiAgICAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICAgICBpZihAXykgewogICAgICAgICAgICAkc2VsZi0+eyRmaWVsZH0gPSAoQF8gPT0gMSA/ICRfWzBdIDogW0BfXSk7CiAgICAgICAgICAgIHJldHVybiAkc2VsZjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzZWxmLT57JGZpZWxkfTsKICAgIH07Cn0KCnN1YiBtYWtlX3dvX2FjY2Vzc29yIHsKICAgIG15KCRjbGFzcywgJGZpZWxkKSA9IEBfOwoKICAgIHJldHVybiBzdWIgewogICAgICAgIG15KCRzZWxmKSA9IHNoaWZ0OwoKICAgICAgICB1bmxlc3MgKEBfKSB7CiAgICAgICAgICAgIG15ICRjYWxsZXIgPSBjYWxsZXI7CiAgICAgICAgICAgIHJlcXVpcmUgQ2FycDsKICAgICAgICAgICAgQ2FycDo6Y3JvYWsoIickY2FsbGVyJyBjYW5ub3QgYWNjZXNzIHRoZSB2YWx1ZSBvZiAnJGZpZWxkJyBvbiAiLgogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyBvZiBjbGFzcyAnJGNsYXNzJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPnskZmllbGR9ID0gKEBfID09IDEgPyAkX1swXSA6IFtAX10pOwogICAgICAgICAgICByZXR1cm4gJHNlbGY7CiAgICAgICAgfQogICAgfTsKfQoKMTsKCj1oZWFkMSBOQU1FCgpDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ6OkZhc3QgLSBGYXN0ZXIsIGJ1dCBsZXNzIGV4cGFuZGFibGUsIGNoYWluZWQgYWNjZXNzb3JzCgo9aGVhZDEgU1lOT1BTSVMKCiBwYWNrYWdlIEZvbzsKIHVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCk7CgogICMgVGhlIHJlc3QgYXMgQ2xhc3M6OkFjY2Vzc29yOjpDaGFpbmVkIGV4Y2VwdCBubyBzZXQoKSBvciBnZXQoKS4KCj1oZWFkMSBERVNDUklQVElPTgoKQnkgYW5hbG9ndWUgdG8gQ2xhc3M6OkFjY2Vzc29yIGFuZCBDbGFzczo6QWNjZXNzb3I6OkZhc3QgdGhpcyBtb2R1bGUKcHJvdmlkZXMgYSBmYXN0ZXIgbGVzcy1mbGV4aWJsZSBjaGFpbmVkIGFjY2Vzc29yIG1ha2VyLgoKPWhlYWQxIEFVVEhPUgoKUmljaGFyZCBDbGFtcCA8cmljaGFyZGNAdW5peGJlYXJkLm5ldD4KCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwMyBSaWNoYXJkIENsYW1wLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgU0VFIEFMU08KCkw8Q2xhc3M6OkFjY2Vzc29yOjpGYXN0PiwgTDxDbGFzczo6QWNjZXNzb3I6OkNoYWluZWQ+Cgo9Y3V0Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOwp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgp1c2UgQ2xhc3M6OlJldHVyblZhbHVlOwp1c2UgVGV4dDo6dkZpbGU6OmFzRGF0YTsKCm91ciAkVkVSU0lPTiA9ICcwLjIyJzsKCnVzZSBDYXJwOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWwgLSBHZW5lcmF0ZXMgaUNhbGVuZGFyIChSRkMgMjQ0NSkgY2FsZW5kYXIgZmlsZXMKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHVzZSBEYXRhOjpJQ2FsOwoKICAgIG15ICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldygpOwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CgogICAgIyAuLi4gb3IKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhmaWxlbmFtZSA9PiAnZm9vLmljcycpOyAjIHBhcnNlIGV4aXN0aW5nIGZpbGUKICAgICRjYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldyhkYXRhID0+ICdCRUdJTjpWQ0FMRU5EQVIuLi4nKTsgIyBwYXJzZSBmcm9tIHNjYWxhcgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKICAgIHByaW50ICRjYWxlbmRhci0+YXNfc3RyaW5nOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBDPFZDQUxFTkRBUj4gb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlCmlDYWxlbmRhciBwcm90b2NvbCAoUkZDIDI0NDUsIE1JTUUgdHlwZSAidGV4dC9jYWxlbmRhciIpLCBhcyBpbXBsZW1lbnRlZCBpbiBtYW55CnBvcHVsYXIgY2FsZW5kYXJpbmcgcHJvZ3JhbXMgc3VjaCBhcyBBcHBsZSdzIGlDYWwuCgpFYWNoIEw8RGF0YTo6SUNhbD4gb2JqZWN0IGlzIGEgY29sbGVjdGlvbiBvZiAiZW50cmllcyIsIHdoaWNoIGFyZSBvYmplY3RzIG9mIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4uICBUaGUgdHlwZXMgb2YgZW50cmllcyBkZWZpbmVkIGJ5IGlDYWxlbmRhcgood2hpY2ggcmVmZXJzIHRvIHRoZW0gYXMgImNvbXBvbmVudHMiKSBpbmNsdWRlIGV2ZW50cywgdG8tZG8gaXRlbXMsIGpvdXJuYWwKZW50cmllcywgZnJlZS9idXN5IHRpbWUgaW5kaWNhdG9ycywgYW5kIHRpbWUgem9uZSBkZXNjcmlwdG9yczsgaW4gYWRkaXRpb24sCmV2ZW50cyBhbmQgdG8tZG8gaXRlbXMgY2FuIGNvbnRhaW4gYWxhcm0gZW50cmllcy4gIChDdXJyZW50bHksIEw8RGF0YTo6SUNhbD4Kb25seSBpbXBsZW1lbnRzIHRvLWRvIGl0ZW1zIGFuZCBldmVudHMuKQoKTDxEYXRhOjpJQ2FsPiBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+OyBzZWUgaXRzIG1hbnBhZ2UgZm9yIG1vcmUKbWV0aG9kcyBhcHBsaWNhYmxlIHRvIEw8RGF0YTo6SUNhbD4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSBdLCBbIGNhbG5hbWUgPT4gJHN0cmluZyBdLCBbIHZjYWwxMCA9PiAkYm9vbCBdLCBbIHJmY19zdHJpY3QgPT4gJGJvb2wgXSwgWyBhdXRvX3VpZCA9PiAkYm9vbCBdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbD4gb2JqZWN0LgoKSWYgaXQgaXMgZ2l2ZW4gYSBmaWxlbmFtZSBvciBkYXRhIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHBhcnNlcyB0aGUKY29udGVudCBvZiB0aGUgZmlsZSBvciBzdHJpbmcgaW50byB0aGUgb2JqZWN0LiAgSWYgdGhlIEM8dmNhbDEwPiBmbGFnIGlzIHBhc3NlZCwKcGFyc2VzIGl0IGFjY29yZGluZyB0byB2Q2FsZW5kYXIgMS4wLCBub3QgaUNhbGVuZGFyIDIuMDsgdGhpcyBpbiBwYXJ0aWN1bGFyIGltcGFjdHMKdGhlIHBhcnNpbmcgb2YgY29udGludWF0aW9uIGxpbmVzIGluIHF1b3RlZC1wcmludGFibGUgc2VjdGlvbnMuCgpJZiBhIGNhbG5hbWUgaXMgcGFzc2VkLCBzZXRzIHgtd3ItY2FsbmFtZSB0byB0aGUgZ2l2ZW4gc3RyaW5nLiAgQWx0aG91Z2gKbm90IHNwZWNpZmllZCBpbiBSRkMyNDQ1LCBtb3N0IGNhbGVuZGFyIHNvZnR3YXJlIHJlc3BlY3RzIHgtd3ItY2FsbmFtZQphcyB0aGUgZGlzcGxheWVkIG5hbWUgb2YgdGhlIGNhbGVuZGFyLgoKSWYgdGhlIEM8cmZjX3N0cmljdD4gZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgd2lsbCByZXF1aXJlIERhdGE6OklDYWwgdG8KaW5jbHVkZSBVSURzLCBhcyBwZXIgUkZDMjQ0NToKCiAgICA0LjguNC43IFVuaXF1ZSBJZGVudGlmaWVyCiAgICAuLi4gVGhlIHByb3BlcnR5IE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSAiVkVWRU5UIiwgIlZUT0RPIiwKICAgICJWSk9VUk5BTCIgb3IgIlZGUkVFQlVTWSIgY2FsZW5kYXIgY29tcG9uZW50cyIKCklmIHRoZSBDPGF1dG9fdWlkPiBmbGFnIGlzIHNldCB0byB0cnVlLCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYQpkZWZhdWx0IFVJRCBmb3IgZWFjaCB0eXBlIHdoaWNoIHJlcXVpcmVzIGl0LCBiYXNlZCBvbiB0aGUgUkZDLXN1Z2dlc3RlZAphbGdvcml0aG0uICBFeHBsaWNpdGx5LXNldCBVSUQgYXR0cmlidXRlcyB3aWxsIG92ZXJyaWRlIHRoaXMKYXV0by1nZW5lcmF0ZWQgdmFsdWUuCgpJZiBhIGZpbGVuYW1lIG9yIGRhdGEgYXJndW1lbnQgaXMgbm90IHBhc3NlZCwgdGhpcyBqdXN0IHNldHMgdGhlCm9iamVjdCdzIEM8VkVSU0lPTj4gYW5kIEM8UFJPRElEPiBwcm9wZXJ0aWVzIHRvICIyLjAiIChvciAiMS4wIiBpZiB0aGUKQzx2Y2FsMTA+IGZsYWcgaXMgcGFzc2VkKSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBDPHByb2R1Y3RfaWQ+IG1ldGhvZApyZXNwZWN0aXZlbHkuCgpSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvIG9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZQp2YWx1ZSBpcyBhIEw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CgogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgZmlsZW5hbWUgICA9PiB1bmRlZiwKICAgICAgICBjYWxuYW1lICAgID0+IHVuZGVmLAogICAgICAgIGRhdGEgICAgICAgPT4gdW5kZWYsCiAgICAgICAgdmNhbDEwICAgICA9PiAwLAogICAgICAgIHJmY19zdHJpY3QgPT4gMCwKICAgICAgICBhdXRvX3VpZCAgID0+IDAsCiAgICAgICAgQF8KICAgICk7CgogICAgJHNlbGYtPnZjYWwxMCggJGFyZ3N7dmNhbDEwfSApOwogICAgJHNlbGYtPnJmY19zdHJpY3QoICRhcmdze3JmY19zdHJpY3R9ICk7CiAgICAkc2VsZi0+YXV0b191aWQoICRhcmdze2F1dG9fdWlkfSApOwoKICAgIGlmICggZGVmaW5lZCAkYXJnc3tmaWxlbmFtZX0gb3IgZGVmaW5lZCAkYXJnc3tkYXRhfSApIHsKCiAgICAgICAgIyBtaWdodCByZXR1cm4gYSBDbGFzczo6UmV0dXJuVmFsdWUgaWYgcGFyc2luZyBmYWlscwogICAgICAgIHJldHVybiAkc2VsZi0+cGFyc2UoJWFyZ3MpOwogICAgfSBlbHNlIHsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgIHZlcnNpb24gPT4gKCAkc2VsZi0+dmNhbDEwID8gJzEuMCcgOiAnMi4wJyApLAogICAgICAgICAgICBwcm9kaWQgPT4gJHNlbGYtPnByb2R1Y3RfaWQsCiAgICAgICAgKTsKICAgICAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCd4LXdyLWNhbG5hbWUnID0+ICRhcmdze2NhbG5hbWV9KQogICAgICAgICAgICBpZiBkZWZpbmVkICRhcmdze2NhbG5hbWV9OwoKICAgICAgICByZXR1cm4gJHNlbGY7CiAgICB9Cn0KCj1oZWFkMiBwYXJzZSBbIGRhdGEgPT4gJGRhdGEsIF0gWyBmaWxlbmFtZSA9PiAkZmlsZSwgXQoKUGFyc2UgYSBDPC5pY3M+IGZpbGUgb3Igc3RyaW5nIGNvbnRhaW5pbmcgb25lLCBhbmQgcG9wdWxhdGUgQzwkc2VsZj4Kd2l0aCBpdHMgY29udGVudHMuCgpTaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBvbiBhIGdpdmVuIG9iamVjdCwgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseQpjYWxsZWQgYnkgQzxuZXc+IGlmIHlvdSBwcm92aWRlIGFyZ3VtZW50cyB0byBDPG5ldz4uCgpSZXR1cm5zIEM8JHNlbGY+IG9uIHN1Y2Nlc3MuICBSZXR1cm5zIGEgZmFsc2UgdmFsdWUgdXBvbiBmYWlsdXJlIHRvCm9wZW4gb3IgcGFyc2UgdGhlIGZpbGUgb3IgZGF0YTsgdGhpcyBmYWxzZSB2YWx1ZSBpcyBhCkw8Q2xhc3M6OlJldHVyblZhbHVlPiBvYmplY3QgYW5kIGNhbiBiZSBxdWVyaWVkIGFzIHRvIGl0cwpDPGVycm9yX21lc3NhZ2U+LgoKPWN1dAoKc3ViIHBhcnNlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmaWxlbmFtZSA9PiB1bmRlZiwKICAgICAgICBkYXRhICAgICA9PiB1bmRlZiwKICAgICAgICBAXwogICAgKTsKCiAgICB1bmxlc3MgKCBkZWZpbmVkICRhcmdze2ZpbGVuYW1lfSBvciBkZWZpbmVkICRhcmdze2RhdGF9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2Vycm9yKAogICAgICAgICAgICAicGFyc2UgY2FsbGVkIHdpdGggbm8gZmlsZW5hbWUgb3IgZGF0YSBzcGVjaWZpZWQiKTsKICAgIH0KCiAgICBteSBAbGluZXM7CgogICAgIyBvcGVuIHRoZSBmaWxlIChjaGVja2luZyBhcyB3ZSBnbywgbGlrZSBnb29kIGxpdHRsZSBQZXJsIG1vbmdlcnMpCiAgICBpZiAoIGRlZmluZWQgJGFyZ3N7ZmlsZW5hbWV9ICkgewogICAgICAgIG9wZW4gbXkgJGZoLCAnPCcsICRhcmdze2ZpbGVuYW1lfQogICAgICAgICAgICBvciByZXR1cm4gJHNlbGYtPl9lcnJvcigiY291bGQgbm90IG9wZW4gJyRhcmdze2ZpbGVuYW1lfSc6ICQhIik7CiAgICAgICAgQGxpbmVzID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmaD47CiAgICB9IGVsc2UgewogICAgICAgIEBsaW5lcyA9IHNwbGl0IC9ccj9cbi8sICRhcmdze2RhdGF9OwogICAgfQoKICAgIEBsaW5lcyA9ICRzZWxmLT5fdmNhbDEwX2lucHV0X2NsZWFudXAoQGxpbmVzKSBpZiAkc2VsZi0+dmNhbDEwOwoKICAgICMgUGFyc2UgdGhlIGxpbmVzOyBUZXh0Ojp2RmlsZSBkb2Vzbid0IHdhbnQgdHJhaWxpbmcgbmV3bGluZXMKICAgIG15ICRjYWwgPSBldmFsIHsgVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZV9saW5lcyhAbGluZXMpIH07CiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZTogJEAiKSBpZiAkQDsKCiAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigicGFyc2UgZmFpbHVyZSIpCiAgICAgICAgdW5sZXNzICRjYWwgYW5kIGV4aXN0cyAkY2FsLT57b2JqZWN0c307CgogICAgIyBsb29wIHRocm91Z2ggYWxsIHRoZSB2Y2FyZHMKICAgIGZvcmVhY2ggbXkgJG9iamVjdCAoIEB7ICRjYWwtPntvYmplY3RzfSB9ICkgewogICAgICAgICRzZWxmLT5wYXJzZV9vYmplY3QoJG9iamVjdCk7CiAgICB9CgogICAgbXkgJHZlcnNpb25fcmVmID0gJHNlbGYtPnByb3BlcnR5KCJ2ZXJzaW9uIik7CiAgICBteSAkdmVyc2lvbiA9ICR2ZXJzaW9uX3JlZiA/ICR2ZXJzaW9uX3JlZi0+WzBdLT52YWx1ZSA6IHVuZGVmOwogICAgdW5sZXNzICggZGVmaW5lZCAkdmVyc2lvbiApIHsKICAgICAgICByZXR1cm4gJHNlbGYtPl9lcnJvcigiZGF0YSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBwcm9wZXJ0eSIpOwogICAgfQoKICAgIGlmICggICAkdmVyc2lvbiBlcSAnMS4wJyBhbmQgbm90ICRzZWxmLT52Y2FsMTAKICAgICAgICBvciAkdmVyc2lvbiBlcSAnMi4wJyBhbmQgJHNlbGYtPnZjYWwxMCApCiAgICB7CiAgICAgICAgcmV0dXJuICRzZWxmLT5fZXJyb3IoICdhcHBsaWNhdGlvbiBjbGFpbXMgZGF0YSBpcycKICAgICAgICAgICAgICAgIC4gKCAkc2VsZi0+dmNhbDEwID8gJycgOiAnIG5vdCcgKQogICAgICAgICAgICAgICAgLiAnIHZDYWwgMS4wIGJ1dCBkb2MgY29udGFpbnMgVkVSU0lPTjonCiAgICAgICAgICAgICAgICAuICR2ZXJzaW9uICk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9CgpzdWIgX2Vycm9yIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbXNnICA9IHNoaWZ0OwoKICAgIG15ICRyZXQgPSBDbGFzczo6UmV0dXJuVmFsdWUtPm5ldzsKICAgICRyZXQtPmFzX2Vycm9yKCBlcnJubyA9PiAxLCBtZXNzYWdlID0+ICRtc2cgKTsKICAgIHJldHVybiAkcmV0Owp9Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkNBTEVOREFSPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZDQUxFTkRBUid9Cgo9aGVhZDIgcHJvZHVjdF9pZAoKUmV0dXJucyB0aGUgcHJvZHVjdCBJRCB1c2VkIGluIHRoZSBjYWxlbmRhcidzIEM8UFJPRElEPiBwcm9wZXJ0eTsgeW91IG1heQp3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyBmb3IgeW91ciBvd24gYXBwbGljYXRpb24uCgo9Y3V0CgpzdWIgcHJvZHVjdF9pZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICJEYXRhOjpJQ2FsICRWRVJTSU9OIjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtdXN0IGJlIHNwZWNpZmllZApleGFjdGx5IG9uZSB0aW1lIGZvciBhIGNhbGVuZGFyOgoKICAgICAgcHJvZGlkIHZlcnNpb24KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgcHJvZGlkIHZlcnNpb24KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUgc3BlY2lmaWVkCmF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgY2FsZW5kYXI6CgogICAgICBjYWxzY2FsZSBtZXRob2QKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBjYWxzY2FsZSBtZXRob2QKICAgICk7Cn0KCiMgSW4gcXVvdGVkLXByaW50YWJsZSBzZWN0aW9ucywgY29udmVydCBmcm9tIHZjYWwxMCAiPVxuIiBsaW5lIGVuZGluZ3MgdG8KIyBpY2FsMjAgIlxuICIuCnN1YiBfdmNhbDEwX2lucHV0X2NsZWFudXAgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSBAaW5fbGluZXMgPSBAXzsKCiAgICBteSBAb3V0X2xpbmVzOwoKICAgIG15ICRpbl9xcCA9IDA7CkxJTkU6IHdoaWxlIChAaW5fbGluZXMpIHsKICAgICAgICBteSAkbGluZSA9IHNoaWZ0IEBpbl9saW5lczsKCiAgICAgICAgaWYgKCBub3QgJGluX3FwIGFuZCAkbGluZSA9fiAvXlteOl0rO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEUvaSApIHsKICAgICAgICAgICAgJGluX3FwID0gMTsKICAgICAgICB9CgogICAgICAgIHVubGVzcyAoJGluX3FwKSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgIG5leHQgTElORTsKICAgICAgICB9CgogICAgICAgIGlmICggJGxpbmUgPX4gcy89JC8vICkgewogICAgICAgICAgICBwdXNoIEBvdXRfbGluZXMsICRsaW5lOwogICAgICAgICAgICAkaW5fbGluZXNbMF0gPSAnICcgLiAkaW5fbGluZXNbMF0gaWYgQGluX2xpbmVzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQG91dF9saW5lcywgJGxpbmU7CiAgICAgICAgICAgICRpbl9xcCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAb3V0X2xpbmVzOwp9Cgo9aGVhZDEgREVQRU5ERU5DSUVTCgpMPERhdGE6OklDYWw+IHJlcXVpcmVzIEw8Q2xhc3M6OkFjY2Vzc29yPiwgTDxUZXh0Ojp2RmlsZTo6YXNEYXRhPiwKTDxNSU1FOjpRdW90ZWRQcmludD4sIGFuZCBMPENsYXNzOjpSZXR1cm5WYWx1ZT4uCgo9aGVhZDEgQlVHUyBBTkQgTElNSVRBVElPTlMKCkw8RGF0YTo6SUNhbD4gZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHpvbmUgZGF5bGlnaHQgb3Igc3RhbmRhcmQgZW50cmllcywKc28gdGltZSB6b25lIGNvbXBvbmVudHMgYXJlIGJhc2ljYWxseSB1c2VsZXNzLgoKV2hpbGUgTDxEYXRhOjpJQ2FsPiB0cmllcyB0byBjaGVjayB3aGljaCBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCBhbmQKcmVwZWF0YWJsZSwgdGhpcyBvbmx5IHdvcmtzIGluIHNpbXBsZSBjYXNlczsgaXQgZG9lcyBub3QgY2hlY2sgZm9yCnByb3BlcnRpZXMgdGhhdCBtdXN0IGVpdGhlciBib3RoIGV4aXN0IG9yIGJvdGggbm90IGV4aXN0LCBvciBmb3IKbXV0dWFsbHkgZXhjbHVzaXZlIHByb3BlcnRpZXMuCgpMPERhdGE6OklDYWw+IGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiBwcm9wZXJ0eSBwYXJhbWV0ZXIgbmFtZXMgYXJlCmtub3duIGluIGdlbmVyYWwgb3IgYWxsb3dlZCBvbiB0aGUgcGFydGljdWxhciBwcm9wZXJ0eS4KCkw8RGF0YTo6SUNhbD4gZG9lcyBub3QgY2hlY2sgdG8gc2VlIGlmIG5lc3RlZCBlbnRyaWVzIGFyZSBuZXN0ZWQKcHJvcGVybHkgKGFsYXJtcyBpbiB0b2RvcyBhbmQgZXZlbnRzIG9ubHksIGV2ZXJ5dGhpbmcgZWxzZSBpbgpjYWxlbmRhcnMgb25seSkuCgpUaGUgb25seSBwcm9wZXJ0eSBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgTDxEYXRhOjpJQ2FsPiBpcyBxdW90ZWQKcHJpbnRhYmxlLgoKUGxlYXNlIHJlcG9ydCBhbnkgYnVncyBvciBmZWF0dXJlIHJlcXVlc3RzIHRvCkM8YnVnLWRhdGEtaWNhbEBydC5jcGFuLm9yZz4sIG9yIHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2UgYXQKTDxodHRwOi8vcnQuY3Bhbi5vcmc+LgoKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpQcm9wZXJ0eTsKCnVzZSBiYXNlIHF3L0NsYXNzOjpBY2Nlc3Nvci87Cgp1c2UgQ2FycDsKdXNlIE1JTUU6OlF1b3RlZFByaW50ICgpOwoKb3VyICRWRVJTSU9OID0gJzAuMDYnOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OlByb3BlcnR5IC0gUmVwcmVzZW50cyBhIHByb3BlcnR5IG9uIGFuIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcHJvcGVydHkgb24gYW4KZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUuICBQcm9wZXJ0aWVzIGhhdmUgcGFyYW1ldGVycyBpbiBhZGRpdGlvbiB0bwp0aGVpciB2YWx1ZS4KCllvdSBzaG91bGRuJ3QgbmVlZCB0byBjcmVhdGUgTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gdmFsdWVzIGRpcmVjdGx5Ci0tIGp1c3QgdXNlIEM8YWRkX3Byb3BlcnR5PiBpbiBMPERhdGE6OklDYWw6OkVudHJ5Pi4KClRoZSBDPGVuY29kaW5nPiBwYXJhbWV0ZXIgdmFsdWUgaXMgb25seSBpbnRlcnByZXRlZCBieSBMPERhdGE6OklDYWw+CmluIHRoZSBDPGRlY29kZWRfdmFsdWU+IGFuZCBDPGVuY29kZT4gbWV0aG9kczogYWxsIG90aGVyIG1ldGhvZHMKYWNjZXNzIHRoZSBlbmNvZGVkIHZlcnNpb24gZGlyZWN0bHkgKGlmIHRoZXJlIGlzIGFuIGVuY29kaW5nKS4KCkN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIGVuY29kaW5nIGlzIEM8UVVPVEVELVBSSU5UQUJMRT4uCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldyAka2V5LCAkdmFsdWUsIFskcGFyYW1ldGVyX2hhc2hdCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IHdpdGgga2V5IEM8JGtleT4gYW5kIHZhbHVlIEM8JHZhbHVlPi4KCklmIEM8JHBhcmFtZXRlcl9oYXNoPiBpcyBwcm92aWRlZCwgc2V0cyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIHRvCml0LiAgVGhlIHBhcmFtZXRlciBoYXNoIHNob3VsZCBoYXZlIGtleXMgZXF1YWwgdG8gdGhlIG5hbWVzIG9mIHRoZQpwYXJhbWV0ZXJzIChjYXNlIGluc2Vuc2l0aXZlOyBwYXJhbWV0ZXIgaGFzaGVzIHNob3VsZCBub3QgY29udGFpbiB0d28KZGlmZmVyZW50IGtleXMgd2hpY2ggYXJlIHRoZSBzYW1lIHdoZW4gY29udmVydGVkIHRvIHVwcGVyIGNhc2UpOyB0aGUKdmFsdWVzIHNob3VsZCBlaXRoZXIgYmUgYSBzdHJpbmcgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBzaW5nbGUgdmFsdWUKb3IgYW4gYXJyYXkgcmVmZXJlbmNlIG9mIHN0cmluZ3MgaWYgdGhlIHBhcmFtZXRlciBoYXMgbXVsdGlwbGUgdmFsdWVzLgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9IHt9OwoKICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CgogICAgJHNlbGYtPmtleShzaGlmdCk7CiAgICAkc2VsZi0+dmFsdWUoc2hpZnQpOwogICAgJHNlbGYtPnBhcmFtZXRlcnMoIHNoaWZ0IHx8IHt9ICk7CiAgICByZXR1cm4gKCRzZWxmKTsKfQoKPWhlYWQyIGtleSBbJGtleV0KCkdldHMgb3Igc2V0cyB0aGUga2V5IG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KCj1oZWFkMiB2YWx1ZSBbJHZhbHVlXQoKR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgoKPWhlYWQyIHBhcmFtZXRlcnMgWyRwYXJhbV9oYXNoXQoKR2V0cyBvciBzZXRzIHRoZSBwYXJhbWV0ZXIgaGFzaCByZWZlcmVuY2Ugb2YgdGhpcyBwcm9wZXJ0eS4gIFBhcmFtZXRlcgprZXlzIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZS4KCj1oZWFkMiB2Y2FsMTAgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcwp2Q2FsZW5kYXIgMS4wIChhcyBvcHBvc2VkIHRvIGlDYWxlbmRhciAyLjApLiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3QKc2V0IHRoaXMgb24geW91ciBtYWluIEw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsKQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZQpzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMsIGFuZCBDPGFkZF9wcm9wZXJ0eT4gbWFrZXMgc3VyZSB0aGF0CnByb3BlcnRpZXMgZW5kIHVwIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgdGhlaXIgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KGtleSB2YWx1ZSBfcGFyYW1ldGVycyB2Y2FsMTApKTsKCnN1YiBwYXJhbWV0ZXJzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKEBfKSB7CiAgICAgICAgbXkgJHBhcmFtcyAgICAgPSBzaGlmdDsKICAgICAgICBteSAkbmV3X3BhcmFtcyA9IHt9OwogICAgICAgIHdoaWxlICggbXkgKCAkaywgJHYgKSA9IGVhY2ggJSRwYXJhbXMgKSB7CiAgICAgICAgICAgICRuZXdfcGFyYW1zLT57IHVjICRrIH0gPSAkdjsKICAgICAgICB9CiAgICAgICAgJHNlbGYtPl9wYXJhbWV0ZXJzKCRuZXdfcGFyYW1zKTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGYtPl9wYXJhbWV0ZXJzOwp9CgpteSAlRU5DT0RJTkdTID0gKAogICAgJ1FVT1RFRC1QUklOVEFCTEUnID0+IHsKICAgICAgICBlbmNvZGUgPT4gc3ViIHsKICAgICAgICAgICAgbXkgJGRlYyA9IHNoaWZ0IHx8ICcnOwogICAgICAgICAgICAkZGVjID1+IHMvXG4vXHJcbi9nOwogICAgICAgICAgICByZXR1cm4gTUlNRTo6UXVvdGVkUHJpbnQ6OmVuY29kZSggJGRlYywgJycgKTsKICAgICAgICB9LAogICAgICAgIGRlY29kZSA9PiBzdWIgewogICAgICAgICAgICBteSAkZGVjID0gTUlNRTo6UXVvdGVkUHJpbnQ6OmRlY29kZSggc2hpZnQgfHwgJycgKTsKICAgICAgICAgICAgJGRlYyA9fiBzL1xyXG4vXG4vZzsKICAgICAgICAgICAgcmV0dXJuICRkZWM7CiAgICAgICAgICAgIH0KICAgIH0sCik7Cgo9aGVhZDIgZGVjb2RlZF92YWx1ZQoKR2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSwgY29udmVydGVkIGZyb20gdGhlIGVuY29kaW5nIHNwZWNpZmllZAppbiBpdHMgZW5jb2RpbmcgcGFyYW1ldGVyLiAgKFRoYXQgaXMsIEM8dmFsdWU+IHdpbGwgcmV0dXJuIHRoZSBlbmNvZGVkCnZlcnNpb247IHRoaXMgd2lsbCBhcHBseSB0aGUgZW5jb2RpbmcuKSAgSWYgdGhlIGVuY29kaW5nIGlzIG5vdApzcGVjaWZpZWQgb3IgcmVjb2duaXplZCwganVzdCByZXR1cm5zIHRoZSByYXcgdmFsdWUuCgo9Y3V0CgpzdWIgZGVjb2RlZF92YWx1ZSB7CiAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKICAgIG15ICR2YWx1ZSAgICA9ICRzZWxmLT52YWx1ZTsKICAgIG15ICRlbmNvZGluZyA9IHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICIiICk7CgogICAgaWYgKCAkRU5DT0RJTkdTeyRlbmNvZGluZ30gKSB7CiAgICAgICAgcmV0dXJuICRFTkNPRElOR1N7JGVuY29kaW5nfXsnZGVjb2RlJ30tPigkdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQp9Cgo9aGVhZDIgZW5jb2RlICRlbmNvZGluZwoKQ2FsbHMgQzxkZWNvZGVkX3ZhbHVlPiB0byBnZXQgdGhlIGN1cnJlbnQgZGVjb2RlZCB2YWx1ZSwgdGhlbiBlbmNvZGVzCml0IGluIEM8JGVuY29kaW5nPiwgc2V0cyB0aGUgdmFsdWUgdG8gdGhhdCwgYW5kIHNldHMgdGhlIGVuY29kaW5nCnBhcmFtZXRlciB0byBDPCRlbmNvZGluZz4uIChDPCRlbmNvZGluZz4gaXMgZmlyc3QgY29udmVydGVkIHRvIHVwcGVyCmNhc2UuKQoKSWYgQzwkZW5jb2Rpbmc+IGlzIHVuZGVmLCBkZWxldGVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgYW5kIHNldHMgdGhlCnZhbHVlIHRvIHRoZSBkZWNvZGVkIHZhbHVlLiAgRG9lcyBub3RoaW5nIGlmIHRoZSBlbmNvZGluZyBpcyBub3QKcmVjb2duaXplZC4KCj1jdXQKCnN1YiBlbmNvZGUgewogICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CiAgICBteSAkZW5jb2RpbmcgPSB1YyBzaGlmdDsKCiAgICBteSAkZGVjb2RlZF92YWx1ZSA9ICRzZWxmLT5kZWNvZGVkX3ZhbHVlOwoKICAgIGlmICggbm90IGRlZmluZWQgJGVuY29kaW5nICkgewogICAgICAgICRzZWxmLT52YWx1ZSgkZGVjb2RlZF92YWx1ZSk7CiAgICAgICAgZGVsZXRlICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ307CiAgICB9IGVsc2lmICggJEVOQ09ESU5HU3skZW5jb2Rpbmd9ICkgewogICAgICAgICRzZWxmLT52YWx1ZSggJEVOQ09ESU5HU3skZW5jb2Rpbmd9eydlbmNvZGUnfS0+KCRkZWNvZGVkX3ZhbHVlKSApOwogICAgICAgICRzZWxmLT5wYXJhbWV0ZXJzLT57J0VOQ09ESU5HJ30gPSAkZW5jb2Rpbmc7CiAgICB9CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhc19zdHJpbmcgQVJHUwoKUmV0dXJucyB0aGUgcHJvcGVydHkgZm9ybWF0dGVkIGFzIGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcKbmV3bGluZSkuCgpUYWtlcyBuYW1lZCBhcmd1bWVudHM6Cgo9b3ZlcgoKPWl0ZW0gZm9sZAoKRGVmYXVsdHMgdG8gdHJ1ZS4gcGFzcyBpbiBhIGZhbHNlIHZhbHVlIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlCm5vbi1yZmMtY29tcGxpYW50IGNhbGVuZGFycy4KCj1pdGVtIGNybGYKCkRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUgc3BlYy4gIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseQpmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIHByaW9yIHRvIDAuMTYsCndoaWNoIHVzZWQgQzxceDBhPi4KCj1iYWNrCgo9Y3V0CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAlYXJncyA9ICgKICAgICAgICBmb2xkID0+IDEsCiAgICAgICAgY3JsZiA9PiBEYXRhOjpJQ2FsOjpFbnRyeS0+Q1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRzdHJpbmcKICAgICAgICA9IHVjKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRzZWxmLT5fcGFyYW1ldGVyc19hc19zdHJpbmcgLiAiOiIKICAgICAgICAuICRzZWxmLT5fdmFsdWVfYXNfc3RyaW5nKCAkc2VsZi0+a2V5ICkKICAgICAgICAuICRhcmdze2NybGZ9OwoKICAjIEFzc3VtcHRpb246IHRoZSBvbmx5IHBsYWNlIGluIGFuIGlDYWxlbmRhciB0aGF0IG5lZWRzIGZvbGRpbmcgYXJlIHByb3BlcnR5CiAgIyBsaW5lcwogICAgaWYgKCAkYXJnc3snZm9sZCd9ICkgewogICAgICAgIHJldHVybiAkc2VsZi0+X2ZvbGQoICRzdHJpbmcsICRhcmdze2NybGZ9ICk7CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1iZWdpbiBwcml2YXRlCgo9aGVhZDIgX3ZhbHVlX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyB2YWx1ZSBhcyBhIHN0cmluZy4gIENvbW1hIGFuZCBzZW1pY29sb24gYXJlIG5vdAplc2NhcGVkIHdoZW4gdGhlIHZhbHVlIGlzIHJlY3VyIHR5cGUgKHRoZSBrZXkgaXMgcnJ1bGUpLgoKVmFsdWVzIGFyZSBxdW90ZWQgYWNjb3JkaW5nIHRoZSBpQ2FsIHNwZWMsIHVubGVzcyB0aGlzIGlzIGluIHZDYWwgMS4wCm1vZGUuCgo9ZW5kIHByaXZhdGUKCj1jdXQKCnN1YiBfdmFsdWVfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGtleSAgID0gc2hpZnQ7CiAgICBteSAkdmFsdWUgPSBkZWZpbmVkKCAkc2VsZi0+dmFsdWUoKSApID8gJHNlbGYtPnZhbHVlKCkgOiAnJzsKCiAgICB1bmxlc3MgKCAkc2VsZi0+dmNhbDEwICkgewogICAgICAgICR2YWx1ZSA9fiBzL1xcL1xcXFwvZ3M7CiAgICAgICAgJHZhbHVlID1+IHMvOy9cXDsvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvLC9cXCwvZ3MgdW5sZXNzIGxjKCRrZXkpIGVxICdycnVsZSc7CiAgICAgICAgJHZhbHVlID1+IHMvXHgwZD9ceDBhL1xcbi9nczsKICAgIH0KCiAgICByZXR1cm4gJHZhbHVlOwp9Cgo9YmVnaW4gcHJpdmF0ZQoKPWhlYWQyIF9wYXJhbWV0ZXJzX2FzX3N0cmluZwoKUmV0dXJucyB0aGUgcHJvcGVydHkncyBwYXJhbWV0ZXJzIGFzIGEgc3RyaW5nLiAgUHJvcGVydGllcyBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5CnRvIGFpZCB0ZXN0aW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3BhcmFtZXRlcnNfYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkb3V0ICA9ICcnOwogICAgZm9yIG15ICRuYW1lICggc29ydCBrZXlzICV7ICRzZWxmLT5wYXJhbWV0ZXJzIH0gKSB7CiAgICAgICAgbXkgJHZhbHVlID0gJHNlbGYtPnBhcmFtZXRlcnMtPnskbmFtZX07CiAgICAgICAgJG91dAogICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgLiAkbmFtZSAuICc9JwogICAgICAgICAgICAuICRzZWxmLT5fcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMoCiAgICAgICAgICAgIHJlZiAkdmFsdWUgPyBAJHZhbHVlIDogJHZhbHVlICk7CiAgICB9CiAgICByZXR1cm4gJG91dDsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfcXVvdGVkX3BhcmFtZXRlcl92YWx1ZXMgQHZhbHVlcwoKUXVvdGVzIGFueSBvZiB0aGUgdmFsdWVzIGluIEM8QHZhbHVlcz4gdGhhdCBuZWVkIHRvIGJlIHF1b3RlZCBhbmQKcmV0dXJucyB0aGUgcXVvdGVkIHZhbHVlcyBqb2luZWQgYnkgY29tbWFzLgoKSWYgYW55IG9mIHRoZSB2YWx1ZXMgY29udGFpbnMgYSBkb3VibGUtcXVvdGUsIGVyYXNlcyBpdCBhbmQgZW1pdHMgYQp3YXJuaW5nLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX3F1b3RlZF9wYXJhbWV0ZXJfdmFsdWVzIHsKICAgIG15ICRzZWxmICAgPSBzaGlmdDsKICAgIG15IEB2YWx1ZXMgPSBAXzsKCiAgICBmb3IgbXkgJHZhbCAoQHZhbHVlcykgewogICAgICAgIGlmICggJHZhbCA9fiAvIi8gKSB7CgogICAgICAgICAgICAjIEdldCBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSB1c2VyJ3MgY29kZQogICAgICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gJENhcnA6OkNhcnBMZXZlbCArIDE7CiAgICAgICAgICAgIGNhcnAgIkludmFsaWQgcGFyYW1ldGVyIHZhbHVlIChjb250YWlucyBkb3VibGUgcXVvdGUpOiAkdmFsIjsKICAgICAgICAgICAgJHZhbCA9fiB0ci8iLy9kOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gam9pbiAnLCcsIG1hcCB7IC9bOyw6XS8gPyBxcSgiJF8iKSA6ICRfIH0gQHZhbHVlczsKfQoKPWJlZ2luIHByaXZhdGUKCj1oZWFkMiBfZm9sZCAkc3RyaW5nICRjcmxmCgpSZXR1cm5zIEM8JHN0cmluZz4gZm9sZGVkIHdpdGggbmV3bGluZXMgYW5kIGxlYWRpbmcgd2hpdGVzcGFjZSBzbyB0aGF0CmVhY2ggbGluZSBpcyBhdCBtb3N0IDc1IGNoYXJhY3RlcnMuCgooTm90ZSB0aGF0IGl0IGZvbGRzIGF0IDc1IGNoYXJhY3RlcnMsIG5vdCA3NSBieXRlcyBhcyBzcGVjaWZpZWQgaW4gdGhlCnN0YW5kYXJkLikKCklmIHRoaXMgaXMgdkNhbGVuZGFyIDEuMCBhbmQgZW5jb2RlZCB3aXRoIFFVT1RFRC1QUklOVEFCTEUsIGRvZXMgbm90CmZvbGQgYXQgYWxsLgoKPWVuZCBwcml2YXRlCgo9Y3V0CgpzdWIgX2ZvbGQgewogICAgbXkgJHNlbGYgICA9IHNoaWZ0OwogICAgbXkgJHN0cmluZyA9IHNoaWZ0OwogICAgbXkgJGNybGYgICA9IHNoaWZ0OwoKICAgIG15ICRxdW90ZWRfcHJpbnRhYmxlID0gJHNlbGYtPnZjYWwxMAogICAgICAgICYmIHVjKCAkc2VsZi0+cGFyYW1ldGVycy0+eydFTkNPRElORyd9IHx8ICcnICkgZXEgJ1FVT1RFRC1QUklOVEFCTEUnOwoKICAgIGlmICgkcXVvdGVkX3ByaW50YWJsZSkgewoKICAgICAjIEluIG9sZCB2Y2FsLCBxdW90ZWQtcHJpbnRhYmxlIHByb3BlcnRpZXMgaGF2ZSBkaWZmZXJlbnQgZm9sZGluZyBydWxlcy4KICAgICAjIEJ1dCBzb21lIGludGVyb3AgdGVzdHMgc3VnZ2VzdCBpdCdzIHdpc2VyIGp1c3QgdG8gbm90IGZvbGQgZm9yIHZjYWwgMS4wCiAgICAgIyBhdCBhbGwgKGluIHF1b3RlZC1wcmludGFibGUpLgogICAgfSBlbHNlIHsKICAgICAgICBteSAkcG9zID0gMDsKCiAgICAgICAgIyBXYWxrIHRocm91Z2ggdGhlIHZhbHVlLCBsb29raW5nIHRvIHJlcGxhY2UgNzUgY2hhcmFjdGVycyBhdAogICAgICAgICMgYSB0aW1lLiAgV2UgYXNzaWduIHRvIHBvcygpIHRvIHVwZGF0ZSB3aGVyZSB0byBwaWNrIHVwIGZvcgogICAgICAgICMgdGhlIG5leHQgbWF0Y2guCiAgICAgICAgd2hpbGUgKCAkc3RyaW5nID1+IHMvXEcoLns3NX0pKD89LikvJDEkY3JsZiAvICkgewogICAgICAgICAgICAkcG9zICs9IDc1ICsgbGVuZ3RoKCRjcmxmKTsKICAgICAgICAgICAgcG9zKCRzdHJpbmcpID0gJHBvczsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRzdHJpbmc7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsKCg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTsKdXNlIGJhc2UgcXcvQ2xhc3M6OkFjY2Vzc29yLzsKdXNlIERhdGE6OklDYWw6OlByb3BlcnR5Owp1c2UgU3lzOjpIb3N0bmFtZSBxdygpOyAgICAgICAgICMgRm9yIHVuaXF1ZSBVSURzIGZvciBlbnRyaWVzCnVzZSBDYXJwOwoKdXNlIGNvbnN0YW50IENSTEYgPT4gIlx4MGRceDBhIjsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeSAtIFJlcHJlc2VudHMgYW4gZW50cnkgaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2dG9kbyA9IERhdGE6OklDYWw6OkVudHJ5OjpUb2RvLT5uZXcoKTsKICAgICR2dG9kby0+YWRkX3Byb3BlcnR5KAogICAgIyAuLi4gc2VlIERhdGE6OklDYWw6OkVudHJ5OjpUb2RvIGRvY3VtZW50YXRpb24KICAgICk7CiAgICAkdnRvZG8tPmFkZF9wcm9wZXJ0aWVzKCAuLi4gKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdnRvZG8pOwoKICAgICRldmVudC0+YWRkX2VudHJ5KCRhbGFybSk7CiAgICAkZXZlbnQtPmFkZF9lbnRyaWVzKCRhbGFybTEsIC4uLik7CgogICAgIyBvciBhbGwgaW4gb25lIGdvCiAgICBteSAkdnRvZG8gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kby0+bmV3KCBcJXByb3BzLCBcQGVudHJpZXMgKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5PiBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBlbnRyeSBpbiBhbgppQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMKImNvbXBvbmVudHMiLikgIGlDYWxlbmRhciBkZWZpbmVzIHNldmVyYWwgdHlwZXMgb2YgZW50cmllcywgc3VjaCBhcwpldmVudHMgYW5kIHRvLWRvIGxpc3RzOyBlYWNoIG9mIHRoZXNlIGNvcnJlc3BvbmRzIHRvIGEgc3ViY2xhc3Mgb2YKTDxEYXRhOjpJQ2FsOjpFbnRyeT4gKHRob3VnaCBvbmx5IHRvLWRvIGxpc3RzIGFuZCBldmVudHMgYXJlIGN1cnJlbnRseQppbXBsZW1lbnRlZCkuICBMPERhdGE6OklDYWw6OkVudHJ5PiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBhYnN0cmFjdApiYXNlIGNsYXNzIC0tIGFsbCBvYmplY3RzIGNyZWF0ZWQgc2hvdWxkIGJlIG9mIGl0cyBzdWJjbGFzc2VzLiAgVGhlCmVudGlyZSBjYWxlbmRhciBpdHNlbGYgKHRoZSBMPERhdGE6OklDYWw+IG9iamVjdCkgaXMgYWxzbyByZXByZXNlbnRlZAphcyBhIEw8RGF0YTo6SUNhbDo6RW50cnk+IG9iamVjdC4KCkVhY2ggZW50cnkgaGFzIGFuIGVudHJ5IHR5cGUgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VkVWRU5UPiksIGEKc2VyaWVzIG9mICJwcm9wZXJ0aWVzIiwgYW5kIHBvc3NpYmx5IHNvbWUgc3ViLWVudHJpZXMuICAoT25seSB0aGUgcm9vdApMPERhdGE6OklDYWw+IG9iamVjdCBjYW4gaGF2ZSBzdWItZW50cmllcywgZXhjZXB0IGZvciBhbGFybSBlbnRyaWVzCmNvbnRhaW5lZCBpbiBldmVudHMgYW5kIHRvLWRvcyAobm90IHlldCBpbXBsZW1lbnRlZCkuKQoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgZW50cnkgb2JqZWN0IHdpdGggbm8gcHJvcGVydGllcyBvciBzdWItZW50cmllcy4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoKTsKICAgICMgQUxMT1cgcGFzc2luZyBhcmd1bWVudHMgaGVyZSEKICAgICRzZWxmLT5zZXQoIHByb3BlcnRpZXMgPT4ge30gKTsKICAgICRzZWxmLT5zZXQoIGVudHJpZXMgICAgPT4gW10gKTsKICAgIGZvciAoQF8pIHsKICAgICAgICByZWYgJF8gZXEgIkhBU0giICBhbmQgJHNlbGYtPmFkZF9wcm9wZXJ0aWVzKCAlJF8gKTsKICAgICAgICByZWYgJF8gZXEgIkFSUkFZIiBhbmQgJHNlbGYtPmFkZF9lbnRyaWVzKCBAJF8gKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGFzX3N0cmluZyBbIGNybGYgPT4gQzxDUkxGPiBdCgpSZXR1cm5zIHRoZSBlbnRyeSBhcyBhbiBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCBzdHJpbmcgKHdpdGggdHJhaWxpbmcKbmV3bGluZSkuCgpQcm9wZXJ0aWVzIGFyZSByZXR1cm5lZCBpbiBhbHBoYWJldGljYWwgb3JkZXIsIHdpdGggbXVsdGlwbGUKcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIHJldHVybmVkIGluIHRoZSBvcmRlciBhZGRlZC4gIChQcm9wZXJ0eQpvcmRlciBpcyB1bmltcG9ydGFudCBpbiBpQ2FsZW5kYXIsIGFuZCB0aGlzIG1ha2VzIHRlc3RpbmcgZWFzaWVyLikKCklmIGFueSBtYW5kYXRvcnkgcHJvcGVydHkgaXMgbWlzc2luZywgaXNzdWVzIGEgd2FybmluZy4KClRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3bGluZSBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgYnkgZ2l2aW5nCnRoZSBhIEM8Y3JsZj4gYXJndW1lbnQsIHdoaWNoIGRlZmF1bHRzIHRvIEM8XHgwZFx4MGE+LCBwZXIgUkZDIDI0NDUKc3BlYzsgdGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCnZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIGJlZm9yZSAwLjE2LgoKPWN1dAoKbXkgJHVpZCA9IDA7CnN1YiBhc19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIG15ICRvdXRwdXQgPSAkc2VsZi0+aGVhZGVyKCVhcmdzKTsKCiAgICBteSBAbWFuZGF0b3J5ID0gKAogICAgICAgICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICApOwoKICAgIGlmIChncmVwIHskXyBlcSAidWlkIn0gQG1hbmRhdG9yeSBhbmQgIWRlZmluZWQgJHNlbGYtPnByb3BlcnRpZXMtPnt1aWR9CiAgICAgICAgICAgIGFuZCAkc2VsZi0+YXV0b191aWQpIHsKICAgICAgIyBQZXIgdGhlIFJGQywgY3JlYXRlIGEgInBlcnNpc3RlbnQsIGdsb2JhbGx5IHVuaXF1ZSIgVUlEIGZvciB0aGlzCiAgICAgICMgZXZlbnQ7ICJwZXJzaXN0ZW50IiBpbiB0aGlzIGNvbnRleHQgZG9lcyBub3QgbWVhbiBjb25zaXN0ZW50CiAgICAgICMgYWNyb3NzIHRpbWUsIGJ1dCByYXRoZXIgInVuaXF1ZSBhY3Jvc3MgYWxsIHRpbWUiCiAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoCiAgICAgICAgICB1aWQgPT4gdGltZSgpIC4gJy0nIC4kJCAuICctJyAuICR1aWQrKyAuICdAJyAuIFN5czo6SG9zdG5hbWU6Omhvc3RuYW1lKCkKICAgICAgKTsKICAgIH0KCiAgICBmb3IgbXkgJG5hbWUgKCBAbWFuZGF0b3J5ICkgewogICAgICAgIGNhcnAgIk1hbmRhdG9yeSBwcm9wZXJ0eSBmb3IgIiAuICggcmVmICRzZWxmICkgLiAiIG1pc3Npbmc6ICRuYW1lIgogICAgICAgICAgICB1bmxlc3MgJHNlbGYtPnByb3BlcnRpZXMtPnskbmFtZX0KICAgICAgICAgICAgICAgIGFuZCBAeyAkc2VsZi0+cHJvcGVydGllcy0+eyRuYW1lfSB9OwogICAgfQoKICAgIG15IEBwcm9wZXJ0aWVzID0gc29ydCB7CiAgICAgICAgIyBSRkMyNDQ1IGltcGxpZXMgYW4gb3JkZXIgKHNlZSA0LjYgQ2FsZW5kYXIgQ29tcG9uZW50cykgYnV0IGRvZXMgbm90CiAgICAgICAgIyByZXF1aXJlIGl0LiAgSG93ZXZlciwgc29tZSBhcHBsaWNhdGlvbnMgYnJlYWsgaWYgVkVSU0lPTiBpcyBub3QgZmlyc3QKICAgICAgICAjIChzZWUgaHR0cDovL2ljYWx2YWxpZC5jbG91ZGFwcC5uZXQvRGVmYXVsdC5hc3B4IGFuZCBbcnQuY3Bhbi5vcmcgIyAjNjU0NDddKS4KICAgICAgICByZXR1cm4gLTEgaWYgJGEgZXEgJ3ZlcnNpb24nOwogICAgICAgIHJldHVybiAgMSBpZiAkYiBlcSAndmVyc2lvbic7CiAgICAgICAgcmV0dXJuICRhIGNtcCAkYjsKICAgIH0ga2V5cyAleyAkc2VsZi0+cHJvcGVydGllcyB9OwoKICAgIGZvciBteSAkbmFtZSAoQHByb3BlcnRpZXMpIHsKICAgICAgICAkb3V0cHV0IC49ICRfCiAgICAgICAgICAgIGZvciBtYXAgeyAkXy0+YXNfc3RyaW5nKCVhcmdzKSB9IEB7ICRzZWxmLT5wcm9wZXJ0aWVzLT57JG5hbWV9IH07CiAgICB9CgogICAgZm9yIG15ICRlbnRyeSAoIEB7ICRzZWxmLT5lbnRyaWVzIH0gKSB7CiAgICAgICAgJG91dHB1dCAuPSAkZW50cnktPmFzX3N0cmluZyglYXJncyk7CiAgICB9CiAgICAkb3V0cHV0IC49ICRzZWxmLT5mb290ZXIoJWFyZ3MpOwoKICAgIHJldHVybiAkb3V0cHV0Owp9Cgo9aGVhZDIgYWRkX2VudHJ5ICRlbnRyeQoKQWRkcyBhbiBlbnRyeSB0byB0aGlzIGVudHJ5LiAgKEFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQsIHRoaXMgc2hvdWxkCm9ubHkgYmUgY2FsbGVkIG9uIGVpdGhlciBhIHRvLWRvIG9yIGV2ZW50IGVudHJ5IHdpdGggYW4gYWxhcm0gZW50cnksCm9yIG9uIGEgY2FsZW5kYXIgZW50cnkgKEw8RGF0YTo6SUNhbD4pIHdpdGggYSB0by1kbywgZXZlbnQsIGpvdXJuYWwsCnRpbWV6b25lLCBvciBmcmVlL2J1c3kgZW50cnkuKQoKUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyeSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCihwZXJoYXBzIGJlY2F1c2UgeW91IHRyaWVkIHRvIGFkZCBhbiBlbnRyeSBvZiBhbiBpbnZhbGlkIHR5cGUsIGJ1dAp0aGlzIGNoZWNrIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldCkuCgo9Y3V0CgpzdWIgYWRkX2VudHJ5IHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGVudHJ5ID0gc2hpZnQ7CiAgICBwdXNoIEB7ICRzZWxmLT57ZW50cmllc30gfSwgJGVudHJ5OwoKICAgICRlbnRyeS0+dmNhbDEwKCAkc2VsZi0+dmNhbDEwICk7CiAgICAkZW50cnktPnJmY19zdHJpY3QoICRzZWxmLT5yZmNfc3RyaWN0ICk7CiAgICAkZW50cnktPmF1dG9fdWlkKCAkc2VsZi0+YXV0b191aWQgKTsKCiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfZW50cmllcyAkZW50cnkxLCBbJGVudHJ5MiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9lbnRyeT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBlbnRyaWVzLgoKPWN1dAoKc3ViIGFkZF9lbnRyaWVzIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgJHNlbGYtPmFkZF9lbnRyeSggJF8gKSBmb3IgQF87CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBlbnRyaWVzCgpSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBzdWJlbnRyaWVzIG9mIHRoaXMgZW50cnkuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfcm9fYWNjZXNzb3JzKCdlbnRyaWVzJyk7Cgo9aGVhZDIgcHJvcGVydGllcwoKUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaGFzaCBvZiBwcm9wZXJ0aWVzIG9mIHRoaXMgZW50cnkuICBUaGUga2V5cwphcmUgcHJvcGVydHkgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIGFycmF5IHJlZmVyZW5jZXMgY29udGFpbmluZwpMPERhdGE6OklDYWw6OlByb3BlcnR5PiBvYmplY3RzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX3JvX2FjY2Vzc29ycygncHJvcGVydGllcycpOwoKPWhlYWQyIHByb3BlcnR5CgpHaXZlbiBhIHByb3BlcnR5IG5hbWUgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YKTDxEYXRhOjpJQ2FsOjpQcm9wZXJ0eT4gb2JqZWN0cy4KCj1jdXQKCnN1YiBwcm9wZXJ0eSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHByb3AgPSBsYyBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+eydwcm9wZXJ0aWVzJ30tPnskcHJvcH07Cn0KCj1oZWFkMiBhZGRfcHJvcGVydHkgJHByb3BuYW1lID0+ICRwcm9wdmFsCgpDcmVhdGVzIGEgbmV3IEw8RGF0YTo6SUNhbDo6UHJvcGVydHk+IG9iamVjdCB3aXRoIG5hbWUgQzwkcHJvcG5hbWU+CmFuZCB2YWx1ZSBDPCRwcm9wdmFsPiBhbmQgYWRkcyBpdCB0byB0aGUgZXZlbnQuCgpJZiB0aGUgcHJvcGVydHkgaXMgbm90IGtub3duIHRvIGV4aXN0IGZvciB0aGF0IG9iamVjdCB0eXBlIGFuZCBkb2VzCm5vdCBiZWdpbiB3aXRoIEM8WC0+LCBpc3N1ZXMgYSB3YXJuaW5nLgoKSWYgdGhlIHByb3BlcnR5IGlzIGtub3duIHRvIGJlIHVuaXF1ZSwgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIHByb3BlcnR5LgoKVG8gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvcGVydHksIGxldCBDPCRwcm9wdmFsPiBiZSBhCnR3by1lbGVtZW50IGFycmF5IHJlZmVyZW5jZSB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgcHJvcGVydHkKdmFsdWUgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBhIGhhc2ggcmVmZXJlbmNlLiAgVGhlIGtleXMgb2YgdGhlCmhhc2ggYXJlIHBhcmFtZXRlciBuYW1lczsgdGhlIHZhbHVlcyBzaG91bGQgYmUgZWl0aGVyIHN0cmluZ3Mgb3IgYXJyYXkKcmVmZXJlbmNlcyBvZiBzdHJpbmdzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcGFyYW1ldGVyIHNob3VsZCBoYXZlCm9uZSBvciBtdWx0aXBsZSAodG8gYmUgY29tbWEtc2VwYXJhdGVkKSB2YWx1ZXMuCgpFeGFtcGxlcyBvZiBzZXR0aW5nIHBhcmFtZXRlcnM6CgogIyBBZGQgYSBwcm9wZXJ0eSB3aXRoIGEgcGFyYW1ldGVyIG9mIFZBTFVFIHNldCB0byAnREFURScKICRldmVudC0+YWRkX3Byb3BlcnR5KCByZGF0ZSA9PiBbICRkYXRlLCB7IFZBTFVFID0+ICdEQVRFJyB9IF0gKTsKCj1jdXQKCnN1YiBhZGRfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRwcm9wID0gbGMgc2hpZnQ7CiAgICBteSAkdmFsICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkcHJvcDsKCiAgICB1bmxlc3MgKCAkc2VsZi0+aXNfcHJvcGVydHkoJHByb3ApIG9yICRwcm9wID1+IC9eeC0vaSApIHsKICAgICAgICBjYXJwICJVbmtub3duIHByb3BlcnR5IGZvciAiIC4gKCByZWYgJHNlbGYgKSAuICI6ICRwcm9wIjsKICAgIH0KCiAgICBpZiAoICRzZWxmLT5pc191bmlxdWUoJHByb3ApICkgewoKICAgICAgICAjIEl0IHNob3VsZCBiZSB1bmlxdWUsIHNvIGNsZWFyIG91dCBhbnl0aGluZyB3ZSBtaWdodCBoYXZlIGZpcnN0CiAgICAgICAgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gPSBbXTsKICAgIH0KCiAgICAkdmFsID0gWyAkdmFsLCB7fSBdIHVubGVzcyByZWYgJHZhbCBlcSAnQVJSQVknOwoKICAgIG15ICggJHByb3BfdmFsdWUsICRwYXJhbV9oYXNoICkgPSBAJHZhbDsKCiAgICBteSAkcCA9IERhdGE6OklDYWw6OlByb3BlcnR5LT5uZXcoICRwcm9wID0+ICRwcm9wX3ZhbHVlLCAkcGFyYW1faGFzaCApOwogICAgJHAtPnZjYWwxMCggJHNlbGYtPnZjYWwxMCApOwoKICAgIHB1c2ggQHsgJHNlbGYtPnByb3BlcnRpZXMtPnskcHJvcH0gfSwgJHA7CiAgICByZXR1cm4gJHNlbGY7Cn0KCj1oZWFkMiBhZGRfcHJvcGVydGllcyAkcHJvcG5hbWUxID0+ICRwcm9wdmFsMSwgWyRwcm9wbmFtZTIgPT4gJHByb3BuYW1lMiwgLi4uXQoKQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBDPGFkZF9wcm9wZXJ0eT4gc2V2ZXJhbCB0aW1lcyB3aXRoIGEgbGlzdApvZiBwcm9wZXJ0aWVzLgoKVGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBjYWxsIGFkZCBDPGFkZF9wcm9wZXJ0eT4gb24gdGhlbSBpbiB0aGUKb3JkZXIgZ2l2ZW4sIHNvIHRoYXQgdW5pcXVlIHByb3BlcnRpZXMgZ2l2ZW4gbGF0ZXIgaW4gdGhlIGNhbGwgd2lsbAp0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBnaXZlbiBlYXJsaWVyLiAgKFRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZQpvcmRlciBvZiBwcm9wZXJ0aWVzIHdoZW4gdGhlIGVudHJ5IGlzIHJlbmRlcmVkIGFzIGEgc3RyaW5nLCB0aG91Z2guKQoKUGFyYW1ldGVycyBmb3IgdGhlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4KQzxhZGRfcHJvcGVydHk+LgoKPWN1dAoKc3ViIGFkZF9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBAXyAlIDIgKSB7CiAgICAgICAgY2FycCAiT2RkIG51bWJlciBvZiBlbGVtZW50cyBpbiBhZGRfcHJvcGVydGllcyBjYWxsIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKEBfKSB7CiAgICAgICAgbXkgJHByb3AgPSBzaGlmdDsKICAgICAgICBteSAkdmFsICA9IHNoaWZ0OwogICAgICAgICRzZWxmLT5hZGRfcHJvcGVydHkoICRwcm9wID0+ICR2YWwgKTsKICAgIH0KICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgKHdoaWNoIHJldHVybnMgYW4gZW1wdHkgbGlzdCBieQpkZWZhdWx0KSB0byBwcm92aWRlIGEgbGlzdCBvZiBsb3dlciBjYXNlIHN0cmluZ3MgaWRlbnRpZnlpbmcgdGhlCnByb3BlcnRpZXMgd2hpY2ggbXVzdCBhcHBlYXIgZXhhY3RseSBvbmNlIGluIHRoZSBzdWJjbGFzcydzIGVudHJ5CnR5cGUuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG11c3QgYXBwZWFyIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCAod2hpY2ggcmV0dXJucyBhbiBlbXB0eSBsaXN0IGJ5CmRlZmF1bHQpIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGxvd2VyIGNhc2Ugc3RyaW5ncyBpZGVudGlmeWluZyB0aGUKcHJvcGVydGllcyB3aGljaCBtdXN0IGFwcGVhciBhdCBtb3N0IG9uY2UgaW4gdGhlIHN1YmNsYXNzJ3MgZW50cnkKdHlwZS4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7ICgpIH0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kICh3aGljaCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgYnkKZGVmYXVsdCkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgbG93ZXIgY2FzZSBzdHJpbmdzIGlkZW50aWZ5aW5nIHRoZQpwcm9wZXJ0aWVzIHdoaWNoIG1heSBhcHBlYXIgemVybywgb25lLCBvciBtb3JlIHRpbWVzIGluIHRoZSBzdWJjbGFzcydzCmVudHJ5IHR5cGUuCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgKCkgfQoKPWhlYWQyIGlzX3Byb3BlcnR5ICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8KG1hbmRhdG9yeS9vcHRpb25hbClfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfcHJvcGVydHkgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMsCiAgICAgICAgJHNlbGYtPm9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpc19tYW5kYXRvcnkgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyBtYW5kYXRvcnkgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkCmluIEM8bWFuZGF0b3J5Xyh1bmlxdWUvcmVwZWF0YWJsZSlfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX21hbmRhdG9yeSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgIHJldHVybiBzY2FsYXIgZ3JlcCB7ICRfIGVxICRuYW1lIH0gJHNlbGYtPm1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+bWFuZGF0b3J5X3JlcGVhdGFibGVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX29wdGlvbmFsICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgb3B0aW9uYWwgKHRoYXQgaXMsIGlmIGl0J3MgbGlzdGVkIGluCkM8b3B0aW9uYWxfKHVuaXF1ZS9yZXBlYXRhYmxlKV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfb3B0aW9uYWwgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAkc2VsZi0+b3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzOwp9Cgo9aGVhZDIgaXNfdW5pcXVlICRuYW1lCgpSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9wZXJ0eQpDPCRuYW1lPiBpcyBrbm93biB0byB0aGUgY2xhc3MgYXMgdW5pcXVlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZCBpbgpDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3VuaXF1ZV9wcm9wZXJ0aWVzPikuCgo9Y3V0CgpzdWIgaXNfdW5pcXVlIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgcmV0dXJuIHNjYWxhciBncmVwIHsgJF8gZXEgJG5hbWUgfSAkc2VsZi0+bWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF91bmlxdWVfcHJvcGVydGllczsKfQoKPWhlYWQyIGlzX3JlcGVhdGFibGUgJG5hbWUKClJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHByb3BlcnR5CkM8JG5hbWU+IGlzIGtub3duIHRvIHRoZSBjbGFzcyBhcyByZXBlYXRhYmxlICh0aGF0IGlzLCBpZiBpdCdzIGxpc3RlZAppbiBDPChtYW5kYXRvcnkvb3B0aW9uYWwpX3JlcGVhdGFibGVfcHJvcGVydGllcz4pLgoKPWN1dAoKc3ViIGlzX3JlcGVhdGFibGUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRuYW1lID0gc2hpZnQ7CiAgICByZXR1cm4gc2NhbGFyIGdyZXAgeyAkXyBlcSAkbmFtZSB9ICRzZWxmLT5tYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzLAogICAgICAgICRzZWxmLT5vcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXM7Cn0KCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGlkZW50aWZ5aW5nIHR5cGUKbmFtZSBvZiB0aGUgZW50cnkgKHN1Y2ggYXMgQzxWQ0FMRU5EQVI+IG9yIEM8VlRPRE8+KS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydVTkRFRklORUQnfQoKPWhlYWQyIHZjYWwxMCBbJGJvb2xdCgpHZXRzIG9yIHNldHMgYSBib29sZWFuIHNheWluZyB3aGV0aGVyIHRoaXMgZW50cnkgc2hvdWxkIGJlIGludGVycHJldGVkCmFzIHZDYWxlbmRhciAxLjAgKGFzIG9wcG9zZWQgdG8gaUNhbGVuZGFyIDIuMCkuICBHZW5lcmFsbHksIHlvdSBjYW4KanVzdCBzZXQgdGhpcyBvbiB5b3VyIG1haW4gTDxEYXRhOjpJQ2FsPiBvYmplY3Qgd2hlbiB5b3UgY29uc3RydWN0IGl0OwpDPGFkZF9lbnRyeT4gYXV0b21hdGljYWxseSBtYWtlcyBzdXJlIHRoYXQgc3ViLWVudHJpZXMgZW5kIHVwIHdpdGggdGhlCnNhbWUgdmFsdWUgYXMgdGhlaXIgcGFyZW50cy4KCj1jdXQKCl9fUEFDS0FHRV9fLT5ta19hY2Nlc3NvcnMoJ3ZjYWwxMCcpOwoKPWhlYWQyIHJmY19zdHJpY3QgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHdpbGwgY29tcGxhaW4gYWJvdXQKbWlzc2luZyBVSURzIGFzIHBlciBSRkMyNDQ2LiBEZWZhdWx0cyB0byBmYWxzZSwgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5LiAgR2VuZXJhbGx5LCB5b3UgY2FuIGp1c3Qgc2V0IHRoaXMgb24geW91ciBtYWluCkw8RGF0YTo6SUNhbD4gb2JqZWN0IHdoZW4geW91IGNvbnN0cnVjdCBpdDsgQzxhZGRfZW50cnk+IGF1dG9tYXRpY2FsbHkKbWFrZXMgc3VyZSB0aGF0IHN1Yi1lbnRyaWVzIGVuZCB1cCB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZWlyIHBhcmVudHMuCgo9Y3V0CgpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKCdyZmNfc3RyaWN0Jyk7Cgo9aGVhZDIgYXV0b191aWQgWyRib29sXQoKR2V0cyBvciBzZXRzIGEgYm9vbGVhbiBzYXlpbmcgd2hldGhlciB0aGlzIGVudHJ5IHNob3VsZCBhdXRvbWF0aWNhbGx5CmdlbmVyYXRlIGl0cyBvd24gcGVyc2lzdGVudGx5IHVuaXF1ZSBVSURzLiAgRGVmYXVsdHMgdG8gZmFsc2UuCkdlbmVyYWxseSwgeW91IGNhbiBqdXN0IHNldCB0aGlzIG9uIHlvdXIgbWFpbiBMPERhdGE6OklDYWw+IG9iamVjdCB3aGVuCnlvdSBjb25zdHJ1Y3QgaXQ7IEM8YWRkX2VudHJ5PiBhdXRvbWF0aWNhbGx5IG1ha2VzIHN1cmUgdGhhdCBzdWItZW50cmllcwplbmQgdXAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGVpciBwYXJlbnRzLgoKPWN1dAoKX19QQUNLQUdFX18tPm1rX2FjY2Vzc29ycygnYXV0b191aWQnKTsKCj1oZWFkMiBoZWFkZXIKClJldHVybnMgdGhlIGhlYWRlciBsaW5lIGZvciB0aGUgZW50cnkgKGluY2x1ZGluZyB0cmFpbGluZyBuZXdsaW5lKS4KCj1jdXQKCnN1YiBoZWFkZXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICVhcmdzID0gKAogICAgICAgIGNybGYgPT4gQ1JMRiwKICAgICAgICBAXwogICAgKTsKICAgIHJldHVybiAnQkVHSU46JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKPWhlYWQyIGZvb3RlcgoKUmV0dXJucyB0aGUgZm9vdGVyIGxpbmUgZm9yIHRoZSBlbnRyeSAoaW5jbHVkaW5nIHRyYWlsaW5nIG5ld2xpbmUpLgoKPWN1dAoKc3ViIGZvb3RlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJWFyZ3MgPSAoCiAgICAgICAgY3JsZiA9PiBDUkxGLAogICAgICAgIEBfCiAgICApOwogICAgcmV0dXJuICdFTkQ6JyAuICRzZWxmLT5pY2FsX2VudHJ5X3R5cGUgLiAkYXJnc3tjcmxmfTsKfQoKIyBtYXBwaW5nIG9mIGV2ZW50IHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQgbmFtZXNwYWNlKQpteSAlX2dlbmVyaWMgPSAoCiAgICB2ZXZlbnQgICAgPT4gJ0V2ZW50JywKICAgIHZ0b2RvICAgICA9PiAnVG9kbycsCiAgICB2am91cm5hbCAgPT4gJ0pvdXJuYWwnLAogICAgdmZyZWVidXN5ID0+ICdGcmVlQnVzeScsCiAgICB2dGltZXpvbmUgPT4gJ1RpbWVab25lJywKICAgIHN0YW5kYXJkICA9PiAnVGltZVpvbmU6OlN0YW5kYXJkJywKICAgIGRheWxpZ2h0ICA9PiAnVGltZVpvbmU6OkRheWxpZ2h0JywKKTsKCj1oZWFkMiBwYXJzZV9vYmplY3QKClRyYW5zbGF0ZSBhIEw8VGV4dDo6dkZpbGU6OmFzRGF0YT4gc3ViIG9iamVjdCBpbnRvIHRoZSBhcHByb3ByaWF0ZQpMPERhdGE6OmlDYWw6OkV2ZW50PiBzdWJ0eXBlLgoKPWN1dAoKIyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSByZWN1cnNpdmUgd2hpY2ggY291bGQgYmxvdyB0aGUgc3RhY2sgLQojICAgICAgIGl0IG1pZ2h0IGJlIHdvcnRoIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgc2VxdWVudGlhbApzdWIgcGFyc2Vfb2JqZWN0IHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICR0eXBlID0gJG9iamVjdC0+e3R5cGV9OwoKICAgIG15ICRuZXdfc2VsZjsKCiAgICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGdlbmVyaWMgbG9uZyBuYW1lIGp1c3QgaW4gY2FzZSB0aGVyZQogICAgIyBldmVudCB0dXJucyBvdXQgdG8gYmUgYSBWR0VORVJJQyBlbnRyeSB0eXBlCiAgICBpZiAoIG15ICRjbGFzcyA9ICRfZ2VuZXJpY3sgbGMoJHR5cGUpIH0gKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPl9wYXJzZV9kYXRhX2ljYWxfZ2VuZXJpYyggJGNsYXNzLCAkb2JqZWN0ICk7CgogICAgICAgICMgdGhlbiBsb29rIGZvciBzcGVjaWZpYyBvdmVycmlkZXMKICAgIH0gZWxzaWYgKCBteSAkc3ViID0gJHNlbGYtPmNhbiggJ19wYXJzZV8nIC4gbGMoJHR5cGUpICkgKSB7CiAgICAgICAgJG5ld19zZWxmID0gJHNlbGYtPiRzdWIoJG9iamVjdCk7CgogICAgICAgICMgY29tcGxhaW4KICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiQ2FuJ3QgcGFyc2UgdHlwZSAkdHlwZSB5ZXQiOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlY3Vyc2UgdGhyb3VnaCBzdWItb2JqZWN0cwogICAgZm9yZWFjaCBteSAkc3ViX29iamVjdCAoIEB7ICRvYmplY3QtPntvYmplY3RzfSB9ICkgewogICAgICAgICRuZXdfc2VsZi0+cGFyc2Vfb2JqZWN0KCRzdWJfb2JqZWN0KTsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIG91cnNlbHZlcyBhcyB0aGUgcGFyZW50CnN1YiBfcGFyc2VfdmNhbGVuZGFyIHsKICAgIG15ICggJHNlbGYsICRvYmplY3QgKSA9IEBfOwogICAgJHNlbGYtPl9wYXJzZV9nZW5lcmljX2V2ZW50KCAkc2VsZiwgJG9iamVjdCApOwogICAgcmV0dXJuICRzZWxmOwp9CgojIG1hcHBpbmcgb2YgYWN0aW9uIHR5cGVzIHRvIGNsYXNzICh1bmRlciB0aGUgRGF0YTo6SWNhbDo6RXZlbnQ6OkFsYXJtIG5hbWVzcGFjZSkKbXkgJV9hY3Rpb25fbWFwID0gKAogICAgQVVESU8gICAgID0+ICdBdWRpbycsCiAgICBESVNQTEFZICAgPT4gJ0Rpc3BsYXknLAogICAgRU1BSUwgICAgID0+ICdFbWFpbCcsCiAgICBQUk9DRURVUkUgPT4gJ1Byb2NlZHVyZScsCiAgICBOT05FICAgICAgPT4gJ05vbmUnLAogICAgVVJJICAgICAgID0+ICdVUkknLAopOwoKIyBhbGFybXMgaGF2ZSBhY3Rpb25zCnN1YiBfcGFyc2VfdmFsYXJtIHsKICAgIG15ICggJHBhcmVudCwgJG9iamVjdCApID0gQF87CgogICAgIyBpY2sKICAgIG15ICRhY3Rpb24gPSAkb2JqZWN0LT57cHJvcGVydGllc30tPntBQ1RJT059LT5bMF0tPnt2YWx1ZX07CiAgICBkaWUgIkNhbid0IHBhcnNlIFZBTEFSTSB3aXRoIGFjdGlvbiAkYWN0aW9uIgogICAgICAgIHVubGVzcyBleGlzdHMgJF9hY3Rpb25fbWFweyRhY3Rpb259OwoKICAgICRhY3Rpb24gPSAkX2FjdGlvbl9tYXB7JGFjdGlvbn07CiAgICBteSAkYWxhcm1fY2xhc3MgPSAiRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjokYWN0aW9uIjsKICAgIGV2YWwgInJlcXVpcmUgJGFsYXJtX2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGFsYXJtX2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRhbGFybV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGFsYXJtID0gJGFsYXJtX2NsYXNzLT5uZXc7CiAgICAkcGFyZW50LT5fcGFyc2VfZ2VuZXJpY19ldmVudCggJGFsYXJtLCAkb2JqZWN0ICk7CiAgICAkcGFyZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKICAgIHJldHVybiAkYWxhcm07Cn0KCiMgZ2VuZXJpYyBldmVudCBoYW5kbGVyCnN1YiBfcGFyc2VfZGF0YV9pY2FsX2dlbmVyaWMgewogICAgbXkgKCAkcGFyZW50LCAkY2xhc3MsICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRlbnRyeV9jbGFzcyA9ICJEYXRhOjpJQ2FsOjpFbnRyeTo6JGNsYXNzIjsKICAgIGV2YWwgInJlcXVpcmUgJGVudHJ5X2NsYXNzIjsKICAgIGRpZSAiRmFpbGVkIHRvIHJlcXVpcmUgJGVudHJ5X2NsYXNzIDogJEAiIGlmICRAOwoKICAgICRlbnRyeV9jbGFzcy0+aW1wb3J0OwogICAgbXkgJGVudHJ5ID0gJGVudHJ5X2NsYXNzLT5uZXc7CiAgICAkZW50cnktPnZjYWwxMCgkcGFyZW50LT52Y2FsMTApOwogICAgJHBhcmVudC0+X3BhcnNlX2dlbmVyaWNfZXZlbnQoICRlbnRyeSwgJG9iamVjdCApOwogICAgJHBhcmVudC0+YWRkX2VudHJ5KCRlbnRyeSk7CiAgICByZXR1cm4gJGVudHJ5Owp9CgojIGhhbmRsZSB0cmFuc2ZlcnJpbmcgb2YgcHJvcGVydGllcwpzdWIgX3BhcnNlX2dlbmVyaWNfZXZlbnQgewogICAgbXkgKCAkcGFyZW50LCAkZW50cnksICRvYmplY3QgKSA9IEBfOwoKICAgIG15ICRwID0gJG9iamVjdC0+e3Byb3BlcnRpZXN9OwogICAgZm9yIG15ICRrZXkgKCBzb3J0IGtleXMgJSRwICkgewogICAgICAgIGZvcmVhY2ggbXkgJG9jY3VyZW5jZSAoQHsgJHAtPnska2V5fSB9KSB7CiAgICAgICAgICAgIG15ICRwcm9wOwoKICAgICAgICAgICAgIyBVbmVzY2FwZXMsIGJ1dCBvbmx5IGluIHYyLCBhbmQgbm90IGlmIGl0J3MgZXhwbGljaXRseSBub3QgVEVYVAogICAgICAgICAgICBpZiAobm90ICRwYXJlbnQtPnZjYWwxMAogICAgICAgICAgICAgICAgYW5kICggIG5vdCAkb2NjdXJlbmNlLT57cGFyYW19CiAgICAgICAgICAgICAgICAgICAgb3Igbm90IGRlZmluZWQgJG9jY3VyZW5jZS0+e3BhcmFtfXtWQUxVRX0KICAgICAgICAgICAgICAgICAgICBvciAkb2NjdXJlbmNlLT57cGFyYW19e1ZBTFVFfSBlcSAiVEVYVCIgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkb2NjdXJlbmNlLT57dmFsdWV9ID1+IHMvXFwoWzssXFxdKS8kMS9nOwogICAgICAgICAgICAgICAgJG9jY3VyZW5jZS0+e3ZhbHVlfSA9fiBzL1xcbi9cbi9pZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoYW5kbGUgb3B0aW9uYWwgcGFyYW1zIGFuZCAnbm9ybWFsJyBrZXkvdmFsdWUgcGFpcnMKICAgICAgICAgICAgIyBUT0RPOiBsaW5lIHdyYXBwaW5nPwogICAgICAgICAgICBpZiAoICRvY2N1cmVuY2UtPntwYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkcHJvcCA9IFsgJG9jY3VyZW5jZS0+e3ZhbHVlfSwgJG9jY3VyZW5jZS0+e3BhcmFtfSBdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHByb3AgPSAkb2NjdXJlbmNlLT57dmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRlbnRyeS0+YWRkX3Byb3BlcnR5KCBsYygka2V5KSA9PiAkcHJvcCApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkZW50cnk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5IC0gUmVwcmVzZW50cyBibG9ja3Mgb2YgZnJlZSBhbmQgYnVzeSB0aW1lIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmZyZWVidXN5ID0gRGF0YTo6SUNhbDo6RW50cnk6OkZyZWVCdXN5LT5uZXcoKTsKICAgICR2ZnJlZWJ1c3ktPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIG9yZ2FuaXplciA9PiAnTUFJTFRPOmpzbWl0aEBob3N0LmNvbScsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZnJlZWJ1c3kgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsIC4gJy8nIC4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZmcmVlYnVzeSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6RnJlZUJ1c3k+IG9iamVjdCByZXByZXNlbnRzIGEgcmVxdWVzdCBmb3IKaW5mb3JtYXRpb24gYWJvdXQgZnJlZSBhbmQgYnVzeSB0aW1lIG9yIGEgcmVwb25zZSB0byBzdWNoIGEgcmVxdWVzdCwKaW4gYW4gaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzCmFzICJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZAphY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkZSRUVCVVNZPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZGUkVFQlVTWSd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBmcmVlL2J1c3kgZW50cnk6CgogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdWlkICB1cmwKCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgQHJldCA9IHF3KAogICAgICAgIGNvbnRhY3QgIGR0c3RhcnQgIGR0ZW5kICBkdXJhdGlvbiAgZHRzdGFtcAogICAgICAgIG9yZ2FuaXplciAgdXJsCiAgICApOwogICAgcHVzaCBAcmV0LCAidWlkIiB1bmxlc3MgJHNlbGYtPnJmY19zdHJpY3Q7CiAgICByZXR1cm4gQHJldDsKfQoKPWhlYWQyIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGZyZWUvYnVzeSBlbnRyeToKCiAgICAgICAgYXR0ZW5kZWUgY29tbWVudCBmcmVlYnVzeSByZXF1ZXN0LXN0YXR1cwoKPWN1dAoKc3ViIG9wdGlvbmFsX3JlcGVhdGFibGVfcHJvcGVydGllcyB7CiAgICBxdygKICAgICAgICBhdHRlbmRlZSBjb21tZW50IGZyZWVidXN5IHJlcXVlc3Qtc3RhdHVzCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lIC0gUmVwcmVzZW50cyBhIHRpbWUgem9uZSBkZWZpbml0aW9uIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdnRpbWV6b25lID0gRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lLT5uZXcoKTsKICAgICR2dGltZXpvbmUtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHR6aWQgPT4gIlVTLUVhc3Rlcm4iLAogICAgICAgIHR6dXJsID0+ICJodHRwOi8vem9uZXMuc3Rkc19yX3VzLm5ldC90ei9VUy1FYXN0ZXJuIgogICAgKTsKCiAgICAkdnRpbWV6b25lLT5hZGRfZW50cnkoJGRheWxpZ2h0KTsgIyBkYXlsaWdodC8gc3RhbmRhcmQgbm90IHlldCBpbXBsZW1lbnRlZAogICAgJHZ0aW1lem9uZS0+YWRkX2VudHJ5KCRzdGFuZGFyZCk7ICMgOi0oCgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0aW1lem9uZSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU+IG9iamVjdCByZXByZXNlbnRzIHRoZSBkZWNsYXJhdGlvbiBvZgphIHRpbWUgem9uZSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzCnRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBtb2R1bGUgaXMgbm90IHlldCB1c2VmdWwsIGJlY2F1c2UgZXZlcnkgdGltZSB6b25lIGRlY2xhcmF0aW9uCm5lZWRzIHRvIGNvbnRhaW4gYXQgbGVhc3Qgb25lIEM8U1RBTkRBUkQ+IG9yIEM8REFZTElHSFQ+IGNvbXBvbmVudCwKYW5kIHRoZXNlIGhhdmUgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWVElNRVpPTkU+LCBpdHMgaUNhbGVuZGFyIGVudHJ5IG5hbWUuCgo9Y3V0CgpzdWIgaWNhbF9lbnRyeV90eXBlIHsnVlRJTUVaT05FJ30KCj1oZWFkMiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBtYXkgYmUKc3BlY2lmaWVkIGF0IG1vc3Qgb25lIHRpbWUgZm9yIGEgdGltZSB6b25lIGRlY2xhcmF0aW9uOgoKICAgICAgICBsYXN0LW1vZGlmaWVkIHR6dXJsCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgbGFzdC1tb2RpZmllZCB0enVybAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHR6aWQ+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSB0aW1lIHpvbmUgZGVjbGFyYXRpb24uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIHR6aWQKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQ7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkV2ZW50IC0gUmVwcmVzZW50cyBhbiBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZldmVudCA9IERhdGE6OklDYWw6OkVudHJ5OjpFdmVudC0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ID0+ICJteSBwYXJ0eSIsCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIkknbGwgY3J5IGlmIEkgd2FudCB0byIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgZHRzdGFydCAgID0+IERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gdGltZSApLT5pY2FsLAogICAgKTsKCiAgICAkY2FsZW5kYXItPmFkZF9lbnRyeSgkdmV2ZW50KTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJGFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpFdmVudD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgZXZlbnQgaW4gYW4KaUNhbGVuZGFyIGZpbGUuICAoTm90ZSB0aGF0IHRoZSBpQ2FsZW5kYXIgUkZDIHJlZmVycyB0byBlbnRyaWVzIGFzCiJjb21wb25lbnRzIi4pICBJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzCmFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgaWNhbF9lbnRyeV90eXBlCgpSZXR1cm5zIEM8VkVWRU5UPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZFVkVOVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZ2VvCiAgICAgICAgbGFzdC1tb2RpZmllZCAgbG9jYXRpb24gIG9yZ2FuaXplciAgcHJpb3JpdHkKICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICB1aWQgIHVybCAgcmVjdXJyZW5jZS1pZAoKSW4gYWRkaXRpb24sIEM8ZHRlbmQ+IGFuZCBDPGR1cmF0aW9uPiBtYXkgYmUgc3BlY2lmaWVkIGF0IG1vc3Qgb25jZQplYWNoLCBidXQgbm90IGJvdGggaW4gdGhlIHNhbWUgZW50cnkgKHRob3VnaCB0aGlzIHJlc3RyaWN0aW9uIGlzIG5vdAplbmZvcmNlZCkuCgpPciBpZiBDPDwgdmNhbDEwID0+IDEgPj46CgogICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY3JlYXRlZCAgZGVzY3JpcHRpb24gIGR0c3RhcnQgIGdlbwogICAgICAgICAgICBsYXN0LW1vZGlmaWVkICBsb2NhdGlvbiAgb3JnYW5pemVyICBwcmlvcml0eQogICAgICAgICAgICBkdHN0YW1wICBzZXF1ZW5jZSAgc3RhdHVzICBzdW1tYXJ5ICB0cmFuc3AKICAgICAgICAgICAgdXJsICByZWN1cnJlbmNlLWlkCgogICAgICAgICAgICBkdGVuZCBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR0ZW5kCiAgICAgICAgICAgIGxhc3QtbW9kaWZpZWQgbG9jYXRpb24gcm51bSBwcmlvcml0eQogICAgICAgICAgICBzZXF1ZW5jZSBzdGF0dXMgc3VtbWFyeSB0cmFuc3AKICAgICAgICAgICAgdXJsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYW4gZXZlbnQ6CgogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICByZXNvdXJjZXMgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudAogICAgICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8KICAgICAgICAgICAgcmVzb3VyY2VzICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIFNFRSBBTFNPCgo9b3ZlciA0Cgo9aXRlbSBMPERhdGE6OklDYWw6OkRhdGVUaW1lPgoKRm9yIGRhdGUgcGFyc2luZyBhbmQgZm9ybWF0dGluZywgaW5jbHVkaW5nIGRlbm90aW5nICJhbGwgZGF5IiBldmVudHMsCmNvbnNpZGVyaW5nIHVzaW5nIHRoaXMgbW9kdWxlLiBCZWNhdXNlIGl0J3MgYSAibWl4IGluIiwgeW91IGNhbiBzdGlsbAp1c2UgYWxsIHRoZSBtZXRob2RzIGhlcmUgYXMgd2VsbCBhcyB0aGUgbmV3IGRhdGUgaGFuZGxpbmcgbWV0aG9kcyBpdApkZWZpbmVzLgoKPWJhY2sKCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbDsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbCAtIFJlcHJlc2VudHMgYSBqb3VybmFsIGVudHJ5IGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmpvdXJuYWwgPSBEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbC0+bmV3KCk7CiAgICAkdmpvdXJuYWwtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgIHN1bW1hcnkgPT4gIk1pbnV0ZXMgb2YgbXkgcGFydHkiLAogICAgICAgIGRlc2NyaXB0aW9uID0+ICJJIGNyaWVkIGJlY2F1c2UgSSB3YW50ZWQgdG8uIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICBkdHN0YXJ0ICAgPT4gRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiB0aW1lICktPmljYWwsCiAgICApOwoKICAgICRjYWxlbmRhci0+YWRkX2VudHJ5KCR2am91cm5hbCk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6Sm91cm5hbD4gb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgam91cm5hbAplbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlIHRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvCmVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEgc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeT4KYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxWSk9VUk5BTD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWSk9VUk5BTCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpUaGUgQzx1aWQ+IHByb3BlcnR5IGlzIG1hbmRhdG9yeSBpZiBDPHJmY19zdHJpY3Q+IHdhcyBwYXNzZWQgdG8KTDxEYXRhOjpJQ2FsL25ldz4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnJmY19zdHJpY3QgPyAoInVpZCIpIDogKCkKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYXQgbW9zdCBvbmUgdGltZSBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgIGNsYXNzICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFydCAgZHRzdGFtcAogICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICBzdW1tYXJ5ICB1aWQgIHVybAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gcXcoCiAgICAgICAgY2xhc3MgIGNyZWF0ZWQgIGRlc2NyaXB0aW9uICBkdHN0YXJ0ICBkdHN0YW1wCiAgICAgICAgbGFzdC1tb2RpZmllZCAgb3JnYW5pemVyICByZWN1cnJlbmNlLWlkICBzZXF1ZW5jZSAgc3RhdHVzCiAgICAgICAgc3VtbWFyeSB1cmwKICAgICk7CiAgICBwdXNoIEByZXQsICJ1aWQiIHVubGVzcyAkc2VsZi0+cmZjX3N0cmljdDsKICAgIHJldHVybiBAcmV0Owp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBqb3VybmFsIGVudHJ5OgoKICAgICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50CiAgICAgICAgY29udGFjdCAgZXhkYXRlICBleHJ1bGUgIHJlbGF0ZWQtdG8gIHJkYXRlCiAgICAgICAgcnJ1bGUgIHJlcXVlc3Qtc3RhdHVzCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMgIGNvbW1lbnQKICAgICAgICBjb250YWN0ICBleGRhdGUgIGV4cnVsZSAgcmVsYXRlZC10byAgcmRhdGUKICAgICAgICBycnVsZSAgcmVxdWVzdC1zdGF0dXMKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbzsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5LzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6VG9kbyAtIFJlcHJlc2VudHMgYSB0by1kbyBlbnRyeSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZ0b2RvID0gRGF0YTo6SUNhbDo6RW50cnk6OlRvZG8tPm5ldygpOwogICAgJHZ0b2RvLT5hZGRfcHJvcGVydGllcygKICAgICAgICBzdW1tYXJ5ICAgPT4gImdvIHRvIHNsZWVwIiwKICAgICAgICBzdGF0dXMgICAgPT4gJ0lOQ09NUExFVEUnLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIGR0c3RhcnQgICA9PiBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKS0+aWNhbCwKICAgICk7CgogICAgJGNhbGVuZGFyLT5hZGRfZW50cnkoJHZ0b2RvKTsKCiAgICAkdnRvZG8tPmFkZF9lbnRyeSgkYWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OlRvZG8+IG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIHRvLWRvIGVudHJ5IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5PiBhbmQgYWNjZXB0cwphbGwgb2YgaXRzIG1ldGhvZHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZUT0RPPiwgaXRzIGlDYWxlbmRhciBlbnRyeSBuYW1lLgoKPWN1dAoKc3ViIGljYWxfZW50cnlfdHlwZSB7J1ZUT0RPJ30KCj1oZWFkMiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMKClRoZSBDPHVpZD4gcHJvcGVydHkgaXMgbWFuZGF0b3J5IGlmIEM8cmZjX3N0cmljdD4gd2FzIHBhc3NlZCB0bwpMPERhdGE6OklDYWwvbmV3Pi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAkc2VsZi0+cmZjX3N0cmljdCA/ICgidWlkIikgOiAoKQp9Cgo9aGVhZDIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCkluIGFkZGl0aW9uLCBDPGR1ZT4gYW5kIEM8ZHVyYXRpb24+IG1heSBiZSBzcGVjaWZpZWQgYXQgbW9zdCBvbmNlCmVhY2gsIGJ1dCBub3QgYm90aCBpbiB0aGUgc2FtZSBlbnRyeSAodGhvdWdoIHRoaXMgcmVzdHJpY3Rpb24gaXMgbm90CmVuZm9yY2VkKS4KCk9yIGlmIEM8PCB2Y2FsMTAgPT4gMSA+PjoKCiAgICAgICAgY2xhc3MgZGNyZWF0ZWQgY29tcGxldGVkIGRlc2NyaXB0aW9uIGR0c3RhcnQgZHVlCiAgICAgICAgbGFzdC1tb2RpZmllZCBsb2NhdGlvbiBybnVtIHByaW9yaXR5CiAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgdXJsIHVpZAoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSBAcmV0ID0gJHNlbGYtPnJmY19zdHJpY3QgPyAoKSA6ICgidWlkIik7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBwdXNoIEByZXQsIHF3KAogICAgICAgICAgICBjbGFzcyAgY29tcGxldGVkICBjcmVhdGVkICBkZXNjcmlwdGlvbiAgZHRzdGFtcAogICAgICAgICAgICBkdHN0YXJ0ICBnZW8gIGxhc3QtbW9kaWZpZWQgIGxvY2F0aW9uICBvcmdhbml6ZXIKICAgICAgICAgICAgcGVyY2VudC1jb21wbGV0ZSAgcHJpb3JpdHkgIHJlY3VycmVuY2UtaWQgIHNlcXVlbmNlICBzdGF0dXMKICAgICAgICAgICAgc3VtbWFyeSAgdWlkICB1cmwKCiAgICAgICAgICAgIGR1ZSBkdXJhdGlvbgogICAgICAgICk7CiAgICB9IGVsc2UgewogICAgICAgIHB1c2ggQHJldCwgcXcoCiAgICAgICAgICAgIGNsYXNzIGRjcmVhdGVkIGNvbXBsZXRlZCBkZXNjcmlwdGlvbiBkdHN0YXJ0IGR1ZQogICAgICAgICAgICBsYXN0LW1vZGlmaWVkIGxvY2F0aW9uIHJudW0gcHJpb3JpdHkKICAgICAgICAgICAgc2VxdWVuY2Ugc3RhdHVzIHN1bW1hcnkgdHJhbnNwCiAgICAgICAgICAgIHVybCB1aWQKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEByZXQ7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHRvLWRvIGl0ZW06CgogICAgICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzICBjb21tZW50ICBjb250YWN0CiAgICAgIGV4ZGF0ZSAgZXhydWxlICByZXF1ZXN0LXN0YXR1cyAgcmVsYXRlZC10byAgcmVzb3VyY2VzCiAgICAgIHJkYXRlICBycnVsZQoKT3IgaWYgQzw8IHZjYWwxMCA9PiAxID4+OgoKICAgICAgICBhYWxhcm0gIGF0dGFjaCAgYXR0ZW5kZWUgIGNhdGVnb3JpZXMKICAgICAgICBkYWxhcm0gIGV4ZGF0ZSAgZXhydWxlICBtYWxhcm0gIHBhbGFybSAgcmVsYXRlZC10bwogICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAobm90ICRzZWxmLT52Y2FsMTApIHsKICAgICAgICBxdygKICAgICAgICAgICAgYXR0YWNoICBhdHRlbmRlZSAgY2F0ZWdvcmllcyAgY29tbWVudCAgY29udGFjdAogICAgICAgICAgICBleGRhdGUgIGV4cnVsZSAgcmVxdWVzdC1zdGF0dXMgIHJlbGF0ZWQtdG8gIHJlc291cmNlcwogICAgICAgICAgICByZGF0ZSAgcnJ1bGUKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICBxdygKICAgICAgICAgICAgYWFsYXJtICBhdHRhY2ggIGF0dGVuZGVlICBjYXRlZ29yaWVzCiAgICAgICAgICAgIGRhbGFybSAgZXhkYXRlICBleHJ1bGUgIG1hbGFybSAgcGFsYXJtICByZWxhdGVkLXRvCiAgICAgICAgICAgIHJlc291cmNlcyAgcmRhdGUgIHJydWxlCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm07Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxhcm1zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgb3RoZXIgdHlwZQpvZiBzdXBwb3J0ZWQgYnkgYWxhcm1zOgoKPW92ZXIKCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpbz4KCj1pdGVtIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsPgoKPWl0ZW0gTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4KCj1iYWNrCgpJdCBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KCj1oZWFkMSBNRVRIT0RTCgo9Y3V0Cgo9aGVhZDIgbmV3CgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICBkaWUgIkNhbid0IGluc3RhbnRpYXRlIGFic3RyYWN0IGJhc2UgY2xhc3MgRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtIgogICAgICAgIGlmICRjbGFzcyBlcSBfX1BBQ0tBR0VfXzsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIGljYWxfZW50cnlfdHlwZQoKUmV0dXJucyBDPFZBTEFSTT4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydWQUxBUk0nfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8ZHVyYXRpb24+IGFuZCBDPHJldHJlYXQ+CnByb3BlcnRpZXMgbWF5IGJlIHNwZWNpZmllZCBhdCBtb3N0IG9uZSB0aW1lIGFsbCB0eXBlcyBvZiBhbGFybXM7IGlmIG9uZQppcyBzcGVjaWZpZWQsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBhbHNvLCB0aG91Z2ggdGhpcyBtb2R1bGUgZG9lcyBub3QKZW5mb3JjZSB0aGF0IHJlc3RyaWN0aW9uLgoKPWN1dAoKc3ViIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR1cmF0aW9uIHJlcGVhdAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKQWNjb3JkaW5nIHRvIHRoZSBpQ2FsZW5kYXIgc3RhbmRhcmQsIHRoZSBDPHRyaWdnZXI+IHByb3BlcnR5IG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25jZSBmb3IgYW4gYWxsIHR5cGVzIG9mIGFsYXJtczsgc3ViY2xhc3NlcyBtYXkgaGF2ZQphZGRpdGlvbmFsIHJlcXVpcmVkIHByb3BlcnRpZXMuCgpJbiBhZGRpdGlvbiwgdGhlIEM8YWN0aW9uPiBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UsIGJ1dAphbGwgc3ViY2xhc3NlcyBhdXRvbWF0aWNhbGx5IHNldCBzYWlkIHByb3BlcnR5IGFwcHJvcHJpYXRlbHkuCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGFjdGlvbiB0cmlnZ2VyCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OlN0YW5kYXJkOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6U3RhbmRhcmQgLSBSZXByZXNlbnRzIGEgU3RhbmRhcmQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxTVEFOREFSRD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydTVEFOREFSRCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBzdGFuZGFyZCB0aW1lIGRlY2xhcmF0aW9uOgoKICAgICAgICBkdHN0YXJ0ICB0em9mZnNldHRvICB0em9mZnNldGZyb20KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgZHRzdGFydAogICAgICAgIHR6b2Zmc2V0dG8KICAgICAgICB0em9mZnNldGZyb20KICAgICk7Cn0KCj1oZWFkMiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgbWF5IGJlCnNwZWNpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGZvciBhIHN0YW5kYXJkIHRpbWUgZGVjbGFyYXRpb246CgogICAgICAgIGNvbW1lbnQgIHJkYXRlICBycnVsZSAgdHpuYW1lCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGNvbW1lbnQKICAgICAgICByZGF0ZQogICAgICAgIHJydWxlCiAgICAgICAgdHpuYW1lCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6VGltZVpvbmU6OkRheWxpZ2h0OwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnkvOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6RGF5bGlnaHQgLSBSZXByZXNlbnRzIGEgRGF5bGlnaHQgVGltZSBiYXNlIG9mZnNldCBmcm9tIFVUQyBmb3IgcGFyZW50IFRpbWVab25lCgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgdGltZSB6b25lIGlzIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSB0aGUgc2V0IG9mIHRpbWUgbWVhc3VyZW1lbnQKcnVsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZ292ZXJuaW5nIGJvZHkgZm9yIGEgZ2l2ZW4gZ2VvZ3JhcGhpYwphcmVhLiBUaGVzZSBydWxlcyBkZXNjcmliZSBhdCBhIG1pbmltdW0gdGhlIGJhc2Ugb2Zmc2V0IGZyb20gVVRDIGZvcgp0aGUgdGltZSB6b25lLCBvZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgU3RhbmRhcmQgVGltZSBvZmZzZXQuIE1hbnkKbG9jYXRpb25zIGFkanVzdCB0aGVpciBTdGFuZGFyZCBUaW1lIGZvcndhcmQgb3IgYmFja3dhcmQgYnkgb25lIGhvdXIsCmluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHNlYXNvbmFsIGNoYW5nZXMgaW4gbnVtYmVyIG9mIGRheWxpZ2h0IGhvdXJzLApvZnRlbiByZWZlcnJlZCB0byBhcyBEYXlsaWdodCBTYXZpbmcgVGltZS4gU29tZSBsb2NhdGlvbnMgYWRqdXN0IHRoZWlyCnRpbWUgYnkgYSBmcmFjdGlvbiBvZiBhbiBob3VyLiBTdGFuZGFyZCBUaW1lIGlzIGFsc28ga25vd24gYXMgV2ludGVyClRpbWUuIERheWxpZ2h0IFNhdmluZyBUaW1lIGlzIGFsc28ga25vd24gYXMgQWR2YW5jZWQgVGltZSwgU3VtbWVyClRpbWUsIG9yIExlZ2FsIFRpbWUgaW4gY2VydGFpbiBjb3VudHJpZXMuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MKdGhlIGNoYW5nZXMgaW4gdGltZSB6b25lIHJ1bGVzIGluIGVmZmVjdCBmb3IgTmV3IFlvcmsgQ2l0eSBzdGFydGluZwpmcm9tIDE5NjcuIEVhY2ggbGluZSByZXByZXNlbnRzIGEgZGVzY3JpcHRpb24gb3IgcnVsZSBmb3IgYSBwYXJ0aWN1bGFyCm9ic2VydmFuY2UuCgogICAgIEVmZmVjdGl2ZSBPYnNlcnZhbmNlIFJ1bGUKCiAgICAgRGF0ZSAgICAgICAoRGF0ZS9UaW1lKSAgICAgICAgICAgICBPZmZzZXQgIEFiYnJldmlhdGlvbgoKICAgICAxOTY3LSogICAgIGxhc3QgU3VuIGluIE9jdCwgMDI6MDAgIC0wNTAwICAgRVNUCgogICAgIDE5NjctMTk3MyAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk3NC0xOTc0ICBKYW4gNiwgIDAyOjAwICAgICAgICAgICAtMDQwMCAgIEVEVAoKICAgICAxOTc1LTE5NzUgIEZlYiAyMywgMDI6MDAgICAgICAgICAgIC0wNDAwICAgRURUCgogICAgIDE5NzYtMTk4NiAgbGFzdCBTdW4gaW4gQXByLCAwMjowMCAgLTA0MDAgICBFRFQKCiAgICAgMTk4Ny0qICAgICBmaXJzdCBTdW4gaW4gQXByLCAwMjowMCAtMDQwMCAgIEVEVAoKTm90ZTogVGhlIHNwZWNpZmljYXRpb24gb2YgYSBnbG9iYWwgdGltZSB6b25lIHJlZ2lzdHJ5IGlzIG5vdAphZGRyZXNzZWQgYnkgdGhpcyBkb2N1bWVudCBhbmQgaXMgbGVmdCBmb3IgZnV0dXJlIHN0dWR5LiAgSG93ZXZlciwKaW1wbGVtZW50ZXJzIG1heSBmaW5kIHRoZSBPbHNvbiB0aW1lIHpvbmUgZGF0YWJhc2UgW1RaXSBhIHVzZWZ1bApyZWZlcmVuY2UuIEl0IGlzIGFuIGluZm9ybWFsLCBwdWJsaWMtZG9tYWluIGNvbGxlY3Rpb24gb2YgdGltZSB6b25lCmluZm9ybWF0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXIgSW50ZXJuZXQKcGFydGljaXBhbnRzLCBhbmQgaXMgdXNlZCBpbiBzZXZlcmFsIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGlzIGRhdGFiYXNlCmNvbnRhaW5zIGN1cnJlbnQgYW5kIGhpc3RvcmljYWwgdGltZSB6b25lIGluZm9ybWF0aW9uIGZvciBhIHdpZGUKdmFyaWV0eSBvZiBsb2NhdGlvbnMgYXJvdW5kIHRoZSBnbG9iZTsgaXQgcHJvdmlkZXMgYSB0aW1lIHpvbmUKaWRlbnRpZmllciBmb3IgZXZlcnkgdW5pcXVlIHRpbWUgem9uZSBydWxlIHNldCBpbiBhY3R1YWwgdXNlIHNpbmNlCjE5NzAsIHdpdGggaGlzdG9yaWNhbCBkYXRhIGdvaW5nIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZAp0aW1lLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBpY2FsX2VudHJ5X3R5cGUKClJldHVybnMgQzxEQVlMSUdIVD4sIGl0cyBpQ2FsZW5kYXIgZW50cnkgbmFtZS4KCj1jdXQKCnN1YiBpY2FsX2VudHJ5X3R5cGUgeydEQVlMSUdIVCd9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG11c3QgYmUKc3BlY2lmaWVkIGV4YWN0bHkgb25lIHRpbWUgaW4gYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgZHRzdGFydCAgdHpvZmZzZXR0byAgdHpvZmZzZXRmcm9tCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGR0c3RhcnQKICAgICAgICB0em9mZnNldHRvCiAgICAgICAgdHpvZmZzZXRmcm9tCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZQpzcGVjaWZpZWQgYW55IG51bWJlciBvZiB0aW1lcyBmb3IgYSBkYXlsaWdodCBkZWNsYXJhdGlvbjoKCiAgICAgICAgY29tbWVudCAgcmRhdGUgIHJydWxlICB0em5hbWUKCj1jdXQKCnN1YiBvcHRpb25hbF9yZXBlYXRhYmxlX3Byb3BlcnRpZXMgewogICAgcXcoCiAgICAgICAgY29tbWVudAogICAgICAgIHJkYXRlCiAgICAgICAgcnJ1bGUKICAgICAgICB0em5hbWUKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpQcm9jZWR1cmUgLSBSZXByZXNlbnRzIGEgcHJvY2VkdXJlLWNhbGwgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZS0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiZnRwOi8vaG9zdC5jb20vbm92by1wcm9jcy9mZWxpemFuby5leGUiLCB7IGZtdHR5cGUgPT4gImFwcGxpY2F0aW9uL2JpbmFyeSIgfSBdLAogICAgICAgICMgRGF0KmUqOjpJQ2FsIGlzIG5vdCBhIHR5cG8gaGVyZQogICAgICAgIHRyaWdnZXIgICA9PiBbIERhdGU6OklDYWwtPm5ldyggZXBvY2ggPT4gLi4uICktPmljYWwsIHsgdmFsdWUgPT4gJ0RBVEUtVElNRScgfSBdLAogICAgKTsKCiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0IHJlcHJlc2VudHMgYW4gYWxhcm0KdGhhdCBjYWxscyBhIHByb2NlZHVyZSAoaW4gc29tZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHdheSksIHdoaWNoIGlzCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlByb2NlZHVyZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxQUk9DRURVUkU+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIlBST0NFRFVSRSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG1heSBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzLAogICAgICAgICJkZXNjcmlwdGlvbiIsCiAgICApOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgcHJvY2VkdXJlLWNhbGwKYWxhcm1zIG11c3QgYWxzbyBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMgewogICAgcmV0dXJuICgKICAgICAgICBzaGlmdC0+U1VQRVI6Om1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcywKICAgICAgICAiYXR0YWNoIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZSAtIFJlcHJlc2VudHMgYW4gZGVmYXVsdCBuby1vcCBhbGFybQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZS0+bmV3KCk7CiAgICAkdmV2ZW50LT5hZGRfZW50cnkoJHZhbGFybSk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkEgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06Ok5vbmU+IG9iamVjdCByZXByZXNlbnRzIGEgZGVmYXVsdCBhbGFybQp0aGF0IGRvZXMgbm90aGluZzsgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGxhY2sgb2YgYWxhcm0sIGJlY2F1c2UKY2xpZW50cyBtYXkgYmUgZXhwZWN0ZWQgdG8gIm92ZXJyaWRlIiBhbnkgZGVmYXVsdCBhbGFybSBwcmVzZW50IGluCmNhbGVuZGFyIGRhdGEgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyLiAgVGhpcwpjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtPiBhbmQgYWNjZXB0cyBhbGwgb2YKaXRzIG1ldGhvZHMuCgpUaGlzIGVsZW1lbnQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBvZmZpY2lhbCBpQ2FsIFJGQywgYnV0IGlzIHJhdGhlciBhbgp1bmFjY2VwdGVkIGRyYWZ0IHN0YW5kYXJkOyBzZWUKTDxodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtZGFib28tdmFsYXJtLWV4dGVuc2lvbnMtMDQjc2VjdGlvbi0xMT4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6Tm9uZT4gb2JqZWN0OyBzZXRzIGl0cwpDPEFDVElPTj4gcHJvcGVydHkgdG8gQzxOT05FPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJOT05FIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk7Cgp1c2UgYmFzZSBxdy9EYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vOwoKPWhlYWQxIE5BTUUKCkRhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RGlzcGxheSAtIFJlcHJlc2VudHMgYSBkaXNwbGF5ZWQgYWxhcm0gaW4gYW4gaUNhbGVuZGFyIGZpbGUKCj1oZWFkMSBTWU5PUFNJUwoKICAgIG15ICR2YWxhcm0gPSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIldha2UgdXAhIiwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpEaXNwbGF5PiBvYmplY3QgcmVwcmVzZW50cyBhIGFsYXJtIHRoYXQKZGlzcGxheXMgYSBtZXNzYWdlIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuCmlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkRpc3BsYXk+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RElTUExBWT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiRElTUExBWSIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG1hbmRhdG9yeV91bmlxdWVfcHJvcGVydGllcwoKSW4gYWRkaXRpb24gdG8gQzxhY3Rpb24+IGFuZCBDPHRyaWdnZXI+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzPiksIGRpc3BsYXllZAphbGFybXMgbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwKICAgICk7Cn0KCj1oZWFkMSBBVVRIT1IKCkJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDIEU8bHQ+bW9kdWxlc0BiZXN0cHJhY3RpY2FsLmNvbUU8Z3Q+Cgo9aGVhZDEgTElDRU5DRSBBTkQgQ09QWVJJR0hUCgpDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDE1LCBCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgpUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLiBTZWUgTDxwZXJsYXJ0aXN0aWM+LgoKPWN1dAoKMTsK
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OlVSSTsKCnVzZSBiYXNlIHF3L0RhdGE6OklDYWw6OkVudHJ5OjpBbGFybS87Cgo9aGVhZDEgTkFNRQoKRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkkgLSBSZXByZXNlbnRzIG5vdGlmaWNhdGlvbiB2aWEgYSBjdXN0b20gVVJJCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpVUkktPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgdXJpID0+ICJzbXM6KzE1MTA1NTUwMTAxP2JvZHk9aGVsbG8lMjB0aGVyZSIsCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6VVJJPiBvYmplY3QgcmVwcmVzZW50cyBhbiBhbGFybSB0aGF0Cm5vdGlmaWVzIHZpYSBhcmJpdHJhcnkgVVJJIHdoaWNoIGlzIGF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluCmFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUgaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcwoiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZiBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kCmFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKVGhpcyBlbGVtZW50IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwgaUNhbCBSRkMsIGJ1dCBpcyByYXRoZXIgYW4KdW5hY2NlcHRlZCBkcmFmdCBzdGFuZGFyZDsgc2VlCkw8aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWRhYm9vLXZhbGFybS1leHRlbnNpb25zLTA0I3NlY3Rpb24tNj4KQjxJdHMgaW50ZXJvcGVyYWJpbGl0eSBhbmQgc3VwcG9ydCBpcyB0aHVzIGxpbWl0ZWQuPiBUaGlzIGlzIGFsYXJtIHR5cGUKaXMgcHJpbWFyaWx5IHVzZWQgYnkgQXBwbGUuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QWxhcm0+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8Tk9ORT4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgJHNlbGYgID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBfKTsKICAgICRzZWxmLT5hZGRfcHJvcGVydHkoIGFjdGlvbiA9PiAiVVJJIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgdXJpIGFsYXJtcwptdXN0IGFsc28gc3BlY2lmeSBhIHZhbHVlIGZvciBDPHVyaT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgInVyaSIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkVtYWlsIC0gUmVwcmVzZW50cyBhbiBlbWFpbGVkIGFsYXJtIGluIGFuIGlDYWxlbmRhciBmaWxlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICBteSAkdmFsYXJtID0gRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpBdWRpby0+bmV3KCk7CiAgICAkdmFsYXJtLT5hZGRfcHJvcGVydGllcygKICAgICAgICBhdHRhY2ggPT4gWyAiYmFzaWM6ZnRwOi8vaG9zdC5jb20vcHViL3NvdW5kcy9iZWxsLTAxLmF1ZCIsIHsgZm10dHlwZSA9PiAiYXVkaW8vYmFzaWMiIH0gXSwKICAgICAgICAjIERhdCplKjo6SUNhbCBpcyBub3QgYSB0eXBvIGhlcmUKICAgICAgICB0cmlnZ2VyICAgPT4gWyBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IC4uLiApLT5pY2FsLCB7IHZhbHVlID0+ICdEQVRFLVRJTUUnIH0gXSwKICAgICk7CgogICAgJHZldmVudC0+YWRkX2VudHJ5KCR2YWxhcm0pOwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBIEw8RGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtOjpFbWFpbD4gb2JqZWN0IHJlcHJlc2VudHMgYW4gZW1haWxlZAphbGFybSBhdHRhY2hlZCB0byBhIHRvZG8gaXRlbSBvciBldmVudCBpbiBhbiBpQ2FsZW5kYXIgZmlsZS4gIChOb3RlCnRoYXQgdGhlIGlDYWxlbmRhciBSRkMgcmVmZXJzIHRvIGVudHJpZXMgYXMgImNvbXBvbmVudHMiLikgIEl0IGlzIGEKc3ViY2xhc3Mgb2YgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0+IGFuZCBhY2NlcHRzIGFsbCBvZiBpdHMgbWV0aG9kcy4KClRoZSBDPGF0dGVuZGVlPiBwcm9wZXJ0aWVzIGFyZSBpbnRlbmRlZCBhcyB0aGUgcmVjaXBpZW50IGxpc3Qgb2YgdGhlCmVtYWlsOyB0aGUgQzxzdW1tYXJ5PiBhcyBpdHMgc3ViamVjdDsgdGhlIEM8ZGVzY3JpcHRpb24+IGFzIGl0cyBib2R5OwphbmQgdGhlIEM8YXR0YWNoPiBhcyBpdHMgYXR0YWNobWVudHMuCgo9aGVhZDEgTUVUSE9EUwoKPWN1dAoKPWhlYWQyIG5ldwoKQ3JlYXRlcyBhIG5ldyBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6RW1haWw+IG9iamVjdDsgc2V0cyBpdHMKQzxBQ1RJT04+IHByb3BlcnR5IHRvIEM8RU1BSUw+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkY2xhc3MgPSBzaGlmdDsKICAgIG15ICRzZWxmICA9ICRjbGFzcy0+U1VQRVI6Om5ldyhAXyk7CiAgICAkc2VsZi0+YWRkX3Byb3BlcnR5KCBhY3Rpb24gPT4gIkVNQUlMIiApOwogICAgcmV0dXJuICRzZWxmOwp9Cgo9aGVhZDIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGFjdGlvbj4gYW5kIEM8dHJpZ2dlcj4gKHNlZQpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybS9tYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXM+KSwgZW1haWxlZCBhbGFybXMKbXVzdCBhbHNvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgQzxkZXNjcmlwdGlvbj4gYW5kIEM8c3VtbWFyeT4uCgo9Y3V0CgpzdWIgbWFuZGF0b3J5X3VuaXF1ZV9wcm9wZXJ0aWVzIHsKICAgIHJldHVybiAoCiAgICAgICAgc2hpZnQtPlNVUEVSOjptYW5kYXRvcnlfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImRlc2NyaXB0aW9uIiwgInN1bW1hcnkiLAogICAgKTsKfQoKPWhlYWQyIG1hbmRhdG9yeV9yZXBlYXRhYmxlX3Byb3BlcnRpZXMKCkFjY29yZGluZyB0byB0aGUgaUNhbGVuZGFyIHN0YW5kYXJkLCB0aGUgQzxhdHRlbmRlZT4gcHJvcGVydHkgbXVzdCBiZQpzcGVjaWZpZWQgYXQgbGVhc3Qgb25jZSBmb3IgYW4gZW1haWxlZCBhbGFybS4KCj1jdXQKCnN1YiBtYW5kYXRvcnlfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGVuZGVlCiAgICApOwp9Cgo9aGVhZDIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzCgpBY2NvcmRpbmcgdG8gdGhlIGlDYWxlbmRhciBzdGFuZGFyZCwgdGhlIEM8YXR0YWNoPiBwcm9wZXJ0eSBtYXkgYmUKc3BlY2lmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgZm9yIGFuIGVtYWlsZWQgYWxhcm0uCgo9Y3V0CgpzdWIgb3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsKICAgIHF3KAogICAgICAgIGF0dGFjaAogICAgKTsKfQoKPWhlYWQxIEFVVEhPUgoKQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMgRTxsdD5tb2R1bGVzQGJlc3RwcmFjdGljYWwuY29tRTxndD4KCj1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKCkNvcHlyaWdodCAoYykgMjAwNSAtIDIwMTUsIEJlc3QgUHJhY3RpY2FsIFNvbHV0aW9ucywgTExDLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuIFNlZSBMPHBlcmxhcnRpc3RpYz4uCgo9Y3V0CgoxOwo=
dXNlIHdhcm5pbmdzOwp1c2Ugc3RyaWN0OwoKcGFja2FnZSBEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvOwoKdXNlIGJhc2UgcXcvRGF0YTo6SUNhbDo6RW50cnk6OkFsYXJtLzsKCj1oZWFkMSBOQU1FCgpEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvIC0gUmVwcmVzZW50cyBhbiBhdWRpbyBhbGFybSBpbiBhbiBpQ2FsZW5kYXIgZmlsZQoKPWhlYWQxIFNZTk9QU0lTCgogICAgbXkgJHZhbGFybSA9IERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8tPm5ldygpOwogICAgJHZhbGFybS0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgYXR0YWNoID0+IFsgImZ0cDovL2hvc3QuY29tL3B1Yi9zb3VuZHMvYmVsbC0wMS5hdWQiLCB7IGZtdHR5cGUgPT4gImF1ZGlvL2Jhc2ljIiB9IF0sCiAgICAgICAgIyBEYXQqZSo6OklDYWwgaXMgbm90IGEgdHlwbyBoZXJlCiAgICAgICAgdHJpZ2dlciAgID0+IFsgRGF0ZTo6SUNhbC0+bmV3KCBlcG9jaCA9PiAuLi4gKS0+aWNhbCwgeyB2YWx1ZSA9PiAnREFURS1USU1FJyB9IF0sCiAgICApOwoKICAgICR2ZXZlbnQtPmFkZF9lbnRyeSgkdmFsYXJtKTsKCj1oZWFkMSBERVNDUklQVElPTgoKQSBMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6QXVkaW8+IG9iamVjdCByZXByZXNlbnRzIGFuIGF1ZGlvIGFsYXJtCmF0dGFjaGVkIHRvIGEgdG9kbyBpdGVtIG9yIGV2ZW50IGluIGFuIGlDYWxlbmRhciBmaWxlLiAgKE5vdGUgdGhhdCB0aGUKaUNhbGVuZGFyIFJGQyByZWZlcnMgdG8gZW50cmllcyBhcyAiY29tcG9uZW50cyIuKSAgSXQgaXMgYSBzdWJjbGFzcyBvZgpMPERhdGE6OklDYWw6OkVudHJ5OjpBbGFybT4gYW5kIGFjY2VwdHMgYWxsIG9mIGl0cyBtZXRob2RzLgoKPWhlYWQxIE1FVEhPRFMKCj1jdXQKCj1oZWFkMiBuZXcKCkNyZWF0ZXMgYSBuZXcgTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm06OkF1ZGlvPiBvYmplY3Q7IHNldHMgaXRzCkM8QUNUSU9OPiBwcm9wZXJ0eSB0byBDPEFVRElPPi4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAkc2VsZiAgPSAkY2xhc3MtPlNVUEVSOjpuZXcoQF8pOwogICAgJHNlbGYtPmFkZF9wcm9wZXJ0eSggYWN0aW9uID0+ICJBVURJTyIgKTsKICAgIHJldHVybiAkc2VsZjsKfQoKPWhlYWQyIG9wdGlvbmFsX3VuaXF1ZV9wcm9wZXJ0aWVzCgpJbiBhZGRpdGlvbiB0byBDPGR1cmF0aW9uPiBhbmQgQzxyZXBlYXQ+IChzZWUKTDxEYXRhOjpJQ2FsOjpFbnRyeTo6QWxhcm0vb3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXM+KSwgYXVkaW8gYWxhcm1zCm1heSBzcGVjaWZ5IGEgdmFsdWUgZm9yIEM8YXR0YWNoPi4KCj1jdXQKCnN1YiBvcHRpb25hbF91bmlxdWVfcHJvcGVydGllcyB7CiAgICByZXR1cm4gKAogICAgICAgIHNoaWZ0LT5TVVBFUjo6b3B0aW9uYWxfdW5pcXVlX3Byb3BlcnRpZXMsCiAgICAgICAgImF0dGFjaCIsCiAgICApOwp9Cgo9aGVhZDEgQVVUSE9SCgpCZXN0IFByYWN0aWNhbCBTb2x1dGlvbnMsIExMQyBFPGx0Pm1vZHVsZXNAYmVzdHByYWN0aWNhbC5jb21FPGd0PgoKPWhlYWQxIExJQ0VOQ0UgQU5EIENPUFlSSUdIVAoKQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNSwgQmVzdCBQcmFjdGljYWwgU29sdXRpb25zLCBMTEMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4gU2VlIEw8cGVybGFydGlzdGljPi4KCj1jdXQKCjE7Cg==
IyAkUmV2OiA2NzggJApwYWNrYWdlIERhdGU6OklDYWw7CnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiAkbG9jYWx6b25lICRsb2NhbG9mZnNldCBAbW9udGhzIEBsZWFwbW9udGhzICVhZGRfdW5pdHMpOwokVkVSU0lPTiA9ICcyLicuKHF3JyRSZXY6IDY3OCAkJylbMV07CnVzZSBDYXJwOwp1c2UgVGltZTo6TG9jYWw7CnVzZSBEYXRlOjpMZWFweWVhciBxdygpOwp1c2UgRGF0ZTo6SUNhbDo6RHVyYXRpb247CnVzZSBvdmVybG9hZCAnPD0+JyA9PiAnY29tcGFyZScsCiAgICAgICAgICAgICAnZmFsbGJhY2snID0+IDEsCiAgICAgICAgICAgICAnLScgPT4gXCZzdWJ0cmFjdCwKICAgICAgICAgICAgICcrJyA9PiBcJmFkZF9vdmVybG9hZDsKCiRsb2NhbHpvbmUgICA9ICRFTlZ7VFp9IHx8IDA7CiRsb2NhbG9mZnNldCA9IF9jYWxjX2xvY2FsX29mZnNldCgpOwoKIyBEb2N1bWVudGF0aW9uIHt7ewoKPWhlYWQxIE5BTUUKCkRhdGU6OklDYWwgLSBQZXJsIGV4dGVuc2lvbiBmb3IgSUNhbGVuZGFyIGRhdGUgb2JqZWN0cy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDY3OCAkCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgRGF0ZTo6SUNhbDsKCiAgICAkaWNhbCA9IERhdGU6OklDYWwtPm5ldyggaWNhbCA9PiAnMTk5NzEwMjRUMTIwMDAwJyApOwogICAgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKICAgICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCB5ZWFyID0+IDE5NjQsCiAgICAgICAgbW9udGggPT4gMTAsIGRheSA9PiAxNiwgaG91ciA9PiAxNiwKICAgICAgICBtaW4gPT4gMTIsIHNlYyA9PiA0NyApOwoKICAgICRob3VyID0gJGljYWwtPmhvdXI7CiAgICAkeWVhciA9ICRpY2FsLT55ZWFyOwoKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsOwogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CgogICAgJGljYWwyID0gJGljYWwgKyAkZHVyYXRpb247CgooV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgbGlrZSAnUDJXM0RUN0g5TScsIG9yIGEKRGF0ZTo6SUNhbDo6RHVyYXRpb24gKHF2KSBvYmplY3QuCgogICAgJGljYWwgKz0gJ1A2RFQxMkgnOwoKICAgICRkdXJhdGlvbiA9ICRpY2FsIC0gJGljYWwyOwogICAgJGljYWwzID0gJGljYWwgLSAkZHVyYXRpb247Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkRhdGU6OklDYWwgdGFsa3MgdGhlIElDYWwgZGF0ZSBmb3JtYXQsIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIGJhc2UgY2xhc3MgZm9yCm90aGVyIGRhdGUvY2FsZW5kYXIgbW9kdWxlcyB0aGF0IGtub3cgYWJvdXQgSUNhbCB0aW1lIGZvcm1hdCBhbHNvLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiwgYW5kIHRoZSBSZWVma25vdCB0ZWFtLiBBbGFzLCBSZWVma25vdCBpcyBubyBtb3JlLiBTZWUKaHR0cDovL2RhdGV0aW1lLnBlcmwub3JnLyBmb3IgbW9yZSBtb2Rlcm4gYW5kIGFjY3VyYXRlIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXZhaWxhYmxlOgoKPWhlYWQyIG5ldwoKQSBuZXcgRGF0ZTo6SUNhbCBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhbnkgdmFsaWQgSUNhbCBzdHJpbmc6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGljYWwgPT4gJzE5OTcxMDI0VDEyMDAwMCcgKTsKICAgICMgd2lsbCBkZWZhdWx0IHRvIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQgaW4gJFRaLCBzZWUgYmVsb3cKCk9yIHdpdGggYW55IGVwb2NoIHRpbWU6CgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsLT5uZXcoIGVwb2NoID0+IHRpbWUgKTsKCk9yLCBiZXR0ZXIgc3RpbGwsIGNyZWF0ZSBpdCB3aXRoIGNvbXBvbmVudHMKCiAgICBteSAkZGF0ZSA9IERhdGU6OklDYWwtPm5ldyggCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9PiAyNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0+IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PiAxMDY2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0+IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0+IDQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgpJZiB5b3UgY2FsbCBuZXcgd2l0aG91dCBhbnkgYXJndW1lbnRzLCB5b3UnbGwgZ2V0IGEgRGF0ZTo6SUNhbCBvYmplY3QgdGhhdCBpcwpzZXQgdG8gdGhlIHRpbWUgcmlnaHQgbm93LgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCk7CgpJZiB5b3UgYWxyZWFkeSBoYXZlIGFuIG9iamVjdCBpbiBEYXRlOjpJQ2FsLCBvciBzb21lIG90aGVyIHN1YmNsYXNzCnRoZXJlb2YsIHlvdSBjYW4gY3JlYXRlIGEgbmV3IERhdGU6OklDYWwgKG9yIHN1YmNsYXNzKSBvYmplY3QgdXNpbmcKdGhhdCBvYmplY3QgdG8gc3RhcnQgd2l0aC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBjb252ZXJ0aW5nCmZyb20gb25lIGNhbGVuZGFyIHRvIGFub3RoZXI6CgogICAjIERpcmVjdCBjb252ZXJzaW9uIGZyb20gRGlzY29yZGlhbiB0byBJU08gZGF0ZXMKICAgbXkgJGRpc2NvID0gRGF0ZTo6RGlzY29yZGlhbi0+bmV3KCBkaXNjbyA9PiAnMTIgQ2hhb3MsIFlPTEQgMzE3NycgKTsKICAgbXkgJGlzbyA9IERhdGU6OklTTy0+bmV3KCAkZGlzY28gKTsKICAgcHJpbnQgJGlzby0+aXNvOwoKbmV3KCkgaGFuZGxlcyB0aW1lem9uZXMuIEl0IGRlZmF1bHRzIHRpbWVzIHRvIFVUQyAoR3JlZW53aWNoCk1lYW4gVGltZSwgYWxzbyBjYWxsZWQgWnVsdSkuIElmIHlvdSB3YW50IHRvIHNldCB1cCBhIHRpbWUKdGhhdCdzIGluIHRoZSBVUyAiUGFjaWZpYyIgdGltZXpvbmUsIHdoaWNoIGlzIEdNVC04LCB1c2Ugc29tZXRoaW5nCmxpa2U6CiAgICAKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbC0+bmV3KCBpY2FsID0+ICcxOTk3MTAyNFQxMjAwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9PiAiLTA4MDAiKTsKICAgCk5vdGUgdGhhdCBhcyBvZiB2ZXJzaW9uIDEuNDQsIG5ldygpIHRyaWVzIHRvIGJlIGludGVsbGlnZW50CmFib3V0IGZpZ3VyaW5nIG91dCB5b3VyIGxvY2FsIHRpbWUgem9uZS4gSWYgeW91IGVudGVyCmEgdGltZSB0aGF0J3Mgbm90ICpleHBsaWNpdGx5KiBpbiBVVEMsIGl0IGxvb2tzIGF0CnRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAkVFosIGlmIGl0IGV4aXN0cywgdG8gZGV0ZXJtaW5lCnlvdXIgbG9jYWwgb2Zmc2V0LiBJZiAkVFogaXNuJ3Qgc2V0LCBuZXcoKSB3aWxsIGNvbXBsYWluLgoKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAgbXkgKCAkc2VsZiwgJWFyZ3MsICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyLCAkdHogKTsKCiAgICAjICR6ZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhpcyB0aW1lIGlzIG5hdGl2ZWx5IGluIFVUQyAgICAKICAgIG15ICR6ZmxhZyA9IDA7CgogICAgIyBGaXJzdCBhcmd1bWVudCBjYW4gYmUgYSBEYXRlOjpJQ2FsIChvciBzdWJjbGFzcyB0aGVyZW9mKSBvYmplY3QKICAgIGlmICggcmVmICRfWzBdICkgewogICAgICAgICRhcmdze2ljYWx9ID0gJF9bMF0tPmljYWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJWFyZ3MgPSBAXzsKICAgIH0KCiAgICAkc2VsZiA9IHt9OwoKICAgICMgRGF0ZSBpcyBzcGVjaWZpZWQgYXMgZXBvY2gje3t7CiAgICBpZiAoIGRlZmluZWQoICRhcmdze2Vwb2NofSApICkgewoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPQogICAgICAgICAgKCBnbXRpbWUoICRhcmdze2Vwb2NofSApIClbIDAsIDEsIDIsIDMsIDQsIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwoKICAgICAgICAkemZsYWcgPSAxOyAgICAjIGVwb2NoIHRpbWVzIGFyZSBieSBkZWZpbml0aW9uIGluIEdNVAogICAgfSAgICAjfX19CgogICAgIyBEYXRlIGlzIHNwZWNpZmllZCBhcyBpY2FsIHN0cmluZyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7aWNhbH0gKSApIHsKCiAgICAgICAgIyBUaW1lem9uZSwgaWYgYW55CiAgICAgICAgJGFyZ3N7aWNhbH0gPX4gcy9eKD86VFpJRD0oW146XSspOik/Ly87CiAgICAgICAgJHR6ID0gJDE7CgogICAgICAgICMgU3BsaXQgdXAgaWNhbCBzdHJpbmcKICAgICAgICAoICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjLCAkemZsYWcgKSA9CiAgICAgICAgICAkYXJnc3tpY2FsfSA9fiAvXig/OihcZHs0fSkoXGRcZCkoXGRcZCkpCiAgICAgICAgICAgICAgICg/OlQoXGRcZCk/KFxkXGQpPyhcZFxkKT8pPwogICAgICAgICAgICAgICAgICAgICAgICAgKFopPyQveDsKCiAgICAgICAgIyBUT0RPOiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaWYgd2UgZ2V0IGEgVFpJRC4gCiAgICAgICAgIyBJJ2Qgc3VnZ2VzdCB3ZSBzdG9yZSBpdCBmb3IgdXNlIGJ5IG1vZHVsZXMgdGhhdCBjYXJlCiAgICAgICAgIyBhYm91dCBUWklEIG5hbWVzLiBCdXQgd2UgZG9uJ3Qgd2FudCB0aGlzIG1vZHVsZQogICAgICAgICMgdG8gZGVhbCB3aXRoIHRpbWV6b25lIG5hbWVzLCBvbmx5IG9mZnNldHMsIEkgdGhpbmsuCiAgICAgICAgIyAtLXNybAoKICAgIH0gICAgI319fQoKICAgICMgVGltZSBzcGVjaWZpZWQgYXMgY29tcG9uZW50cyN7e3sKICAgIGVsc2lmICggZGVmaW5lZCggJGFyZ3N7ZGF5fSApICkgewoKICAgICAgICAjIENob2tlIGlmIG1pc3NpbmcgYXJndW1lbnRzCiAgICAgICAgZm9yZWFjaCBteSAkYXR0cmliKHF3KGRheSBtb250aCB5ZWFyICkpIHsKICAgICAgICAgICAgd2FybiAiQXR0cmlidXRlICRhdHRyaWIgcmVxdWlyZWQiIHVubGVzcyBkZWZpbmVkICRhcmdzeyRhdHRyaWJ9OwogICAgICAgIH0KICAgICAgICBmb3JlYWNoIG15ICRhdHRyaWIocXcoIGhvdXIgbWluIHNlYyApKSB7CiAgICAgICAgICAgICRhcmdzeyRhdHRyaWJ9ID0gMCB1bmxlc3MgZGVmaW5lZCAkYXJnc3skYXR0cmlifTsKICAgICAgICB9CgogICAgICAgICMgQW5kIHRoZW4ganVzdCB1c2Ugd2hhdCB3YXMgcGFzc2VkIGluCiAgICAgICAgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0KICAgICAgICAgIEBhcmdzeyAnc2VjJywgJ21pbicsICdob3VyJywgJ2RheScsICdtb250aCcsICd5ZWFyJyB9OwoKICAgIH0gICAgI319fQoKICAgIGVsc2UgeyAgICAjIEp1c3QgdXNlIGN1cnJlbnQgZ210aW1lI3t7ewoKICAgICAgICAjIFNpbmNlIHdlIGFyZSBkZWZhdWx0aW5nLCB0aGlzIHF1YWxpZmllcyBhcyBVVEMKICAgICAgICAkemZsYWcgPSAxOwoKICAgICAgICAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSAoIGdtdGltZSh0aW1lKSApWyAwIC4uIDUgXTsKICAgICAgICAkeWVhciArPSAxOTAwOwogICAgICAgICRtb250aCsrOwogICAgfSAgICAjfX19CgogICAgJHNlbGYtPntqdWxpYW59ID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwogICAgJHNlbGYtPntqdWxzZWN9ID0gdGltZV9hc19zZWNvbmRzKCAkaG91ciwgJG1pbiwgJHNlYyApOwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBpZiAoIGV4aXN0cyggJGFyZ3N7b2Zmc2V0fSApICkgewogICAgICAgICMgV2Ugc2hvdWxkIGNvbXBsYWluIGlmIHRoZXkncmUgdHJ5aW5nIHRvIHNldCBhIG5vbi1VVEMKICAgICAgICAjIG9mZnNldCBvbiBhIHRpbWUgdGhhdCdzIGluaGVyZW50bHkgVVRDLiAgLWp2CiAgICAgICAgaWYgKCR6ZmxhZyAmJiAoJGFyZ3N7b2Zmc2V0fSAhPSAwKSkgewogICAgICAgICAgICBjYXJwICJUaW1lIGhhZCBjb25mbGljdGluZyBvZmZzZXQgYW5kIFVUQyBpbmZvLiBVc2luZyBVVEMiCiAgICAgICAgICAgICAgdW5sZXNzICRFTlZ7SEFSTkVTU19BQ1RJVkV9OwogICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICMgU2V0IHVwIHRoZSBvZmZzZXQgZm9yIHRoaXMgZGF0ZXRpbWUuCiAgICAgICAgICAgICRzZWxmLT5vZmZzZXQoICRhcmdze29mZnNldH0gfHwgMCApOwogICAgICAgIH0KICAgICAgfSBlbHNpZiAoICEkemZsYWcgKSB7CgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHRpbWV6b25lIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgY2hlY2tlZC4KICAgICAgICAjIEFwcGFyZW50bHkgdGhpcyBoYXBwZW5zIG9uIHNvbWUgc3lzdGVtcy4gUGF0Y2ggZnJvbSBNaWtlCiAgICAgICAgIyBIZWlucy4gQXNrIGhpbS4KICAgICAgICBteSAkdHogID0gJEVOVntUWn0gfHwgJzAnOwogICAgICAgIG15ICRsb2MgPSAkdHogZXEgJGxvY2Fsem9uZSA/ICRsb2NhbG9mZnNldCA6IF9jYWxjX2xvY2FsX29mZnNldCgpOwogICAgICAgICRzZWxmLT5vZmZzZXQoJGxvYykgaWYgZGVmaW5lZCAkc2VsZjsKICAgIH0KCiAgICByZXR1cm4gJHNlbGY7Cn0KCiN9fX0KCiN7e3sgc3ViIGljYWwKCj1oZWFkMiBpY2FsCgogICAgJGljYWxfc3RyaW5nID0gJGljYWwtPmljYWw7CgpSZXRyaWV2ZXMsIG9yIHNldHMsIHRoZSBkYXRlIG9uIHRoZSBvYmplY3QsIHVzaW5nIGFueSB2YWxpZCBJQ2FsIGRhdGUvdGltZQpzdHJpbmcuIE91dHB1dCBpcyBpbiBVVEMgKGVuZHMgd2l0aCBhICJaIikgYnkgZGVmYXVsdC4gVG8gZ2V0Cm91dHB1dCBpbiBsb2NhbHRpbWUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbWFjaGluZSwgZG86CiAgICAKICAgICRpY2FsX3N0cmluZyA9ICRpY2FsLT5pY2FsKCBsb2NhbHRpbWUgPT4gMSApOwoKVG8gZ2V0IG91dHB1dCByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkgb2Zmc2V0LCBkbzoKCiAgICAkaWNhbF9zdHJpbmcgPSAkaWNhbC0+aWNhbCggb2Zmc2V0ID0+ICcrMDU0NScgKTsKCj1jdXQKCnN1YiBpY2FsIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBpZiAoIDEgJiBAXyApIHsgICAgICMgb2RkIG51bWJlciBvZiBwYXJhbWV0ZXJzPwogICAgICAgIGNhcnAgIkJhZCBhcmdzOiBleHBlY3RlZCBuYW1lZCBwYXJhbWV0ZXIgbGlzdCI7CiAgICAgICAgc2hpZnQ7ICAgICMgYXZvaWQgd2FybmluZyBmcm9tICVhcmdzPUBfIGFzc2lnbm1lbnQKICAgIH0KICAgIG15ICVhcmdzID0gQF87CiAgICBteSAkaWNhbDsKCiAgICBpZiAoIGV4aXN0cyAkYXJnc3tsb2NhbHRpbWV9ICkgewogICAgICAgIGNhcnAgImNhbid0IGhhdmUgbG9jYWx0aW1lIGFuZCBvZmZzZXQgdG9nZXRoZXIsIHVzaW5nIGxvY2FsdGltZSBvZmZzZXQiCiAgICAgICAgICBpZiBleGlzdHMgJGFyZ3N7b2Zmc2V0fTsKCiAgICAgICAgIyBtYWtlIG91dHB1dCBpbiBsb2NhbHRpbWUgZm9ybWF0IGJ5IHNldHRpbmcgJGFyZ3N7b2Zmc2V0fQogICAgICAgICRhcmdze29mZnNldH0gPSAkc2VsZi0+b2Zmc2V0OwogICAgfQoKICAgIGlmICggZXhpc3RzICRhcmdze29mZnNldH0gKSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgYmFzZWQgb24gYW4gYXJiaXRyYXJ5IG9mZnNldAogICAgICAgICMgTm8gWiBvbiB0aGUgZW5kIQogICAgICAgIG15ICRqdWxpYW4gPSAkc2VsZi0+e2p1bGlhbn07CiAgICAgICAgbXkgJGp1bHNlYyA9ICRzZWxmLT57anVsc2VjfTsKICAgICAgICBteSAkYWRqdXN0ID0gb2Zmc2V0X3RvX3NlY29uZHMoICRhcmdze29mZnNldH0gKTsKICAgICAgICAkc2VsZi0+YWRkKCBzZWNvbmRzID0+ICRhZGp1c3QgKTsKICAgICAgICAkaWNhbCA9CiAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCcsICRzZWxmLT55ZWFyLCAkc2VsZi0+bW9udGgsCiAgICAgICAgICAkc2VsZi0+ZGF5LCAkc2VsZi0+aG91ciwgJHNlbGYtPm1pbnV0ZSwgJHNlbGYtPnNlY29uZCwgKTsKICAgICAgICAkc2VsZi0+e2p1bGlhbn0gPSAkanVsaWFuOwogICAgICAgICRzZWxmLT57anVsc2VjfSA9ICRqdWxzZWM7CiAgICAgIH0gZWxzZSB7CgogICAgICAgICMgbWFrZSBvdXRwdXQgaW4gVVRDIGJ5IGRlZmF1bHQKICAgICAgICAjIGlmIHdlIHdlcmUgb3JpZ2luYWxseSBnaXZlbiB0aGlzIHRpbWUgaW4gb2Zmc2V0CiAgICAgICAgIyBmb3JtLCB3ZSdsbCBuZWVkIHRvIGFkanVzdCBpdCBmb3Igb3V0cHV0CiAgICAgICAgaWYgKCAkc2VsZi0+aG91ciB8fCAkc2VsZi0+bWluIHx8ICRzZWxmLT5zZWMgKSB7CiAgICAgICAgICAgICRpY2FsID0KICAgICAgICAgICAgICBzcHJpbnRmKCAnJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLAogICAgICAgICAgICAgICRzZWxmLT5kYXksICRzZWxmLT5ob3VyLCAkc2VsZi0+bWludXRlLCAkc2VsZi0+c2Vjb25kICk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaWNhbCA9CiAgICAgICAgICAgICAgc3ByaW50ZiggJyUwNGQlMDJkJTAyZFonLCAkc2VsZi0+eWVhciwgJHNlbGYtPm1vbnRoLCAkc2VsZi0+ZGF5ICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkaWNhbDsKfSAgICAjfX19Cgoje3t7IHN1YiBlcG9jaAoKPWhlYWQyIGVwb2NoCgogICAgJGVwb2NoX3RpbWUgPSAkaWNhbC0+ZXBvY2g7CiAgICAKICAgICRpY2FsLT5lcG9jaCggOTg2ODc0MzEgKTsKClNldHMsIG9yIHJldHJpZXZlcywgdGhlIGVwb2NoIHRpbWUgcmVwcmVzZW50ZWQgYnkgdGhlIG9iamVjdCwgaWYgaXQgaXMKcmVwcmVzZW50YWJsZSBhcyBzdWNoLiAoRGF0ZXMgYmVmb3JlIDE5NzEgb3IgYWZ0ZXIgMjAzOCB3aWxsIG5vdCBoYXZlIGFuIGVwb2NoCnJlcHJlc2VudGF0aW9uLikKCkludGVybmFscyBub3RlOiBUaGUgSUNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSBpcyBjb25zaWRlcmVkIHRoZSBvbmx5CmF1dGhvcml0YXRpdmUgb25lLiBUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IG5lZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIGVwb2NoIHRpbWUKZnJvbSB0aGUgSUNhbCByZXByZXNlbnRhdGlvbiBpZiB3ZSBhcmUgbm90IHN1cmUgdGhhdCB0aGV5IGFyZSBpbiBzeW5jaC4gV2UnbGwKbmVlZCB0byBkbyBjbGV2ZXIgdGhpbmdzIHRvIGtlZXAgdHJhY2sgb2Ygd2hlbiB0aGUgdHdvIG1heSBub3QgYmUgaW4gc3luY2guCkFuZCwgb2YgY291cnNlLCB0aGUgc2FtZSB3aWxsIGdvIGZvciBhbnkgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLgoKPWN1dAoKc3ViIGVwb2NoIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGNsYXNzID0gcmVmKCRzZWxmKTsKCiAgICBteSAkZXBvY2g7CgogICAgaWYgKCAkZXBvY2ggPSBzaGlmdCApIHsgICAgIyBQYXNzZWQgaW4gYSBuZXcgdmFsdWUKCiAgICAgICAgbXkgJG5ld2Vwb2NoID0gJGNsYXNzLT5uZXcoIGVwb2NoID0+ICRlcG9jaCApOwogICAgICAgICRzZWxmLT57anVsaWFufSA9ICRuZXdlcG9jaC0+e2p1bGlhbn07CiAgICAgICAgJHNlbGYtPntqdWxzZWN9ID0gJG5ld2Vwb2NoLT57anVsc2VjfTsKCiAgICB9CgogICAgZWxzZSB7ICAgICMgQ2FsY3VsYXRlIGVwb2NoIGZyb20gY29tcG9uZW50cywgaWYgcG9zc2libGUKCiAgICAgICAgJGVwb2NoID0KICAgICAgICAgIHRpbWVnbSggJHNlbGYtPnNlYywgJHNlbGYtPm1pbiwgJHNlbGYtPmhvdXIsICRzZWxmLT5kYXksCiAgICAgICAgICAoICRzZWxmLT5tb250aCApIC0gMSwgKCAkc2VsZi0+eWVhciApIC0gMTkwMCApOwogICAgfQoKICAgIHJldHVybiAkZXBvY2g7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldF90b19zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X3RvX3NlY29uZHMKCiAgICAkc2Vjb25kc19wbHVzX29yX21pbnVzID0gb2Zmc2V0X3RvX3NlY29uZHMoJG9mZnNldCk7CiAgIApDaGFuZ2VzIC0wNjAwIHRvIC0yMTYwMC4gTm90IG9iamVjdCBtZXRob2QsIG5vIHNpZGUtZWZmZWN0cy4KCj1jdXQKCnN1YiBvZmZzZXRfdG9fc2Vjb25kcyB7CiAgICBteSAkb2Zmc2V0ID0gc2hpZnQ7CgogICAgIyBSZWxvY2F0ZWQgZnJvbSBvZmZzZXQgZm9yIHJlLXVzZQogICAgbXkgJG5ld29mZnNldDsKCiAgICBpZiAoICRvZmZzZXQgZXEgJzAnICkgewogICAgICAgICRuZXdvZmZzZXQgPSAwOwogICAgICB9IGVsc2lmICggJG9mZnNldCA9fiAvXihbKy1dKShcZFxkKShcZFxkKVx6LyApCiAgICB7CiAgICAgICAgbXkgKCAkc2lnbiwgJGhvdXJzLCAkbWludXRlcyApID0gKCAkMSwgJDIsICQzICk7CgogICAgICAgICMgY29udmVydCB0byBzZWNvbmRzLCBpZ25vcmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbGVhcCBzZWNvbmRzCiAgICAgICAgIyBvciBkYXlsaWdodC1zYXZpbmdzLXRpbWUgc2hpZnRzCiAgICAgICAgJG5ld29mZnNldCA9ICRob3VycyAqIDYwICogNjAgKyAkbWludXRlcyAqIDYwOwogICAgICAgICRuZXdvZmZzZXQgKj0gLTEgaWYgJHNpZ24gZXEgJy0nOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcnAoIllvdSBnYXZlIGFuIG9mZnNldCwgJG9mZnNldCwgdGhhdCBtYWtlcyBubyBzZW5zZSIpOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KICAgIHJldHVybiAkbmV3b2Zmc2V0Owp9CgojfX19Cgoje3t7IHN1YiBvZmZzZXRfZnJvbV9zZWNvbmRzCgo9aGVhZDIgb2Zmc2V0X2Zyb21fc2Vjb25kcwoKICAgICRzZWNvbmRzX3BsdXNfb3JfbWludXMgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCRvZmZzZXRfaW5fc2Vjb25kcyk7CiAgIApDaGFuZ2VzIC0xODAwMCAoc2Vjb25kcykgdG8gLTA2MDAgKGhvdXJzLCBtaW51dGVzKS4gCk5vdCBvYmplY3QgbWV0aG9kLCBubyBzaWRlLWVmZmVjdHMuCgo9Y3V0CgpzdWIgb2Zmc2V0X2Zyb21fc2Vjb25kcyB7CiAgICBteSAkc2Vjb2Zmc2V0ICA9IHNoaWZ0OwogICAgbXkgJGhobW1vZmZzZXQgPSAwOwoKICAgIGlmICggJHNlY29mZnNldCBuZSAnMCcgKSB7CiAgICAgICAgbXkgKCAkc2lnbiwgJHNlY3MgKSA9ICggIiIsICIiICk7CiAgICAgICAgKCAkc2lnbiwgJHNlY3MgKSA9ICRzZWNvZmZzZXQgPX4gLyhbKy1dKT8oXGQrKS87CgogICAgICAgICMgdGhyb3cgaW4gYSArIHRvIG1ha2UgdGhpcyBsb29rIGxpa2UgYW4gb2Zmc2V0IGlmIHBvc2l0aXZlCiAgICAgICAgJHNpZ24gPSAiKyIgdW5sZXNzICRzaWduOwoKICAgICAgICAjIE5PVEU6IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJldHVybiAiKzAwMDAiIGlmIHlvdSBnaXZlIGl0IGEgbnVtYmVyCiAgICAgICAgIyBvZiBzZWNvbmRzIHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgYSBkYXkuIEhvd2V2ZXIsIGZvciBzcGVlZCByZWFzb25zCiAgICAgICAgIyBJJ20gbm90IGdvaW5nIHRvIHdyaXRlIGluIGEgY29tcGFyaXNvbiB0byByZWZvcm1hdCB0aGF0IGJhY2sgdG8gMC4KICAgICAgICAjIAogICAgICAgIG15ICRob3VycyA9ICRzZWNzIC8gKCA2MCAqIDYwICk7CiAgICAgICAgJGhvdXJzID0gJGhvdXJzICUgMjQ7CiAgICAgICAgbXkgJG1pbnMgPSAoICRzZWNzICUgKCA2MCAqIDYwICkgKSAvIDYwOwogICAgICAgICRoaG1tb2Zmc2V0ID0gc3ByaW50ZiggJyVzJTAyZCUwMmQnLCAkc2lnbiwgJGhvdXJzLCAkbWlucyApOwoKICAgIH0KCiAgICByZXR1cm4gJGhobW1vZmZzZXQ7Cn0KCiN9fX0KCiN7e3sgc3ViIG9mZnNldAoKPWhlYWQyIG9mZnNldCAKCiAgICAkb2Zmc2V0ID0gJGljYWwtPm9mZnNldDsKICAgCiAgICAjIFdlIG5lZWQgdGVzdHMgZm9yIHRoZXNlLiAgCiAgICAkaWNhbC0+b2Zmc2V0KCAnKzExMDAnICk7ICMgYSBudW1iZXIgb2YgaG91cnMgYW5kIG1pbnV0ZXM6IFVUQysxMQogICAgJGljYWwtPm9mZnNldCggMCApOyAgICAgICAjIHJlc2V0IHRvIFVUQwoKU2V0cyBvciByZXRyaWV2ZXMgdGhlIG9mZnNldCBmcm9tIFVUQyBmb3IgdGhpcyB0aW1lLiBUaGlzIGFsbG93cwp0aW1lem9uZSBzdXBwb3J0LCBhc3N1bWluZyB5b3Uga25vdyB3aGF0IHlvdXIgbG9jYWwgKG9yIG5vbi1sb2NhbCkKVVRDIG9mZnNldCBpcy4gRGVmYXVsdHMgdG8gMC4gCgpJbnRlcm5hbHMgbm90ZTogYWxsIHRpbWVzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCBpbiBVVEMsIGV2ZW4gdGhvdWdoIHRoZXkKbWF5IGhhdmUgc29tZSBvZmZzZXQgaW5mb3JtYXRpb24uIE9mZnNldHMgYXJlIGludGVybmFsbHkgc3RvcmVkIGluCnNpZ25lZCBpbnRlZ2VyIHNlY29uZHMuIAoKQkUgQ0FSRUZVTCBhYm91dCB1c2luZyB0aGlzIGZ1bmN0aW9uIG9uIG9iamVjdHMgdGhhdCB3ZXJlIGluaXRpYWxpemVkCndpdGggYW4gb2Zmc2V0LiBJZiB5b3Ugc3RhcnRlZCBhbiBvYmplY3Qgd2l0aDoKICAgIAogICAgbXkgJGQgPSBuZXcoaWNhbD0+JzE5NzAwMTAxMTIwMDAwJywgb2Zmc2V0PT4nKzAxMDAnKTsgCgphbmQgeW91IHRoZW4gY2FsbDogCgogICAgJGQtPm9mZnNldCgnKzAyMDAnKTsgCiAgICAKeW91J2xsIGJlIHNheWluZyAiWWVhaCwgSSBrbm93IEkgKnNhaWQqIGl0IHdhcyBpbiArMDEwMCwgYnV0IHJlYWxseSBJCndhbnQgaXQgdG8gYmUgaW4gKzAyMDAgbm93IGFuZCBmb3JldmVyLiIgV2hpY2ggbWF5IGJlIHlvdXIgaW50ZW50aW9uLAppZiB5b3UncmUgdHJ5aW5nIHRvIHRyYW5zcG9zZSBhIHdob2xlIHNldCBvZiBkYXRlcyB0byBhbm90aGVyIHRpbWV6b25lLS0tCmJ1dCB5b3UgY2FuIGFsc28gZG8gdGhhdCBhdCB0aGUgcHJlc2VudGF0aW9uIGxldmVsLCB3aXRoCnRoZSBpY2FsKCkgbWV0aG9kLiBFaXRoZXIgd2F5IHdpbGwgd29yay4KCj1jdXQKCnN1YiBvZmZzZXQgewogICAgbXkgKCAkc2VsZiwgJG9mZnNldCApID0gQF87CiAgICBteSAkbmV3b2Zmc2V0ID0gdW5kZWY7CgogICAgaWYgKCBkZWZpbmVkKCRvZmZzZXQpICkgeyAgICAjIFBhc3NlZCBpbiBhIG5ldyB2YWx1ZQogICAgICAgICRuZXdvZmZzZXQgPSBvZmZzZXRfdG9fc2Vjb25kcygkb2Zmc2V0KTsKCiAgICAgICAgdW5sZXNzICggZGVmaW5lZCAkbmV3b2Zmc2V0ICkgeyByZXR1cm4gdW5kZWY7IH0KCiAgICAgICAgIyBzaW5jZSB3ZSdyZSBpbnRlcm5hbGx5IHN0b3JpbmcgaW4gR01ULCB3ZSBuZWVkIHRvCiAgICAgICAgIyBhZGp1c3QgdGhlIHRpbWUgd2Ugd2VyZSBnaXZlbiBieSB0aGUgb2Zmc2V0IHNvIHRoYXQKICAgICAgICAjIHRoZSBpbnRlcm5hbCBkYXRlL3RpbWUgd2lsbCBiZSByaWdodC4KCiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CgogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgd2hldGhlciB0aGVyZSdzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuCiAgICAgICAgICAgICMgdGhlIGV4aXN0aW5nIG9mZnNldCBhbmQgdGhlIG9mZnNldCB3ZSB3ZXJlIGdpdmVuLgogICAgICAgICAgICAjIElmIHNvLCBhZGp1c3QgYXBwcm9wcmlhdGVseS4KICAgICAgICAgICAgbXkgJG9mZnNldGRpZmYgPSAkc2VsZi0+e29mZnNldH0gLSAkbmV3b2Zmc2V0OwoKICAgICAgICAgICAgaWYgKCRvZmZzZXRkaWZmKSB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAkb2Zmc2V0ZGlmZiApOwogICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgIyBsZWF2ZSB0aGUgb2Zmc2V0IHRoZSB3YXkgaXQgaXMKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlbGYtPmFkZCggc2Vjb25kcyA9PiAtJG5ld29mZnNldCApOwogICAgICAgICAgICAkc2VsZi0+e29mZnNldH0gPSAkbmV3b2Zmc2V0OwogICAgICAgIH0KCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCAkc2VsZi0+e29mZnNldH0gKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSBvZmZzZXRfZnJvbV9zZWNvbmRzKCAkc2VsZi0+e29mZnNldH0gKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG9mZnNldDsKfQoKI319fQoKIyBzdWIgYWRkIHt7ewoKPWhlYWQyIGFkZAoKICAgICRzZWxmLT5hZGQoIHllYXIgPT4gMywgbW9udGggPT4gMiwgd2VlayA9PiAxLCBkYXkgPT4gMTIsCiAgICAgICAgICAgICAgICBob3VyID0+IDEsIG1pbnV0ZSA9PiAzNCwgc2VjID0+IDU5ICk7CiAgICAkZGF0ZS0+YWRkKCBkdXJhdGlvbiA9PiAnUDFXVDFIMU0xUycgKTsgIyBhZGQgMSB3aywgMSBociwgMSBtaW4sIGFuZCAxIHNlYwoKQWRkcyBhIGR1cmF0aW9uIHRvIGEgRGF0ZTo6SUNhbCBvYmplY3QuCgpTdXBwb3J0ZWQgcGFyYXRlcnMgYXJlOiBkdXJhdGlvbiwgZW9tX21vZGUsIHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksCmhvdXIsIG1pbiwgc2VjIG9yIHNlY29uZHMuCgonZHVyYXRpb24nIGlzIGEgSUNhbGVuZGFyIGR1cmF0aW9uIHN0cmluZyAoc2VlIGR1cmF0aW9uX3ZhbHVlKS4KCklmIGEgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIG9taXR0ZWQsIDEgaXMgYXNzdW1lZDoKCiAgICAkaWNhbC0+YWRkKCAnbWludXRlJyApOyAjIGFkZCBhIG1pbnV0ZQoKVGhlIHJlc3VsdCB3aWxsIGJlIG5vcm1hbGl6ZWQuIFRoYXQgaXMsIHRoZSBvdXRwdXQgdGltZSB3aWxsIGhhdmUKbWVhbmluZ2Z1bCB2YWx1ZXMsIHJhdGhlciB0aGFuIGJlaW5nIDQ4OjczIHBtIG9uIHRoZSAzNHRoIG9mIApoZXhhZGVjZW1iZXIuCgpBZGRpbmcgbW9udGhzIG9yIHllYXJzIGNhbiBiZSBkb25lIHZpYSB0aHJlZSBkaWZmZXJlbnQgbWV0aG9kcywKc3BlY2lmaWVkIGJ5IHRoZSBlb21fbW9kZSBwYXJhbWV0ZXIsIHdoaWNoIHRoZW4gYXBwbGllcyB0byBhbGwKYWRkaXRpb25zIChvciBzdWJ0cmFjdGlvbnMpIG9mIG1vbnRocyBvciB5ZWFycyBmb2xsb3dpbmcgaXQgaW4gdGhlCnBhcmFtZXRlciBsaXN0LgoKVGhlIGRlZmF1bHQsIGVvbV9tb2RlID0+ICd3cmFwJywgbWVhbnMgYWRkaW5nIG1vbnRocyBvciB5ZWFycyB0aGF0CnJlc3VsdCBpbiBkYXlzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBuZXcgbW9udGggd2lsbCByb2xsIG92ZXIgaW50byB0aGUKZm9sbG93aW5nIG1vbnRoLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIHllYXIgdG8gRmViIDI5IHdpbGwgcmVzdWx0CmluIE1hciAxLgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ2xpbWl0JywgdGhlIGVuZCBvZiB0aGUgbW9udGggaXMgbmV2ZXIKY3Jvc3NlZC4gIFRodXMsIGFkZGluZyBvbmUgeWVhciB0byBGZWIgMjksIDIwMDAgd2lsbCByZXN1bHQgaW4gRmViIDI4LAoyMDAxLiAgSG93ZXZlciwgYWRkaW5nIHRocmVlIG1vcmUgeWVhcnMgd2lsbCByZXN1bHQgaW4gRmViIDI4LCAyMDA0LApub3QgRmViIDI5LgoKSWYgeW91IHNwZWNpZnkgZW9tX21vZGUgPT4gJ3ByZXNlcnZlJywgdGhlIHNhbWUgY2FsY3VsYXRpb24gaXMgZG9uZSBhcwpmb3IgJ2xpbWl0JyBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgZGF0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZQptb250aCB0aGUgbmV3IGRhdGUgd2lsbCBhbHNvIGJlLiAgRm9yIGluc3RhbmNlLCBhZGRpbmcgb25lIG1vbnRoIHRvCkZlYiAyOSwgMjAwMCB3aWxsIHJlc3VsdCBpbiBNYXIgMzEsIDIwMDAuCgpBbGwgYWRkaXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4gIEZvciBpbnN0YW5jZSwKd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mIGVvbV9tb2RlID0+ICd3cmFwJywgYWRkaW5nIG9uZSBkYXkgYW5kIG9uZQptb250aCB0byBGZWIgMjkgd2lsbCByZXN1bHQgaW4gQXByIDEsIHdoaWxlIGFkZGluZyBvbmUgbW9udGggYW5kIG9uZQpkYXkgd2lsbCByZXN1bHQgaW4gTWFyIDMwLgoKPWN1dAoKc3ViIGFkZCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgY2FycCAiRGF0ZTo6SUNhbDo6YWRkIHdhcyBjYWxsZWQgd2l0aG91dCBhbiBhdHRyaWJ1dGUgYXJnIiB1bmxlc3MgQF87CiAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9KSA9CiAgICAgICAgX2FkZCgkc2VsZi0+e2p1bGlhbn0sICRzZWxmLT57anVsc2VjfSwgQF8pOwogICAgcmV0dXJuICRzZWxmOwp9CgojfX19CgojIHN1YiBfYWRkIHt7ewoKPWJlZ2luIGludGVybmFsCgogICAgQWRkIChvciBzdWJ0cmFjdCkgdG8gYSBkYXRlL3RpbWUuICBGaXJzdCB0d28gcGFyYW1ldGVycyBhcmUKICAgIHRoZSBqZCBhbmQgc2VjcyBvZiB0aGUgZGF5LiAgRm9yIHRoZSByZXN0LCBzZWUgdGhlIGFkZCBtZXRob2QuCiAgICBSZXR1cm5zIHRoZSBhZGp1c3RlZCBqZCBhbmQgc2Vjcy4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgZm9yIGVhY2ggdW5pdCwgc3BlY2lmeSB3aGF0IGl0IGNoYW5nZXMgYnkgKDA9ZGF5LCAxPXNlY29uZCwgMj1tb250aCkKIyBhbmQgYnkgd2hhdCBmYWN0b3IKCiVhZGRfdW5pdHMgPSAoeWVhcj0+WzIsMTJdLCBtb250aD0+WzIsMV0sIHdlZWs9PlswLDddLCBkYXk9PlswLDFdLAogICAgICAgICAgICAgIGhvdXI9PlsxLDM2MDBdLCBtaW49PlsxLDYwXSwgc2VjPT5bMSwxXSwgc2Vjb25kcz0+WzEsMV0pOwoKc3ViIF9hZGQgewogICAgbXkgKCRqZCwgJHNlY3MpID0gc3BsaWNlKEBfLCAwLCAyKTsKICAgIG15ICRlb21fbW9kZSA9IDA7CiAgICBteSAoJGFkZCwgJHVuaXQsICRjb3VudCk7CgogICAgIyBsb29wIHRocm91Z2ggdW5pdD0+Y291bnQgcGFyYW1ldGVycwogICAgd2hpbGUgKCgkdW5pdCwgJGNvdW50KSA9IHNwbGljZShAXywgMCwgMikpIHsKCiAgICAgICAgaWYgKCR1bml0IGVxICdkdXJhdGlvbicpIHsgIyBhZGQgYSBkdXJhdGlvbiBzdHJpbmcKICAgICAgICAgICAgbXkgJWR1cjsKICAgICAgICAgICAgQGR1cnsnZGF5Jywnc2VjJywnbW9udGgnfSA9IGR1cmF0aW9uX3ZhbHVlKCRjb3VudCk7CgogICAgICAgICAgICAjIHByZXRlbmQgdGhlc2Ugd2VyZSBwYXNzZWQgdG8gdXMgYXMgZS5nLiBtb250aD0+MSwgZGF5PT4xLCBzZWM9PjEuCiAgICAgICAgICAgICMgc2luY2UgbW9udGhzL3llYXJzIGNvbWUgZmlyc3QgaW4gdGhlIGR1cmF0aW9uIHN0cmluZywgd2UKICAgICAgICAgICAgIyBwdXQgdGhlbSBmaXJzdC4KICAgICAgICAgICAgdW5zaGlmdCBAXywgbWFwICRkdXJ7JF99ID8gKCRfLCRkdXJ7JF99KSA6ICgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vbnRoJywgJ2RheScsICdzZWMnOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0gZWxzaWYgKCR1bml0IGVxICdlb21fbW9kZScpIHsKICAgICAgICAgICAgaWYgKCRjb3VudCBlcSAnd3JhcCcpIHsgJGVvbV9tb2RlID0gMCB9CiAgICAgICAgICAgIGVsc2lmICgkY291bnQgZXEgJ2xpbWl0JykgeyAkZW9tX21vZGUgPSAxIH0KICAgICAgICAgICAgZWxzaWYgKCRjb3VudCBlcSAncHJlc2VydmUnKSB7ICRlb21fbW9kZSA9IDIgfQogICAgICAgICAgICBlbHNlIHsgY2FycCAiVW5yZWNvZ25pemVkIGVvbV9tb2RlLCAkY291bnQsIGlnbm9yZWQiIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmxlc3MgKCRhZGQgPSAkYWRkX3VuaXRzeyR1bml0fSkgewogICAgICAgICAgICAgICAgY2FycCAiVW5yZWNvZ25pemVkIHRpbWUgdW5pdCwgJHVuaXQsIHNraXBwZWQiOwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvdW50ID0gMSBpZiAhZGVmaW5lZCAkY291bnQ7ICMgY291bnQgZGVmYXVsdHMgdG8gMQogICAgICAgICAgICAkY291bnQgKj0gJGFkZC0+WzFdOyAjIG11bHRpcGx5IGJ5IHRoZSBmYWN0b3IgZm9yIHRoaXMgdW5pdAoKICAgICAgICAgICAgaWYgKCRhZGQtPlswXSA9PSAwKSB7ICMgYWRkIHRvIGRheXMKICAgICAgICAgICAgICAgICRqZCArPSAkY291bnQ7CiAgICAgICAgICAgIH0gZWxzaWYgKCRhZGQtPlswXSA9PSAxKSB7ICMgYWRkIHRvIHNlY29uZHMKICAgICAgICAgICAgICAgICRzZWNzICs9ICRjb3VudDsKICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAjIGFkZCB0byBtb250aHMKICAgICAgICAgICAgICAgIG15ICgkeSwgJG1vLCAkZCk7CgogICAgICAgICAgICAgICAgX25vcm1hbGl6ZV9zZWNvbmRzKCAkamQsICRzZWNzICk7CiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlID09IDIpIHsgIyBzdGlja3kgZW9tIG1vZGUKICAgICAgICAgICAgICAgICAgICAjIGlmIGl0IGlzIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIG1ha2UgaXQgdGhlIDB0aAogICAgICAgICAgICAgICAgICAgICMgZGF5IG9mIHRoZSBmb2xsb3dpbmcgbW9udGggKHdoaWNoIHRoZW4gd2lsbCBub3JtYWxpemUKICAgICAgICAgICAgICAgICAgICAjIGJhY2sgdG8gdGhlIGxhc3QgZGF5IG9mIHRoZSBuZXcgbW9udGgpLgogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQrMSApOwogICAgICAgICAgICAgICAgICAgIC0tJGQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICgkeSwgJG1vLCAkZCkgPSBqZDJncmVnKCAkamQgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGVvbV9tb2RlICYmICRkID4gMjgpIHsgIyBsaW1pdCBkYXkgdG8gbGFzdCBvZiBuZXcgbW9udGgKICAgICAgICAgICAgICAgICAgICAjIGZpbmQgdGhlIGpkIG9mIHRoZSBsYXN0IGRheSBvZiBvdXIgdGFyZ2V0IG1vbnRoCiAgICAgICAgICAgICAgICAgICAgJGpkID0gZ3JlZzJqZCggJHksICRtbyskY291bnQrMSwgMCApOwoKICAgICAgICAgICAgICAgICAgICAjIHdoYXQgZGF5IG9mIHRoZSBtb250aCBpcyBpdD8gKGRpc2NhcmQgeWVhciBhbmQgbW9udGgpCiAgICAgICAgICAgICAgICAgICAgbXkgJGxhc3RkYXkgPSBzY2FsYXIgamQyZ3JlZyggJGpkICk7CgogICAgICAgICAgICAgICAgICAgICMgaWYgb3VyIG9yaWdpbmFsIGRheSB3YXMgbGVzcyB0aGFuIHRoZSBsYXN0IGRheSwKICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGF0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAkamQgLT0gJGxhc3RkYXkgLSAkZCBpZiAkbGFzdGRheSA+ICRkOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkamQgPSBncmVnMmpkKCAkeSwgJG1vKyRjb3VudCwgJGQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKfQoKI319fQoKIyBzdWIgYWRkX292ZXJsb2FkIHt7ewoKPWhlYWQyIGFkZF9vdmVybG9hZAoKICAgICRkYXRlID0gJGRhdGUxICsgJGR1cmF0aW9uOwoKV2hlcmUgJGR1cmF0aW9uIGlzIGVpdGhlciBhIGR1cmF0aW9uIHN0cmluZywgb3IgYSBEYXRlOjpJQ2FsOjpEdXJhdGlvbgpvYmplY3QuCgogICAgJGRhdGUgKz0gJ1AyRFQ0SDdNJzsKCkFkZHMgYSBkdXJhdGlvbiB0byBhIGRhdGUgb2JqZWN0LiBSZXR1cm5zIGEgbmV3IG9iamVjdCwgb3IsIGluIHRoZSBjYXNlCm9mICs9LCBtb2RpZmllcyB0aGUgZXhpc3Rpbmcgb2JqZWN0LgoKPWN1dAoKc3ViIGFkZF9vdmVybG9hZCB7CiAgICBteSAkb25lID0gc2hpZnQ7CiAgICBteSAkdHdvID0gc2hpZnQ7CgogICAgbXkgJHJldCA9ICRvbmUtPmNsb25lOwoKICAgIGlmICggcmVmICR0d28gKSB7CiAgICAgICAgJHJldC0+YWRkKCBkdXJhdGlvbiA9PiAkdHdvLT5hc19pY2FsICk7CiAgICB9IGVsc2UgewogICAgICAgICRyZXQtPmFkZCggZHVyYXRpb24gPT4gJHR3byApOwogICAgfQoKICAgIHJldHVybiAkcmV0Owp9ICMgfX19CgojIHN1YiBfbm9ybWFsaXplX3NlY29uZHMge3t7Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICAoJGpkLCAkc2VjcykgPSBfbm9ybWFsaXplX3NlY29uZHMoICRqZCwgJHNlY3MgKTsKCiAgICBDb3JyZWN0cyBzZWNvbmRzIHRoYXQgaGF2ZSBnb25lIGludG8gZm9sbG93aW5nIG9yIHByZXZpb3VzIGRheShzKS4KICAgIEFkanVzdHMgdGhlIHBhc3NlZCBkYXlzIGFuZCBzZWNvbmRzIGFzIHdlbGwgYXMgcmV0dXJuaW5nIHRoZW0uCgo9ZW5kIGludGVybmFsCgo9Y3V0CgpzdWIgX25vcm1hbGl6ZV9zZWNvbmRzIHsKICAgIG15ICRhZGo7CgogICAgaWYgKCRfWzFdIDwgMCkgewogICAgICAgICRhZGogPSBpbnQoICgkX1sxXS04NjM5OSkvODY0MDAgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGFkaiA9IGludCggJF9bMV0vODY0MDAgKTsKICAgIH0KICAgICgkX1swXSArPSAkYWRqKSwgKCRfWzFdIC09ICRhZGoqODY0MDApOwp9CgojfX19CgojIHN1YiBkdXJhdGlvbl92YWx1ZSB7e3sKCj1oZWFkMiBkdXJhdGlvbl92YWx1ZQoKR2l2ZW4gYSBkdXJhdGlvbiBzdHJpbmcsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMsCnNlY29uZHMsIGFuZCBtb250aHMgcmVwcmVzZW50ZWQgYnkgdGhhdCBkdXJhdGlvbi4gSW4gdGhhdCBvcmRlci4gU2VlbXMKb2RkIHRvIG1lLiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGludGVybmFsIGZ1bmN0aW9uLCBhbmQgeW91CnNob3VsZCBleHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UgaW4gdGhlIHZlcnkgbmVhciBmdXR1cmUuCgo9Y3V0CgpzdWIgZHVyYXRpb25fdmFsdWUgewogICAgbXkgJHN0ciA9IHNoaWZ0OwoKICAgIG15IEB0ZW1wID0gJHN0ciA9fiBtewogICAgICAgICAgICAoW1wrXC1dKT8gICAoPyMgU2lnbikKICAgICAgICAgICAgKFApICAgICAoPyMgJ1AnIGZvciBwZXJpb2Q/IFRoaXMgaXMgb3VyIG1hZ2ljIGNoYXJhY3RlcikKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAoPzooXGQrKVkpPyAoPyMgWWVhcnMpCiAgICAgICAgICAgICAgICAoPzooXGQrKU0pPyAoPyMgTW9udGhzKQogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICB9eDsKICAgIG15ICggJHNpZ24sICRtYWdpYyApID0gQHRlbXBbIDAgLi4gMSBdOwogICAgbXkgKCAkeWVhcnMsICRtb250aHMsICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnMsICRzZWNzICkgPQogICAgICBtYXAgeyBkZWZpbmVkKCRfKSA/ICRfIDogMCB9IEB0ZW1wWyAyIC4uICQjdGVtcCBdOwoKICAgIHVubGVzcyAoIGRlZmluZWQoJG1hZ2ljKSApIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CiAgICAkc2lnbiA9ICggKCBkZWZpbmVkKCRzaWduKSAmJiAkc2lnbiBlcSAnLScgKSA/IC0xIDogMSApOwoKICAgIG15ICRzID0gJHNpZ24gKiAoICRzZWNzICsgKCAkbWlucyAqIDYwICkgKyAoICRob3VycyAqIDM2MDAgKSApOwogICAgbXkgJGQgPSAkc2lnbiAqICggJGRheXMgKyAoICR3ZWVrcyAqIDcgKSApOwogICAgbXkgJG0gPSAkc2lnbiAqICggJG1vbnRocyArICggJHllYXJzICogMTIgKSApOwogICAgcmV0dXJuICggJGQsICRzLCAkbSApOwp9CgojfX19CgojIHN1YiBzdWJ0cmFjdCB7e3sKCj1oZWFkMiBzdWJ0cmFjdAoKICAkZHVyYXRpb24gPSAkZGF0ZTEgLSAkZGF0ZTI7CgpTdWJ0cmFjdCBvbmUgRGF0ZTo6SUNhbCBvYmplY3QgZnJvbSBhbm90aGVyIHRvIGdpdmUgYSBkdXJhdGlvbiAtIHRoZQpsZW5ndGggb2YgdGhlIGludGVydmFsIGJldHdlZW4gdGhlIHR3byBkYXRlcy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhCkRhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCAocXYpIGFuZCBhbGxvd3MgeW91IHRvIGdldCBhdCBlYWNoIG9mIHRoZQppbmRpdmlkdWFsIGNvbXBvbmVudHMsIG9yIHRoZSBlbnRpcmUgZHVyYXRpb24gc3RyaW5nOgoKICAgICRkID0gJGRhdGUxIC0gJFg7CgpOb3RlIHRoYXQgJFggY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgoKSWYgJFggaXMgYW5vdGhlciBEYXRlOjpJQ2FsIG9iamVjdCAob3Igc3ViY2xhc3MgdGhlcmVvZikgdGhlbiAkZCB3aWxsIGJlCmEgRGF0ZTo6SUNhbDo6RHVyYXRpb24gb2JqZWN0LgoKICAgICR3ZWVrID0gJGQtPndlZWtzOyAjIGhvdyBtYW55IHdlZWtzIGFwYXJ0PwogICAgJGRheXMgPSAkZC0+YXNfZGF5czsgIyBIb3cgbWFueSBkYXlzIGFwYXJ0PwoKSWYgJFggaXMgYSBkdXJhdGlvbiBzdHJpbmcsIG9yIGEgRGF0ZTo6SUNhbDo6RGlyYXRpb24gb2JqZWN0LCB0aGVuICRkCndpbGwgYmUgYW4gb2JqZWN0IGluIHRoZSBzYW1lIGNsYXNzIGFzICRkYXRlMTsKCiAgICAkbmV3ZGF0ZSA9ICRkYXRlIC0gJGR1cmF0aW9uOyAKCj1jdXQKCnN1YiBzdWJ0cmFjdCB7CiAgICBteSAoICRkYXRlMSwgJGRhdGUyLCAkcmV2ZXJzZWQgKSA9IEBfOwogICAgbXkgJGR1cjsKCiAgICAjIElmIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIHdhcyByZXZlcnNlZCwgb3ZlcmxvYWQgdGVsbHMgdXMKICAgICMgYWJvdXQgaXQgaW4gdGhlIHRoaXJkIGFyZ3VtZW50LgogICAgaWYgKCRyZXZlcnNlZCkgewogICAgICAgICggJGRhdGUyLCAkZGF0ZTEgKSA9ICggJGRhdGUxLCAkZGF0ZTIgKTsKICAgIH0KCiAgICBpZiAocmVmICRkYXRlMSAmJiByZWYgJGRhdGUyKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgRHVyYXRpb24gb2JqZWN0LAogICAgIyB0aGVuIHdlIHNob3VsZCBzdWJ0cmFjdCBhbmQgZ2V0IGEgZGF0ZS4KICAgICAgICBpZiAoKHJlZiAkZGF0ZTIpIGVxICdEYXRlOjpJQ2FsOjpEdXJhdGlvbicpIHsKICAgICAgICAgICAgbXkgJHNlY29uZHMgPSAkZGF0ZTItPmFzX3NlY29uZHM7CiAgICAgICAgICAgIG15ICRyZXQgPSAkZGF0ZTEtPmNsb25lOwogICAgICAgICAgICAkcmV0LT5hZGQoIHNlY29uZHMgPT4gLTEgKiAkc2Vjb25kcyApOwogICAgICAgICAgICByZXR1cm4gJHJldDsKCiAgICAgICAgfSBlbHNlIHsKICAgICMgSWYgJGRhdGUyIGlzIGEgRGF0ZTo6SUNhbCBvYmplY3QsIG9yIHNvbWUgY2xhc3MgdGhlcmVvZiwgd2Ugc2hvdWxkCiAgICAjIHN1YnRyYWN0IGFuZCBnZXQgYSBkdXJhdGlvbgoKICAgICAgICAgICAgbXkgJGRheXMgPSAkZGF0ZTEtPntqdWxpYW59IC0gJGRhdGUyLT57anVsaWFufTsKICAgICAgICAgICAgbXkgJHNlY3MgPSAkZGF0ZTEtPntqdWxzZWN9IC0gJGRhdGUyLT57anVsc2VjfTsKCiAgICAgICAgICAgIHJldHVybiBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KAogICAgICAgICAgICAgIGRheXMgICAgPT4gJGRheXMsCiAgICAgICAgICAgICAgc2Vjb25kcyA9PiAkc2VjcwogICAgICAgICAgICApOwogICAgICAgIH0gCiAgICB9IGVsc2lmICggcmVmICRkYXRlMSAmJiAKICAgICAgICAgICAgICAoICRkdXIgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCBpY2FsID0+ICRkYXRlMiApICkKICAgICAgICAgICAgKSB7CiAgICAjIElmICRkYXRlMSBpcyBhIERhdGU6OklDYWwgb2JqZWN0LCBhbmQgJGRhdGUyIGlzIGEgZHVyYXRpb24gc3RyaW5nLAogICAgIyB3ZSBzaG91bGQgc3VidHJhY3QgYW5kIGdldCBhIGRhdGUKICAgICAgICByZXR1cm4gJGRhdGUxIC0gJGR1cjsgIyBJcyB0aGF0IGNoZWF0aW5nPwoKICAgICMgT3RoZXJ3aXNlLCByZXR1cm4gdW5kZWYKICAgIH0gZWxzZSB7CiAgICAgICAgd2FybiAiSW52YWxpZCBhcmd1bWVudHMuIFlvdSBjYW4gc3VidHJhY3QgYSBkYXRlIGZyb20gYSBkYXRlLCBvciBhIGR1cmF0aW9uIGZyb20gYSBkYXRlIjsKICAgICAgICByZXR1cm47CiAgICB9Cgp9ICMgfX19CgojIHN1YiBjbG9uZSB7e3sKCj1oZWFkMiBjbG9uZQoKICAgICRjb3B5ID0gJGRhdGUtPmNsb25lOwoKUmV0dXJucyBhIHJlcGxpY2Egb2YgdGhlIGRhdGUgb2JqZWN0LCBpbmNsdWRpbmcgYWxsIGF0dHJpYnV0ZXMuCgo9Y3V0CgpzdWIgY2xvbmUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRjbGFzcyA9IHJlZiAkc2VsZjsKICAgIG15ICVoYXNoID0gJSRzZWxmOwogICAgbXkgJG5ldyA9IFwlaGFzaDsKICAgIGJsZXNzICRuZXcsICRjbGFzczsKICAgIHJldHVybiAkbmV3Owp9ICMgfX19CgojIHN1YiBjb21wYXJlIHt7ewoKPWhlYWQyIGNvbXBhcmUKCiAgICAkY21wID0gJGRhdGUxLT5jb21wYXJlKCRkYXRlMik7CgogICAgQGRhdGVzID0gc29ydCB7JGEtPmNvbXBhcmUoJGIpfSBAZGF0ZXM7CgpDb21wYXJlIHR3byBEYXRlOjpJQ2FsIG9iamVjdHMuIFNlbWFudGljcyBhcmUgY29tcGF0aWJsZSB3aXRoCnNvcnQ7IHJldHVybnMgLTEgaWYgJGEgPCAkYiwgMCBpZiAkYSA9PSAkYiwgMSBpZiAkYSA+ICRiLiAKCj1jdXQKCnN1YiBjb21wYXJlIHsKICAgIG15ICggJHNlbGYsICRvdGhlcmRhdGUgKSA9IChAXyk7CgogICAgdW5sZXNzICggZGVmaW5lZCgkb3RoZXJkYXRlKSApIHsgcmV0dXJuIHVuZGVmIH0KCiAgICAjIE9uZSBvciBtb3JlIGRheXMgZGlmZmVyZW50CgogICAgaWYgKCAkc2VsZi0+e2p1bGlhbn0gPCAkb3RoZXJkYXRlLT57anVsaWFufSApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bGlhbn0gPiAkb3RoZXJkYXRlLT57anVsaWFufSApCiAgICB7CiAgICAgICAgcmV0dXJuIDE7CgogICAgICAgICMgVGhleSBhcmUgdGhlIHNhbWUgZGF5CiAgICAgIH0gZWxzaWYgKCAkc2VsZi0+e2p1bHNlY30gPCAkb3RoZXJkYXRlLT57anVsc2VjfSApCiAgICB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9IGVsc2lmICggJHNlbGYtPntqdWxzZWN9ID4gJG90aGVyZGF0ZS0+e2p1bHNlY30gKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgICAgIyBpZiB3ZSBnb3QgYWxsIHRoaXMgd2F5IGFuZCBoYXZlbid0IHlldCByZXR1cm5lZCwgdGhlIHVuaXRzIGFyZSBlcXVhbC4KICAgIHJldHVybiAwOwp9CgojfX19CgojIGludGVybmFsIHN0dWZmIHt7ewoKPWJlZ2luIGludGVybmFsCgogQG1vbnRocyA9IG1vbnRocygkeWVhcik7CgpSZXR1cm5zIHRoZSBKdWxpYW4gZGF5IGF0IHRoZSBlbmQgb2YgYSBtb250aCwgY29ycmVjdCBmb3IgdGhhdCB5ZWFyLgoKPWVuZCBpbnRlcm5hbCAKCj1jdXQKCiMgcHJlY2FsY3VsYXRlIHRoZXNlIHZhbHVlcyBhdCBtb2R1bGUgbG9hZCB0aW1lIHNvIHRoYXQgd2UgZG9uJ3QKIyBoYXZlIHRvIGRvIGl0IHJlcGVhdGVkbHkgZHVyaW5nIHJ1bnRpbWUuIAojIApCRUdJTiB7CgogICAgIyAgICAgICAgICAgKyAgMzEsIDI4LCAzMSwgMzAsICAzMSwgIDMwLCAgMzEsICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxCiAgICBAbW9udGhzID0gKCAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1ICk7CiAgICBAbGVhcG1vbnRocyA9IEBtb250aHM7CgogICAgZm9yICggMiAuLiAxMiApIHsKICAgICAgICAkbGVhcG1vbnRoc1skX10gPSAkbW9udGhzWyRfXSArIDE7CiAgICB9Cn0KCnN1YiBtb250aHMgewogICAgcmV0dXJuIERhdGU6OkxlYXB5ZWFyOjppc2xlYXAoc2hpZnQpID8gQGxlYXBtb250aHMgOiBAbW9udGhzOwp9Cgo9YmVnaW4gaW50ZXJuYWwKCiAgICB0aW1lX2FzX3NlY29uZHMoICRhcmdze2hvdXJ9LCAkYXJnc3ttaW59LCAkYXJnc3tzZWN9ICk7CgpSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBhcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gdGhlIGRheS4KCj1lbmQgaW50ZXJuYWwKCj1jdXQKCiMgfX19CgojIHN1YiB0aW1lX2FzX3NlY29uZHMge3t7CgpzdWIgdGltZV9hc19zZWNvbmRzIHsKICAgIG15ICggJGhvdXIsICRtaW4sICRzZWMgKSA9IEBfOwoKICAgICRob3VyIHx8PSAwOwogICAgJG1pbiB8fD0gMDsKICAgICRzZWMgfHw9IDA7CgogICAgbXkgJHNlY3MgPSAkaG91ciAqIDM2MDAgKyAkbWluICogNjAgKyAkc2VjOwogICAgcmV0dXJuICRzZWNzOwp9ICN9fX0KCiMgc3ViIGRheSB7e3sKCj1oZWFkMiBkYXkKCiAgICBteSAkZGF5ID0gJGRhdGUtPmRheTsKClJldHVybnMgdGhlIGRheSBvZiB0aGUgbW9udGguCgpEYXkgaXMgaW4gdGhlIHJhbmdlIDEuLjMxCgo9Y3V0CgpzdWIgZGF5IHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCBqZDJncmVnKCAkc2VsZi0+e2p1bGlhbn0gKSApWzJdOwp9ICMgfX19CgojIHN1YiBtb250aCB7e3sKCj1oZWFkMiBtb250aAoKICAgIG15ICRtb250aCA9ICRkYXRlLT5tb250aDsKClJldHVybnMgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyLgoKTW9udGggaXMgcmV0dXJuZWQgYXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDEuLjEyCgo9Y3V0CgpzdWIgbW9udGggewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMV07Cn0gIyB9fX0KCiMgc3ViIG1vbiB7e3sKCnN1YiBtb24geyByZXR1cm4gbW9udGgoQF8pOyB9CgojfX19CgojIHN1YiB5ZWFyIHt7ewoKPWhlYWQyIHllYXIKCiAgICBteSAkeWVhciA9ICRkYXRlLT55ZWFyOwoKUmV0dXJucyB0aGUgeWVhci4gIAoKPWN1dAoKc3ViIHllYXIgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoIGpkMmdyZWcoICRzZWxmLT57anVsaWFufSApIClbMF07Cn0gIyB9fX0KCiMgc3ViIGpkMmdyZWcge3t7Cgo9aGVhZDIgamQyZ3JlZwoKICAgICgkeWVhciwgJG1vbnRoLCAkZGF5KSA9IGpkMmdyZWcoICRqZCApOwoKICAgIENvbnZlcnQgbnVtYmVyIG9mIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UgKEdyZWdvcmlhbikgdG8KICAgIGdyZWdvcmlhbiB5ZWFyLG1vbnRoLGRheS4KCj1jdXQKCnN1YiBqZDJncmVnIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgJGQgPSBzaGlmdDsKICAgIG15ICR5YWRqID0gMDsKICAgIG15ICggJGMsICR5LCAkbSApOwoKICAgICMgYWRkIDMwNiBkYXlzIHRvIG1ha2UgcmVsYXRpdmUgdG8gTWFyIDEsIDA7IGFsc28gYWRqdXN0ICRkIHRvIGJlIHdpdGhpbgogICAgIyBhIHJhbmdlICgxLi4yKioyOC0xKSB3aGVyZSBvdXIgY2FsY3VsYXRpb25zIHdpbGwgd29yayB3aXRoIDMyYml0IGludHMKICAgIGlmICggJGQgPiAyKioyOCAtIDMwNyApIHsKCiAgICAgICAgIyBhdm9pZCBvdmVyZmxvdyBpZiAkZCBjbG9zZSB0byBtYXhpbnQKICAgICAgICAkeWFkaiA9ICggJGQgLSAxNDYwOTcgKyAzMDYgKSAvIDE0NjA5NyArIDE7CiAgICAgICAgJGQgLT0gJHlhZGogKiAxNDYwOTcgLSAzMDY7CiAgICAgIH0gZWxzaWYgKCAoICRkICs9IDMwNiApIDw9IDAgKQogICAgewogICAgICAgICR5YWRqID0KICAgICAgICAgIC0oIC0kZCAvIDE0NjA5NyArIDEgKTsgICAgIyBhdm9pZCBhbWJpZ3VpdHkgaW4gQyBkaXZpc2lvbiBvZiBuZWdhdGl2ZXMKICAgICAgICAkZCAtPSAkeWFkaiAqIDE0NjA5NzsKICAgIH0KCiAgICAkYyA9CiAgICAgICggJGQgKiA0IC0gMSApIC8gMTQ2MDk3OyAgICAjIGNhbGMgIyBvZiBjZW50dXJpZXMgJGQgaXMgYWZ0ZXIgMjkgRmViIG9mIHlyIDAKICAgICRkIC09ICRjICogMTQ2MDk3IC8gNDsgICAgIyAgICAgKDQgY2VudHVyaWVzID0gMTQ2MDk3IGRheXMpCiAgICAkeSA9ICggJGQgKiA0IC0gMSApIC8gMTQ2MTsgICAgIyBjYWxjIG51bWJlciBvZiB5ZWFycyBpbnRvIHRoZSBjZW50dXJ5LAogICAgJGQgLT0gJHkgKiAxNDYxIC8gNDsgICAgIyAgICAgYWdhaW4gTWFyY2gtYmFzZWQgKDQgeXJzID1+IDE0NlswMV0gZGF5cykKICAgICRtID0KICAgICAgKCAkZCAqIDEyICsgMTA5MyApIC8gMzY3OyAgICAjIGdldCB0aGUgbW9udGggKDMuLjE0IHJlcHJlc2VudCBNYXJjaCB0aHJvdWdoCiAgICAkZCAtPSAoICRtICogMzY3IC0gMTA5NCApIC8gMTI7ICAgICMgICAgIEZlYnJ1YXJ5IG9mIGZvbGxvd2luZyB5ZWFyKQogICAgJHkgKz0gJGMgKiAxMDAgKyAkeWFkaiAqIDQwMDsgICAgIyBnZXQgdGhlIHJlYWwgeWVhciwgd2hpY2ggaXMgb2ZmIGJ5CiAgICArKyR5LCAkbSAtPSAxMiBpZiAkbSA+IDEyOyAgICAgICAgICMgICAgIG9uZSBpZiBtb250aCBpcyBKYW51YXJ5IG9yIEZlYnJ1YXJ5CiAgICByZXR1cm4gKCAkeSwgJG0sICRkICk7Cn0gICAgI319fQoKIyBzdWIgZ3JlZzJqZCB7e3sKCj1oZWFkMiBncmVnMmpkCgogICAgJGpkID0gZ3JlZzJqZCggJHllYXIsICRtb250aCwgJGRheSApOwoKICAgIENvbnZlcnQgZ3JlZ29yaWFuIHllYXIsbW9udGgsZGF5IHRvIGRheXMgb24gb3IgYWZ0ZXIgSmFuIDEsIDEgQ0UKICAgIChHcmVnb3JpYW4pLiAgTm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgKGUuZy4gbW9udGggb2YgMjggbWVhbnMKICAgIEFwcmlsIHR3byB5ZWFycyBhZnRlciBnaXZlbiB5ZWFyKSBmb3IgbW9udGggPCAxIG9yID4gMTIgb3IgZGF5IDwgMQogICAgb3IgPiBsYXN0IGRheSBvZiBtb250aC4KCj1jdXQKCnN1YiBncmVnMmpkIHsKICAgIHVzZSBpbnRlZ2VyOwogICAgbXkgKCAkeSwgJG0sICRkICkgPSBAXzsKICAgIG15ICRhZGo7CgogICAgIyBtYWtlIG1vbnRoIGluIHJhbmdlIDMuLjE0ICh0cmVhdCBKYW4gJiBGZWIgYXMgbW9udGhzIDEzLi4xNCBvZiBwcmV2IHllYXIpCiAgICBpZiAoICRtIDw9IDIgKSB7CiAgICAgICAgJHkgLT0gKCAkYWRqID0gKCAxNCAtICRtICkgLyAxMiApOwogICAgICAgICRtICs9IDEyICogJGFkajsKICAgICAgfSBlbHNpZiAoICRtID4gMTQgKQogICAgewogICAgICAgICR5ICs9ICggJGFkaiA9ICggJG0gLSAzICkgLyAxMiApOwogICAgICAgICRtIC09IDEyICogJGFkajsKICAgIH0KCiAgICAjIG1ha2UgeWVhciBwb3NpdGl2ZSAob2gsIGZvciBhIHVzZSBpbnRlZ2VyICdzYW5lX2RpdichKQogICAgaWYgKCAkeSA8IDAgKSB7CiAgICAgICAgJGQgLT0gMTQ2MDk3ICogKCAkYWRqID0gKCAzOTkgLSAkeSApIC8gNDAwICk7CiAgICAgICAgJHkgKz0gNDAwICogJGFkajsKICAgIH0KCiAgICAjIGFkZDogZGF5IG9mIG1vbnRoLCBkYXlzIG9mIHByZXZpb3VzIDAtMTEgbW9udGggcGVyaW9kIHRoYXQgYmVnYW4gdy9NYXJjaCwKICAgICMgZGF5cyBvZiBwcmV2aW91cyAwLTM5OSB5ZWFyIHBlcmlvZCB0aGF0IGJlZ2FuIHcvTWFyY2ggb2YgYSA0MDAtbXVsdGlwbGUKICAgICMgeWVhciksIGRheXMgb2YgYW55IDQwMC15ZWFyIHBlcmlvZHMgYmVmb3JlIHRoYXQsIGFuZCAzMDYgZGF5cyB0byBhZGp1c3QKICAgICMgZnJvbSBNYXIgMSwgeWVhciAwLXJlbGF0aXZlIHRvIEphbiAxLCB5ZWFyIDEtcmVsYXRpdmUgKHdoZXcpCgogICAgJGQgKz0gKCAkbSAqIDM2NyAtIDEwOTQgKSAvIDEyICsgJHkgJSAxMDAgKiAxNDYxIC8gNCArCiAgICAgICggJHkgLyAxMDAgKiAzNjUyNCArICR5IC8gNDAwICkgLSAzMDY7Cn0gICAgIyB9fX0KCiMgc3ViIGRheXNfdGhpc195ZWFyIHt7ewoKPWhlYWQyIGRheXNfdGhpc195ZWFyCgogICR5ZGF5ID0gRGF0ZTo6SUNhbDo6ZGF5c190aGlzX3llYXIoJGRheSwgJG1vbnRoLCAkeWVhcik7CgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBzbyBmYXIgdGhpcyB5ZWFyLiBBbmFsb2dvdXMgdG8gdGhlIHlkYXkKYXR0cmlidXRlIG9mIGdtdGltZSAob3IgbG9jYWx0aW1lKSBleGNlcHQgdGhhdCBpdCB3b3JrcyBvdXRzaWRlIG9mIHRoZQplcG9jaC4KCj1jdXQKCnN1YiBkYXlzX3RoaXNfeWVhciB7CiAgICBteSAoICRkLCAkbSwgJHkgKSA9IEBfOwogICAgbXkgQG1saXN0ID0gJm1vbnRocygkeSk7CiAgICByZXR1cm4gJG1saXN0WyRtIC0gMV0gKyAkZCAtIDE7Cn0gICAgI319fQoKIyBzdWIgZGF5X29mX3dlZWsge3t7Cgo9aGVhZDIgZGF5X29mX3dlZWsKCiAgICBteSAkZGF5X29mX3dlZWsgPSAkZGF0ZS0+ZGF5X29mX3dlZWsKClJldHVybnMgdGhlIGRheSBvZiB3ZWVrIGFzIDAuLjYgKDAgaXMgU3VuZGF5LCA2IGlzIFNhdHVyZGF5KS4KCj1jdXQKCnN1YiBkYXlfb2Zfd2VlayB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgcmV0dXJuICRzZWxmLT57anVsaWFufSAlIDc7Cn0gICAgI319fQoKIyBzdWIgaG91ciB7e3sKCj1oZWFkMiBob3VyCgogICAgbXkgJGhvdXIgPSAkZGF0ZS0+aG91cgoKUmV0dXJucyB0aGUgaG91ciBvZiB0aGUgZGF5LgoKSG91ciBpcyBpbiB0aGUgcmFuZ2UgMC4uMjMKCj1jdXQKCnN1YiBob3VyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMl07Cn0gIyB9fX0KCiMgc3ViIG1pbiB7e3sKCj1oZWFkMiBtaW4KCiAgICBteSAkbWluID0gJGRhdGUtPm1pbjsKClJldHVybnMgdGhlIG1pbnV0ZS4KCk1pbnV0ZSBpcyBpbiB0aGUgcmFuZ2UgMC4uNTkKCj1jdXQKCnN1YiBtaW4gewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIHJldHVybiAoICRzZWxmLT5wYXJzZXRpbWUgKVsxXTsKfQoKc3ViIG1pbnV0ZSB7IHJldHVybiBtaW4oQF8pOyB9CgojIH19fQoKIyBzdWIgc2VjIHt7ewoKPWhlYWQyIHNlYwoKICAgIG15ICRzZWMgPSAkZGF0ZS0+c2VjOwoKUmV0dXJucyB0aGUgc2Vjb25kLgoKU2Vjb25kIGlzIGluIHRoZSByYW5nZSAwLi42MC4gVGhlIHZhbHVlIG9mIDYwIGlzIChtYXliZSkgbmVlZGVkIGZvcgpsZWFwIHNlY29uZHMuIEJ1dCBJJ20gbm90IHN1cmUgaWYgd2UncmUgZ29pbmcgdG8gZ28gdGhlcmUuCgo9Y3V0CgpzdWIgc2VjIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICByZXR1cm4gKCAkc2VsZi0+cGFyc2V0aW1lIClbMF07Cn0KCnN1YiBzZWNvbmQgeyByZXR1cm4gc2VjKEBfKTsgfQoKIyB9fX0KCiMgc3ViIHBhcnNldGltZSB7e3sKCj1iZWdpbiBpbnRlcm5hbAoKICggJHNlYywgJG1pbiwgJGhvdXIgKSA9IHBhcnNldGltZSggJHNlY29uZHMgKTsKCkdpdmVuIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzbyBmYXIgdG9kYXksIHJldHVybnMgdGhlIHNlY29uZHMsCm1pbnV0ZXMsIGFuZCBob3VycyBvZiB0aGUgY3VycmVudCB0aW1lLgoKPWVuZCBpbnRlcm5hbAoKPWN1dAoKc3ViIHBhcnNldGltZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRpbWUgPSAkc2VsZi0+e2p1bHNlY307CgogICAgbXkgJGhvdXIgPSBpbnQoICR0aW1lIC8gMzYwMCApOwogICAgJHRpbWUgLT0gJGhvdXIgKiAzNjAwOwoKICAgIG15ICRtaW4gPSBpbnQoICR0aW1lIC8gNjAgKTsKICAgICR0aW1lIC09ICRtaW4gKiA2MDsKCiAgICByZXR1cm4gKCBpbnQoJHRpbWUpLCAkbWluLCAkaG91ciApOwp9ICMgfX19CgojIHN1YiBqdWxpYW4vamQgI3t7ewoKPWhlYWQyIGp1bGlhbgoKICBteSAkamQgPSAkZGF0ZS0+amQ7CgpSZXR1cm5zIGEgbGlzdHJlZiwgY29udGFpbmluZyB0d28gZWxlbWVudHMuIFRoZSBkYXRlIGFzIGEganVsaWFuIGRheSwKYW5kIHRoZSB0aW1lIGFzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4gVGhpcyBzaG91bGQgbm90IApiZSB0aG91Z2h0IG9mIGFzIGEgcmVhbCBqdWxpYW4gZGF5LCBiZWNhdXNlIGl0J3Mgbm90LiBUaGUgbW9kdWxlIGlzCmludGVybmFsbHkgY29uc2lzdGVudCwgYW5kIHRoYXQncyBlbm91Z2guCgpUaGlzIG1ldGhvZCByZWFsbHkgb25seSBpcyBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKdmVyc2lvbnMsIGFzIHRoZSBqZCBtZXRob2QgaXMgbm93IHRocm93biBvdmVyIGZvciBwbGFpbiBoYXNoIHJlZmVyZW5jZXMuCgpTZWUgdGhlIGZpbGUgSU5URVJOQUxTIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW50ZXJuYWwKZm9ybWF0LgoKPWN1dAoKc3ViIGpkIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgaWYgKCBteSAkamQgPSBzaGlmdCApIHsKICAgICAgICAoICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9ICkgPSBAJGpkOwogICAgfQoKICAgIHJldHVybiBbICRzZWxmLT57anVsaWFufSwgJHNlbGYtPntqdWxzZWN9IF07Cn0KCnN1YiBqdWxpYW4geyByZXR1cm4gamQoQF8pIH0KCiMgSU5URVJOQUwgT05MWTogZmlndXJlcyBvdXQgd2hhdCB0aGUgVVRDIG9mZnNldCAoaW4gSEhNTSkgaXMKIyBpcyBmb3IgdGhlIGN1cnJlbnQgbWFjaGluZS4Kc3ViIF9jYWxjX2xvY2FsX29mZnNldCB7CgogICAgdXNlIFRpbWU6OkxvY2FsOwogICAgbXkgQHQgPSBnbXRpbWU7CgogICAgbXkgJGxvY2FsID0gdGltZWxvY2FsKEB0KTsKICAgIG15ICRnbSAgICA9IHRpbWVnbShAdCk7CgogICAgbXkgJHNlY2RpZmYgPSAkZ20gLSAkbG9jYWw7CiAgICByZXR1cm4gb2Zmc2V0X2Zyb21fc2Vjb25kcygkc2VjZGlmZik7Cn0KCiN9fX0KCjE7CgojIE1vcmUgZG9jcyB7e3sKCj1oZWFkMSBUT0RPCgo9b3ZlciA0IAoKPWl0ZW0gLSBhZGQgZ210aW1lIGFuZCBsb2NhbHRpbWUgbWV0aG9kcywgcGVyaGFwcz8KCj1pdGVtIC0gRml4IHRoZSBJTlRFUk5BTFMgZmlsZSBzbyB0aGF0IGl0IGFjdHVhbGx5IHJlZmxlY3RzIHJlYWxpdHkKCj1iYWNrCgo9aGVhZDEgSU5URVJOQUxTCgpQbGVhc2Ugc2VlIHRoZSBmaWxlIElOVEVSTkFMUyBmb3IgZGlzY3Vzc2lvbiBvbiB0aGUgaW50ZXJuYWxzLgoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAoRHJCYWNjaHVzKSByYm93ZW5AcmNib3dlbi5jb20KCkFuZCB0aGUgcmVzdCBvZiB0aGUgUmVlZmtub3QgdGVhbS4gU2VlIHRoZSBzb3VyY2UgZm9yIGEgZnVsbApsaXN0IG9mIHBhdGNoIGNvbnRyaWJ1dG9ycyBhbmQgdmVyc2lvbi1ieS12ZXJzaW9uIG5vdGVzLgoKPWhlYWQxIFNFRSBBTFNPCgpkYXRldGltZUBwZXJsLm9yZyBtYWlsaW5nIGxpc3QKCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8KClRpbWU6OkxvY2FsCgpOZXQ6OklDYWwKCj1jdXQKCiN9fX0KCg==
IyAkSGVhZGVyOiAvY3Zzcm9vdC9kYXRlLWxlYXB5ZWFyL2xpYi9EYXRlL0xlYXB5ZWFyLnBtLHYgMS43MSAyMDAyLzA4LzMwIDAwOjAwOjI1IHJib3dlbiBFeHAgJApwYWNrYWdlIERhdGU6OkxlYXB5ZWFyOwp1c2Ugc3RyaWN0OwoKdXNlIEV4cG9ydGVyOwp1c2UgdmFycyBxdyhASVNBIEBFWFBPUlQgJFZFUlNJT04pOwpASVNBID0gcXcoRXhwb3J0ZXIpOwoKQEVYUE9SVCA9IHF3KCBpc2xlYXAgKTsKJFZFUlNJT04gPSAoIHF3JyRSZXZpc2lvbjogMS43MiAkJyApWzFdOwoKPWhlYWQxIE5BTUUKCkRhdGU6OkxlYXB5ZWFyIC0gSXMgYSBwYXJ0aWN1bGFyIHllYXIgYSBsZWFwIHllYXI/Cgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIERhdGU6OkxlYXB5ZWFyOwogIGlmICggaXNsZWFwKDE5NDUpICkgewogICAgLi4uCiAgfQoKPWhlYWQxIERFU0NSSVBUSU9OCgpEYXRlOjpMZWFweWVhciBleHBvcnRzIG9uZSBmdW5jdGlvbiAtIGlzbGVhcCAtIHdoaWNoIHJldHVybnMgMSBvciAwIGlmCmEgeWVhciBpcyBsZWFwLCBvciBub3QsIHJlc3BlY3RpdmVseS4KCj1oZWFkMSBpc2xlYXAKCiAgICAkdHJ1ZSA9IGlzbGVhcCggMjAwNCApOwoKUmV0dXJucyAxIGluIGEgbGVhcCB5ZWFyLCAwIG90aGVyd2lzZS4KCj1jdXQKCnN1YiBpc2xlYXAgewogICAgbXkgKCR5ZWFyKSA9IEBfOwogICAgcmV0dXJuIDEgaWYgKCggJHllYXIgJSA0MDAgKSA9PSAwICk7ICMgNDAwJ3MgYXJlIGxlYXAKICAgIHJldHVybiAwIGlmICgoICR5ZWFyICUgMTAwICkgPT0gMCApOyAjIE90aGVyIGNlbnR1cmllcyBhcmUgbm90CiAgICByZXR1cm4gMSBpZiAoKCAkeWVhciAlIDQgKSA9PSAwICk7ICMgQWxsIG90aGVyIDQncyBhcmUgbGVhcAogICAgcmV0dXJuIDA7ICMgRXZlcnl0aGluZyBlbHNlIGlzIG5vdAp9CgoxOwoKPWhlYWQxIEFVVEhPUgoKUmljaCBCb3dlbiAocmJvd2VuQHJjYm93ZW4uY29tKQoKPWN1dAoK
cGFja2FnZSBEYXRlOjpJQ2FsOjpEdXJhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSBDYXJwOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04gKTsKJFZFUlNJT04gPSAocXcnJFJldmlzaW9uOiAxLjYxICQnKVsxXTsKCiMgRG9jdW1lbnRhdGlvbiB7e3sKCj1oZWFkMSBOQU1FCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiAtIGR1cmF0aW9ucyBpbiBpQ2FsZW5kYXIgZm9ybWF0LCBmb3IgbWF0aCBwdXJwb3Nlcy4KCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNjEgJAoKPWhlYWQxIFNZTk9QU0lTCgogICAgdXNlIERhdGU6OklDYWw6OkR1cmF0aW9uOwoKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggaWNhbCA9PiAnLVAxVzNEVDJIM000NVMnICk7CgogICAgJGQgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3KCB3ZWVrcyA9PiAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VycyA9PiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzID0+IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0+IDQ1KTsgCgogICAgIyBhIG9uZSBob3VyIGR1cmF0aW9uLCB3aXRob3V0IG90aGVyIGNvbXBvbmVudHMKICAgICRkID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyggc2Vjb25kcyA9PiAiMzYwMCIpOyAKCiAgICAjIFJlYWQtb25seSBhY2Nlc3NvcnM6CiAgICAkZC0+d2Vla3M7CiAgICAkZC0+ZGF5czsKICAgICRkLT5ob3VyczsKICAgICRkLT5taW51dGVzOwogICAgJGQtPnNlY29uZHM7CiAgICAkZC0+c2lnbjsKCiAgICAjIFRPRE86IFJlc29sdmUgc2lnbigpIGRpc2N1c3Npb24gZnJvbSByay1kZXZlbCBhbmQgdXBkYXRlIHN5bm9wc2lzLgogICAgCiAgICAkZC0+YXNfc2Vjb25kcyAoKTsgICAjIHJldHVybnMganVzdCBzZWNvbmRzCiAgICAkZC0+YXNfZWxlbWVudHMgKCk7ICAjIHJldHVybnMgYSBoYXNoIG9mIGVsZW1lbnRzLCBsaWtlIHRoZSBhY2Nlc3NvcnMgYWJvdmUKICAgICRkLT5hc19pY2FsKCk7ICAgICAgICMgcmV0dXJucyBhbiBpQ2FsZW5kYXIgZHVyYXRpb24gc3RyaW5nCiAgICAKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIGlzIGEgdHJpdmlhbCBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGR1cmF0aW9uIG9iamVjdHMsIGZvciBkb2luZyBtYXRoCmluIERhdGU6OklDYWwKCj1oZWFkMSBBVVRIT1IKClJpY2ggQm93ZW4sIGFuZCB0aGUgUmVlZmtub3QgdGVhbS4gQWxhcywgUmVlZmtub3QgaXMgbm8gbW9yZS4gU2VlCmh0dHA6Ly9kYXRldGltZS5wZXJsLm9yZy8gZm9yIG1vcmUgbW9kZXJuIG1vZHVsZXMuCgpMYXN0IHRvdWNoZWQgYnkgJEF1dGhvcjogcmJvd2VuICQKCj1oZWFkMSBNRVRIT0RTCgpEYXRlOjpJQ2FsOjpEdXJhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGF2YWlsYWJsZToKCj1oZWFkMiBuZXcKCkEgbmV3IERhdGU6OklDYWw6OkR1cmF0aW9uIG9iamVjdCBjYW4gYmUgY3JlYXRlZCB3aXRoIGFuIGlDYWxlbmRhciBzdHJpbmcgOgoKICAgIG15ICRpY2FsID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIGljYWwgPT4gJ1AzVzJEJyApOwogICAgIyAzIHdlZWtzLCAyIGRheXMsIHBvc2l0aXZlIGRpcmVjdGlvbgogICAgbXkgJGljYWwgPSBEYXRlOjpJQ2FsOjpEdXJhdGlvbi0+bmV3ICggaWNhbCA9PiAnLVA2SDNNMzBTJyApOwogICAgIyA2IGhvdXJzLCAzIG1pbnV0ZXMsIDMwIHNlY29uZHMsIG5lZ2F0aXZlIGRpcmVjdGlvbgogICAgCk9yIHdpdGggYSBudW1iZXIgb2Ygc2Vjb25kczoKCiAgICBteSAkaWNhbCA9IERhdGU6OklDYWw6OkR1cmF0aW9uLT5uZXcgKCBzZWNvbmRzID0+ICIzNjAwIiApOwogICAgIyBvbmUgaG91ciBwb3NpdGl2ZQoKT3IsIGJldHRlciBzdGlsbCwgY3JlYXRlIGl0IHdpdGggY29tcG9uZW50cwoKICAgIG15ICRkYXRlID0gRGF0ZTo6SUNhbDo6RHVyYXRpb24tPm5ldyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcyA9PiA2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5cyA9PiAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cnMgPT4gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcyA9PiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9PiA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9PiAiKyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKClRoZSBzaWduIGRlZmF1bHRzIHRvICIrIiwgYnV0ICIrIiBhbmQgIi0iIGFyZSBsZWdhbCB2YWx1ZXMuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPWN1dAoKI319fQoKI3t7eyBzdWIgbmV3CgpzdWIgbmV3IHsKICAgIG15ICgkY2xhc3MsICVhcmdzKSA9IEBfOwogICAgbXkgJHZlcmlmaWVkID0ge307CiAgICBteSAkc2VsZiA9IHt9OwogICAgYmxlc3MgJHNlbGYsICRjbGFzczsKCiAgICBteSAkc2Vjb25kc19vbmx5ID0gMTsgICAgIyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZSBnaXZlbiBsZW5ndGggaW4gc2Vjb25kcyBvbmx5CiAgICAkc2Vjb25kc19vbmx5ID0gMCB1bmxlc3MgKGRlZmluZWQgJGFyZ3N7J3NlY29uZHMnfSk7IAoKICAgICMgSWYgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZXkgYWxsIG11c3QgYmUKICAgICMgbmVnYXRpdmUuIE90aGVyd2lzZSwgd2UncmUgbm90IHN1cmUgd2hhdCB0aGlzIG1lYW5zLgogICAgZm9yZWFjaCAocXcoaG91cnMgbWludXRlcyBzZWNvbmRzIGRheXMgd2Vla3MpKSB7CiAgICAgICAgaWYgKGRlZmluZWQoJGFyZ3N7JF99KSApICAgewogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGlzIGFyZ3VtZW50IGlzIGFsbCBkaWdpdHMsIG9wdGlvbmFsIC0gc2lnbgogICAgICAgICAgICBpZiAoJGFyZ3N7JF99ID1+IG0vLT9bMC05XSskLykgeyAKICAgICAgICAgICAgICAgIGlmICgkYXJnc3skX30gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7c2lnbn0gPSAnLSc7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3N7JF99ID0gYWJzKCRhcmdzeyRffSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdmVyaWZpZWQtPnskX30gPSAkYXJnc3skX307CiAgICAgICAgICAgICAgICB1bmxlc3MgKCRfIGVxICdzZWNvbmRzJykgewogICAgICAgICAgICAgICAgICAgICRzZWNvbmRzX29ubHkgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FycCAoIlBhcmFtZXRlciAkXyBjb250YWlucyBub24tbnVtZXJpYyB2YWx1ZSAiIC4gJGFyZ3N7JF99IC4gIlxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGRlZmluZWQgKCRhcmdze3NpZ259KSApIHsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhpcyBhcmd1bWVudCArIG9yIC0KICAgICAgICBpZiAoJGFyZ3N7c2lnbn0gPX4gbS9bKy1dLykgewogICAgICAgICAgICAjIGlmIHNvLCBhc3NpZ24gaXQKICAgICAgICAgICAgJHNlbGYtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gMSA6IC0xOwogICAgICAgICAgICAkdmVyaWZpZWQtPntzaWdufSA9ICgkYXJnc3tzaWdufSBlcSAiKyIpID8gJysnIDogJy0nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNhcnAgKCJQYXJhbWV0ZXIgc2lnbiBjb250YWlucyBhIHZhbHVlIG90aGVyIHRoYW4gKyBvciAtIDogIgogICAgICAgICAgICAgICAgLiAkYXJnc3tzaWdufSAuICJcbiIpOwogICAgICAgIH0KICAgICAgICAKICAgIH0KCiAgICAjIElmIGEgbnVtYmVyIGlzIGdpdmVuLCBjb252ZXJ0IGl0IHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcywKICAgICMgYnV0ICpkb24ndCogZXh0cmFjdCBkYXlzIC0tIHdlIHdhbnQgaXQgdG8gcmVwcmVzZW50IGFuIGFic29sdXRlCiAgICAjIGFtb3VudCBvZiB0aW1lLCByZWdhcmRsZXNzIG9mIHRpbWV6b25lCiAgICBpZiAoJHNlY29uZHNfb25seSkgeyAjIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW50ZWdlciB0aW1lX3QKICAgICAgICAkc2VsZi0+X3NldF9mcm9tX3NlY29uZHMoJGFyZ3N7J3NlY29uZHMnfSk7CiAgICB9IGVsc2lmIChkZWZpbmVkICgkYXJnc3snaWNhbCd9KSApIHsgICAKICAgICAgICAjIEEgc3RhbmRhcmQgZHVyYXRpb24gc3RyaW5nCiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBpY2FsXG4iOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21faWNhbCgkYXJnc3snaWNhbCd9KTsKICAgIH0gZWxzaWYgKG5vdCAkc2Vjb25kc19vbmx5KSB7CiAgICAgICAgI3dhcm4gInNldHRpbmcgZnJvbSBjb21wb25lbnRzIjsKICAgICAgICAjdXNlIERhdGE6OkR1bXBlcjsgd2FybiBEdW1wZXIgJHZlcmlmaWVkOwogICAgICAgICRzZWxmLT5fc2V0X2Zyb21fY29tcG9uZW50cygkdmVyaWZpZWQpOwogICAgfQogICAgCiAgICByZXR1cm4gdW5kZWYgdW5sZXNzICVhcmdzOwogICAKICAgIHJldHVybiAkc2VsZjsKfQoKI319fQoKIyBBY2Nlc3NvcnMge3t7Cgo9aGVhZDIgc2lnbiwgd2Vla3MsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzCgpSZWFkLW9ubHkgYWNjZXNzb3JzIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIG9iamVjdC4gCgo9Y3V0IAoKI319fQoKIyB7e3sgc3ViIHNpZ24gCgpzdWIgc2lnbiB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICByZXR1cm4gJHNlbGYtPntzaWdufTsKfQoKI319fQoKIyB7e3sgc3ViIHdlZWtzIAoKc3ViIHdlZWtzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ID0gJHskc2VsZi0+X3dkfVswXTsKICAgIHJldHVybiB1bmxlc3MgJHc7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICR3Owp9CgojfX19CgojIHt7eyBzdWIgZGF5cyAKCnN1YiBkYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRkID0gJHskc2VsZi0+X3dkfVsxXTsKICAgIHJldHVybiB1bmxlc3MgJGQ7CiAgICByZXR1cm4gICRzZWxmLT57c2lnbn0gKiAkZDsKCn0gI319fQoKI3t7eyBzdWIgaG91cnMgCgpzdWIgaG91cnMgewogICAgbXkgKCRzZWxmKSA9IEBfOwogICAgbXkgJGggPSAkeyRzZWxmLT5faG1zfVswXTsKICAgIHJldHVybiB1bmxlc3MgJGg7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICRoOwp9CgojfX19CgojIHt7eyBzdWIgbWludXRlcyAKCnN1YiBtaW51dGVzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICRtID0gJHskc2VsZi0+X2htc31bMV07CiAgICByZXR1cm4gdW5sZXNzICRtOwogICAgcmV0dXJuICRzZWxmLT57c2lnbn0gKiAkbTsKfQoKI319fQoKIyB7e3sgc3ViIHNlY29uZHMgCgpzdWIgc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CiAgICBteSAkcyA9ICR7JHNlbGYtPl9obXN9WzJdOwogICAgcmV0dXJuIHVubGVzcyAkczsKICAgIHJldHVybiAkc2VsZi0+e3NpZ259ICogJHM7Cn0KCiN9fX0KCiMgc3ViIGFzX3NlY29uZHMge3t7Cgo9aGVhZDIgYXNfc2Vjb25kcwoKUmV0dXJucyB0aGUgZHVyYXRpb24gaW4gcmF3IHNlY29uZHMuIAoKV0FSTklORyAtLSB0aGlzIGZvbGRzIGluIHRoZSBudW1iZXIgb2YgZGF5cywgYXNzdW1pbmcgdGhhdCB0aGV5IGFyZSBhbHdheXMgODY0MDAKc2Vjb25kcyBsb25nICh3aGljaCBpcyBub3QgdHJ1ZSB0d2ljZSBhIHllYXIgaW4gYXJlYXMgdGhhdCBob25vciBkYXlsaWdodApzYXZpbmdzIHRpbWUpLiAgSWYgeW91J3JlIHVzaW5nIHRoaXMgZm9yIGRhdGUgYXJpdGhtZXRpYywgY29uc2lkZXIgdXNpbmcgdGhlCkk8YWRkKCk+IG1ldGhvZCBmcm9tIGEgTDxEYXRlOjpJQ2FsPiBvYmplY3QsIGFzIHRoaXMgd2lsbCBiZWhhdmUgYmV0dGVyLgpPdGhlcndpc2UsIHlvdSBtaWdodCBleHBlcmllbmNlIHNvbWUgZXJyb3Igd2hlbiB3b3JraW5nIHdpdGggdGltZXMgdGhhdCBhcmUKc3BlY2lmaWVkIGluIGEgdGltZSB6b25lIHRoYXQgb2JzZXJ2ZXMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgoKCj1jdXQgCgpzdWIgYXNfc2Vjb25kcyB7CiAgICBteSAoJHNlbGYpID0gQF87CgogICAgbXkgJG5zZWNzID0gJHNlbGYtPntuc2Vjc30gfHwgMDsKICAgIG15ICRuZGF5cyA9ICRzZWxmLT57bmRheXN9IHx8IDA7CiAgICBteSAkc2lnbiAgPSAkc2VsZi0+e3NpZ259ICB8fCAxOwogICAgcmV0dXJuICRzaWduKigkbnNlY3MrKCRuZGF5cyoyNCo2MCo2MCkpOwp9CgojfX19CgojIHN1YiBhc19kYXlzIHt7ewoKPWhlYWQyIGFzX2RheXMKCiAgICAkZGF5cyA9ICRkdXJhdGlvbi0+YXNfZGF5czsKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgbnVtYmVyIG9mIGRheXMuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZQpDPGRheXM+IG1ldGhvZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRheXMsIHJhdGhlcgp0aGFuIG1vZCdpbmcgb3V0IHRoZSBjb21wbGV0ZSB3ZWVrcy4gVGh1cywgaWYgd2UgaGF2ZSBhIGR1cmF0aW9uIG9mIDMzCmRheXMsIEM8d2Vla3M+IHdpbGwgcmV0dXJuIDQsIEM8ZGF5cz4gd2lsbCByZXR1cm4gNSwgYnV0IEM8YXNfZGF5cz4gd2lsbApyZXR1cm4gMzMuCgpOb3RlIHRoYXQgdGhpcyBpcyBhIGxhenkgY29udmVuaWVuY2UgZnVuY3Rpb24gd2hpY2ggaXMganVzdCB3ZWVrcyo3ICsKZGF5cy4KCj1jdXQKCnN1YiBhc19kYXlzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICByZXR1cm4gJHNlbGYtPntzaWdufSAqICggJHdkLT5bMF0qNyArICR3ZC0+WzFdICk7Cn0jIH19fQoKI3t7eyBzdWIgYXNfaWNhbCAKCj1oZWFkMiBhc19pY2FsCgpSZXR1cm4gdGhlIGR1cmF0aW9uIGluIGFuIGlDYWxlbmRhciBmb3JtYXQgdmFsdWUgc3RyaW5nIChlLmcuLCAiUFQySDBNMFMiKQoKPWN1dCAKCnN1YiBhc19pY2FsIHsKICAgIG15ICgkc2VsZikgPSBAXzsKCiAgICBteSAkdHBhcnQgPSAnJzsKCiAgICBpZiAobXkgJGFyX2htcyA9ICRzZWxmLT5faG1zKSB7CiAgICAgICAgJHRwYXJ0ID0gc3ByaW50ZignVCVkSCVkTSVkUycsIEAkYXJfaG1zKTsKICAgIH0KCiAgICBteSAkYXJfd2QgPSAkc2VsZi0+X3dkKCk7CiAgICAKICAgIG15ICRkcGFydCA9ICcnOwogICAgaWYgKGRlZmluZWQgJGFyX3dkKSB7CiAgICAgICAgbXkgKCR3ZWVrcywgJGRheXMpID0gQCRhcl93ZDsKICAgICAgICBpZiAoJHdlZWtzICYmICRkYXlzKSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkVyVkRCcsICR3ZWVrcywgJGRheXMpOwogICAgICAgIH0gZWxzaWYgKCR3ZWVrcykgeyAgICMgKGlmIGRheXMgPSAwKQogICAgICAgICAgICAkZHBhcnQgPSBzcHJpbnRmKCclZFcnLCAkd2Vla3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRkcGFydCA9IHNwcmludGYoJyVkRCcsICRkYXlzKTsKICAgICAgICB9CiAgICB9CgogICAgIyBwdXQgYSBzaWduIGluIHRoZSByZXR1cm4gdmFsdWUgaWYgbmVjZXNzYXJ5CiAgICBteSAkdmFsdWUgPSBqb2luKCcnLCAoKCRzZWxmLT57c2lnbn0gPCAwKSA/ICctJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgJ1AnLCAkZHBhcnQsICR0cGFydCk7CgogICAgIyByZW1vdmUgYW55IHplcm8gY29tcG9uZW50cyBmcm9tIHRoZSB0aW1lIHN0cmluZyAoLVAxMEQwSCAtPiAtUDEwRCkKICAgICR2YWx1ZSA9fiBzLyg/PD1bXlxkXSkwW1dESE1TXS8vZzsKCiAgICAjIHJldHVybiBlaXRoZXIgdGhlIHRpbWUgdmFsdWUgb3IgUFQwUyAoaWYgdGhlIHRpbWUgdmFsdWUgaXMgemVybykuCiAgICByZXR1cm4gKCgkdmFsdWUgIX4gL1BUPyQvKSA/ICR2YWx1ZSA6ICdQVDBTJyk7Cn0KCiN9fX0KCiN7e3sgc3ViIGFzX2VsZW1lbnRzCgo9aGVhZDIgYXNfZWxlbWVudHMKClJldHVybnMgdGhlIGR1cmF0aW9uIGFzIGEgaGFzaHJlZiBvZiBlbGVtZW50cy4gCgo9Y3V0IAoKc3ViIGFzX2VsZW1lbnRzIHsKICAgIG15ICgkc2VsZikgPSBAXzsKICAgCiAgICAjIGdldCB2YWx1ZXMgZm9yIGFsbCB0aGUgZWxlbWVudHMKICAgIG15ICR3ZCA9ICRzZWxmLT5fd2Q7CiAgICBteSAkaG1zID0gJHNlbGYtPl9obXM7CiAgIAogICAgbXkgJHJldHVybiA9IHsKICAgICAgICBzaWduID0+ICRzZWxmLT57c2lnbn0sIAogICAgICAgIHdlZWtzID0+ICR7JHdkfVswXSwKICAgICAgICBkYXlzID0+ICR7JHdkfVsxXSwKICAgICAgICBob3VycyA9PiAkeyRobXN9WzBdLAogICAgICAgIG1pbnV0ZXMgPT4gJHskaG1zfVsxXSwKICAgICAgICBzZWNvbmRzID0+ICR7JGhtc31bMl0sCiAgICB9OwogICAgcmV0dXJuICRyZXR1cm47Cn0KCiN9fX0KCiMgSU5URVJOQUxTIHt7ewoKPWhlYWQxIElOVEVSTkFMUwoKaGVhZDIgR0VORVJBTCBNT0RFTAoKSW50ZXJuYWxseSwgd2Ugc3RvcmUgMyBkYXRhIHZhbHVlczogYSBudW1iZXIgb2YgZGF5cywgYSBudW1iZXIgb2Ygc2Vjb25kcyAoYW55dGhpbmcKc2hvcnRlciB0aGFuIGEgZGF5KSwgYW5kIGEgc2lnbiAoMSBvciAtMSkuIFdlIGFyZSBhc3N1bWluZyB0aGF0IGEgZGF5IGlzIDI0IGhvdXJzIGZvcgpwdXJwb3NlcyBvZiB0aGlzIG1vZHVsZTsgeWVzLCB3ZSBrbm93IHRoYXQncyBub3QgY29tcGxldGVseSBhY2N1cmF0ZSBiZWNhdXNlIG9mCmRheWxpZ2h0LXNhdmluZ3MtdGltZSBzd2l0Y2hvdmVycywgYnV0IGl0J3MgbW9zdGx5IGNvcnJlY3QuIFN1Z2dlc3Rpb25zIGFyZSB3ZWxjb21lLgoKTk9URTogVGhlIG1ldGhvZHMgYmVsb3cgU0hPVUxEIE5PVCBiZSByZWxpZWQgb24gdG8gc3RheSB0aGUgc2FtZSBpbiBmdXR1cmUgdmVyc2lvbnMuCgo9aGVhZDIgX3NldF9mcm9tX2ljYWwgKCRzZWxmLCAkZHVyYXRpb25fc3RyaW5nKQoKQ29udmVydHMgYSBSRkMyNDQ1IERVUkFUSU9OIGZvcm1hdCBzdHJpbmcgdG8gdGhlIGludGVybmFsIHN0b3JhZ2UgZm9ybWF0LgoKPWN1dAoKI319fQoKIyBzdWIgX3NldF9mcm9tX2ljYWwgKGludGVybmFsKSB7e3sKCnN1YiBfc2V0X2Zyb21faWNhbCB7CiAgICBteSAoJHNlbGYsICRzdHIpID0gQF87CgogICAgbXkgJHBhcnNlZF92YWx1ZXMgPSBfcGFyc2VfaWNhbF9zdHJpbmcoJHN0cik7CiAgICAKICAgIHJldHVybiAkc2VsZi0+X3NldF9mcm9tX2NvbXBvbmVudHMoJHBhcnNlZF92YWx1ZXMpOwp9ICMgfX19CgojIHN1YiBfcGFyc2VfaWNhbF9zdHJpbmcgKGludGVybmFsKSB7e3sKCj1oZWFkMiBfcGFyc2VfaWNhbF9zdHJpbmcgKCRzdHJpbmcpCgpSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgaUNhbGVuZGFyIGludG8gdXNhYmxlIHZhbHVlcy4gCgo9Y3V0CgpzdWIgX3BhcnNlX2ljYWxfc3RyaW5nIHsKICAgIG15ICgkc3RyKSA9IEBfOwogICAgCiAgICAjIFJGQyAyNDQ1IHNlY3Rpb24gNC4zLjYKICAgICMKICAgICMgZHVyLXZhbHVlICA9IChbIisiXSAvICItIikgIlAiIChkdXItZGF0ZSAvIGR1ci10aW1lIC8gZHVyLXdlZWspCiAgICAjIGR1ci1kYXRlICAgPSBkdXItZGF5IFtkdXItdGltZV0KICAgICMgZHVyLXRpbWUgICA9ICJUIiAoZHVyLWhvdXIgLyBkdXItbWludXRlIC8gZHVyLXNlY29uZCkKICAgICMgZHVyLXdlZWsgICA9IDEqRElHSVQgIlciCiAgICAjIGR1ci1ob3VyICAgPSAxKkRJR0lUICJIIiBbZHVyLW1pbnV0ZV0KICAgICMgZHVyLW1pbnV0ZSA9IDEqRElHSVQgIk0iIFtkdXItc2Vjb25kXQogICAgIyBkdXItc2Vjb25kID0gMSpESUdJVCAiUyIKICAgICMgZHVyLWRheSAgICA9IDEqRElHSVQgIkQiCgogICAgbXkgKCRzaWduX3N0ciwgJG1hZ2ljLCAkd2Vla3MsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPQogICAgICAgICRzdHIgPX4gbXsKICAgICAgICAgICAgKFtcK1wtXSk/ICAgKD8jIFNpZ24pCiAgICAgICAgICAgIChQKSAgICAgKD8jICdQJyBmb3IgcGVyaW9kPyBUaGlzIGlzIG91ciBtYWdpYyBjaGFyYWN0ZXIpCiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgKD86KFxkKylXKT8gKD8jIFdlZWtzKQogICAgICAgICAgICAgICAgKD86KFxkKylEKT8gKD8jIERheXMpCiAgICAgICAgICAgICk/CiAgICAgICAgICAgICg/OlQgICAgICAgICg/IyBUaW1lIHByZWZpeCkKICAgICAgICAgICAgICAgICg/OihcZCspSCk/ICg/IyBIb3VycykKICAgICAgICAgICAgICAgICg/OihcZCspTSk/ICg/IyBNaW51dGVzKQogICAgICAgICAgICAgICAgKD86KFxkKylTKT8gKD8jIFNlY29uZHMpCiAgICAgICAgICAgICk/CiAgICAgICAgfXg7CgogICAgaWYgKCFkZWZpbmVkKCRtYWdpYykpIHsKICAgICAgICBjYXJwICJJbnZhbGlkIGR1cmF0aW9uOiAkc3RyIjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9CgogICAgIyBtYWtlIHN1cmUgdGhlIHNpZ24gZ2V0cyBzZXQsIGFuZCB0dXJuIGl0IGludG8gYW4gaW50ZWdlciBtdWx0aXBsaWVyCiAgICAkc2lnbl9zdHIgfHw9ICIrIjsKICAgIG15ICRzaWduID0gKCRzaWduX3N0ciBlcSAiLSIpID8gLTEgOiAxOwogICAgCiAgICBteSAkcmV0dXJuID0ge307CiAgICAkcmV0dXJuLT57J3dlZWtzJ30gPSAkd2Vla3M7CiAgICAkcmV0dXJuLT57J2RheXMnfSA9ICRkYXlzOwogICAgJHJldHVybi0+eydob3Vycyd9ID0gJGhvdXJzOwogICAgJHJldHVybi0+eydtaW51dGVzJ30gPSAkbWludXRlczsKICAgICRyZXR1cm4tPnsnc2Vjb25kcyd9ID0gJHNlY29uZHM7CiAgICAkcmV0dXJuLT57J3NpZ24nfSA9ICRzaWduOwoKICAgIHJldHVybiAkcmV0dXJuOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9jb21wb25lbnRzICgkc2VsZiwgJGhhc2hyZWYpCgpDb252ZXJ0cyBmcm9tIGEgaGFzaHJlZiB0byB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3JtYXQuClRoZSBoYXNocmVmIGNhbiBjb250YWluIGVsZW1lbnRzICJzaWduIiwgIndlZWtzIiwgImRheXMiLCAiaG91cnMiLCAibWludXRlcyIsICJzZWNvbmRzIi4KCj1jdXQKCnN1YiBfc2V0X2Zyb21fY29tcG9uZW50cyB7CiAgICBteSAoJHNlbGYsICRhcmdzKSA9IEBfOwoKICAgICMgU2V0IHVwIHNvbWUgZWFzaWVyLXRvLXJlYWQgdmFyaWFibGVzCiAgICBteSAoJHNpZ24sICR3ZWVrcywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKICAgICRzaWduID0gJGFyZ3MtPnsnc2lnbid9OwogICAgJHdlZWtzID0gJGFyZ3MtPnsnd2Vla3MnfTsKICAgICRkYXlzID0gJGFyZ3MtPnsnZGF5cyd9OwogICAgJGhvdXJzID0gJGFyZ3MtPnsnaG91cnMnfTsKICAgICRtaW51dGVzID0gJGFyZ3MtPnsnbWludXRlcyd9OwogICAgJHNlY29uZHMgPSAkYXJncy0+eydzZWNvbmRzJ307CiAgICAKICAgICRzZWxmLT57c2lnbn0gPSAoZGVmaW5lZCgkc2lnbikgJiYgJHNpZ24gZXEgJy0nKSA/IC0xIDogMTsKCiAgICBpZiAoZGVmaW5lZCgkd2Vla3MpIG9yIGRlZmluZWQoJGRheXMpKSB7CiAgICAgICAgJHNlbGYtPl93ZChbJHdlZWtzIHx8IDAsICRkYXlzIHx8IDBdKTsKICAgIH0KCiAgICBpZiAoZGVmaW5lZCgkaG91cnMpIHx8IGRlZmluZWQoJG1pbnV0ZXMpIHx8IGRlZmluZWQoJHNlY29uZHMpKSB7CiAgICAgICAgJHNlbGYtPl9obXMoWyRob3VycyB8fCAwLCAkbWludXRlcyB8fCAwLCAkc2Vjb25kcyB8fCAwXSk7CiAgICB9CgogICAgcmV0dXJuICRzZWxmOwp9ICMgfX19CgojIHN1YiBfc2V0X2Zyb21faWNhbCAoaW50ZXJuYWwpIHt7ewoKPWhlYWQyIF9zZXRfZnJvbV9pY2FsICgkc2VsZiwgJG51bV9zZWNvbmRzKQoKU2V0cyBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgcHJvcGVybHkgaWYgd2Ugd2VyZSBvbmx5IGdpdmVuIHNlY29uZHMgYXMgYSBwYXJhbWV0ZXIuCgo9Y3V0CgpzdWIgX3NldF9mcm9tX3NlY29uZHMgewogICAgbXkgKCRzZWxmLCAkc2Vjb25kcykgPSBAXzsKICAgICAgICAgICAgCiAgICAkc2VsZi0+e3NpZ259ID0gKCgkc2Vjb25kcyA8IDApID8gLTEgOiAxKTsKICAgICMgZmluZCB0aGUgbnVtYmVyIG9mIGRheXMsIGlmIGFueQogICAgbXkgJG5kYXlzID0gaW50ICgkc2Vjb25kcyAvICgyNCo2MCo2MCkpOwogICAgIyBub3csIGhvdyBtYW55IGhvdXJzL21pbnV0ZXMvc2Vjb25kcyBhcmUgdGhlcmUsIGFmdGVyCiAgICAjIGRheXMgYXJlIHRha2VuIG91dD8KICAgIG15ICRuc2VjcyA9ICRzZWNvbmRzICUgKDI0KjYwKjYwKTsKICAgICRzZWxmLT57bmRheXN9ID0gYWJzKCRuZGF5cyk7CiAgICAkc2VsZi0+e25zZWNzfSA9IGFicygkbnNlY3MpOwoKCiAgICByZXR1cm4gJHNlbGY7Cn0gIyB9fX0KCiMgc3ViIF9obXMgKGludGVybmFsKSB7e3sKCj1oZWFkMiAkc2VsZi0+X2htcygpOwoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kIGNvbXBvbmVudHMsIG9yIHVuZGVmCmlmIG5zZWNzIGlzIHVuZGVmaW5lZC4gIElmIGdpdmVuIGFuIGFycmF5cmVmLCBjb21wdXRlcyB0aGUgbmV3IG5zZWNzIHZhbHVlIApmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF9obXMgewogICAgbXkgKCRzZWxmLCAkaG1zX2FycmF5cmVmKSA9IEBfOwoKICAgIGlmIChkZWZpbmVkKCRobXNfYXJyYXlyZWYpKSB7CiAgICAgICAgbXkgJG5ld19zZWNfdmFsdWUgPSAkaG1zX2FycmF5cmVmLT5bMF0qMzYwMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaG1zX2FycmF5cmVmLT5bMV0qNjAgICArICRobXNfYXJyYXlyZWYtPlsyXTsKICAgICAgICAkc2VsZi0+e25zZWNzfSA9ICgkbmV3X3NlY192YWx1ZSk7CiAgICB9IAoKICAgIG15ICRuc2VjcyA9ICRzZWxmLT57bnNlY3N9OwogICAgaWYgKGRlZmluZWQoJG5zZWNzKSkgewogICAgICAgIG15ICRob3VycyA9IGludCgkbnNlY3MvMzYwMCk7CiAgICAgICAgbXkgJG1pbnV0ZXMgID0gaW50KCgkbnNlY3MtJGhvdXJzKjM2MDApLzYwKTsKICAgICAgICBteSAkc2Vjb25kcyAgPSAkbnNlY3MgJSA2MDsKICAgICAgICByZXR1cm4gWyAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcyBdOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludCAicmV0dXJuaW5nIHVuZGVmXG4iOwogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfSAjIH19fQoKIyBzdWIgX3dkIChpbnRlcm5hbCkge3t7Cgo9aGVhZDIgJHNlbGYtPl93ZCgpIAoKUmV0dXJuIGFuIGFycmF5cmVmIHRvIHdlZWtzIGFuZCBkYXkgY29tcG9uZW50cywgb3IgdW5kZWYgaWYgbmRheXMKaXMgdW5kZWZpbmVkLiAgSWYgR2l2ZW4gYW4gYXJyYXlyZWYsIGNvbXB1dHMgdGhlIG5ldyBuZGF5cyB2YWx1ZQpmb3IgdGhlIGR1cmF0aW9uLiAgCgo9Y3V0IAoKc3ViIF93ZCAgewogICAgbXkgKCRzZWxmLCAkd2RfYXJyYXlyZWYpID0gQF87CgogICAgI3ByaW50ICJlbnRlcmluZyBfd2RcbiI7CiAgICAKICAgIGlmIChkZWZpbmVkKCR3ZF9hcnJheXJlZikpIHsKICAgICAgICAKICAgICAgICBteSAkbmV3X25kYXlzID0gJHdkX2FycmF5cmVmLT5bMF0qNyArICR3ZF9hcnJheXJlZi0+WzFdOwogICAgICAgICRzZWxmLT57bmRheXN9ID0gJG5ld19uZGF5czsKICAgIH0KICAgIAogICAgI3VzZSBEYXRhOjpEdW1wZXI7IHByaW50IER1bXBlciAkc2VsZi0+e25kYXlzfTsKICAgIAogICAgaWYgKGRlZmluZWQobXkgJG5kYXlzPSAkc2VsZi0+e25kYXlzfSkpIHsKICAgICAgICBteSAkd2Vla3MgPSBpbnQoJG5kYXlzLzcpOwogICAgICAgIG15ICRkYXlzICA9ICRuZGF5cyAlIDc7CiAgICAgICAgcmV0dXJuIFsgJHdlZWtzLCAkZGF5cyBdOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0gIyB9fX0KCjE7Cg==
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTsKCnVzZSA1LjAwNjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciAkVkVSU0lPTiA9ICcyLjAxJzsKCnVzZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7CnVzZSBGaWxlOjpTcGVjOwp1c2UgU2NhbGFyOjpVdGlsIHF3KCBibGVzc2VkICk7Cgp1c2Ugb3ZlcmxvYWQKICAgICciIicgICAgID0+IFwmYXNfc3RyaW5nLAogICAgZmFsbGJhY2sgPT4gMTsKCnN1YiBuZXcgewogICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAgICBteSAlcCAgICAgPSBAXzsKCiAgICAkcHt1bnNhZmVfcmVmX2NhcHR1cmV9ID0gIWRlbGV0ZSAkcHtub19yZWZzfQogICAgICAgIGlmIGV4aXN0cyAkcHtub19yZWZzfTsKCiAgICBteSAkc2VsZiA9IGJsZXNzIHsKICAgICAgICBpbmRleCAgPT4gdW5kZWYsCiAgICAgICAgZnJhbWVzID0+IFtdLAogICAgICAgIHJhdyAgICA9PiBbXSwKICAgICAgICAlcCwKICAgIH0sICRjbGFzczsKCiAgICAkc2VsZi0+X3JlY29yZF9jYWxsZXJfZGF0YSgpOwoKICAgIHJldHVybiAkc2VsZjsKfQoKc3ViIF9yZWNvcmRfY2FsbGVyX2RhdGEgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSAkZmlsdGVyID0gJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgIyBXZSBleGNsdWRlIHRoaXMgbWV0aG9kIGJ5IHN0YXJ0aW5nIGF0IGxlYXN0IG9uZSBmcmFtZSBiYWNrLgogICAgbXkgJHggPSAxICsgKCAkc2VsZi0+e3NraXBfZnJhbWVzfSB8fCAwICk7CgogICAgd2hpbGUgKAogICAgICAgIG15IEBjCiAgICAgICAgPSAkc2VsZi0+e25vX2FyZ3N9CiAgICAgICAgPyBjYWxsZXIoICR4KysgKQogICAgICAgIDogZG8gewogICAgICAgICAgICAjIyBubyBjcml0aWMgKE1vZHVsZXM6OlByb2hpYml0TXVsdGlwbGVQYWNrYWdlcywgVmFyaWFibGVzOjpQcm9oaWJpdFBhY2thZ2VWYXJzKQogICAgICAgICAgICBwYWNrYWdlICAgICMgdGhlIG5ld2xpbmUga2VlcHMgZHppbCBmcm9tIGFkZGluZyBhIHZlcnNpb24gaGVyZQogICAgICAgICAgICAgICAgREI7CiAgICAgICAgICAgIEBEQjo6YXJncyA9ICgpOwogICAgICAgICAgICBjYWxsZXIoICR4KysgKTsKICAgICAgICB9CiAgICAgICAgKSB7CgogICAgICAgIG15IEBhcmdzOwoKICAgICAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UHJvaGliaXRQYWNrYWdlVmFycykKICAgICAgICBAYXJncyA9ICRzZWxmLT57bm9fYXJnc30gPyAoKSA6IEBEQjo6YXJnczsKICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgIG15ICRyYXcgPSB7CiAgICAgICAgICAgIGNhbGxlciA9PiBcQGMsCiAgICAgICAgICAgIGFyZ3MgICA9PiBcQGFyZ3MsCiAgICAgICAgfTsKCiAgICAgICAgbmV4dCBpZiAkZmlsdGVyICYmICEkZmlsdGVyLT4oJHJhdyk7CgogICAgICAgIHVubGVzcyAoICRzZWxmLT57dW5zYWZlX3JlZl9jYXB0dXJlfSApIHsKICAgICAgICAgICAgJHJhdy0+e2FyZ3N9ID0gWyBtYXAgeyByZWYgJF8gPyAkc2VsZi0+X3JlZl90b19zdHJpbmcoJF8pIDogJF8gfQogICAgICAgICAgICAgICAgICAgIEB7ICRyYXctPnthcmdzfSB9IF07CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRzZWxmLT57cmF3fSB9LCAkcmF3OwogICAgfQp9CgpzdWIgX3JlZl90b19zdHJpbmcgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15ICRyZWYgID0gc2hpZnQ7CgogICAgcmV0dXJuIG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpCiAgICAgICAgaWYgYmxlc3NlZCAkcmVmICYmICRyZWYtPmlzYSgnRXhjZXB0aW9uOjpDbGFzczo6QmFzZScpOwoKICAgIHJldHVybiBvdmVybG9hZDo6QWRkclJlZigkcmVmKSB1bmxlc3MgJHNlbGYtPntyZXNwZWN0X292ZXJsb2FkfTsKCiAgICAjIyBubyBjcml0aWMgKFZhcmlhYmxlczo6UmVxdWlyZUluaXRpYWxpemF0aW9uRm9yTG9jYWxWYXJzKQogICAgbG9jYWwgJEA7CiAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgIyMgdXNlIGNyaXRpYwoKICAgIG15ICRzdHIgPSBldmFsIHsgJHJlZiAuIHF7fSB9OwoKICAgIHJldHVybiAkQCA/IG92ZXJsb2FkOjpBZGRyUmVmKCRyZWYpIDogJHN0cjsKfQoKc3ViIF9tYWtlX2ZyYW1lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICRmaWx0ZXIgPSAhJHNlbGYtPntmaWx0ZXJfZnJhbWVzX2Vhcmx5fSAmJiAkc2VsZi0+X21ha2VfZnJhbWVfZmlsdGVyKCk7CgogICAgbXkgJHJhdyA9IGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICBmb3IgbXkgJHIgKCBAeyRyYXd9ICkgewogICAgICAgIG5leHQgaWYgJGZpbHRlciAmJiAhJGZpbHRlci0+KCRyKTsKCiAgICAgICAgJHNlbGYtPl9hZGRfZnJhbWUoICRyLT57Y2FsbGVyfSwgJHItPnthcmdzfSApOwogICAgfQp9CgpteSAkZGVmYXVsdF9maWx0ZXIgPSBzdWIgezF9OwoKc3ViIF9tYWtlX2ZyYW1lX2ZpbHRlciB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15ICggQGlfcGFja19yZSwgJWlfY2xhc3MgKTsKICAgIGlmICggJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gKSB7CiAgICAgICAgIyMgbm8gY3JpdGljIChWYXJpYWJsZXM6OlJlcXVpcmVJbml0aWFsaXphdGlvbkZvckxvY2FsVmFycykKICAgICAgICBsb2NhbCAkQDsKICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICMjIHVzZSBjcml0aWMKCiAgICAgICAgJHNlbGYtPntpZ25vcmVfcGFja2FnZX0gPSBbICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IF0KICAgICAgICAgICAgdW5sZXNzIGV2YWwgeyBAeyAkc2VsZi0+e2lnbm9yZV9wYWNrYWdlfSB9IH07CgogICAgICAgIEBpX3BhY2tfcmUKICAgICAgICAgICAgPSBtYXAgeyByZWYgJF8gPyAkXyA6IHFyL15cUSRfXEUkLyB9IEB7ICRzZWxmLT57aWdub3JlX3BhY2thZ2V9IH07CiAgICB9CgogICAgbXkgJHAgPSBfX1BBQ0tBR0VfXzsKICAgIHB1c2ggQGlfcGFja19yZSwgcXIvXlxRJHBcRSQvOwoKICAgIGlmICggJHNlbGYtPntpZ25vcmVfY2xhc3N9ICkgewogICAgICAgICRzZWxmLT57aWdub3JlX2NsYXNzfSA9IFsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IF0KICAgICAgICAgICAgdW5sZXNzIHJlZiAkc2VsZi0+e2lnbm9yZV9jbGFzc307CiAgICAgICAgJWlfY2xhc3MgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJHNlbGYtPntpZ25vcmVfY2xhc3N9IH07CiAgICB9CgogICAgbXkgJHVzZXJfZmlsdGVyID0gJHNlbGYtPntmcmFtZV9maWx0ZXJ9OwoKICAgIHJldHVybiBzdWIgewogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdID1+IC8kXy8gfSBAaV9wYWNrX3JlOwogICAgICAgIHJldHVybiAwIGlmIGdyZXAgeyAkX1swXXtjYWxsZXJ9WzBdLT5pc2EoJF8pIH0ga2V5cyAlaV9jbGFzczsKCiAgICAgICAgaWYgKCR1c2VyX2ZpbHRlcikgewogICAgICAgICAgICByZXR1cm4gJHVzZXJfZmlsdGVyLT4oICRfWzBdICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMTsKICAgIH07Cn0KCnN1YiBfYWRkX2ZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkYyAgICA9IHNoaWZ0OwogICAgbXkgJHAgICAgPSBzaGlmdDsKCiAgICAjIGV2YWwgYW5kIGlzX3JlcXVpcmUgYXJlIG9ubHkgcmV0dXJuZWQgd2hlbiBhcHBsaWNhYmxlIHVuZGVyIDUuMDA1MDMuCiAgICBwdXNoIEAkYywgKCB1bmRlZiwgdW5kZWYgKSBpZiBzY2FsYXIgQCRjID09IDY7CgogICAgcHVzaCBAeyAkc2VsZi0+e2ZyYW1lc30gfSwKICAgICAgICBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUtPm5ldygKICAgICAgICAkYywKICAgICAgICAkcCwKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9LAogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9LAogICAgICAgICRzZWxmLT57bWVzc2FnZX0sCiAgICAgICAgJHNlbGYtPntpbmRlbnR9CiAgICAgICAgKTsKfQoKc3ViIG5leHRfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IC0xIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aW5kZXh9OwoKICAgIG15IEBmID0gJHNlbGYtPmZyYW1lcygpOwogICAgaWYgKCBkZWZpbmVkICRmWyAkc2VsZi0+e2luZGV4fSArIDEgXSApIHsKICAgICAgICByZXR1cm4gJGZbICsrJHNlbGYtPntpbmRleH0gXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRzZWxmLT57aW5kZXh9ID0gdW5kZWY7CiAgICAgICAgIyMgbm8gY3JpdGljIChTdWJyb3V0aW5lczo6UHJvaGliaXRFeHBsaWNpdFJldHVyblVuZGVmKQogICAgICAgIHJldHVybiB1bmRlZjsKICAgIH0KfQoKc3ViIHByZXZfZnJhbWUgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBteSBAZiA9ICRzZWxmLT5mcmFtZXMoKTsKCiAgICAjIHJlc2V0IHRvIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAkc2VsZi0+e2luZGV4fSA9IHNjYWxhciBAZiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2luZGV4fTsKCiAgICBpZiAoIGRlZmluZWQgJGZbICRzZWxmLT57aW5kZXh9IC0gMSBdICYmICRzZWxmLT57aW5kZXh9ID49IDEgKSB7CiAgICAgICAgcmV0dXJuICRmWyAtLSRzZWxmLT57aW5kZXh9IF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIyBubyBjcml0aWMgKFN1YnJvdXRpbmVzOjpQcm9oaWJpdEV4cGxpY2l0UmV0dXJuVW5kZWYpCiAgICAgICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKICAgICAgICByZXR1cm4gdW5kZWY7CiAgICB9Cn0KCnN1YiByZXNldF9wb2ludGVyIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CgogICAgJHNlbGYtPntpbmRleH0gPSB1bmRlZjsKCiAgICByZXR1cm47Cn0KCnN1YiBmcmFtZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICBpZiAoQF8pIHsKICAgICAgICBkaWUKICAgICAgICAgICAgIkRldmVsOjpTdGFja1RyYWNlLT5mcmFtZXMoKSBjYW4gb25seSB0YWtlIERldmVsOjpTdGFja1RyYWNlOjpGcmFtZSBhcmdzXG4iCiAgICAgICAgICAgIGlmIGdyZXAgeyAhJF8tPmlzYSgnRGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lJykgfSBAXzsKCiAgICAgICAgJHNlbGYtPntmcmFtZXN9ID0gXEBfOwogICAgICAgIGRlbGV0ZSAkc2VsZi0+e3Jhd307CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkc2VsZi0+X21ha2VfZnJhbWVzKCkgaWYgJHNlbGYtPntyYXd9OwogICAgfQoKICAgIHJldHVybiBAeyAkc2VsZi0+e2ZyYW1lc30gfTsKfQoKc3ViIGZyYW1lIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkaSAgICA9IHNoaWZ0OwoKICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkaTsKCiAgICByZXR1cm4gKCAkc2VsZi0+ZnJhbWVzKCkgKVskaV07Cn0KCnN1YiBmcmFtZV9jb3VudCB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBzY2FsYXIoICRzZWxmLT5mcmFtZXMoKSApOwp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICBteSAkcCAgICA9IHNoaWZ0OwoKICAgIG15ICRzdCAgICA9IHF7fTsKICAgIG15ICRmaXJzdCA9IDE7CiAgICBmb3JlYWNoIG15ICRmICggJHNlbGYtPmZyYW1lcygpICkgewogICAgICAgICRzdCAuPSAkZi0+YXNfc3RyaW5nKCAkZmlyc3QsICRwICkgLiAiXG4iOwogICAgICAgICRmaXJzdCA9IDA7CiAgICB9CgogICAgcmV0dXJuICRzdDsKfQoKewogICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpQcm9oaWJpdE11bHRpcGxlUGFja2FnZXMsIENsYXNzSGllcmFyY2hpZXM6OlByb2hpYml0RXhwbGljaXRJU0EpCiAgICBwYWNrYWdlICAgICMgaGlkZSBmcm9tIFBBVVNFCiAgICAgICAgRGV2ZWw6OlN0YWNrVHJhY2VGcmFtZTsKCiAgICBvdXIgQElTQSA9ICdEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWUnOwp9CgoxOwoKIyBBQlNUUkFDVDogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHN0YWNrIHRyYWNlCgpfX0VORF9fCgo9cG9kCgo9aGVhZDEgTkFNRQoKRGV2ZWw6OlN0YWNrVHJhY2UgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBTWU5PUFNJUwoKICB1c2UgRGV2ZWw6OlN0YWNrVHJhY2U7CgogIG15ICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXcoKTsKCiAgcHJpbnQgJHRyYWNlLT5hc19zdHJpbmcoKTsgIyBsaWtlIGNhcnAKCiAgIyBmcm9tIHRvcCAobW9zdCByZWNlbnQpIG9mIHN0YWNrIHRvIGJvdHRvbS4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+bmV4dF9mcmFtZSgpICkgewogICAgICBwcmludCAiSGFzIGFyZ3NcbiIgaWYgJGZyYW1lLT5oYXNhcmdzKCk7CiAgfQoKICAjIGZyb20gYm90dG9tIChsZWFzdCByZWNlbnQpIG9mIHN0YWNrIHRvIHRvcC4KICB3aGlsZSAoIG15ICRmcmFtZSA9ICR0cmFjZS0+cHJldl9mcmFtZSgpICkgewogICAgICBwcmludCAiU3ViOiAiLCAkZnJhbWUtPnN1YnJvdXRpbmUoKSwgIlxuIjsKICB9Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBDPERldmVsOjpTdGFja1RyYWNlPiBtb2R1bGUgY29udGFpbnMgdHdvIGNsYXNzZXMsIEMsRGV2ZWw6OlN0YWNrVHJhY2U+IGFuZApMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQKY2FuIHJldHJpZXZlZCB2aWEgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBhIHNpbXBsZQppbnRlcmZhY2UgdG8gdGhpcyBkYXRhLgoKVGhlIEM8RGV2ZWw6OlN0YWNrVHJhY2U+IG9iamVjdCBjb250YWlucyBhIHNldCBvZiBDPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4Kb2JqZWN0cywgb25lIGZvciBlYWNoIGxldmVsIG9mIHRoZSBzdGFjay4gVGhlIGZyYW1lcyBjb250YWluIGFsbCB0aGUgZGF0YQphdmFpbGFibGUgZnJvbSBDPGNhbGxlcigpPi4KClRoaXMgY29kZSB3YXMgY3JlYXRlZCB0byBzdXBwb3J0IG15IEw8RXhjZXB0aW9uOjpDbGFzczo6QmFzZT4gY2xhc3MgKHBhcnQgb2YKTDxFeGNlcHRpb246OkNsYXNzPikgYnV0IG1heSBiZSB1c2VmdWwgaW4gb3RoZXIgY29udGV4dHMuCgo9ZW5jb2RpbmcgVVRGLTgKCj1oZWFkMSAnVE9QJyBBTkQgJ0JPVFRPTScgT0YgVEhFIFNUQUNLCgpXaGVuIGRlc2NyaWJpbmcgdGhlIG1ldGhvZHMgb2YgdGhlIHRyYWNlIG9iamVjdCwgSSB1c2UgdGhlIHdvcmRzICd0b3AnIGFuZAonYm90dG9tJy4gSW4gdGhpcyBjb250ZXh0LCB0aGUgJ3RvcCcgZnJhbWUgb24gdGhlIHN0YWNrIGlzIHRoZSBtb3N0IHJlY2VudApmcmFtZSBhbmQgdGhlICdib3R0b20nIGlzIHRoZSBsZWFzdCByZWNlbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZToKCiAgZm9vKCk7ICAjIGJvdHRvbSBmcmFtZSBpcyBoZXJlCgogIHN1YiBmb28gewogICAgIGJhcigpOwogIH0KCiAgc3ViIGJhciB7CiAgICAgRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldygpOyAgIyB0b3AgZnJhbWUgaXMgaGVyZS4KICB9Cgo9aGVhZDEgTUVUSE9EUwoKVGhpcyBjbGFzcyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKCj1oZWFkMiBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3KCVuYW1lZF9wYXJhbXMpCgpSZXR1cm5zIGEgbmV3IERldmVsOjpTdGFja1RyYWNlIG9iamVjdC4KClRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCj1vdmVyIDQKCj1pdGVtICogZnJhbWVfZmlsdGVyID0+ICRzdWIKCkJ5IGRlZmF1bHQsIERldmVsOjpTdGFja1RyYWNlIHdpbGwgaW5jbHVkZSBhbGwgc3RhY2sgZnJhbWVzIGJlZm9yZSB0aGUKY2FsbCB0byBpdHMgY29uc3RydWN0b3IuCgpIb3dldmVyLCB5b3UgbWF5IHdhbnQgdG8gZmlsdGVyIG91dCBzb21lIGZyYW1lcyB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkKdGhhbiAnaWdub3JlX3BhY2thZ2UnIG9yICdpZ25vcmVfY2xhc3MnIGFsbG93LgoKWW91IGNhbiBwcm92aWRlIGEgc3Vicm91dGluZSB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgcmF3IGZyYW1lIGRhdGEKZm9yIGVhY2ggZnJhbWUuIFRoaXMgaXMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHR3byBrZXlzLCAiY2FsbGVyIiwgYW5kCiJhcmdzIiwgYm90aCBvZiB3aGljaCBhcmUgYXJyYXkgcmVmZXJlbmNlcy4gVGhlICJjYWxsZXIiIGtleSBpcyB0aGUKcmF3IGRhdGEgYXMgcmV0dXJuZWQgYnkgUGVybCdzIEM8Y2FsbGVyKCk+IGZ1bmN0aW9uLCBhbmQgdGhlICJhcmdzIgprZXkgYXJlIHRoZSBzdWJyb3V0aW5lIGFyZ3VtZW50cyBmb3VuZCBpbiBDPEBEQjo6YXJncz4uCgpUaGUgZmlsdGVyIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhbWUgc2hvdWxkIGJlIGluY2x1ZGVkLCBvcgpmYWxzZSBpZiBpdCBzaG91bGQgYmUgc2tpcHBlZC4KCj1pdGVtICogZmlsdGVyX2ZyYW1lc19lYXJseSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgQzxmcmFtZV9maWx0ZXI+IHdpbGwgYmUgY2FsbGVkIGFzIHNvb24gYXMgdGhlCnN0YWNrdHJhY2UgaXMgY3JlYXRlZCwgYW5kIGJlZm9yZSByZWZzIGFyZSBzdHJpbmdpZmllZCAoaWYKQzx1bnNhZmVfcmVmX2NhcHR1cmU+IGlzIG5vdCBzZXQpLCByYXRoZXIgdGhhbiBiZWluZyBmaWx0ZXJlZCBsYXppbHkgd2hlbgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cyBhcmUgZmlyc3QgbmVlZGVkLgoKVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZmlsdGVyIGJhc2VkIG9uIHRoZSBmcmFtZSdzIGFyZ3VtZW50cyBhbmQgd2FudAp0byBiZSBhYmxlIHRvIGV4YW1pbmUgb2JqZWN0IHByb3BlcnRpZXMsIGZvciBleGFtcGxlLgoKPWl0ZW0gKiBpZ25vcmVfcGFja2FnZSA9PiAkcGFja2FnZV9uYW1lIE9SIFxAcGFja2FnZV9uYW1lcwoKQW55IGZyYW1lcyB3aGVyZSB0aGUgcGFja2FnZSBpcyBvbmUgb2YgdGhlc2UgcGFja2FnZXMgd2lsbCBub3QgYmUgb24KdGhlIHN0YWNrLgoKPWl0ZW0gKiBpZ25vcmVfY2xhc3MgPT4gJHBhY2thZ2VfbmFtZSBPUiBcQHBhY2thZ2VfbmFtZXMKCkFueSBmcmFtZXMgd2hlcmUgdGhlIHBhY2thZ2UgaXMgYSBzdWJjbGFzcyBvZiBvbmUgb2YgdGhlc2UgcGFja2FnZXMKKG9yIGlzIHRoZSBzYW1lIHBhY2thZ2UpIHdpbGwgbm90IGJlIG9uIHRoZSBzdGFjay4KCkRldmVsOjpTdGFja1RyYWNlIGludGVybmFsbHkgYWRkcyBpdHNlbGYgdG8gdGhlICdpZ25vcmVfcGFja2FnZScKcGFyYW1ldGVyLCBtZWFuaW5nIHRoYXQgdGhlIERldmVsOjpTdGFja1RyYWNlIHBhY2thZ2UgaXMgQjxBTFdBWVM+Cmlnbm9yZWQuIEhvd2V2ZXIsIGlmIHlvdSBjcmVhdGUgYSBzdWJjbGFzcyBvZiBEZXZlbDo6U3RhY2tUcmFjZSBpdAp3aWxsIG5vdCBiZSBpZ25vcmVkLgoKPWl0ZW0gKiBza2lwX2ZyYW1lcyA9PiAkaW50ZWdlcgoKVGhpcyB3aWxsIGNhdXNlIHRoaXMgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyB0byBiZSBleGNsdWRlZCBmcm9tIHRvcCBvZiB0aGUKc3RhY2sgdHJhY2UuIFRoaXMgcHJldmVudHMgdGhlIGZyYW1lcyBmcm9tIGJlaW5nIGNhcHR1cmVkIGF0IGFsbCwgYW5kIGFwcGxpZXMKYmVmb3JlIHRoZSBDPGZyYW1lX2ZpbHRlcj4sIEM8aWdub3JlX3BhY2thZ2U+LCBvciBDPGlnbm9yZV9jbGFzcz4gb3B0aW9ucywKZXZlbiB3aXRoIEM8ZmlsdGVyX2ZyYW1lc19lYXJseT4uCgo9aXRlbSAqIHVuc2FmZV9yZWZfY2FwdHVyZSA9PiAkYm9vbGVhbgoKSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlbiBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIHN0b3JlCnJlZmVyZW5jZXMgaW50ZXJuYWxseSB3aGVuIGdlbmVyYXRpbmcgc3RhY2t0cmFjZSBmcmFtZXMuCgpCPFRoaXMgb3B0aW9uIGlzIHZlcnkgZGFuZ2Vyb3VzLCBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgd2l0aCBleGNlcHRpb24Kb2JqZWN0cz4uIFVzaW5nIHRoaXMgb3B0aW9uIHdpbGwga2VlcCBhbnkgb2JqZWN0cyBvciByZWZlcmVuY2VzIGFsaXZlIHBhc3QKdGhlaXIgbm9ybWFsIGxpZmV0aW1lLCB1bnRpbCB0aGUgc3RhY2sgdHJhY2Ugb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLiBJdCBjYW4Ka2VlcCBvYmplY3RzIGFsaXZlIGV2ZW4gYWZ0ZXIgdGhlaXIgQzxERVNUUk9ZPiBzdWIgaXMgY2FsbGVkLCByZXN1bHRpbmcgaXQgaXQKYmVpbmcgY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIG9iamVjdC4KCklmIG5vdCBzZXQsIERldmVsOjpTdGFja1RyYWNlIHJlcGxhY2VzIGFueSByZWZlcmVuY2VzIHdpdGggdGhlaXIgc3RyaW5naWZpZWQKcmVwcmVzZW50YXRpb24uCgo9aXRlbSAqIG5vX2FyZ3MgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZW4gRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBub3Qgc3RvcmUgY2FsbGVyCmFyZ3VtZW50cyBpbiBzdGFjayB0cmFjZSBmcmFtZXMgYXQgYWxsLgoKPWl0ZW0gKiByZXNwZWN0X292ZXJsb2FkID0+ICRib29sZWFuCgpCeSBkZWZhdWx0LCBEZXZlbDo6U3RhY2tUcmFjZSB3aWxsIGNhbGwgQzxvdmVybG9hZDo6QWRkclJlZigpPiB0byBnZXQKdGhlIHVuZGVybHlpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCwgaW5zdGVhZCBvZgpyZXNwZWN0aW5nIHRoZSBvYmplY3QncyBzdHJpbmdpZmljYXRpb24gb3ZlcmxvYWRpbmcuIElmIHlvdSB3b3VsZApwcmVmZXIgdG8gc2VlIHRoZSBvdmVybG9hZGVkIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdHMgaW4gc3RhY2sKdHJhY2VzLCB0aGVuIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLgoKPWl0ZW0gKiBtYXhfYXJnX2xlbmd0aCA9PiAkaW50ZWdlcgoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCBkaXNwbGF5IHRoZSBlbnRpcmUgYXJndW1lbnQgZm9yIGVhY2gKc3Vicm91dGluZSBjYWxsLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGNhdXNlcyB0cnVuY2F0ZXMgZWFjaCBzdWJyb3V0aW5lCmFyZ3VtZW50J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIGl0IGlzIGxvbmdlciB0aGFuIHRoaXMgbnVtYmVyIG9mCmNoYXJhY3RlcnMuCgo9aXRlbSAqIG1lc3NhZ2UgPT4gJHN0cmluZwoKQnkgZGVmYXVsdCwgRGV2ZWw6OlN0YWNrVHJhY2Ugd2lsbCB1c2UgJ1RyYWNlIGJlZ3VuJyBhcyB0aGUgbWVzc2FnZSBmb3IgdGhlCmZpcnN0IHN0YWNrIGZyYW1lIHdoZW4geW91IGNhbGwgQzxhc19zdHJpbmc+LiBZb3UgY2FuIHN1cHBseSBhbiBhbHRlcm5hdGl2ZQptZXNzYWdlIHVzaW5nIHRoaXMgb3B0aW9uLgoKPWl0ZW0gKiBpbmRlbnQgPT4gJGJvb2xlYW4KCklmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIGVhY2ggc3RhY2sgZnJhbWUgYWZ0ZXIgdGhlIGZpcnN0IHdpbGwgc3RhcnQgd2l0aCBhCnRhYiBjaGFyYWN0ZXIsIGp1c3QgbGlrZSBDPENhcnA6OmNvbmZlc3MoKT4uCgo9YmFjawoKPWhlYWQyICR0cmFjZS0+bmV4dF9mcmFtZSgpCgpSZXR1cm5zIHRoZSBuZXh0IEw8RGV2ZWw6OlN0YWNrVHJhY2U6OkZyYW1lPiBvYmplY3Qgb24gdGhlIHN0YWNrLCBnb2luZwpkb3duLiBJZiB0aGlzIG1ldGhvZCBoYXNuJ3QgYmVlbiBjYWxsZWQgYmVmb3JlIGl0IHJldHVybnMgdGhlIGZpcnN0IGZyYW1lLiBJdApyZXR1cm5zIEM8dW5kZWY+IHdoZW4gaXQgcmVhY2hlcyB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayBhbmQgdGhlbiByZXNldHMgaXRzCnBvaW50ZXIgc28gdGhlIG5leHQgY2FsbCB0byBDPDwgJHRyYWNlLT5uZXh0X2ZyYW1lKCkgPj4gb3IgQzw8CiR0cmFjZS0+cHJldl9mcmFtZSgpID4+IHdpbGwgd29yayBwcm9wZXJseS4KCj1oZWFkMiAkdHJhY2UtPnByZXZfZnJhbWUoKQoKUmV0dXJucyB0aGUgbmV4dCBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0IG9uIHRoZSBzdGFjaywgZ29pbmcgdXAuIElmCnRoaXMgbWV0aG9kIGhhc24ndCBiZWVuIGNhbGxlZCBiZWZvcmUgaXQgcmV0dXJucyB0aGUgbGFzdCBmcmFtZS4gSXQgcmV0dXJucwp1bmRlZiB3aGVuIGl0IHJlYWNoZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHRoZW4gcmVzZXRzIGl0cyBwb2ludGVyIHNvIHRoZQpuZXh0IGNhbGwgdG8gQzw8ICR0cmFjZS0+bmV4dF9mcmFtZSgpID4+IG9yIEM8PCAkdHJhY2UtPnByZXZfZnJhbWUoKSA+PiB3aWxsCndvcmsgcHJvcGVybHkuCgo9aGVhZDIgJHRyYWNlLT5yZXNldF9wb2ludGVyCgpSZXNldHMgdGhlIHBvaW50ZXIgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIEM8PCAkdHJhY2UtPm5leHRfZnJhbWUoKSA+PiBvciBDPDwKJHRyYWNlLT5wcmV2X2ZyYW1lKCkgPj4gd2lsbCBzdGFydCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgc3RhY2ssIGFzCmFwcHJvcHJpYXRlLgoKPWhlYWQyICR0cmFjZS0+ZnJhbWVzKCkKCldoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBpdCByZXR1cm5zIGEgbGlzdCBvZgpMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4gVGhleSBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgZnJvbSB0b3AgKG1vc3QKcmVjZW50KSB0byBib3R0b20uCgpUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCB0aGUgb2JqZWN0J3MgZnJhbWVzIGlmIHlvdSBwYXNzIGl0IGEgbGlzdApvZiBMPERldmVsOjpTdGFja1RyYWNlOjpGcmFtZT4gb2JqZWN0cy4KClRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbHRlciB0aGUgbGlzdCBvZiBmcmFtZXMgaW4gd2F5cyB0aGF0IGFyZSBtb3JlCmNvbXBsZXggdGhhbiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgQzw8ICR0cmFjZS0+ZmlsdGVyX2ZyYW1lcygpID4+IG1ldGhvZDoKCiAgJHN0YWNrdHJhY2UtPmZyYW1lcyggbXlfZmlsdGVyKCAkc3RhY2t0cmFjZS0+ZnJhbWVzKCkgKSApOwoKPWhlYWQyICR0cmFjZS0+ZnJhbWUoJGluZGV4KQoKR2l2ZW4gYW4gaW5kZXgsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlbGV2YW50IGZyYW1lLCBvciB1bmRlZiBpZiB0aGVyZSBpcwpubyBmcmFtZSBhdCB0aGF0IGluZGV4LiBUaGUgaW5kZXggaXMgZXhhY3RseSBsaWtlIGEgUGVybCBhcnJheS4gVGhlIGZpcnN0CmZyYW1lIGlzIDAgYW5kIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIGFsbG93ZWQuCgo9aGVhZDIgJHRyYWNlLT5mcmFtZV9jb3VudCgpCgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSB0cmFjZSBvYmplY3QuCgo9aGVhZDIgJHRyYWNlLT5hc19zdHJpbmcoXCVwKQoKQ2FsbHMgQzw8ICRmcmFtZS0+YXNfc3RyaW5nKCkgPj4gb24gZWFjaCBmcmFtZSBmcm9tIHRvcCB0byBib3R0b20sIHByb2R1Y2luZwpvdXRwdXQgcXVpdGUgc2ltaWxhciB0byB0aGUgQ2FycCBtb2R1bGUncyBjbHVjay9jb25mZXNzIG1ldGhvZHMuCgpUaGUgb3B0aW9uYWwgQzxcJXA+IHBhcmFtZXRlciBvbmx5IGhhcyBvbmUgb3B0aW9uLiBUaGUgQzxtYXhfYXJnX2xlbmd0aD4KcGFyYW1ldGVyIHRydW5jYXRlcyBlYWNoIHN1YnJvdXRpbmUgYXJndW1lbnQncyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaWYgaXQgaXMKbG9uZ2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgY2hhcmFjdGVycy4KCj1oZWFkMSBTVVBQT1JUCgpQbGVhc2Ugc3VibWl0IGJ1Z3MgdG8gdGhlIENQQU4gUlQgc3lzdGVtIGF0Cmh0dHA6Ly9ydC5jcGFuLm9yZy9Ob0F1dGgvUmVwb3J0QnVnLmh0bWw/UXVldWU9RGV2ZWwlM0ElM0FTdGFja1RyYWNlCm9yIHZpYSBlbWFpbCBhdCBidWctZGV2ZWwtc3RhY2t0cmFjZUBydC5jcGFuLm9yZy4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPTlRSSUJVVE9SUwoKPWZvciBzdG9wd29yZHMgRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciBEYXZpZCBDYW50cmVsbCBHcmFoYW0gS25vcCBNYXJrIEZvd2xlciBSaWNhcmRvIFNpZ25lcwoKPW92ZXIgNAoKPWl0ZW0gKgoKRGFnZmlubiBJbG1hcmkgTWFubnPDpWtlciA8aWxtYXJpQGlsbWFyaS5vcmc+Cgo9aXRlbSAqCgpEYXZpZCBDYW50cmVsbCA8ZGF2aWRAY2FudHJlbGwub3JnLnVrPgoKPWl0ZW0gKgoKR3JhaGFtIEtub3AgPGhhYXJnQGhhYXJnLm9yZz4KCj1pdGVtICoKCk1hcmsgRm93bGVyIDxtYXJrQHR3b3Nob3J0cGxhbmtzLmNvbT4KCj1pdGVtICoKClJpY2FyZG8gU2lnbmVzIDxyamJzQGNwYW4ub3JnPgoKPWJhY2sKCj1oZWFkMSBDT1BZUklHSFQgQU5EIExJQ0VOU0UKClRoaXMgc29mdHdhcmUgaXMgQ29weXJpZ2h0IChjKSAyMDAwIC0gMjAxNiBieSBEYXZpZCBSb2xza3kuCgpUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyOgoKICBUaGUgQXJ0aXN0aWMgTGljZW5zZSAyLjAgKEdQTCBDb21wYXRpYmxlKQoKPWN1dAo=
cGFja2FnZSBEZXZlbDo6U3RhY2tUcmFjZTo6RnJhbWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJFZFUlNJT04gPSAnMi4wMSc7CgojIENyZWF0ZSBhY2Nlc3NvciByb3V0aW5lcwpCRUdJTiB7CiAgICAjIyBubyBjcml0aWMgKFRlc3RpbmdBbmREZWJ1Z2dpbmc6OlByb2hpYml0Tm9TdHJpY3QpCiAgICBubyBzdHJpY3QgJ3JlZnMnOwogICAgZm9yZWFjaCBteSAkZiAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3MKICAgICAgICB3YW50YXJyYXkgZXZhbHRleHQgaXNfcmVxdWlyZSBoaW50cyBiaXRtYXNrIGFyZ3MgKQogICAgICAgICkgewogICAgICAgIG5leHQgaWYgJGYgZXEgJ2FyZ3MnOwogICAgICAgICp7JGZ9ID0gc3ViIHsgbXkgJHMgPSBzaGlmdDsgcmV0dXJuICRzLT57JGZ9IH07CiAgICB9Cn0KCnsKICAgIG15IEBmaWVsZHMgPSAoCiAgICAgICAgcXcoIHBhY2thZ2UgZmlsZW5hbWUgbGluZSBzdWJyb3V0aW5lIGhhc2FyZ3Mgd2FudGFycmF5CiAgICAgICAgICAgIGV2YWx0ZXh0IGlzX3JlcXVpcmUgaGludHMgYml0bWFzayApCiAgICApOwoKICAgIHN1YiBuZXcgewogICAgICAgIG15ICRwcm90byA9IHNoaWZ0OwogICAgICAgIG15ICRjbGFzcyA9IHJlZiAkcHJvdG8gfHwgJHByb3RvOwoKICAgICAgICBteSAkc2VsZiA9IGJsZXNzIHt9LCAkY2xhc3M7CgogICAgICAgIEB7JHNlbGZ9e0BmaWVsZHN9ID0gQHsgc2hpZnQoKSB9OwoKICAgICAgICAjIGZpeHVwIHVuaXgtc3R5bGUgcGF0aHMgb24gd2luMzIKICAgICAgICAkc2VsZi0+e2ZpbGVuYW1lfSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggJHNlbGYtPntmaWxlbmFtZX0gKTsKCiAgICAgICAgJHNlbGYtPnthcmdzfSA9IHNoaWZ0OwoKICAgICAgICAkc2VsZi0+e3Jlc3BlY3Rfb3ZlcmxvYWR9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9ID0gc2hpZnQ7CgogICAgICAgICRzZWxmLT57bWVzc2FnZX0gPSBzaGlmdDsKCiAgICAgICAgJHNlbGYtPntpbmRlbnR9ID0gc2hpZnQ7CgogICAgICAgIHJldHVybiAkc2VsZjsKICAgIH0KfQoKc3ViIGFyZ3MgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gQHsgJHNlbGYtPnthcmdzfSB9Owp9CgpzdWIgYXNfc3RyaW5nIHsKICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgbXkgJGZpcnN0ID0gc2hpZnQ7CiAgICBteSAkcCAgICAgPSBzaGlmdDsKCiAgICBteSAkc3ViID0gJHNlbGYtPnN1YnJvdXRpbmU7CgogICAgIyBUaGlzIGNvZGUgc3RvbGVuIHN0cmFpZ2h0IGZyb20gQ2FycC5wbSBhbmQgdGhlbiB0d2Vha2VkLiAgQWxsCiAgICAjIGVycm9ycyBhcmUgcHJvYmFibHkgbXkgZmF1bHQgIC1kYXZlCiAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgJHN1YgogICAgICAgICAgICA9IGRlZmluZWQgJHNlbGYtPnttZXNzYWdlfQogICAgICAgICAgICA/ICRzZWxmLT57bWVzc2FnZX0KICAgICAgICAgICAgOiAnVHJhY2UgYmVndW4nOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgQnVpbGQgYSBzdHJpbmcsICRzdWIsIHdoaWNoIG5hbWVzIHRoZSBzdWItcm91dGluZSBjYWxsZWQuCiAgICAgICAgIyBUaGlzIG1heSBhbHNvIGJlICJyZXF1aXJlIC4uLiIsICJldmFsICcuLi4nIG9yICJldmFsIHsuLi59IgogICAgICAgIGlmICggbXkgJGV2YWwgPSAkc2VsZi0+ZXZhbHRleHQgKSB7CiAgICAgICAgICAgIGlmICggJHNlbGYtPmlzX3JlcXVpcmUgKSB7CiAgICAgICAgICAgICAgICAkc3ViID0gInJlcXVpcmUgJGV2YWwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJGV2YWwgPX4gcy8oW1xcXCddKS9cXCQxL2c7CiAgICAgICAgICAgICAgICAkc3ViID0gImV2YWwgJyRldmFsJyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkc3ViIGVxICcoZXZhbCknICkgewogICAgICAgICAgICAkc3ViID0gJ2V2YWwgey4uLn0nOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyBpbiB0aGUgc3ViLXJvdXRpbmUgY2FsbCwgZm9ybWF0CiAgICAgICAgIyB0aGVtIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IHZhcmlhYmxlcyBkZWZpbmVkIGVhcmxpZXIgaW4KICAgICAgICAjIHRoaXMgZmlsZSBhbmQgam9pbiB0aGVtIG9udG8gdGhlICRzdWIgc3ViLXJvdXRpbmUgc3RyaW5nCiAgICAgICAgIwogICAgICAgICMgV2UgY29weSB0aGVtIGJlY2F1c2UgdGhleSdyZSBnb2luZyB0byBiZSBtb2RpZmllZC4KICAgICAgICAjCiAgICAgICAgaWYgKCBteSBAYSA9ICRzZWxmLT5hcmdzICkgewogICAgICAgICAgICBmb3IgKEBhKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgYXJncyB0byB0aGUgc3RyaW5nICJ1bmRlZiIgaWYgdW5kZWZpbmVkCiAgICAgICAgICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICRfICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJ3VuZGVmJzsKICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaGFjayEKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoU3Vicm91dGluZXM6OlByb3RlY3RQcml2YXRlU3VicykKICAgICAgICAgICAgICAgICRfID0gJHNlbGYtPkRldmVsOjpTdGFja1RyYWNlOjpfcmVmX3RvX3N0cmluZygkXykKICAgICAgICAgICAgICAgICAgICBpZiByZWYgJF87CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoVmFyaWFibGVzOjpSZXF1aXJlSW5pdGlhbGl6YXRpb25Gb3JMb2NhbFZhcnMpCiAgICAgICAgICAgICAgICBsb2NhbCAkU0lHe19fRElFX199OwogICAgICAgICAgICAgICAgbG9jYWwgJEA7CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljOwoKICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoRXJyb3JIYW5kbGluZzo6UmVxdWlyZUNoZWNraW5nUmV0dXJuVmFsdWVPZkV2YWwpCiAgICAgICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICAgICBteSAkbWF4X2FyZ19sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgPSBleGlzdHMgJHAtPnttYXhfYXJnX2xlbmd0aH0KICAgICAgICAgICAgICAgICAgICAgICAgPyAkcC0+e21heF9hcmdfbGVuZ3RofQogICAgICAgICAgICAgICAgICAgICAgICA6ICRzZWxmLT57bWF4X2FyZ19sZW5ndGh9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRtYXhfYXJnX2xlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAmJiBsZW5ndGggJF8gPiAkbWF4X2FyZ19sZW5ndGggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMjIG5vIGNyaXRpYyAoQnVpbHRpbkZ1bmN0aW9uczo6UHJvaGliaXRMdmFsdWVTdWJzdHIpCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJF8sICRtYXhfYXJnX2xlbmd0aCApID0gJy4uLic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzLycvXFwnL2c7CgogICAgICAgICAgICAgICAgICAgICMgJ3F1b3RlJyBhcmcgdW5sZXNzIGl0IGxvb2tzIGxpa2UgYSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAkXyA9ICInJF8nIiB1bmxlc3MgL14tP1tcZC5dKyQvOwoKICAgICAgICAgICAgICAgICAgICAjIHByaW50IGNvbnRyb2wvaGlnaCBBU0NJSSBjaGFycyBhcyAnTS08Y2hhcj4nIG9yICdePGNoYXI+JwogICAgICAgICAgICAgICAgICAgIHMvKFtcMjAwLVwzNzddKS9zcHJpbnRmKCJNLSVjIixvcmQoJDEpJjAxNzcpL2VnOwogICAgICAgICAgICAgICAgICAgIHMvKFtcMC1cMzdcMTc3XSkvc3ByaW50ZigiXiVjIixvcmQoJDEpXjY0KS9lZzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAjIyB1c2UgY3JpdGljCgogICAgICAgICAgICAgICAgaWYgKCBteSAkZSA9ICRAICkgewogICAgICAgICAgICAgICAgICAgICRfID0gJGUgPX4gL21hbGZvcm1lZCB1dGYtOC9pID8gJyhiYWQgdXRmLTgpJyA6ICc/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcHBlbmQgKCdhbGwnLCAndGhlJywgJ2FyZ3VtZW50cycpIHRvIHRoZSAkc3ViIHN0cmluZwogICAgICAgICAgICAkc3ViIC49ICcoJyAuIGpvaW4oICcsICcsIEBhICkgLiAnKSc7CiAgICAgICAgICAgICRzdWIgLj0gJyBjYWxsZWQnOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHRoZSB1c2VyIG9wdGVkIGludG8gaW5kZW50YXRpb24gKGEgbGEgQ2FycDo6Y29uZmVzcyksIHByZS1hZGQgYSB0YWIKICAgIG15ICR0YWIgPSAkc2VsZi0+e2luZGVudH0gJiYgISRmaXJzdCA/ICJcdCIgOiBxe307CgogICAgcmV0dXJuICIke3RhYn0kc3ViIGF0ICIgLiAkc2VsZi0+ZmlsZW5hbWUgLiAnIGxpbmUgJyAuICRzZWxmLT5saW5lOwp9CgoxOwoKIyBBQlNUUkFDVDogQSBzaW5nbGUgZnJhbWUgaW4gYSBzdGFjayB0cmFjZQoKX19FTkRfXwoKPXBvZAoKPWhlYWQxIE5BTUUKCkRldmVsOjpTdGFja1RyYWNlOjpGcmFtZSAtIEEgc2luZ2xlIGZyYW1lIGluIGEgc3RhY2sgdHJhY2UKCj1oZWFkMSBWRVJTSU9OCgp2ZXJzaW9uIDIuMDEKCj1oZWFkMSBERVNDUklQVElPTgoKU2VlIEw8RGV2ZWw6OlN0YWNrVHJhY2U+IGZvciBkZXRhaWxzLgoKPWZvciBQb2Q6OkNvdmVyYWdlIG5ldwoKPWhlYWQxIE1FVEhPRFMKClNlZSBQZXJsJ3MgQzxjYWxsZXIoKT4gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHRoZXNlCm1ldGhvZHMgcmV0dXJuLgoKPWhlYWQyICRmcmFtZS0+cGFja2FnZSgpCgo9aGVhZDIgJGZyYW1lLT5maWxlbmFtZSgpCgo9aGVhZDIgJGZyYW1lLT5saW5lKCkKCj1oZWFkMiAkZnJhbWUtPnN1YnJvdXRpbmUoKQoKPWhlYWQyICRmcmFtZS0+aGFzYXJncygpCgo9aGVhZDIgJGZyYW1lLT53YW50YXJyYXkoKQoKPWhlYWQyICRmcmFtZS0+ZXZhbHRleHQoKQoKUmV0dXJucyB1bmRlZiBpZiB0aGUgZnJhbWUgd2FzIG5vdCBwYXJ0IG9mIGFuIGV2YWwuCgo9aGVhZDIgJGZyYW1lLT5pc19yZXF1aXJlKCkKClJldHVybnMgdW5kZWYgaWYgdGhlIGZyYW1lIHdhcyBub3QgcGFydCBvZiBhIHJlcXVpcmUuCgo9aGVhZDIgJGZyYW1lLT5hcmdzKCkKClJldHVybnMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZyYW1lLiAgTm90ZSB0aGF0IGFueSBhcmd1bWVudHMgdGhhdCBhcmUKcmVmZXJlbmNlcyBhcmUgcmV0dXJuZWQgYXMgcmVmZXJlbmNlcywgbm90IGNvcGllcy4KCj1oZWFkMiAkZnJhbWUtPmhpbnRzKCkKCj1oZWFkMiAkZnJhbWUtPmJpdG1hc2soKQoKPWhlYWQyICRmcmFtZS0+YXNfc3RyaW5nKCkKClJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmcmFtZS4KCj1oZWFkMSBBVVRIT1IKCkRhdmUgUm9sc2t5IDxhdXRhcmNoQHVydGgub3JnPgoKPWhlYWQxIENPUFlSSUdIVCBBTkQgTElDRU5TRQoKVGhpcyBzb2Z0d2FyZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDAgLSAyMDE2IGJ5IERhdmlkIFJvbHNreS4KClRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXI6CgogIFRoZSBBcnRpc3RpYyBMaWNlbnNlIDIuMCAoR1BMIENvbXBhdGlibGUpCgo9Y3V0Cg==
cGFja2FnZSBUZXh0Ojp2RmlsZTo6YXNEYXRhOwp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cm5vIHdhcm5pbmdzICd1bmluaXRpYWxpemVkJzsKdXNlIGJhc2UgcXcoIENsYXNzOjpBY2Nlc3Nvcjo6Q2hhaW5lZDo6RmFzdCApOwpfX1BBQ0tBR0VfXy0+bWtfYWNjZXNzb3JzKHF3KCBwcmVzZXJ2ZV9wYXJhbXMgKSk7Cm91ciAkVkVSU0lPTiA9ICcwLjA4JzsKCj1oZWFkMSBOQU1FCgpUZXh0Ojp2RmlsZTo6YXNEYXRhIC0gcGFyc2UgdkZpbGUgZm9ybWF0dGVkIGZpbGVzIGludG8gZGF0YSBzdHJ1Y3R1cmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIFRleHQ6OnZGaWxlOjphc0RhdGE7CiAgb3BlbiBteSAkZmgsICJmb28uaWNzIgogICAgb3IgZGllICJjb3VsZG4ndCBvcGVuIGljczogJCEiOwogIG15ICRkYXRhID0gVGV4dDo6dkZpbGU6OmFzRGF0YS0+bmV3LT5wYXJzZSggJGZoICk7Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRleHQ6OnZGaWxlOjphc0RhdGEgcmVhZHMgdkZpbGUgZm9ybWF0IGZpbGVzLCBzdWNoIGFzIHZDYXJkIChSRkMgMjQyNikgYW5kCnZDYWxlbmRhciAoUkZDIDI0NDUpLgoKPWN1dAoKc3ViIF91bndyYXBfbGluZXMgewogICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgIG15IEBsaW5lczsKICAgIGZvciAoQF8pIHsKICAgICAgICBteSAkbGluZSA9ICRfOyAjICRfIG1heSBiZSByZWFkb25seQogICAgICAgICRsaW5lID1+IHN7W1xyXG5dKyR9e307ICMgbGluZXMgU0hPVUxEIGVuZCBDUkxGCiAgICAgICAgaWYgKCRsaW5lID1+IC9eWyBcdF0oLiopLykgeyAjIENvbnRpbnVhdGlvbiBsaW5lIChSRkMgU2VjdC4gNC4xKQogICAgICAgICAgICBkaWUgIkNvbnRpbnVhdGlvbiBsaW5lLCBidXQgbm8gcHJlY2VkaW5nIGxpbmUiIHVubGVzcyBAbGluZXM7CiAgICAgICAgICAgICRsaW5lc1stMV0gLj0gJDE7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIHB1c2ggQGxpbmVzLCAkbGluZTsKICAgIH0KICAgIHJldHVybiBAbGluZXM7Cn0KCnN1YiBwYXJzZSB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJGZoID0gc2hpZnQ7CiAgICByZXR1cm4gJHNlbGYtPnBhcnNlX2xpbmVzKCA8JGZoPiApOwp9CgojIGxpa2UgVGV4dDo6UGFyc2VXb3JkcycgcGFyc2VfbGluZSwgb25seSBDLXN0eWxlIHNvIHRoZSByZWdleCBlbmdpbmUgZG9lc24ndAojIGJsb3cgaXRzIHN0YWNrLCBhbmQgaXQncyBhbHNvIGdvdCBhICRsaW1pdCBsaWtlIHNwbGl0CgojIHRoaXMgb25seSB0b29rIGEgdHJhaW5yaWRlLCBzbyBJJ20gcHJldHR5IHN1cmUgdGhlcmUgYXJlIGx1cmtpbmcKIyBjb3JuZXIgY2FzZXMgLSB3aGVuIEkgZ2V0IGEgdHVpdCBJJ2xsIHRha2UgdGhlIFRleHQ6OlBhcnNlV29yZHMKIyB0ZXN0cyBhbmQgcnVuIHRoZW0gdGhyb3VnaCBpdAoKc3ViIHBhcnNlX2xpbmUgewogICAgbXkgKCRkZWxpbSwgJGtlZXAsICR0ZXh0LCAkbGltaXQpID0gQF87CgogICAgbXkgKCRjdXJyZW50LCBAcGFydHMpOwogICAgbXkgKCRxdW90ZSwgJGVzY2FwZWQpOwogICAgd2hpbGUgKGxlbmd0aCAkdGV4dCkgewogICAgICAgIGlmICgkdGV4dCA9fiBze14oXFwpfXt9KSB7CiAgICAgICAgICAgICRjdXJyZW50IC49ICQxIGlmICRlc2NhcGVkIHx8ICRrZWVwOwogICAgICAgICAgICAkZXNjYXBlZCA9ICEkZXNjYXBlZDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKCEkcXVvdGUgJiYgISRlc2NhcGVkICYmICR0ZXh0ID1+IHN7XiRkZWxpbX17fSkgewogICAgICAgICAgICBwdXNoIEBwYXJ0cywgJGN1cnJlbnQ7CiAgICAgICAgICAgICRjdXJyZW50ID0gdW5kZWY7CiAgICAgICAgICAgIGlmIChkZWZpbmVkICRsaW1pdCAmJiBAcGFydHMgPT0gJGxpbWl0IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQHBhcnRzLCAkdGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBwdWxsIHRoZSBjaGFyYWN0ZXIgb2ZmIHRvIHRha2UgYSBsb29rc2VlCiAgICAgICAgICAgICR0ZXh0ID1+IHN7KC4pfXt9OwogICAgICAgICAgICBteSAkY2hhciA9ICQxOwogICAgICAgICAgICBpZiAoJGNoYXIgZXEgJyInICYmICEkZXNjYXBlZCkgewogICAgICAgICAgICAgICAgIyBlaXRoZXIgaXQncyBkZWZpbmVkIGFuZCBtYXRjaGVzLCBpbiB3aGljaCBjYXNlIHdlCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRoZSBxdW90ZSB2YXJpYWJsZSwgb3IgaXQncyB1bmRlZmluZWQgd2hpY2gKICAgICAgICAgICAgICAgICMgbWFrZXMgdGhpcyBxdW90ZSBhbiBvcGVuaW5nIHF1b3RlCiAgICAgICAgICAgICAgICAkcXVvdGUgPSAhJHF1b3RlOwogICAgICAgICAgICAgICAgJGN1cnJlbnQgLj0gJGNoYXIgaWYgJGtlZXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkY3VycmVudCAuPSAkY2hhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZXNjYXBlZCA9IDA7CiAgICB9CgogICAgcmV0dXJuIEBwYXJ0cywgJGN1cnJlbnQ7Cn0KCnN1YiBwYXJzZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwoKICAgIG15IEBwYXRoOwogICAgbXkgJGN1cnJlbnQ7CiAgICBmb3IgKCRzZWxmLT5fdW53cmFwX2xpbmVzKCBAXyApKSB7CiAgICAgICAgIyBJZ25vcmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFuayBsaW5lcyBhdCB0aGUgdG9wL2JvdHRvbSBvZiB0aGUKICAgICAgICAjIGlucHV0LiAgTm90IHN1cmUgYWJvdXQgY29tcGxldGVseSBibGFuayBsaW5lcyB3aXRoaW4gdGhlIGlucHV0CiAgICAgICAgbmV4dCBpZiBzY2FsYXIgQHBhdGggPT0gMCBhbmQgJF8gPX4gL15ccyokLzsKCiAgICAgICAgaWYgKC9eQkVHSU46KC4qKS9pKSB7CiAgICAgICAgICAgIHB1c2ggQHBhdGgsICRjdXJyZW50OwogICAgICAgICAgICAkY3VycmVudCA9IHsgdHlwZSA9PiAkMSB9OwogICAgICAgICAgICBwdXNoIEB7ICRwYXRoWy0xXXtvYmplY3RzfSB9LCAkY3VycmVudDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKC9eRU5EOiguKikvaSkgewogICAgICAgICAgICBkaWUgIkVORCAkMSBpbiAkY3VycmVudC0+e3R5cGV9IgogICAgICAgICAgICAgIHVubGVzcyBsYyAkY3VycmVudC0+e3R5cGV9IGVxIGxjICQxOwogICAgICAgICAgICAkY3VycmVudCA9IHBvcCBAcGF0aDsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgICMgd2UnZCB1c2UgVGV4dDo6UGFyc2VXb3JkcyBoZXJlLCBidXQgaXQgbGlrZXMgdG8gc2VnZmF1bHQuCiAgICAgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gcGFyc2VfbGluZSggJzonLCAxLCAkXywgMik7CiAgICAgICAgJHZhbHVlID0gJycgdW5sZXNzIGRlZmluZWQgJHZhbHVlOwogICAgICAgIG15IEBwYXJhbXMgPSBwYXJzZV9saW5lKCAnOycsIDAsICRuYW1lICk7CiAgICAgICAgJG5hbWUgPSBzaGlmdCBAcGFyYW1zOwoKICAgICAgICAkdmFsdWUgPSB7IHZhbHVlID0+ICR2YWx1ZSB9OwoKICAgICAgICBmb3JlYWNoIG15ICRwYXJhbSAoQHBhcmFtcykgewogICAgICAgICAgICBteSAoJHBfbmFtZSwgJHBfdmFsdWUpID0gc3BsaXQgLz0vLCAkcGFyYW07CiAgICAgICAgICAgIHB1c2ggQHsgJHZhbHVlLT57cGFyYW1zfSB9LCB7ICRwX25hbWUgPT4gJHBfdmFsdWUgfQogICAgICAgICAgICAgIGlmICRzZWxmLT5wcmVzZXJ2ZV9wYXJhbXM7CiAgICAgICAgICAgICR2YWx1ZS0+e3BhcmFtfXsgJHBfbmFtZSB9ID0gJHBfdmFsdWU7CiAgICAgICAgfQogICAgICAgIHB1c2ggQHsgJGN1cnJlbnQtPntwcm9wZXJ0aWVzfXsgJG5hbWUgfSB9LCAkdmFsdWU7CiAgICB9CgogICAgIyBzb21ldGhpbmcgZGlkIGEgQkVHSU4gYnV0IG5vIEVORCAtIFRPRE8sIHVud2luZCB0aGlzIG5pY2VseSBhcwogICAgIyBpdCBtYXkgYmUgbW9yZSB0aGFuIG9uZSBsZXZlbAogICAgZGllICJCRUdJTiAkY3VycmVudC0+e3R5cGV9IHdpdGhvdXQgbWF0Y2hpbmcgRU5EIgogICAgICBpZiBAcGF0aDsKCiAgICByZXR1cm4gJGN1cnJlbnQ7Cn0KCiMgdGhpcyBtaWdodCBub3Qgc3RyaWN0bHkgY29tcGx5CnN1YiBnZW5lcmF0ZV9saW5lcyB7CiAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgbXkgJHRoaXMgPSBzaGlmdDsKCiAgICBteSBAbGluZXM7CiAgICAjIFhYWCBhbGwgdGhlIGV4aXN0ZW5jZSBjaGVja3MgYXJlIHRvIHByZXZlbnQgYXV0by12aXZpZmljYXRpb24KICAgICMgYnJlYWtpbmcgaWZfZGlmZiB0ZXN0cyAtIGRvIHdlIG1pbmQsIG9yIHNob3VsZCB0aGUgZmllbGRzIGhhdmUgYmVlbgogICAgIyB0aGVyZSBhbnl3YXk/CgogICAgcHVzaCBAbGluZXMsICJCRUdJTjokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIGlmIChleGlzdHMgJHRoaXMtPntwcm9wZXJ0aWVzfSkgewogICAgICAgIHdoaWxlIChteSAoJG5hbWUsICR2KSA9IGVhY2ggJXsgJHRoaXMtPntwcm9wZXJ0aWVzfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJHZhbHVlIChAJHYpIHsKICAgICAgICAgICAgICAgICMgWFhYIHNvIHdlJ3JlIHRha2luZyBwYXJhbXMgaW4gcHJlZmVyZW5jZSB0byBwYXJhbSwKICAgICAgICAgICAgICAgICMgbGV0J3MgYmUgc3VyZSB0byBkb2N1bWVudCB0aGF0IHdoZW4gd2UgZG9jdW1lbnQgdGhpcwogICAgICAgICAgICAgICAgIyBtZXRob2QKICAgICAgICAgICAgICAgIG15ICRwYXJhbSA9IGpvaW4gJzsnLCAnJywgbWFwIHsKICAgICAgICAgICAgICAgICAgICBteSAkaGFzaCA9ICRfOwogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICIkXyIgLiAoZGVmaW5lZCAkaGFzaC0+eyRffSA/ICAiPSIgLiAkaGFzaC0+eyRffSA6ICIiKQogICAgICAgICAgICAgICAgICAgIH0ga2V5cyAlJGhhc2gKICAgICAgICAgICAgICAgIH0gQHsgJHZhbHVlLT57cGFyYW1zfSB8fCBbICR2YWx1ZS0+e3BhcmFtfSBdIH07CiAgICAgICAgICAgICAgICBteSAkbGluZSA9ICIkbmFtZSRwYXJhbTokdmFsdWUtPnt2YWx1ZX0iOwogICAgICAgICAgICAgICAgIyB3cmFwcGluZywgYnV0IGRvbmUgdWdseQogICAgICAgICAgICAgICAgbXkgQGNodW5rcyA9ICRsaW5lID1+IG0vKC57MSw3Mn0pL2c7CiAgICAgICAgICAgICAgICBwdXNoIEBsaW5lcywgc2hpZnQgQGNodW5rczsKICAgICAgICAgICAgICAgIHB1c2ggQGxpbmVzLCBtYXAgeyAiICRfIiB9IEBjaHVua3M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGV4aXN0cyAkdGhpcy0+e29iamVjdHN9KSB7CiAgICAgICAgcHVzaCBAbGluZXMsICRzZWxmLT5nZW5lcmF0ZV9saW5lcyggJF8gKSBmb3IgQHsgJHRoaXMtPntvYmplY3RzfSB9CiAgICB9CiAgICBwdXNoIEBsaW5lcywgIkVORDokdGhpcy0+e3R5cGV9IiBpZiBleGlzdHMgJHRoaXMtPnt0eXBlfTsKICAgIHJldHVybiBAbGluZXM7Cn0KCgoxOwpfX0VORF9fCgo9aGVhZDEgREFUQSBTVFJVQ1RVUkUKCkEgdkZpbGUgY29udGFpbnMgb25lIG9yIG1vcmUgb2JqZWN0cywgZGVsaW1pdGVkIGJ5IEJFR0lOIGFuZCBFTkQgdGFncy4KCiAgQkVHSU46VkNBUkQKICAuLi4KICBFTkQ6VkNBUkQKCk9iamVjdHMgbWF5IGNvbnRhaW4gc3ViLW9iamVjdHM7CgogIEJFR0lOOlZDQUxFTkRBUgogIC4uLgogIEJFR0lOOlZFVkVOVAogIC4uLgogIEVORDpWRVZFTlQKICAuLi4KICBFTlY6VkNBTEVOREFSCgpFYWNoIG9iamVjdCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzLiAgRWFjaCBwcm9wZXJ0eQpjb25zaXN0cyBvZiBhIG5hbWUsIHplcm8gb3IgbW9yZSBvcHRpb25hbCBwYXJhbWV0ZXJzLCBhbmQgdGhlbiBhCnZhbHVlLiAgVGhpcyBmcmFnbWVudDoKCiAgRFRTVEFSVDtWQUxVRT1EQVRFOjE5OTcwMzE3CgppZGVudGlmaWVzIGEgcHJvcGVydHkgd2l0aCB0aGUgbmFtZSwgQzxEU1RBUlQ+LCB0aGUgcGFyYW1ldGVyCkM8VkFMVUU+LCB3aGljaCBoYXMgdGhlIHZhbHVlIEM8REFURT4sIGFuZCB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcwpDPDE5OTcwMzE3Pi4gIFRob3NlIG9mIHlvdSB3aXRoIGFuIFhNTCBiZW50IG1pZ2h0IGZpbmQgdGhpcyBtb3JlCnJlY29nbmlzYWJsZSBhczoKCiAgPGR0c3RhcnQgdmFsdWU9ImRhdGUiPjE5OTcwMzE3PC9kdHN0YXJ0PgoKVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBDPHBhcnNlKCk+IG1ldGhvZCBpcyBhIGhhc2ggcmVmLgoKVGhlIHRvcCBsZXZlbCBrZXksIEM8b2JqZWN0cz4sIHJlZmVycyB0byBhbiBhcnJheSByZWYuICBFYWNoIGVudHJ5IGluIHRoZQphcnJheSByZWYgaXMgYSBoYXNoIHJlZiB3aXRoIHR3byBvciB0aHJlZSBrZXlzLgoKVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBrZXksIEM8dHlwZT4sIGlzIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCnR5cGUgb2YgdGhlIG9iamVjdC4gIEUuZy4sIEM8VkNBUkQ+LCBDPFZFVkVOVD4sIGFuZCBzbyBvbi4KClRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGtleSwgQzxwcm9wZXJ0aWVzPiwgaXMgYSBoYXNoIHJlZiwgd2l0aCBwcm9wZXJ0eQpuYW1lcyBhcyBrZXlzLCBhbmQgYW4gYXJyYXkgcmVmIG9mIHRob3NlIHByb3BlcnR5IHZhbHVlcy4gIEl0J3MgYW4gYXJyYXkKcmVmLCBiZWNhdXNlIHNvbWUgcHJvcGVydGllcyBtYXkgYXBwZWFyIHdpdGhpbiBhbiBvYmplY3QgbXVsdGlwbGUgdGltZXMKd2l0aCBkaWZmZXJlbnQgdmFsdWVzLiAgRm9yIGV4YW1wbGU7CgogIEJFR0lOOlZFVkVOVAogIEFUVEVOREVFO0NOPSJOaWsgQ2xheXRvbiI6bWFpbHRvOm5pa0BGcmVlQlNELm9yZwogIEFUVEVOREVFO0NOPSJSaWNoYXJkIENsYW1wIjptYWlsdG86cmljaGFyZGNAdW5peGJlYXJkLm5ldAogIC4uLgogIEVORDpWRVZFTlQKCkVhY2ggZW50cnkgaW4gdGhlIGFycmF5IHJlZiBpcyBhIGhhc2ggcmVmIHdpdGggb25lIG9yIHR3byBrZXlzLgoKVGhlIGZpcnN0IGtleSwgQzx2YWx1ZT4sIGNvcnJlc3BvbmRzIHRvIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgoKVGhlIHNlY29uZCBrZXksIEM8cGFyYW0+LCBjb250YWlucyBhIGhhc2ggcmVmIG9mIHRoZSBwcm9wZXJ0eSdzCnBhcmFtZXRlcnMuICBLZXlzIGluIHRoaXMgaGFzaCByZWYgYXJlIHRoZSBwYXJhbWV0ZXIncyBuYW1lLCB0aGUgdmFsdWUKaXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlLiAgKElmIHlvdSBlbmFibGUgdGhlIEM8cHJlc2VydmVfcGFyYW1zPgpvcHRpb24gdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBrZXkgcG9wdWxhdGVkLCBjYWxsZWQgQzxwYXJhbXM+LiAgSXQgaXMKYW4gYXJyYXkgcmVmIG9mIGhhc2ggcmVmcywgZWFjaCBoYXNoIHJlZiBpcyB0aGUgcGFyYW1ldGVyJ3MgbmFtZSBhbmQKdGhlIHBhcmFtZXRlcidzIHZhbHVlIC0gdGhlc2UgYXJlIGNvbGxlY3RlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKZW5jb3VudGVyZWQgdG8gcHJldmVudCBoYXNoIGNvbGxpc2lvbnMgYXMgc2VlbiBpbiBzb21lIHZDYXJkIGZpbGVzKQpsaW5lLikKClRoZSB0aGlyZCBrZXkgaW4gdGhlIHRvcCBsZXZlbCBDPG9iamVjdHM+IGhhc2ggcmVmIGlzIEM8b2JqZWN0cz4uICBJZgppdCBleGlzdHMsIGl0IGluZGljYXRlcyB0aGF0IHN1Yi1vYmplY3RzIHdlcmUgZm91bmQuICBUaGUgdmFsdWUgb2YKdGhpcyBrZXkgaXMgYW4gYXJyYXkgcmVmIG9mIHN1Yi1vYmplY3RzLCB3aXRoIGlkZW50aWNhbCBrZXlzIGFuZApiZWhhdmlvdXIgdG8gdGhhdCBvZiB0aGUgdG9wIGxldmVsIEM8b2JqZWN0cz4ga2V5LiAgVGhpcyByZWN1cnNpdmUKc3RydWN0dXJlIGNvbnRpbnVlcywgbmVzdGluZyBhcyBkZWVwbHkgYXMgdGhlcmUgd2VyZSBzdWItb2JqZWN0cyBpbgp0aGUgaW5wdXQgZmlsZS4KClRoZSBDPGJpbi92MnlhbWw+IHNjcmlwdCB0aGF0IGNvbWVzIHdpdGggdGhpcyBkaXN0cmlidXRpb24gZGlzcGxheXMgdGhlCmZvcm1hdCBvZiBhIHZGaWxlIGFzIFlBTUwuICBDPHQvMDN1c2FnZS50PiBoYXMgZXhhbXBsZXMgb2YgcGlja2luZyBvdXQKdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlLgoKPWhlYWQxIEFVVEhPUlMKClJpY2hhcmQgQ2xhbXAgPHJpY2hhcmRjQHVuaXhiZWFyZC5uZXQ+IGFuZCBOaWsgQ2xheXRvbiA8bmlrQEZyZWVCU0Qub3JnPgoKPWhlYWQxIENPUFlSSUdIVAoKQ29weXJpZ2h0IDIwMDQsIDIwMTAsIDIwMTMgUmljaGFyZCBDbGFtcCBhbmQgTmlrIENsYXl0b24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CmFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCgo9aGVhZDEgQ0FWRUFUUwoKV2UgZG9uJ3QgZG8gYW55IGRlY29kaW5nIG9mIHByb3BlcnR5IHZhbHVlcywgaW5jbHVkaW5nIGRlc2NhcGluZwpDPFwsPiwgd2UncmUgc3RpbGwgdW5kZWNpZGVkIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyBhIGJ1Zy4KCj1oZWFkMSBCVUdTCgpBc2lkZSBmcm9tIHRoZSBUT0RPIGxpc3QgaXRlbXMsIG5vbmUga25vd24uCgo9aGVhZDEgU0VFIEFMU08KClRleHQ6OnZGaWxlIC0gcGFyc2VzIHRvIG9iamVjdHMsIGRvZXNuJ3QgaGFuZGxlIG5lc3RlZCBpdGVtcwoKUkZDIDI0MjYgLSB2Q2FyZCBzcGVjaWZpY2F0aW9uCgpSRkMgMjQ0NSAtIHZDYWxlbmRhciBzcGVjaWZpY2F0aW9uCgo9Y3V0CgojIEVtYWNzIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBzdHlsZSBjb25zaXN0ZW50CgogIExvY2FsIFZhcmlhYmxlczoKICBjcGVybC1pbmRlbnQtbGV2ZWw6IDQKICBFbmQ6Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ0JlbmFjaHJpY2h0aWd1bmcgw7xiZXIgRXJyZWljaGVuIGRlciBFcmlubmVydW5nc3plaXQgdm9uIFRlcm1pbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdTaWUgZXJoYWx0ZW4gaW1tZXIgZGFubiBlaW5lIEJlbmFjaHJpY2h0aWd1bmcsIHdlbm4gZGVyIEJlbmFjaHJpY2h0aWd1bmdzemVpdHB1bmt0IGbDvHIgZWluZW4gSWhyZXIgVGVybWluZSBlcnJlaWNodCB3dXJkZS4nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdWZXJ3YWx0dW5nIHZvbiBUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdIaWVyIGvDtm5uZW4gU2llIGVpbmUgS29uZmlndXJhdGlvbnNkYXRlaSBob2NobGFkZW4sIG1pdCBkZXIgVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuIGltIFN5c3RlbSBpbXBvcnRpZXJ0IHdlcmRlbiBrw7ZubmVuLiBEaWUgRGF0ZWkgbXVzcyBpbSAueW1sLUZvcm1hdCB2b3JsaWVnZW4sIHNvIHdpZSBzaWUgYXVjaCB2b20gVGVybWluYmVuYWNocmljaHRpZ3VuZ3Ntb2R1bCBleHBvcnRpZXJ0IHdpcmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnSGllciBrw7ZubmVuIFNpZSBhdXN3w6RobGVuLCB3ZWxjaGUgRXJlaWduaXNzZSBkaWVzZSBCZW5hY2hyaWNodGlndW5nIGF1c2zDtnNlbi4gRWluIHp1c8OkdHpsaWNoZXIgVGVybWluZmlsdGVyIGthbm4gd2VpdGVyIHVudGVuIGVpbmdlc3RlbGx0IHdlcmRlbiwgdW0gZGllIEJlbmFjaHJpY2h0aWd1bmdlbiBudXIgZsO8ciBUZXJtaW5lIG1pdCBiZXN0aW1tdGVuIE1lcmttYWxlbiB6dSB2ZXJzZW5kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ1Rlcm1pbmZpbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnVGVhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1Jlc291cmNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnTnVyIGVpbm1hbCBhbSBUYWcgcHJvIFRlcm1pbiB1bmQgQmVuYWNocmljaHRpZ3VuZ3MtVHJhbnNwb3J0bWV0aG9kZSB2ZXJzZW5kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnQmVuYWNocmljaHRpZ3VuZ2VuIHd1cmRlbiBhbiBlaW5lbiBBZ2VudGVuIHZlcnNlbmRldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0RpZSBlcnN0ZW4gMjAgWmVpY2hlbiBkZXMgVGVybWluYmV0cmVmZnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnRGllIFRlcm1pbi1BdHRyaWJ1dGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdEaWUgS2FsZW5kZXItQXR0cmlidXRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ0FnZW5kYcO8YmVyc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0thbGVuZGVyIHZlcndhbHRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdGYXJiZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0VuZHplaXRwdW5rdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdXaWVkZXJob2x1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnS2VpbmUgS2FsZW5kZXIgZ2VmdW5kZW4uIEJpdHRlIGxlZ2VuIFNpZSB6dWVyc3QgZWluZW4gS2FsZW5kZXIgw7xiZXIgZGllIEthbGVuZGVydmVyd2FsdHVuZyBhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0RpZXNlciBUZXJtaW4gd2llZGVyaG9sdCBzaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnTcO2Y2h0ZW4gU2llIG51ciBkaWVzZW4gVGVybWluIG9kZXIgYWxsZSBWb3Jrb21tbmlzc2UgYmVhcmJlaXRlbj8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnQWxsZSBWb3Jrb21tbmlzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdOdXIgZGllc2VuIFRlcm1pbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnS2FsZW5kZXJ2ZXJ3YWx0dW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnS2FsZW5kZXLDvGJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdFaW5lbiBuZXVlbiBLYWxlbmRlciBhbmxlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ05ldWVuIEthbGVuZGVyIGFubGVnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ1Rlcm1pbmUgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnS2FsZW5kZXIgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdIaWVyIGvDtm5uZW4gU2llIGVpbmUgS29uZmlndXJhdGlvbnNkYXRlaSBob2NobGFkZW4sIHVtIGVpbmVuIEthbGVuZGVyIGluIElociBTeXN0ZW0genUgaW1wb3J0aWVyZW4uIERpZSBEYXRlaSBtdXNzIGltIC55bWwgRm9ybWF0IHZvcmxpZWdlbiwgc28gd2llIHNpZSBpbiBkZXIgS2FsZW5kZXJ2ZXJ3YWx0dW5nIGV4cG9ydGllcnQgd3VyZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnS2FsZW5kZXItS29uZmlndXJhdGlvbiBob2NobGFkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnS2FsZW5kZXIgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0ZXIgZsO8ciBLYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICdBYmjDpG5naWcgdm9uIGRlciBHcnVwcGVuenVnZWjDtnJpZ2tlaXQgd2lyZCBkYXMgU3lzdGVtIEJlbnV0emVybiBkZW4gWnVncmlmZiBhbmhhbmQgaWhyZXIgQmVyZWNodGlndW5nZW4gZXJsYXViZW4gYnp3LiB2ZXJ3ZWlnZXJuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiBCZW51dHplciBrw7ZubmVuIFRlcm1pbmUgc2VoZW4gdW5kIEthbGVuZGVyIGV4cG9ydGllcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ1ZlcnNjaGllYmVuIGluOiBCZW51dHplciBrw7ZubmVuIFRlcm1pbmUgaW5uZXJoYWxiIGVpbmVzIEthbGVuZGVycyBiZWFyYmVpdGVuLCBkaWVzZSBqZWRvY2ggbmljaHQgaW4gYW5kZXJlIEthbGVuZGVyIHZlcnNjaGllYmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnRXJzdGVsbGVuOiBCZW51dHplciBrw7ZubmVuIFRlcm1pbmUgaW0gS2FsZW5kZXIgZXJzdGVsbGVuIHVuZCBsw7ZzY2hlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ3J3OiBCZW51dHplciBrw7ZubmVuIGRpZSBLYWxlbmRlciBhbiBzaWNoIHZlcndhbHRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGV4cG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnS2FsZW5kZXIgaGVydW50ZXJsYWRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICfDlmZmZW50bGljaGUgS2FsZW5kZXIgVVJMIGtvcGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG5hbWUnfSA9ICdLYWxlbmRlcm5hbWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnRWluIEthbGVuZGVyIG1pdCBnbGVpY2hlbSBOYW1lbiBleGlzdGllcnQgYmVyZWl0cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0JlcmVjaHRpZ3VuZ3NncnVwcGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ1RpY2tldCBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWdlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdWZXJ3ZW5kZW4gU2llIGRpZSBmb2xnZW5kZW4gT3B0aW9uZW4sICB1bSBlaW56dWdyZW56ZW4gd2VsY2hlIFRpY2tldC1UZXJtaW5lIGF1dG9tYXRpc2NoIGVyc3RlbGx0IHdlcmRlbiBzb2xsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdCaXR0ZSB3w6RobGVuIFNpZSBlaW5lIGfDvGx0aWdlIFF1ZXVlIGF1cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdTdWNoYXR0cmlidXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5pdGlvbiB2b24gUmVnZWxuLCB1bSBhdXRvbWF0aXNjaCBUZXJtaW5lIGluIGRpZXNlbSBLYWxlbmRlciB6dSBlcnN0ZWxsZW4sIHdlbGNoZSBhdWYgVGlja2V0ZGF0ZW4gYmFzaWVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnUmVnZWwgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ01laHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ1dlbmlnZXInOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnRWluZW4gbmV1ZW4gVGVybWluIGFubGVnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ1p1dmllbGUgYWt0aXZlIEthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ0JpdHRlIGRlYWt0aXZpZXJlbiBTaWUgenVlcnN0IGVpbmlnZSBvZGVyIGVyaMO2aGVuIFNpZSBkYXMgTGltaXQgaW4gZGVyIEtvbmZpZ3VyYXRpb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdXb2NoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ1plaXRzdHJhaGwgTW9uYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ1plaXRzdHJhaGwgV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnWmVpdHN0cmFobCBUYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NwcmluZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdWZXJ3ZXJmZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ0FuemVpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnR3J1bmRsZWdlbmRlIEluZm9ybWF0aW9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRGF0dW0vWmVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnQml0dGUgc2V0emVuIFNpZSBlaW5lbiBXZXJ0IHZvciBkZW0gRW5kZGF0dW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ0JpdHRlIHNldHplbiBTaWUgZWluZW4gV2VydCBuYWNoIGRlbSBTdGFydGRhdHVtLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRGllcyBpc3QgZWluIFZvcmtvbW1uaXMgZWluZXMgc2ljaCB3aWVkZXJob2xlbmRlbiBUZXJtaW5zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIGRlbiBFbHRlcm4tVGVybWluIGFuenV6ZWlnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIGRlbiBFbHRlcm4tVGVybWluIHp1IGJlYXJiZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZXF1ZW56JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnQWxsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXRpdmVyIFplaXRwdW5rdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICdNw7ZjaHRlbiBTaWUgZGllc2VuIFRlcm1pbiB3aXJrbGljaCBsw7ZzY2hlbj8gRGllc2Ugw4RuZGVydW5nIGthbm4gbmljaHQgcsO8Y2tnw6RuZ2lnIGdlbWFjaHQgd2VyZGVuLic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnVGVybWluZSBpbXBvcnRpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0RpZSBob2NoZ2VsYWRlbmUgRGF0ZWkgbXVzcyBpbiBlaW5lbSBnw7xsdGlnZW4gaUNhbC1Gb3JtYXQgKC5pY3MpIHZvcmxpZWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU29sbHRlIGVpbiBnZXfDvG5zY2h0ZXIgS2FsZW5kZXIgaGllciBuaWNodCBhdWZnZWxpc3RldCBzZWluLCBzdGVsbGVuIFNpZSBiaXR0ZSBzaWNoZXIsIGRhc3MgU2llIG1pbmRlc3RlbnMgZGllIEJlcmVjaHRpZ3VuZyB6dW0gRXJzdGVsbGVuIHZvbiBLYWxlbmRlcm4gYmVzaXR6ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnRXhpc3RpZXJlbmRlIFRlcm1pbmUgw7xiZXJzY2hyZWliZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQWxsZSBleGlzdGllcmVuZGVuIFRlcm1pbmUgbWl0IGRlciBzZWxiZW4gIlVuaXF1ZUlEIiBpbSBlbnRzcHJlY2hlbmRlbiBLYWxlbmRlciB3ZXJkZW4gw7xiZXJzY2hyaWViZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0thbGVuZGVyIGhvY2hsYWRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnVGVybWluZSBpbXBvcnRpZXJlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOZXVlciBUZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ0RlbW7DpGNoc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBUYWdlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0JlbmFjaHJpY2h0aWd1bmdzbmFtZSBleGlzdGllcnQgYmVyZWl0cyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW50ZW4gKFJlc291cmNlbiksIHdlbGNoZSBpbm5lcmhhbGIgZGVzIFRlcm1pbnMgYXVzZ2V3w6RobHQgd3VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGUgQWdlbnRlbiBtaXQgKG1pbmRlc3RlbnMpIExlc2ViZXJlY2h0aWd1bmcgZsO8ciBkZW4gVGVybWluKGthbGVuZGVyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0FsbGUgQWdlbnRlbiBtaXQgU2NocmVpYmJlcmVjaHRpZ3VuZyBmw7xyIGRlbiBUZXJtaW4oa2FsZW5kZXIpJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdEYXMgU3lzdGVtIGtvbm50ZW4gZGVuIEthbGVuZGVyIG5pY2h0IGVyc3RlbGxlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdLZWluZSBDYWxlbmRlcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdTaWUgaGFiZW4ga2VpbmUgWnVncmlmZnNiZXJlY2h0aWd1bmcgYXVmIGRpZXNlbiBLYWxlbmRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0thbGVuZGVyIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0ZlaGxlciBiZWltIEFrdHVhbGlzaWVyZW4gZGVzIEthbGVuZGVycyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ0thbGVuZGVyIEtvbmZpZ3VyYXRpb25zZGF0ZWkga29ubnRlIG5pY2h0IGdlbGVzZW4gd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdCaXR0ZSBzdGVsbGVuIFNpZSBzaWNoZXIsIGRhc3MgZGllIERhdGVpIGfDvGx0aWcgaXN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdLYWxlbmRlciBrb25udGUgbmljaHQgaW1wb3J0aWVydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0thbGVuZGVyIHd1cmRlIGltcG9ydGllcnQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdDYWxlbmRhcklEIHdpcmQgYmVuw7Z0aWd0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ0RhdGVuIGtvbm50ZW4gbmljaHQgYWJnZXJ1ZmVuIHdlcmRlbiBmw7xyIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ0VzIHd1cmRlKG4pICVzIFRlcm1pbihlKSBlcmZvbGdyZWljaCBpbiBLYWxlbmRlciAlcyBpbXBvcnRpZXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIE1pbnV0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIFN0dW5kZSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdBbGxlIFRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnTWlyIHp1Z2V3aWVzZW5lIFRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ0VzIHdlcmRlbiBudXIgVGVybWluZSBhbmdlemVpZ3QsIGRpZSBJaG5lbiB6dWdld2llc2VuIHNpbmQhIEVpbnN0ZWxsdW5nZW4gw6RuZGVybic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdUZXJtaW4gd3VyZGUgbmljaHQgZ2VmdW5kZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTmllbWFscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdKZWRlbiBUYWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0plZGUgV29jaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdKZWRlbiBNb25hdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnSmVkZXMgSmFocic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdCZW51dHplcmRlZmluaWVydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ3TDpGdsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ3fDtmNoZW50bGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnbW9uYXRsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ2rDpGhybGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ2FsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICdmw7xyICVzIFdpZWRlcmhvbHVuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2JpcyAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnZsO8ciAuLi4gV2llZGVyaG9sdW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdiaXMgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnS2VpbmUgQmVuYWNocmljaHRpZ3VuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMgTWludXRlKG4pIHZvcmhlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIFN0dW5kZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIFRhZyhlKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyBXb2NoZShuKSB2b3JoZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdiZXZvciBkZXIgVGVybWluIGJlZ2lubnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICduYWNoZGVtIGRlciBUZXJtaW4gYmVnb25uZW4gaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2Jldm9yIGRlciBUZXJtaW4gZW5kZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnbmFjaGRlbSBkZXIgVGVybWluIGdlZW5kZXQgaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdUaWNrZXQtVGVybWluIGtvbm50ZSBuaWNodCBnZWzDtnNjaHQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdLZWluZSBCZXJlY2h0aWd1bmchJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdEYXMgU3lzdGVtIGtvbm50ZSBkaWUgRGF0ZWkgbmljaHQgaW1wb3J0aWVyZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ0JpdHRlIHByw7xmZW4gU2llIGRhcyBTeXN0ZW1wcm90b2tvbGwgZsO8ciB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbWVocic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ0tlaW4gJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdLZWluIEJlbnV0emVyIGdlZnVuZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ1VuZ8O8bHRpZ2VyIEthbGVuZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVbmfDvGx0aWdlIFVSTCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnRXMgaXN0IGVpbiBGZWhsZXIgYmVpbSBFeHBvcnRpZXJlbiBkZXMgS2FsZW5kZXJzIGF1ZmdldHJldGVuISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0FrdHVhbGlzaWVydW5nIChNaW51dGVuKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnVGVybWlua2FsZW5kZXIgw5xiZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnVGVybWluYmVuYWNocmljaHRpZ3VuZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdUZXJtaW5rYWxlbmRlciBFdmVudC1Nb2R1bCwgd2VsY2hlcyBCZW5hY2hyaWNodGlndW5nc2VpbnRyw6RnZSBmw7xyIFRlcm1pbmUgdm9yYmVyZWl0ZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdUZXJtaW4tS2FsZW5kZXIgRXZlbnRtb2R1bCwgd2VsY2hlcyBUaWNrZXRzIG1pdCBEYXRlbiBhdXMgVGlja2V0LVRlcm1pbmVuIGFrdHVhbGlzaWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnVGVybWluYmVhcmJlaXR1bmdzYW5zaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnVGVybWlubGlzdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdUZXJtaW5saXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ1Rlcm1pbmJlbmFjaHJpY2h0aWd1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnS2FsZW5kZXJ2ZXJ3YWx0dW5nc2Fuc2ljaHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRsO8ciB3ZWxjaGUgVmVyw6RuZGVydW5nZW4gYW4gVGVybWluZW4gbcO2Y2h0ZW4gU2llIEJlbmFjaHJpY2h0aWd1bmdlbiBlcmhhbHRlbj8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0Vyc3RlbGx0IGVpbmVuIG5ldWVuIFRlcm1pbiBpbiBlaW5lbSBLYWxlbmRlciwgd2VsY2hlciBkaXJla3QgbWl0IGRpZXNlbSBUaWNrZXQgdmVya27DvHBmdCBpc3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4gZXJzdGVsbGVuIHVuZCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnRWluZW4gbmV1ZW4gVGVybWluIGVyc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0xlZ3QgZmVzdCB3ZWxjaGUgU3BhbHRlbiBpbSBUZXJtaW52ZXJrbsO8cGZ1bmdzLVdpZGdldCBhbmdlemVpZ3Qgd2VyZGVuIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIE3DtmdsaWNoZSBFaW5zdGVsbHVuZ2VuOiAwID0gRGVha3RpdmllcnQsIDEgPSBWZXJmw7xnYmFyLCAyID0gU3RhbmRhcmRtw6TDn2lnIGFrdGl2aWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnQmVzY2hyZWlidCBlaW4gU3ltYm9sIG1pdCBWZXJrbsO8cGZ1bmcgenVyIEdvb2dsZSBNYXBzIFdlYnNlaXRlIG1pdCBkZW0gYWt0dWVsbGVuIFN0YW5kb3J0IGFscyBlbnRzcHJlY2hlbmRlcyBaaWVsIGluIGRlciBUZXJtaW5iZWFyYmVpdHVuZ3MtT2JlcmZsw6RjaGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnTGVndCBkaWUgRXZlbnQtT2JqZWt0dHlwZW4gZmVzdCwgd2VsY2hlIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQgdmVyYXJiZWl0ZXQgd2VyZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0xlZ3QgZGllIExpc3RlIGRlciBQYXJhbWV0ZXIgZmVzdCwgd2VsY2hlIG1pdCBkZXIgVGlja2V0c3VjaGZ1bmt0aW9uIHZlcndlbmRldCB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnQmVzY2hyZWlidCBkZW4gVGlja2V0LVRlcm1pbi1CYWNrZW5kIFR5cCBmw7xyIERhdHVtL1VocnplaXQgZHVyY2ggZHluYW1pc2NoZSBGZWxkZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdCZXNjaHJlaWJ0IGRlbiBUaWNrZXQtVGVybWluLUJhY2tlbmQgVHlwIGbDvHIgVGlja2V0ZXNrYWxhdGlvbmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnQmVzY2hyZWlidCBkZW4gVGlja2V0LVRlcm1pbi1CYWNrZW5kIFR5cCBmw7xyIFRpY2tldHBlbmRpbmd6ZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdMZWd0IGRhcyBUaWNrZXQtUGx1Z2luIGbDvHIgVGVybWluZSBmZXN0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ1Rlcm1pbiBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdaZWl0IGbDvHIgZXJzdGUgUmVha3Rpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnVGVybWluLUltcG9ydCBPYmVyZmzDpGNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdWZXJrbsO8cGZ0IFRlcm1pbmUgdW5kIFRpY2tldHMgbWl0IGVpbmVtIExpbmsgdm9tIFR5cCAiTm9ybWFsIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RlIGFsbGVyIFRlcm1pbi1FdmVudHMsIHdlbGNoZSBpbiBkZXIgR1VJIGFuZ2V6ZWlndCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0ZSBhbGxlciBLYWxlbmRlcmVyZWlnbmlzc2UsIHdlbGNoZSBpbiBkZXIgZ3JhZmlzY2hlbiBCZW51dHplcm9iZXJmbMOkY2hlIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RlIGFuIEZhcmJlbiBpbiBIZXhhZGV6aW1hbCBSR0IsIHdlbGNoZSB2ZXJzY2hpZWRlbmVuIEJlbnV0emVya2FsZW5kZXJuIHp1Z2V3aWVzZW4gd2VyZGVuLiBTdGVsbGVuIFNpZSBzaWNoZXIsIGRhc3MgZGllIEZhcmJlbiBkdW5rZWwgZ2VudWcgc2luZCwgdW0gd2Vpw59lbiBUZXh0IGRhcmF1ZiBkYXJ6dXN0ZWxsZW4uIFNvZmVybiBkaWUgQW56YWhsIGRlciBLYWxlbmRlciBkaWUgQW56YWhsIGRlciB2ZXJmw7xnYmFyZW4gRmFyYmVuIMO8YmVyc2NocmVpdGV0LCB3aXJkIGRpZXNlIExpc3RlIGVybmV1dCB2b24gQW5mYW5nIGFuIGdlbnV0enQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ1ZlcnNjaGllZGVuZSBLYWxlbmRlciB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdNYXhpbWFsZSBBbnphaGwgYW4gYWt0aXZlbiBLYWxlbmRlcm4gaW4gZGVyIEthbGVuZGVyw7xiZXJzaWNodCBvZGVyIFJlc291cmNlbsO8YmVyc2ljaHQuIEJpdHRlIGJlYWNodGVuIFNpZSwgZGFzcyBzaWNoIHp1dmllbGUgZ2xlaWNoemVpdGlnIGFrdGl2ZSBLYWxlbmRlciBhdWZncnVuZCB2aWVsZXIgZ2xlaWNoemVpdGlnZXIgQW5mcmFnZW4gYXVmIGRpZSBQZXJmb3JtYW5jZSBkZXMgU3lzdGVtcyBhdXN3aXJrZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyB1bnRlcnN0w7x0enQga2VpbmUgd2llZGVyaG9sZW5kZW4gVGVybWluZSBvaG5lIEVuZGRhdHVtIG9kZXIgQW56YWhsIGRlciBEdXJjaGzDpHVmZS4gV8OkaHJlbmQgZGVzIEltcG9ydGllcnVuZ3Nwcm96ZXNzZXMga2FubiBlcyB2b3Jrb21tZW4sIGRhc3MgZGllIGVudHNwcmVjaGVuZGUgSUNTLURhdGVpIHNvbGNoZSBUZXJtaW4gZW50aMOkbHQuIFN0YXR0ZGVzc2VuIHdpcmQgZGFzIFN5c3RlbSBhbGxlIHZlcmdhbmdlbmVuIFRlcm1pbmUgZXJzdGVsbGVuLCBzb3dpZSB6dXPDpHR6bGljaCBUZXJtaW5lIGbDvHIgZGllIGtvbW1lbmRlbiBuIE1vbmF0ZSAoMTIwIE1vbmF0ZSAvIDEwIEphaHJlIHN0YW5kYXJkbcOkw59pZykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnw5xiZXJzaWNodCBhbGxlciBUZXJtaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1dhcnRlbiBiaXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ1BsdWdpbnN1Y2hlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnTW9kdWxlIHp1ciBQbHVnaW5zdWNoZSBmw7xyIGRpZSBBdXRvdmVydm9sbHN0w6RuZGlndW5nLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfDlmZmZW50bGljaGVyIEthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfDlmZmZW50bGljaGVyIEthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzb3VyY2Vuw7xiZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdSZXNvdXJjZW7DvGJlcnNpY2h0IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdaZWlndCBlaW5lbiBMaW5rIGltIE1lbsO8IGRlciBUaWNrZXRab29tLUFuc2ljaHQgaW0gQWdlbnRlbi1JbnRlcmZhY2UgYW4sIHVtIFRlcm1pbmUgenUgZXJzdGVsbGVuLCB3ZWxjaGUgZGlyZWt0IG1pdCBkZW0gZW50c3ByZWNoZW5kZW4gVGlja2V0IHZlcmtuw7xwZnQgc2luZC4gWnVzw6R0emxpY2hlIFp1Z3JpZmZza29udHJvbGxlLCBvYiBkZXIgTWVuw7xwdW5rdCBhbmdlemVpZ3Qgd2lyZCBvZGVyIG5pY2h0LCBrYW5uIG1pdCBkZW0gU2NobMO8c3NlbCAiR3J1cHBlIiB1bmQgIkluaGFsdCIgd2llIHouQi4gKCJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIpIGVycmVpY2h0IHdlcmRlbi4gVW0gTWVuw7xlaW50csOkZ2UgenUgZ3J1cHBpZXJlbiwgdmVyd2VuZGVuIFNpZSBkZW4gU2NobMO8c3NlbCAiQ2x1c3Rlck5hbWUiIHVuZCBpbSBJbmhhbHQgZGVuIE5hbWVuLCB3ZWxjaGVuIFNpZSBpbiBkZXIgQW5zaWNodCB2ZXJ3ZW5kZW4gbcO2Y2h0ZW4uIFZlcndlbmRlbiBTaWUgIkNsdXN0ZXJQcmlvcml0eSIgdW0gZGllIFJlaWhlbmZvbGdlIGluIGRlciBqZXdlaWxpZ2VuIEdydXBwaWVydW5nIHp1IGJlZWluZmx1c3Nlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ0zDtnN1bmdzemVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ1RyYW5zcG9ydGF1c3dhaGwgZsO8ciBUZXJtaW5iZW5hY2hyaWNodGlndW5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnU3TDtsOfdCBkYXMgSGluenVmw7xnZW4gb2RlciBBa3R1YWxpc2llcmVuIHZvbiBhdXRvbWF0aXNjaGVuIFRlcm1pbmVuIGFuLCBiYXNpZXJlbmQgYXVmIFRpY2tldHplaXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdBa3R1YWxpc2llcnVuZ3N6ZWl0JzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfQ09fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHNlcsOhbiBjcmVhZGFzIGF1dG9tw6F0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb29yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGZpbGEgdsOhbGlkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmUgcmVnbGFzIHBhcmEgY3JlYWNpw7NuIGRlIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdEZW1hc2lhZG9zIGNhbGVuZGFyaW9zIGFjdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yIGRlc2FjdGl2ZSBhbGd1bm9zIHByaW1lcm8gbyBpbmNyZW1lbnRlIGVsIGzDrW1pdGUgZW4gbGEgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gTWVuc3VhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gRGlhcmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTYWx0YXIgYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnRGVzY2FydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRmVjaGEvSG9yYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBhbnRlcyBkZSBsYSBmZWNoYSBkZSB0w6lybWluby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBkZXNwdcOpcyBkZSBsYSBmZWNoYSBkZSBpbmljaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0VzdGEgZXMgdW5hIG9jdXJyZW5jaWEgZGUgdW5hIGNpdGEgcmVwZXRpdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSB2ZXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgZWRpdGFyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZWN1ZW5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdDYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdQdW50byBkZSB0aWVtcG8gcmVsYXRpdm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ8K/RXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBlbGltaW5hciBlc3RhIGNpdGE/IEVzdGEgb3BlcmFjacOzbiBubyBzZSBwdWVkZSBkZXNoYWNlci4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ0ltcG9ydGFyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdFbCBhcmNoaXZvIGNhcmdhZG8gdGllbmUgcXVlIGVzdGFyIGVuIHVuIGZvcm1hdG8gaUNhbCB2w6FsaWRvICguaWNzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdTaSBlbCBDYWxlbmRhcmlvIGRlc2VhZG8gbm8gYXBhcmVjZSBlbiBsYSBsaXN0YSwgcG9yIGZhdm9yIGFzZWfDunJlc2UgZGUgcXVlIHRlbmdhIGFsIG1lbm9zIGVsIHBlcm1pc28gZGUgImNyZWFyIic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ8K/QWN0dWFsaXphciBsYXMgY2l0YXMgZXhpc3RlbnRlcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdUb2RhcyBsYXMgY2l0YXMgZXhpc3RlbnRlcyBlbiBlbCBjYWxlbmRhcmlvIGNvbiBlbCBtaXNtbyBVbmlxdWVJRCBzZSBzb2JyZXNjcmliaXLDoW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnQ2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIGNpdGFzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ051ZXZhIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1Byb250byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGTDrWFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0VsIG5vbWJyZSBkZSBsYSBub3RpZmljYWNpw7NuIHlhIGV4aXN0ZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW50ZXMgKHJlY3Vyc29zKSwgcXVlIHB1ZWRlbiBzZXIgc2VsZWNjaW9uYWRvcyBkZW50cm8gZGUgdW5hIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWdlbnRlcyBjb24gKGFsIG1lbm9zKSBwZXJtaXNvcyBkZSBsZWN0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdUb2RvcyBsb3MgYWdlbnRlcyBjb24gcGVybWlzb3MgZGUgZXNjcml0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBjcmVhciBlbCBDYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnTGEgY2l0YSBubyBmdWUgZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlIHF1ZSBsYSBjaXRhIGluaWNpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRlIHF1ZSB0ZXJtaW5lIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGUgcXVlIGxhIGNpdGEgaGFsbGEgZmluYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ05vIHRpZW5lIHBlcm1pc29zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdMYSBjaXRhIG5vIHB1ZWRlIHNlciBib3JyYWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG3DoXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdObyBzZSB0aWVuZSAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05vIGV4aXN0ZSBlbCB1c3VhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ0NhbGVuZGFyaW8gaW52w6FsaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ1VSTCBpbnbDoWxpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ1NlIHByb2R1am8gdW4gZXJyb3IgYWwgZXhwb3J0YXIgZWwgY2FsZW5kYXJpbyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdBY3R1YWxpemF0aW9uIChtaW51dG9zKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnUMOhZ2luYSBkZSByZXN1bWVuIGRlbCBDYWxlbmRhcmlvIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlbCBjYWxlbmRhcmlvIGRlIGNpdGFzIHF1ZSBwcmVwYXJhIGVudHJhZGFzIHBhcmEgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgYWN0dWFsaXphIGxvcyBkYXRvcyBkZWwgdGlja2V0IGRlc2RlIHVuYSBjaXRhIGRlIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBnZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdFbGlqYSBlbCB0aXBvIGRlIGNhbWJpb3MgZW4gbGFzIGNpdGFzIHBhciBsYXMgY3VhbGVzIGRlc2VhIHJlY2liaXIgbm90aWZpY2FjaW9uZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmVhciB1bmEgbnVldmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhIGVzdGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQ3JlYXIgeSBnZXN0aW9uYXIgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnQ3JlYXIgbnVldmEgY2l0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmUgY3VhbGVzIGNvbHVtbmFzIHNlcsOhbiBtb3N0cmFkYXMgZW4gd2lkZ2V0IGRlIGNpdGFzIHZpbmN1bGFkYXMgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZWphIikuIFBvc2libGVzIGFqdXN0ZXM6IDAgPSBEZXNoYWJpdGFkYSwgMSA9IEhhYmlsaXRhZGEsIDIgPSBIYWJpbGl0YWRhIHBvciBvbWlzacOzbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5lIHVuIGljb25vIGRlIHbDrW5jdWxvIGEgbGEgcGFnaW5hIGRlIGdvb2dsZSBtYXAgZGUgbGEgdWJpY2FjacOzbiBhY3R1YWwgZW4gbGEgcGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnRGVmaW5lIGxvcyB0aXBvcyBkZSBvYmpldG8gZGUgZXZlbnRvIHF1ZSBzZSBtYW5lamFuIGEgdHJhdsOpcyBkZWwgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluZSBsYSBsaXN0YSBkZSBwYXLDoW1ldHJvcyBxdWUgcHVlZGVuIHNlciBlbnZpYWRvcyBhIGxhIGZ1bmNpw7NuIGRlIGLDunNxdWVkYSBkZSB0aWNrZXRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGNhbXBvcyBkaW7DoW1pY29zIGRlIHRpY2tldCBkZSB0aXBvIGZlY2hhIHkgaG9yYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzY2FsYW1pZW50byBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc3BlcmEgZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmUgZWwgcGx1Z2luIGRlIHRpY2tldCBwYXJhIGxhcyBjaXRhcyBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdDYW1wb0RpbsOhbWljb18lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnRWRpdGFyIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1RpZW1wbyBkZSBwcmltZXJhIHJlc3B1ZXN0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBpbXBvcnRhY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ1ZpbmN1bGFyIGNpdGFzIHkgdGlja2V0cyBjb24gZWwgdGlwbyBkZSB2w61uY3VsbyAiTm9ybWFsIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNpdGFzIHF1ZSBzb24gZGVzcGxlZ2FvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBzb24gZGVzcGxlZ2Fkb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGRlIGNvbG9yZXMgZW4gaGV4YWRlY2ltYWwgUkdCIHF1ZSBlc3RhcsOhbiBkaXNwb25pYmxlcyBwYXJhIHN1IHNlbGVjY2nDs24gZHVyYW50ZSBsYSBjcmVhY2nDs24gZGUgY2FsZW5kYXJpb3MuIEFzZWfDunJlc2UgcXVlIGxvcyBjb2xvcmVzIHNlYW4gc3VmaWNpZW50ZW1lbnRlIG9ic2N1cm9zIHBhcmEgcXVlIGVsIHRleHRvIGJhbmNvIHNlIHZlYSBjb3JyZWN0YW1lbnRlIHNvYnJlIGVsbG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdHZXN0aW9uYXIgZGlmZXJlbnRlcyBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdOdW1lcm8gbcOheGltbyBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIGVuIGxhcyBwYW50YWxsYXMgZGUgcmVzdW1lbi4gUG9yIGZhdm9yIG5vdGUgcXVlIHVuIG51bWVybyBncmFuZGUgZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBwdWVkZSB0ZW5lciB1biBpbXBhY3RvIG5lZ2F0aXZvIGVuIGVsIGRlc2VtcGXDsW8gZGVsIHNlcnZpZG9yIGRlYmlkbyBhIHVuYSBncmFuIGNhbnRpZGFkIGRlIGxsYW1hZGFzIHNpbXVsdMOhbmVhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyBubyBhZG1pdGUgY2l0YXMgcmVjdXJyZW50ZXMgc2luIGZlY2hhIGRlIGZpbmFsaXphY2nDs24gbyBzaW4gbsO6bWVybyBkZSBpdGVyYWNpb25lcy4gRHVyYW50ZSBlbCBwcm9jZXNvIGRlIGltcG9ydGFjacOzbiwgcHVlZGUgb2N1cnJpciBxdWUgZWwgYXJjaGl2byBJQ1MgY29udGVuZ2EgZGljaGFzIGNpdGFzLiBFbiBzdSBsdWdhciwgZWwgc2lzdGVtYSBjcmVhIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBwYXNhZG8sIGFkZW3DoXMgZGUgY2l0YXMgcGFyYSBsb3MgcHLDs3hpbW9zIG4gbWVzZXMgKDEyMCBtZXNlcyAvIDEwIGHDsW9zIHBvciBkZWZlY3RvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdSZXN1bWVuIGRlIHRvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdUaWVtcG8gZGUgZXNwZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdCw7pzcXVlZGEgZGUgcGx1Zy1pbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNw7NkdWxvIFBsdWctaW4gZGUgYsO6c3F1ZWRhIHBhcmEgYXV0by1jb21wbGV0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0NhbGVuZGFyaW8gUMO6cGxpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0NhbGVuZGFyaW8gcMO6YmxpY28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdNdWVzdHJhIHVuIHbDrW5jdWxvIGVuIGVsIG1lbsO6IHBhcmEgY3JlYXIgdW5hIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYWwgdGlja2V0IGRpcmVjdG8gZGVzZGUgIGxhIHZpc3RhIGRlIGRldGFsbGUgZGUgdGlja2V0IGRlIGxhIGludGVyZmFjZSBkZWwgYWdlbnRlLiBBZGljaW9uYWxtZW50ZSBzZSBwdWVkZSBoYWNlciBpbiBjb250cm9sIGRlIGFjY2VzbyBwYXJhIG1vc3RyYXIgbyBubyBlc3RlIHbDrW5jdWxvIHVzYW5kbyBsYSBDbGF2ZSAiR3JvdXAiIHkgZWwgQ29udGVuaWRvIGNvbW8gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gUGFyYSBhZ3J1cGFyIGVsZW1lbnRvIGRlbCBtZW7DuiB1c2UgbGEgQ2xhdmUgIkNsdXN0ZXJOYW1lIiBwYXJhIGVsIENvbnRlbmlkbyBjdWFscXVpZXIgbm9tYnJlIHF1ZSBkZXNlZSB2ZXIgZW4gbGEgaW50ZXJmYWNlIGRlbCB1c3VhcmlvLiBVdGlsaXplICJDbHVzdGVyUHJpb3JpdHkiIHBhcmEgY29uZmlndXJhciBlbCBvcmRlbiBkZSB1biBjaWVydG8gZ3J1cG8gZGVudHJvIGRlIGxhIGJhcnJhIGRlIGhlcnJhbWllbnRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1RpZW1wbyBkZSBTb2x1Y2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdTZWxlY3Rpb24gZGUgdHJhbnNwb3J0ZSBwYXJhIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdEaXNwYXJhIGxhIGFjY2nDs24gZGUgYcOxYWRpciBvIGFjdHVhbGl6YXIgY2l0YXMgYXV0b23DoXRpY2FzIGRlIGNhbGVuZGFyaW9zIGJhc2FkYXMgZW4gY2llcnRvcyB0aWVtcG9zIGRlIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVGllbXBvIGRlIEFjdHVhbGl6YWNpw7NuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfTVhfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHNlcsOhbiBjcmVhZGFzIGF1dG9tw6F0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb29yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGZpbGEgdsOhbGlkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkZSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmUgcmVnbGFzIHBhcmEgY3JlYWNpw7NuIGRlIGNpdGFzIGF1dG9tw6F0aWNhcyBlbiBlc3RlIGNhbGVuZGFyaW8gYmFzYWRhcyBlbiBsb3MgZGF0b3MgZGUgbG9zIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnQcOxYWRpciByZWdsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTcOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQcOxYWRpciBudWV2YSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ0NhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdEZW1hc2lhZG9zIGNhbGVuZGFyaW9zIGFjdGl2b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnUG9yIGZhdm9yIGRlc2FjdGl2ZSBhbGd1bm9zIHByaW1lcm8gbyBpbmNyZW1lbnRlIGVsIGzDrW1pdGUgZW4gbGEgY29uZmlndXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1NlbWFuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gTWVuc3VhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0zDrW5lYSBkZSB0aWVtcG8gRGlhcmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICdTYWx0YXIgYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnRGVzY2FydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNb3N0cmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGLDoXNpY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnRmVjaGEvSG9yYSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBhbnRlcyBkZSBsYSBmZWNoYSBkZSB0w6lybWluby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnUG9yIGZhdm9yIGZpamUgZXN0ZSB2YWxvciBkZXNwdcOpcyBkZSBsYSBmZWNoYSBkZSBpbmljaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0VzdGEgZXMgdW5hIG9jdXJyZW5jaWEgZGUgdW5hIGNpdGEgcmVwZXRpdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSB2ZXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnUHJlY2lvbmUgYXF1w60gIHBhcmEgZWRpdGFyIGxhIGNpdGEgcGFkcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZWN1ZW5jaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdDYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdQdW50byBkZSB0aWVtcG8gcmVsYXRpdm8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ8K/RXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBlbGltaW5hciBlc3RhIGNpdGE/IEVzdGEgb3BlcmFjacOzbiBubyBzZSBwdWVkZSBkZXNoYWNlci4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ0ltcG9ydGFyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICdFbCBhcmNoaXZvIGNhcmdhZG8gdGllbmUgcXVlIGVzdGFyIGVuIHVuIGZvcm1hdG8gaUNhbCB2w6FsaWRvICguaWNzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICdTaSBlbCBDYWxlbmRhcmlvIGRlc2VhZG8gbm8gYXBhcmVjZSBlbiBsYSBsaXN0YSwgcG9yIGZhdm9yIGFzZWfDunJlc2UgZGUgcXVlIHRlbmdhIGFsIG1lbm9zIGVsIHBlcm1pc28gZGUgImNyZWFyIic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ8K/QWN0dWFsaXphciBsYXMgY2l0YXMgZXhpc3RlbnRlcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdUb2RhcyBsYXMgY2l0YXMgZXhpc3RlbnRlcyBlbiBlbCBjYWxlbmRhcmlvIGNvbiBlbCBtaXNtbyBVbmlxdWVJRCBzZSBzb2JyZXNjcmliaXLDoW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnQ2FyZ2FyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIGNpdGFzJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ051ZXZhIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1Byb250byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGTDrWFzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ0VsIG5vbWJyZSBkZSBsYSBub3RpZmljYWNpw7NuIHlhIGV4aXN0ZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW50ZXMgKHJlY3Vyc29zKSwgcXVlIHB1ZWRlbiBzZXIgc2VsZWNjaW9uYWRvcyBkZW50cm8gZGUgdW5hIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWdlbnRlcyBjb24gKGFsIG1lbm9zKSBwZXJtaXNvcyBkZSBsZWN0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdUb2RvcyBsb3MgYWdlbnRlcyBjb24gcGVybWlzb3MgZGUgZXNjcml0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBjcmVhciBlbCBDYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0NhbGVuZGFyaW8gaW1wb3J0YWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAnU2UgbmVjZXNpdGEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOb3Qgc2UgcHVlZGVuIG9idGVuZXIgbG9zIGRhdG9zIHBhcmEgZWwgQ2FsZW5kYXJJRCBlc3BlY2lmaWNhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1NlIGhhbiBpbXBvcnRhZG8gJXMgY2l0YShzKSBhbCBjYWxlbmRhcmlvICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dG9zICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBob3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ1RvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdDaXRhcyBhc2lnbmFkYXMgYSBtw60gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFuZG8gc29sbyBjaXRhcyBhc2lnbmFkYXMgYSB0w60hIENhbWJpYXIgY29uZmlndXJhY2nDs24nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnTGEgY2l0YSBubyBmdWUgZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlIHF1ZSBsYSBjaXRhIGluaWNpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlIHF1ZSBsYSBjaXRhIGhhbGxhIGluaWNpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ2FudGVzIGRlIHF1ZSB0ZXJtaW5lIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGUgcXVlIGxhIGNpdGEgaGFsbGEgZmluYWxpemFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ05vIHRpZW5lIHBlcm1pc29zISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdMYSBjaXRhIG5vIHB1ZWRlIHNlciBib3JyYWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICdObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIG3DoXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdObyBzZSB0aWVuZSAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ05vIGV4aXN0ZSBlbCB1c3VhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ0NhbGVuZGFyaW8gaW52w6FsaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ1VSTCBpbnbDoWxpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ1NlIHByb2R1am8gdW4gZXJyb3IgYWwgZXhwb3J0YXIgZWwgY2FsZW5kYXJpbyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdBY3R1YWxpemF0aW9uIChtaW51dG9zKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnUMOhZ2luYSBkZSByZXN1bWVuIGRlbCBDYWxlbmRhcmlvIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSBldmVudG9zIGRlbCBjYWxlbmRhcmlvIGRlIGNpdGFzIHF1ZSBwcmVwYXJhIGVudHJhZGFzIHBhcmEgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBxdWUgYWN0dWFsaXphIGxvcyBkYXRvcyBkZWwgdGlja2V0IGRlc2RlIHVuYSBjaXRhIGRlIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnUGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAnTm90aWZpY2FjaW9uZXMgZGUgY2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAnQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBnZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdFbGlqYSBlbCB0aXBvIGRlIGNhbWJpb3MgZW4gbGFzIGNpdGFzIHBhciBsYXMgY3VhbGVzIGRlc2VhIHJlY2liaXIgbm90aWZpY2FjaW9uZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICdDcmVhciB1bmEgbnVldmEgY2l0YSBkZSBjYWxlbmRhcmlvIHZpbmN1bGFkYSBhIGVzdGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQ3JlYXIgeSBnZXN0aW9uYXIgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnQ3JlYXIgbnVldmEgY2l0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmUgY3VhbGVzIGNvbHVtbmFzIHNlcsOhbiBtb3N0cmFkYXMgZW4gd2lkZ2V0IGRlIGNpdGFzIHZpbmN1bGFkYXMgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZWphIikuIFBvc2libGVzIGFqdXN0ZXM6IDAgPSBEZXNoYWJpdGFkYSwgMSA9IEhhYmlsaXRhZGEsIDIgPSBIYWJpbGl0YWRhIHBvciBvbWlzacOzbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5lIHVuIGljb25vIGRlIHbDrW5jdWxvIGEgbGEgcGFnaW5hIGRlIGdvb2dsZSBtYXAgZGUgbGEgdWJpY2FjacOzbiBhY3R1YWwgZW4gbGEgcGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnRGVmaW5lIGxvcyB0aXBvcyBkZSBvYmpldG8gZGUgZXZlbnRvIHF1ZSBzZSBtYW5lamFuIGEgdHJhdsOpcyBkZWwgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluZSBsYSBsaXN0YSBkZSBwYXLDoW1ldHJvcyBxdWUgcHVlZGVuIHNlciBlbnZpYWRvcyBhIGxhIGZ1bmNpw7NuIGRlIGLDunNxdWVkYSBkZSB0aWNrZXRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGNhbXBvcyBkaW7DoW1pY29zIGRlIHRpY2tldCBkZSB0aXBvIGZlY2hhIHkgaG9yYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzY2FsYW1pZW50byBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc3BlcmEgZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmUgZWwgcGx1Z2luIGRlIHRpY2tldCBwYXJhIGxhcyBjaXRhcyBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdDYW1wb0RpbsOhbWljb18lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnRWRpdGFyIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1RpZW1wbyBkZSBwcmltZXJhIHJlc3B1ZXN0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBpbXBvcnRhY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ1ZpbmN1bGFyIGNpdGFzIHkgdGlja2V0cyBjb24gZWwgdGlwbyBkZSB2w61uY3VsbyAiTm9ybWFsIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNpdGFzIHF1ZSBzb24gZGVzcGxlZ2FvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBzb24gZGVzcGxlZ2Fkb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGRlIGNvbG9yZXMgZW4gaGV4YWRlY2ltYWwgUkdCIHF1ZSBlc3RhcsOhbiBkaXNwb25pYmxlcyBwYXJhIHN1IHNlbGVjY2nDs24gZHVyYW50ZSBsYSBjcmVhY2nDs24gZGUgY2FsZW5kYXJpb3MuIEFzZWfDunJlc2UgcXVlIGxvcyBjb2xvcmVzIHNlYW4gc3VmaWNpZW50ZW1lbnRlIG9ic2N1cm9zIHBhcmEgcXVlIGVsIHRleHRvIGJhbmNvIHNlIHZlYSBjb3JyZWN0YW1lbnRlIHNvYnJlIGVsbG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdHZXN0aW9uYXIgZGlmZXJlbnRlcyBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdOdW1lcm8gbcOheGltbyBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIGVuIGxhcyBwYW50YWxsYXMgZGUgcmVzdW1lbi4gUG9yIGZhdm9yIG5vdGUgcXVlIHVuIG51bWVybyBncmFuZGUgZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBwdWVkZSB0ZW5lciB1biBpbXBhY3RvIG5lZ2F0aXZvIGVuIGVsIGRlc2VtcGXDsW8gZGVsIHNlcnZpZG9yIGRlYmlkbyBhIHVuYSBncmFuIGNhbnRpZGFkIGRlIGxsYW1hZGFzIHNpbXVsdMOhbmVhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyBubyBhZG1pdGUgY2l0YXMgcmVjdXJyZW50ZXMgc2luIGZlY2hhIGRlIGZpbmFsaXphY2nDs24gbyBzaW4gbsO6bWVybyBkZSBpdGVyYWNpb25lcy4gRHVyYW50ZSBlbCBwcm9jZXNvIGRlIGltcG9ydGFjacOzbiwgcHVlZGUgb2N1cnJpciBxdWUgZWwgYXJjaGl2byBJQ1MgY29udGVuZ2EgZGljaGFzIGNpdGFzLiBFbiBzdSBsdWdhciwgZWwgc2lzdGVtYSBjcmVhIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBwYXNhZG8sIGFkZW3DoXMgZGUgY2l0YXMgcGFyYSBsb3MgcHLDs3hpbW9zIG4gbWVzZXMgKDEyMCBtZXNlcyAvIDEwIGHDsW9zIHBvciBkZWZlY3RvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdSZXN1bWVuIGRlIHRvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdUaWVtcG8gZGUgZXNwZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdCw7pzcXVlZGEgZGUgcGx1Zy1pbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNw7NkdWxvIFBsdWctaW4gZGUgYsO6c3F1ZWRhIHBhcmEgYXV0by1jb21wbGV0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0NhbGVuZGFyaW8gUMO6cGxpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0NhbGVuZGFyaW8gcMO6YmxpY28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdNdWVzdHJhIHVuIHbDrW5jdWxvIGVuIGVsIG1lbsO6IHBhcmEgY3JlYXIgdW5hIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYWwgdGlja2V0IGRpcmVjdG8gZGVzZGUgIGxhIHZpc3RhIGRlIGRldGFsbGUgZGUgdGlja2V0IGRlIGxhIGludGVyZmFjZSBkZWwgYWdlbnRlLiBBZGljaW9uYWxtZW50ZSBzZSBwdWVkZSBoYWNlciBpbiBjb250cm9sIGRlIGFjY2VzbyBwYXJhIG1vc3RyYXIgbyBubyBlc3RlIHbDrW5jdWxvIHVzYW5kbyBsYSBDbGF2ZSAiR3JvdXAiIHkgZWwgQ29udGVuaWRvIGNvbW8gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gUGFyYSBhZ3J1cGFyIGVsZW1lbnRvIGRlbCBtZW7DuiB1c2UgbGEgQ2xhdmUgIkNsdXN0ZXJOYW1lIiBwYXJhIGVsIENvbnRlbmlkbyBjdWFscXVpZXIgbm9tYnJlIHF1ZSBkZXNlZSB2ZXIgZW4gbGEgaW50ZXJmYWNlIGRlbCB1c3VhcmlvLiBVdGlsaXplICJDbHVzdGVyUHJpb3JpdHkiIHBhcmEgY29uZmlndXJhciBlbCBvcmRlbiBkZSB1biBjaWVydG8gZ3J1cG8gZGVudHJvIGRlIGxhIGJhcnJhIGRlIGhlcnJhbWllbnRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1RpZW1wbyBkZSBTb2x1Y2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdTZWxlY3Rpb24gZGUgdHJhbnNwb3J0ZSBwYXJhIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdEaXNwYXJhIGxhIGFjY2nDs24gZGUgYcOxYWRpciBvIGFjdHVhbGl6YXIgY2l0YXMgYXV0b23DoXRpY2FzIGRlIGNhbGVuZGFyaW9zIGJhc2FkYXMgZW4gY2llcnRvcyB0aWVtcG9zIGRlIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVGllbXBvIGRlIEFjdHVhbGl6YWNpw7NuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ05vdGlmaWNhY2nDs24gZGUgcmVjb3JkYXRvcmlvIGRlIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ1JlY2liaXLDoSB1bmEgbm90aWZpY2FjacOzbiBjYWRhIHZleiBxdWUgc2UgYWxjYW5jZSBsYSBob3JhIGRlIHVuIHJlY29yZGF0b3JpbyBwYXJhIHVuYSBkZSBzdXMgY2l0YXMuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGUgTm90aWZpY2FjaW9uZXMgZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGxhcyBjaXRhcyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIGNvbW8gbG9zIGV4cG9ydGFkb3MgcG9yIGVsIG3Ds2R1bG8gZGUgbm90aWZpY2FjaW9uZXMgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1w60gZXMgcG9zaWJsZSBlbGVnaXIgbG9zIGV2ZW50b3MgcXVlIGluaWNpYXLDoW4gZXN0YSBub3RpZmljYWNpw7NuLiBVbiBmaWx0cm8gYWRpY2lvbmFsIGRlIGxhIGNpdGEgc2UgcHVlZGUgYXBsaWNhciBhIGNvbnRpbnVhY2nDs24gcGFyYSBlbnZpYXIgc8OzbG8gcGFyYSBjaXRhcyBjb24gY2llcnRvcyBjcml0ZXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRybyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnRXF1aXBvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBhbCB1c3VhcmlvIHNvbG8gdW5hIHZleiBhbCBkw61hIGFjZXJjYSBkZSB1bmEgc29sYSBjaXRhIHVzYW5kbyBlbCB0cmFuc3BvcnRlIHNlbGVjY2lvbmFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdMYXMgbm90aWZpY2FjaW9uZXMgc2UgZW52w61hbiBhIHVuIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ1BhcmEgb2J0ZW5lciBsb3MgcHJpbWVyb3MgMjAgY2FyYWN0ZXJlcyBkZWwgdMOtdHVsbyBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlbmVyIGVsIGF0cmlidXRvIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdQYXJhIG9idGVuZXIgZWwgYXRyaWJ1dG8gZGVsIGNhbGVuZGFyaW8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBsYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlc3Rpb25hciBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIENpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdDb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0ZlY2hhIGRlIHTDqXJtaW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1JlcGV0aWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05vIHNlIGVuY29udHJhcm9uIGNhbGVuZGFyaW8uIFBvciBmYXZvciBwcmltZXJvIGHDsWFkYSB1biBjYWxlbmRhcmlvIHV0aWxpemFkbyBsYSBwYWdpbmEgZGUgR2VzdGlvbmFyIENhbGVuZGFyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0NpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGEgZXMgdW5hIGNpdGEgcmVwZXRpdGl2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ0Rlc2VhIGVkaXRhciBzb2xvIGVzdGEgbyB0b2RhcyBsYXMgb2N1cnJlbmNpYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgbGFzIG9jdXJyZW5jaWFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU29sbyBlc3RhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXN0acOzbiBkZSBDYWxlbmRhcmlvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ1Jlc3VtZW4gZGUgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0HDsWFkaXIgdW4gQ2FsZW5kYXJpbyBudWV2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBw7FhZGlyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydGFyIENhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdBcXXDrSBlcyBwb3NpYmxlIGNhcmdhciB1biBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNpw7NuIHBhcmEgaW1wb3J0YXIgdW4gY2FsZW5kYXJpbyBhIHN1IHNpc3RlbWEuIEVsIGFyY2hpdm8gbmVjZXNpdGEgZXN0YXIgZW4gZWwgZm9ybWF0byAueW1sIHBhcmEgcG9kZXIgc2VyIGV4cG9ydGFkbyBwb3IgZWwgbcOzZHVsbyBkZSBnZXN0acOzbiBkZSBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdDYXJnYXIgY29uZmlndXJhY2nDs24gZGUgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdJbXBvcnRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdHJvIHBhcmEgQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kaWVuZG8gZGVsIGNhbXBvIGRlIGdydXBvLCBlbCBzaXN0ZW1hIHBlcm1pdGUgZWwgYWNjZXNvIGEgdXN1YXJpb3MgYWwgY2FsZW5kYXJpbyBkZSBhY3VlcmRvIGEgc3VzIG5pdmVsZXMgZGUgcGVybWlzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnUk86IHVzdWFyaW9zIHF1ZSBwdWVkZW4gdmVyIHkgZXhwb3J0YXIgdG9kYXMgbGFzIGNpdGFzIGVuIGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnTW92ZXJfQTogdXN1YXJpb3MgcXVlIHB1ZWRlbiBtb2RpZmljYXIgY2l0YXMgZW4gZWwgY2FsZW5kYXJpbywgcGVybyBzaW4gY2FtYmlhciBsYSBzZWxlY2Npw7NuIGRlIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmVhcjogdXN1YXJpb3MgcXVlIHB1ZWRlbiBjcmVhciB5IGJvcnJhciBjaXRhcyBlbiBlbCBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkL3dyaXRlOiB1c2VycyBjYW4gbWFuYWdlIHRoZSBjYWxlbmRhciBpdHNlbGYuJ30gPSAnUlc6IHVzdWFyaW8gcXVlIHB1ZWRlbiBnZXN0aW9uYXIgZWwgY2FsZW5kYXJpbyBlbiBzw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdEZXNjYXJnYXIgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdDb3BpYXIgbGEgVVJMIHDDumJsaWNhIGRlIGNhbGVuZGFyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05vbWJyZSBkZWwgY2FsZW5kYXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdZYSBleGlzdGUgdW4gY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gbm9tYnJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0NpdGFzIGRlIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnVXNlIGxhcyBvcGNpb25lcyBtb3N0cmFkYXMgYWJham8gcGFyYSBhY29ydGFyIGxhcyBjaXRhcyBkZSB0aWNrZXRzIHF1ZSBzZXLDoW4gY3JlYWRhcyBhdXRvbcOhdGljYW1lbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUG9yIGZhdm9yIHNlbGVjY2lvbmUgdW5hIGNvbGEgdsOhbGlkYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdBdHJpYnV0b3MgZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5lIHJlZ2xhcyBwYXJhIGNyZWFjacOzbiBkZSBsYXMgY2l0YXMgYXV0b23DoXRpY2FzIGVuIGVzdGUgY2FsZW5kYXJpbyBiYXNhZGFzIGVuIGxvcyBkYXRvcyBkZSBsb3MgdGlja2V0cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdBw7FhZGlyIHJlZ2xhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdNw6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdNZW5vcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICdBw7FhZGlyIG51ZXZhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnQ2FsZW5kYXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ0RlbWFzaWFkb3MgY2FsZW5kYXJpb3MgYWN0aXZvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQb3IgZmF2b3IgZGVzYWN0aXZlIGFsZ3Vub3MgcHJpbWVybyBvIGluY3JlbWVudGUgZWwgbMOtbWl0ZSBlbiBsYSBjb25maWd1cmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTMOtbmVhIGRlIHRpZW1wbyBNZW5zdWFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdMw61uZWEgZGUgdGllbXBvIFNlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnTMOtbmVhIGRlIHRpZW1wbyBEaWFyaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1NhbHRhciBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdEZXNjYXJ0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ01vc3RyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hY2nDs24gYsOhc2ljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdGZWNoYS9Ib3JhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGFudGVzIGRlIGxhIGZlY2hhIGRlIHTDqXJtaW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICdQb3IgZmF2b3IgZmlqZSBlc3RlIHZhbG9yIGRlc3B1w6lzIGRlIGxhIGZlY2hhIGRlIGluaWNpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnRXN0YSBlcyB1bmEgb2N1cnJlbmNpYSBkZSB1bmEgY2l0YSByZXBldGl0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ1ByZWNpb25lIGFxdcOtICBwYXJhIHZlciBsYSBjaXRhIHBhZHJlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdQcmVjaW9uZSBhcXXDrSAgcGFyYSBlZGl0YXIgbGEgY2l0YSBwYWRyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnRnJlY3VlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ0NhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ1B1bnRvIGRlIHRpZW1wbyByZWxhdGl2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfCv0VzdMOhIHNlZ3VybyBkZSBxdWUgZGVzZWEgZWxpbWluYXIgZXN0YSBjaXRhPyBFc3RhIG9wZXJhY2nDs24gbm8gc2UgcHVlZGUgZGVzaGFjZXIuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhciBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnRWwgYXJjaGl2byBjYXJnYWRvIHRpZW5lIHF1ZSBlc3RhciBlbiB1biBmb3JtYXRvIGlDYWwgdsOhbGlkbyAoLmljcyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnU2kgZWwgQ2FsZW5kYXJpbyBkZXNlYWRvIG5vIGFwYXJlY2UgZW4gbGEgbGlzdGEsIHBvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSB0ZW5nYSBhbCBtZW5vcyBlbCBwZXJtaXNvIGRlICJjcmVhciInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICfCv0FjdHVhbGl6YXIgbGFzIGNpdGFzIGV4aXN0ZW50ZXM/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnVG9kYXMgbGFzIGNpdGFzIGV4aXN0ZW50ZXMgZW4gZWwgY2FsZW5kYXJpbyBjb24gZWwgbWlzbW8gVW5pcXVlSUQgc2Ugc29icmVzY3JpYmlyw6FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ0NhcmdhciBjYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnRhciBjaXRhcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOdWV2YSBDaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdQcm9udG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkw61hcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICfCoUVsIG5vbWJyZSBkZSBsYSBub3RpZmljYWNpw7NuIHlhIGV4aXN0ZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW50ZXMgKHJlY3Vyc29zKSwgcXVlIHB1ZWRlbiBzZXIgc2VsZWNjaW9uYWRvcyBkZW50cm8gZGUgdW5hIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWdlbnRlcyBjb24gKGFsIG1lbm9zKSBwZXJtaXNvcyBkZSBsZWN0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdUb2RvcyBsb3MgYWdlbnRlcyBjb24gcGVybWlzb3MgZGUgZXNjcml0dXJhIHBhcmEgbGEgY2l0YSAoY2FsZW5kYXJpbyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ0VsIHNpc3RlbWEgbm8gcHVkbyBjcmVhciBlbCBDYWxlbmRhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05vIHNlIHRpZW5lIGVsIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05vIHRpZW5lIGFjY2VzbyBhIGVzdGUgY2FsZW5kYXJpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkaXRhciBDYWxlbmRhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvciBhbCBhY3R1YWxpemVyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdObyBzZSBwdWVkZSBsZWVyIGVsIGFyY2hpdm8gZGUgY29uZmlndXJhY2nDs24gZGVsIGNhbGVuZGFyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ1BvciBmYXZvciBhc2Vnw7pyZXNlIGRlIHF1ZSBlbCBhcmNoaXZvIGVzIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05vIHNlIHB1ZWRlIGltcG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ8KhQ2FsZW5kYXJpbyBpbXBvcnRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdTZSBuZWNlc2l0YSBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05vdCBzZSBwdWVkZW4gb2J0ZW5lciBsb3MgZGF0b3MgcGFyYSBlbCBDYWxlbmRhcklEIGVzcGVjaWZpY2Fkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnU2UgaGFuIGltcG9ydGFkbyAlcyBjaXRhKHMpIGFsIGNhbGVuZGFyaW8gJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0b3MgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwIG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIGhvcmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnVG9kYXMgbGFzIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ0NpdGFzIGFzaWduYWRhcyBhIG3DrSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ01vc3RyYW5kbyBzb2xvIGNpdGFzIGFzaWduYWRhcyBhIHTDrSEgQ2FtYmlhciBjb25maWd1cmFjacOzbic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfCoUNpdGEgbm8gZW5jb250cmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdDYWRhIETDrWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NhZGEgU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAnQ2FkYSBNZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ0NhZGEgQcOxbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQZXJzb25hbGl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGlhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1NlbWFuYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ01lbnN1YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdjYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAncG9yICVzIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2hhc3RhIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICdwb3IgLi4uIHZleihjZXMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnaGFzdGEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnU2luIG5vdGlmaWNhY2lvbmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkw61hKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgc2VtYW5hcyBhbnRlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2FudGVzIGRlbCBpbmljaW8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ2Rlc3B1w6lzIGRlbCBpbmljaW8gZGUgbGEgY2l0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkZWwgZmluIGRlIGxhIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZGVzcHXDqXMgZGVsIGZpbiBkZSBsYSBjaXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnwqFObyB0aWVuZSBwZXJtaXNvcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnTGEgY2l0YSBubyBwdWVkZSBzZXIgYm9ycmFkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnwqFObyB0aWVuZSBwZXJtaXNvcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnTm8gdGllbmUgcGVybWlzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnRWwgc2lzdGVtYSBubyBwdWRvIGltcG9ydGFyIGVsIGFyY2hpdm8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ1BvciBmYXZvciwgcmV2aXNlIGVsIHJlZ2lzdHJvIHBhcmEgbWFzIGluZm9ybWFjacOzbi4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCBtw6FzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnwqFObyBzZSB0aWVuZSAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ8KhTm8gZXhpc3RlIGVsIHVzdWFyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnwqFDYWxlbmRhcmlvIG5vIHZhbGlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnwqFVUkwgbm8gdsOhbGlkYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnwqFTZSBwcm9kdWpvIHVuIGVycm9yIGFsIGV4cG9ydGFyIGVsIGNhbGVuZGFyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQWN0dWFsaXphY2nDs24gKG1pbnV0b3MpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdQw6FnaW5hIGRlIHJlc3VtZW4gZGVsIENhbGVuZGFyaW8gZGUgQ2l0YXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhY2lvbmVzIGRlIENpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50b3MgZGVsIGNhbGVuZGFyaW8gZGUgY2l0YXMgcXVlIHByZXBhcmEgZW50cmFkYXMgcGFyYSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBhY3R1YWxpemEgbG9zIGRhdG9zIGRlbCB0aWNrZXQgZGVzZGUgdW5hIGNpdGEgZGUgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBlZGljacOzbiBkZSBjaXRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIGRlIGNpdGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnTGlzdGEgZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdOb3RpZmljYWNpb25lcyBkZSBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdDaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1BhbnRhbGxhIGRlIGdlc3Rpw7NuIGRlIENhbGVuZGFyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ0VsaWphIGVsIHRpcG8gZGUgY2FtYmlvcyBlbiBsYXMgY2l0YXMgcGFyIGxhcyBjdWFsZXMgZGVzZWEgcmVjaWJpciBub3RpZmljYWNpb25lcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0NyZWFyIHVuYSBudWV2YSBjaXRhIGRlIGNhbGVuZGFyaW8gdmluY3VsYWRhIGEgZXN0ZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdDcmVhIHkgZ2VzdGlvbmEgbGFzIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ0NyZWFyIG51ZXZhIGNpdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnRGVmaW5lIGN1YWxlcyBjb2x1bW5hcyBzZXLDoW4gbW9zdHJhZGFzIGVuIHdpZGdldCBkZSBjaXRhcyB2aW5jdWxhZGFzIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIEFqdXN0ZXMgcG9zaWJsZXM6IDAgPSBEZXNhY3RpdmFkbywgMSA9IERpc3BvbmlibGUsIDIgPSBBY3RpdmFkbyBkZSBmb3JtYSBwcmVkZXRlcm1pbmFkYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5lIHVuIGljb25vIGRlIHbDrW5jdWxvIGEgbGEgcGFnaW5hIGRlIGdvb2dsZSBtYXAgZGUgbGEgdWJpY2FjacOzbiBhY3R1YWwgZW4gbGEgcGFudGFsbGEgZGUgZWRpY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnRGVmaW5lIGxvcyB0aXBvcyBkZSBvYmpldG8gZGUgZXZlbnRvIHF1ZSBzZSBtYW5lamFuIGEgdHJhdsOpcyBkZWwgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ0RlZmluZSBsYSBsaXN0YSBkZSBwYXLDoW1ldHJvcyBxdWUgcHVlZGVuIHNlciBlbnZpYWRvcyBhIGxhIGZ1bmNpw7NuIGRlIGLDunNxdWVkYSBkZSB0aWNrZXRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGNhbXBvcyBkaW7DoW1pY29zIGRlIHRpY2tldCBkZSB0aXBvIGZlY2hhIHkgaG9yYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHRpcG8gZGUgYmFja2VkIGRlIGNpdGEgZGUgdGlja2V0IHBhcmEgZWwgdGllbXBvIGRlIGVzY2FsYW1pZW50byBkZSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGJhY2tlZCBkZSBjaXRhIGRlIHRpY2tldCBwYXJhIGVsIHRpZW1wbyBkZSBlc3BlcmEgZGUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICdEZWZpbmUgZWwgcGx1Z2luIGRlIHRpY2tldCBwYXJhIGxhcyBjaXRhcyBkZSBjYWxlbmRhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdDYW1wb0RpbsOhbWljb18lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnRWRpdGFyIGNpdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ1RpZW1wbyBkZSBwcmltZXJhIHJlc3B1ZXN0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdQYW50YWxsYSBkZSBpbXBvcnRhY2nDs24gZGUgY2l0YXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ1ZpbmN1bGFyIGNpdGFzIHkgdGlja2V0cyBjb24gZWwgdGlwbyBkZSB2w61uY3VsbyAiTm9ybWFsIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIGxvcyBldmVudG9zIGRlIGNpdGFzIHF1ZSBzb24gZGVzcGxlZ2FvcyBlbiBsYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdMaXN0YSBkZSB0b2RvcyBsb3MgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHF1ZSBzb24gZGVzcGxlZ2Fkb3MgZW4gbGEgR1VJLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ0xpc3RhIGRlIGNvbG9yZXMgZW4gaGV4YWRlY2ltYWwgUkdCIHF1ZSBlc3RhcsOhbiBkaXNwb25pYmxlcyBwYXJhIHN1IHNlbGVjY2nDs24gZHVyYW50ZSBsYSBjcmVhY2nDs24gZGUgY2FsZW5kYXJpb3MuIEFzZWfDunJlc2UgcXVlIGxvcyBjb2xvcmVzIHNlYW4gc3VmaWNpZW50ZW1lbnRlIG9ic2N1cm9zIHBhcmEgcXVlIGVsIHRleHRvIGJhbmNvIHNlIHZlYSBjb3JyZWN0YW1lbnRlIHNvYnJlIGVsbG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdHZXN0aW9uYXIgZGlmZXJlbnRlcyBjYWxlbmRhcmlvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICdOdW1lcm8gbcOheGltbyBkZSBjYWxlbmRhcmlvcyBhY3Rpdm9zIGVuIGxhcyBwYW50YWxsYXMgZGUgcmVzdW1lbi4gUG9yIGZhdm9yIG5vdGUgcXVlIHVuIG51bWVybyBncmFuZGUgZGUgY2FsZW5kYXJpb3MgYWN0aXZvcyBwdWVkZSB0ZW5lciB1biBpbXBhY3RvIG5lZ2F0aXZvIGVuIGVsIGRlc2VtcGXDsW8gZGVsIHNlcnZpZG9yIGRlYmlkbyBhIHVuYSBncmFuIGNhbnRpZGFkIGRlIGxsYW1hZGFzIHNpbXVsdMOhbmVhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT1RSUyBkb2VzblwndCBzdXBwb3J0IHJlY3VycmluZyBBcHBvaW50bWVudHMgd2l0aG91dCBlbmQgZGF0ZSBvciBudW1iZXIgb2YgaXRlcmF0aW9ucy4gRHVyaW5nIGltcG9ydCBwcm9jZXNzLCBpdCBtaWdodCBoYXBwZW4gdGhhdCBJQ1MgZmlsZSBjb250YWlucyBzdWNoIEFwcG9pbnRtZW50cy4gSW5zdGVhZCwgc3lzdGVtIGNyZWF0ZXMgYWxsIEFwcG9pbnRtZW50cyBpbiB0aGUgcGFzdCwgcGx1cyBBcHBvaW50bWVudHMgZm9yIHRoZSBuZXh0IG4gbW9udGhzICgxMjAgbW9udGhzLzEwIHllYXJzIGJ5IGRlZmF1bHQpLid9ID0KICAgICAgICAnT1RSUyBubyBhZG1pdGUgY2l0YXMgcmVjdXJyZW50ZXMgc2luIGZlY2hhIGRlIGZpbmFsaXphY2nDs24gbyBzaW4gbsO6bWVybyBkZSBpdGVyYWNpb25lcy4gRHVyYW50ZSBlbCBwcm9jZXNvIGRlIGltcG9ydGFjacOzbiwgcHVlZGUgb2N1cnJpciBxdWUgZWwgYXJjaGl2byBJQ1MgY29udGVuZ2EgZGljaGFzIGNpdGFzLiBFbiBzdSBsdWdhciwgZWwgc2lzdGVtYSBjcmVhIHRvZGFzIGxhcyBjaXRhcyBlbiBlbCBwYXNhZG8sIGFkZW3DoXMgZGUgY2l0YXMgcGFyYSBsb3MgcHLDs3hpbW9zIG4gbWVzZXMgKDEyMCBtZXNlcyAvIDEwIGHDsW9zIHBvciBkZWZlY3RvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdSZXN1bWVuIGRlIHRvZGFzIGxhcyBjaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdUaWVtcG8gZGUgZXNwZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdCw7pzcXVlZGEgZGUgcGx1Zy1pbnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICdNw7NkdWxvIFBsdWctaW4gZGUgYsO6c3F1ZWRhIHBhcmEgYXV0by1jb21wbGV0YXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ0NhbGVuZGFyaW8gUMO6cGxpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0NhbGVuZGFyaW8gcMO6YmxpY28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUmVzdW1lbiBkZSBSZWN1cnNvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdSZXN1bWVuIGRlIFJlY3Vyc29zIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdNdWVzdHJhIHVuIHbDrW5jdWxvIGVuIGVsIG1lbsO6IHBhcmEgY3JlYXIgdW5hIGNpdGEgZGUgY2FsZW5kYXJpbyB2aW5jdWxhZGEgYWwgdGlja2V0IGRpcmVjdG8gZGVzZGUgIGxhIHZpc3RhIGRlIGRldGFsbGUgZGUgdGlja2V0IGRlIGxhIGludGVyZmFjZSBkZWwgYWdlbnRlLiBBZGljaW9uYWxtZW50ZSBzZSBwdWVkZSBoYWNlciBpbiBjb250cm9sIGRlIGFjY2VzbyBwYXJhIG1vc3RyYXIgbyBubyBlc3RlIHbDrW5jdWxvIHVzYW5kbyBsYSBDbGF2ZSAiR3JvdXAiIHkgZWwgQ29udGVuaWRvIGNvbW8gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gUGFyYSBhZ3J1cGFyIGVsZW1lbnRvIGRlbCBtZW7DuiB1c2UgbGEgQ2xhdmUgIkNsdXN0ZXJOYW1lIiBwYXJhIGVsIENvbnRlbmlkbyBjdWFscXVpZXIgbm9tYnJlIHF1ZSBkZXNlZSB2ZXIgZW4gbGEgaW50ZXJmYWNlIGRlbCB1c3VhcmlvLiBVdGlsaXplICJDbHVzdGVyUHJpb3JpdHkiIHBhcmEgY29uZmlndXJhciBlbCBvcmRlbiBkZSB1biBjaWVydG8gZ3J1cG8gZGVudHJvIGRlIGxhIGJhcnJhIGRlIGhlcnJhbWllbnRhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ1RpZW1wbyBkZSBzb2x1Y2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdTZWxlY3Rpb24gZGUgdHJhbnNwb3J0ZSBwYXJhIG5vdGlmaWNhY2lvbmVzIGRlIGNpdGFzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdEaXNwYXJhIGxhIGFjY2nDs24gZGUgYcOxYWRpciBvIGFjdHVhbGl6YXIgY2l0YXMgYXV0b23DoXRpY2FzIGRlIGNhbGVuZGFyaW9zIGJhc2FkYXMgZW4gY2llcnRvcyB0aWVtcG9zIGRlIHRpY2tldHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAnVGllbXBvIGRlIGFjdHVhbGl6YWNpw7NuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aHVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ0lkxZFwb250IGVtbMOpa2V6dGV0xZEgw6lydGVzw610w6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdFZ3kgw6lydGVzw610w6lzdCBmb2cga2FwbmkgbWluZGVuIGFsa2Fsb21tYWwsIGFtaWtvciBlZ3kgZW1sw6lrZXp0ZXTFkSBpZMWRIGVsw6lyw6lzcmUga2Vyw7xsIGF6IGlkxZFwb250amFpIGVneWlrw6luw6lsLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0lkxZFwb250LcOpcnRlc8OtdMOpcyBrZXplbMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJ0l0dCB0dWQgZWd5IGJlw6FsbMOtdMOzZsOhamx0IGZlbHTDtmx0ZW5pIGF6IGlkxZFwb250LcOpcnRlc8OtdMOpc2VrIGltcG9ydMOhbMOhc8OhaG96IGEgcmVuZHN6ZXJyZS4gQSBmw6FqbG5hayAueW1sIGZvcm3DoXR1bWJhbiBrZWxsIGxlbm5pZSwgYWhvZ3kgYXogaWTFkXBvbnQtw6lydGVzw610w6lzIG1vZHVsIGV4cG9ydMOhbHRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0l0dCB2w6FsYXN6dGhhdGphIGtpLCBob2d5IG1lbHkgZXNlbcOpbnllayBmb2dqw6FrIGFrdGl2w6FsbmkgZXp0IGF6IMOpcnRlc8OtdMOpc3QuIEVneSB0b3bDoWJiaSBpZMWRcG9udHN6xbFyxZEgYWxrYWxtYXpoYXTDsyBsZW50IGEgY3NhayBlZ3kgYml6b255b3MgZmVsdMOpdGVsbGVsIHJlbmRlbGtlesWRIGlkxZFwb250b2tuw6FsIHTDtnJ0w6luxZEga8O8bGTDqXNoZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0lkxZFwb250IHN6xbFyxZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ0NzYXBhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ0VyxZFmb3Jyw6FzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnQSBmZWxoYXN6bsOhbMOzIMOpcnRlc8OtdMOpc2UgY3NhayBlZ3lzemVyIGVneSBuYXAgZWd5IGVneWVkw7xsaSBpZMWRcG9udHLDs2wgZWd5IGtpdsOhbGFzenRvdHQgw6F0dml0ZWwgaGFzem7DoWxhdMOhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0F6IMOpcnRlc8OtdMOpc2VrIGVneSDDvGd5aW50w6l6xZFuZWsga2Vyw7xsbmVrIGVsa8O8bGTDqXNyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ0F6IGlkxZFwb250Y8OtbSBlbHPFkSAyMCBrYXJha3RlcsOpbmVrIGxla8OpcsOpc8OpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0F6IGlkxZFwb250IGplbGxlbXrFkWrDqW5layBsZWvDqXLDqXPDqWhleic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ0EgbmFwdMOhciBqZWxsZW16xZFqw6luZWsgbGVrw6lyw6lzw6loZXonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnTmFwaXJlbmQgw6F0dGVraW50xZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ05hcHTDoXJhayBrZXplbMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnSWTFkXBvbnQgaG96esOhYWTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnU3rDrW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5kIGRhdGUnfSA9ICdCZWZlamV6w6lzaSBkw6F0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnSXNtw6l0bMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdOZW0gdGFsw6FsaGF0w7NrIG5hcHTDoXJhay4gRWzFkXN6w7ZyIGFkam9uIGhvenrDoSBlZ3kgbmFwdMOhcmF0IGEgbmFwdMOhcmFrIGtlemVsw6lzZSBvbGRhbCBoYXN6bsOhbGF0w6F2YWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnSWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0V6IGVneSBpc23DqXRsxZFkxZEgaWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdDc2FrIGV6dCBheiBlbMWRZm9yZHVsw6FzdCBzemVyZXRuw6kgc3plcmtlc3p0ZW5pIHZhZ3kgYXogw7Zzc3plc2V0Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfDlnNzemVzIGVsxZFmb3JkdWzDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICdDc2FrIGV6IGF6IGVsxZFmb3JkdWzDoXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ05hcHTDoXJrZXplbMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ05hcHTDoXIgw6F0dGVraW50xZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ8OaaiBuYXB0w6FyIGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdOYXB0w6FyIGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAnSWTFkXBvbnRvayBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ05hcHTDoXIgaW1wb3J0w6Fsw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ0l0dCB0w7ZsdGhldCBmZWwgZWd5IGJlw6FsbMOtdMOzZsOhamx0IGVneSBuYXB0w6FyIGltcG9ydMOhbMOhc8OhaG96IGEgcmVuZHN6ZXJyZS4gQSBmw6FqbG5hayAueW1sIGZvcm3DoXR1bWJhbiBrZWxsIGxlbm5pZSwgYWhvZ3kgYSBuYXB0w6Fya2V6ZWzFkSBtb2R1bCBleHBvcnTDoWx0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdOYXB0w6FyYmXDoWxsw610w6FzIGZlbHTDtmx0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdOYXB0w6FyIGltcG9ydMOhbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdTesWxcsWRIGEgbmFwdMOhcmFraG96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ0EgY3NvcG9ydG1lesWRdMWRbCBmw7xnZ8WRZW4gYSByZW5kc3plciBhIGZlbGhhc3puw6Fsw7NrYXQgYSBqb2dvc3VsdHPDoWdpIHN6aW50asO8ayBhbGFwasOhbiBmb2dqYSBlbmdlZG5pIGhvenrDoWbDqXJuaSBhIG5hcHTDoXJob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnQ3NhayBvbHZhc8OhczogYSBmZWxoYXN6bsOhbMOzayBsw6F0aGF0asOhayDDqXMgZXhwb3J0w6FsaGF0asOhayBhIG5hcHTDoXJiYW4gbMOpdsWRIMO2c3N6ZXMgaWTFkXBvbnRvdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICfDgXRtb3pnYXTDoXM6IGEgZmVsaGFzem7DoWzDs2sgbcOzZG9zw610aGF0asOhayBheiBpZMWRcG9udG9rYXQgYSBuYXB0w6FyYmFuLCBkZSBhIG5hcHTDoXJ2w6FsYXN6dMOhcyBtZWd2w6FsdG96dGF0w6FzYSBuw6lsa8O8bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0zDqXRyZWhvesOhczogYSBmZWxoYXN6bsOhbMOzayBsw6l0cmVob3poYXRuYWsgw6lzIHTDtnLDtmxoZXRuZWsgaWTFkXBvbnRva2F0IGEgbmFwdMOhcmJhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ8ONcsOhcywgb2x2YXPDoXM6IGEgZmVsaGFzem7DoWzDs2sgbWFnw6F0IGEgbmFwdMOhcmF0IGtlemVsaGV0aWsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdOYXB0w6FyIGV4cG9ydMOhbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdOYXB0w6FyIGxldMO2bHTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ055aWx2w6Fub3MgbmFwdMOhciBVUkwgbcOhc29sw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnTmFwdMOhciBuZXZlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ03DoXIgbMOpdGV6aWsgZWd5IGlseWVuIG5ldsWxIG5hcHTDoXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdKb2dvc3VsdHPDoWdpIGNzb3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0plZ3lpZMWRcG9udG9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdTemFiw6FseSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdIYXN6bsOhbGphIGEgbGVudGkgbGVoZXTFkXPDqWdla2V0IGFubmFrIGxlc3rFsWvDrXTDqXPDqWhleiwgaG9neSBtZWx5IGplZ3llayBpZMWRcG9udGphaSBsZWd5ZW5layBhdXRvbWF0aWt1c2FuIGzDqXRyZWhvenZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnVsOhbGFzc3pvbiBlZ3kgw6lydsOpbnllcyB2w6Fyw7NsaXN0w6F0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0tlcmVzw6lzaSBhdHRyaWLDunR1bW9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnU3phYsOhbHlvayBtZWdoYXTDoXJvesOhc2EgYXV0b21hdGlrdXMgaWTFkXBvbnRvayBsw6l0cmVob3rDoXPDoWhveiBlYmJlbiBhIG5hcHTDoXJiYW4gYSBqZWd5YWRhdG9rIGFsYXBqw6FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ1N6YWLDoWx5IGhvenrDoWFkw6FzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnVMO2YmInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ0tldmVzZWJiJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ8OaaiBpZMWRcG9udCBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnTmFwdMOhcmFrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdUw7psIHNvayBha3TDrXYgbmFwdMOhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdWYWd5IGthcGNzb2xqb24ga2kgbsOpaMOhbnlhdCBlbMWRc3rDtnIsIHZhZ3kgbsO2dmVsamUgYSBrb3Jsw6F0b3QgYSBiZcOhbGzDrXTDoXNva2Jhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ0jDqXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgTW9udGgnfSA9ICdIYXZpIGlkxZF2b25hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnSGV0aSBpZMWRdm9uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnTmFwaSBpZMWRdm9uYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1VncsOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnRWx0w7xudGV0w6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdNZWdqZWxlbsOtdMOpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ0FsYXAgaW5mb3Jtw6FjacOzayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdEw6F0dW0vaWTFkSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnw4FsbMOtdHNhIGV6dCBlZ3kgYmVmZWplesOpc2kgZMOhdHVtIGVsxZF0dGkgw6lydMOpa3JlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICfDgWxsw610c2EgZXp0IGVneSBrZXpkw6lzaSBkw6F0dW0gdXTDoW5pIMOpcnTDqWtyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ0V6IGVneSBpc23DqXRsxZFkxZEgaWTFkXBvbnQgZWzFkWZvcmR1bMOhc2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnS2F0dGludHNvbiBpZGUgYSBzesO8bMWRaWTFkXBvbnQgbWVndGVraW50w6lzw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0thdHRpbnRzb24gaWRlIGEgc3rDvGzFkWlkxZFwb250IHN6ZXJrZXN6dMOpc8OpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICdHeWFrb3Jpc8OhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ01pbmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnUmVsYXTDrXYgaWTFkXBvbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnQml6dG9zYW4gdMO2csO2bG5pIHN6ZXJldG7DqSBlenQgYXogaWTFkXBvbnRvdD8gRXp0IGEgbcWxdmVsZXRldCBuZW0gbGVoZXQgdmlzc3phdm9ubmkuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJZMWRcG9udCBpbXBvcnTDoWzDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnQSBmZWx0w7ZsdMO2dHQgZsOhamxuYWsgw6lydsOpbnllcyBpQ2FsIGZvcm3DoXR1bWJhbiAoLmljcykga2VsbCBsZW5uaWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ0hhIGEga8OtdsOhbnQgbmFwdMOhciBuaW5jcyBpdHQgZmVsc29yb2x2YSwgYWtrb3IgZ3nFkXrFkWRqw7ZuIG1lZyBhcnLDs2wsIGhvZ3kgdmFuLWUgbGVnYWzDoWJiIOKAnmzDqXRyZWhvesOhc+KAnSBqb2dvc3VsdHPDoWdhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ0ZyaXNzw610aSBhIG1lZ2zDqXbFkSBpZMWRcG9udG9rYXQ/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnQSBuYXB0w6FyYmFuIGzDqXbFkSBpbHllbiBlZ3llZGkgYXpvbm9zw610w7N2YWwgcmVuZGVsa2V6xZEgw7Zzc3plcyBtZWdsw6l2xZEgaWTFkXBvbnQgZmVsw7xsIGxlc3ogw61ydmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ05hcHTDoXIgZmVsdMO2bHTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJZMWRcG9udG9rIGltcG9ydMOhbMOhc2EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAnw5pqIGlkxZFwb250JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdIYW1hcm9zYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBuYXAnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnQXogw6lydGVzw610w6lzIG5ldmUgbcOhciBsw6l0ZXppayEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ8OcZ3lpbnTDqXrFkSAoZXLFkWZvcnLDoXNvayksIGFraSBheiBpZMWRcG9udG9uIGJlbMO8bCBraSBsZXR0IGplbMO2bHZlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ0F6IMO2c3N6ZXMgw7xneWludMOpesWRLCBha2lrbmVrIChsZWdhbMOhYmIpIG9sdmFzw6FzaSBqb2dvc3VsdHPDoWd1ayB2YW4gYXogaWTFkXBvbnRva2hveiAobmFwdMOhcmhveiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBeiDDtnNzemVzIMO8Z3lpbnTDqXrFkSwgYWtpa25layDDrXLDoXNpIGpvZ29zdWx0c8OhZ3VrIHZhbiBheiBpZMWRcG9udGhveiAobmFwdMOhcmhveiknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ0EgcmVuZHN6ZXIgbmVtIHR1ZHRhIGzDqXRyZWhvem5pIGEgbmFwdMOhcmF0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05pbmNzIG5hcHTDoXItYXpvbm9zw610w7MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05pbmNzIGhvenrDoWbDqXLDqXNlIGVoaGV6IGEgbmFwdMOhcmhveiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ05hcHTDoXIgc3plcmtlc3p0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnSGliYSBhIG5hcHTDoXIgZnJpc3PDrXTDqXNla29yISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTmVtIHNpa2Vyw7xsdCBiZW9sdmFzbmkgYSBuYXB0w6FyYmXDoWxsw610w7MgZsOhamx0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdHecWResWRZGrDtm4gbWVnIGFycsOzbCwgaG9neSBhIGbDoWpsIMOpcnbDqW55ZXMtZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnTmVtIHNpa2Vyw7xsdCBpbXBvcnTDoWxuaSBhIG5hcHTDoXJhdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnTmFwdMOhciBpbXBvcnTDoWx2YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ05hcHTDoXItYXpvbm9zw610w7Mgc3rDvGtzw6lnZXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnTmVtIHNpa2Vyw7xsdCBsZWvDqXJuaSBheiBhZGF0b2thdCBhIG1lZ2Fkb3R0IG5hcHTDoXItYXpvbm9zw610w7Nob3onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJyVzIGlkxZFwb250IHNpa2VyZXNlbiBpbXBvcnTDoWx2YSBhKHopICVzIG5hcHTDoXJiYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IHBlcmMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgcGVyYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCBwZXJjJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSDDs3JhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ01pbmRlbiBpZMWRcG9udCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnfSA9ICdIb3p6w6FtIHJlbmRlbHQgaWTFkXBvbnRvayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnQ3NhayBheiDDtm5ow7Z6IHJlbmRlbHQgaWTFkXBvbnRvayB2YW5uYWsgbWVnamVsZW7DrXR2ZSEgQmXDoWxsw610w6Fzb2sgbWVndsOhbHRvenRhdMOhc2EnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAnQXogaWTFkXBvbnQgbmVtIHRhbMOhbGhhdMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ1NvaGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnTWluZGVuIG5hcCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnTWluZGVuIGjDqXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ01pbmRlbiBow7NuYXBiYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ01pbmRlbiDDqXZiZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnRWd5w6luaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ05hcGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnSGV0aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAnSGF2aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfDiXZlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ21pbmRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJyVzIGFsa2Fsb21tYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAnZWRkaWc6IOKApic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICfigKYgYWxrYWxvbW1hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2VkZGlnOiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICdOaW5jcyDDqXJ0ZXPDrXTDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIHBlcmNjZWwgZWzFkXR0ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIMOzcsOhdmFsIGVsxZF0dGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIG5hcHBhbCBlbMWRdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgaMOpdHRlbCBlbMWRdHRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnYXogaWTFkXBvbnQga2V6ZGV0ZSBlbMWRdHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdtaXV0w6FuIGF6IGlkxZFwb250IGVsa2V6ZMWRZMO2dHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnYXogaWTFkXBvbnQgdsOpZ2UgZWzFkXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ21pdXTDoW4gYXogaWTFkXBvbnQgdsOpZ2V0IMOpcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdOaW5jcyBqb2dvc3VsdHPDoWchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ05lbSBsZWhldCB0w7Zyw7ZsbmkgYSBqZWd5aWTFkXBvbnRvdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnTmluY3NlbmVrIGpvZ29zdWx0c8OhZ29rISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdOaW5jc2VuZWsgam9nb3N1bHRzw6Fnb2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAnQSByZW5kc3plciBuZW0gdHVkdGEgaW1wb3J0w6FsbmkgYSBmw6FqbHQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ1RvdsOhYmJpIGluZm9ybcOhY2nDs2vDqXJ0IG7DqXp6ZSBtZWcgYSBuYXBsw7N0Lic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAndG92w6FiYmkgKyVkJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnTmluY3MgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdOaW5jcyBpbHllbiBmZWxoYXN6bsOhbMOzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ8OJcnbDqW55dGVsZW4gbmFwdMOhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnw4lydsOpbnl0ZWxlbiBVUkwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0hpYmEgdMO2cnTDqW50IGEgbmFwdMOhciBleHBvcnTDoWzDoXNha29yISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ0ZyaXNzw610w6lzIChwZXJjKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnSWTFkXBvbnRuYXB0w6FyIMOhdHRla2ludMWRIG9sZGFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnSWTFkXBvbnQtw6lydGVzw610w6lzZWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ0lkxZFwb250bmFwdMOhciBlc2Vtw6lueSBtb2R1bCwgYW1lbHkgZWzFkWvDqXN6w610aSBheiDDqXJ0ZXPDrXTDqXNpIGJlamVneXrDqXNla2V0IGF6IGlkxZFwb250b2tob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdJZMWRcG9udG5hcHTDoXIgZXNlbcOpbnkgbW9kdWwsIGFtZWx5IGZyaXNzw610aSBhIGplZ3lpZMWRcG9udGLDs2wgc3rDoXJtYXrDsyBhZGF0b2trYWwgcmVuZGVsa2V6xZEgamVneWV0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdJZMWRcG9udHN6ZXJrZXN6dMOpcyBrw6lwZXJuecWRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnSWTFkXBvbnRsaXN0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0lkxZFwb250bGlzdGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdJZMWRcG9udC3DqXJ0ZXPDrXTDqXNlayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdJZMWRcG9udG9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnTmFwdMOhcmtlemVsw6lzIGvDqXBlcm55xZEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ1bDoWxhc3N6YSBraSwgaG9neSBtaWx5ZW4gdMOtcHVzw7ogaWTFkXBvbnQtdsOhbHRvenRhdMOhc3LDs2wgc3plcmV0bmUgw6lydGVzw610w6lzZWtldCBrYXBuaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0V6emVsIGEgamVnZ3llbCDDtnNzemVrYXBjc29sdCDDumogbmFwdMOhcmlkxZFwb250IGzDqXRyZWhvesOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdJZMWRcG9udC3DqXJ0ZXPDrXTDqXNlayBsw6l0cmVob3rDoXNhIMOpcyBrZXplbMOpc2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnw5pqIGlkxZFwb250IGzDqXRyZWhvesOhc2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSB3aGljaCBjb2x1bW5zIGFyZSBzaG93biBpbiB0aGUgbGlua2VkIGFwcG9pbnRtZW50IHdpZGdldCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lid9ID0KICAgICAgICAnQW5uYWsgbWVnaGF0w6Fyb3rDoXNhLCBob2d5IG1lbHkgb3N6bG9wb2sgbGVneWVuZWsgbMOhdGhhdMOzayBhIGthcGNzb2x0IGlkxZFwb250IGZlbMO8bGV0aSBlbGVtZW4gKExpbmtPYmplY3Q6OlZpZXdNb2RlID0g4oCew7Zzc3pldGV0dOKAnSkuIExlaGV0c8OpZ2VzIGJlw6FsbMOtdMOhc29rOiAwID0gbGV0aWx0dmEsIDEgPSBlbMOpcmhldMWRLCAyID0gYWxhcMOpcnRlbG1lemV0dGVuIGVuZ2Vkw6lseWV6ZXR0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdNZWdoYXTDoXJveiBlZ3kgaWtvbnQgYSBqZWxlbmxlZ2kgaGVseSBHb29nbGUgVMOpcmvDqXAgb2xkYWzDoXJhIG11dGF0w7MgaGl2YXRrb3rDoXNzYWwgYXogaWTFkXBvbnRzemVya2VzenTDqXMga8OpcGVybnnFkW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhem9rYXQgYXogZXNlbcOpbnlvYmpla3R1bSB0w61wdXNva2F0LCBhbWVseWVrIGF6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCBtb2R1bG9uIGtlcmVzenTDvGwgbGVzem5layBrZXplbHZlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYXpva25hayBhIHBhcmFtw6l0ZXJla25layBhIGxpc3TDoWrDoXQsIGFtZWx5ZWsgw6F0YWRoYXTDs2sgYSBqZWd5a2VyZXPDqXMgZnVua2Npw7NuYWsuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYSBqZWd5aWTFkXBvbnQgdMOtcHVzw6FuYWsgaMOhdHTDqXJwcm9ncmFtasOhdCBhIGplZ3kgZMOhdHVtIMOpcyBpZMWRIGRpbmFtaWt1cyBtZXrFkWrDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgYSBqZWd5aWTFkXBvbnQgdMOtcHVzw6FuYWsgaMOhdHTDqXJwcm9ncmFtasOhdCBhIGplZ3kgZXN6a2Fsw6FjacOzcyBpZGVqw6loZXouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGEgamVneWlkxZFwb250IHTDrXB1c8OhbmFrIGjDoXR0w6lycHJvZ3JhbWrDoXQgYSBqZWd5IGbDvGdnxZFiZW4gbMOpdsWRIGlkZWrDqWhlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ01lZ2hhdMOhcm96emEgYSBqZWd5YsWRdsOtdG3DqW55dCBhIG5hcHTDoXJpZMWRcG9udG9raG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0lkxZFwb250IHN6ZXJrZXN6dMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ0Vsc8WRIHbDoWxhc3ppZMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ0lkxZFwb250b2sgaW1wb3J0w6Fsw6FzYSBrw6lwZXJuecWRLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICfDlnNzemVrYXBjc29samEgYXogaWTFkXBvbnRva2F0IMOpcyBqZWd5ZWtldCBlZ3kg4oCeTm9ybcOhbOKAnSB0w61wdXPDuiBoaXZhdGtvesOhc3NhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0F6IMO2c3N6ZXMgaWTFkXBvbnRlc2Vtw6lueSBsaXN0w6FqYSwgYW1lbHllayBtZWdqZWxlbm5layBhIGdyYWZpa3VzIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICdBeiDDtnNzemVzIG5hcHTDoXJlc2Vtw6lueSBsaXN0w6FqYSwgYW1lbHllayBtZWdqZWxlbm5layBhIGdyYWZpa3VzIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnU3rDrW5layBsaXN0w6FqYSBoZXhhZGVjaW3DoWxpcyBSR0IgZm9ybcOhYmFuLCBhbWVseWVrIGVsw6lyaGV0xZFrIGxlc3puZWsgYSBraXbDoWxhc3p0w6FzaG96IGEgbmFwdMOhciBsw6l0cmVob3rDoXNhIGvDtnpiZW4uIEd5xZF6xZFkasO2biBtZWcgYXJyw7NsLCBob2d5IGEgc3rDrW5layBlbMOpZyBzw7Z0w6l0ZWstZSBhaGhveiwgaG9neSBhIHZpbMOhZ29zIHN6w7Z2ZWcgbWVnamVsZW7DrXRoZXTFkSBsZWd5ZW4gcmFqdHVrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICdLw7xsw7ZuYsO2esWRIG5hcHTDoXJhayBrZXplbMOpc2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnQXogYWt0w612IG5hcHTDoXJhayBsZWduYWd5b2JiIHN6w6FtYSBheiDDoXR0ZWtpbnTFkSBrw6lwZXJuecWRa8O2bi4gTmUgZmVsZWRqZSwgaG9neSBheiBha3TDrXYgbmFwdMOhcmFrIG5hZ3kgc3rDoW1hIHRlbGplc8OtdG3DqW55YmVsaSBoYXTDoXNzYWwgbGVoZXQgYSBraXN6b2xnw6Fsw7Nqw6FyYSBhIHTDumwgc29rIGVneWlkZWrFsSBow612w6FzIGluZMOtdMOhc8OhdmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdBeiBPVFJTIG5lbSB0w6Ftb2dhdGphIGEgYmVmZWplesOpc2kgZMOhdHVtIHZhZ3kgYXogaXNtw6l0bMOpc2VrIHN6w6FtYSBuw6lsa8O8bGkgaXNtw6l0bMWRZMWRIGlkxZFwb250b2thdC4gQXogaW1wb3J0w6Fsw6FzaSBmb2x5YW1hdCBzb3LDoW4gZWzFkWZvcmR1bGhhdCwgaG9neSBheiBJQ1MtZsOhamwgaWx5ZW4gaWTFkXBvbnRva2F0IHRhcnRhbG1hei4gRWhlbHlldHQgYSByZW5kc3plciBheiDDtnNzemVzIGlkxZFwb250b3QgYSBtw7psdGJhbiBob3p6YSBsw6l0cmUsIHZhbGFtaW50IGEga8O2dmV0a2V6xZEgbiBow7NuYXBiYW4gKDEyMCBow7NuYXAvMTAgw6l2IGFsYXDDqXJ0ZWxtZXpldHRlbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnQXogw7Zzc3plcyBpZMWRcG9udCDDoXR0ZWtpbnTFkWplLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdWw6FyYWtvesOhc2kgaWTFkSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnQsWRdsOtdG3DqW55IGtlcmVzw6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnQsWRdsOtdG3DqW55IGtlcmVzw6lzaSBtb2R1bCBheiBhdXRvbWF0aWt1cyBraWVnw6lzesOtdMOpc2hlei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnTnlpbHbDoW5vcyBuYXB0w6FyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdOeWlsdsOhbm9zIG5hcHTDoXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnRXLFkWZvcnLDoXMgw6F0dGVraW50xZEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnRXLFkWZvcnLDoXMgw6F0dGVraW50xZEgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJ0VneSBoaXZhdGtvesOhc3QgamVsZW7DrXQgbWVnIGEgbWVuw7xiZW4gYSBqZWdneWVsIMO2c3N6ZWthcGNzb2x0IG5hcHTDoXJpZMWRcG9udCBsw6l0cmVob3rDoXPDoWhveiBrw7Z6dmV0bGVuw7xsIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgamVneW5hZ3nDrXTDoXMgbsOpemV0w6lixZFsLiBFemVuIGhpdmF0a296w6FzIG1lZ2plbGVuw610w6lzw6loZXogdmFneSBtZWcgbmVtIGplbGVuw610w6lzw6loZXogdG92w6FiYmkgaG96esOhZsOpcsOpc2kgdmV6w6lybMWRdCBsZWhldCBrw6lzesOtdGVuaSBhIOKAnkdyb3Vw4oCdIGt1bGNzIMOpcyBheiDigJ5ydzpjc29wb3J0MTttb3ZlX2ludG86Y3NvcG9ydDLigJ0gdGFydGFsb21ob3ogaGFzb25sw7MgaGFzem7DoWxhdMOhdmFsLiBBIG1lbsO8cG9udG9rIGNzb3BvcnRva2JhIHJlbmRlesOpc8OpaGV6IGhhc3puw6FsamEgYSDigJ5DbHVzdGVyTmFtZeKAnSBrdWxjc290IGLDoXJtaWx5ZW4gb2x5YW4gdGFydGFsb21tYWwsIGFtZWx5ZXQgYSBmZWxoYXN6bsOhbMOzaSBmZWzDvGxldGVuIGzDoXRuaSBzemVyZXRuZS4gSGFzem7DoWxqYSBhIOKAnkNsdXN0ZXJQcmlvcml0eeKAnSBrdWxjc290IGVneSBiaXpvbnlvcyBmw7xydCBzb3JyZW5kasOpbmVrIGJlw6FsbMOtdMOhc8OhaG96IGF6IGVzemvDtnp0w6Fyb24gYmVsw7xsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnTWVnb2xkw6FzaSBpZMWRJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnw4F0dml0ZWxraXbDoWxhc3p0w6FzIGF6IGlkxZFwb250LcOpcnRlc8OtdMOpc2VraGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdBa3RpdsOhbGphIGF6IGF1dG9tYXRpa3VzIG5hcHTDoXJpZMWRcG9udG9rIGhvenrDoWFkw6Fzw6F0IHZhZ3kgZnJpc3PDrXTDqXPDqXQgYml6b255b3MgamVneWlkxZFrIGFsYXBqw6FuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ0ZyaXNzw610w6lzaSBpZMWRJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6amFfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ+S6iOe0hOODquODnuOCpOODs+ODgOODvOOBrumAmuefpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAn5LqI57SE6YCa55+l44Gu566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ+S6iOe0hOOBruODleOCo+ODq+OCv+ODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAn44OB44O844OgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn44Oq44K944O844K5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAn6YCa55+l44Gv5ouF5b2T6ICF44G46YCB5L+h44GV44KM44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICfkuojlrprjga7lsZ7mgKfjgpLlj5blvpfjgZnjgovjgZPjgagnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjga7lsZ7mgKfjgpLlj5blvpfjgZnjgovjgZPjgagnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAn44Ki44K444Kn44Oz44OA6KGo56S6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfjgqvjg6zjg7Pjg4Djg7znrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAn5LqI57SE44Gu55m76YyyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAn6ImyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn57WC5LqG5pel5pmCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ+e5sOOCiui/lOOBlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICfkuojntIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ+OBk+OCjOOBr+e5sOOCiui/lOOBl+OBruS6iOWumuOBp+OBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ+OBk+OBrueZuueUn+OBvuOBn+OBr+OBmeOBueOBpueZuueUn+OBoOOBkeOCkue3qOmbhuOBl+OBvuOBmeOBi++8nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICflhajjgabjga7nmbrnlJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfjgZPjga7nmbrnlJ/mmYLngrknOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ+OCq+ODrOODs+ODgOODvOeuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ+OCq+ODrOODs+ODgOODvOihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn44Kr44Os44Oz44OA44O844Gu55m76YyyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn5LqI57SE44Gu44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ+OCq+ODrOODs+ODgOODvOOCkuOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ+OBk+OBk+OBp+OCq+ODrOODs+ODgOODvOOBruioreWumuODleOCoeOCpOODq+OCkuOCouODg+ODl+ODreODvOODieOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAguODleOCoeOCpOODq+OBr+OCq+ODrOODs+ODgOODvOeuoeeQhuODouOCuOODpeODvOODq+OBjOOCqOOCr+OCueODneODvOODiOOBl+OBnyIueW1sIuODleOCqeODvOODnuODg+ODiOOBp+OBguOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ+OCq+ODrOODs+ODgOODvOioreWumuOCkuOCouODg+ODl+ODreODvOODieOBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgafjg5XjgqPjg6vjgr/jg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICdVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn44Kr44Os44Oz44OA44O844Gu44Ko44Kv44K544Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAn44Kr44Os44Oz44OA44O844Gu44OA44Km44Oz44Ot44O844OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ+WFrOmWi+OCq+ODrOODs+ODgOODvOOBrlVSTOOCkuOCs+ODlOODvOOBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAn44Kr44Os44Oz44OA44O85ZCNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ+WQjOOBmOWQjeWJjeOBruOCq+ODrOODs+ODgOODvOOBr+aXouOBq+WtmOWcqOOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn5qip6ZmQ44Kw44Or44O844OXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfjg4HjgrHjg4Pjg4jjga7kuojntIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ+ODq+ODvOODqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ+acieWKueOBquOCreODpeODvOOCkumBuOaKnuOBl+OBpuS4i+OBleOBhOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ+aknOe0ouWxnuaApyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ+ODgeOCseODg+ODiOODh+ODvOOCv+OBq+WfuuOBpeOBhOOBpuOBk+OBruOCq+ODrOODs+ODgOODvOOBp+iHquWLleS6iOWumuOCkuS9nOaIkOOBmeOCi+OBn+OCgeOBruODq+ODvOODq+OCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ+ODq+ODvOODq+OCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAn44KC44Gj44Go5aSa44GPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICfjgoLjgaPjgajlsJHjgarjgY8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn5LqI57SE44Gu55m76YyyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFycyd9ID0gJ+OCq+ODrOODs+ODgOODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAn5pyJ5Yq55YyW44GV44KM44Gf44Kr44Os44Oz44OA44O844GM5aSa44GZ44GO44G+44GZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAn6YCxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAn5pyI6ZaT44K/44Kk44Og44Op44Kk44OzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICfpgLHplpPjgr/jgqTjg6Djg6njgqTjg7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAn5pel5Lit44K/44Kk44Og44Op44Kk44OzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1bXAnfSA9ICfjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ+WJiumZpCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAn6KGo56S6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAn5Z+65pys5oOF5aCxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ+aXpeOBq+OBoS/mmYLplpMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn6aC75bqmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfkuojntITjga7jgqTjg7Pjg53jg7zjg4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOCkuOCouODg+ODl+ODreODvOODiSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn5LqI57SE44Gu44Kk44Oz44Od44O844OIJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ+S6iOe0hOOBrueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzXml6UnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdDYWxlbmRhcklE44GM44Gq44GEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICfjgYLjgarjgZ/jga/jgZPjga7jgqvjg6zjg7Pjg4Djg7zjgavjgqLjgq/jgrvjgrnjgafjgY3jgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ+OCq+ODrOODs+ODgOODvOOCkue3qOmbhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciB1cGRhdGluZyB0aGUgY2FsZW5kYXIhJ30gPSAn44Kr44Os44Oz44OA44O844Gu5pu05paw5Lit44Gr44Ko44Op44O844GM55m655Sf44GX44G+44GX44GfISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn44Kr44Os44Oz44OA44O86Kit5a6a44OV44Kh44Kk44Or44KS6Kqt44G/6L6844KB44G+44Gb44KT44Gn44GX44Gf44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ+OBguOBquOBn+OBruODleOCoeOCpOODq+OBjOacieWKueOBp+OBguOCi+OBk+OBqOOCkueiuuiqjeOBl+OBpuS4i+OBleOBhOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfjgqvjg6zjg7Pjg4Djg7zjgpLjgqTjg7Pjg53jg7zjg4jjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ+OCq+ODrOODs+ODgOODvOOCkuOCpOODs+ODneODvOODiCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ0NhbGVuZGFySUTjgYzlv4XopoEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys15YiGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE15YiGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMw5YiGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMeaZgumWkyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICflhajjgabjga7kuojntIQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAn56eB44Gr5Ymy44KK5b2T44Gm44KJ44KM44Gf5LqI5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICfjgYLjgarjgZ/jgavlibLjgorlvZPjgabjgonjgozjgZ/kuojntITjgaDjgZHjgpLooajnpLrjgZnjgovvvIEg6Kit5a6a44KS5aSJ5pu044GX44Gm5LiL44GV44GE44CCJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ+S6iOe0hOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ+OBquOBlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfmr47ml6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ+avjumAsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ+avjuaciCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn5q+O5bm0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ+OCq+OCueOCv+ODoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ+avjuaXpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfmr47pgLEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ+avjuaciCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfmr47lubQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICdmb3IgJXMgdGltZShzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAnJXMg44G+44GnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ+mAmuefpeOBquOBlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMg5YiG5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMg5pmC6ZaT5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyDml6XliY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyDpgLHplpPliY0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ+aoqemZkOOBjOOBquOBhCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAn44OB44Kx44OD44OI5LqI57SE44KS5YmK6Zmk44Gn44GN44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ+aoqemZkOOBjOOBquOBhCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn5qip6ZmQ44GM44Gq44GEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICclc+OBjOOBguOCiuOBvuOBm+OCk++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn44Gd44Gu44KI44GG44Gq44Om44O844K244O844Gv44GC44KK44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn54Sh5Yq544Gq44Kr44Os44Oz44OA44O8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ+eEoeWKueOBqlVSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfmm7TmlrAgKOWIhiknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ+S6iOe0hOOCq+ODrOODs+ODgOODvOOBruihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn5LqI57SE44Gu6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ+S6iOe0hOODquOCueODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ+S6iOe0hOODquOCueODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn5LqI57SE6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ+S6iOe0hCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ+OCq+ODrOODs+ODgOODvOeuoeeQhuOBrueUu+mdoic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ+S6iOe0hOOCkueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn5LqI57SE44Gu57eo6ZuGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICfliJ3lm57lv5znrZTmnJ/pmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn5LqI57SE55S76Z2i44KS44Kk44Oz44Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn5qeY44CF44Gq44Kr44Os44Oz44OA44O844KS566h55CG44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ+WFqOOBpuOBruS6iOe0hOOBruS4gOimpyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICfkv53nlZnmnJ/pmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ+ODl+ODqeOCsOOCpOODs+aknOe0oic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ+OCquODvOODiOOCs+ODs+ODl+ODquODvOODiOeUqOOBruODl+ODqeOCsOOCpOODs+aknOe0ouODouOCuOODpeODvOODqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICflhazplovjgZnjgovjgqvjg6zjg7Pjg4Djg7wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ+WFrOmWi+OBmeOCi+OCq+ODrOODs+ODgOODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ+ODquOCveODvOOCueihqOekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICfjg6rjgr3jg7zjgrnooajnpLogKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAn6Kej5rG65pyf6ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ+abtOaWsOaXpeaZgic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmJfTk9fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ1ZhcnNlbCBtZWQgcMOlbWlubmVsc2Ugb20gYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdEdSB2aWwgbW90dGEgZW4gdmFyc2VsIGh2ZXIgZ2FuZyBww6VtaW5uZWxzZXN0aWRzcHVua3RldCBuw6VlcyBmb3IgZW4gYXYgZGluZSBhdnRhbGVyLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmVyIHZhcnNsZXIgb20gYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0F2dGFsZWZpbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnR3J1cHBlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVzc3Vycyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ1ZhcnNsaW5nZXIgc2VuZGVzIHRpbCBlbiBzYWtzYmVoYW5kbGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnRm9yIMOlIGhlbnRlIGRlIGbDuHJzdGUgMjAgdGVnbmVuZSBpIGF2dGFsZW92ZXJza3JpZnRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICdGb3Igw6UgaGVudGUgYXZ0YWxlYXR0cmlidXR0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdGb3Igw6UgaGVudGUga2FsZW5kZXJhdHRyaWJ1dHRldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdBZ2VuZGFvdmVyc2lrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAnS2FsZW5kZXJhZG1pbmlzdHJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdMZWdnIHRpbCBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdGYXJnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ1NsdXR0ZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdHamVudGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnSW5nZW4ga2FsZW5kZXJlIGZ1bm5ldC4gVsOmciB2ZW5ubGlnIMOlIGxlZ2dlIHRpbCBlbiBrYWxlbmRlciBmw7hyc3QgdmVkIMOlIGJlbnl0dGUgc2lkZW4gZm9yIGthbGVuZGVyYWRtaW5pc3RyYXNqb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnQXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdEZXR0ZSBlciBlbiBnamVudGFnZW5kZSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfDmG5za2VyIGR1IGt1biDDpSByZWRpZ2VyZSBkZW5uZSBhdnRhbGVuIGVsbGVyIGFsbGUgZm9yZWtvbXN0ZW5lPyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnQWxsZSBmb3Jla29tc3Rlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ0JhcmUgZGVubmUgYXZ0YWxlbic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAnS2FsZW5kZXJhZG1pbmlzdHJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ0thbGVuZGVyb3ZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0xlZ2cgdGlsIG55IGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0xlZ2cgdGlsIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICdJbXBvcnRlciBhdnRhbGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0thbGVuZGVyaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnTGFzdCBvcHAga2FsZW5kZXJrb25maWd1cmFzam9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0ltcG9ydGVyIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAnRmlsdGVyIGZvciBrYWxlbmRlcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnU2tyaXZlYmVza3l0dGV0OiBicnVrZXJlIGthbiBzZSBvZyBla3Nwb3J0ZXJlIGFsbGUgYXZ0YWxlciBpIGthbGVuZGVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdPcHByZXR0OiBicnVrZXJlIGthbiBvcHByZXR0ZSBvZyBzbGV0dGUgYXZ0YWxlciBpIGthbGVuZGVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdMZXMvc2tyaXY6IGJydWtlcmUga2FuIHNlbHYgYWRtaW5pc3RyZXJlIGthbGVuZGVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICdFa3Nwb3J0ZXIga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdMYXN0IG5lZCBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICdLb3BpZXIgb2ZmZW50bGlnIGthbGVuZGVyIFVSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnS2FsZW5kZXJuYXZuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJ0thbGVuZGVyIG1lZCBzYW1tZSBuYXZuIGVrc2lzdGVyZXIgYWxsZXJlZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICdSZXR0aWdoZXRlcnNncnVwcGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ0F2dGFsZXIgdGlsa255dHRldCBzYWtlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUmVnZWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICdTw7hrZWF0cmlidXR0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdMZWdnIHRpbCByZWdlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnRmxlcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGVzcyd9ID0gJ0bDpnJyZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICdMZWdnIHRpbCBueSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kZXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdGb3IgbWFuZ2UgYWt0aXZlIGthbGVuZGVyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1VrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnSG9wcCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cnfSA9ICdWaXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGF0ZS9UaW1lJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZWt2ZW5zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnSHZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAnQXZ0YWxlaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdMYXN0IG9wcCBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0ZXIgYXZ0YWxlcic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOeSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ1NuYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZGFnZXInOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ0FsZHJpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ0h2ZXIgZGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdIdmVyIHVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ0h2ZXIgbcOlbmVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICdIdmVydCDDpXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tJ30gPSAnVGlscGFzc2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGFnbGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1VrZW50bGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNw6VuZWRsaWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnw4VybGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAnaHZlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJyVzIGdhbmcoZXIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ3RpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICcuLi4gZ2FuZyhlciknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICd0aWwgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnSW5nZW4gdmFyc2xpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIG1pbnV0dChlcikgZsO4cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIHRpbWUocikgZsO4cic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZGFnKGVyKSBmw7hyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMgdWtlKHIpIGbDuHInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdmw7hyIGF2dGFsZW4gYmVneW5uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdldHRlciBhdCBhdnRhbGVuIGhhciBiZWd5bnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnZsO4ciBhdnRhbGVuIHNsdXR0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZXR0ZXIgYXQgYXZ0YWxlbiBlciBzbHV0dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0luZ2VuIHJldHRpZ2hldGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ092ZXJzaWt0c3NpZGUgZm9yIGF2dGFsZWthbGVuZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnVmFyc2xlciBvbSBhdnRhbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ1NpZGUgZm9yIGF2dGFsZXJlZ2lzdHJlcmluZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0F2dGFsZWxpc3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAnQXZ0YWxlbGlzdGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdWYXJzbGVyIG9tIGF2dGFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdBdnRhbGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnU2lkZSBmb3Iga2FsZW5kZXJhZG1pbmlzdHJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICdWZWxnIGh2aWxrZSB0eXBlciBhdnRhbGVyIHNvbSBkdSB2aWwgbW90dGEgdmFyc2xlciBvbS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ09wcHJldHQgZW4gYXZ0YWxlIHNvbWVyIGtvYmxldCB0aWwgZGVubmUgc2FrZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdBZG1pbmlzdHJhc2pvbiBhdiBhdnRhbGV2YXJzbGluZ2VyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ09wcHJldHQgZW4gbnkgYXZ0YWxlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnRW5kcmUgYXZ0YWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdGw7hyc3RlIHJlc3BvbnN0aWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAnU2lkZSBmb3IgYXZ0YWxlaW1wb3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICdLb2JsZSBhdnRhbGVyIG9nIHNha2VyIG1lZCBlbiAibm9ybWFsIiBsZW5rZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0FkbWluaXN0cmVyZSB1bGlrZSBrYWxlbmRlcmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ092ZXJzaWt0IG92ZXIgYWxsZSBhdnRhbGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICdWZW50ZXRpZHNwdW5rdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2ggbW9kdWxlIGZvciBhdXRvY29tcGxldGUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ09mZmVudGxpZyBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnT2ZmZW50bGlnIGthbGVuZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1Jlc3N1cnNvdmVyc2lrdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdSZXNzdXJzb3ZlcnNpa3QgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnTMO4c25pbmdzdGlkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ09wcGRhdGVyaW5nc3RpZCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIFBvd2lhZG9taWVuaWFtaSBXeWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIGNob29zZSB3aGljaCBldmVudHMgd2lsbCB0cmlnZ2VyIHRoaXMgbm90aWZpY2F0aW9uLiBBbiBhZGRpdGlvbmFsIGFwcG9pbnRtZW50IGZpbHRlciBjYW4gYmUgYXBwbGllZCBiZWxvdyB0byBvbmx5IHNlbmQgZm9yIGFwcG9pbnRtZW50cyB3aXRoIGNlcnRhaW4gY3JpdGVyaWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAnRmlsdHIgd3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdaZXNww7PFgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ1phc29ieSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ1Bvd2lhZGFtaWFqIHXFvHl0a293bmlrYSBvIHBvamVkeW5jenltIHd5ZGFyemVuaXUsIHByenkgdcW8eWNpdSB3eWJyYW5lZ28gdHJhbnNwb3J0dSwgdHlsa28gcmF6IGR6aWVubmllLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ1Bvd2lhZG9taWVuaWEgc8SFIHd5c3nFgmFuZSBkbyBhZ2VudGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdCeSBwb2JyYcSHIHBpZXJ3c3plIDIwIHpuYWvDs3cgdHl0dcWCdSB3eWRhcnplbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ0J5IHBvYnJhxIcgYXRyeWJ1dCB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnQnkgcG9icmHEhyBhdHJ5YnV0IGthbGVuZGFyemEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAnUHJ6ZWdsxIVkIHRlcm1pbmFyemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ1phcnrEhWR6YWoga2FsZW5kYXJ6YW1pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ0RvZGFqIHd5ZGFyemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdLb2xvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ0RhdGEgemFrb8WEY3plbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1Bvd3Rhcnphaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICdOaWUgem5hbGV6aW9ubyBrYWxlbmRhcnp5LiBQcm9zesSZIGRvZGHEhyBuYWpwaWVydyBrYWxlbmRhcnogdcW8eXdhasSFYyBzdHJvbnkgWmFyesSFZHphbmllIEthbGVuZGFyemFtaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdXeWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdUbyBwb3d0YXJ6YWrEhWNlIHd5ZGFyemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdDenkgY2hjaWHFgmJ5xZsgZWR5dG93YcSHIHR5bGtvIHRvIHd5c3TEhXBpZW5pZSBjenkgd3N6eXN0a2llPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICdXc3p5c3RraWUgd3lzdMSFcGllbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnVHlsa28gdG8gd3lzdMSFcGllbmllJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdaYXJ6xIVkemFuaWUgS2FsZW5kYXJ6YW1pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnUHJ6ZWdsxIVkIEthbGVuZGFyenknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0RvZGFqIG5vd3kgS2FsZW5kYXJ6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ0RvZGFqIEthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAnWmFpbXBvcnR1aiBXeWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ0ltcG9ydCBLYWxlbmRhcnphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGEgY2FsZW5kYXIgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IGNhbGVuZGFyIG1hbmFnZW1lbnQgbW9kdWxlLid9ID0KICAgICAgICAnVyB0eW0gbWllanNjdSBtb8W8ZXN6IHphxYJhZG93YcSHIHBsaWsga29uZmlndXJhY3lqbnkgYnkgemFpbXBvcnRvd2HEhyBrYWxlbmRhcnogdG8gc3lzdGVtdS4gUGxpayBtdXNpIGJ5xIcgdyBmb3JtYWNpZSAueW1sLCBwb2RvYm5pZSBqYWsgd3lla3Nwb3J0b3dhbnkgbW9kdcWCIHphcnrEhWR6YW5pYSBrYWxlbmRhcnplbS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICdXY3p5dGFqIGtvbmZpZ3VyYWNqxJkga2FsZW5kYXJ6YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdaYWltcG9ydHVqIEthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRyIGRsYSBrYWxlbmRyemF5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ1cgemFsZcW8bm/Fm2NpIG9kIHBvbGEgZ3J1cHksIHN5c3RlbSB1ZG9zdMSZcG5pIHXFvHl0a293bmlrb20gZG9zdMSZcCBkbyBrYWxlbmRhcnphIHpnb2RuaWUgeiBpY2ggdXByYXduaWVuaWFtaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdUeWxrbyBkbyBvZGN6eXR1OiB1xbx5dGtvd25pY3kgbW9nxIUgd2lkemllxIcgaSBla3Nwb3J0b3dhxIcgd3N6eXN0a2llIHd5ZGFyemVuaWEgdyBrYWxlbmRhcnp1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ1ByemVuaWXFmyBuYTogdcW8eXRrb3duaWN5IG1vZ8SFIG1vZHlmaWtvd2HEhyB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dSwgamVkbmFrIGJleiBtb8W8bGl3b8WbY2kgem1pYW55IHd5YnJhbmVnbyBrYWxlbmRhcnphLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnVXR3w7NyejogdcW8eXRrb3duaWN5IG1vZ8SFIHR3b3J6ecSHIGkgdXN1d2HEhyB3eWRhcnplbmlhIHcga2FsZW5kYXJ6dS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ0N6eXRhai9aYXBpc3o6IHXFvHl0a293bmljeSBtb2fEhSB6YXJ6xIVkemHEhyBzYW15bSBrYWxlbmRhcnplbS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ1d5ZWtzcG9ydHVqIGthbGVuZGFyeic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ8WaY2nEhWduaWoga2FsZW5kYXJ6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ1Nrb3BpdWogVVJMIHB1YmxpY3puZWdvIGthbGVuZGFyemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05hendhIGthbGVuZGFyemEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAnS2FsZW5kYXJ6IHogdMSFIG5henfEhSBqdcW8IGlzdG5pZWplLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cGEgdXByYXduaWXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnV3lkYXJ6ZW5pYSBaZ8WCb3N6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICdSZWd1xYJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1XFvHlqIG9wY2ppIHBvbmnFvGVqIGJ5IHphd8SZemnEhyBkbGEgamFraWNoIHpnxYJvc3plxYQgYsSZZMSFIHR3b3J6b25lIGF1dG9tYXR5Y3puZSB3eWRhcnplbmFpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnUHJvc3rEmSB3eWJyYcSHIHdhxbxuxIUga29sZWprxJkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnQXRyeWJ1dHkgd3lzenVraXdhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnRGVmaW5pdWplIHJlZ3XFgnkgZGxhIGF1dG9tYXR5Y3puZWdvIHR3b3J6ZW5pYSB3eWRhcnplxYQgdyB0eW0ga2FsZW5kYXJ6dSwgdyB6YWxlxbxub8WbY2kgb2QgZGFueWNoIHpnxYJvc3plbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0RvZGFqIHJlZ3XFgsSZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdXacSZY2VqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdNbmllaic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICdEb2RhaiBub3dlIHd5ZGFyemVuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kYXJ6ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJ30gPSAnWmJ5dCBkdcW8byBha3R5d255Y2gga2FsZW5kYXJ6eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQcm9zesSZIHd5xYLEhWN6ecSHIGtpbGthIGx1YiB6d2nEmWtzennEhyBsaW1pdCB3IGtvbmZpZ3VyYWNqaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ1R5ZHppZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnV2lkb2sgTWllc2nEmWN6bnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ1dpZG9rIFR5Z29kbmlvd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAnV2lkb2sgRHppZW5ueSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnUHJ6ZWpkxbonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ1p3b2xuaWonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ1Bva2HFvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ1BvZHN0YXdvd2UgaW5mb3JtYWNqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdEYXRhL0N6YXMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1Byb3N6xJkgdXN0YXdpxIcgdMSZIHdhcnRvxZvEhyBwcnplZCBkYXTEhSB6YWtvxYRjemVuaWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ1Byb3N6xJkgdXN0YXdpxIcgdMSZIHdhcnRvxZvEhyBwbyBkYWNpZSByb3pwb2N6xJljaWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdUbyBqZXN0IHd5c3TEhXBpZW5pZSBwb3d0YXJ6YWxuZWdvIHd5ZGFyemVuaWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnS2xpa25paiB0dXRhaiBieSBzcHJhd2R6acSHIHd5ZGFyemVuaWUgZ8WCw7N3bmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaWogdHV0YWogYnkgZWR5dG93YcSHIHd5ZGFyemVuaWUgZ8WCw7N3bmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0N6xJlzdG90bGl3b8WbxIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnknfSA9ICdLYcW8ZHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICdDenkgamVzdGXFmyBwZXdpZW4sIMW8ZSBjaGNlc3ogdXN1bsSFxIcgdG8gd3lkYXJ6ZW5pZT8gVGVqIG9wZXJhY2ppIG5pZSBtb8W8bmEgY29mbsSFxIcuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnQgV3lkYXJ6ZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnV2N6eXRhbnkgcGxpayBtdXNpIHBvc2lhZGHEhyBwcmF3aWTFgm93eSBmb3JtYXQgaUNBTCAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ0plxZtsaSBzenVrYW55IEthbGVuZGFyeiBuaWUgamVzdCB0dXRhaiB3ecWbd2lldGxvbnksIHByb3N6xJkgdXBld25pxIcgc2nEmSwgxbxlIHBvc2lhZGFzeiBwcnp5IG5ham1uaWVqIHVwcmF3bmllbmllIFwnVXR3w7NyelwnLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ1pha3R1YWxpem93YcSHIGlzdG5pZWrEhWNlIHd5ZGFyemVuaWE/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBleGlzdGluZyBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyIHdpdGggc2FtZSBVbmlxdWVJRCB3aWxsIGJlIG92ZXJ3cml0dGVuLid9ID0KICAgICAgICAnV3N6eXN0a2llIGlzdG5pZWrEhWNlIHd5ZGFyemVuaWEgdyBrYWxlbmRhcnp1IHogdHltIHNhbXltIFVuaXF1ZUlEIHpvc3RhbsSFIG5hZHBpc2FuZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnV2N6eXRhaiBrYWxlbmRhcnouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICdJbXBvcnQgd3lkYXJ6ZcWEJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ05vd2Ugd3lkYXJ6ZW5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnTmllYmF3ZW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkbmknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnUG93aWFkb21pZW5pZSBvIHRlaiBzYW1laiBuYXp3aWUganXFvCBpc3RuaWVqZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ0FnZW5jaSAoemFzb2J5KSwgd3licmFuaSB3IHJhbWFjaCB3eWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1dzenlzY3kgYWdlbmNpIHBvc2lhZGFqxIVjeSAocHJ6eW5ham1uaWVqKSBwcmF3byBvZGN6eXR1IHpkYXJ6ZW5pYSAoa2FsZW5kYXJ6YSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdXc3p5c2N5IGFnZW5jaSB6IHByYXdlbSB6YXBpc3Ugd3lkYXJ6ZW5pYSAoa2FsZW5kYXJ6YSknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ1N5c3RlbSBuaWUgYnnFgiB3IHN0YW5pZSBzdHdvcnp5xIcgS2FsZW5kYXJ6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdCcmFrIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ05pZSBtYXN6IGRvc3TEmXB1IGRvIHRlZ28ga2FsZW5kYXJ6YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ0VkeXR1aiBLYWxlbmRhcnonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0LFgsSFZCBha3R1YWxpemFjamkga2FsZW5kYXJ6YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ05pZSBtb8W8bmEgb2Rjenl0YcSHIHBsaWt1IGtvbmZpZ3VyYWN5am5lZ28ga2FsZW5kYXJ6YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAnUHJvc3rEmSB1cGV3bmnEhyBzacSZLCDFvGUgcGxpayBqZXN0IHfFgmHFm2Npd3kuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ05pZSBtb8W8bmEgemFpbXBvcnRvd2HEhyBrYWxlbmRhcnphISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdLYWxlbmRhcnogWmFpbXBvcnRvd2FueSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1BvdHJ6ZWJuZSBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ05pZSBtb8W8bmEgb2Rjenl0YcSHIGluZm9ybWFjamkgZGxhIHBvZGFuZWdvIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ1BvcHJhd25pZSB6YWltcG9ydG93YW5vICVzIHd5ZGFyemXFhCBkbyBrYWxlbmRhcnphICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUgbWludXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUgbWludXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxIGdvZHppbmEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnV3N6eXN0a2llIHd5ZGFyemVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnV3lkYXJ6ZW5pYSBwcnp5cGlzYW5lIGRvIG1uaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ1d5xZt3aWV0bGFuaWUgd3lkYXJ6ZcWEIHByenlwaXNhbnljaCBkbyBDaWViaWUhIFptaWXFhCB1c3Rhd2llbmlhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ1d5ZGFyemVuaWUgbmllIG9kbmFsZXppb25lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ05pZ2R5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ0NvZHppZW5uaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ0NvIHR5ZHplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdDbyBtaWVzacSFYyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnQ28gcm9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ1fFgmFzbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdEemllbm5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdUeWdvZG5pb3dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNaWVzacSZY3puaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnUm9jem5pZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ2thxbxkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICdkb3DDs2tpIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgJXMnfSA9ICdhxbwgZG8gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnQnJhayBwb3dpYWRvbWllxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIG1pbnV0KHkpIHByemVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGhvdXIocykgYmVmb3JlJ30gPSAnJXMgZ29kemluKHkpIHByemVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkbmkoZHppZcWEKSBwcnplZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHR5Z29kbmllIHByemVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAnemFuaW0gd3lkYXJ6ZW5pZSByb3pwb2N6bmllIHNpxJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdwbyByb3pwb2N6xJljaXUgd3lkYXJ6ZW5pdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdwcnplZCB6YWtvxYRjemVuaWVtIHd5ZGFyemVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAncG8gemFrb8WEY3plbml1IHd5ZGFyemVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICdCcmFrIHVwcmF3bmllxYQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ05pZSBtb8W8bmEgdXN1bsSFxIcgd3lkYXJ6ZW5pYSBkbGEgemfFgm9zemVuaWEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ0JyYWsgdXByYXduaWXFhCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnQnJhayB1cHJhd25pZcWEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ1N5c3RlbSBuaWUgYnnFgiB3IHN0YW5pZSB6YWltcG9ydG93YcSHIHBsaWt1ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICdQcm9zesSZIHNwcmF3ZHppxIcgbG9naSBkbGEgZG9rxYJhZG5pZWpzenljaCBpbmZvcm1hY2ppLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIHdpxJljZWonOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICdCcmFrICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTmllIG1hIHRha2llZ28gdcW8eXRrb3duaWthISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ05pZXfFgmHFm2Npd3kga2FsZW5kYXJ6ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdOaWV3xYJhxZtjaXd5IFVSTCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnQsWCxIVkIHBvZGN6YXMgZWtzcG9ydG93YW5pYSBrYWxlbmRhcnphISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ09kxZt3aWXFvGFqIChtaW51dHkpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgQ2FsZW5kYXIgb3ZlcnZpZXcgcGFnZS4nfSA9ICdTdHJvbmEgcG9kc3Vtb3d1asSFY2EgS2FsZW5kYXJ6IFd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAnUG93aWFkb21pZW5pYSBXeWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ0VrcmFuIGVkeWNqaSB3eWRhcnplxYQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdMaXN0YSB3eWRhcnplxYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdMaXN0YSB3eWRhcnplxYQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdQb3dpYWRvbWllbmlhIHd5ZGFyemXFhCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdXeWRhcnplbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAnRWtyYW4gemFyesSFZHphbmlhIEthbGVuZGFyemVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ1d5YmllcnosIGRsYSBqYWtpZWdvIHJvZHphanUgem1pYW4gdyB3eWRhcnplbmlhY2gsIGNoY2VzeiBvdHJ6eW15d2HEhyBwb3dpYWRvbWllbmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAnVXR3w7NyeiBub3d5IGthbGVuZGFyeiB3eWRhcnplxYQgcG/FgsSFY3pvbnkgeiB0eW0gemfFgm9zemVuaWVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnVXR3w7NyeiBpIHphcnrEhWR6YWogcG93aWFkb21pZW5pYW1pIHd5ZGFyemXFhC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdVdHfDs3J6IG5vd2Ugd3lkYXJ6ZW5pZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGV2ZW50IG9iamVjdCB0eXBlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCB2aWEgQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBkeW5hbWljIGZpZWxkIGRhdGUgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0VkeXR1aiB3eWRhcnplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdDemFzIHBpZXJ3c3plaiBvZHBvd2llZHppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ0VrcmFuIGltcG9ydHUgd3lkYXJ6ZcWELic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rcyBhcHBvaW50bWVudHMgYW5kIHRpY2tldHMgd2l0aCBhICJOb3JtYWwiIHR5cGUgbGluay4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICdQcnplZ2zEhWQgd3N6eXN0a2ljaCB3eWRhcnplxYQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ0N6YXMgb2N6ZWtpd2FuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdLYWxlbmRhcnogUHVibGljem55JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICdLYWxlbmRhcnogcHVibGljem55Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ1ByemVnbMSFZCB6YXNvYsOzdyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICdQcnplZ2zEhWQgemFzb2LDs3cgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnQ3phcyByb3p3acSFemFuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICdXeWLDs3Igcm9kemFqdSB0cmFuc3BvcnR1IGRsYSBwb3dpYWRvbWllxYQgbyB3eWRhcnplbmlhY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ0N6YXMgYWt0dWFsaXphY2ppJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ05vdGlmaWNhw6fDo28gZGUgbGVtYnJldGUgZG8gY29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ1ZvY8OqIHJlY2ViZXLDoSB1bWEgbm90aWZpY2HDp8OjbyB0b2RhIHZleiBxdWUgbyB0ZW1wbyBkZSBsZW1icmV0ZSBwYXJhIHVtIGRlIHNldXMgY29tcHJvbWlzc29zIGZvciBhdGluZ2lkbyAuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAnR2VyZW5jaWFtZW50byBkZSBub3RpZmljYcOnw6NvIGRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnQXF1aSB2b2PDqiBwb2RlIGZhemVyIHVwbG9hZCBkZSB1bSBhcnF1aXZvIGRlIGNvbmZpZ3VyYcOnw6NvIHBhcmEgaW1wb3J0YXIgbm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28gcGFyYSBvIHNldSBzaXN0ZW1hLiBPIGFycXVpdm8gZGV2ZSBlc3RhciBubyBmb3JtYXRvIC55bWwgY29tbyBleHBvcnRhZG8gcGVsbyBtw7NkdWxvIGRlIG5vdGlmaWNhw6fDo28gZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnQXF1aSB2b2PDqiBwb2RlIGVzY29saGVyIHF1YWlzIGV2ZW50b3MgaXLDo28gYWNpb25hciBlc3NhIG5vdGlmaWNhw6fDo28uIFVtIGZpbHRybyBkZSBjb21wcm9taXNzbyBhZGljaW9uYWwgcG9kZSBzZXIgYXBsaWNhZG8gYWJhaXhvIHBhcmEgZW52aWFyIGFwZW5hcyBjb21wcm9taXNzb3MgY29tIGRldGVybWluYWRvcyBjcml0w6lyaW9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICdGaWx0cmFyIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdUaW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAnUmVjdXJzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ05vdGlmaWNhciBvIHVzdcOhcmlvIGFwZW5hcyB1bWEgdmV6IHBvciBkaWEgc29icmUgdW0gw7puaWNvIGNvbXByb21pc3NvIHVzYW5kbyB1bSB0cmFuc3BvcnRlIHNlbGVjaW9uYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ0FzIG5vdGlmaWNhw6fDtWVzIHPDo28gZW52aWFkYXMgYSB1bSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgZmlyc3QgMjAgY2hhcmFjdGVyIG9mIHRoZSBhcHBvaW50bWVudCB0aXRsZS4nfSA9ICdQYXJhIG9idGVyIG9zIDIwIHByaW1laXJvcyBjYXJhY3RlcmVzIGRvIHTDrXR1bG8gZG8gY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlciBvIGF0cmlidXRvIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAnUGFyYSBvYnRlciBvIGF0cmlidXRvIGNhbGVuZMOhcmlvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1Zpc8OjbyBnZXJhbCBkYSBBZ2VuZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ0dlcmVuY2lhciBDYWxlbmTDoXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAnQWRpY2lvbmFyIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAnQ29yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnRGF0YSBmaW5hbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBlYXQnfSA9ICdSZXBldGlyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ05lbmh1bSBjYWxlbmTDoXJpbyBlbmNvbnRyYWRvLiBQb3IgZmF2b3IsIHByaW1laXJvIGFkaWNpb25lIHVtIGNhbGVuZMOhcmlvIHVzYW5kbyBhIHDDoWdpbmEgZGUgR2VyZW5jaWFtZW50byBkZSBDYWxlbmTDoXJpb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAnQ29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ0VzdGUgw6kgdW0gY29tcHJvbWlzc28gcmVwZXRpZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICdWb2PDqiBkZXNlamEgZWRpdGFyIGFwZW5hcyBlc3NhIG9jb3Jyw6puY2lhIG91IHRvZGFzIGFzIG9jb3Jyw6puY2lhcz8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnVG9kYXMgYXMgb2NvcnLDqm5jaWFzICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ0FwZW5hcyBlc3NhIG9jb3Jyw6puY2lhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICdHZXJlbmNpYW1lbnRvIGRlIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnVmlzw6NvIGdlcmFsIGRlIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICdBZGljaW9uYXIgbm92byBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2FsZW5kYXInfSA9ICdBZGljaW9uYXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIENvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRhciBDYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ0FxdWkgdm9jw6ogcG9kZSBjYXJyZWdhciB1bSBhcnF1aXZvIGRlIGNvbmZpZ3VyYcOnw6NvIHBhcmEgaW1wb3J0YXIgdW0gY2FsZW5kw6FyaW8gcGFyYSBzZXUgc2lzdGVtYS4gTyBhcnF1aXZvIHByZWNpc2Egc2VyIGVtIC55bWwgIGNvbW8gbyBleHBvcnRhZG8gcGVsbyBtw7NkdWxvIGRlIGdlcmVuY2lhbWVudG8gZGUgY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnQ2FycmVnYXIgY29uZmlndXJhw6fDo28gZG8gY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAnSW1wb3J0YXIgQ2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlsdGVyIGZvciBjYWxlbmRhcnMnfSA9ICdGaWx0cm8gcGFyYSBjYWxlbmTDoXJpb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnRGVwZW5kZW5kbyBkbyBjYW1wbyBncnVwbywgbyBzaXN0ZW1hIGxpYmVyYXLDoSB1c3XDoXJpb3MgcGFyYSBhY2Vzc2FyIG8gY2FsZW5kw6FyaW8gZGUgYWNvcmRvIGNvbSBvIG7DrXZlbCBkZSBwZXJtaXNzw6NvIGRlbGVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ0FwZW5hcyBsZWl0dXJhOiB1c3XDoXJpb3MgcG9kZW0gdmVyIGUgZXhwb3J0YXIgdG9kb3Mgb3MgY29tcHJvbWlzc29zIG5lc3NlIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ01vdmVyIHBhcmE6IHVzdcOhcmlvcyBwb2RlcsOjbyBtb2RpZmljYXIgY29tcHJvbWlzc29zIG5vIGNhbGVuZMOhcmlvLCBtYXMgc2VtIGFsdGVyYXIgYSBzZWxlw6fDo28gZG8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdDcmlhcjogdXN1w6FyaW9zIHBvZGVtIGNyaWFyIGUgZXhjbHVpciBjb21wcm9taXNzb3Mgbm8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdMZWl0dXJhL2VzY3JpdGE6IG9zIHVzdcOhcmlvcyBwb2RlbSBnZXJlbmNpYXIgbyBwcsOzcHJpbyBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGFyIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rvd25sb2FkIGNhbGVuZGFyJ30gPSAnQmFpeGFyIGNhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ0NvcGlhciBVUkwgcHVibGljYSBkbyBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnTm9tZSBkbyBjYWxlbmTDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdDYWxlbmTDoXJpbyBjb20gbWVzbW8gbm9tZSBqw6EgZXhpc3RlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnR3J1cG8gZGUgcGVybWlzc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAnQ29tcHJvbWlzc29zIGRlIGNoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ3JhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ1VzZSBhcyBvcMOnw7VlcyBhYmFpeG8gcGFyYSBkaW1pbnVpciBxdWFpcyBjb21wcm9taXNzb3MgZGUgY2hhbWFkbyBzZXLDo28gY3JpYWRvcyBhdXRvbWF0aWNhbWVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICdQb3IgZmF2b3IsIHNlbGVjaW9uZSB1bWEgZmlsYSB2w6FsaWRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWFyY2ggYXR0cmlidXRlcyd9ID0gJ0F0cmlidXRvcyBkYSBwZXNxdWlzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgcnVsZXMgZm9yIGNyZWF0aW5nIGF1dG9tYXRpYyBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhciBiYXNlZCBvbiB0aWNrZXQgZGF0YS4nfSA9CiAgICAgICAgJ0RlZmluaXIgcmVncmFzIHBhcmEgY3JpYcOnw6NvIGF1dG9tw6F0aWNhIGRlIGNvbXByb21pc3NvcyBuZXN0ZSBjYWxlbmTDoXJpbyBiYXNlYWRvIGVtIGRhZG9zIGRlIGNoYW1hZG8uICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgUnVsZSd9ID0gJ0FkaWNpb25hciByZWdyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTWFpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWVub3MnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnQWRpY2lvbmFyIG5vdm8gQ29tcHJvbWlzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnQ2FsZW5kw6FyaW9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdNdWl0b3MgY2FsZW5kw6FyaW9zIGF0aXZvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICdQb3IgZmF2b3IsIGRlc2xpZ3VlIGFsZ3VucyBwcmltZWlybyBvdSBhdW1lbnRlIG8gbGltaXRlIG5hIGNvbmZpZ3VyYcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAnU2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTGluaGEgZGUgdGVtcG8gZG8gbcOqcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnTGluaGEgZGUgdGVtcG8gZGEgc2VtYW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0xpbmhhIGRlIHRlbXBvIGRvIGRpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAnUHVsYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ1JlY3VzYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ01vc3RyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQmFzaWMgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hw6fDo28gYsOhc2ljYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdEYXRhL0hvcmEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ1BvciBmYXZvciwgY29uZmlndXJlIG8gdmFsb3IgYW50ZXMgZGEgZGF0YSBmaW5hbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnUG9yIGZhdm9yLCBjb25maWd1cmUgbyB2YWxvciBhbnRlcyBkYSBkYXRhIGluaWNpYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICdFc3RhIHVtYSBvY29ycsOqbmNpYSBkZSB1bSBjb21wcm9taXNzbyBkZSByZXBldGnDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICdDbGlxdWUgYXF1aSBwYXJhIHZlciBvIGNvbXByb21pc3NvIHBhaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnQ2xpcXVlIGFxdWkgcGFyYSBlZGl0YXIgbyBjb21wcm9taXNzbyBwYWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ0ZyZXF1w6puY2lhICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ1RvZG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdQb250byBkZSB0ZW1wbyByZWxhdGl2byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICdUZW0gY2VydGV6YSBxdWUgZGVzZWphIHJlbW92ZXIgZXNzZSBjb21wcm9taXNzbz8gRXNzYSBvcGVyYcOnw6NvIG7Do28gcG9kZSBzZXIgZGVzZmVpdGEuJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdJbXBvcnRhw6fDo28gZGUgY29tcHJvbWlzc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAnTyBhcnF1aXZvIGVudmlhZG8gZGV2ZSBlc3RhciBubyBmb3JtYXRvIHbDoWxpZG8gaUNhbCAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ1NlIG8gQ2FsZW5kw6FyaW8gZGVzZWphZG8gbsOjbyBlc3RpdmVyIGxpc3RhZG8gYXF1aSwgcG9yIGZhdm9yIGNlcnRpZmlxdWUtc2UgcXVlIHZvY8OqIHRlbmhhLCBwZWxvIG1lbm9zIHBlcm1pc3PDtWVzICJDcmlhciIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAnQXR1YWxpemFyIGNvbXByb21pc3NvcyBleGlzdGVudGVzPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ1RvZG9zIG9zIGNvbXByb21pc3NvcyBubyBjYWxlbmTDoXJpbyBjb20gbyBtZXNtbyBVbmlxdWVJRCBzZXLDo28gc29icmVzY3JpdG8uICAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnQ2FycmVnYXIgY2FsZW5kw6FyaW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyd9ID0gJ0ltcG9ydGFyIGNvbXByb21pc3Nvcyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOb3ZvIENvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nvb24nfSA9ICdFbSBicmV2ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1IGRpYXMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAnTm9tZSBkYSBub3RpZmljYcOnw6NvIGrDoSBleGlzdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICdBdGVuZGVudGUgKHJlY3Vyc29zKSwgcXVlIHPDo28gc2VsZWNpb25hZG9zIGRlbnRybyBkbyBjb21wcm9taXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdUb2RvcyBvcyBhZ2VudGVzIGNvbSAobm8gbcOtbmltbykgcGVybWlzc8OjbyBkZSBsZWl0dXJhIGRvIGNvbXByb21pc3NvIChjYWxlbmTDoXJpbyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdUb2RvcyBvcyBhdGVuZGVudGVzIGNvbSBwZXJtaXNzw6NvIGRlIGVzY3JpdGEgbm8gY29tcHJvbWlzc28gKGNhbGVuZMOhcmlvKSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnU2lzdGVtYSBuw6NvIGZvaSBjYXBheiBkZSBjcmlhciBvIENhbGVuZMOhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05lbmh1bSBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnfSA9ICdWb2PDqiBuw6NvIHRlbSBhY2Vzc28gYSBlc3RlIGNhbGVuZMOhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENhbGVuZGFyJ30gPSAnRWRpdGFyIENhbGVuZMOhcmlvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdFcnJvIGFvIGF0dWFsaXphciBvIGNhbGVuZMOhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnTsOjbyBmb2kgcG9zc8OtdmVsIGxlciBhcnF1aXZvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGNhbGVuZMOhcmlvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICdQb3IgZmF2b3IsIHZlcmlmaXF1ZSBzZSBvIHNldSBhcnF1aXZvIMOpIHbDoWxpZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBpbXBvcnRhciBvIGNhbGVuZMOhcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBpbXBvcnRlZCEnfSA9ICdDYWxlbmTDoXJpbyBpbXBvcnRhZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdOZWNlc3PDoXJpbyBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ07Do28gZm9pIHBvc3PDrXZlbCBvYnRlciBkYWRvcyBwYXJhIGRldGVybWluYWRvIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ0ltcG9ydGFkbyBjb20gc3VjZXNzbyAlcyBjb21wcm9taXNzbyhzKSBwYXJhIG8gY2FsZW5kw6FyaW8gJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBtaW51dG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgaG9yYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICdUb2RvcyBvcyBjb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnQ29tcHJvbWlzc29zIGF0cmlidcOtZG9zIGEgbWltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnfSA9ICdNb3N0cmFyIGFwZW5hcyBjb21wcm9taXNzb3MgYXNzaW5hZG9zIGEgdm9jw6ohIEFsdGVyYXIgY29uZmlndXJhw6fDtWVzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ0NvbXByb21pc3NvIG7Do28gZW5jb250cmFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdOdW5jYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICdUb2RvIGRpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnVG9kbyBzZW1hbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICdUb2RvIE3DqnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ1RvZG8gQW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ0N1c3RvbWl6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGnDoXJpbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICdTZW1hbmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZW5zYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVhcmx5J30gPSAnQW51YWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICd0b2Rvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ2RlICVzIHRlbXBvKHMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2F0w6kgLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ2RlIC4uLiB0ZW1wbyhzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2F0w6kgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnTmVuaHVtYSBub3RpZmljYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyBtaW51dG8ocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyBob3JhKHMpIGFudGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclcyBkaWEocykgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyBzZW1hbmEgYW50ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICdhbnRlcyBkbyBjb21wcm9taXNzbyBpbmljaWFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAnZGVwb2lzIHF1ZSBvIGNvbXByb21pc3NvIGZvaSBpbmljaWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdhbnRlcyBkbyBjb21wcm9taXNzbyBlbmNlcnJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICdkZXBvaXMgcXVlIG8gY29tcHJvbWlzc28gZm9pIGVuY2VycmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ1NlbSBwZXJtaXNzw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOw6NvIMOpIHBvc3PDrXZlbCBleGNsdWlyIG8gY29tcHJvbWlzc28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnU2VtIHBlcm1pc3PDtWVzISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICdTZW0gcGVybWlzc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdTaXN0ZW1hIG7Do28gZm9pIGNhcGF6IGRlIGltcG9ydGFyIGFycXVpdm8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ1BvciBmYXZvciB2ZXJpZmlxdWUgbyBsb2cgcGFyYSBtYWlzIGluZm9ybWHDp8O1ZXMuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgbWFpcyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ05lbmh1bSAlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gc3VjaCB1c2VyISd9ID0gJ1VzdcOhcmlvIG7Do28gZW5jb250cmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGNhbGVuZGFyISd9ID0gJ0NhbGVuZMOhcmlvIGludmFsaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdVUkwgaW52w6FsaWRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdIb3V2ZSB1bSBlcnJvIGFvIGV4cG9ydGFyIG8gY2FsZW5kw6FyaW8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnQXR1YWxpemHDp8OjbyAobWludXRvcyknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ1DDoWdpbmEgZGUgdmlzw6NvIGdlcmFsIGRlIGNhbGVuZMOhcmlvIGRlIGNvbXByb21pc3Nvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50byBkbyBjYWxlbmTDoXJpbyBkZSBjb21wcm9taXNzb3MgcXVlIHByZXBhcmEgYSBlbnRyYWRhIGRlIG5vdGlmaWNhw6fDo28gcGFyYSBhcG9udGFtZW50b3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIGV2ZW50byBkbyBjYWxlbmTDoXJpbyBkZSBjb21wcm9taXNzb3MgcXVlIGF0dWFsaXphIG8gY2hhbWFkbyBjb20gZGFkb3MgZG8gY29tcHJvbWlzc28gZGUgY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnVGVsYSBkZSBlZGnDp8OjbyBkZSBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ0xpc3RhIGRlIGNvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIGRlIGNvbXByb21pc3Nvcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ05vdGlmaWNhw6fDtWVzIGRlIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ0NvbXByb21pc3Nvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ1RlbGEgZGUgZ2VyZW5jaWFtZW50byBkZSBjYWxlbmTDoXJpby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnRXNjb2xoYSBwYXJhIGEgcXVhbCB0aXBvIGRlIGFsdGVyYcOnw7VlcyBubyBjb21wcm9taXNzbyB2b2PDqiBkZXNlamEgcmVjZWJlciBub3RpZmljYcOnw7Vlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0NyaWFyIHVtIG5vdm8gY29tcHJvbWlzc28gZGUgY2FsZW5kw6FyaW8gYXNzb2NpYWRvIGEgZXNzZSBjaGFtYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgbm90aWZpY2HDp8O1ZXMgZGUgY29tcHJvbWlzc28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnQ3JpYXIgbm92byBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICdEZWZpbmUgcXVhaXMgY29sdW5hcyBzZXLDo28gZXhpYmlkYXMgbm8gd2lkZ2V0IGRlIGNvbXByb21pc3NvcyBhc3NvY2lhZG9zIChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvICwgMSA9IERpc3BvbsOtdmVsLCAyID0gQXRpdmFkbyBwb3IgcGFkcsOjby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBhbiBpY29uIHdpdGggbGluayB0byB0aGUgZ29vZ2xlIG1hcCBwYWdlIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0KICAgICAgICAnRGVmaW5lIHVtIMOtY29uZSBjb20gbGluayBwYXJhIGEgcMOhZ2luYSBjb20gbWFwYSBkbyBnb29nbGUgZGEgbG9jYWxpemHDp8OjbyBhdHVhbCBuYSB0ZWxhIGRlIGVkacOnw6NvIGRlIGNvbXByb21pc3NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluZSBvcyB0aXBvcyBkZSBldmVudG9zIGRlIG9iamV0b3MgcXVlIHNlcsOjbyB0cmF0YWRhcyBhdHJhdsOpcyBkZSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnRGVmaW5lIGEgbGlzdGEgZGUgcGFyw6JtZXRyb3MgcXVlIHBvZGVtIHNlciBwYXNzYWRvcyBwYXJhIGEgZnVuw6fDo28gZGUgYnVzY2EgZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIHBhcmEgbyB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIHBhcmEgbyB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBwYXJhIG8gdGlja2V0IHBlbmRpbmcgdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0RlZmluZSBvIHBsdWdpbiBkbyB0aWNrZXQgcGFyYSBjb21wcm9taXNzb3MgZG8gY2FsZW5kw6FyaW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnRWRpdGFyIGNvbXByb21pc3NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdUZW1wbyBkZSBwcmltZWlyYSByZXNwb3N0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdUZWxhIGRlIGltcG9ydGHDp8OjbyBkZSBjb21wcm9taXNzb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAnQXNzb2NpYXIgY29tcHJvbWlzc29zIGUgY2hhbWFkb3MgY29tbyB1bWEgdGlwbyAiTm9ybWFsIi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIG9zIGV2ZW50b3MgZGUgY29tcHJvbWlzc28gcXVlIHNlcsOjbyBleGliaWRvIG5hIEdVSS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIGRlIHRvZG9zIG9zIGV2ZW50b3MgZG8gY2FsZW5kw6FyaW8gYSBzZXIgZXhpYmlkbyBuYSBHVUkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAnTGlzdGEgZGUgY29yZXMgZW0gUkdCIGhleGFkZWNpbWFsIHF1ZSBlc3RhcsOjbyBkaXNwb27DrXZlaXMgcGFyYSBzZWxlw6fDo28gZHVyYW50ZSBhIGNyaWHDp8OjbyBkbyBjYWxlbmTDoXJpby4gQ2VydGlmaXF1ZS1zZSBkZSBhcyBjb3JlcyBzw6NvIGVzY3VyYXMgbyBzdWZpY2llbnRlLCB0ZXh0byBicmFuY2FzIHBvZGVtIHNlciBzb2JyZXBvc3Rvcy4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ0dlcmVuY2lhciBjYWxlbmTDoXJpbyBkaWZlcmVudGVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ07Dum1lcm8gbcOheGltbyBkZSBjYWxlbmTDoXJpbyBhdGl2b3MgbmFzIHZpc8O1ZXMgZ2VyYWlzLiBQb3IgZmF2b3IsIG5vdGUgcXVlIHVtIG51bWVybyBncmFuZGUgZGUgY2FsZW5kw6FyaW8gYXRpdm9zIHZvY8OqIHBvZGVyw6EgdGVyIGltcGFjdG9zIG5hIHBlcmZvcm1hbmNlIGRvIHNlcnZpZG9yIGRldmlkbyBhIG11aXRhcyBjaGFtYWRhcyBzaW11bHTDom5lYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJ08gT1RSUyBuw6NvIHN1cG9ydGEgY29tcHJvbWlzc29zIHJlY29ycmVudGVzLCBzZW0gZGF0YSBkZSB0w6lybWlubyBvdSBvIG7Dum1lcm8gZGUgaXRlcmHDp8O1ZXMuIER1cmFudGUgbyBwcm9jZXNzbyBkZSBpbXBvcnRhw6fDo28sIHBvZGUgYWNvbnRlY2VyIGRvIGFycXVpdm8gSUNTLCBjb250ZXIgZXNzZXMgY29tcHJvbWlzc29zLiBFbSB2ZXogZGlzc28sIG8gc2lzdGVtYSBjcmlhIHRvZG9zIG9zIGNvbXByb21pc3NvcyBubyBwYXNzYWRvLCBhbMOpbSBkZSBjb21wcm9taXNzb3MgcGFyYSBvcyBwcsOzeGltb3MgbiBtZXNlcyAoMTIwIG1lc2VzLzEwIGFub3MgcG9yIHBhZHLDo28pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ1Zpc8OjbyBnZXJhbCBkZSB0b2RvcyBvcyBjb21wcm9taXNzb3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ0RhdGEgZGUgcGVuZMOqbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoJ30gPSAnUGVzcXVpc2FyIFBsdWdpbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ03Ds2R1bG8gZGUgcGVzcXVpc2EgZGUgYXV0b2NvbXBsZXRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAnQ2FsZW5kw6FyaW8gcMO6YmxpY28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ0NhbGVuZMOhcmlvIHDDumJsaWNvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnVmlzw6NvIGdlcmFsIGRlIHJlY3Vyc29zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1Zpc8OjbyBnZXJhbCBkZSByZWN1cnNvIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgY3JpYXIgdW0gY29tcHJvbWlzc28gZGUgY2FsZW5kw6FyaW8gdmluY3VsYWRvIGFvIGNoYW1hZG8gbmEgdmlzw6NvIHRpY2tldCB6b29tIG5hIGludGVyZmFjZSBkbyBhdGVuZGVudGUuIENvbnRyb2xlIGRlIGFjZXNzbyBhZGljaW9uYWwgcGFyYSBtb3N0cmFyIG91IG7Do28gbyB2w61uY3VsbyBwb2RlIHNlciBmZWl0byB1c2FuZG8gYSBjaGF2ZSAiR3JvdXAiIGUgbyBjb250ZcO6ZG8gY29tbyAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBQYXJhIGFncnVwYXIgaXRlbnMgZGUgbWVudSB1c2UgYSBjaGF2ZSAiQ2x1c3Rlck5hbWUiIGUgcGFyYSBvIGNvbnRlw7pkbyBxdWFscXVlciBub21lIHF1ZSBkZXNlamUgdmVyIG5hIGludGVyZmFjZSBkbyB1c3XDoXJpby4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHBhcmEgY29uZmlndXJhciBhIG9yZGVtIGRlIHVtIGRldGVybWluYWRvIGNvbmp1bnRvIGRlbnRybyBkbyB0b29sYmFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnVGVtcG8gZGUgc29sdcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnU2VsZcOnw6NvIGRlIHRyYW5zcG9ydGUgcGFyYSBub3RpZmljYcOnw7VlcyBkZSBjb21wcm9taXNzby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAnRGlzcGFyYSBhZGnDp8OjbyBvdSBhdHVhbGl6YcOnw6NvIGRlIGNvbXByb21pc3NvcyBkbyBjYWxlbmTDoXJpbyBhdXRvbcOhdGljbyBjb20gYmFzZSBlbSBkZXRlcm1pbmFkb3MgdGVtcG9zIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdUZW1wbyBkZSBhdHVhbGl6YcOnw6NvJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40LUg0L4g0L3QsNC/0L7QvNC40L3QsNC90LjQuCDQviDQvNC10YDQvtC/0YDQuNGP0YLQuNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQktGLINC/0L7Qu9GD0YfQuNGC0LUg0YLQsNC60L7QtSDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1INCy0YHRj9C60LjQuSDRgNCw0Lcg0LrQvtCz0LTQsCDQvdCw0YHRgtGD0L/QuNGCINGB0YDQvtC6INC90LDQv9C+0LzQuNC90LDQvdC40Y8g0L/QviDQvtC00L3QvtC80YMg0LjQtyDQstCw0YjQuNGFINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0YPQstC10LTQvtC80LvQtdC90LjRj9C80Lgg0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAn0JfQtNC10YHRjCDQstGLINC80L7QttC10YLQtSDQt9Cw0LPRgNGD0LfQuNGC0Ywg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3QvdGL0Lkg0YTQsNC50Lsg0LTQu9GPINC40LzQv9C+0YDRgtCwINGD0LLQtdC00L7QvNC70LXQvdC40Lkg0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFINCyINCy0LDRiNGDINGB0LjRgdGC0LXQvNGDLiDQpNCw0LnQuyDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LIg0YTQvtGA0LzQsNGC0LUgLnltbCDQsiDQutC+0YLQvtGA0L7QvCDRjdC60YHQv9C+0YDRgtC40YDRg9GO0YLRgdGPINC40Lcg0LzQvtC00YPQu9GPINGD0LLQtdC00L7QvNC70LXQvdC40Lkg0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9GFLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ9CX0LTQtdGB0Ywg0LLRiyDQvNC+0LbQtdGC0LUg0LLRi9Cx0YDQsNGC0Ywg0LrQsNC60LjQtSDRgdC+0LHRi9GC0LjRjyDQsdGD0LTRg9GCINCy0LrQu9GO0YfQsNGC0Ywg0Y3RgtC+INGD0LLQtdC00L7QvNC70LXQvdC40LUuINCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0Lkg0YTQuNC70YzRgtGAINC80L7QttC10YIg0LHRi9GC0Ywg0L/RgNC40LzQtdC90ZHQvSDQvdC40LbQtSDQtNC70Y8g0LjRhSDQvtGC0L/RgNCw0LLQutC4INC00LvRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5LCDRg9C00L7QstC70LXRgtCy0L7RgNGP0Y7RidC40YUg0LfQsNC00LDQvdC90L7QvNGDINGD0YHQu9C+0LLQuNGOLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfQpNC40LvRjNGC0YAg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ9Ca0L7QvNCw0L3QtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn0KDQtdGB0YPRgNGB0YsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICfQo9Cy0LXQtNC+0LzQuNGC0Ywg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINGC0L7Qu9GM0LrQviDRgNCw0Lcg0LIg0LTQtdC90Ywg0LTQu9GPINC60LDQttC00L7Qs9C+INC+0YLQtNC10LvRjNC90L7Qs9C+INC80LXRgNC+0L/RgNC40Y/RgtC40Y8sINC40YHQv9C+0LvRjNC30YPRjyDRg9C60LDQt9Cw0L3QvdGL0Lkg0YHQv9C+0YHQvtCxINC00L7RgdGC0LDQstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAn0KPQstC10LTQvtC80LvQtdC90LjRjyDQvdCw0L/RgNCw0LLQu9GP0Y7RgtGB0Y8g0Log0LDQs9C10L3RgtGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAn0KfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINC/0LXRgNCy0YvQtSAyMCDRgdC40LzQstC+0LvQvtCyINGC0LXQvNGLINC80LXRgNC+0L/RgNC40Y/RgtC40Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn0KfRgtC+0LHRiyDQv9C+0LvRg9GH0LjRgtGMINCw0YLRgNC40LHRg9GCINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICfQp9GC0L7QsdGLINC/0L7Qu9GD0YfQuNGC0Ywg0LDRgtGA0LjQsdGD0YIg0LrQsNC70LXQvdC00LDRgNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ9Ce0LHQt9C+0YAg0L/QvtCy0LXRgdGC0LrQuCDQtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENhbGVuZGFycyd9ID0gJ9Cj0L/RgNCw0LLQu9GP0YLRjCDQutCw0LvQtdC90LTQsNGA0Y/QvNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ9Cm0LLQtdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn0JTQsNGC0LAg0L7QutC+0L3Rh9Cw0L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ9Cf0L7QstGC0L7RgNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4nfSA9CiAgICAgICAgJ9Cd0LUg0L3QsNC30L3QsNGH0LXQvSDQutCw0LvQtdC90LTQsNGA0YwuINCU0L7QsdCw0LLRjNGC0LUg0LrQsNC70LXQvdC00LDRgNGMINC40YHQv9C+0LvRjNC30YPRjyDRjdC60YDQsNC9INGD0L/RgNCw0LLQu9C10L3QuNGPINC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAn0K3RgtC+INC/0L7QstGC0L7RgNGP0Y7RidC10LXRgdGPINC80LXRgNC+0L/RgNC40Y/RgtC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfQktGLINC20LXQu9Cw0LXRgtC1INGA0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGC0L7Qu9GM0LrQviDRgtC10LrRg9GJ0LXQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1INC40LvQuCDQstGB0LUg0LXQs9C+INC/0L7QstGC0L7RgNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ9CS0YHQtSDQstGF0L7QttC00LXQvdC40Y8v0LrQvtC/0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ9Ci0L7Qu9GM0LrQviDRjdGC0YMg0LrQvtC/0LjRjic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ9Ce0LHQt9C+0YAg0LrQsNC70LXQvdC00LDRgNC10LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0L3QvtCy0YvQuSDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAn0JTQvtCx0LDQstC40YLRjCDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ9CY0LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAn0JjQvNC/0L7RgNGCINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ9CX0LTQtdGB0Ywg0LLRiyDQvNC+0LbQtdGC0LUg0LfQsNCz0YDRg9C30LjRgtGMINGE0LDQudC7INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQuCDQtNC70Y8g0LjQvNC/0L7RgNGC0LAg0LrQsNC70LXQvdC00LDRgNGPINCyINCy0LDRiNGDINGB0LjRgdGC0LXQvNGDLiDQpNCw0LnQuyDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LIg0YTQvtGA0LzQsNGC0LUgLnltbCDRhNCw0LnQuyDRjdC60YHQv9C+0YDRgtCwINC40Lcg0LzQvtC00YPQu9GPINGD0L/RgNCw0LLQu9C10L3QuNGPINC60LDQu9C10L3QtNCw0YDRj9C80LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAn0JfQsNCz0YDRg9C30LjRgtGMINC60L7QvdGE0LjQs9GD0YDQsNGG0LjRjiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn0JjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn0KTQuNC70YzRgtGAINC00LvRjyDQmtCw0LvQtdC90LTQsNGA0LXQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXBlbmRpbmcgb24gdGhlIGdyb3VwIGZpZWxkLCB0aGUgc3lzdGVtIHdpbGwgYWxsb3cgdXNlcnMgdGhlIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgYWNjb3JkaW5nIHRvIHRoZWlyIHBlcm1pc3Npb24gbGV2ZWwuJ30gPQogICAgICAgICfQkiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0LfQvdCw0YfQtdC90LjRjyDQsiDQv9C+0LvQtSBncm91cCwg0YHQuNGB0YLQtdC80LAg0L/RgNC10LTQvtGB0YLQsNCy0LvRj9C10YIg0LDQs9C10L3RgtCw0Lwg0LTQvtGB0YLRg9C/INC6INC60LDQu9C10L3QtNCw0YDRjiDQsiDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Lgg0YEg0YPRgNC+0LLQvdC10Lwg0LXQs9C+INC/0L7Qu9C90L7QvNC+0YfQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ci0L7Qu9GM0LrQviDRh9GC0LXQvdC40LU6INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQuCDQvNC+0LPRg9GCINGB0LzQvtGC0YDQtdGC0Ywg0Lgg0Y3QutGB0L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQstGB0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQutCw0LvQtdC90LTQsNGA0Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAn0J/QtdGA0LXQvNC10YHRgtC40YLRjCDQsjog0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C4INC80L7Qs9GD0YIg0LjQt9C80LXQvdGP0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC60LDQu9C10L3QtNCw0YDQtSwg0L3QviDQsdC10Lcg0LLRi9Cx0L7RgNCwINC60LDQu9C10L3QtNCw0YDRjyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ch0L7Qt9C00LDRgtGMOiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LzQvtCz0YPRgiDRgdC+0LfQtNCw0LLQsNGC0Ywg0Lgg0YPQtNCw0LvRj9GC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfQl9Cw0L/QuNGB0Ywv0YfRgtC10L3QuNC1OiDQv9C+0LvRjNC30L7QstCw0YLQtdC70Lgg0LjQvNC10Y7RgiDQv9C+0LvQvdC+0LUg0YPQv9GA0LDQstC70LXQvdC40LUg0LrQsNC70LXQvdC00LDRgNC10LwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ1VSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICfQrdC60YHQv9C+0YDRgiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfQl9Cw0LPRgNGD0LfQutCwINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICfQmtC+0L/QuNGA0L7QstCw0YLRjCDQv9GD0LHQu9C40YfQvdGL0LkgVVJMINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAn0JjQvNGPINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICfQmtCw0LvQtdC90LTQsNGA0Ywg0YEg0YLQsNC60LjQvCDQuNC80LXQvdC10Lwg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn0JPRgNGD0L/Qv9C+0LLRi9C1INC/0YDQsNCy0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfQn9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICfQmNGB0L/QvtC70YzQt9GD0LnRgtC1INC+0L/RhtC40Lgg0L3QuNC20LUsINGH0YLQvtCx0Ysg0YPQutCw0LfQsNGC0YwsINC60LDQutC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQt9Cw0Y/QstC+0Log0LHRg9C00YPRgiDRgdC+0LfQtNCw0L3RiyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLid9ID0gJ9CS0YvQsdC10YDQuNGC0LUg0L/RgNCw0LLQuNC70YzQvdGD0Y4g0L7Rh9C10YDQtdC00YwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn0JDRgtGA0LjQsdGD0YLRiyDQv9C+0LjRgdC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICfQl9Cw0LTQsNGC0Ywg0L/RgNCw0LLQuNC70LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRgdC+0LfQtNCw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LIg0Y3RgtC+0Lwg0LrQsNC70LXQvdC00LDRgNC1LCDQvtGB0L3QvtCy0LDQvdC90YvRhSDQvdCwINC00LDQvdC90YvRhSDQt9Cw0Y/QstC60LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAn0JTQvtCx0LDQstC40YLRjCDQv9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAn0JHQvtC70LXQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn0JzQtdC90LXQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINC90L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfQmtCw0LvQtdC90LTQsNGA0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ9Ch0LvQuNGI0LrQvtC8INC80L3QvtCz0L4g0LDQutGC0LjQstC90YvRhSDQutCw0LvQtdC90LTQsNGA0LXQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICfQn9C+0LbQsNC70YPQudGB0YLQsCDQuNC70Lgg0L7RgtC60LvRjtGH0LjRgtC1INC90LXQutC+0YLQvtGA0YvQtSDQuNC70Lgg0YPQstC10LvQuNGH0YzRgtC1INC/0YDQtdC00LXQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INCyINC90LDRgdGC0YDQvtC50LrQsNGFLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrJ30gPSAn0J3QtdC00LXQu9GPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAn0JzQtdGB0Y/Rh9C90YvQuSDQs9GA0LDRhNC40LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ9Cd0LXQtNC10LvRjNC90YvQuSDQs9GA0LDRhNC40LonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAn0JPRgNCw0YTQuNC6INC00L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn0J/QtdGA0LXQudGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ9Ce0YLQutC70L7QvdC40YLRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAn0J/QvtC60LDQt9Cw0YLRjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ9Ce0YHQvdC+0LLQvdGL0LUg0LTQsNC90L3Ri9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhdGUvVGltZSd9ID0gJ9CU0LDRgtCwL9CS0YDQtdC80Y8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDRg9GB0YLQsNC90L7QstC40YLQtSDRjdGC0L4g0LfQvdCw0YfQtdC90LjQtSDQtNC+INCy0YDQtdC80LXQvdC4INC+0LrQvtC90YfQsNC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINGD0YHRgtCw0L3QvtCy0LjRgtC1INGN0YLQviDQt9C90LDRh9C10L3QuNC1INC/0L7RgdC70LUg0LLRgNC10LzQtdC90Lgg0L3QsNGH0LDQu9CwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAn0K3RgtC+INGA0Y/QtCDQv9C+0LLRgtC+0YDRj9GO0YnQuNGF0YHRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Ca0LvQuNC60L3QuNGC0LUg0YHRjtC00LAg0YfRgtC+0LHRiyDQvtGC0LrRgNGL0YLRjCDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn0JrQu9C40LrQvdC40YLQtSDRgdGO0LTQsCDRh9GC0L7QsdGLINGA0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGA0L7QtNC40YLQtdC70YzRgdC60L7QtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICfQp9Cw0YHRgtC+0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ9Ca0LDQttC00YvQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAn0J7RgtC90L7RgdC40YLQtdC70YzQvdCw0Y8g0YLQvtGH0LrQsCDQstGA0LXQvNC10L3QuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfQktGLINC00LXQudGB0YLQstC40YLQtdC70YzQvdC+INC20LXQu9Cw0LXRgtC1INGD0LTQsNC70LjRgtGMINGN0YLQviDQvNC10YDQvtC/0YDQuNGP0YLQuNC1PyDQrdGC0LAg0L7Qv9C10YDQsNGG0LjRjyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtC80LXQvdC10L3QsC4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ9CY0LzQv9C+0YDRgiDQvNC10YDQvtC/0YDQuNGP0YLQuNC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZGVkIGZpbGUgbXVzdCBiZSBpbiB2YWxpZCBpQ2FsIGZvcm1hdCAoLmljcykuJ30gPSAn0JfQsNCz0YDRg9C20LDQtdC80YvQuSDRhNCw0LnQuyDQtNC+0LvQttC10L0g0LjQvNC10YLRjCDQv9GA0LDQstC40LvRjNC90YvQuSBpQ2FsINGE0L7RgNC80LDRgiAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ9CV0YHQu9C4INC20LXQu9Cw0LXQvNGL0Lkg0LrQsNC70LXQvdC00LDRgNGMINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0YHQv9C40YHQutC1LCDRg9Cx0LXQtNC40YLQtdGB0YwsINGH0YLQviDRgyDQstCw0YEg0LXRgdGC0Ywg0YXQvtGC0Y8g0LHRiyDQv9GA0LDQstCwINC90LAg0YHQvtC30LTQsNC90LjQtSAtIFwnY3JlYXRlXCcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAn0J7QsdC90L7QstC40YLRjCDRgdGD0YnQtdGB0YLQstGD0Y7RidC10LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICfQktGB0LUg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQuNC1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0LIg0LrQsNC70LXQvdC00LDRgNC1INGBINC+0LTQuNC90LDQutC+0LLRi9C8IFVuaXF1ZUlEINCx0YPQtNGD0YIg0L/QtdGA0LXQt9Cw0L/QuNGB0LDQvdGLLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfQl9Cw0LPRgNGD0LfQuNGC0Ywg0LrQsNC70LXQvdC00LDRgNGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICfQmNC80L/QvtGA0YLQuNGA0L7QstCw0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ9Cd0L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAn0KHQutC+0YDQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1INC00L3QtdC5JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ9Cj0LLQtdC00L7QvNC70LXQvdC40LUg0YEg0YLQsNC60LjQvCDQuNC80LXQvdC10Lwg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAn0JDQs9C10L3RgiAo0YDQtdGB0YPRgNGBKSwg0LrQvtGC0L7RgNGL0Lkg0LLRi9Cx0YDQsNC9INCyINC80LXRgNC+0L/RgNC40Y/RgtC40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIChhdCBsZWFzdCkgcmVhZCBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0JLRgdC1INCw0LPQtdC90YLRiyDRgSDQv9GA0LDQstC+0Lwg0YfRgtC10L3QuNGPICjQutCw0Log0LzQuNC90LjQvNGD0LwpINC00LvRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPICjQutCw0LvQtdC90LTQsNGA0Y8pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAn0JLRgdC1INCw0LPQtdC90YLRiyDRgSDQv9GA0LDQstC+0LwgLXcv0LfQsNC/0LjRgdC4INC90LAg0LfQsNGP0LLQutGDINC00LvRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPICjQutCw0LvQtdC90LTQsNGA0Y8pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICfQodC40YHRgtC10LzQtSDQvdC1INGD0LTQsNC70L7RgdGMINGB0L7Qt9C00LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICfQntGC0YHRg9GC0YHRgtCy0YPQtdGCIENhbGVuZGFySUQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ9CjINCy0LDRgSDQvdC10YIg0L/RgNCw0LIg0L3QsCDQtNC+0YHRgtGD0L8g0Log0Y3RgtC+0LzRgyDQutCw0LvQtdC90LTQsNGA0Y4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ9Ce0YjQuNCx0LrQuCDQv9GA0Lgg0L7QsdC90L7QstC70LXQvdC40Lgg0LrQsNC70LXQvdC00LDRgNGPISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn0J3QtdCy0L7Qt9C80L7QttC90L4g0L/RgNC+0YfQuNGC0LDRgtGMINGE0LDQudC7INC90LDRgdGC0YDQvtC10Log0LrQsNC70LXQvdC00LDRgNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nfSA9ICfQo9Cx0LXQtNC40YLQtdGB0YwsINC/0L7QttCw0LvRg9C50YHRgtCwLCDRh9GC0L4g0YTQsNC50Lsg0LjQvNC10LXRgiDQv9GA0LDQstC40LvRjNC90YvQuSDRhNC+0YDQvNCw0YIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC40LzQv9C+0YDRgtC40YDQvtCy0LDRgtGMINC60LDQu9C10L3QtNCw0YDRjCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAn0JrQsNC70LXQvdC00LDRgNGMINC40LzQv9C+0YDRgtC40YDQvtCy0LDQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ9Ci0YDQtdCx0YPQtdGC0YHRjyBDYWxlbmRhcklEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC/0L7Qu9GD0YfQuNGC0Ywg0LTQsNC90L3Ri9C1INC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0LPQviBDYWxlbmRhcklEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfQo9GB0L/QtdGI0L3QviDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L3RiyAlcyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INCyINC60LDQu9C10L3QtNCw0YDRjCAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJyArNSDQvNC40L3Rg9GCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1INC80LjQvdGD0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAg0LzQuNC90YPRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEg0YfQsNGBJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ9CS0YHQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QsNC30L3QsNGH0LXQvdC90YvQtSDQvNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJ9Cf0L7QutCw0LfQsNC90Ysg0YLQvtC70YzQutC+INC80LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QsNC30L3QsNGH0LXQvdC90YvQtSDQktCw0LwhINCY0LfQvNC10L3QuNGC0LUg0L3QsNGB0YLRgNC+0LnQutC4JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ9Cc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0L3QtSDQvdCw0LnQtNC10L3RiyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfQndC40LrQvtCz0LTQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfQmtCw0LbQtNGL0Lkg0LTQtdC90YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ9Ca0LDQttC00YPRjiDQvdC10LTQtdC70Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfQmtCw0LbQtNGL0Lkg0LzQtdGB0Y/Rhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn0JrQsNC20LTRi9C5INCz0L7QtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfQn9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ9CV0LbQtdC00L3QtdCy0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfQldC20LXQvdC10LTQtdC70YzQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICfQldC20LXQvNC10YHRj9GH0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfQldC20LXQs9C+0LTQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn0LrQsNC20LTRi9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAn0L/QvtCy0YLQvtGA0LjRgtGMICVzINGA0LDQtyjQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsndW50aWwgLi4uJ30gPSAn0LTQviAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAn0L/QvtCy0YLQvtGA0LjRgtGMIC4uLiDRgNCw0Lco0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAn0LTQviAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBub3RpZmljYXRpb24nfSA9ICfQndC1INGD0LLQtdC00L7QvNC70Y/RgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICfQt9CwICVzINC80LjQvdGD0YIo0YMpINC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICfQt9CwICVzINGH0LDRgSjQvtCyKSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICfQt9CwICVzINC00LXQvdGMKNC00L3QtdC5KSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAn0LfQsCAlcyDQvdC10LTQtdC70Y4g0LTQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ9C00L4g0L3QsNGH0LDQu9CwINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICfQv9C+0YHQu9C1INC90LDRh9Cw0LvQsCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ9C00L4g0L7QutC+0L3Rh9Cw0L3QuNGPINC80LXRgNC+0L/RgNC40Y/RgtC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAn0L/QvtGB0LvQtSDQvtC60L7QvdGH0LDQvdC40Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAn0J3QtdCy0L7Qt9C80L7QttC90L4g0YPQtNCw0LvQuNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDQt9Cw0Y/QstC60LghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ9Cd0LXRgiDQv9GA0LDQsiDQtNC+0YHRgtGD0L/QsCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn0J3QtdGCINC/0YDQsNCyINC00L7RgdGC0YPQv9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ9Ch0LjRgdGC0LXQvNC1INC90LUg0YPQtNCw0LvQvtGB0Ywg0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNGC0Ywg0YTQsNC50LshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDQv9GA0L7QstC10YDRjNGC0LUg0LbRg9GA0L3QsNC7INC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L7QuSDQuNC90YTQvtGA0LzQsNGG0LjQuC4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRMaXN0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrJWQgbW9yZSd9ID0gJyslZCDQtdGJ0LUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICfQntGC0YHRg9GC0YHRgtCy0YPQtdGCICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn0KLQsNC60L7QuSDQv9C+0LvRjNC30L7QstCw0YLQtdC70Ywg0L3QtSDRgdGD0YnQtdGB0YLQstGD0LXRgiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICfQndC10LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YvQuSDQutCw0LvQtdC90LTQsNGA0YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgVVJMISd9ID0gJ9Cd0LXQstC10YDQvdGL0LkgVVJMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQn9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwINC/0YDQuCDRjdC60YHQv9C+0YDRgtC1INC60LDQu9C10L3QtNCw0YDRjyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICfQmNC90YLQtdGA0LLQsNC7INC+0LHQvdC+0LLQu9C10L3QuNGPICjQsiDQvNC40L3Rg9GC0LDRhSknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ9Ch0YLRgNCw0L3QuNGG0LAg0L7QsdC30L7RgNCwINCa0LDQu9C10L3QtNCw0YDRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb25zJ30gPSAn0KPQstC10LTQvtC80LvQtdC90LjRjyDQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGP0YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0LvRjCDRg9C/0YDQsNCy0LvQtdC90LjRjyDRgdC+0LHRi9GC0LjRj9C80Lgg0JrQsNC70LXQvdC00LDRgNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC60L7RgtC+0YDRi9C5INC/0L7QtNCz0L7RgtCw0LLQu9C40LLQsNC10YIg0YPQstC10LTQvtC80LvQtdC90LjRjyDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ9Cc0L7QtNGD0LvRjCDRg9C/0YDQsNCy0LvQtdC90LjRjyDRgdC+0LHRi9GC0LjRj9C80Lgg0JrQsNC70LXQvdC00LDRgNGPINC80LXRgNC+0L/RgNC40Y/RgtC40LksINC60L7RgtC+0YDRi9C5INC+0LHQvdC+0LLQu9GP0LXRgiDQt9Cw0Y/QstC60Lgg0YEg0LTQsNC90L3Ri9C80Lgg0LjQtyDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INC30LDRj9Cy0LrQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAn0K3QutGA0LDQvSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINCc0LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQodC/0LjRgdC+0Log0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ9Ch0L/QuNGB0L7QuiDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3RpZmljYXRpb25zJ30gPSAn0KPQstC10LTQvtC80LvQtdC90LjRjyDQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGP0YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAn0JzQtdGA0L7Qv9GA0LjRj9GC0LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBtYW5hZ2Ugc2NyZWVuLid9ID0gJ9Ct0LrRgNCw0L0g0KPQv9GA0LDQstC70LXQvdC40LUg0LrQsNC70LXQvdC00LDRgNGP0LzQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAn0JLRi9Cx0LXRgNC40YLQtSDQtNC70Y8g0LrQsNC60L7Qs9C+INGC0LjQv9CwINC40LfQvNC10L3QtdC90LjQuSDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INCy0Ysg0LbQtdC70LDQtdGC0LUg0L/QvtC70YPRh9Cw0YLRjCDRg9Cy0LXQtNC+0LzQu9C10L3QuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAn0KHQvtC30LTQsNGC0Ywg0L3QvtCy0L7QtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC1INC60LDQu9C10L3QtNCw0YDRjyDRgdCy0Y/Qt9Cw0L3QvdC+0LUg0YEg0Y3RgtC+0Lkg0LfQsNGP0LLQutC+0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQodC+0LfQtNCw0L3QuNC1INC4INGD0L/RgNCw0LLQu9C10L3QuNC1INGD0LLQtdC00L7QvNC70LXQvdC40Y/QvNC4INC/0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRj9C8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ9Ch0L7Qt9C00LDRgtGMINC90L7QstC+0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICfQl9Cw0LTQsNC50YLQtSwg0LrQsNC60LjQtSDQutC+0LvQvtC90LrQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDQsiDRgdCy0Y/Qt9Cw0L3QvdC+0Lwg0LLQuNC00LbQtdGC0LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzogMCA9INCe0YLQutC70Y7Rh9C10L3QviwgMSA9INCU0LAsIDIgPSDQktC60LvRjtGH0LXQvdCwINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LjQutC+0L3QutGDINGB0L4g0YHRgdGL0LvQutC+0Lkg0L3QsCDRgdGC0YDQsNC90LjRhtGDINGC0LXQutGD0YnQtdCz0L4g0LzQtdGB0YLQvtC/0L7Qu9C+0LbQtdC90LjRjyDQsiBHb29nbGUgTWFwINC90LAg0Y3QutGA0LDQvdC1INGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLQuNC/0Ysg0YHQvtCx0YvRgtC40LksINC60L7RgtC+0YDRi9C1INCx0YPQtNGD0YIg0YPQv9GA0LDQstC70Y/RgtGM0YHRjyAg0YEg0L/QvtC80L7RidGM0Y4gQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQv9C10YDQtdGH0LXQvdGMINCw0YLRgNC40LHRg9GC0L7Qsiwg0LrQvtGC0L7RgNGL0LUg0LzQvtCz0YPRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YzRgdGPINC/0YDQuCDQv9C+0LjRgdC60LUg0LfQsNGP0LLQvtC6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LzQvtC00YPQu9GMINC+0LHRgNCw0LHQvtGC0LrQuCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQt9Cw0Y/QstC60Lgg0LTQu9GPINC00LjQvdCw0LzQuNGH0LXRgdC60LjRhSDQv9C+0LvQtdC5INGC0LjQv9CwINC00LDRgtCwL9Cy0YDQtdC80Y8gLyBkYXRlIHRpbWUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LzQvtC00YPQu9GMINC+0LHRgNCw0LHQvtGC0LrQuCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQt9Cw0Y/QstC60Lgg0L/QviB0aWNrZXQgZXNjYWxhdGlvbiB0aW1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINC80L7QtNGD0LvRjCDQvtCx0YDQsNCx0L7RgtC60Lgg0LTQu9GPINC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGP0LLQutC4INC/0L4gdGlja2V0IHBlbmRpbmcgdGltZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ9CX0LDQtNCw0LXRgiDQv9C70LDQs9C40L0g0L7QsdGA0LDQsdC+0YLQutC4INC30LDRj9Cy0L7QuiDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQutCw0LvQtdC90LTQsNGA0Y8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAn0JLRgNC10LzRjyDQtNC+INC/0LXRgNCy0L7Qs9C+INC+0YLQstC10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICfQrdC60YDQsNC9INC40LzQv9C+0YDRgtCwINC80LXRgNC+0L/RgNC40Y/RgtC40LkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ9Ch0LLRj9C30YvQstCw0LXRgiDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINGBINC30LDRj9Cy0LrQsNC80Lgg0YHQstGP0LfRjNGOINGC0LjQv9CwICJOb3JtYWwv0J7QsdGL0YfQvdCw0Y8iLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0KHQv9C40YHQvtC6INCy0YHQtdGFINGB0L7QsdGL0YLQuNC5LCDQtNC70Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSwg0L7RgtC+0LHRgNCw0LbQsNC10LzRi9GFINCyINC40L3RgtC10YDRhNC10LnRgdC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBjYWxlbmRhciBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAn0KHQv9C40YHQvtC6INCy0YHQtdGFINGB0L7QsdGL0YLQuNC5INC60LDQu9C10L3QtNCw0YDRjywg0L7RgtC+0LHRgNCw0LbQsNC10LzRi9GFINCyINC40L3RgtC10YDRhNC10LnRgdC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ9Ch0L/QuNGB0L7QuiDRhtCy0LXRgtC+0LIg0LIg0YjQtdGB0YLQvdCw0LTRhtCw0YLQtdGA0LjRh9C90L7QvCBSR0Ig0LTQvtGB0YLRg9C/0L3Ri9GFINC00LvRjyDQstGL0LHQvtGA0LAg0L/RgNC4INGB0L7Qt9C00LDQvdC40Lgg0LrQsNC70LXQvdC00LDRgNGPLiDQo9Cx0LXQtNC40YLQtdGB0Ywg0L/RgNC4INCy0YvQsdC+0YDQtSwg0YfRgtC+INGG0LLQtdGCINGE0L7QvdCwINC00L7RgdGC0LDRgtC+0YfQvdC+INGC0LXQvNC90YvQuSwg0YfRgtC+0LHRiyDQsdC10LvRi9C5INGC0LXQutGB0YIg0LHRi9C7INC90LAg0L3QtdC8INCy0LjQtNC10L0v0YfQuNGC0LDQtdC8Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICfQo9C/0YDQsNCy0LvRj9GC0Ywg0YDQsNC30LvQuNGH0L3Ri9C80Lgg0LrQsNC70LXQvdC00LDRgNGP0LzQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBpbiBvdmVydmlldyBzY3JlZW5zLiBQbGVhc2Ugbm90ZSB0aGF0IGxhcmdlIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGNhbiBoYXZlIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHlvdXIgc2VydmVyIGJ5IG1ha2luZyB0b28gbXVjaCBzaW11bHRhbmVvdXMgY2FsbHMuJ30gPQogICAgICAgICfQnNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0LDQutGC0LjQstC90YvRhSDQutCw0LvQtdC90LTQsNGA0LXQuSDQvdCwINGN0LrRgNCw0L3QsNGFINC+0LHQt9C+0YDQsC4g0J/QvtC80L3QuNGC0LUsINGH0YLQviDQsdC+0LvRjNGI0L7QtSDRh9C40YHQu9C+INCw0LrRgtC40LLQvdGL0YUg0LrQsNC70LXQvdC00LDRgNC10Lkg0LzQvtC20LXRgiDQvtC60LDQt9Cw0YLRjCDQstC70LjRj9C90LjQtSDQvdCwINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLRjCDRgdC10YDQstC10YDQsCwg0LTQtdC70LDRjyDRgdC70LjRiNC60L7QvCDQvNC90L7Qs9C+INC+0LTQvdC+0LLRgNC10LzQtdC90L3Ri9GFINCy0YvQt9C+0LLQvtCyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCINC/0L7QstGC0L7RgNGP0Y7RidC40LXRgdGPINCc0LXRgNC+0L/RgNC40Y/RgtC40Y8g0LHQtdC3INC00LDRgtGLINC+0LrQvtC90YfQsNC90LjRjyDQuNC70Lgg0LrQvtC70LjRh9C10YHRgtCy0LAg0L/QvtCy0YLQvtGA0LXQvdC40LkuINCf0YDQuCDQuNC80L/QvtGA0YLQtSDQvNC+0LbQtdGCINGC0LDQuiDRgdC70YPRh9C40YLRjNGB0Y8sINGH0YLQviBJQ1Mg0YTQsNC50Lsg0YHQvtC00LXRgNC20LjRgiDQv9C+0LTQvtCx0L3Ri9C1INC80LXRgNC+0L/RgNC40Y/RgtC40Y8uINCSINGA0LXQt9GD0LvRjNGC0LDRgtC1INC80L7QttC10YIg0YLQsNC6INGB0LvRg9GH0LjRgtGM0YHRjywg0YfRgtC+INGB0LjRgdGC0LXQvNCwINGB0L7Qt9C00LDRgdGCINCy0YHQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC/0YDQvtGI0LvQvtC8INC4LCDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Qviwg0LTQu9GPINC/0L7RgdC70LXQtNGD0Y7RidC40YUgbiDQvNC10YHRj9GG0LXQsiAoMTIwINC80LXRgdGP0YbQtdCyLzEwINC70LXRgiDQv9C+INGD0LzQvtC70YfQsNC90LjRjikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAn0J7QsdC30L7RgCDQstGB0LXRhSDQvNC10YDQvtC/0YDQuNGP0YLQuNC5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICfQktGA0LXQvNGPINCyINC+0LbQuNC00LDQvdC40LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ9Cf0L7QuNGB0LrQvtCy0YvQuSDQv9C70LDQs9C40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfQn9C+0LjRgdC60L7QstGL0Lkg0L/Qu9Cw0LPQuNC9INC00LvRjyDQsNCy0YLQvtC30LDQstC10YDRiNC10L3QuNGPLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfQntCx0YnQtdC00L7RgdGC0YPQv9C90YvQuSDQutCw0LvQtdC90LTQsNGA0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ9Ce0LHRidC10LTQvtGB0YLRg9C/0L3Ri9C5INC60LDQu9C10L3QtNCw0YDRjC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfQntCx0LfQvtGAINGA0LXRgdGD0YDRgdC+0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn0J7QsdC30L7RgCDRgNC10YHRg9GA0YHQvtCyIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICfQntGC0L7QsdGA0LDQttCw0LXRgiDRgdGB0YvQu9C60YMv0L/Rg9C90LrRgiDQvNC10L3RjiDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINC60LDQu9C10L3QtNCw0YDRjywg0YHQstGP0LfQsNC90L3QvtCz0L4g0YEg0LfQsNGP0LLQutC+0Lkg0L3QtdC/0L7RgdGA0LXQtNGB0YLQstC10L3QvdC+INC40Lcg0L/QvtC00YDQvtCx0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwINC30LDRj9Cy0LrQuC9UaWNrZXRab29tINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L4sINC80L7QttC90L4g0L7Qs9GA0LDQvdC40YfQuNGC0Ywg0LTQvtGB0YLRg9C/INC6INGN0YLQvtC80YMg0L/Rg9C90LrRgtGDINC80LXQvdGOLCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtdC8INC60LvRjtGH0LAgIkdyb3VwIiwg0LPQtNC1INCyINGB0L7QtNC10YDQttCw0L3QuNC4INGD0LrQsNC30YvQstCw0LXRgtGB0Y8g0L/QtdGA0LXRh9C10L3RjCDQs9GA0YPQv9C/LCDQutC+0YLQvtGA0YvQvCDRjdGC0LAg0LrQvdC+0L/QutCwINCx0YPQtNC10YIg0LTQvtGB0YLRg9C/0L3QsCAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiDQlNC70Y8g0L7RgNCz0LDQvdC40LfQsNGG0LjQuCDQv9GD0L3QutGC0L7QsiDQvNC10L3RjiDQsiDQs9GA0YPQv9C/0Ysv0LrQu9Cw0YHRgtC10YDRiyDQuNGB0L/QvtC70YzQt9GD0LnRgtC1INCyINC60LDRh9C10YHRgtCy0LUg0LrQu9GO0YfQsCAiQ2x1c3Rlck5hbWUiINC4INCyINGB0L7QtNC10YDQttCw0L3QuNC4INGD0LrQsNC20LjRgtC1INGC0L4g0LjQvNGPLCDQutC+0YLQvtGA0L7QtSDQttC10LvQsNC10YLQtSDRg9Cy0LjQtNC10YLRjCDQsiDRgdGC0YDQvtC60LUg0LzQtdC90Y4uINCY0YHQv9C+0LvRjNC30YPQudGC0LUgIkNsdXN0ZXJQcmlvcml0eSIg0LTQu9GPINC90LDRgdGC0YDQvtC50LrQuCDQv9C+0YDRj9C00LrQsCDQvtGC0L7QsdGA0LDQttC10L3QuNGPINCz0YDRg9C/0L8v0LrQu9Cw0YHRgtC10YDQvtCyINCyINC80LXQvdGOLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAn0JLRgNC10LzRjyDRgNC10YjQtdC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ9CS0YvQsdC+0YAg0YHQv9C+0YHQvtCx0LAg0L7RgtC/0YDQsNCy0LrQuCDQtNC70Y8g0YPQstC10LTQvtC80LvQtdC90LjQuSDQv9C+INC80LXRgNC+0L/RgNC40Y/RgtC40Y/QvC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJpZ2dlcnMgYWRkIG9yIHVwZGF0ZSBvZiBhdXRvbWF0aWMgY2FsZW5kYXIgYXBwb2ludG1lbnRzIGJhc2VkIG9uIGNlcnRhaW4gdGlja2V0IHRpbWVzLid9ID0KICAgICAgICAn0J/QtdGA0LXQutC70Y7Rh9Cw0LXRgiDQtNC+0LHQsNCy0LjRgtGMINC40LvQuCDQuNC30LzQtdC90LjRgtGMINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LUg0YHQvtC30LTQsNC90LjQtSDQvNC10YDQvtC/0YDQuNGP0YLQuNC5INC60LDQu9C10L3QtNCw0YDRjywg0L7RgdC90L7QstCw0L3QvdC+0LUg0L3QsCDQvtC/0YDQtdC00LXQu9C10L3QvdGL0YUg0LLRgNC10LzQtdC90J3Ri9GFINC/0LDRgNCw0LzQtdGC0YDQsNGFINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ9CS0YDQtdC80Y8g0LjQt9C80LXQvdC10L3QuNGPINC30LDRj9Cy0LrQuCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfQ3lybF9PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQU5vdGlmaWNhdGlvbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uJ30gPSAn0J7QsdCw0LLQtdGI0YLQtdGa0LUg0L/QvtC00YHQtdGC0L3QuNC60LAg0L4g0YLQtdGA0LzQuNC90YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ9CU0L7QsdC40ZvQtdGC0LUg0L7QsdCw0LLQtdGI0YLQtdGa0LUg0YHQstCw0LrQuCDQv9GD0YIg0LrQsNC0YSDQtNC+0ZLQtSDQtNC+INCy0YDQtdC80LXQvdCwINC/0L7QtNGB0LXRgtC90LjQutCwINC30LAg0L3QtdC60Lgg0L7QtCDQstCw0YjQuNGFINGC0LXRgNC80LjQvdCwLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLRmdCw0ZrQtSDQvtCx0LDQstC10YjRgtC10ZrQuNC80LAg0L4g0YLQtdGA0LzQuNC90LjQvNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAn0J7QstC00LUg0LzQvtC20LXRgtC1INC/0L7RgdC70LDRgtC4INC60L7QvdGE0LjQs9GD0YDQsNGG0LjQvtC90YMg0LTQsNGC0L7RgtC10LrRgyDQt9CwINGD0LLQvtC3INC+0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDINGDINCy0LDRiCDRgdC40YHRgtC10LwuINCU0LDRgtC+0YLQtdC60LAg0LzQvtGA0LAg0LHQuNGC0Lgg0YMg0LjRgdGC0L7QvCAueW1sINGE0L7RgNC80LDRgtGDINC60L7RmNC4INGY0LUg0LzQvtCz0YPRm9C1INC00L7QsdC40YLQuCDQuNC30LLQvtC30L7QvCDRgyDQtdC60YDQsNC90YMg0YPQv9GA0LDQstGZ0LDRmtCwINC+0LHQsNCy0LXRiNGC0LXRmtC40LzQsCDQviDRgtC10YDQvNC40L3QuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAn0J7QstC00LUg0LzQvtC20LXRgtC1INC40LfQsNCx0YDQsNGC0Lgg0LrQvtGY0Lgg0LTQvtCz0LDRktCw0ZjQuCDRm9C1INC/0L7QutGA0LXQvdGD0YLQuCDQvtCx0LDQstC10YjRgtCw0LLQsNGa0LUuINCU0L7QtNCw0YLQvdC4INGE0LjQu9GC0LXRgCDQt9CwINGC0LXRgNC80LjQvdC1INC80L7QttC1INCx0LjRgtC4INC/0YDQuNC80LXRmtC10L0g0YDQsNC00Lgg0YHQu9Cw0ZrQsCDRgdCw0LzQviDQt9CwINGC0LXRgNC80LjQvdC1INC/0L4g0L7QtNGA0LXRktC10L3QvtC8INC60YDQuNGC0LXRgNC40ZjRg9C80YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ9Ck0LjQu9GC0LXRgCDRgtC10YDQvNC40L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAn0KLQuNC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlJ30gPSAn0KDQtdGB0YPRgNGBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmeSB1c2VyIGp1c3Qgb25jZSBwZXIgZGF5IGFib3V0IGEgc2luZ2xlIGFwcG9pbnRtZW50IHVzaW5nIGEgc2VsZWN0ZWQgdHJhbnNwb3J0Lid9ID0KICAgICAgICAn0J7QsdCw0LLQtdGB0YLQuCDQutC+0YDQuNGB0L3QuNC60LAg0YHQsNC80L4g0ZjQtdC00L3QvtC8INC00L3QtdCy0L3QviDQviDQv9C+0ZjQtdC00LjQvdCw0YfQvdC+0Lwg0YLQtdGA0LzQuNC90YMg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0LjQt9Cw0LHRgNCw0L3QvtCzINGC0YDQsNC90YHQv9C+0YDRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtC1INGb0LUg0LHQuNGC0Lgg0L/QvtGB0LvQsNGC0L4g0L7Qv9C10YDQsNGC0LXRgNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAn0JTQsCDQstC40LTQuNGC0LUg0L/RgNCy0LjRhSAyMCDQutCw0YDQsNC60YLQtdGA0LAg0L3QsNGB0LvQvtCy0LAg0YLQtdGA0LzQuNC90LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAn0JTQsCDQstC40LTQuNGC0LUg0LDRgtGA0LjQsdGD0YLQtSDRgtC10YDQvNC40L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJ9CU0LAg0LLQuNC00LjRgtC1INCw0YLRgNC40LHRg9GC0LUg0LrQsNC70LXQvdC00LDRgNCwJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ9Cf0YDQtdCz0LvQtdC0INC00L3QtdCy0L3QvtCzINGA0LXQtNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfQo9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LTQsNGYINGC0LXRgNC80LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ9CR0L7RmNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn0JTQsNGC0YPQvCDQutGA0LDRmNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ9Cf0L7QvdCw0LLRmdCw0ZrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfQndC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9INC90LjRmNC10LTQsNC9INC60LDQu9C10L3QtNCw0YAuINCc0L7Qu9C40LzQviDQv9GA0LLQviDQtNC+0LTQsNGY0YLQtSDQutCw0LvQtdC90LTQsNGAINC60L7RgNC40YjRm9C10ZrQtdC8INC10LrRgNCw0L3QsCDQo9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICfQotC10YDQvNC40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ9Ce0LLQsNGYINGC0LXRgNC80LjQvSDRgdC1INC/0L7QvdCw0LLRmdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAn0JTQsCDQu9C4INC20LXQu9C40YLQtSDQtNCwINC40LfQvNC10L3QuCDRgdCw0LzQviDQvtCy0L4g0LjQu9C4INGB0LLQsCDQv9C+0L3QsNCy0ZnQsNGa0LA/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBvY2N1cnJlbmNlcyd9ID0gJ9Ch0LLQsCDQv9C+0L3QsNCy0ZnQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfQodCw0LzQviDQvtCy0L4g0L/QvtC90LDQstGZ0LDRmtC1JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE1hbmFnZW1lbnQnfSA9ICfQo9C/0YDQsNCy0ZnQsNGa0LUg0LrQsNC70LXQvdC00LDRgNC40LzQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ9Cf0YDQtdCz0LvQtdC0INC60LDQu9C10L3QtNCw0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn0JTQvtC00LDRmCDQvdC+0LLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ9CU0L7QtNCw0Zgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn0KPQstC10LfQuCDRgtC10YDQvNC40L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICfQo9Cy0L7QtyDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICfQntCy0LTQtSDQvNC+0LbQtdGC0LUg0YPRh9C40YLQsNGC0Lgg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC+0L3RgyDQtNCw0YLQvtGC0LXQutGDINC30LAg0YPQstC+0Lcg0LrQsNC70LXQvdC00LDRgNCwINGDINCy0LDRiCDRgdC40YHRgtC10LwuINCU0LDRgtC+0YLQtdC60LAg0LzQvtGA0LAg0LHQuNGC0Lgg0YMgLnltbCDRhNC+0YDQvNCw0YLRgyDQuNC30LLQtdC30LXQvdCwINC+0LQg0YHRgtGA0LDQvdC1INC80L7QtNGD0LvQsCDQt9CwINGD0L/RgNCw0LLRmdCw0ZrQtSDQutCw0LvQtdC90LTQsNGA0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ9Cj0YfQuNGC0LDRmCDQutC+0L3RhNC40LPRg9GA0LDRhtC40ZjRgyDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn0KPQstC10LfQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn0KTQuNC70YLQtdGAINC30LAg0LrQsNC70LXQvdC00LDRgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ9CjINC30LDQstC40YHQvdC+0YHRgtC4INC+0LQg0L/QvtGZ0LAg0LPRgNGD0L/QtSwg0YHQuNGB0YLQtdC8INGb0LUg0LTQvtC30LLQvtC70LjRgtC4INC/0YDQuNGB0YLRg9C/INC60LDQu9C10L3QtNCw0YDRgyDQvtC/0LXRgNCw0YLQtdGA0LjQvNCwINC/0YDQtdC80LAg0ZrQuNGF0L7QstC+0Lwg0L3QuNCy0L7RgyDQv9GA0LjRgdGC0YPQv9CwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ1JPOiDQvtC/0LXRgNCw0YLQtdGA0Lgg0LzQvtCz0YMg0L/RgNC10LPQu9C10LTQsNGC0Lgg0Lgg0LXQutGB0L/QvtGA0YLQvtCy0LDRgtC4INGB0LLQtSDRgtC10YDQvNC40L3QtSDRgyDQutCw0LvQtdC90LTQsNGA0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vdmUgaW50bzogdXNlcnMgY2FuIG1vZGlmeSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uLid9ID0KICAgICAgICAn0J/RgNC10LzQtdGB0YLQuCDRgzog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINC80L7QtNC40YTQuNC60L7QstCw0YLQuCDRgtC10YDQvNC40L3QtSDRgyDQutCw0LvQtdC90LTQsNGA0YMsINCw0LvQuCDQsdC10Lcg0L/RgNC+0LzQtdC90LUg0LrQvtC8INC60LDQu9C10L3QtNCw0YDRgyDQv9GA0LjQv9Cw0LTQsNGY0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZTogdXNlcnMgY2FuIGNyZWF0ZSBhbmQgZGVsZXRlIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICfQmtGA0LXQuNGA0LDRmtC1OiDQvtC/0LXRgNCw0YLQtdGA0Lgg0LzQvtCz0YMg0LrRgNC10LjRgNCw0YLQuCDQuCDQsdGA0LjRgdCw0YLQuCDRgtC10YDQvNC40L3QtSDRgyDQutCw0LvQtdC90LTQsNGA0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICdSVzog0L7Qv9C10YDQsNGC0LXRgNC4INC80L7Qs9GDINCw0LTQvNC40L3QuNGB0YLRgNC40YDQsNGC0Lgg0Lgg0YHQsNC8INC60LDQu9C10L3QtNCw0YAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VSTCd9ID0gJ9CQ0LTRgNC10YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgY2FsZW5kYXInfSA9ICfQmNC30LLQtdC30Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ9Cf0YDQtdGD0LfQvNC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn0JjRgdC60L7Qv9C40YDQsNGYINGY0LDQstC90YMg0LDQtNGA0LXRgdGDINC60LDQu9C10L3QtNCw0YDQsCAoVVJMKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAn0J3QsNC30LjQsiDQutCw0LvQtdC90LTQsNGA0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn0JrQsNC70LXQvdC00LDRgCDRgdCwINC40YHRgtC40Lwg0L3QsNC30LjQstC+0Lwg0LLQtdGbINC/0L7RgdGC0L7RmNC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAn0JPRgNGD0L/QsCDQv9GA0LjRgdGC0YPQv9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICfQotC10YDQvNC40L3QuCDRgtC40LrQtdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ9Cf0YDQsNCy0LjQu9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJ9Ca0L7RgNC40YHRgtC10ZvQuCDQvtC/0YbQuNGY0LUg0LjRgdC/0L7QtCDQuNC30LDQsdC10YDQuNGC0LUg0LfQsCDQutC+0ZjQtSDRgtC40LrQtdGC0LUg0ZvQtSDRgtC10YDQvNC40L3QuCDQsdC40YLQuCDQsNGD0YLQvtC80LDRgtGB0LrQuCDQutGA0LXQuNGA0LDQvdC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAn0JzQvtC70LjQvNC+INC00LAg0L7QtNCw0LHQtdGA0LXRgtC1INCy0LDQttC10ZvQuCDRgNC10LQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn0JDRgtGA0LjQsdGD0YLQuCDQv9GA0LXRgtGA0LDQs9C1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQuNGC0LUg0L/RgNCw0LLQuNC70LAg0LfQsCDQutGA0LXQuNGA0LDRmtC1INCw0YPRgtC+0LzQsNGC0YHQutC40YUg0YLQtdGA0LzQuNC90LAg0YMg0L7QstC+0Lwg0LrQsNC70LXQvdC00LDRgNGDINC90LAg0L7RgdC90L7QstGDINGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfQlNC+0LTQsNGYINC/0YDQsNCy0LjQu9C+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICfQktC40YjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn0JzQsNGa0LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAn0JTQvtC00LDRmCDQvdC+0LLQuCDRgtC10YDQvNC40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAn0JrQsNC70LXQvdC00LDRgNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICfQn9GA0LXQstC40YjQtSDQsNC60YLQuNCy0L3QuNGFINC60LDQu9C10L3QtNCw0YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICfQmNC70Lgg0L/RgNCy0L4g0LjRgdC60ZnRg9GH0LjRgtC1INC/0YDQuNC60LDQtyDQvdC10LrQvtCzINC60LDQu9C10L3QtNCw0YDQsCDQuNC70Lgg0L/QvtCy0LXRm9Cw0ZjRgtC1INC70LjQvNC40YIg0YMg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGY0LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICfQodC10LTQvNC40YbQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ9Cc0LXRgdC10YfQvdCwINC+0YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAn0KHQtdC00LzQuNGH0L3QsCDQvtGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgRGF5J30gPSAn0JTQvdC10LLQvdCwINC+0YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn0KHQutC+0YfQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAn0J/QvtC90LjRiNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ9Cf0YDQuNC60LDQttC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAn0J7RgdC90L7QstC90LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfQlNCw0YLRg9C8L9Cy0YDQtdC80LUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ9Cc0L7Qu9C40LzQviDQv9C+0YHRgtCw0LLQuNGC0LUg0L7QstCw0Zgg0LTQsNGC0YPQvCDQv9GA0LUg0LrRgNCw0ZjQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAn0JzQvtC70LjQvNC+INC/0L7RgdGC0LDQstC40YLQtSDQvtCy0LDRmCDQtNCw0YLRg9C8INC/0L7RgdC70LUg0L/QvtGH0LXRgtC60LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgYW4gb2NjdXJyZW5jZSBvZiBhIHJlcGVhdGluZyBhcHBvaW50bWVudC4nfSA9ICfQntCy0L4g0ZjQtSDRgtC10YDQvNC40L0g0LrQvtGY0Lgg0YHQtSDQv9C+0L3QsNCy0ZnQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfQmtC70LjQutC90LjRgtC1INC+0LLQtNC1INC30LAg0L/RgNC10LPQu9C10LQg0LzQsNGC0LjRh9C90L7QsyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAn0JrQu9C40LrQvdC40YLQtSDQvtCy0LTQtSDQt9CwINC40LfQvNC10L3RgyDQvNCw0YLQuNGH0L3QvtCzINGC0LXRgNC80LjQvdCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcmVxdWVuY3knfSA9ICfQo9GH0LXRgdGC0LDQu9C+0YHRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSd9ID0gJ9Ch0LLQsNC60L7QsyjQtSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVsYXRpdmUgcG9pbnQgb2YgdGltZSd9ID0gJ9Cg0LXQu9Cw0YLQuNCy0L3QviDQstGA0LXQvNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nfSA9CiAgICAgICAgJ9CU0LAg0LvQuCDRgdGC0LUg0YHQuNCz0YPRgNC90Lgg0LTQsCDQttC10LvQuNGC0LUg0LTQsCDQuNC30LHRgNC40YjQtdGC0LUg0L7QstCw0Zgg0YLQtdGA0LzQuNC9PyDQntCy0YMg0L7Qv9C10YDQsNGG0LjRmNGDINC90LjRmNC1INC80L7Qs9GD0ZvQtSDQvtC/0L7Qt9Cy0LDRgtC4Lic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEltcG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgSW1wb3J0J30gPSAn0KPQstC+0Lcg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICfQn9C+0YHQu9Cw0YLQuCDRhNCw0ZjQuyDQvNC+0YDQsCDQsdC40YLQuCDRgyDQuNGB0L/RgNCw0LLQvdC+0LwgaUNhbCDRhNC+0YDQvNCw0YLRgyAoLmljcykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ9Cj0LrQvtC70LjQutC+INC20LXRmdC10L3QuCDQutCw0LvQtdC90LTQsNGAINC90LjRmNC1INC40LfQu9C40YHRgtCw0L0sINC/0YDQvtCy0LXRgNC40YLQtSDQtNCwINC70Lgg0LjQvNCw0YLQtSDQvdC40LLQviDQv9GA0LjRgdGC0YPQv9CwIFwn0LrRgNC10LjRgNCw0ZrQtVwnINC30LAg0LPRgNGD0L/RgyDQutCw0LvQtdC90LTQsNGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSBleGlzdGluZyBhcHBvaW50bWVudHM/J30gPSAn0J7RgdCy0LXQttC4INC/0L7RgdGC0L7RmNC10ZvQtSDRgtC10YDQvNC40L3QtT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICfQodCy0Lgg0L/QvtGB0YLQvtGY0LXRm9C4INGC0LXRgNC80LjQvdC4INGDINC60LDQu9C10L3QtNCw0YDRgyDRgdCwINC40YHRgtC40LwgVW5pcXVlSUQg0L/QvtGZ0LXQvCDRm9C1INCx0LjRgtC4INC/0YDQtdCx0YDQuNGB0LDQvdC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICfQn9C+0YjQsNGZ0Lgg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn0KPQstC10LfQuCDRgtC10YDQvNC40L3QtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICfQndC+0LLQuCDRgtC10YDQvNC40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29vbid9ID0gJ9Cj0YHQutC+0YDQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1INC00LDQvdCwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtC1INGB0LAg0L7QstC40Lwg0L3QsNC30LjQstC+0Lwg0LLQtdGbINC/0L7RgdGC0L7RmNC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAn0J7Qv9C10YDQsNGC0LXRgCAo0YDQtdGB0YPRgNGBKSwg0LrQvtGY0Lgg0ZjQtSDQuNC30LDQsdGA0LDQvSDRgyDRgtC10YDQvNC40L3Rgyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQodCy0Lgg0L7Qv9C10YDQsNGC0LXRgNC4INGB0LAgKNC90LDRmNC80LDRmtC1KSDQtNC+0LfQstC+0LvQvtC8INC/0YDQtdCz0LvQtdC00LAg0YLQtdGA0LzQuNC90LAgKNC60LDQu9C10L3QtNCw0YDQsCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFnZW50cyB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICfQodCy0Lgg0L7Qv9C10YDQsNGC0LXRgNC4INGB0LAg0LTQvtC30LLQvtC70L7QvCDQv9C40YHQsNGa0LAg0YMg0YLQtdGA0LzQuNC90YMgKNC60LDQu9C10L3QtNCw0YDRgyknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZS5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gY3JlYXRlIENhbGVuZGFyISd9ID0gJ9Ch0LjRgdGC0LXQvCDQvdC40ZjQtSDRg9GB0L/QtdC+INC00LAg0LrRgNC10LjRgNCwINC60LDQu9C10L3QtNCw0YAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn0J3QtdC80LAgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAn0J3QtdC80LDRgtC1INC/0YDQuNGB0YLRg9C/INC+0LLQvtC8INC60LDQu9C10L3QtNCw0YDRgyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ9CY0LfQvNC10L3QuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDQuNC30LzQtdC90LUg0LrQsNC70LXQvdC00LDRgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICfQo9GH0LjRgtCw0LLQsNGa0LUg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGY0LUg0LrQsNC70LXQvdC00LDRgNCwINC90LjRmNC1INCx0LjQu9C+INC80L7Qs9GD0ZvQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAn0JzQvtC70LjQvNC+INCy0LDRgSDQtNCwINC/0YDQvtCy0LXRgNC40YLQtSDQtNCwINC70Lgg0ZjQtSDQstCw0Ygg0YTQsNGY0Lsg0LjRgdC/0YDQsNCy0LDQvS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAn0J3QuNGY0LUg0LzQvtCz0YPRmyDRg9Cy0L7QtyDQutCw0LvQtdC90LTQsNGA0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0ZjQtSDRg9Cy0LXQt9C10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICfQn9C+0YLRgNC10LHQsNC9INCY0JQg0LrQsNC70LXQvdC00LDRgNCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ9Cd0LUg0LzQvtCz0YMg0L/RgNC40LHQsNCy0LjRgtC4INC/0L7QtNCw0YLQutC1INC30LAg0LTQsNGC0LggQ2FsZW5kYXJJRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAn0KPRgdC/0LXRiNC90L4g0YPQstC10LfQtdC90L4gJXMg0YLQtdGA0LzQuNC9KNCwKSDRgyDQutCw0LvQtdC90LTQsNGAICVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrNSBtaW51dGVzJ30gPSAnKzUg0LzQuNC90YPRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1INC80LjQvdGD0YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMCDQvNC40L3Rg9GC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzEgaG91cid9ID0gJysxINGB0LDRgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhcHBvaW50bWVudHMnfSA9ICfQodCy0Lgg0YLQtdGA0LzQuNC90LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAn0KLQtdGA0LzQuNC90Lgg0LTQvtC00LXRmdC10L3QuCDQvNC10L3QuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAn0J/RgNC40LrQsNC3INGB0LDQvNC+INGC0LXRgNC80LjQvdCwINC00L7QtNC10ZnQtdC90LjRhSDQstCw0LzQsCEg0JjQt9C80LXQvdC40YLQtSDQv9C+0LTQtdGI0LDQstCw0ZrQsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICfQotC10YDQvNC40L0g0L3QuNGY0LUg0L/RgNC+0L3QsNGS0LXQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICfQndC40LrQsNC00LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAn0KHQstCw0LrQuCDQtNCw0L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ9Ch0LLQsNC60LUg0YHQtdC00LzQuNGG0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgTW9udGgnfSA9ICfQodCy0LDQutC+0LMg0LzQtdGB0LXRhtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFllYXInfSA9ICfQodCy0LDQutC1INCz0L7QtNC40L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICfQn9GA0LjQu9Cw0LPQvtGS0LXQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAn0JTQvdC10LLQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ9Ch0LXQtNC80LjRh9C90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ9Cc0LXRgdC10YfQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ9CT0L7QtNC40YjRmtC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn0YHQstCw0LrQvtCzKNC1KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ9GD0LrRg9C/0L3QviAlcyDQv9GD0YIo0LApJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ9C00L4gLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAuLi4gdGltZShzKSd9ID0gJ9GD0LrRg9C/0L3QviAuLi4g0L/Rg9GCKNCwKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ9C00L4gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAn0JHQtdC3INC+0LHQsNCy0LXRiNGC0LXRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclcyDQvNC40L3Rg9GCKNCwKSDQv9GA0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyDRgdCw0YIo0LApINC/0YDQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMg0LTQsNC9KNCwKSDQv9GA0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyDQvdC10LTQtdGZ0LAg0L/RgNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAn0L/RgNC1INC90LXQs9C+INGI0YLQviDRgtC10YDQvNC40L0g0LfQsNC/0L7Rh9C90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICfQv9C+0YjRgtC+INGC0LXRgNC80LjQvSDQt9Cw0L/QvtGH0L3QtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICfQv9GA0LUg0L3QtdCz0L4g0YjRgtC+INGB0LUg0YLQtdGA0LzQuNC9INC30LDQstGA0YjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICfQv9C+0YjRgtC+INGB0LUg0YLQtdGA0LzQuNC9INC30LDQstGA0YjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ9CR0LXQtyDQtNC+0LfQstC+0LvQtSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAn0J3QuNGY0LUg0LzQvtCz0YPRm9C1INC+0LHRgNC40YHQsNGC0Lgg0YLQtdGA0LzQuNC9INGC0LjQutC10YLQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAn0JHQtdC3INC00L7Qt9Cy0L7Qu9C1ISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICfQkdC10Lcg0LTQvtC30LLQvtC70LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAn0KHQuNGB0YLQtdC8INC90LjRmNC1INGD0YHQv9C10L4g0LTQsCDRg9Cy0LXQt9C1INGE0LDRmNC7ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfQnNC+0LvQuNC80L4g0L/RgNC+0LLQtdGA0LjRgtC1INC70L7QsyDQt9CwINCy0LjRiNC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LAuJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQg0LLQuNGI0LUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL1B1YmxpY0NhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyAlcyEnfSA9ICfQkdC10LcgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfQndC10L/QvtC30L3QsNGCINC60L7RgNC40YHQvdC40LohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAn0J3QtdC40YHQv9GA0LDQstCw0L0g0LrQsNC70LXQvdC00LDRgCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn0J3QtdC40YHQv9GA0LDQstC90LAg0LDQtNGA0LXRgdCwISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQk9GA0LXRiNC60LAg0L/RgNC40LvQuNC60L7QvCDQtdC60YHQv9C+0YDRgtC+0LLQsNGa0LAg0LrQsNC70LXQvdC00LDRgNCwISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ9Ce0YHQstC10LbQuCAo0LzQuNC90YPRgtCwKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINC/0YDQtdCz0LvQtdC0INC60LDQu9C10L3QtNCw0YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9ucyd9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LrQsNC70LXQvdC00LDRgNCwINC30LAg0L/RgNC40L/RgNC10LzRgyDQvtCx0LDQstC10YjRgtC10ZrQsCDQviDRgtC10YDQvNC40L3QuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC00L7Qs9Cw0ZLQsNGY0LAg0LrQsNC70LXQvdC00LDRgNCwINC30LAg0L7RgdCy0LXQttCw0LLQsNGa0LUg0YLQuNC60LXRgtCwINC/0L7QtNCw0YbQuNC80LAg0LjQtyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINC40LfQvNC10L3RgyDQutCw0LvQtdC90LTQsNGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICfQm9C40YHRgtCwINGC0LXRgNC80LjQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAn0JvQuNGB0YLQsCDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyd9ID0gJ9Ce0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Ci0LXRgNC80LjQvdC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAn0KHRgtGA0LDQvdC40YbQsCDQt9CwINGD0L/RgNCw0LLRmdCw0ZrQtSDQutCw0LvQtdC90LTQsNGA0LjQvNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICfQmNC30LDQsdC10YDQuCDQt9CwINC60LDQutCy0LUg0L/RgNC+0LzQtdC90LUg0YLQtdGA0LzQuNC90LAg0LbQtdC70LjRiCDQtNCwINC/0YDQuNC80LjRiCDQvtCx0LDQstC10YjRgtC10ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ9Ca0YDQtdC40YDQsCDQvdC+0LLQuCDRgtC10YDQvNC40L0g0YMg0LrQsNC70LXQvdC00LDRgNGDINC/0L7QstC10LfQsNC9INGB0LAg0L7QstC40Lwg0YLQuNC60LXRgtC+0LwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQmtGA0LXQuNGA0LDRmtC1INC4INGD0L/RgNCw0LLRmdCw0ZrQtSDQvtCx0LDQstC10YjRgtC10ZrQuNC80LAg0LfQsCDRgtC10YDQvNC40L3QtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQmtGA0LXQuNGA0LAg0L3QvtCy0Lgg0YLQtdGA0LzQuNC9Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0LrQvtGY0LUg0LrQvtC70L7QvdC1INGb0LUg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvdC1INGDINCw0L/Qu9C40LrQsNGC0LjQstC90L7QvCDQtNC+0LTQsNGC0LrRgyDQu9C40L3QutC+0LLQsNC90LjRhSDRgtC10YDQvNC40L3QsCAoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiDQnNC+0LPRg9Gb0LAg0L/QvtC00LXRiNCw0LLQsNGa0LA6IDAgPSDQntC90LXQvNC+0LPRg9Gb0LXQvdC+LCAxID0g0J7QvNC+0LPRg9Gb0LXQvdC+LCAyID0g0J/QvtC00YDQsNC30YPQvNC10LLQsNC90L4g0L7QvNC+0LPRg9Gb0LXQvdC+Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC40LrQvtC90YMg0YHQsCDQu9C40L3QutC+0Lwg0L3QsCBHb29nbGUg0LzQsNC/0YMg0YLRgNC10L3Rg9GC0L3QtSDQu9C+0LrQsNGG0LjRmNC1INGDINC10LrRgNCw0L3RgyDQt9CwINC40LfQvNC10L3RgyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INGC0LjQv9C+0LLQtSDQvtCx0ZjQtdC60YLQsCDQtNC+0LPQsNGS0LDRmNCwINC60L7RmNC4INGb0LUg0LHQuNGC0Lgg0L/RgNC+0YbQtdGB0LjRgNCw0L3QuCDQv9GD0YLQtdC8IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC70LjRgdGC0YMg0L/QsNGA0LDQvNC10YLQsNGA0LAg0LrQvtGY0Lgg0LzQvtCz0YMg0LHQuNGC0Lgg0L/RgNC+0YHQu9C10ZLQtdC90Lgg0YTRg9C90LrRhtC40ZjQuCDQv9GA0LXRgtGA0LDQs9C1INGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAn0JTQtdGE0LjQvdC40YjQtSDQv9C+0LfQsNC00LjQvdGB0LrQuCDQvNC+0LTRg9C7INGC0LXRgNC80LjQvdCwINGC0LjQutC10YLQsCDQt9CwINC00LjQvdCw0LzQuNGH0LrQviDQv9C+0ZnQtSDQtNCw0YLRg9C80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INC/0L7Qt9Cw0LTQuNC90YHQutC4INC80L7QtNGD0Lsg0YLQtdGA0LzQuNC90LAg0YLQuNC60LXRgtCwINC30LAg0LLRgNC10LzQtSDQtdGB0LrQsNC70LDRhtC40ZjQtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0L/QvtC30LDQtNC40L3RgdC60Lgg0LzQvtC00YPQuyDRgtC10YDQvNC40L3QsCDRgtC40LrQtdGC0LAg0LfQsCDQstGA0LXQvNC1INGH0LXQutCw0ZrQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ9CU0LXRhNC40L3QuNGI0LUg0YLQuNC60LXRgiDQvNC+0LTRg9C7INC30LAg0LrQsNC70LXQvdC00LDRgNGB0LrQtSDRgtC10YDQvNC40L3QtS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICfQmNC30LzQtdC90LAg0YLQtdGA0LzQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ9CS0YDQtdC80LUg0L/RgNCy0L7QsyDQvtC00LPQvtCy0L7RgNCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMgc2NyZWVuLid9ID0gJ9CV0LrRgNCw0L0g0LfQsCDRg9Cy0L7QtyDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAn0J/QvtCy0LXQt9GD0ZjQtSDRgtC10YDQvNC40L3QtSDQuCDRgtC40LrQtdGC0LUgItCd0L7RgNC80LDQu9C90LjQvCIg0LLRgNGB0YLQsNC80LAg0LLQtdC30LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQm9C40YHRgtCwINGB0LLQuNGFINC+0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdC40LzQsCDQt9CwINC/0YDQuNC60LDQtyDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Cb0LjRgdGC0LAg0YHQstC40YUg0LTQvtCz0LDRktCw0ZjQsCDQvdCwINC60LDQu9C10L3QtNCw0YDQuNC80LAg0LrQvtGY0LAg0ZvQtSDQsdC40YLQuCDQv9GA0LjQutCw0LfQsNC90LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgY29sb3JzIGluIGhleGFkZWNpbWFsIFJHQiB3aGljaCB3aWxsIGJlIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGR1cmluZyBjYWxlbmRhciBjcmVhdGlvbi4gTWFrZSBzdXJlIHRoZSBjb2xvcnMgYXJlIGRhcmsgZW5vdWdoIHNvIHdoaXRlIHRleHQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGVtLid9ID0KICAgICAgICAn0JvQuNGB0YLQsCDQsdC+0ZjQsCDRgyDRhdC10LrRgdCw0LTQtdGG0LjQvNCw0LvQvdC+0LwgUkdCINC30LDQv9C40YHRgyDQutC+0ZjQtSDRm9C1INCx0LjRgtC4INC00L7RgdGC0YPQv9C90LUg0LfQsCDQuNC30LHQvtGAINC/0YDQuNC70LjQutC+0Lwg0L/RgNCw0LLRmdC10ZrQsCDQutCw0LvQtdC90LTQsNGA0LAuINCe0LHRgNCw0YLQuNGC0LUg0L/QsNC20ZrRgyDQtNCwINGB0YMg0LHQvtGY0LUg0LTQvtCy0L7RmdC90L4g0YLQsNC80L3QtSDRgtCw0LrQviDQtNCwINCx0LXQu9C4INGC0LXQutGB0YIg0LzQvtC20LUg0LHQuNGC0Lgg0LjRgdC/0LjRgdCw0L0g0L3QsCDRmtC40LzQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAn0KPQv9GA0LDQstGZ0LDRmtC1INGA0LDQt9C70LjRh9C40YLQuNC8INC60LDQu9C10L3QtNCw0YDQuNC80LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAn0JzQsNC60YHQuNC80LDQu9C90Lgg0LHRgNC+0Zgg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAg0YMg0LXQutGA0LDQvdC40LzQsCDQt9CwINC/0YDQtdCz0LvQtdC0LiDQntCx0YDQsNGC0LjRgtC1INC/0LDQttGa0YMg0LTQsCDQstC10LvQuNC60Lgg0LHRgNC+0Zgg0LDQutGC0LjQstC90LjRhSDQutCw0LvQtdC90LTQsNGA0LAg0LzQvtC20LUg0LjQvNCw0YLQuCDRg9GC0LjRhtCw0Zgg0L3QsCDQv9C10YDRhNC+0YDQvNCw0L3RgdC1INCy0LDRiNC10LMg0YHQtdGA0LLQtdGA0LAg0L/RgNCw0LLRmdC10ZrQtdC8INC/0YDQtdCy0LjRiNC1INGB0LjQvNGD0LvRgtCw0L3QuNGFINC30LDRhdGC0LXQstCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTINC90LUg0L/QvtC00YDQttCw0LLQsCDRgtC10YDQvNC40L3QtSDQutC+0ZjQuCDRgdC1INC/0L7QvdCw0LLRmdCw0ZjRgyDQsdC10Lcg0LrRgNCw0ZjRmtC10LMg0LTQsNGC0YPQvNCwINC40LvQuCDQsdGA0L7RmNCwINC40YLQtdGA0LDRhtC40ZjQsC4g0J/RgNC40LvQuNC60L7QvCDRg9Cy0L7Qt9CwINC60LDQu9C10L3QtNCw0YDQsCwg0LzQvtC20LUg0YHQtSDQtNC+0LPQvtC00LjRgtC4INC00LAgSUNTINGE0LDRmNC7INGB0LDQtNGA0LbQuCDRgtCw0LrQstC1IFwn0LHQtdGB0LrQvtC90LDRh9C90LVcJyDRgtC10YDQvNC40L3QtS4g0KPQvNC10YHRgtC+INGC0LDQutCy0L7QsyDQv9C+0L3QsNGI0LDRmtCwLCDRgdC40YHRgtC10Lwg0ZvQtSDQutGA0LXQuNGA0LDRgtC4INGB0LLQtSDRgtC10YDQvNC40L3QtSDQuNC3INC/0YDQvtGI0LvQvtGB0YLQuCwg0LrQsNC+INC4INGC0LXRgNC80LjQvdC1INC30LAg0YHQu9C10LTQtdGb0LggbiDQsdGA0L7RmCDQvNC10YHQtdGG0LggKNC/0L7QtNGA0LDQt9GD0LzQtdCy0LDQvdC+IDEyMCDQvNC10YHQtdGG0LgvMTAg0LPQvtC00LjQvdCwKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfQn9GA0LXQs9C70LXQtCDRgdCy0LjRhSDRgtC10YDQvNC40L3QsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn0JLRgNC10LzQtSDRh9C10LrQsNGa0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ9Cc0L7QtNGD0Lsg0L/RgNC10YLRgNCw0LPQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ9Cc0L7QtNGD0Lsg0L/RgNC10YLRgNCw0LPQtSDQt9CwINCw0YPRgtC+0LzQsNGC0YHQutC+INC00L7Qv9GD0ZrQsNCy0LDRmtC1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfQiNCw0LLQvdC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ9CI0LDQstC90Lgg0LrQsNC70LXQvdC00LDRgC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfQn9GA0LXQs9C70LXQtCDRgNC10YHRg9GA0YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICfQn9GA0LXQs9C70LXQtCDRgNC10YHRg9GA0YHQsCAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINGDINC80LXQvdC40ZjRgyDRgtC40LrQtdGC0LAg0LfQsCDQutGA0LXQuNGA0LDRmtC1INGC0LXRgNC80LjQvdCwINGDINC60LDQu9C10L3QtNCw0YDRgyDQv9C+0LLQtdC30LDQvdC+0LMg0YHQsCDRgtC40Lwg0YLQuNC60LXRgtC+0LwuINCU0L7QtNCw0YLQvdCwINC60L7QvdGC0YDQvtC70LAg0L/RgNC40LrQsNC30LAg0L7QstC1INCy0LXQt9C1INC80L7QttC1INGB0LUg0L/QvtGB0YLQuNGb0Lgg0LrQvtGA0LjRiNGb0LXRmtC10Lwg0LrRmdGD0YfQsCAiR3JvdXAiINGB0LAg0YHQsNC00YDQttCw0ZjQtdC8ICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuINCX0LAg0LfQtNGA0YPQttC40LLQsNGa0LUg0LLQtdC30LAg0YMg0LzQtdC90LjRmNGDINC/0L7QtNC10YHQuNGC0LUg0LrRmdGD0YcgIkNsdXN0ZXJOYW1lIiDRgdCwINGB0LDQtNGA0LbQsNGY0LXQvCDQutC+0ZjQuCDRm9C1INCx0LjRgtC4INC90LDQt9C40LIg0LrQvtGY0Lgg0LbQtdC70LjRgtC1INC00LAg0LLQuNC00LjRgtC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDLiDQmtC+0YDQuNGB0YLQuNGC0LUg0LrRmdGD0YcgIkNsdXN0ZXJQcmlvcml0eSIg0LfQsCDQuNC30LzQtdC90YMg0YDQtdC00L7RgdC70LXQtNCwINCz0YDRg9C/0LAg0YMg0LzQtdC90LjRmNGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAn0JLRgNC10LzQtSDRgNC10YjQsNCy0LDRmtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0JjQt9Cx0L7RgCDRgtGA0LDQvdGB0L/QvtGA0YLQsCDQt9CwINC+0LHQsNCy0LXRiNGC0LXRmtCwINC+INGC0LXRgNC80LjQvdGDLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICfQkNC60YLQuNCy0LjRgNCwINC00L7QtNCw0LLQsNGa0LUg0LjQu9C4INC+0YHQstC10LbQsNCy0LDRmtC1INCw0YPRgtC+0LzQsNGC0YHQutC40YUg0YLQtdGA0LzQuNC90LAg0L3QsCDQvtGB0L3QvtCy0YMg0LLRgNC10LzQtdC90LAg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJ9CS0YDQtdC80LUg0LDQttGD0YDQuNGA0LDRmtCwJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfTGF0bl9PVFJTQXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFBQU5vdGlmaWNhdGlvbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgcmVtaW5kZXIgbm90aWZpY2F0aW9uJ30gPSAnT2JhdmXFoXRlbmplIHBvZHNldG5pa2EgbyB0ZXJtaW51JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdEb2JpxIdldGUgb2JhdmXFoXRlbmplIHN2YWtpIHB1dCBrYWRhIGRvxJFlIGRvIHZyZW1lbmEgcG9kc2V0bmlrYSB6YSBuZWtpIG9kIHZhxaFpaCB0ZXJtaW5hLic7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ1VwcmF2bGphbmplIG9iYXZlxaF0ZW5qaW1hIG8gdGVybWluaW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnT3ZkZSBtb8W+ZXRlIHBvc2xhdGkga29uZmlndXJhY2lvbnUgZGF0b3Rla3UgemEgdXZveiBvYmF2ZcWhdGVuamEgbyB0ZXJtaW51IHUgdmHFoSBzaXN0ZW0uIERhdG90ZWthIG1vcmEgYml0aSB1IGlzdG9tIC55bWwgZm9ybWF0dSBrb2ppIGplIG1vZ3XEh2UgZG9iaXRpIGl6dm96b20gdSBla3JhbnUgdXByYXZsamFuamEgb2JhdmXFoXRlbmppbWEgbyB0ZXJtaW5pbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLid9ID0KICAgICAgICAnT3ZkZSBtb8W+ZXRlIGl6YWJyYXRpIGtvamkgZG9nYcSRYWppIMSHZSBwb2tyZW51dGkgb2JhdmXFoXRhdmFuamUuIERvZGF0bmkgZmlsdGVyIHphIHRlcm1pbmUgbW/FvmUgYml0aSBwcmltZW5qZW4gcmFkaSBzbGFuamEgc2FtbyB6YSB0ZXJtaW5lIHBvIG9kcmXEkWVub20ga3JpdGVyaWp1bXUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEZpbHRlcid9ID0gJ0ZpbHRlciB0ZXJtaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW0nfSA9ICdUaW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdSZXN1cnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICdPYmF2ZXN0aSBrb3Jpc25pa2Egc2FtbyBqZWRub20gZG5ldm5vIG8gcG9qZWRpbmHEjW5vbSB0ZXJtaW51IGtvcmnFocSHZW5qZW0gaXphYnJhbm9nIHRyYW5zcG9ydGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAnT2JhdmXFoXRlbmplIMSHZSBiaXRpIHBvc2xhdG8gb3BlcmF0ZXJ1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAnRGEgdmlkaXRlIHBydmloIDIwIGthcmFrdGVyYSBuYXNsb3ZhIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlJ30gPSAnRGEgdmlkaXRlIGF0cmlidXRlIHRlcm1pbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICdEYSB2aWRpdGUgYXRyaWJ1dGUga2FsZW5kYXJhJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW5kYSBPdmVydmlldyd9ID0gJ1ByZWdsZWQgZG5ldm5vZyByZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdVcHJhdmxqYW5qZSBrYWxlbmRhcmltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdEb2RhaiB0ZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb3InfSA9ICdCb2phJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnRGF0dW0ga3JhamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwZWF0J30gPSAnUG9uYXZsamFuamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnTmlqZSBwcm9uYcSRZW4gbmlqZWRhbiBrYWxlbmRhci4gTW9saW1vIHBydm8gZG9kYWp0ZSBrYWxlbmRhciBrb3JpxaHEh2VuamVtIGVrcmFuYSBVcHJhdmxqYW5qZSBrYWxlbmRhcmltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ092YWogdGVybWluIHNlIHBvbmF2bGphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyd9ID0KICAgICAgICAnRGEgbGkgxb5lbGl0ZSBkYSBpem1lbmkgc2FtbyBvdm8gaWxpIHN2YSBwb25hdmxqYW5qYT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIG9jY3VycmVuY2VzJ30gPSAnU3ZhIHBvbmF2bGphbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0p1c3QgdGhpcyBvY2N1cnJlbmNlJ30gPSAnU2FtbyBvdm8gcG9uYXZsamFuamUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ1VwcmF2bGphbmplIGthbGVuZGFyaW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnUHJlZ2xlZCBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0RvZGFqIG5vdmkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnRG9kYWoga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IEFwcG9pbnRtZW50cyd9ID0gJ1V2ZXppIHRlcm1pbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAnVXZveiBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuJ30gPQogICAgICAgICdPdmRlIG1vxb5ldGUgdcSNaXRhdGkga29uZmlndXJhY2lvbnUgZGF0b3Rla3UgemEgdXZveiBrYWxlbmRhcmEgdSB2YcWhIHNpc3RlbS4gRGF0b3Rla2EgbW9yYSBiaXRpIHUgLnltbCBmb3JtYXR1IGl6dmV6ZW5hIG9kIHN0cmFuZSBtb2R1bGEgemEgdXByYXZsamFuamUga2FsZW5kYXJpbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uJ30gPSAnVcSNaXRhaiBrb25maWd1cmFjaWp1IGthbGVuZGFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQ2FsZW5kYXInfSA9ICdVdmV6aSBrYWxlbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0ZpbHRlciB6YSBrYWxlbmRhcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVwZW5kaW5nIG9uIHRoZSBncm91cCBmaWVsZCwgdGhlIHN5c3RlbSB3aWxsIGFsbG93IHVzZXJzIHRoZSBhY2Nlc3MgdG8gdGhlIGNhbGVuZGFyIGFjY29yZGluZyB0byB0aGVpciBwZXJtaXNzaW9uIGxldmVsLid9ID0KICAgICAgICAnVSB6YXZpc25vc3RpIG9kIHBvbGphIGdydXBlLCBzaXN0ZW0gxIdlIGRvenZvbGl0aSBwcmlzdHVwIGthbGVuZGFydSBvcGVyYXRlcmltYSBwcmVtYSBuamlob3ZvbSBuaXZvdSBwcmlzdHVwYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCBvbmx5OiB1c2VycyBjYW4gc2VlIGFuZCBleHBvcnQgYWxsIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIuJ30gPQogICAgICAgICdSTzogb3BlcmF0ZXJpIG1vZ3UgcHJlZ2xlZGF0aSBpIGVrc3BvcnRvdmF0aSBzdmUgdGVybWluZSB1IGthbGVuZGFydS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uJ30gPQogICAgICAgICdQcmVtZXN0aSB1OiBvcGVyYXRlcmkgbW9ndSBtb2RpZmlrb3ZhdGkgdGVybWluZSB1IGthbGVuZGFydSwgYWxpIGJleiBwcm9tZW5lIGtvbSBrYWxlbmRhcnUgcHJpcGFkYWp1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnS3JlaXJhbmplOiBvcGVyYXRlcmkgbW9ndSBrcmVpcmF0aSBpIGJyaXNhdGkgdGVybWluZSB1IGthbGVuZGFydS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ1JXOiBvcGVyYXRlcmkgbW9ndSBhZG1pbmlzdHJpcmF0aSBpIHNhbSBrYWxlbmRhci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnQWRyZXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0l6dmV6aSBrYWxlbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ1ByZXV6bWkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAnSXNrb3BpcmFqIGphdm51IGFkcmVzdSBrYWxlbmRhcmEgKFVSTCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ05heml2IGthbGVuZGFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICdLYWxlbmRhciBzYSBpc3RpbSBuYXppdm9tIHZlxIcgcG9zdG9qaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ0dydXBhIHByaXN0dXBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICdUZXJtaW5pIHRpa2V0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSdWxlJ30gPSAnUHJhdmlsbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICdLb3Jpc3RlxIdpIG9wY2lqZSBpc3BvZCBpemFiZXJpdGUgemEga29qZSB0aWtldGUgxIdlIHRlcm1pbmkgYml0aSBhdXRvbWF0c2tpIGtyZWlyYW5pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnTW9saW1vIGRhIG9kYWJlcmV0ZSB2YcW+ZcSHaSByZWQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnQXRyaWJ1dGkgcHJldHJhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICdEZWZpbmnFoWl0ZSBwcmF2aWxhIHphIGtyZWlyYW5qZSBhdXRvbWF0c2tpaCB0ZXJtaW5hIHUgb3ZvbSBrYWxlbmRhcnUgbmEgb3Nub3Z1IHRpa2V0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICdEb2RhaiBwcmF2aWxvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vcmUnfSA9ICdWacWhZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAnTWFuamUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnRG9kYWogbm92aSB0ZXJtaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXJzJ30gPSAnS2FsZW5kYXJpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbyBtYW55IGFjdGl2ZSBjYWxlbmRhcnMnfSA9ICdQcmV2acWhZSBha3Rpdm5paCBrYWxlbmRhcmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnSWxpIHBydm8gaXNrbGp1xI1pdGUgcHJpa2F6IG5la29nIGthbGVuZGFyYSBpbGkgcG92ZcSHYWp0ZSBsaW1pdCB1IGtvbmZpZ3VyYWNpamkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdTZWRtaWNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAnTWVzZcSNbmEgb3NhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIFdlZWsnfSA9ICdTZWRtacSNbmEgb3NhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ0RuZXZuYSBvc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ1Nrb8SNaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEaXNtaXNzJ30gPSAnUG9uacWhdGknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ1ByaWthxb5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Jhc2ljIGluZm9ybWF0aW9uJ30gPSAnT3Nub3ZuZSBpbmZvcm1hY2lqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdEYXR1bS92cmVtZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEVkaXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuJ30gPSAnTW9saW1vIHBvc3Rhdml0ZSBvdmFqIGRhdHVtIHByZSBrcmFqYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuJ30gPSAnTW9saW1vIHBvc3Rhdml0ZSBvdmFqIGRhdHVtIHBvc2xlIHBvxI1ldGthLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuJ30gPSAnT3ZvIGplIHRlcm1pbiBrb2ppIHNlIHBvbmF2bGphLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ0tsaWtuaXRlIG92ZGUgemEgcHJlZ2xlZCBtYXRpxI1ub2cgdGVybWluYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuJ30gPSAnS2xpa25pdGUgb3ZkZSB6YSBpem1lbnUgbWF0acSNbm9nIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ1XEjWVzdGFsb3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnU3Zha29nKGUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICdSZWxhdGl2bm8gdnJlbWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnRGEgbGkgc3RlIHNpZ3VybmkgZGEgxb5lbGl0ZSBkYSBpemJyacWhZXRlIG92YWogdGVybWluPyBPdnUgb3BlcmFjaWp1IG5pamUgbW9ndcSHZSBvcG96dmF0aS4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ1V2b3ogdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ1Bvc2xhdGkgZmFqbCBtb3JhIGJpdGkgdSBpc3ByYXZub20gaUNhbCBmb3JtYXR1ICguaWNzKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgZGVzaXJlZCBDYWxlbmRhciBpcyBub3QgbGlzdGVkIGhlcmUsIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBcJ2NyZWF0ZVwnIHBlcm1pc3Npb25zLid9ID0KICAgICAgICAnVWtvbGlrbyDFvmVsamVuaSBrYWxlbmRhciBuaWplIGl6bGlzdGFuLCBwcm92ZXJpdGUgZGEgbGkgaW1hdGUgbml2byBwcmlzdHVwYSBcJ2tyZWlyYW5qZVwnIHphIGdydXB1IGthbGVuZGFyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdPc3Zlxb5pIHBvc3RvamXEh2UgdGVybWluZT8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdTdmkgcG9zdG9qZcSHaSB0ZXJtaW5pIHUga2FsZW5kYXJ1IHNhIGlzdGltIFVuaXF1ZUlEIHBvbGplbSDEh2UgYml0aSBwcmVicmlzYW5pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXInfSA9ICdQb8WhYWxqaSBrYWxlbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnVXZlemkgdGVybWluZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOb3ZpIHRlcm1pbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnVXNrb3JvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzUgZGFuYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdPYmF2ZcWhdGVuamUgc2Egb3ZpbSBuYXppdm9tIHZlxIcgcG9zdG9qaSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJ09wZXJhdGVyIChyZXN1cnMpLCBrb2ppIGplIGl6YWJyYW4gdSB0ZXJtaW51JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ1N2aSBvcGVyYXRlcmkgc2EgKG5ham1hbmplKSBkb3p2b2xvbSBwcmVnbGVkYSB0ZXJtaW5hIChrYWxlbmRhcmEpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnU3ZpIG9wZXJhdGVyaSBzYSBkb3p2b2xvbSBwaXNhbmphIHUgdGVybWludSAoa2FsZW5kYXJ1KSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAnU2lzdGVtIG5pamUgdXNwZW8gZGEga3JlaXJhIGthbGVuZGFyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBDYWxlbmRhcklEISd9ID0gJ05lbWEgQ2FsZW5kYXJJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAnTmVtYXRlIHByaXN0dXAgb3ZvbSBrYWxlbmRhcnUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICdJem1lbmkga2FsZW5kYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0dyZcWha2EgcHJpbGlrb20gaXptZW5lIGthbGVuZGFyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAnVcSNaXRhdmFuamUga29uZmlndXJhY2lqZSBrYWxlbmRhcmEgbmlqZSBiaWxvIG1vZ3XEh2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ01vbGltbyB2YXMgZGEgcHJvdmVyaXRlIGRhIGxpIGplIHZhxaEgZmFqbCBpc3ByYXZhbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGltcG9ydCB0aGUgY2FsZW5kYXIhJ30gPSAnTmlqZSBtb2d1xIcgdXZveiBrYWxlbmRhcmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0thbGVuZGFyIGplIHV2ZXplbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZCBDYWxlbmRhcklEISd9ID0gJ1BvdHJlYmFuIElEIGthbGVuZGFyYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICdOZSBtb2d1IHByaWJhdml0aSBwb2RhdGtlIHphIGRhdGkgQ2FsZW5kYXJJRCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnVXNwZcWhbm8gdXZlemVubyAlcyB0ZXJtaW4oYSkgdSBrYWxlbmRhciAlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzUgbWludXRlcyd9ID0gJys1IG1pbnV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNSBtaW51dGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxIGhvdXInfSA9ICcrMSBzYXQnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnU3ZpIHRlcm1pbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnVGVybWluaSBkb2RlbGplbmkgbWVuaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAnUHJpa2F6IHNhbW8gdGVybWluYSBkb2RlbGplbmloIHZhbWEhIEl6bWVuaXRlIHBvZGXFoWF2YW5qYSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICdUZXJtaW4gbmlqZSBwcm9uYcSRZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAnTmlrYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ1N2YWtpIGRhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBXZWVrJ30gPSAnU3Zha2Ugc2VkbWljZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ1N2YWtvZyBtZXNlY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgWWVhcid9ID0gJ1N2YWtlIGdvZGluZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDdXN0b20nfSA9ICdQcmlsYWdvxJFlbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGFpbHknfSA9ICdEbmV2bm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vla2x5J30gPSAnU2VkbWnEjW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNZXNlxI1ubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICdHb2RpxaFuamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICdzdmFrb2coZSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICd1a3Vwbm8gJXMgcHV0KGEpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ2RvIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICd1a3Vwbm8gLi4uIHB1dChhKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ2RvICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ0JleiBvYmF2ZcWhdGVuamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIG1pbnV0KGEpIHByZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIHNhdChhKSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzIGRhbihhKSBwcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgd2VlayBiZWZvcmUnfSA9ICclcyBuZWRlbGphIHByZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ3ByZSBuZWdvIMWhdG8gdGVybWluIHphcG/EjW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAncG/FoXRvIHRlcm1pbiB6YXBvxI1uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICdwcmUgbmVnbyDFoXRvIHNlIHRlcm1pbiB6YXZyxaFpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCd9ID0gJ3BvxaF0byBzZSB0ZXJtaW4gemF2csWhaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9uISd9ID0gJ0JleiBkb3p2b2xlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudCEnfSA9ICdOaWplIG1vZ3XEh2Ugb2JyaXNhdGkgdGVybWluIHRpa2V0YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnQmV6IGRvenZvbGUhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50SW1wb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyd9ID0gJ0JleiBkb3p2b2xlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ1Npc3RlbSBuaWplIHVzcGVvIGRhIHV2ZXplIGZhamwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ01vbGltbyBwcm92ZXJpdGUgbG9nIHphIHZpxaFlIGluZm9ybWFjaWphLic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAnKyVkIHZpxaFlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAnQmV6ICVzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAnTmVwb3puYXQga29yaXNuaWshJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY2FsZW5kYXIhJ30gPSAnTmVpc3ByYXZhbiBrYWxlbmRhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAnTmVpc3ByYXZuYSBhZHJlc2EhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ0dyZcWha2EgcHJpbGlrb20gZWtzcG9ydG92YW5qYSBrYWxlbmRhcmEhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAnT3N2ZcW+aSAobWludXRhKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnU3RyYW5pY2EgemEgcHJlZ2xlZCBrYWxlbmRhcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdPYmF2ZcWhdGVuamEgbyB0ZXJtaW51JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICdNb2R1bCBkb2dhxJFhamEga2FsZW5kYXJhIHphIHByaXByZW11IG9iYXZlxaF0ZW5qYSBvIHRlcm1pbmltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgdXBkYXRlcyB0aGUgdGlja2V0IHdpdGggZGF0YSBmcm9tIHRpY2tldCBhcHBvaW50bWVudC4nfSA9CiAgICAgICAgJ01vZHVsIGRvZ2HEkWFqYSBrYWxlbmRhcmEgemEgb3N2ZcW+YXZhbmplIHRpa2V0YSBwb2RhY2ltYSBpeiB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9ICdTdHJhbmljYSB6YSBpem1lbnUga2FsZW5kYXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAnTGlzdGEgdGVybWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0Lid9ID0gJ0xpc3RhIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdPYmF2ZcWhdGVuamEgbyB0ZXJtaW51JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ1Rlcm1pbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdTdHJhbmljYSB6YSB1cHJhdmxqYW5qZSBrYWxlbmRhcmltYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnSXphYmVyaSB6YSBrYWt2ZSBwcm9tZW5lIHRlcm1pbmEgxb5lbGnFoSBkYSBwcmltacWhIG9iYXZlxaF0ZW5qYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ0tyZWlyYSBub3ZpIHRlcm1pbiB1IGthbGVuZGFydSBwb3ZlemFuIHNhIG92aW0gdGlrZXRvbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ0tyZWlyYW5qZSBpIHVwcmF2bGphbmplIG9iYXZlxaF0ZW5qaW1hIHphIHRlcm1pbmUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBuZXcgYXBwb2ludG1lbnQuJ30gPSAnS3JlaXJhIG5vdmkgdGVybWluLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBrb2plIGtvbG9uZSDEh2UgYml0aSBwcmlrYXphbmUgdSBhcGxpa2F0aXZub20gZG9kYXRrdSBsaW5rb3ZhbmloIHRlcm1pbmEgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gTW9ndcSHYSBwb2RlxaFhdmFuamE6IDAgPSBPbmVtb2d1xIdlbm8sIDEgPSBPbW9ndcSHZW5vLCAyID0gUG9kcmF6dW1ldmFubyBvbW9ndcSHZW5vLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICdEZWZpbmnFoWUgaWtvbnUgc2EgbGlua29tIG5hIEdvb2dsZSBtYXB1IHRyZW51dG5lIGxva2FjaWplIHUgZWtyYW51IHphIGl6bWVudSB0ZXJtaW5hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ0RlZmluacWhZSB0aXBvdmUgb2JqZWt0YSBkb2dhxJFhamEga29qaSDEh2UgYml0aSBwcm9jZXNpcmFuaSBwdXRlbSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGxpc3Qgb2YgcGFyYW1zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aWNrZXQgc2VhcmNoIGZ1bmN0aW9uLid9ID0KICAgICAgICAnRGVmaW5pxaFlIGxpc3R1IHBhcmFtZXRhcmEga29qaSBtb2d1IGJpdGkgcHJvc2xlxJFlbmkgZnVua2NpamkgcHJldHJhZ2UgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmnFoWUgcG96YWRpbnNraSBtb2R1bCB0ZXJtaW5hIHRpa2V0YSB6YSBkaW5hbWnEjWtvIHBvbGplIGRhdHVtYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBwb3phZGluc2tpIG1vZHVsIHRlcm1pbmEgdGlrZXRhIHphIHZyZW1lIGVza2FsYWNpamUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBwZW5kaW5nIHRpbWUuJ30gPQogICAgICAgICdEZWZpbmnFoWUgcG96YWRpbnNraSBtb2R1bCB0ZXJtaW5hIHRpa2V0YSB6YSB2cmVtZSDEjWVrYW5qYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IHBsdWdpbiBmb3IgY2FsZW5kYXIgYXBwb2ludG1lbnRzLid9ID0gJ0RlZmluacWhZSB0aWtldCBtb2R1bCB6YSBrYWxlbmRhcnNrZSB0ZXJtaW5lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljRmllbGRfJXMnfSA9ICdEeW5hbWljRmllbGRfJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBhcHBvaW50bWVudCd9ID0gJ0l6bWVuYSB0ZXJtaW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpcnN0IHJlc3BvbnNlIHRpbWUnfSA9ICdWcmVtZSBwcnZvZyBvZGdvdm9yYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdFa3JhbiB6YSB1dm96IHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJ1BvdmV6dWplIHRlcm1pbmUgaSB0aWtldGUgIk5vcm1hbG5pbSIgdnJzdGFtYSB2ZXphLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnTGlzdGEgc3ZpaCBvYmF2ZcWhdGVuamEgbyB0ZXJtaW5pbWEgemEgcHJpa2F6IHUgaW50ZXJmZWpzdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ0xpc3RhIHN2aWggZG9nYcSRYWphIG5hIGthbGVuZGFyaW1hIGtvamEgxIdlIGJpdGkgcHJpa2F6YW5hIHUgaW50ZXJmZWpzdS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICdMaXN0YSBib2phIHUgaGVrc2FkZWNpbWFsbm9tIFJHQiB6YXBpc3Uga29qZSDEh2UgYml0aSBkb3N0dXBuZSB6YSBpemJvciBwcmlsaWtvbSBwcmF2bGplbmphIGthbGVuZGFyYS4gT2JyYXRpdGUgcGHFvm5qdSBkYSBzdSBib2plIGRvdm9sam5vIHRhbW5lIHRha28gZGEgYmVsaSB0ZWtzdCBtb8W+ZSBiaXRpIGlzcGlzYW4gbmEgbmppbWEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ1VwcmF2bGphbmplIHJhemxpxI1pdGltIGthbGVuZGFyaW1hLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ01ha3NpbWFsbmkgYnJvaiBha3Rpdm5paCBrYWxlbmRhcmEgdSBla3JhbmltYSB6YSBwcmVnbGVkLiBPYnJhdGl0ZSBwYcW+bmp1IGRhIHZlbGlraSBicm9qIGFrdGl2bmloIGthbGVuZGFyYSBtb8W+ZSBpbWF0aSB1dGljYWogbmEgcGVyZm9ybWFuc2UgdmHFoWVnIHNlcnZlcmEgcHJhdmxqZW5qZW0gcHJldmnFoWUgc2ltdWx0YW5paCB6YWh0ZXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJTIG5lIHBvZHLFvmF2YSB0ZXJtaW5lIGtvamkgc2UgcG9uYXZsamFqdSBiZXoga3Jham5qZWcgZGF0dW1hIGlsaSBicm9qYSBpdGVyYWNpamEuIFByaWxpa29tIHV2b3phIGthbGVuZGFyYSwgbW/FvmUgc2UgZG9nb2RpdGkgZGEgSUNTIGZhamwgc2FkcsW+aSB0YWt2ZSBcJ2Jlc2tvbmHEjW5lXCcgdGVybWluZS4gVW1lc3RvIHRha3ZvZyBwb25hxaFhbmphLCBzaXN0ZW0gxIdlIGtyZWlyYXRpIHN2ZSB0ZXJtaW5lIGl6IHByb8WhbG9zdGksIGthbyBpIHRlcm1pbmUgemEgc2xlZGXEh2kgbiBicm9qIG1lc2VjaSAocG9kcmF6dW1ldmFubyAxMjAgbWVzZWNpLzEwIGdvZGluYSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J092ZXJ2aWV3IG9mIGFsbCBhcHBvaW50bWVudHMuJ30gPSAnUHJlZ2xlZCBzdmloIHRlcm1pbmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ1ZyZW1lIMSNZWthbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICdNb2R1bCBwcmV0cmFnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJ01vZHVsIHByZXRyYWdlIHphIGF1dG9tYXRza28gZG9wdW5qYXZhbmplLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICdKYXZuaSBrYWxlbmRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgY2FsZW5kYXIuJ30gPSAnSmF2bmkga2FsZW5kYXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3J30gPSAnUHJlZ2xlZCByZXN1cnNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc291cmNlIE92ZXJ2aWV3IChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSd9ID0gJ1ByZWdsZWQgcmVzdXJzYSAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IGZvciBjcmVhdGluZyBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGUgdGlja2V0IGRpcmVjdGx5IGZyb20gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4gQWRkaXRpb25hbCBhY2Nlc3MgY29udHJvbCB0byBzaG93IG9yIG5vdCBzaG93IHRoaXMgbGluayBjYW4gYmUgZG9uZSBieSB1c2luZyBLZXkgIkdyb3VwIiBhbmQgQ29udGVudCBsaWtlICJydzpncm91cDE7bW92ZV9pbnRvOmdyb3VwMiIuIFRvIGNsdXN0ZXIgbWVudSBpdGVtcyB1c2UgZm9yIEtleSAiQ2x1c3Rlck5hbWUiIGFuZCBmb3IgdGhlIENvbnRlbnQgYW55IG5hbWUgeW91IHdhbnQgdG8gc2VlIGluIHRoZSBVSS4gVXNlICJDbHVzdGVyUHJpb3JpdHkiIHRvIGNvbmZpZ3VyZSB0aGUgb3JkZXIgb2YgYSBjZXJ0YWluIGNsdXN0ZXIgd2l0aGluIHRoZSB0b29sYmFyLid9ID0KICAgICAgICAnUHJpa2F6dWplIHZlenUgdSBtZW5panUgdGlrZXRhIHphIGtyZWlyYW5qZSB0ZXJtaW5hIHUga2FsZW5kYXJ1IHBvdmV6YW5vZyBzYSB0aW0gdGlrZXRvbS4gRG9kYXRuYSBrb250cm9sYSBwcmlrYXphIG92ZSB2ZXplIG1vxb5lIHNlIHBvc3RpxIdpIGtvcmnFocSHZW5qZW0ga2xqdcSNYSAiR3JvdXAiIHNhIHNhZHLFvmFqZW0gInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gWmEgemRydcW+aXZhbmplIHZlemEgdSBtZW5panUgcG9kZXNpdGUga2xqdcSNICJDbHVzdGVyTmFtZSIgc2Egc2FkcsW+YWplbSBrb2ppIMSHZSBiaXRpIG5heml2IGtvamkgxb5lbGl0ZSBkYSB2aWRpdGUgdSBpbnRlcmZlanN1LiBLb3Jpc3RpdGUga2xqdcSNICJDbHVzdGVyUHJpb3JpdHkiIHphIGl6bWVudSByZWRvc2xlZGEgZ3J1cGEgdSBtZW5panUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvbHV0aW9uIHRpbWUnfSA9ICdWcmVtZSByZcWhYXZhbmphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnSXpib3IgdHJhbnNwb3J0YSB6YSBvYmF2ZcWhdGVuamEgbyB0ZXJtaW51Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICdBa3RpdmlyYSBkb2RhdmFuamUgaWxpIG9zdmXFvmF2YW5qZSBhdXRvbWF0c2tpaCB0ZXJtaW5hIG5hIG9zbm92dSB2cmVtZW5hIHRpa2V0YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICdWcmVtZSBhxb51cmlyYW5qYSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3ZfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ0thbGVuZGVyaMOkbmRlbHNlcMOlbWlubmVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IHdpbGwgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBlYWNoIHRpbWUgYSByZW1pbmRlciB0aW1lIGlzIHJlYWNoZWQgZm9yIG9uZSBvZiB5b3VyIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ0R1IGbDpXIgZW4gbm90aWZpZXJpbmcgZsO2ciB2YXJqZSBww6VtaW5uZWxzZXRpZCBmw7ZyIGRpbmEga2FsZW5kZXJow6RuZGVsc2VyLiAnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlaGFudGVyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAnRHUga2FuIGzDpHNhIGluIGVuIGtvbmZpZ3VyYXRpb25zZmlsIG1lZCBrYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlci4gRmlsZW4gYmVow7Z2ZXIgdmFyYSBww6UgZGV0ICAueW1sLWZvcm1hdCBzb20gZHUgZsOlciB2aWQgZXhwb3J0IGZyw6VuIGthbGVuZGVyaMOkbmRlbHNlcMOlbWlubmVsc2UtdnluLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ0Jlc3TDpG0gdmlsa2EgaMOkbmRlbHNlciBzb20gYWt0aXZlcmFyIGRlbm5hIHDDpW1pbm5lbHNlbm90aWZpZXJpbmcuIFl0dGVybGlnYXJlIGZpbHRlciBrYW4gYXBwbGljZXJhcyBmw7ZyIGF0dCBlbmRhc3Qgc2tpY2thIHDDpW1pbm5lbHNlciBmw7ZyIGthbGVuZGVyaMOkbmRlbHNlciBzb20gdXBwZnlsbGVyIGZpbHRlcmtyaXRlcmllcm5hLiAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgRmlsdGVyJ30gPSAnS2FsZW5kZXJow6RuZGVsc2ZpbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAnR3J1cHAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICdSZXN1cnMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4nfSA9ICdQw6VtaW5uZWxzZXIgc2tpY2thcyB0aWxsIGhhbmRsw6RnZ2FyZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGNhbGVuZGFyIGF0dHJpYnV0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VuZGEgT3ZlcnZpZXcnfSA9ICdEYWdvcmRuaW5nc3Z5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICdIYW50ZXJhIGthbGVuZHJhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQXBwb2ludG1lbnQnfSA9ICdMw6RnZyB0aWxsIGjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvcid9ID0gJ0bDpHJnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAnU2x1dGRhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ1VwcHJlcGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gY2FsZW5kYXJzIGZvdW5kLiBQbGVhc2UgYWRkIGEgY2FsZW5kYXIgZmlyc3QgYnkgdXNpbmcgTWFuYWdlIENhbGVuZGFycyBwYWdlLid9ID0KICAgICAgICAnSGl0dGFyIGluZ2VuIGthbGVuZGVyLiBMw6RnZyB0aWxsIGVuIGthbGVuZGVyIHVuZGVyIEhhbnRlcmEga2FsZW5kcmFyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCd9ID0gJ0thbGVuZGVyaMOkbmRlbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnfSA9ICdVcHByZXBhZCBrYWxlbmRlcmjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICdBbGxhIGbDtnJla29tc3Rlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdXN0IHRoaXMgb2NjdXJyZW5jZSd9ID0gJ0VuZGFzdCBkZW5uYSBow6RuZGVsc2UnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ0thbGVuZGVyaGFudGVyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIE92ZXJ2aWV3J30gPSAnS2FsZW5kZXLDtnZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBDYWxlbmRhcid9ID0gJ0zDpGdnIHRpbGwga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhbGVuZGFyJ30gPSAnTMOkZ2cgdGlsbCBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0ZXJhIGthbGVuZGVyaMOkbmRlbHNlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBJbXBvcnQnfSA9ICdJbXBvcnRlcmEga2FsZW5kcmFyICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbid9ID0gJ0zDpHMgaW4ga2FsZW5kZXJrb25maWd1cmF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBDYWxlbmRhcid9ID0gJ0ltcG9ydGVyYSBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ0thbGVuZGVyZmlsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAnVVJMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ0V4cG9ydGVyYSBrYWxlbmRlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICdIw6RtdGEga2FsZW5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgcHVibGljIGNhbGVuZGFyIFVSTCd9ID0gJ0tvcGllcmEga2FsZW5kZXJucyBwdWJsaWthIFVSTCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBuYW1lJ30gPSAnS2FsZW5kZXJuYW1uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZXJtaXNzaW9uIGdyb3VwJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBBcHBvaW50bWVudHMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUnVsZSd9ID0gJ1JlZ2VsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZSBydWxlcyBmb3IgY3JlYXRpbmcgYXV0b21hdGljIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyIGJhc2VkIG9uIHRpY2tldCBkYXRhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBSdWxlJ30gPSAnTMOkZ2cgdGlsbCByZWdlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3JlJ30gPSAnTWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xlc3MnfSA9ICdNaW5kcmUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IEFwcG9pbnRtZW50J30gPSAnTMOkZ2cgdGlsbCBueSBrYWxlbmRlcmjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICdLYWxlbmRyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ0bDtnIgbcOlbmdhIGFrdGl2YSBrYWxlbmRyYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWsnfSA9ICdWZWNrYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ03DpW5hZHN2eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAnVmVja292eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICdEYWdzdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVtcCd9ID0gJ0hvcHBhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICdBdmbDpHJkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAnVmlzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICdEYXR1bS90aWQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZWltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ0lubMOkc3RhIGZpbGVyIG3DpXN0ZSB2YXJhIGlDYWwtZmlsZXIgKC5pY3MpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBkZXNpcmVkIENhbGVuZGFyIGlzIG5vdCBsaXN0ZWQgaGVyZSwgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGF0IGxlYXN0IFwnY3JlYXRlXCcgcGVybWlzc2lvbnMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIGV4aXN0aW5nIGFwcG9pbnRtZW50cz8nfSA9ICdVcHBkYXRlcmEgbnV2YXJhbmRlIGthbGVuZGVyaMOkbmRlbHNlcj8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICdBbGxhIG51dmFyYW5kZSBrYWxlbmRlcmjDpG5kZWxzZXIgbWVkIHNhbW1hIElEIHNrcml2cyDDtnZlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAnTMOkcyBpbiBlbiBrYWxlbmRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAnSW1wb3J0ZXJhIGthbGVuZGVyaMOkbmRlbHNlcic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXcgQXBwb2ludG1lbnQnfSA9ICdOeSBrYWxlbmRlcmjDpG5kZWxzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAnU25hcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnNSBkYXlzJ30gPSAnNSBkYWdhcic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnfSA9ICdQw6VtaW5uZWxzZW5hbW5ldCBmaW5ucyByZWRhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbnQgKHJlc291cmNlcyksIHdobyBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSBhcHBvaW50bWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJ30gPQogICAgICAgICdBbGxhIGhhbmRsw6RnZ2FyZSBtZWQgKMOldG1pbnN0b25lKSBsw6RzcsOkdHRpZ2hldGVyIGbDtnIga2FsZW5kZXJow6RuZGVsc2VuIChrYWxlbmRlcm4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKSd9ID0KICAgICAgICAnQWxsYSBoYW5kbMOkZ2dhcmUgbWVkIHNrcml2csOkdHRpZ2hldGVyIGbDtnIga2FsZW5kZXJow6RuZGVsc2VuIChrYWxlbmRlcm4pJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICdLdW5kZSBpbnRlIHNrYXBhIGthbGVuZGVybiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICdLYWxlbmRlci1JRCBzYWtuYXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSBoYXZlIG5vIGFjY2VzcyB0byB0aGlzIGNhbGVuZGFyISd9ID0gJ0R1IGhhciBpbmdlbiDDpXRrb21zdCB0aWxsIGthbGVuZGVybiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ1JlZGlnZXJhIGthbGVuZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICdLdW5kZSBpbnRlIHVwcGRhdGVyYSBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkblwndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4nfSA9ICdLYWxlbmRlcmtvbmZpZ3VyYXRpb25zZmlsZW4ga3VuZGUgaW50ZSBsw6RzYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICdLdW5kZSBpbnRlIGltcG9ydGVyYSBrYWxlbmRlcm4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ0thbGVuZGVyIGltcG9ydGVyYWQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICdLYWxlbmRlci1JRCBrcsOkdnMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBnaXZlbiBDYWxlbmRhcklEJ30gPSAnSW5nYSBkYXRhIGhpdHRhZGVzIGbDtnIga2FsZW5kZXItSUQ6dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzZnVsbHkgaW1wb3J0ZWQgJXMgYXBwb2ludG1lbnQocykgdG8gY2FsZW5kYXIgJXMuJ30gPSAnTHlja2FkZXMgaW1wb3J0ZXJhICVzIGthbGVuZGVyaMOkbmRlbHNlKHIpIHRpbGwga2FsZW5kZXIgJXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSBtaW51dGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JysxNSBtaW51dGVzJ30gPSAnKzE1IG1pbnV0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzMwIG1pbnV0ZXMnfSA9ICcrMzAgbWludXRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEgdGltbWUnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAnQWxsYSBrYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIG1lJ30gPSAnTWluYSBrYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd2luZyBvbmx5IGFwcG9pbnRtZW50cyBhc3NpZ25lZCB0byB5b3UhIENoYW5nZSBzZXR0aW5ncyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV2ZXInfSA9ICdBbGRyaWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgRGF5J30gPSAnVmFyamUgZGFnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IFdlZWsnfSA9ICdWYXJqZSB2ZWNrYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ1ZhcmplIG3DpW5hZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAnVmFyamUgw6VyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ0FucGFzc2F0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RhaWx5J30gPSAnRGFnbGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ1ZlY2tvdmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vbnRobHknfSA9ICdNw6VuYWRzdmlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ8OFcmxpZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydldmVyeSd9ID0gJ3ZhcmplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ZvciAlcyB0aW1lKHMpJ30gPSAnJXMgZ8OlbmcoZXIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsIC4uLid9ID0gJ3RpbGxzIC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICcuLi4gZ8OlbmcoZXIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAndGlsbHMgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAnSW5nZW4gcMOlbWlubmVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgbWludXRlKHMpIGJlZm9yZSd9ID0gJyVzIG1pbnV0KGVyKSBpbm5hbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVzIHRpbW1lL3RpbW1hciBpbm5hbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBkYXkocykgYmVmb3JlJ30gPSAnJXMgZGFnKGFyKSBpbm5hbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVzIHZlY2thL3ZlY2tvciBpbm5hbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHN0YXJ0cyd9ID0gJ2lubmFuIGjDpG5kZWxzZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnfSA9ICdlZnRlciBow6RuZGVsc2VuIGLDtnJqYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJ30gPSAnaW5uYW4gaMOkbmRlbHNlbiBzbHV0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIGVuZGVkJ30gPSAnZWZ0ZXIgaMOkbmRlbHNlbiBoYXIgc2x1dGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24hJ30gPSAnU2FrbmFyIHLDpHR0aWdoZXRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAnS3VuZGUgaW50ZSB0YSBib3J0IGthbGVuZGVyaMOkbmRlbHNlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMhJ30gPSAnUsOkdHRpZ2hldGVyIHNha25hcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAnUsOkdHRpZ2hldGVyIHNha25hcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBpbXBvcnQgZmlsZSEnfSA9ICdLdW5kZSBpbnRlIGltcG9ydGVyYSBmaWxlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNoZWNrIHRoZSBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQgZmxlcic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvUHVibGljQ2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vICVzISd9ID0gJ0luZ2EgJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICdPa8OkbmQgYW52w6RuZGFyZSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICdPZ2lsdGlnIGthbGVuZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICdPZ2lsdGlnIFVSTCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJ30gPSAnS2FsZW5kZXJuIGt1bmRlIGludGUgZXhwb3J0ZXJhcyEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9EYXNoYm9hcmQvQXBwb2ludG1lbnRDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVmcmVzaCAobWludXRlcyknfSA9ICdGw7ZybnlhIChtaW51dGVyKSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAnS2FsZW5kZXJow6RuZGVsc2XDtnZlcnNpa3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCBwcmVwYXJlcyBub3RpZmljYXRpb24gZW50cmllcyBmb3IgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHVwZGF0ZXMgdGhlIHRpY2tldCB3aXRoIGRhdGEgZnJvbSB0aWNrZXQgYXBwb2ludG1lbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAnUmVkaWdlcmEga2FsZW5kZXJow6RuZGVsc2UtdnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXDDpW1pbm5lbHNlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudHMnfSA9ICdLYWxlbmRlcmjDpG5kZWxzZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICdIYW50ZXJhIGthbGVuZHJhci12eS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hvb3NlIGZvciB3aGljaCBraW5kIG9mIGFwcG9pbnRtZW50IGNoYW5nZXMgeW91IHdhbnQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIG5ldyBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhpcyB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICdMw6RnZyB0aWxsIGthbGVuZGVyaMOkbmRlbHNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZXZlbnQgb2JqZWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIHZpYSBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbGlzdCBvZiBwYXJhbXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRpY2tldCBzZWFyY2ggZnVuY3Rpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAnUmVkaWdlcmEga2FsZW5kZXJow6RuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICdJbXBvcnRlcmEga2FsZW5kZXJow6RuZGVsc2UtdnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIk5vcm1hbCIgdHlwZSBsaW5rLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGFsbCBhcHBvaW50bWVudCBldmVudHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBHVUkuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBjb2xvcnMgaW4gaGV4YWRlY2ltYWwgUkdCIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBzZWxlY3Rpb24gZHVyaW5nIGNhbGVuZGFyIGNyZWF0aW9uLiBNYWtlIHN1cmUgdGhlIGNvbG9ycyBhcmUgZGFyayBlbm91Z2ggc28gd2hpdGUgdGV4dCBjYW4gYmUgb3ZlcmxheWVkIG9uIHRoZW0uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIGRpZmZlcmVudCBjYWxlbmRhcnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgaW4gb3ZlcnZpZXcgc2NyZWVucy4gUGxlYXNlIG5vdGUgdGhhdCBsYXJnZSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFycyBjYW4gaGF2ZSBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiB5b3VyIHNlcnZlciBieSBtYWtpbmcgdG9vIG11Y2ggc2ltdWx0YW5lb3VzIGNhbGxzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09UUlMgZG9lc25cJ3Qgc3VwcG9ydCByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZW5kIGRhdGUgb3IgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIER1cmluZyBpbXBvcnQgcHJvY2VzcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgSUNTIGZpbGUgY29udGFpbnMgc3VjaCBBcHBvaW50bWVudHMuIEluc3RlYWQsIHN5c3RlbSBjcmVhdGVzIGFsbCBBcHBvaW50bWVudHMgaW4gdGhlIHBhc3QsIHBsdXMgQXBwb2ludG1lbnRzIGZvciB0aGUgbmV4dCBuIG1vbnRocyAoMTIwIG1vbnRocy8xMCB5ZWFycyBieSBkZWZhdWx0KS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVydmlldyBvZiBhbGwgYXBwb2ludG1lbnRzLid9ID0gJ0thbGVuZGVyaMOkbmRlbHNlw7Z2ZXJzaWt0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQZW5kaW5nIHRpbWUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbHVnaW4gc2VhcmNoIG1vZHVsZSBmb3IgYXV0b2NvbXBsZXRlLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQdWJsaWMgQ2FsZW5kYXInfSA9ICfDlnBwZW4ga2FsZW5kZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIGNhbGVuZGFyLid9ID0gJ8OWcHBlbiBrYWxlbmRlci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICdSZXN1cnPDtnZlcnNpa3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSBmb3IgY3JlYXRpbmcgYSBjYWxlbmRhciBhcHBvaW50bWVudCBsaW5rZWQgdG8gdGhlIHRpY2tldCBkaXJlY3RseSBmcm9tIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIEFkZGl0aW9uYWwgYWNjZXNzIGNvbnRyb2wgdG8gc2hvdyBvciBub3Qgc2hvdyB0aGlzIGxpbmsgY2FuIGJlIGRvbmUgYnkgdXNpbmcgS2V5ICJHcm91cCIgYW5kIENvbnRlbnQgbGlrZSAicnc6Z3JvdXAxO21vdmVfaW50bzpncm91cDIiLiBUbyBjbHVzdGVyIG1lbnUgaXRlbXMgdXNlIGZvciBLZXkgIkNsdXN0ZXJOYW1lIiBhbmQgZm9yIHRoZSBDb250ZW50IGFueSBuYW1lIHlvdSB3YW50IHRvIHNlZSBpbiB0aGUgVUkuIFVzZSAiQ2x1c3RlclByaW9yaXR5IiB0byBjb25maWd1cmUgdGhlIG9yZGVyIG9mIGEgY2VydGFpbiBjbHVzdGVyIHdpdGhpbiB0aGUgdG9vbGJhci4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb2x1dGlvbiB0aW1lJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyYW5zcG9ydCBzZWxlY3Rpb24gZm9yIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RyaWdnZXJzIGFkZCBvciB1cGRhdGUgb2YgYXV0b21hdGljIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBiYXNlZCBvbiBjZXJ0YWluIHRpY2tldCB0aW1lcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgdGltZSd9ID0gJyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6dWtfT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ9C/0L7QstGW0LTQvtC80LvQtdC90L3RjyDQvdCw0LPQsNC00YPQstCw0L3QvdGPINC/0YDQviDQn9C+0LTRltGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQktC4INCx0YPQtNC10YLQtSDQvtGC0YDQuNC80YPQstCw0YLQuCDQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0YnQvtGA0LDQt9GDLCDRj9C6INC90LDRgdGC0LDQstCw0YLQuNC80LUg0LLQuNC30L3QsNGH0LXQvdC40Lkg0YfQsNGBICjQtNC70Y8g0JLQsNGI0L7RlyDQn9C+0LTRltGXKSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBOb3RpZmljYXRpb24gTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9GW0L3QvdGPINC/0L7QstGW0LTQvtC80LvQtdC90L3Rj9C80Lgg0J/QvtC00ZbQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhcHBvaW50bWVudCBub3RpZmljYXRpb25zIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSB0aGUgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9uIG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfQpNGW0LvRjNGC0YAg0J/QvtC00ZbQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZWFtJ30gPSAn0JrQvtC80LDQvdC00LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UnfSA9ICfQoNC10YHRg9GA0YEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuJ30gPQogICAgICAgICfQn9C+0LLRltC00L7QvNC70Y/RgtC4INC60L7RgNC40YHRgtGD0LLQsNGH0LAg0YLRltC70YzQutC4INC+0LTQuNC9INGA0LDQtyDQsiDQtNC10L3RjCDQv9C+INC+0LTQvdGW0Lkg0L/QvtC00ZbRlyDQtyDQstC40LrQvtGA0LjRgdGC0LDQvdC90Y/QvCDQvtCx0YDQsNC90L7Qs9C+INGB0L/QvtGB0L7QsdGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbnMgYXJlIHNlbnQgdG8gYW4gYWdlbnQuJ30gPSAn0J/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPLCDRidC+INC90LDQtNGB0LjQu9Cw0Y7RgtGM0YHRjyDQsNCz0LXQvdGC0YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBmaXJzdCAyMCBjaGFyYWN0ZXIgb2YgdGhlIGFwcG9pbnRtZW50IHRpdGxlLid9ID0gJ9CU0LvRjyDQvtGC0YDQuNC80LDQvdC90Y8g0L/QtdGA0YjQuNGFIDIwLdGC0Lgg0YHQuNC80LLQvtC70ZbQsiDQt9Cw0LPQvtC70L7QstC60YMg0J/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGFwcG9pbnRtZW50IGF0dHJpYnV0ZSd9ID0gJ9CU0LvRjyDQvtGC0YDQuNC80LDQvdC90Y8g0LDRgtGA0LjQsdGD0YLRgyDQn9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlJ30gPSAn0JTQu9GPINC+0YLRgNC40LzQsNC90L3RjyDQsNCw0YLRgNC40LHRg9GC0ZbQsiDQutCw0LvQtdC90LTQsNGA0Y8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAn0J7Qs9C70Y/QtCDQv9C+0YDRj9C00LrRgyDQtNC10L3QvdC+0LPQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgQ2FsZW5kYXJzJ30gPSAn0LrQtdGA0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGA0Y/QvNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBBcHBvaW50bWVudCd9ID0gJ9CU0L7QtNCw0YLQuCDQv9C+0LTRltGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAn0JrQvtC70ZbRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmQgZGF0ZSd9ID0gJ9Ca0ZbQvdGG0LXQstCwINC00LDRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ9Cf0L7QstGC0L7RgNC40YLQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfQmtCw0LvQtdC90LTQsNGA0ZYg0L3QtSDQt9C90LDQudC00LXQvdGWLiDQkdGD0LTRjCDQu9Cw0YHQutCwLCDRgdC/0L7Rh9Cw0YLQutGDINC00L7QtNCw0LnRgtC1INC60LDQu9C10L3QtNCw0YAg0LfQsCDQtNC+0L/QvtC80L7Qs9C+0Y4g0YHRgtC+0YDRltC90LrQuCDQo9C/0YDQsNCy0LvRltC90L3RjyDQutCw0LvQtdC90LTQsNGA0Y/QvNC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50J30gPSAn0J/QvtC00ZbRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50J30gPSAn0KbQtSDQv9C+0LLRgtC+0YDRjtCy0LDQvdCwINC/0L7QtNGW0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/J30gPQogICAgICAgICfQktC4INGF0L7Rh9C10YLQtSDQt9C80ZbQvdC40YLQuCDRgtGW0LvRjNC60Lgg0YbQtdC5INCy0LjQv9Cw0LTQvtC6INGH0Lgg0LLRgdGWINCy0LjQv9Cw0LTQutC4Pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfQktGB0ZYg0LLQuNC/0LDQtNC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfQm9C40YjQtSDRhtC10Lkg0LLQuNC/0LDQtNC+0LonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ9Ca0LXRgNGD0LLQsNC90L3RjyDQutCw0LvQtdC90LTQsNGA0LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ9Cf0LXRgNC10LPQu9GP0LQg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQ2FsZW5kYXInfSA9ICfQlNC+0LTQsNGC0Lgg0L3QvtCy0LjQuSDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ9CU0L7QtNCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBBcHBvaW50bWVudHMnfSA9ICfQhtC80L/QvtGA0YLRg9Cy0LDRgtC4INCf0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgSW1wb3J0J30gPSAn0IbQvNC/0L7RgNGCINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ9Ci0YPRgiDQstC4INC80L7QttC10YLQtSDQt9Cw0LLQsNC90YLQsNC20LjRgtC4INGE0LDQudC7INC60L7QvdGE0ZbQs9GD0YDQsNGG0ZbRlywg0YnQvtCxINGW0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0LrQsNC70LXQvdC00LDRgCDQtNC+INCS0LDRiNC+0Zcg0YHQuNGB0YLQtdC80Lgu0KTQsNC50Lsg0L/QvtCy0LjQvdC10L0g0LHRg9GC0Lgg0LIgLnltbCDRhNC+0YDQvNCw0YLRliwg0YnQviDQtdC60YHQv9C+0YDRgtGD0Y7RgtGM0YHRjyDQvNC+0LTRg9C70LXQvCDRg9C/0YDQsNCy0LvRltC90L3RjyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfQl9Cw0LLQsNC90YLQsNC20LjRgtC4INC60L7QvdGE0ZbQs9GD0YDQsNGG0ZbRjiDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn0IbQvNC/0L7RgNGCINC60LDQu9C10L3QtNCw0YDRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaWx0ZXIgZm9yIGNhbGVuZGFycyd9ID0gJ9Ck0ZbQu9GM0YLRgCDQtNC70Y8g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ9CX0LDQu9C10LbQvdC+INCy0ZbQtCDQv9C+0LvRjyDQs9GA0YPQv9C4LCDRgdC40YHRgtC10LzQsCDQvdCw0LTQsNGB0YLRjCDQutC+0YDQuNGB0YLRg9Cy0LDRh9Cw0Lwg0LTQvtGB0YLRg9C/INC00L4g0LrQsNC70LXQvdC00LDRgNGPINCy0ZbQtNC/0L7QstGW0LTQvdC+INC00L4g0ZfRhSDRgNGW0LLQvdGPINC00L7RgdGC0YPQv9GDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAn0KLRltC70YzQutC4INC00LvRjyDRh9C40YLQsNC90L3Rjzog0LrQvtGA0LjRgdGC0YPQstCw0YfRliDQt9C80L7QttGD0YLRjCDQv9C10YDQtdCz0LvRj9C00LDRgtC4INGC0LAg0LXQutGB0L/QvtGA0YLRg9Cy0LDRgtC4INCy0YHRliDQv9C+0LTRltGXINCyINC60LDQu9C10L3QtNCw0YDRlic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ9Cf0LXRgNC10LzRltGB0YLQuNGC0Lgg0LI6INC60L7RgNC40YHRgtGD0LLQsNGH0ZYg0LzQvtC20YPRgtGMINC30LzRltC90Y7QstCw0YLQuCDQv9C+0LTRltGXINCyINC60LDQu9C10L3QtNCw0YDRliwg0LDQu9C1INCx0LXQtyDQt9C80ZbQvdC4INCy0LjQsdC+0YDRgyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlOiB1c2VycyBjYW4gY3JlYXRlIGFuZCBkZWxldGUgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ9Ch0YLQstC+0YDQuNGC0Lg6INC60L7RgNC40YHRgtGD0LLQsNGH0ZYg0LzQvtC20YPRgtGMINGB0YLQstC+0YDRjtCy0LDRgtC4INGWINCy0LjQtNCw0LvRj9GC0Lgg0LfRg9GB0YLRgNGW0YfRliDQsiDQutCw0LvQtdC90LTQsNGA0ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLid9ID0gJ9Cn0LjRgtCw0L3QvdGPL9C30LDQv9C40YE6INC60L7RgNC40YHRgtGD0LLQsNGH0ZYg0LzQvtC20YPRgtGMINGD0L/RgNCw0LLQu9GP0YLQuCDQutCw0LvQtdC90LTQsNGA0LXQvCDRgdCw0LzQvtGB0YLRltC50L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVUkwnfSA9ICfRiNC70Y/RhSBVUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0IGNhbGVuZGFyJ30gPSAn0JXQutGB0L/QvtGA0YLRg9Cy0LDRgtC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG93bmxvYWQgY2FsZW5kYXInfSA9ICfQl9Cw0LLQsNC90YLQsNC20LjRgtC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMJ30gPSAn0JrQvtC/0ZbRjtCy0LDRgtC4IFVSTCDQv9GD0LHQu9GW0YfQvdC+0LPQviDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ9CG0LzRjyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuJ30gPSAn0JrQsNC70LXQvdC00LDRgCDQtyDRgtCw0LrQuNC8INGW0LzRj9C8INGD0LbQtSDRltGB0L3Rg9GUJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Blcm1pc3Npb24gZ3JvdXAnfSA9ICfQk9GA0YPQv9CwINC00L7Qt9Cy0L7Qu9GW0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IEFwcG9pbnRtZW50cyd9ID0gJ9Cf0L7QtNGW0Zcg0LfQsNGP0LLQutC4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfQn9GA0LDQstC40LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuJ30gPQogICAgICAgICfQktC40LrQvtGA0LjRgdGC0L7QstGD0LnRgtC1INC+0L/RhtGW0Zcg0L3QuNC20YfQtSwg0YnQvtCxINC30LLRg9C30LjRgtC4LCDQtNC70Y8g0Y/QutC40YUg0YLRltC60LXRgtGW0LIg0L/QvtC00ZbRlyDQsdGD0LTRg9GC0Ywg0YHRgtCy0L7RgNC10L3RliDQsNCy0YLQvtC80LDRgtC40YfQvdC+Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgcXVldWUuJ30gPSAn0JHRg9C00Ywg0LvQsNGB0LrQsCDQstC40LHQtdGA0ZbRgtGMINC00ZbQudGB0L3RgyDRh9C10YDQs9GDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhdHRyaWJ1dGVzJ30gPSAn0J/QvtGI0YPQuiDQsNGC0YDQuNCx0YPRgtGW0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICfQktC40LfQvdCw0YfQtdC90L3RjyDQv9GA0LDQstC40Lsg0LTQu9GPINGB0YLQstC+0YDQtdC90L3RjyDQsNCy0YLQvtC80LDRgtC40YfQvdC40YUg0L/QvtC00ZbQuSDQsiDRhtGM0L7QvNGDINC60LDQu9C10L3QtNCw0YDRliDQvdCwINC/0ZbQtNGB0YLQsNCy0ZYg0LTQsNC90LjRhSDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfQlNC+0LTQsNGC0Lgg0L/RgNCw0LLQuNC70L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ9CR0ZbQu9GM0YjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn0JzQtdC90YjQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBuZXcgQXBwb2ludG1lbnQnfSA9ICfQlNC+0LTQsNGC0Lgg0L3QvtCy0YMg0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfQmtCw0LvQtdC90LTQsNGA0ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ9CU0YPQttC1INCx0LDQs9Cw0YLQviDQsNC60YLQuNCy0L3QuNGFINC60LDQu9C10L3QtNCw0YDRltCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4nfSA9CiAgICAgICAgJ9CR0YPQtNGMINC70LDRgdC60LAg0LLQuNC80LrQvdGW0YLRjCDQtNC10Y/QutGWINCw0LHQviDQt9Cx0ZbQu9GM0YjRltGC0Ywg0LvRltC80ZbRgiDQsiDQutC+0L3RhNGW0LPRg9GA0LDRhtGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ9Ci0LjQttC00LXQvdGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIE1vbnRoJ30gPSAn0J7Qs9C70Y/QtCDQvNGW0YHRj9GG0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZWxpbmUgV2Vlayd9ID0gJ9Ce0LPQu9GP0LQg0YLQuNC20L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBEYXknfSA9ICfQntCz0LvRj9C0INC00L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn0J/QtdGA0LXQudGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlzbWlzcyd9ID0gJ9CS0ZbQtNGF0LjQu9C40YLQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93J30gPSAn0J/QvtC60LDQt9Cw0YLQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ9CR0LDQt9C+0LLQsCDRltC90YTQvtGA0LzQsNGG0ZbRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfQlNCw0YLQsC/Qp9Cw0YEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0LLRgdGC0LDQvdC+0LLRltGC0Ywg0YbQtSDQv9C10YDQtdC0INC00LDRgtC+0Y4g0LfQsNC10YDRiNC10L3QvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLid9ID0gJ9CR0YPQtNGMINC70LDRgdC60LAg0LLRgdGC0LDQvdC+0LLRltGC0Ywg0YbQtSDQv9C10YDQtdC0INC00LDRgtC+0Y4g0L/QvtGH0LDRgtC60YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ9Cm0LXQuSDQstC40L/QsNC00L7QuiDQv9C+0LLRgtC+0YDRjtCy0LDQvdC+0Zcg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Cd0LDRgtC40YHQvdGW0YLRjCDRgdGO0LTQuCwg0YnQvtCxINC/0L7QsdCw0YfQuNGC0Lgg0LHQsNGC0YzQutGW0LLRgdGM0LrRgyDQn9C+0LTRltGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ9Cd0LDRgtC40YHQvdGW0YLRjCDRgtGD0YIg0LTQu9GPINGA0LXQtNCw0LPRg9Cy0LDQvdC90Y8g0LHQsNGC0YzQutGW0LLRgdGM0LrQvtCz0L4g0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZyZXF1ZW5jeSd9ID0gJ9Cn0LDRgdGC0L7RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAn0JrQvtC20L3Rlic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGl2ZSBwb2ludCBvZiB0aW1lJ30gPSAn0JLRltC00L3QvtGB0L3QsCDRh9Cw0YHQvtCy0LAg0YLQvtGH0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJ30gPQogICAgICAgICfQktC4INCy0L/QtdCy0L3QtdC90ZYsINGJ0L4g0YXQvtGH0LXRgtC1INCy0LjQtNCw0LvQuNGC0Lgg0YbRjiDQv9C+0LTRltGOPyDQptGPINC+0L/QtdGA0LDRhtGW0Y8g0L3QtSDQvNC+0LbQtSDQsdGD0YLQuCDRgdC60LDRgdC+0LLQsNC90LAnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRJbXBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IEltcG9ydCd9ID0gJ9CG0LzQv9C+0YDRgtGD0LLQsNGC0Lgg0J/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGxvYWRlZCBmaWxlIG11c3QgYmUgaW4gdmFsaWQgaUNhbCBmb3JtYXQgKC5pY3MpLid9ID0gJ9CX0LDQstCw0L3RgtCw0LbQtdC90LjQuSDRhNCw0LnQuyDQv9C+0LLQuNC90LXQvSDQsdGD0YLQuCDQsiDQv9GA0LDQstC40LvRjNC90L7QvNGDIGljYWwg0YTQvtGA0LzQsNGC0ZYgKC5pY3MpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ9Cv0LrRidC+INC+0LHRgNCw0L3QuNC5INC60LDQu9C10L3QtNCw0YAg0L3QtSDQsiDRgdC/0LjRgdC60YMsINC/0LXRgNC10LrQvtC90LDQudGC0LXRgdGPINCx0YPQtNGMINC70LDRgdC60LAsINGJ0L4g0YMg0LLQsNGBINGUINC/0L7QstC90L7QstCw0LbQtdC90L3RjyDQvdCwINGB0YLQstC+0YDQtdC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ9Ce0L3QvtCy0LjRgtC4INGW0YHQvdGD0Y7Rh9GWINCf0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uJ30gPQogICAgICAgICfQktGB0ZYg0ZbRgdC90YPRjtGH0ZYg0L/QvtC00ZbRlyDQsiDQutCw0LvQtdC90LTQsNGA0ZYg0Lcg0YLQsNC60LjQvCDQttC1IFVuaXF1ZUlEINCx0YPQtNGD0YLRjCDQv9C10YDQtdC30LDQv9C40YHQsNC90ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyJ30gPSAn0JfQsNCy0LDQvdGC0LDQttC40YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhcHBvaW50bWVudHMnfSA9ICfQhtC80L/QvtGA0YLRg9Cy0LDRgtC4INCf0L7QtNGW0ZcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50RGFzaGJvYXJkQXBwb2ludG1lbnRDYWxlbmRhcgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmV3IEFwcG9pbnRtZW50J30gPSAn0J3QvtCy0LAg0J/QvtC00ZbRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAn0KHQutC+0YDQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyc1IGRheXMnfSA9ICc1INC00L3RltCyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vdGlmaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzISd9ID0gJ9CG0LzRjyDQvdCw0LPQsNC00YPQstCw0L3QvdGPINCy0LbQtSDRltGB0L3Rg9GUJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnfSA9ICfQkNCz0LXQvdGCICjRgNC10YHRg9GA0YHQuCksINGP0LrRliDQstC40LHQuNGA0LDRjtGC0YzRgdGPINCyINGA0LDQvNC60LDRhSDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHRliDQsNCz0LXQvdGC0Lgg0Lcg0LTQvtC30LLQvtC70L7QvCDQvdCwINGH0LjRgtCw0L3QvdGPINC00LvRjyDQv9C+0LTRltGXICjQutCw0LvQtdC90LTQsNGAKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ9CS0YHRliDQsNCz0LXQvdGC0LgsINGP0LrRliDQvNCw0Y7RgtGMINC00L7Qt9Cy0ZbQuyDQvdCwINC30LDQv9C40YEg0LTQu9GPINC/0L7QtNGW0LkgKNC60LDQu9C10L3QtNCw0YApJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGNyZWF0ZSBDYWxlbmRhciEnfSA9ICfQodC40YHRgtC10LzQsCDQvdC1INC80L7QttC1INGB0YLQstC+0YDQuNGC0Lgg0LrQsNC70LXQvdC00LDRgCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXJJRCEnfSA9ICfQndC10LzQsNGUIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAn0JLQuCDQvdC1INC80LDRlNGC0LUg0LTQvtGB0YLRg9C/0YMg0LTQviDRhtGM0L7Qs9C+INC60LDQu9C10L3QtNCw0YDRjyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWRpdCBDYWxlbmRhcid9ID0gJ9Cg0LXQtNCw0LPRg9Cy0LDRgtC4INC60LDQu9C10L3QtNCw0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ9Cf0L7QvNC40LvQutCwINC/0YDQuCDQvtC90L7QstC70LTQtdC90L3RliDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGRuXCd0IHJlYWQgY2FsZW5kYXIgY29uZmlndXJhdGlvbiBmaWxlLid9ID0gJ9Cd0LUg0LzQvtC20LvQuNCy0L4g0L/RgNC+0YfQuNGC0LDRgtC4INGE0LDQudC7INC60L7QvdGE0ZbQs9GD0YDQsNGG0ZbRlyDQutCw0LvQtdC90LTQsNGA0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGZpbGUgaXMgdmFsaWQuJ30gPSAn0JHRg9C00Ywg0LvQsNGB0LrQsCDQv9C10YDQtdC60L7QvdCw0LnRgtC10YHRjCwg0YnQviDRhNCw0Lkg0YTQsNC50Lsg0L3QtSDQv9C+0YjQutC+0LTQttC10L3QuNC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBpbXBvcnQgdGhlIGNhbGVuZGFyISd9ID0gJ9Cd0LUg0LzQvtC20LvQuNCy0L4g0ZbQvNC/0L7RgNGC0YPQstCw0YLQuCDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGltcG9ydGVkISd9ID0gJ9Ca0LDQu9C10L3QtNCw0YAg0ZbQvNC/0L7RgNGC0L7QstCw0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkIENhbGVuZGFySUQhJ30gPSAn0J/QvtGC0YDQtdGM0YPRlNGC0YzRgdGPIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJldHJpZXZlIGRhdGEgZm9yIGdpdmVuIENhbGVuZGFySUQnfSA9ICfQndC1INC80L7QttC70LjQstC+INC+0YLRgNC40LzQsNGC0Lgg0LTQsNC90ZYg0LTQu9GPIENhbGVuZGFySUQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLid9ID0gJ9Cj0YHQv9GW0YjQvdC+INGW0LzQv9C+0YDRgtC+0LLQsNC90L4gJXMg0L/QvtC00ZbQuSDQsiDQutCw0LvQtdC90LTQsNGAICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNSDRhdCy0LjQu9C40L0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKzE1IG1pbnV0ZXMnfSA9ICcrMTUg0YXQstC40LvQuNC9JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyszMCBtaW51dGVzJ30gPSAnKzMwINGF0LLQuNC70LjQvSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzEg0LPQvtC00LjQvdCwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsIGFwcG9pbnRtZW50cyd9ID0gJ9CS0YHRliDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ9Cf0L7QtNGW0ZcsINC/0L7QstGP0LfQsNC90ZYg0LfRliDQvNC90L7Rjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAn0J/QvtC60LDQt9GD0Y7RgtGM0YHRjyDRgtGW0LvRjNC60Lgg0L/QvtCy0Y/Qt9Cw0L3RliDQtyDQstCw0LzQuCDQv9C+0LTRltGXLiDQl9C80ZbQvdC40YLQuCDQvdCw0LvQsNGI0YLRg9Cy0LDQvdC90L3Rjy4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBub3QgZm91bmQhJ30gPSAn0J/QvtC00ZbRjyDQvdC1INC30L3QsNC50LTQtdC90LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldmVyJ30gPSAn0J3RltC60L7Qu9C4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IERheSd9ID0gJ9Cp0L7QtNC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ9Cp0L7RgtC40LbQvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5IE1vbnRoJ30gPSAn0KnQvtC80ZbRgdGP0YbRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn0KnQvtGA0L7QutGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ9Ca0L7RgNC40YHRgtGD0LLQsNGG0YzQutC40Lkg0LLQuNCx0ZbRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ9Cp0L7QtNC10L3QvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dlZWtseSd9ID0gJ9Cp0L7RgtC40LbQvdC10LLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb250aGx5J30gPSAn0KnQvtC80ZbRgdGP0YfQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1llYXJseSd9ID0gJ9Cp0L7RgNGW0YfQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2V2ZXJ5J30gPSAn0LrQvtC20L3Rlic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgJXMgdGltZShzKSd9ID0gJ9C00LvRjyAlcyDRgNCw0LfRgyjRltCyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICfQtNC+0LrQuC4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydmb3IgLi4uIHRpbWUocyknfSA9ICfQtNC+IC4uLiDRgNCw0LfRgyjRltCyKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAlcyd9ID0gJ9C00L7QutC4ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG5vdGlmaWNhdGlvbid9ID0gJ9Cd0LXQvNCw0ZQg0L/QvtCy0ZbQtNC+0LzQu9C10L3RjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBtaW51dGUocykgYmVmb3JlJ30gPSAnJXMg0YXQstC40LvQuNC9INC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgaG91cihzKSBiZWZvcmUnfSA9ICclcyDQs9C+0LTQuNC9INC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJXMgZGF5KHMpIGJlZm9yZSd9ID0gJyVzINC00L3RlijRltCyKSDQtNC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIHdlZWsgYmVmb3JlJ30gPSAnJXMg0YLQuNC20L3RltCyINC00L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnfSA9ICfQv9C10YDQtdC0INC/0L7Rh9Cw0YLQutC+0Lwg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCd9ID0gJ9C/0ZbRgdC70Y8g0L/QvtGH0LDRgtC60YMg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydiZWZvcmUgdGhlIGFwcG9pbnRtZW50IGVuZHMnfSA9ICfQv9C10YDQtdC0INC30LDQstC10YDRiNC10L3QvdGP0Lwg0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICfQv9GW0YHQu9GPINC30LDQstC10YDRiNC10L3QvdGPINC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfQndC10LzQsNGUINC/0L7QstC90L7QstCw0LbQtdC90YwhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nhbm5vdCBkZWxldGUgdGlja2V0IGFwcG9pbnRtZW50ISd9ID0gJ9Cd0LUg0LzQvtC20LvQuNCy0L4g0LLQuNC00LDQu9C40YLQuCDQv9C+0LTRltGOINC30LDRj9Cy0LrQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBwZXJtaXNzaW9ucyEnfSA9ICfQndC10LzQsNGUINC/0L7QstC90L7QstCw0LLQttC10L3RjCEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRJbXBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zJ30gPSAn0J3QtdC80LDRlCDQv9C+0LLQvdC+0LLQsNC20LXQvdGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlISd9ID0gJ9Ch0LjRgdGC0LXQvNCwINC90LUg0LzQvtC20LUg0ZbQvNC/0L7RgNGC0YPQstCw0YLQuCDRhNCw0LnQuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgY2hlY2sgdGhlIGxvZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nfSA9ICfQkdGD0LTRjCDQu9Cw0YHQutCwINC/0LXRgNC10LLRltGA0YLQtSDQu9C+0LMg0LTQu9GPINC00L7QtNCw0YLQutC+0LLQvtGXINGW0L3RhNC+0YDQvNCw0YbRltGXJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50TGlzdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnKyVkIG1vcmUnfSA9ICcrJWQg0LHRltC70YzRiNC1JzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn0L3QtdC80LDRlCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBzdWNoIHVzZXIhJ30gPSAn0JLRltC00YHRg9GC0L3RltC5INGC0LDQutC40Lkg0LrQvtGA0LjRgdGC0YPQstCw0YcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICfQpdC40LHQvdC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIFVSTCEnfSA9ICfQpdC40LHQvdC1INC/0L7RgdC40LvQsNC90L3Rjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaGVyZSB3YXMgYW4gZXJyb3IgZXhwb3J0aW5nIHRoZSBjYWxlbmRhciEnfSA9ICfQodGC0LDQu9Cw0YHRjCDQv9C+0LzQuNC70LrQsCDQv9GW0LQg0YfQsNGBINC10LrRgdC/0L7RgNGC0YMg0LrQsNC70LXQvdC00LDRgNGPJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRGFzaGJvYXJkL0FwcG9pbnRtZW50Q2FsZW5kYXIucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZnJlc2ggKG1pbnV0ZXMpJ30gPSAn0J7QvdC+0LLQu9C10L3QvdGPICjRhdCy0LjQu9C40L3QuCknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBDYWxlbmRhciBvdmVydmlldyBwYWdlLid9ID0gJ9Ch0YLQvtGA0ZbQvdC60LAg0L/QtdGA0LXQs9C70Y/QtNGDINCf0L7QtNGW0Lkg0LrQsNC70LXQvdC00LDRgNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICfQn9C+0LLRltC00L7QvNC70LXQvdC90Y8g0L/QviDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbGVuZGFyIGV2ZW50IG1vZHVsZSB0aGF0IHByZXBhcmVzIG5vdGlmaWNhdGlvbiBlbnRyaWVzIGZvciBhcHBvaW50bWVudHMuJ30gPQogICAgICAgICfQvNC+0LTRg9C70Ywg0L/QvtC00ZbQuSDQutCw0LvQtdC90LTQsNGA0Y8sINGP0LrQuNC5INCz0L7RgtGD0ZQg0LfQsNC/0LjRgdC4INC/0L7QstGW0LTQvtC80LvQtdC90L3RjyDQtNC70Y8g0L/QvtC00ZbQuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAn0LzQvtC00YPQu9GMINC/0L7QtNGW0Lkg0LrQsNC70LXQvdC00LDRgNGPLCDRj9C60LjQuSDQvtC90L7QstC70Y7RlCDRgtGW0LrQtdGCINC3INC00LDQvdC40LzQuCDQstGW0LQg0L/QvtC00ZbQuSDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPSAn0JXQutGA0LDQvSDRgNC10LTQsNCz0YPQstCw0L3QvdGPINC/0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdCd9ID0gJ9Cf0LXRgNC10LvRltC6INC/0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbGlzdC4nfSA9ICfQn9C10YDQtdC70ZbQuiDQv9C+0LTRltC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICfQn9C+0LLRltC00L7QvNC70LXQvdC90Y8g0L/QviDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyd9ID0gJ9Cf0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbWFuYWdlIHNjcmVlbi4nfSA9ICfQldC60YDQsNC9INC60LXRgNGD0LLQsNC90L3RjyDQutCw0LvQtdC90LTQsNGA0LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaG9vc2UgZm9yIHdoaWNoIGtpbmQgb2YgYXBwb2ludG1lbnQgY2hhbmdlcyB5b3Ugd2FudCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuJ30gPQogICAgICAgICfQktC40LHRgNCw0YLQuCDRj9C60LjQuSDQstC40LQg0L/QvtCy0ZbQtNC+0LzQu9C10L3QvdGPINC/0YDQviDQt9C80ZbQvdC4INC/0L7QtNGW0Zcg0JLQuCDRhdC+0YfQtdGC0LUg0L7RgtGA0LjQvNGD0LLQsNGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgbmV3IGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpbmtlZCB0byB0aGlzIHRpY2tldCd9ID0gJ9Ch0YLQstC+0YDQuNGC0Lgg0L3QvtCy0LjQuSDQutCw0LvQtdC90LTQsNGAINC/0L7QtNGW0Lkg0L/QvtCy0Y/Qt9Cw0L3QuNC5INC3INGG0ZbRlNGOINC30LDRj9Cy0LrQvtGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn0KHRgtCy0L7RgNC40YLQuCDRliDQutC10YDRg9Cy0LDRgtC4INC/0L7QstGW0LTQvtC80LvQtdC90L3Rj9C80Lgg0L/RgNC+INC/0L7QtNGW0ZcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIG5ldyBhcHBvaW50bWVudC4nfSA9ICfQodGC0LLQvtGA0LjRgtC4INC90L7QstGDINC/0L7QtNGW0Y4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHdoaWNoIGNvbHVtbnMgYXJlIHNob3duIGluIHRoZSBsaW5rZWQgYXBwb2ludG1lbnQgd2lkZ2V0IChMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IikuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBBdmFpbGFibGUsIDIgPSBFbmFibGVkIGJ5IGRlZmF1bHQuJ30gPQogICAgICAgICfQl9Cw0LTQsNGUINGP0LrRliDQutC+0LvQvtC90LrQuCDQsdGD0LTRg9GC0Ywg0L/QvtC60LDQt9Cw0L3RliDQsiDQv9C+0LLRj9C30LDQsNC90L7QvNGDINCy0ZbQtNC20LXRgtGWINC/0L7QtNGW0LkoTGlua09iamVjdDo6Vmlld01vZGUgPSAiY29tcGxleCIpLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gQXZhaWxhYmxlLCAyID0gRW5hYmxlZCBieSBkZWZhdWx0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGFuIGljb24gd2l0aCBsaW5rIHRvIHRoZSBnb29nbGUgbWFwIHBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4uJ30gPQogICAgICAgICfQktC40LfQvdCw0YfQsNGUINGW0LrQvtC90LrRgyDQtyDQv9C+0YHQuNC70LDQvdC90Y/QvCDQvdCwINGB0YLQvtGA0ZbQvdC60YMg0LrQsNGA0YIgR29vZ2xlINC3INC/0L7RgtC+0YfQvdC40Lwg0LzRltGB0YbQtdC30L3QsNGF0L7QtNC20LXQvdC90Y/QvCDRgyDQstGW0LrQvdGWINGA0LXQtNCw0LPRg9Cy0LDQvdC90Y8g0L/QvtC00ZbRlyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ9CS0LjQt9C90LDRh9Cw0ZQg0YLQuNC/0Lgg0L7QsdGU0LrRgtGW0LIg0L/QvtC00ZbQuSwg0Y/QutGWINCx0YPQtNGD0YLRjCDQvtCx0YDQvtCx0LvRj9GC0LjRgdGPINC30LAg0LTQvtC/0L7QvNC+0LPQvtGOIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ9CS0LjQt9C90LPQsNGH0LDRlCDQv9C10YDQtdC70ZbQuiDQv9C+0YDQsNC80LXRgtGA0ZbQsiDRj9C60ZYg0LzQvtC20YPRgtGMINCx0YPRgtC4INCyINC+0L/RhtGW0Y/RhSDQv9C+0YjRg9C60YMg0L/QviDQt9Cw0Y/QstGG0ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGR5bmFtaWMgZmllbGQgZGF0ZSB0aW1lLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGJhY2tlbmQgZm9yIHRpY2tldCBlc2NhbGF0aW9uIHRpbWUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IHBlbmRpbmcgdGltZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgcGx1Z2luIGZvciBjYWxlbmRhciBhcHBvaW50bWVudHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWNGaWVsZF8lcyd9ID0gJ0R5bmFtaWNGaWVsZF8lcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IGFwcG9pbnRtZW50J30gPSAn0KDQtdC00LDQs9GD0LLQsNGC0Lgg0L/QvtC00ZbRjic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGaXJzdCByZXNwb25zZSB0aW1lJ30gPSAn0KfQsNGBINC/0LXRgNGI0L7RlyDQstGW0LTQv9C+0LLRltC00ZYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFwcG9pbnRtZW50cyBzY3JlZW4uJ30gPSAn0IbQvNC/0L7RgNGC0YPQstCw0YLQuCDQtdGA0LrQsNC9INC/0L7QtNGW0LknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAn0J/QvtCy0Y/Qt9Cw0YLQuCDQv9C+0LTRltGXINGWINC30LDRj9Cy0LrQuCDQtyAiTm9ybWFsIiDRgtC40L/QvtC8INC30LLRj9C30LrRgyAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgYXBwb2ludG1lbnQgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ9Cf0LXRgNC10LvRltC6INCy0YHRltGFINC/0L7QtNGW0Lkg0LTQu9GPINCy0ZbQtNC+0LHRgNCw0LbQsNGO0YLRjNGB0Y8g0LIgR1VJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGNhbGVuZGFyIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfQn9C10YDQtdC70ZbQuiDQstGB0ZbRhSDQv9C+0LTRltC5INC60LDQu9C10L3QtNCw0YDRjyDQtNC70Y8g0LLRltC00L7QsdGA0LDQttC10L3QvdGPINCyIEdVSSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UgZGlmZmVyZW50IGNhbGVuZGFycy4nfSA9ICfQmtC10YDRg9Cy0LDRgtC4INGA0ZbQt9C90LjQvNC40Lwg0LrQsNC70LXQvdC00LDRgNGP0LzQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfQn9C10YDQtdCz0LvRj9C90YPRgtC4INCy0YHRliDQv9C+0LTRltGXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BlbmRpbmcgdGltZSd9ID0gJ9GH0LDRgSwg0YnQviDQt9Cw0LvQuNGI0LjQstGB0Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCd9ID0gJ9Cf0L7RiNGD0Log0YPRgtC40LvRltGC0LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfQo9GC0LjQu9GW0YLQsCDQv9C+0YjRg9C60YMg0LzQvtC00YPQu9GPINC00LvRjyDQsNCy0YLQvtC30LDQv9C+0LLQvdC10L3QvdGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBDYWxlbmRhcid9ID0gJ9Cf0YPQsdC70ZbRh9C90LjQuSDQutCw0LvQtdC90LTQsNGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICfQn9GD0LHQu9GW0YfQvdC40Lkg0LrQsNC70LXQvdC00LDRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyd9ID0gJ9Cf0LXRgNC10LPQu9GP0LQg0YDQtdGB0YPRgNGB0ZbQsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSBPdmVydmlldyAoT1RSUyBCdXNpbmVzcyBTb2x1dGlvbuKEoiknfSA9ICfQn9C10YDQtdCz0LvRj9C0INGA0LXRgdGD0YDRltCyIChPVFJTIEJ1c2luZXNzIFNvbHV0aW9u4oSiKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ9Cn0LDRgSDQstC40YDRltGI0LXQvdC90Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHJhbnNwb3J0IHNlbGVjdGlvbiBmb3IgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucy4nfSA9ICfQktC40LHRltGAINGB0L/QvtGB0L7QsdGDINC00LvRjyDQstGW0LTQv9GA0LDQstC60Lgg0L/QvtCy0ZbQtNC+0LzQu9C10L3RjCDQv9C+INC/0L7QtNGW0Y/RhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICfQotGA0LjQs9C10YDQuCDQtNC70Y8g0LTQvtC00LDQstCw0L3QvdGPINGH0Lgg0LDQstGC0L7QvNCw0YLQuNGH0L3QvtCz0L4g0L7QvdC+0LLQu9C10L3QvdGPINC/0L7QtNGW0Lkg0L3QsCDQvtGB0L3QvtCy0ZYg0L/QtdCy0L3QuNGFINGH0LDRgdGW0LIg0YLRltC60LXRgtGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwZGF0ZSB0aW1lJ30gPSAn0KfQsNGBINC+0L3QvtCy0LvQtdC90L3Rjyc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fT1RSU0FwcG9pbnRtZW50Q2FsZW5kYXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFOb3RpZmljYXRpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IHJlbWluZGVyIG5vdGlmaWNhdGlvbid9ID0gJ+mihOe6puaPkOmGkumAmuefpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLid9ID0KICAgICAgICAn5q+P5b2T5L2g55qE5LiA5Liq6aKE57qm5Yiw6L6+5o+Q6YaS5pe26Ze05pe277yM5L2g5bCx5Lya5pS25Yiw5LiA5Liq6YCa55+l44CCJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbiBNYW5hZ2VtZW50J30gPSAn6aKE57qm6YCa55+l566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0hlcmUgeW91IGNhbiB1cGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW1wb3J0IGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMgdG8geW91ciBzeXN0ZW0uIFRoZSBmaWxlIG5lZWRzIHRvIGJlIGluIC55bWwgZm9ybWF0IGFzIGV4cG9ydGVkIGJ5IHRoZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gbW9kdWxlLid9ID0KICAgICAgICAn5Zyo6L+Z6YeM5L2g5Y+v5Lul5LiK5Lyg5LiA5Liq6YWN572u5paH5Lu25Lul5L6/5a+85YWl6aKE57qm6YCa55+l77yM5b+F6aG75piv5LiO6aKE57qm6YCa55+l5qih5Z2X5a+85Ye655qE5paH5Lu25LiA5qC355qELnltbOagvOW8j+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGV2ZW50cyB3aWxsIHRyaWdnZXIgdGhpcyBub3RpZmljYXRpb24uIEFuIGFkZGl0aW9uYWwgYXBwb2ludG1lbnQgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIGJlbG93IHRvIG9ubHkgc2VuZCBmb3IgYXBwb2ludG1lbnRzIHdpdGggY2VydGFpbiBjcml0ZXJpYS4nfSA9CiAgICAgICAgJ+WcqOi/memHjOS9oOWPr+S7pemAieaLqeWTquS4quS6i+S7tuWwhuS8muinpuWPkei/meS4qumAmuefpe+8jOS4i+mdoueahOmihOe6pui/h+a7pOWZqOWPr+S7pemAieaLqeespuWQiOeJueWumuadoeS7tueahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBGaWx0ZXInfSA9ICfov4fmu6TpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbSd9ID0gJ+WboumYnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNvdXJjZSd9ID0gJ+i1hOa6kCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZnkgdXNlciBqdXN0IG9uY2UgcGVyIGRheSBhYm91dCBhIHNpbmdsZSBhcHBvaW50bWVudCB1c2luZyBhIHNlbGVjdGVkIHRyYW5zcG9ydC4nfSA9CiAgICAgICAgJ+avj+S4qumihOe6pueahOmAmuefpeS9v+eUqOmAieaLqeeahOaWueW8j+S4gOWkqeWPquWPkemAgeS4gOasoeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3RpZmljYXRpb25zIGFyZSBzZW50IHRvIGFuIGFnZW50Lid9ID0gJ+WPkemAgee7meacjeWKoeS6uuWRmOeahOmAmuefpeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuJ30gPSAn6I635Y+W6aKE57qm55qE5YmNMjDkuKrlrZfnrKbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBhcHBvaW50bWVudCBhdHRyaWJ1dGUnfSA9ICfojrflj5bpooTnuqbnmoTlsZ7mgKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG8gZ2V0IHRoZSBjYWxlbmRhciBhdHRyaWJ1dGUnfSA9ICfojrflj5bml6XljobnmoTlsZ7mgKcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWdlbmRhIE92ZXJ2aWV3J30gPSAn5pel56iL5qaC6KeIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBDYWxlbmRhcnMnfSA9ICfnrqHnkIbml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIEFwcG9pbnRtZW50J30gPSAn5re75Yqg6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9yJ30gPSAn6aKc6ImyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuZCBkYXRlJ30gPSAn57uT5p2f5pel5pyfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGVhdCd9ID0gJ+mHjeWkjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuJ30gPQogICAgICAgICfmsqHmnInmib7liLDml6XljobjgILor7flhYjpgJrov4fnrqHnkIbml6XljobnlYzpnaLmt7vliqDkuIDkuKrml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQnfSA9ICfpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBpcyBhIHJlcGVhdGluZyBhcHBvaW50bWVudCd9ID0gJ+i/meaYr+S4gOS4qumHjeWkjeeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nfSA9CiAgICAgICAgJ+S9oOaDs+S7hee8lui+keacrOasoemihOe6pueahOaXtumXtOi/mOaYr+mHjeWkjemihOe6puaJgOacieeahOaXtumXtO+8nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgb2NjdXJyZW5jZXMnfSA9ICfmiYDmnInpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSnVzdCB0aGlzIG9jY3VycmVuY2UnfSA9ICfku4XmnKzmrKEnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgTWFuYWdlbWVudCd9ID0gJ+aXpeWOhueuoeeQhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBPdmVydmlldyd9ID0gJ+aXpeWOhuamguiniCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IENhbGVuZGFyJ30gPSAn5re75Yqg5paw55qE5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYWxlbmRhcid9ID0gJ+a3u+WKoOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgQXBwb2ludG1lbnRzJ30gPSAn5a+85YWl6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIEltcG9ydCd9ID0gJ+aXpeWOhuWvvOWFpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIZXJlIHlvdSBjYW4gdXBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGltcG9ydCBhIGNhbGVuZGFyIHRvIHlvdXIgc3lzdGVtLiBUaGUgZmlsZSBuZWVkcyB0byBiZSBpbiAueW1sIGZvcm1hdCBhcyBleHBvcnRlZCBieSBjYWxlbmRhciBtYW5hZ2VtZW50IG1vZHVsZS4nfSA9CiAgICAgICAgJ+S9oOWPr+S7peWcqOi/memHjOS4iuS8oOS4gOS4qumFjee9ruaWh+S7tuadpeWvvOWFpeS4gOS4quaXpeWOhuWIsOezu+e7n+S4reOAgui/meS4quaWh+S7tuW/hemhu+aYr+exu+S8vOmAmui/h+aXpeWOhueuoeeQhuaooeWdl+WvvOWHuueahC55bWzmoLzlvI/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24nfSA9ICfkuIrkvKDml6XljobphY3nva4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IENhbGVuZGFyJ30gPSAn5a+85YWl5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbHRlciBmb3IgY2FsZW5kYXJzJ30gPSAn6L+H5ruk5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4nfSA9CiAgICAgICAgJ+agueaNrue7hOWtl+aute+8jOezu+e7n+mAmui/h+eUqOaIt+eahOadg+mZkOe6p+WIq+adpeWFgeiuuOeUqOaIt+iDveWkn+iuv+mXrueahOaXpeWOhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFkIG9ubHk6IHVzZXJzIGNhbiBzZWUgYW5kIGV4cG9ydCBhbGwgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhci4nfSA9CiAgICAgICAgJ+WPquivu++8mueUqOaIt+WPr+S7peeci+WIsOWSjOWvvOWHuuaXpeWOhuS4reaJgOacieeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb3ZlIGludG86IHVzZXJzIGNhbiBtb2RpZnkgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciwgYnV0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNhbGVuZGFyIHNlbGVjdGlvbi4nfSA9CiAgICAgICAgJ+i9rOenu++8mueUqOaIt+WPr+S7peS/ruaUueaXpeWOhuS4reeahOmihOe6pu+8jOS9huS4jeiDveS/ruaUuemAieaLqeeahOaXpeWOhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLid9ID0KICAgICAgICAn5Yib5bu677ya55So5oi35Y+v5Lul5Yib5bu65ZKM5Yig6Zmk5pel5Y6G5Lit55qE6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYWQvd3JpdGU6IHVzZXJzIGNhbiBtYW5hZ2UgdGhlIGNhbGVuZGFyIGl0c2VsZi4nfSA9ICfor7vlhpnvvJrnlKjmiLflj6/ku6XnrqHnkIbml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVVJMJ30gPSAn572R5Z2AJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBjYWxlbmRhcid9ID0gJ+WvvOWHuuaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3dubG9hZCBjYWxlbmRhcid9ID0gJ+S4i+i9veaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwnfSA9ICflpI3liLblhazlhbHml6XljobnvZHlnYAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgbmFtZSd9ID0gJ+aXpeWOhuWQjeensCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4nfSA9ICflt7LmnInlkIzlkI3nmoTml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVybWlzc2lvbiBncm91cCd9ID0gJ+adg+mZkOe7hCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgQXBwb2ludG1lbnRzJ30gPSAn5bel5Y2V6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1J1bGUnfSA9ICfop4TliJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXNlIG9wdGlvbnMgYmVsb3cgdG8gbmFycm93IGRvd24gZm9yIHdoaWNoIHRpY2tldHMgYXBwb2ludG1lbnRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkLid9ID0KICAgICAgICAn5L2/55So5LiL6Z2i55qE6YCJ6aG55p2l5YeP5bCR6Ieq5Yqo5Yib5bu655qE5bel5Y2V6aKE57qm44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBxdWV1ZS4nfSA9ICfor7fpgInmi6nkuIDkuKrmnInmlYjnmoTpmJ/liJfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGF0dHJpYnV0ZXMnfSA9ICfmkJzntKLlsZ7mgKcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuJ30gPQogICAgICAgICflrprkuYnlnKjov5nkuKrml6XljobkuK3ln7rkuo7lt6XljZXmlbDmja7oh6rliqjliJvlu7rpooTnuqbnmoTop4TliJnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFJ1bGUnfSA9ICfmt7vliqDop4TliJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9yZSd9ID0gJ+abtOWkmic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMZXNzJ30gPSAn5pu05bCRJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIG5ldyBBcHBvaW50bWVudCd9ID0gJ+a3u+WKoOaWsOeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhcnMnfSA9ICfml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycyd9ID0gJ+a/gOa0u+eahOaXpeWOhuWkquWkmic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJ30gPQogICAgICAgICfor7flhbPpl63kuIDkupvml6XljobmiJbogIXlnKjphY3nva7kuK3lop7liqDpmZDliLbmlbDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV2Vlayd9ID0gJ+WRqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBNb250aCd9ID0gJ+aciOaXtumXtOihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lbGluZSBXZWVrJ30gPSAn5ZGo5pe26Ze06KGoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWVsaW5lIERheSd9ID0gJ+avj+aXpeaXtumXtOihqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKdW1wJ30gPSAn6Lez6L2sJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Rpc21pc3MnfSA9ICflj5bmtognOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyd9ID0gJ+aYvuekuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydCYXNpYyBpbmZvcm1hdGlvbid9ID0gJ+WfuuacrOS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlL1RpbWUnfSA9ICfml6XmnJ8gLyDml7bpl7QnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50QXBwb2ludG1lbnRFZGl0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYmVmb3JlIEVuZCBkYXRlLid9ID0gJ+ivt+iuvue9rui/meS4quWAvOS4uue7k+adn+aXpeacn+S5i+WJjeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2Ugc2V0IHRoaXMgdG8gdmFsdWUgYWZ0ZXIgU3RhcnQgZGF0ZS4nfSA9ICfor7forr7nva7ov5nkuKrlgLzkuLrlvIDlp4vml6XmnJ/kuYvlkI7jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50Lid9ID0gJ+i/meaYr+S4gOS4qumHjeWkjemihOe6pueahOS4gOasoeaXtumXtOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIHNlZSB0aGUgcGFyZW50IGFwcG9pbnRtZW50Lid9ID0gJ+eCueWHu+i/memHjOafpeeci+eItumihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDbGljayBoZXJlIHRvIGVkaXQgdGhlIHBhcmVudCBhcHBvaW50bWVudC4nfSA9ICfngrnlh7vov5nph4znvJbovpHniLbpooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJlcXVlbmN5J30gPSAn6aKR546HJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V2ZXJ5J30gPSAn5q+PJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0aXZlIHBvaW50IG9mIHRpbWUnfSA9ICfnm7jlr7nnmoTml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLid9ID0KICAgICAgICAn5L2g55yf55qE6KaB5Yig6Zmk6L+Z5Liq6aKE57qm5ZCX77yf6L+Z5Liq5pON5L2c5peg5rOV5Zue6YCA44CCJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50SW1wb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBJbXBvcnQnfSA9ICfpooTnuqblr7zlhaUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4nfSA9ICfkuIrkvKDmlofku7blv4XpobvmmK/mnInmlYjnmoRpQ2Fs5qC85byPKC5pY3Mp44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgXCdjcmVhdGVcJyBwZXJtaXNzaW9ucy4nfSA9CiAgICAgICAgJ+WmguaenOacn+acm+eahOaXpeWOhuayoeacieWcqOi/memHjO+8jOivt+ehruS/neS9oOiHs+WwkeacieKAnOWIm+W7uuKAneadg+mZkOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyd9ID0gJ+abtOaWsOW3suacieeahOmihOe6puWQl++8nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgZXhpc3RpbmcgYXBwb2ludG1lbnRzIGluIHRoZSBjYWxlbmRhciB3aXRoIHNhbWUgVW5pcXVlSUQgd2lsbCBiZSBvdmVyd3JpdHRlbi4nfSA9CiAgICAgICAgJ+ebuOWQjFVuaXF1ZUlE55qE5pel5Y6G5Lit5omA5pyJ5bey5pyJ55qE6aKE57qm6YO95Lya6KKr6KaG55uW44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VwbG9hZCBjYWxlbmRhcid9ID0gJ+S4iuS8oOaXpeWOhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzJ30gPSAn5a+85YWl6aKE57qmJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudERhc2hib2FyZEFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05ldyBBcHBvaW50bWVudCd9ID0gJ+aWsOeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb29uJ30gPSAn5b6I5b+rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzUgZGF5cyd9ID0gJzXlpKknOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJ30gPSAn6L+Z5Liq6YCa55+l55qE5ZCN5a2X5bey5a2Y5ZyoISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZ2VudCAocmVzb3VyY2VzKSwgd2hvIGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIGFwcG9pbnRtZW50J30gPSAn6L+Z5Liq6aKE57qm6YCJ5oup55qE5pyN5Yqh5Lq65ZGY77yI6LWE5rqQ77yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBhZ2VudHMgd2l0aCAoYXQgbGVhc3QpIHJlYWQgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ+aJgOacieWvuei/meS4qumihOe6pu+8iOaXpeWOhu+8ieiHs+Wwkeacieivu+adg+mZkOeahOacjeWKoeS6uuWRmOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYWdlbnRzIHdpdGggd3JpdGUgcGVybWlzc2lvbiBmb3IgdGhlIGFwcG9pbnRtZW50IChjYWxlbmRhciknfSA9CiAgICAgICAgJ+aJgOacieWvuei/meS4qumihOe6pu+8iOaXpeWOhu+8ieacieWGmeadg+mZkOeahOacjeWKoeS6uuWRmOOAgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJ30gPSAn57O757uf5LiN6IO95Yib5bu65pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIENhbGVuZGFySUQhJ30gPSAn5rKh5pyJ5pel5Y6GSUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWW91IGhhdmUgbm8gYWNjZXNzIHRvIHRoaXMgY2FsZW5kYXIhJ30gPSAn5L2g5peg5p2D6K6/6Zeu6L+Z5Liq5pel5Y6G77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgQ2FsZW5kYXInfSA9ICfnvJbovpHml6XljoYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3IgdXBkYXRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ+abtOaWsOaXpeWOhuWHuumUme+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZG5cJ3QgcmVhZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIGZpbGUuJ30gPSAn5LiN6IO96K+75Y+W5pel5Y6G55qE6YWN572u5paH5Lu244CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBtYWtlIHN1cmUgeW91ciBmaWxlIGlzIHZhbGlkLid9ID0gJ+ivt+ehruS/neS9oOeahOaWh+S7tuaYr+acieaViOeahOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnfSA9ICfml6Dms5Xlr7zlhaXov5nkuKrml6XljobvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsZW5kYXIgaW1wb3J0ZWQhJ30gPSAn5pel5Y6G5bey5a+85YWl77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWQgQ2FsZW5kYXJJRCEnfSA9ICfpnIDopoHml6XljoZJRO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCd9ID0gJ+aXoOazlei/lOWbnue7meWumueahOaXpeWOhklE55qE5pWw5o2uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3NmdWxseSBpbXBvcnRlZCAlcyBhcHBvaW50bWVudChzKSB0byBjYWxlbmRhciAlcy4nfSA9ICfmiJDlip/lsIbpooTnuqYlc+WvvOWFpeWIsOaXpeWOhiVz44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jys1IG1pbnV0ZXMnfSA9ICcrNeWIhumSnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMTUgbWludXRlcyd9ID0gJysxNeWIhumSnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMzAgbWludXRlcyd9ID0gJyszMOWIhumSnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycrMSBob3VyJ30gPSAnKzHlsI/ml7YnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGwgYXBwb2ludG1lbnRzJ30gPSAn5omA5pyJ6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50cyBhc3NpZ25lZCB0byBtZSd9ID0gJ+WIhumFjee7meaIkeeahOmihOe6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93aW5nIG9ubHkgYXBwb2ludG1lbnRzIGFzc2lnbmVkIHRvIHlvdSEgQ2hhbmdlIHNldHRpbmdzJ30gPSAn5LuF5pi+56S65YiG6YWN57uZ5L2g55qE6aKE57qm77yB5L+u5pS56K6+572uJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgbm90IGZvdW5kISd9ID0gJ+ayoeacieaJvuWIsOmihOe6pu+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZXZlcid9ID0gJ+awuOS4jSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBEYXknfSA9ICfmr4/lpKknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXZlcnkgV2Vlayd9ID0gJ+avj+WRqCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBNb250aCd9ID0gJ+avj+aciCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFdmVyeSBZZWFyJ30gPSAn5q+P5bm0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSd9ID0gJ+WumuWItic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYWlseSd9ID0gJ+avj+WkqeS4gOasoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXZWVrbHknfSA9ICfmr4/lkajkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9udGhseSd9ID0gJ+avj+aciOS4gOasoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZWFybHknfSA9ICfmr4/lubTkuIDmrKEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZXZlcnknfSA9ICfmr48nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yICVzIHRpbWUocyknfSA9ICclc+asoSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyd1bnRpbCAuLi4nfSA9ICfnm7TliLAuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnZm9yIC4uLiB0aW1lKHMpJ30gPSAnLi4u5qyhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J3VudGlsICVzJ30gPSAn55u05YiwJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbm90aWZpY2F0aW9uJ30gPSAn5rKh5pyJ6YCa55+lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIG1pbnV0ZShzKSBiZWZvcmUnfSA9ICclc+WIhumSn+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyBob3VyKHMpIGJlZm9yZSd9ID0gJyVz5bCP5pe25YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyVzIGRheShzKSBiZWZvcmUnfSA9ICclc+WkqeWJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyclcyB3ZWVrIGJlZm9yZSd9ID0gJyVz5ZGo5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJ30gPSAn5Zyo6aKE57qm5byA5aeL5YmNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBzdGFydGVkJ30gPSAn5Zyo6aKE57qm5byA5aeL5ZCOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcyd9ID0gJ+WcqOmihOe6pue7k+adn+WJjSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnfSA9ICflnKjpooTnuqbnu5PmnZ/lkI4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiEnfSA9ICfmsqHmnInmnYPpmZDvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJ30gPSAn5LiN6IO95Yig6Zmk5bel5Y2V6aKE57qm77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb25zISd9ID0gJ+ayoeacieadg+mZkO+8gSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEltcG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbnMnfSA9ICfmsqHmnInmnYPpmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3lzdGVtIHdhcyB1bmFibGUgdG8gaW1wb3J0IGZpbGUhJ30gPSAn57O757uf5peg5rOV5a+85YWl5paH5Lu277yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLid9ID0gJ+abtOWkmuS/oeaBr+ivt+ajgOafpeaXpeW/l+OAgic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudExpc3QucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JyslZCBtb3JlJ30gPSAn5aSa5LqOKyVkJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9QdWJsaWNDYWxlbmRhci5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gJXMhJ30gPSAn5rKh5pyJJXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHN1Y2ggdXNlciEnfSA9ICfmsqHmnInov5nkuKrnlKjmiLfvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBjYWxlbmRhciEnfSA9ICfml6DmlYjml6XljobvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBVUkwhJ30gPSAn5peg5pWI572R5Z2A77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RoZXJlIHdhcyBhbiBlcnJvciBleHBvcnRpbmcgdGhlIGNhbGVuZGFyISd9ID0gJ+WvvOWHuuaXpeWOhuaXtuWHuumUme+8gSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0Rhc2hib2FyZC9BcHBvaW50bWVudENhbGVuZGFyLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWZyZXNoIChtaW51dGVzKSd9ID0gJ+WIt+aWsO+8iOWIhumSn++8iSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IENhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UuJ30gPSAn6aKE57qm5pel5Y6G5qaC6KeI6aG16Z2i44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IE5vdGlmaWNhdGlvbnMnfSA9ICfpooTnuqbpgJrnn6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FsZW5kYXIgZXZlbnQgbW9kdWxlIHRoYXQgcHJlcGFyZXMgbm90aWZpY2F0aW9uIGVudHJpZXMgZm9yIGFwcG9pbnRtZW50cy4nfSA9CiAgICAgICAgJ+mihOe6puaXpeWOhuS6i+S7tuaooeWdl++8jOWHhuWkh+mihOe6pueahOmAmuefpea2iOaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjYWxlbmRhciBldmVudCBtb2R1bGUgdGhhdCB1cGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50Lid9ID0KICAgICAgICAn6aKE57qm5pel5Y6G5LqL5Lu25qih5Z2X77yM5pu05paw5bel5Y2V55qE6aKE57qm5pWw5o2u44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGVkaXQgc2NyZWVuLid9ID0gJ+mihOe6pue8lui+keeql+WPo+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBsaXN0J30gPSAn6aKE57qm5YiX6KGoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGxpc3QuJ30gPSAn6aKE57qm5YiX6KGo44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMnfSA9ICfpooTnuqbpgJrnn6UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnRzJ30gPSAn6aKE57qmJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIG1hbmFnZSBzY3JlZW4uJ30gPSAn5pel5Y6G566h55CG56qX5Y+j44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Nob29zZSBmb3Igd2hpY2gga2luZCBvZiBhcHBvaW50bWVudCBjaGFuZ2VzIHlvdSB3YW50IHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4nfSA9CiAgICAgICAgJ+mAieaLqeS9oOmcgOimgeaOpeaUtuWTquS6m+mihOe6puWPmOWKqOmAmuefpea2iOaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSBuZXcgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoaXMgdGlja2V0J30gPSAn5Yib5bu65LiA5Liq5paw55qE5pel5Y6G6aKE57qm5Yiw6L+Z5Liq5bel5Y2V44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbnMuJ30gPSAn5Yib5bu65ZKM566h55CG6aKE57qm6YCa55+lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgbmV3IGFwcG9pbnRtZW50Lid9ID0gJ+WIm+W7uuaWsOeahOmihOe6puOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgd2hpY2ggY29sdW1ucyBhcmUgc2hvd24gaW4gdGhlIGxpbmtlZCBhcHBvaW50bWVudCB3aWRnZXQgKExpbmtPYmplY3Q6OlZpZXdNb2RlID0gImNvbXBsZXgiKS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEF2YWlsYWJsZSwgMiA9IEVuYWJsZWQgYnkgZGVmYXVsdC4nfSA9CiAgICAgICAgJ+WumuS5iemTvuaOpeeahOmihOe6puWwj+mDqOS7tihMaW5rT2JqZWN0OjpWaWV3TW9kZSA9ICJjb21wbGV4IinopoHmmL7npLrnmoTliJfjgILlj6/nlKjnmoTorr7nva7lgLzkuLrvvJowID0g56aB55So77yMMSA9IOWPr+eUqO+8jCAyID0g6buY6K6k5ZCv55So44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgYW4gaWNvbiB3aXRoIGxpbmsgdG8gdGhlIGdvb2dsZSBtYXAgcGFnZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbi4nfSA9CiAgICAgICAgJ+WumuS5ieS4gOS4quWbvuagh++8jOmTvuaOpemihOe6pue8lui+keeql+WPo+S4reeahOW9k+WJjeS9jee9ruWIsOiwt+atjOWcsOWbvumhtemdouOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBldmVudCBvYmplY3QgdHlwZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgdmlhIEFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudC4nfSA9CiAgICAgICAgJ+WumuS5ieS6i+S7tuWvueixoeexu+Wei++8jOS7peS+v+mAmui/h0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudO+8iOeuoeeQhumihOe6pumAmuefpeS6i+S7tu+8ieWkhOeQhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBsaXN0IG9mIHBhcmFtcyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGlja2V0IHNlYXJjaCBmdW5jdGlvbi4nfSA9CiAgICAgICAgJ+WumuS5ieiDveS8oOmAkuWIsOW3peWNleaQnOe0ouWKn+iDveeahOWPguaVsOa4heWNleOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgZHluYW1pYyBmaWVsZCBkYXRlIHRpbWUuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpooTnuqbnsbvlnovlkI7nq6/vvIznlKjkuo7lt6XljZXliqjmgIHlrZfmrrXml6XmnJ/ml7bpl7TjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUgYmFja2VuZCBmb3IgdGlja2V0IGVzY2FsYXRpb24gdGltZS4nfSA9CiAgICAgICAgJ+WumuS5ieW3peWNlemihOe6puexu+Wei+WQjuerr++8jOeUqOS6juW3peWNleWNh+e6p+aXtumXtOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBiYWNrZW5kIGZvciB0aWNrZXQgcGVuZGluZyB0aW1lLid9ID0KICAgICAgICAn5a6a5LmJ5bel5Y2V6aKE57qm57G75Z6L5ZCO56uv77yM55So5LqO5bel5Y2V5oyC6LW35pe26Ze044CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIHRpY2tldCBwbHVnaW4gZm9yIGNhbGVuZGFyIGFwcG9pbnRtZW50cy4nfSA9ICflrprkuYnml6XljobpooTnuqbnmoTlt6XljZXmj5Lku7bjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pY0ZpZWxkXyVzJ30gPSAnRHluYW1pY0ZpZWxkXyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgYXBwb2ludG1lbnQnfSA9ICfnvJbovpHpooTnuqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmlyc3QgcmVzcG9uc2UgdGltZSd9ID0gJ+mmluasoeWTjeW6lOaXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYXBwb2ludG1lbnRzIHNjcmVlbi4nfSA9ICflr7zlhaXpooTnuqbnqpflj6PjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiTm9ybWFsIiB0eXBlIGxpbmsuJ30gPSAn5bCG6aKE57qm5ZKM5bel5Y2V6ZO+5o6l5Li64oCc5pmu6YCa4oCd57G75Z6L44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgYWxsIGFwcG9pbnRtZW50IGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS4nfSA9ICfliJflh7ropoHlnKjlm77lvaLnlYzpnaLmmL7npLrnmoTmiYDmnInpooTnuqbkuovku7bjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlzdCBvZiBhbGwgY2FsZW5kYXIgZXZlbnRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgR1VJLid9ID0gJ+WbvuW9oueVjOmdouaYvuekuueahOaJgOacieaXpeWOhuS6i+S7tuWIl+ihqOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaXN0IG9mIGNvbG9ycyBpbiBoZXhhZGVjaW1hbCBSR0Igd2hpY2ggd2lsbCBiZSBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBkdXJpbmcgY2FsZW5kYXIgY3JlYXRpb24uIE1ha2Ugc3VyZSB0aGUgY29sb3JzIGFyZSBkYXJrIGVub3VnaCBzbyB3aGl0ZSB0ZXh0IGNhbiBiZSBvdmVybGF5ZWQgb24gdGhlbS4nfSA9CiAgICAgICAgJ+WcqOWIm+W7uuaXpeWOhuaXtuWPr+eUqOS6jumAieaLqeeahDE26L+b5Yi2UkdC6aKc6Imy5YiX6KGo44CC6K+35L2/55So6Laz5aSf5rex6Imy55qE6aKc6Imy77yM5Lul56Gu5L+d6IO95aSf5pi+56S65LiK6Z2i55m96Imy55qE5paH5pys44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBkaWZmZXJlbnQgY2FsZW5kYXJzLid9ID0gJ+euoeeQhuS4jeWQjOeahOaXpeWOhuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsZW5kYXJzIGluIG92ZXJ2aWV3IHNjcmVlbnMuIFBsZWFzZSBub3RlIHRoYXQgbGFyZ2UgbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhcnMgY2FuIGhhdmUgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24geW91ciBzZXJ2ZXIgYnkgbWFraW5nIHRvbyBtdWNoIHNpbXVsdGFuZW91cyBjYWxscy4nfSA9CiAgICAgICAgJ+aXpeWOhuamguiniOeql+WPo+iDvea/gOa0u+eahOaXpeWOhuacgOWkp+aVsOOAguivt+azqOaEj++8muWkp+mHj+eahOa/gOa0u+aXpeWOhuS8muWvueacjeWKoeWZqOS6p+eUn+WkquWkmueahOWQjOatpeiwg+eUqO+8jOWPr+iDveS8muacieaAp+iDveW9seWTjeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPVFJTIGRvZXNuXCd0IHN1cHBvcnQgcmVjdXJyaW5nIEFwcG9pbnRtZW50cyB3aXRob3V0IGVuZCBkYXRlIG9yIG51bWJlciBvZiBpdGVyYXRpb25zLiBEdXJpbmcgaW1wb3J0IHByb2Nlc3MsIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IElDUyBmaWxlIGNvbnRhaW5zIHN1Y2ggQXBwb2ludG1lbnRzLiBJbnN0ZWFkLCBzeXN0ZW0gY3JlYXRlcyBhbGwgQXBwb2ludG1lbnRzIGluIHRoZSBwYXN0LCBwbHVzIEFwcG9pbnRtZW50cyBmb3IgdGhlIG5leHQgbiBtb250aHMgKDEyMCBtb250aHMvMTAgeWVhcnMgYnkgZGVmYXVsdCkuJ30gPQogICAgICAgICdPVFJT5LiN5pSv5oyB5a+55rKh5pyJ57uT5p2f5pel5pyf5oiW5rKh5pyJ6YeN5aSN5qyh5pWw55qE6aKE57qm5YGa5b6q546v5aSE55CG44CC5Zyo5a+85YWl6L+H56iL5Lit77yM5Y+v6IO95pyJSUNT5paH5Lu25YyF5ZCr5LqG5q2k57G76aKE57qm44CC5L2c5Li65pu/5Luj77yM57O757uf5bCG5omA5pyJ55qE5q2k57G76aKE57qm5Yib5bu65Li65bey6L+H5Y6755qE6aKE57qm77yM54S25ZCO5Yqg5LiK5o6l5LiL5p2l55qEbuS4quaciCjpu5jorqQxMjDkuKrmnIjmiJYxMOW5tCnnmoTph43lpI3pooTnuqbjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3ZlcnZpZXcgb2YgYWxsIGFwcG9pbnRtZW50cy4nfSA9ICfmiYDmnInpooTnuqbnmoTmpoLop4jjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVuZGluZyB0aW1lJ30gPSAn5oyC6LW35pe26Ze0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsdWdpbiBzZWFyY2gnfSA9ICfmkJzntKLmj5Lku7YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGx1Z2luIHNlYXJjaCBtb2R1bGUgZm9yIGF1dG9jb21wbGV0ZS4nfSA9ICfnlKjkuo7oh6rliqjlrozmiJDnmoTmkJzntKLmj5Lku7bmqKHlnZfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHVibGljIENhbGVuZGFyJ30gPSAn5YWs5YWx5pel5Y6GJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1B1YmxpYyBjYWxlbmRhci4nfSA9ICflhazlhbHml6XljobjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcnfSA9ICfotYTmupDmpoLop4gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzb3VyY2UgT3ZlcnZpZXcgKE9UUlMgQnVzaW5lc3MgU29sdXRpb27ihKIpJ30gPSAn6LWE5rqQ5qaC6KeI77yIT1RSU+WVhuS4mueJiO+8iSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgZm9yIGNyZWF0aW5nIGEgY2FsZW5kYXIgYXBwb2ludG1lbnQgbGlua2VkIHRvIHRoZSB0aWNrZXQgZGlyZWN0bHkgZnJvbSB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBBZGRpdGlvbmFsIGFjY2VzcyBjb250cm9sIHRvIHNob3cgb3Igbm90IHNob3cgdGhpcyBsaW5rIGNhbiBiZSBkb25lIGJ5IHVzaW5nIEtleSAiR3JvdXAiIGFuZCBDb250ZW50IGxpa2UgInJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAyIi4gVG8gY2x1c3RlciBtZW51IGl0ZW1zIHVzZSBmb3IgS2V5ICJDbHVzdGVyTmFtZSIgYW5kIGZvciB0aGUgQ29udGVudCBhbnkgbmFtZSB5b3Ugd2FudCB0byBzZWUgaW4gdGhlIFVJLiBVc2UgIkNsdXN0ZXJQcmlvcml0eSIgdG8gY29uZmlndXJlIHRoZSBvcmRlciBvZiBhIGNlcnRhaW4gY2x1c3RlciB3aXRoaW4gdGhlIHRvb2xiYXIuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXor6bmg4Xnqpflj6PvvIzlnKjoj5zljZXkuIrmmL7npLrkuIDkuKrpk77mjqXvvIzku6XliJvlu7rkuIDkuKrml6XljobpooTnuqblubbnm7TmjqXpk77mjqXliLDmraTlt6XljZXjgILlj6/pgJrov4fplK7igJxHcm91cOKAneWSjOWAvOWmguKAnHJ3Omdyb3VwMTttb3ZlX2ludG86Z3JvdXAy4oCd6L+b6KGM6aKd5aSW55qE6K6/6Zeu5o6n5Yi277yM5Lul5pi+56S65oiW5LiN5pi+56S66L+Z5Liq6ZO+5o6l44CC5aaC5p6c6KaB5pS+5Yiw6I+c5Y2V57uE5Lit77yM5L2/55So6ZSu4oCcQ2x1c3Rlck5hbWXigJ3vvIzlgLzlj6/ku6XmmK/nlYzpnaLkuIrog73nnIvliLDnmoTku7vmhI/lkI3np7DjgILkvb/nlKjplK7igJxDbHVzdGVyUHJpb3JpdHnigJ3mnaXphY3nva7oj5zljZXnu4TlnKjlt6XlhbfmoI/kuK3mmL7npLrnmoTpobrluo/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU29sdXRpb24gdGltZSd9ID0gJ+ino+WGs+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmFuc3BvcnQgc2VsZWN0aW9uIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zLid9ID0gJ+mihOe6pumAmuefpeeahOS8oOi+k+aWueW8j+mAieaLqeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUcmlnZ2VycyBhZGQgb3IgdXBkYXRlIG9mIGF1dG9tYXRpYyBjYWxlbmRhciBhcHBvaW50bWVudHMgYmFzZWQgb24gY2VydGFpbiB0aWNrZXQgdGltZXMuJ30gPQogICAgICAgICfln7rkuo7mn5Dkupvlt6XljZXml7bpl7Tmt7vliqDmiJbmm7TmlrDoh6rliqjml6XljobpooTnuqbnmoTop6blj5HlmajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVXBkYXRlIHRpbWUnfSA9ICfmm7TmlrDml7bpl7QnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXc7CgojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6Ok1pZ3JhdGlvbnM6Ok9UUlM2OjpUaW1lWm9uZU9mZnNldCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAkU2VsZi0+e1ZpZXd9ID0gJ0FnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZmlsdGVycyBzdG9yZWQgaW4gdGhlIHVzZXIgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJExhc3RGaWx0ZXJLZXkgPSAnVXNlckxhc3RGaWx0ZXItJyAuICRTZWxmLT57Vmlld307CiAgICBteSAkTGFzdEZpbHRlciA9ICRQcmVmZXJlbmNlc3skTGFzdEZpbHRlcktleX0gfHwgJ1dlZWsnOwoKICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgIE1vbnRoID0+IHsKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ01vbnRoJyksCiAgICAgICAgICAgIFByaW8gPT4gMTAwLAogICAgICAgIH0sCiAgICAgICAgV2VlayA9PiB7CiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrJyksCiAgICAgICAgICAgIFByaW8gPT4gMjAwLAogICAgICAgIH0sCiAgICAgICAgRGF5ID0+IHsKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0RheScpLAogICAgICAgICAgICBQcmlvID0+IDMwMCwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjdXJyZW50IGZpbHRlcgogICAgJFBhcmFte0ZpbHRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICRMYXN0RmlsdGVyOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggISRGaWx0ZXJzeyAkUGFyYW17RmlsdGVyfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRQYXJhbXtGaWx0ZXJ9ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZmlsdGVycwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyQ29sdW1uICggc29ydCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgICROYXZCYXJGaWx0ZXJ7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59LT57UHJpb30gfSA9IHsKICAgICAgICAgICAgRmlsdGVyID0+ICRGaWx0ZXJDb2x1bW4sCiAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59IH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIEdldCB1c2VyJ3MgcGVybWlzc2lvbnMgdG8gYXNzb2NpYXRlZCBtb2R1bGVzIHdoaWNoIGFyZSBkaXNwbGF5ZWQgYXMgbGlua3MuCiAgICBmb3IgbXkgJE1vZHVsZSAocXcoQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlKSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgY3VycmVudCB0aW1lIGluIHRoZSB2aWV3CiAgICAkUGFyYW17U3RhcnR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0JyApCiAgICAgICAgfHwgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCk7CgogICAgIyBoYW5kbGUganVtcAogICAgJFBhcmFte0p1bXB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0p1bXAnICkgfHwgJyc7CiAgICBpZiAoICRQYXJhbXtKdW1wfSApIHsKICAgICAgICBteSAkSnVtcE9mZnNldCA9IDA7CiAgICAgICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnV2VlaycgKSB7CiAgICAgICAgICAgICRKdW1wT2Zmc2V0ID0gNjAgKiA2MCAqIDI0ICogNzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgJEp1bXBPZmZzZXQgPSA2MCAqIDYwICogMjQ7CiAgICAgICAgfQoKICAgICAgICAjIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiB0aW1lCiAgICAgICAgbXkgJFN0YXJ0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtGaWx0ZXJ9IGVxICdNb250aCcgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQYXJhbXtKdW1wfSBlcSAnUHJldicgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggLT0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtKdW1wfSBlcSAnTmV4dCcgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggKz0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRNb250aCA8IDEgKSB7CiAgICAgICAgICAgICAgICAkTW9udGggPSAxMjsKICAgICAgICAgICAgICAgICRZZWFyIC09IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkTW9udGggPiAxMiApIHsKICAgICAgICAgICAgICAgICRNb250aCA9IDE7CiAgICAgICAgICAgICAgICAkWWVhciArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTdGFydCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgWWVhciAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBEYXkgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17SnVtcH0gZXEgJ1ByZXYnICkgewogICAgICAgICAgICAgICAgJFN0YXJ0IC09ICRKdW1wT2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte0p1bXB9IGVxICdOZXh0JyApIHsKICAgICAgICAgICAgICAgICRTdGFydCArPSAkSnVtcE9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1N0YXJ0fSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydCwKICAgICAgICApOwogICAgfQoKICAgICMgY2FsY3VsYXRlIGRhdGUgYm91bmRhcmllcwogICAgaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnTW9udGgnICkgewoKICAgICAgICAjIGdldCBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtTdGFydFRpbWV9ID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIiwgJFllYXIsICRNb250aCwgMSApIC4gJyAwMDowMDowMCc7CgogICAgICAgICMgZ2V0IGxhc3QgZGF5IG9mIHRoZSBtb250aAogICAgICAgICRNb250aCArPSAxOwogICAgICAgIGlmICggJE1vbnRoID4gMTIgKSB7CiAgICAgICAgICAgICRNb250aCA9IDE7CiAgICAgICAgICAgICRZZWFyICs9IDE7CiAgICAgICAgfQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFllYXIgID0+ICRZZWFyLAogICAgICAgICAgICBNb250aCA9PiAkTW9udGgsCiAgICAgICAgICAgIERheSAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU3lzdGVtVGltZSAtPSAxOyAgICAjIHN1YnRyYWN0IG9uZSBzZWNvbmQKICAgICAgICAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17RW5kVGltZX0gPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkWWVhciwgJE1vbnRoLCAkRGF5ICkgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgIyBnZXQgdHJhbnNsYXRlZCBuYW1lIG9mIHRoZSBtb250aAogICAgICAgIG15IEBNb250aEFycmF5ID0gKAogICAgICAgICAgICAnJywKICAgICAgICAgICAgJ0phbnVhcnknLAogICAgICAgICAgICAnRmVicnVhcnknLAogICAgICAgICAgICAnTWFyY2gnLAogICAgICAgICAgICAnQXByaWwnLAogICAgICAgICAgICAnTWF5X2xvbmcnLAogICAgICAgICAgICAnSnVuZScsCiAgICAgICAgICAgICdKdWx5JywKICAgICAgICAgICAgJ0F1Z3VzdCcsCiAgICAgICAgICAgICdTZXB0ZW1iZXInLAogICAgICAgICAgICAnT2N0b2JlcicsCiAgICAgICAgICAgICdOb3ZlbWJlcicsCiAgICAgICAgICAgICdEZWNlbWJlcicsCiAgICAgICAgKTsKICAgICAgICBteSAkVHJhbnNsYXRlTW9udGggPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRNb250aEFycmF5WyRNb250aF0gKTsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9ICIkVHJhbnNsYXRlTW9udGggJFllYXIiOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RmlsdGVyfSBlcSAnV2VlaycgKSB7CiAgICAgICAgbXkgJENhbGVuZGFyV2Vla0RheVN0YXJ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpIHx8IDc7CiAgICAgICAgbXkgJENhbGVuZGFyV2Vla0RheUVuZCA9ICggJENhbGVuZGFyV2Vla0RheVN0YXJ0IC0gMSApIHx8IDc7CgogICAgICAgICMgZ2V0IHN0YXJ0IG9mIHRoZSB3ZWVrCiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICApOwogICAgICAgIHdoaWxlICggJFdlZWtEYXkgIT0gJENhbGVuZGFyV2Vla0RheVN0YXJ0ICkgewogICAgICAgICAgICAkU3RhcnRUaW1lIC09IDYwICogNjAgKiAyNDsKICAgICAgICAgICAgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U3RhcnRUaW1lfSA9CiAgICAgICAgICAgIHN1YnN0ciggJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSApLCAwLCAxMCApCiAgICAgICAgICAgIC4gJyAwMDowMDowMCc7CgogICAgICAgICMgZ2V0IGVuZCBvZiB0aGUgd2VlawogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0fSwKICAgICAgICApOwogICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICApOwogICAgICAgIHdoaWxlICggJFdlZWtEYXkgIT0gJENhbGVuZGFyV2Vla0RheUVuZCApIHsKICAgICAgICAgICAgJEVuZFRpbWUgKz0gNjAgKiA2MCAqIDI0OwogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17RW5kVGltZX0gPQogICAgICAgICAgICBzdWJzdHIoICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KCBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICksIDAsIDEwICkKICAgICAgICAgICAgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtTdGFydFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApCiAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgIC4gY2hyKDgyMTEpCiAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZyggJFBhcmFte0VuZFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApOwogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZUNXfSA9ICIjJENXIjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0ZpbHRlcn0gZXEgJ0RheScgKSB7CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSBzdWJzdHIoICRQYXJhbXtTdGFydH0sIDAsIDEwICkgLiAnIDAwOjAwOjAwJzsKICAgICAgICAkUGFyYW17RW5kVGltZX0gICA9IHN1YnN0ciggJFBhcmFte1N0YXJ0fSwgMCwgMTAgKSAuICcgMjM6NTk6NTknOwoKICAgICAgICAjIGdldCBzdGFydCBvZiB0aGUgd2VlawogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnR9LAogICAgICAgICk7CiAgICAgICAgbXkgKCAkV2Vla0RheSwgJENXICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0hlYWRlclRpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoICRQYXJhbXtTdGFydFRpbWV9LCAnRGF0ZUZvcm1hdFNob3J0JyApOwogICAgICAgICRQYXJhbXtIZWFkZXJUaXRsZUNXfSA9ICIjJENXIjsKICAgIH0KCiAgICAjIGRpc3BsYXkgZmlsdGVyIGJ1dHRvbnMKICAgIG15IEBOYXZCYXJGaWx0ZXJzOwogICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICVOYXZCYXJGaWx0ZXIgKSB7CiAgICAgICAgcHVzaCBATmF2QmFyRmlsdGVycywgJE5hdkJhckZpbHRlcnskUHJpb307CiAgICB9CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVGaWx0ZXJzLAogICAgICAgIH0sCiAgICApOwogICAgbXkgJENvdW50ID0gMDsKICAgIGZvciBteSAkRmlsdGVyIChATmF2QmFyRmlsdGVycykgewogICAgICAgICRDb3VudCsrOwogICAgICAgIGlmICggJENvdW50ID09IHNjYWxhciBATmF2QmFyRmlsdGVycyApIHsKICAgICAgICAgICAgJEZpbHRlci0+e0NTU30gPSAnTGFzdCc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld05hdkJhckZpbHRlckl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRGaWx0ZXItPntGaWx0ZXJ9IGVxICRQYXJhbXtGaWx0ZXJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAleyRGaWx0ZXJ9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWROb3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjYWxlbmRhciBvYmplY3QKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgZ2V0IGFsbCB1c2VyJ3MgdmFsaWQgY2FsZW5kYXJzCiAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgKTsKICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIHNvbWUKICAgIGlmIChAQ2FsZW5kYXJzKSB7CgogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhcnMpIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyRGF0YX0tPnsgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9IHsKICAgICAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXItPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICRDYWxlbmRhci0+e0NvbG9yfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgICAgICBteSBAVmlld2FibGVBcHBvaW50bWVudHM7CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBWaWV3YWJsZUFwcG9pbnRtZW50cywgQEFwcG9pbnRtZW50czsKICAgICAgICB9CgogICAgICAgIGlmIChAVmlld2FibGVBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICMgc29ydCBieSBzdGFydCBkYXRlCiAgICAgICAgICAgIEBWaWV3YWJsZUFwcG9pbnRtZW50cyA9IHNvcnQgeyAkYS0+e1N0YXJ0VGltZX0gY21wICRiLT57U3RhcnRUaW1lfSB9IEBWaWV3YWJsZUFwcG9pbnRtZW50czsKCiAgICAgICAgICAgIG15ICRMYXN0RGF5ID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBWaWV3YWJsZUFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgICAgICMgc2F2ZSB0aW1lIHN0YW1wcyBmb3IgZGlzcGxheSBiZWZvcmUgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gICA9ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9OwoKICAgICAgICAgICAgICAgICMgZW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgPSAkU3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3JtYXR0ZWQgZGF0ZS90aW1lIHN0cmluZ3MgdXNlZCBpbiBkaXNwbGF5CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JyAuICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSA/ICdTaG9ydCcgOiAnJyApCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JyAuICggJEFwcG9pbnRtZW50LT57QWxsRGF5fSA/ICdTaG9ydCcgOiAnJyApCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZm9ybWF0dGVkIG5vdGlmaWNhdGlvbiBkYXRlIHVzZWQgaW4gZGlzcGxheQogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGN1dCB0aGUgdGltZSBwb3J0aW9uCiAgICAgICAgICAgICAgICAkUGFyYW17U3RhcnREYXl9ID0gc3Vic3RyKCAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LCAwLCAxMCApOwoKICAgICAgICAgICAgICAgIGlmICggJExhc3REYXkgbmUgJFBhcmFte1N0YXJ0RGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnRHcm91cCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudERheSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXRTaG9ydCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkTGFzdERheSA/ICcnIDogJ0ZpcnN0JywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkTGFzdERheSA9ICRQYXJhbXtTdGFydERheX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0gPSAkUGFyYW17U3RhcnREYXRlfTsKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmRUaW1lfSAgID0gJFBhcmFte0VuZERhdGV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50QWN0aW9uUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXBwb2ludG1lbnROb0RhdGFSb3cnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhcnNOb3RGb3VuZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHN0YXJ0IG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBwYWdlIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKSBpZiAkU2VsZi0+e1N1YmFjdGlvbn0gbmUgJ0FKQVhGaWx0ZXJVcGRhdGUnOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJpY2hUZXh0ICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgaWYgKCAkUmljaFRleHQgJiYgISRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OkFkbWluOjokU2VsZi0+e0FjdGlvbn0iKS0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkUmljaFRleHQgPSAwOwogICAgfQoKICAgICMgc2V0IHR5cGUgZm9yIG5vdGlmaWNhdGlvbnMKICAgIG15ICRDb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICgkUmljaFRleHQpIHsKICAgICAgICAkQ29udGVudFR5cGUgPSAndGV4dC9odG1sJzsKICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBnZXQgcmVnaXN0ZXJlZCB0cmFuc3BvcnQgbGF5ZXJzCiAgICBteSAlUmVnaXN0ZXJlZFRyYW5zcG9ydHMgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQnKSB8fCB7fSB9OwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGlkCiAgICAgICAgbXkgJElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwoKICAgICAgICAjIGdldCBub3RpZmljYXRpb24gZGF0YQogICAgICAgIG15ICVEYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICApOwoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoSUQgTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIFRyYW5zcG9ydHMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgUEFSQU1FVEVSOgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoUmVjaXBpZW50cyBSZWNpcGllbnRBZ2VudHMgUmVjaXBpZW50R3JvdXBzIFJlY2lwaWVudFJvbGVzCiAgICAgICAgICAgIEV2ZW50cyBDYWxlbmRhcklEIFRlYW1JRCBSZXNvdXJjZUlEIFRpdGxlIExvY2F0aW9uCiAgICAgICAgICAgIFRyYW5zcG9ydHMgT25jZVBlckRheSBTZW5kT25PdXRPZk9mZmljZQogICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgVmlzaWJsZUZvckFnZW50VG9vbHRpcCBMYW5ndWFnZUlEIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSIGlmICFARGF0YTsKICAgICAgICAgICAgJEdldFBhcmFte0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3ViamVjdCBhbmQgYm9keSBmb3IgYWxsIGxhbmd1YWdlcwogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIEB7ICRHZXRQYXJhbXtEYXRhfS0+e0xhbmd1YWdlSUR9IH0gKSB7CgogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICBteSAkQm9keSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgJEdldFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdFNlcnZlckVycm9yJyB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyB2YWx1ZXMKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVJlZ2lzdGVyZWRUcmFuc3BvcnRzICkgKSB7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVSZWdpc3RlcmVkVHJhbnNwb3J0cyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0sIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdHJhbnNwb3J0IHNldHRpbmdzIHN0cmluZyBmcm9tIHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKS0+VHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUKICAgICAgICBteSAkT2s7CiAgICAgICAgbXkgJER1cGxpY2F0ZWRFbnRyeSA9IDA7CgogICAgICAgICRHZXRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblR5cGV9ID0gWydBcHBvaW50bWVudCddOwoKICAgICAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBub3RpZmljYXRpb25zIGFuZCBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZQogICAgICAgICMgc2FtZSBuYW1lIGFuZCBhbm90aGVyIHR5cGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLgogICAgICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgQWxsICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIE5PVElGSUNBVElPTklEOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTklEIGlmICEkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgJEdldFBhcmFte05hbWV9IG5lICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOYW1lfSBlcSAkTm90aWZpY2F0aW9uTGlzdHskTm90aWZpY2F0aW9uSUR9LT57TmFtZX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtJRH0gbmUgJE5vdGlmaWNhdGlvbklECiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICREdXBsaWNhdGVkRW50cnkgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkRHVwbGljYXRlZEVudHJ5ICkgewogICAgICAgICAgICAkT2sgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvblVwZGF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJE9rKSB7CiAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gdXBkYXRlZCEnKSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBFdmVudHMgVHJhbnNwb3J0cykpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJE5lZWRlZCAuICJTZXJ2ZXJFcnJvciIgfSA9ICIiOwogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JE5lZWRlZH0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgIGlmICgkRHVwbGljYXRlZEVudHJ5KSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIG5hbWUgYWxyZWFkeSBleGlzdHMhJykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgUmljaFRleHQgPT4gJFJpY2hUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0FkZCcsCiAgICAgICAgICAgIFJpY2hUZXh0ID0+ICRSaWNoVGV4dCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoTmFtZSBDb21tZW50IFZhbGlkSUQgRXZlbnRzIFRyYW5zcG9ydHMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgUEFSQU1FVEVSOgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICAgICAgcXcoUmVjaXBpZW50cyBSZWNpcGllbnRBZ2VudHMgUmVjaXBpZW50Um9sZXMgUmVjaXBpZW50R3JvdXBzIEV2ZW50cwogICAgICAgICAgICBDdXN0b21lcklEIEN1c3RvbWVyVXNlcklEIFRyYW5zcG9ydHMgT25jZVBlckRheSBTZW5kT25PdXRPZk9mZmljZQogICAgICAgICAgICBWaXNpYmxlRm9yQWdlbnQgVmlzaWJsZUZvckFnZW50VG9vbHRpcCBMYW5ndWFnZUlEIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQERhdGEgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSIGlmICFARGF0YTsKICAgICAgICAgICAgJEdldFBhcmFte0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgc3ViamVjdCBhbmQgYm9keSBmb3IgYWxsIGxhbmd1YWdlcwogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIEB7ICRHZXRQYXJhbXtEYXRhfS0+e0xhbmd1YWdlSUR9IH0gKSB7CgogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19TdWJqZWN0JyApIHx8ICcnOwogICAgICAgICAgICBteSAkQm9keSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRMYW5ndWFnZUlEIC4gJ19Cb2R5JyApICAgIHx8ICcnOwoKICAgICAgICAgICAgJEdldFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBCb2R5ICAgICAgICA9PiAkQm9keSwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc2V0IHNlcnZlciBlcnJvciBmbGFnIGlmIGZpZWxkIGlzIGVtcHR5CiAgICAgICAgICAgIGlmICggISRTdWJqZWN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTGFuZ3VhZ2VJRCAuICdfU3ViamVjdFNlcnZlckVycm9yJyB9ID0gIlNlcnZlckVycm9yIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkQm9keSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX0JvZHlTZXJ2ZXJFcnJvcicgfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyB2YWx1ZXMKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVJlZ2lzdGVyZWRUcmFuc3BvcnRzICkgKSB7CgogICAgICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgICAgIGZvciBteSAkVHJhbnNwb3J0ICggc29ydCBrZXlzICVSZWdpc3RlcmVkVHJhbnNwb3J0cyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX07CgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0sIFNpbGVudCA9PiAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdHJhbnNwb3J0IHNldHRpbmdzIHN0cmluZyBmcm9tIHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKS0+VHJhbnNwb3J0UGFyYW1TZXR0aW5nc0dldCgKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQKICAgICAgICBteSAkSUQ7CiAgICAgICAgbXkgJER1cGxpY2F0ZWRFbnRyeSA9IDA7CgogICAgICAgICRHZXRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblR5cGV9ID0gWydBcHBvaW50bWVudCddOwoKICAgICAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBub3RpZmljYXRpb25zIGFuZCBjaGVjayBpZiBhIG5vdGlmaWNhdGlvbiB3aXRoIHRoZQogICAgICAgICMgc2FtZSBuYW1lIGFuZCBhbm90aGVyIHR5cGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlLgogICAgICAgIG15ICVOb3RpZmljYXRpb25MaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KAogICAgICAgICAgICBUeXBlICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIERldGFpbHMgPT4gMSwKICAgICAgICAgICAgQWxsICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIE5PVElGSUNBVElPTklEOgogICAgICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJU5vdGlmaWNhdGlvbkxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTklEIGlmICEkTm90aWZpY2F0aW9uSUQ7CiAgICAgICAgICAgIG5leHQgTk9USUZJQ0FUSU9OSUQgaWYgJEdldFBhcmFte05hbWV9IG5lICROb3RpZmljYXRpb25MaXN0eyROb3RpZmljYXRpb25JRH0tPntOYW1lfTsKCiAgICAgICAgICAgICREdXBsaWNhdGVkRW50cnkgPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJER1cGxpY2F0ZWRFbnRyeSApIHsKICAgICAgICAgICAgJElEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0RhdGF9LT57VHJhbnNwb3J0c30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUcmFuc3BvcnRTZXJ2ZXJFcnJvcn0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRJRCkgewogICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnTm90aWZpY2F0aW9uIGFkZGVkIScpICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIEV2ZW50cyBUcmFuc3BvcnRzKSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkTmVlZGVkIC4gIlNlcnZlckVycm9yIiB9ID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskTmVlZGVkfSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICROZWVkZWQgLiAiU2VydmVyRXJyb3IiIH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgaWYgKCREdXBsaWNhdGVkRW50cnkpIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdOb3RpZmljYXRpb24gbmFtZSBhbHJlYWR5IGV4aXN0cyEnKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJ0FkZCcsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAkUmljaFRleHQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25EZWxldGUoCiAgICAgICAgICAgIElEICAgICA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJERlbGV0ZSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgTm90aWZpY2F0aW9uRXhwb3J0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTm90aWZpY2F0aW9uRXhwb3J0JyApIHsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb25EYXRhOwogICAgICAgIG15ICVOb3RpZmljYXRpb25TaW5nbGVEYXRhOwogICAgICAgIG15ICRGaWxlbmFtZSA9ICdFeHBvcnRfTm90aWZpY2F0aW9uLnltbCc7CgogICAgICAgIGlmICgkTm90aWZpY2F0aW9uSUQpIHsKCiAgICAgICAgICAgICVOb3RpZmljYXRpb25TaW5nbGVEYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJU5vdGlmaWNhdGlvblNpbmdsZURhdGEgKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdUaGVyZSB3YXMgYW4gZXJyb3IgZ2V0dGluZyBkYXRhIGZvciBOb3RpZmljYXRpb24gd2l0aCBJRDolcyEnLCAkTm90aWZpY2F0aW9uSUQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25OYW1lID0gJE5vdGlmaWNhdGlvblNpbmdsZURhdGF7TmFtZX07CiAgICAgICAgICAgICROb3RpZmljYXRpb25OYW1lID1+IHN7W15hLXpBLVowLTktX119e199eG1zZzsgICAgIyBjbGVhbnVwIG5hbWUgZm9yIHNhdmluZwoKICAgICAgICAgICAgJEZpbGVuYW1lICAgICAgICAgPSAnRXhwb3J0X05vdGlmaWNhdGlvbl8nIC4gJE5vdGlmaWNhdGlvbk5hbWUgLiAnLnltbCc7CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhID0gWyBcJU5vdGlmaWNhdGlvblNpbmdsZURhdGEgXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAlTm90aWZpY2F0aW9uZGV0YWlscyA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGV0YWlscyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQERhdGE7CiAgICAgICAgICAgIGZvciBteSAkSXRlbUlEICggc29ydCBrZXlzICVOb3RpZmljYXRpb25kZXRhaWxzICkgewogICAgICAgICAgICAgICAgcHVzaCBARGF0YSwgJE5vdGlmaWNhdGlvbmRldGFpbHN7JEl0ZW1JRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGEgPSBcQERhdGE7CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgdGhlIE5vdGlmaWNhdGlvbiBkYXRhIGhhc2ggdG8gc3RyaW5nCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGFZQU1MID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OllBTUwnKS0+RHVtcCggRGF0YSA9PiAkTm90aWZpY2F0aW9uRGF0YSApOwoKICAgICAgICAjIHNlbmQgdGhlIHJlc3VsdCB0byB0aGUgYnJvd3NlcgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICROb3RpZmljYXRpb25EYXRhWUFNTCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkNvcHkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdOb3RpZmljYXRpb25Db3B5JyApIHsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBOb3RpZmljYXRpb24gZGF0YQogICAgICAgIG15ICVOb3RpZmljYXRpb25EYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEICAgICA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVOb3RpZmljYXRpb25EYXRhICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnVW5rbm93biBOb3RpZmljYXRpb24gJXMhJywgJE5vdGlmaWNhdGlvbklEICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgTm90aWZpY2F0aW9uIG5hbWUKICAgICAgICBteSAkTm90aWZpY2F0aW9uTmFtZSA9CiAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRhe05hbWV9CiAgICAgICAgICAgIC4gJyAoJwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ29weScpCiAgICAgICAgICAgIC4gJyknOwoKICAgICAgICAjIG90aGVyd2lzZSBzYXZlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0byBvdmVydmlldyBzY3JlZW4KICAgICAgICBteSAkTmV3Tm90aWZpY2F0aW9uSUQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkFkZCgKICAgICAgICAgICAgJU5vdGlmaWNhdGlvbkRhdGEsCiAgICAgICAgICAgIE5hbWUgICA9PiAkTm90aWZpY2F0aW9uTmFtZSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgaWYgY2FuJ3QgY3JlYXRlCiAgICAgICAgaWYgKCAhJE5ld05vdGlmaWNhdGlvbklEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgiVGhlcmUgd2FzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBOb3RpZmljYXRpb24iKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE5vdGlmaWNhdGlvbkltcG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ05vdGlmaWNhdGlvbkltcG9ydCcgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRGb3JtSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApIHx8ICcnOwogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMnICkgfHwgJyc7CgogICAgICAgIG15ICROb3RpZmljYXRpb25JbXBvcnQgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkltcG9ydCgKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVcGxvYWRTdHVmZntDb250ZW50fSwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zID0+ICRPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbkltcG9ydC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICROb3RpZmljYXRpb25JbXBvcnQtPntNZXNzYWdlfQogICAgICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbnMgY291bGQgbm90IGJlIEltcG9ydGVkIGR1ZSB0byBhIHVua25vd24gZXJyb3IsIHBsZWFzZSBjaGVjayBPVFJTIGxvZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb24nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uSW1wb3J0LT57QWRkZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5OiAlcycsCiAgICAgICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkltcG9ydC0+e0FkZGVkTm90aWZpY2F0aW9uc30KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICggJE5vdGlmaWNhdGlvbkltcG9ydC0+e1VwZGF0ZWROb3RpZmljYXRpb25zfSApIHsKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Tm90aWZ5RGF0YX0gfSwgewogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gdXBkYXRlZCBzdWNjZXNzZnVsbHk6ICVzJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57VXBkYXRlZE5vdGlmaWNhdGlvbnN9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoICROb3RpZmljYXRpb25JbXBvcnQtPntOb3RpZmljYXRpb25FcnJvcnN9ICkgewogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9LCB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaGVyZSB3aGVyZSBlcnJvcnMgYWRkaW5nL3VwZGF0aW5nIHRoZSBmb2xsb3dpbmcgTm90aWZpY2F0aW9uczogJXMuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywKICAgICAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uSW1wb3J0LT57Tm90aWZpY2F0aW9uRXJyb3JzfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc2hvdyBub3RpZmljYXRpb25zIGlmIGFueQogICAgICAgIGlmICggJFBhcmFte05vdGlmeURhdGF9ICkgewogICAgICAgICAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbiAoIEB7ICRQYXJhbXtOb3RpZnlEYXRhfSB9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgJXskTm90aWZpY2F0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgJFBhcmFte1JlY2lwaWVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudEFnZW50cyA9PiBUcmFuc2xhdGFibGUoJ0FnZW50IChyZXNvdXJjZXMpLCB3aG8gYXJlIHNlbGVjdGVkIHdpdGhpbiB0aGUgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucyA9PgogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCdBbGwgYWdlbnRzIHdpdGggKGF0IGxlYXN0KSByZWFkIHBlcm1pc3Npb24gZm9yIHRoZSBhcHBvaW50bWVudCAoY2FsZW5kYXIpJyksCiAgICAgICAgICAgIEFwcG9pbnRtZW50QWdlbnRXcml0ZVBlcm1pc3Npb25zID0+CiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUoJ0FsbCBhZ2VudHMgd2l0aCB3cml0ZSBwZXJtaXNzaW9uIGZvciB0aGUgYXBwb2ludG1lbnQgKGNhbGVuZGFyKScpLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gOCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgIG15ICVBbGxBZ2VudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICAkUGFyYW17UmVjaXBpZW50QWdlbnRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQWxsQWdlbnRzLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudEFnZW50cycsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudEFnZW50c30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgJFBhcmFte1JlY2lwaWVudEdyb3Vwc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfSwKICAgICAgICBTaXplICAgICAgID0+IDYsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjaXBpZW50R3JvdXBzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRHcm91cHN9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwogICAgJFBhcmFte1JlY2lwaWVudFJvbGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IHsgJEdyb3VwT2JqZWN0LT5Sb2xlTGlzdCggVmFsaWQgPT4gMSApIH0sCiAgICAgICAgU2l6ZSAgICAgICA9PiA2LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY2lwaWVudFJvbGVzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntSZWNpcGllbnRSb2xlc30sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFc3NXBjJywKICAgICk7CgogICAgIyBTZXQgY2xhc3MgbmFtZSBmb3IgZXZlbnQgc3RyaW5nLi4uCiAgICBteSAkRXZlbnRDbGFzcyA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICBpZiAoICRQYXJhbXtFdmVudHNTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgJEV2ZW50Q2xhc3MgLj0gJyAnIC4gJFBhcmFte0V2ZW50c1NlcnZlckVycm9yfTsKICAgIH0KCiAgICBteSAkTm90aWZpY2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiByZWdpc3RlcmVkIGV2ZW50cwogICAgbXkgJVJlZ2lzdGVyZWRFdmVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RXZlbnQnKS0+RXZlbnRMaXN0KAogICAgICAgIE9iamVjdFR5cGVzID0+ICROb3RpZmljYXRpb25Db25maWctPntFdmVudE9iamVjdFR5cGVzfSwKICAgICk7CgogICAgbXkgQEV2ZW50czsKICAgIGZvciBteSAkT2JqZWN0VHlwZSAoIHNvcnQga2V5cyAlUmVnaXN0ZXJlZEV2ZW50cyApIHsKICAgICAgICBwdXNoIEBFdmVudHMsIEB7ICRSZWdpc3RlcmVkRXZlbnRzeyRPYmplY3RUeXBlfSB8fCBbXSB9OwogICAgfQoKICAgICMgU3VwcHJlc3MgdGhlc2UgZXZlbnRzIGJlY2F1c2Ugb2YgZGFuZ2VyIG9mIGVuZGxlc3MgbG9vcHMuCiAgICBteSAlRXZlbnRCbGFja2xpc3QgPSAoCiAgICAgICAgQXJ0aWNsZUFnZW50Tm90aWZpY2F0aW9uICAgID0+IDEsCiAgICAgICAgQXJ0aWNsZUN1c3RvbWVyTm90aWZpY2F0aW9uID0+IDEsCiAgICApOwoKICAgIEBFdmVudHMgPSBncmVwIHsgISRFdmVudEJsYWNrbGlzdHskX30gfSBARXZlbnRzOwoKICAgICMgQnVpbGQgdGhlIGxpc3QuLi4KICAgICRQYXJhbXtFdmVudHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXEBFdmVudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnRXZlbnRzJywKICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICA9PiAxMCwKICAgICAgICBDbGFzcyAgICAgID0+ICRFdmVudENsYXNzIC4gJyBNb2Rlcm5pemUgVzc1cGMnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57RXZlbnRzfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgQENhbGVuZGFyTGlzdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gNCwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgVmFsaWRJRCAgICA9PiAwLAogICAgKTsKCiAgICBteSAlQ2FsZW5kYXJMaXN0OwoKICAgIENBTEVOREFSOgogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyTGlzdCkgewoKICAgICAgICBuZXh0IENBTEVOREFSIGlmICEkQ2FsZW5kYXI7CiAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJENhbGVuZGFyKTsKCiAgICAgICAgJENhbGVuZGFyTGlzdHsgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9ICRDYWxlbmRhci0+e0NhbGVuZGFyTmFtZX07CiAgICB9CgogICAgJFBhcmFte0NhbGVuZGFyU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlQ2FsZW5kYXJMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBTaXplICAgICAgID0+IDUsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhcklEfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzc1cGMnLAogICAgKTsKCiAgICAkUGFyYW17UmVzb3VyY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVBbGxBZ2VudHMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnUmVzb3VyY2VJRCcsCiAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtEYXRhfS0+e1Jlc291cmNlSUR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICApOwoKICAgICRQYXJhbXtUaXRsZX0gICAgPSAkUGFyYW17RGF0YX0tPntUaXRsZX0tPlswXSAgICB8fCAnJzsKICAgICRQYXJhbXtMb2NhdGlvbn0gPSAkUGFyYW17RGF0YX0tPntMb2NhdGlvbn0tPlswXSB8fCAnJzsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICRQYXJhbXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVzUwcGMnLAogICAgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3VXBkYXRlJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgdHJ5IHRvIGxvYWQgdGhlIHRlYW0gYmFja2VuZAogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgIyBpbnN0YW5jaWF0ZSBhIG5ldyB0ZWFtIG9iamVjdAogICAgICAgIG15ICRUZWFtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtLT5uZXcoKTsKCiAgICAgICAgIyBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSAocmVhZGFibGUpIHRlYW1zCiAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRlYW1MaXN0ICkgKSB7CgogICAgICAgICAgICAjIGJ1aWxkIHRlYW0gc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICRUZWFtU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVGVhbUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0RhdGF9LT57VGVhbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNzVwYycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFjdGl2YXRlIHRoZSB0ZWFtIHNlY3Rpb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZVRlYW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGVhbVN0cmcgPT4gJFRlYW1TdHJnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93cyBoZWFkZXIKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiRnJvbnRlbmQ6OkFkbWluOjokU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxhbmd1YWdlIGlkcyBmcm9tIG1lc3NhZ2UgcGFyYW1ldGVyLCB1c2UgRW5nbGlzaCBpZiBubyBtZXNzYWdlIGlzIGdpdmVuCiAgICAjIG1ha2Ugc3VyZSBFbmdsaXNoIGlzIHRoZSBmaXJzdCBsYW5ndWFnZQogICAgbXkgQExhbmd1YWdlSURzOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17TWVzc2FnZX0tPntlbn0gKSB7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAnZW4nOwogICAgICAgIH0KICAgICAgICBMQU5HVUFHRUlEOgogICAgICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoIHNvcnQga2V5cyAleyAkUGFyYW17TWVzc2FnZX0gfSApIHsKICAgICAgICAgICAgbmV4dCBMQU5HVUFHRUlEIGlmICRMYW5ndWFnZUlEIGVxICdlbic7CiAgICAgICAgICAgIHB1c2ggQExhbmd1YWdlSURzLCAkTGFuZ3VhZ2VJRDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBATGFuZ3VhZ2VJRHMgPSAoJ2VuJyk7CiAgICB9CgogICAgIyBnZXQgbmFtZXMgb2YgbGFuZ3VhZ2VzIGluIEVuZ2xpc2gKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXMnKSB8fCB7fSB9OwoKICAgICMgZ2V0IG5hdGl2ZSBuYW1lcyBvZiBsYW5ndWFnZXMKICAgIG15ICVEZWZhdWx0VXNlZExhbmd1YWdlc05hdGl2ZSA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmUnKSB8fCB7fSB9OwoKICAgIG15ICVMYW5ndWFnZXM7CiAgICBMQU5HVUFHRUlEOgogICAgZm9yIG15ICRMYW5ndWFnZUlEICggc29ydCBrZXlzICVEZWZhdWx0VXNlZExhbmd1YWdlcyApIHsKCiAgICAgICAgIyBuZXh0IGxhbmd1YWdlIGlmIHRoZXJlIGlzIG5vdCBzZXQgYW55IG5hbWUgZm9yIGN1cnJlbnQgbGFuZ3VhZ2UKICAgICAgICBpZiAoICEkRGVmYXVsdFVzZWRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ICYmICEkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9ICkgewogICAgICAgICAgICBuZXh0IExBTkdVQUdFSUQ7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZXh0cyBpbiBuYXRpdmUgYW5kIGRlZmF1bHQgbGFuZ3VhZ2UKICAgICAgICBteSAkVGV4dCAgICAgICAgPSAkRGVmYXVsdFVzZWRMYW5ndWFnZXNOYXRpdmV7JExhbmd1YWdlSUR9IHx8ICcnOwogICAgICAgIG15ICRUZXh0RW5nbGlzaCA9ICREZWZhdWx0VXNlZExhbmd1YWdlc3skTGFuZ3VhZ2VJRH0gICAgICAgfHwgJyc7CgogICAgICAgICMgdHJhbnNsYXRlIHRvIGN1cnJlbnQgdXNlcidzIGxhbmd1YWdlCiAgICAgICAgbXkgJFRleHRUcmFuc2xhdGVkID0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRleHRFbmdsaXNoKTsKCiAgICAgICAgaWYgKCAkVGV4dFRyYW5zbGF0ZWQgJiYgJFRleHRUcmFuc2xhdGVkIG5lICRUZXh0ICkgewogICAgICAgICAgICAkVGV4dCAuPSAnIC0gJyAuICRUZXh0VHJhbnNsYXRlZDsKICAgICAgICB9CgogICAgICAgICMgbmV4dCBsYW5ndWFnZSBpZiB0aGVyZSBpcyBub3Qgc2V0IEVuZ2xpc2ggbm9yIG5hdGl2ZSBuYW1lIG9mIGxhbmd1YWdlLgogICAgICAgIG5leHQgTEFOR1VBR0VJRCBpZiAhJFRleHQ7CgogICAgICAgICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9ID0gJFRleHQ7CiAgICB9CgogICAgIyBjb3B5IG9yaWdpbmFsIGxpc3Qgb2YgbGFuZ3VhZ2VzIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgcmVidWlsZGluZyBsYW5ndWFnZSBzZWxlY3Rpb24KICAgIG15ICVPcmlnaW5hbERlZmF1bHRVc2VkTGFuZ3VhZ2VzID0gJUxhbmd1YWdlczsKCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgIGZvciBteSAkTGFuZ3VhZ2VJRCAoQExhbmd1YWdlSURzKSB7CgogICAgICAgICMgZm9ybWF0IHRoZSBjb250ZW50IGFjY29yZGluZyB0byB0aGUgY29udGVudCB0eXBlCiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntDb250ZW50VHlwZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfSA9fiBte3RleHRcL3BsYWlufXhtc2kKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcmVmb3JtYXQgZnJvbSBIVE1MIHRvIHBsYWluCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0NvbnRlbnRUeXBlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH14bXNpCiAgICAgICAgICAgICAgICAmJiAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWVzc2FnZX0tPnskTGFuZ3VhZ2VJRH0tPntCb2R5fSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgbGFuZ3VhZ2UKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm90aWZpY2F0aW9uTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJFBhcmFte01lc3NhZ2V9LT57JExhbmd1YWdlSUR9LT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtNZXNzYWdlfS0+eyRMYW5ndWFnZUlEfS0+e0JvZHl9ICAgIHx8ICcnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCAgICAgICAgID0+ICRMYW5ndWFnZUlELAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgICAgICAgICAgID0+ICRMYW5ndWFnZXN7JExhbmd1YWdlSUR9LAogICAgICAgICAgICAgICAgU3ViamVjdFNlcnZlckVycm9yID0+ICRQYXJhbXsgJExhbmd1YWdlSUQgLiAnX1N1YmplY3RTZXJ2ZXJFcnJvcicgfSB8fCAnJywKICAgICAgICAgICAgICAgIEJvZHlTZXJ2ZXJFcnJvciAgICA9PiAkUGFyYW17ICRMYW5ndWFnZUlEIC4gJ19Cb2R5U2VydmVyRXJyb3InIH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRoZSBidXR0b24gdG8gcmVtb3ZlIGEgbm90aWZpY2F0aW9uIG9ubHkgaWYgaXQgaXMgbm90IHRoZSBFbmdsaXNoIG5vdGlmaWNhdGlvbgogICAgICAgIGlmICggJExhbmd1YWdlSUQgbmUgJ2VuJyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb3RpZmljYXRpb25MYW5ndWFnZVJlbW92ZUJ1dHRvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2VJRCA9PiAkTGFuZ3VhZ2VJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBsYW5ndWFnZSBmcm9tIGRyb3AtZG93biBsaXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93bgogICAgICAgIGRlbGV0ZSAkTGFuZ3VhZ2VzeyRMYW5ndWFnZUlEfTsKICAgIH0KCiAgICAkUGFyYW17TGFuZ3VhZ2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUxhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYyBMYW5ndWFnZUFkZCcsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwogICAgJFBhcmFte0xhbmd1YWdlT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlT3JpZ2luYWxEZWZhdWx0VXNlZExhbmd1YWdlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0xhbmd1YWdlT3JpZycsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgSFRNTFF1b3RlICAgID0+IDAsCiAgICApOwoKICAgICMgdGFrZSBvdmVyIGRhdGEgZmllbGRzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoVmlzaWJsZUZvckFnZW50IFZpc2libGVGb3JBZ2VudFRvb2x0aXAgQ3VzdG9tZXJJRCBDdXN0b21lclVzZXJJRCkKICAgICAgICApCiAgICB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXtEYXRhfS0+eyRLZXl9OwogICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRQYXJhbXtEYXRhfS0+eyRLZXl9LT5bMF07CiAgICAgICAgJFBhcmFteyRLZXl9ID0gJFBhcmFte0RhdGF9LT57JEtleX0tPlswXTsKICAgIH0KCiAgICAjIHNldCBzZW5kIG9uIG91dCBvZiBvZmZpY2UgY2hlY2tlZCB2YWx1ZQogICAgJFBhcmFte1NlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZH0gPSAoICRQYXJhbXtEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgICMgc2V0IG9uY2UgcGVyIGRheSBjaGVja2VkIHZhbHVlCiAgICAkUGFyYW17T25jZVBlckRheUNoZWNrZWR9ID0gKCAkUGFyYW17RGF0YX0tPntPbmNlUGVyRGF5fSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwoKICAgIG15ICRPVFJTQnVzaW5lc3NPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpPVFJTQnVzaW5lc3MnKTsKICAgIG15ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA9ICRPVFJTQnVzaW5lc3NPYmplY3QtPk9UUlNCdXNpbmVzc0lzSW5zdGFsbGVkKCk7CgogICAgIyBUaGlyZCBvcHRpb24gaXMgZW5hYmxlZCBvbmx5IHdoZW4gT1RSU0J1c2luZXNzIGlzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgogICAgJFBhcmFte1Zpc2libGVGb3JBZ2VudFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzEnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gVHJhbnNsYXRhYmxlKCdZZXMsIGJ1dCByZXF1aXJlIGF0IGxlYXN0IG9uZSBhY3RpdmUgbm90aWZpY2F0aW9uIG1ldGhvZC4nKSwKICAgICAgICAgICAgICAgIERpc2FibGVkID0+ICRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZCA/IDAgOiAxLAogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICBOYW1lICAgICAgID0+ICdWaXNpYmxlRm9yQWdlbnQnLAogICAgICAgIFNvcnQgICAgICAgPT4gJ051bWVyaWNLZXknLAogICAgICAgIFNpemUgICAgICAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWaXNpYmxlRm9yQWdlbnR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBXNTBwYycsCiAgICApOwoKICAgICMgaW5jbHVkZSByZWFkLW9ubHkgYXR0cmlidXRlCiAgICBpZiAoICEkUGFyYW17VmlzaWJsZUZvckFnZW50fSApIHsKICAgICAgICAkUGFyYW17VmlzaWJsZUZvckFnZW50VG9vbHRpcFJlYWRvbmx5fSA9ICdyZWFkb25seT0icmVhZG9ubHkiJzsKICAgIH0KCiAgICAjIGdldCByZWdpc3RlcmVkIHRyYW5zcG9ydCBsYXllcnMKICAgIG15ICVSZWdpc3RlcmVkVHJhbnNwb3J0cyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQXBwb2ludG1lbnROb3RpZmljYXRpb246OlRyYW5zcG9ydCcpIHx8IHt9IH07CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVSZWdpc3RlcmVkVHJhbnNwb3J0cyApICkgewoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydCAoCiAgICAgICAgICAgIHNvcnQgeyAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JGF9LT57UHJpb30gPD0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skYn0tPntQcmlvfSB9CiAgICAgICAgICAgIGtleXMgJVJlZ2lzdGVyZWRUcmFuc3BvcnRzCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fSApOwogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgdHJhbnNwb3J0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lID0+ICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e05hbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntNb2R1bGV9LCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgICAgICMgYmFja2VuZCBmb3IgdGhpcyB0cmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93RGlzYWJsZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiBub3Qgc3RhbmRhcmQgdHJhbnNwb3J0CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0KICAgICAgICAgICAgICAgICAgICAmJiAkUmVnaXN0ZXJlZFRyYW5zcG9ydHN7JFRyYW5zcG9ydH0tPntJc09UUlNCdXNpbmVzc1RyYW5zcG9ydH0gZXEgJzEnCiAgICAgICAgICAgICAgICAgICAgJiYgISRPVFJTQnVzaW5lc3NJc0luc3RhbGxlZAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRUcmFuc3BvcnRDaGVja2VkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJFBhcmFte0RhdGF9LT57VHJhbnNwb3J0c30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVHJhbnNwb3J0Q2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZXQgRW1haWwgdHJhbnNwb3J0IHNlbGVjdGVkIG9uIGFkZCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICggJFRyYW5zcG9ydCBlcSAnRW1haWwnICYmICEkUGFyYW17SUR9ICkgewogICAgICAgICAgICAgICAgICAgICRUcmFuc3BvcnRDaGVja2VkID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBzZXR0aW5ncyBzdHJpbmcgZnJvbSB0cmFuc3BvcnQgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkVHJhbnNwb3J0U2V0dGluZ3MgPQogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoICRSZWdpc3RlcmVkVHJhbnNwb3J0c3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKS0+VHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgaXQgc2hvdWxkIGRlY2lkZSBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCiAgICAgICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiBvbiBBZ2VudFByZWZlcmVuY2VzIGlzIGVuYWJsZWQgb3Igbm90CiAgICAgICAgICAgICAgICBteSAkQWdlbnRFbmFibGVkQnlEZWZhdWx0ID0gMDsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnQgfSBAeyAkUGFyYW17RGF0YX0tPntBZ2VudEVuYWJsZWRCeURlZmF1bHR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICEkUGFyYW17SUR9ICYmIGRlZmluZWQgJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICAgICAkQWdlbnRFbmFibGVkQnlEZWZhdWx0ID0gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRBZ2VudEVuYWJsZWRCeURlZmF1bHRDaGVja2VkID0gKCAkQWdlbnRFbmFibGVkQnlEZWZhdWx0ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CgogICAgICAgICAgICAgICAgIyB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyYW5zcG9ydFJvd0VuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgICAgICAgICAgICAgICAgID0+ICRUcmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgICAgICAgICAgICAgICAgPT4gJFJlZ2lzdGVyZWRUcmFuc3BvcnRzeyRUcmFuc3BvcnR9LT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydENoZWNrZWQgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydENoZWNrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzU3RyaW5nICAgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICBBZ2VudEVuYWJsZWRCeURlZmF1bHRDaGVja2VkID0+ICRBZ2VudEVuYWJsZWRCeURlZmF1bHRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRzU2VydmVyRXJyb3IgICAgICAgID0+ICRQYXJhbXtUcmFuc3BvcnRzU2VydmVyRXJyb3J9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyB0cmFuc3BvcnRzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnVHJhbnNwb3J0JywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uSW1wb3J0JyApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICROb3RpZmljYXRpb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcpOwoKICAgIG15ICVMaXN0ID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25MaXN0KCBUeXBlID0+ICdBcHBvaW50bWVudCcgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uQ29uZmlnCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpBZG1pbjo6QWRtaW5BcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50Jyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIHJlZ2lzdGVyZWQgZXZlbnRzCiAgICBteSAlUmVnaXN0ZXJlZEV2ZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFdmVudCcpLT5FdmVudExpc3QoCiAgICAgICAgT2JqZWN0VHlwZXMgPT4gJE5vdGlmaWNhdGlvbkNvbmZpZy0+e0V2ZW50T2JqZWN0VHlwZXN9LAogICAgKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIG5vdGlmaWNhdGlvbnMgYWZmZWN0ZWQgYnkgdGhlIHN1cHBvcnRlZCBldmVudHMKICAgIG15ICVOb3RpZmljYXRpb25JRHM7CgogICAgIyBpZiB0aGVyZSBhcmUgYW55IG5vdGlmaWNhdGlvbnMsIHRoZXkgYXJlIHNob3duCiAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgZm9yICggc29ydCB7ICRMaXN0eyRhfSBjbXAgJExpc3R7JGJ9IH0ga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgIG15ICVEYXRhID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkXywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3RoZXJ3aXNlIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlIGlzIGRpc3BsYXllZAogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6QXN5bmNocm9ub3VzRXhlY3V0b3IpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIENlcnRhaW4gc2VhcmNoIHBhcmFtZXRlcnMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgc2hvdWxkIGJlIHN0b3JlZCBhcyBzY2FsYXJzLCBub3QgYXJyYXkgcmVmcy4KICAgICRTZWxmLT57U2VhcmNoUGFyYW1TY2FsYXJ9ID0gWyAnRnJvbScsICdUbycsICdDYycsICdTdWJqZWN0JywgJ0JvZHknLCAnQXR0YWNobWVudE5hbWUnIF07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgUEFSQU1OQU1FOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CgogICAgICAgICMgUXVldWUsIE93bmVySURzIGFuZCBSZXNwb25zaWJsZUlEcyBhcmUgbXVsdGlwbGUgc2VsZWN0aW9uIGZpZWxkcywgZ2V0IGFycmF5IGluc3RlYWQuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkS2V5ID1+IC9eUXVldWVJRF8vCiAgICAgICAgICAgIHx8ICRLZXkgPX4gL15TZWFyY2hQYXJhbV9bMC05YS1mXStfT3duZXJJRHMkLwogICAgICAgICAgICB8fCAkS2V5ID1+IC9eU2VhcmNoUGFyYW1fWzAtOWEtZl0rX1Jlc3BvbnNpYmxlSURzJC8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQFBhcmFtQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IFxAUGFyYW1BcnJheTsKICAgICAgICAgICAgbmV4dCBQQVJBTU5BTUU7CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgIyBHZXQgdXNlcidzIHBlcm1pc3Npb25zIHRvIGFzc29jaWF0ZWQgbW9kdWxlcyB3aGljaCBhcmUgZGlzcGxheWVkIGFzIGxpbmtzLgogICAgZm9yIG15ICRNb2R1bGUgKHF3KEFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3IEFnZW50QXBwb2ludG1lbnRJbXBvcnQpKSB7CiAgICAgICAgbXkgJE1vZHVsZUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpCiAgICAgICAgICAgIC0+eyRNb2R1bGV9LT57R3JvdXB9IC8vIFtdOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTW9kdWxlR3JvdXBzKSApIHsKICAgICAgICAgICAgTU9EVUxFX0dST1VQOgogICAgICAgICAgICBmb3IgbXkgJE1vZHVsZUdyb3VwICggQHskTW9kdWxlR3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskTW9kdWxlR3JvdXBdIn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IE1PRFVMRV9HUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBbHdheXMgYWxsb3cgbGlua3MgaWYgbm8gZ3JvdXBzIGFyZSBzcGVjaWZpZWQuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdOZXcnICkgewoKICAgICAgICBteSAkR3JvdXBTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9Hcm91cFNlbGVjdGlvbkdldCgpOwogICAgICAgIG15ICRDb2xvclBhbGV0dGUgICAgICAgPSAkU2VsZi0+X0NvbG9yUGFsZXR0ZUdldCgpOwogICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCk7CiAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50cyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhckVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBDb2xvclBhbGV0dGUgPT4gJENvbG9yUGFsZXR0ZSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAkVmFsaWRTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1N0b3JlTmV3JywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ29sb3JQYWxldHRlLT5bIGludCByYW5kKCBzY2FsYXIgQHskQ29sb3JQYWxldHRlfSApIF0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBZGQgbmV3IENhbGVuZGFyJyksCiAgICAgICAgICAgICAgICBXaWRnZXRTdGF0dXMgPT4gJ0NvbGxhcHNlZCcsCiAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewoKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgY2hlY2sgbmFtZQogICAgICAgIGlmICggISRHZXRQYXJhbXtDYWxlbmRhck5hbWV9ICkgewogICAgICAgICAgICAkRXJyb3J7J0NhbGVuZGFyTmFtZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lCiAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJEdldFBhcmFte0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUNhbGVuZGFyKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7Q2FsZW5kYXJOYW1lSW52YWxpZH0gPSAiU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgJEVycm9ye0NhbGVuZGFyTmFtZUV4aXN0c30gID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSAkU2VsZi0+X0dldFRpY2tldEFwcG9pbnRtZW50UGFyYW1zKCVHZXRQYXJhbSk7CgogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSBAVmFsaWRJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgUXVldWUgZmllbGQgaW4gdGlja2V0IGFwcG9pbnRtZW50cyBpcyBtYW5kYXRvcnksIGNoZWNrIGlmIGl0J3MgcHJlc2VudCBhbmQgdmFsaWQuCiAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRSdWxlLT57UXVldWVJRH0gJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUnVsZS0+e1F1ZXVlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgUVVFVUVfSUQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IEB7ICRSdWxlLT57UXVldWVJRH0gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhZ3JlcCB7ICRfIGVxICRRdWV1ZURhdGF7VmFsaWRJRH0gfSBAVmFsaWRJRHMKICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUVVFVUVfSUQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfS0+e1F1ZXVlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlbGVjdGlvbnMKICAgICAgICAgICAgbXkgJEdyb3VwU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fR3JvdXBTZWxlY3Rpb25HZXQoJUdldFBhcmFtKTsKICAgICAgICAgICAgbXkgJENvbG9yUGFsZXR0ZSAgICAgICA9ICRTZWxmLT5fQ29sb3JQYWxldHRlR2V0KCk7CiAgICAgICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCVHZXRQYXJhbSk7CiAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudHMgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cygpOwoKICAgICAgICAgICAgIyBnZXQgcnVsZSBjb3VudAogICAgICAgICAgICBteSAkUnVsZUNvdW50ID0gc2NhbGFyIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH07CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyRWRpdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgQ29sb3JQYWxldHRlID0+ICRDb2xvclBhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRWYWxpZFNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1N0b3JlTmV3JywKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdBZGQgbmV3IENhbGVuZGFyJyksCiAgICAgICAgICAgICAgICAgICAgV2lkZ2V0U3RhdHVzID0+ICRSdWxlQ291bnQgPyAnRXhwYW5kZWQnIDogJ0NvbGxhcHNlZCcsCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNob3cgYWxsIHRpY2tldCBhcHBvaW50bWVudCBydWxlIGJsb2Nrcy4KICAgICAgICAgICAgbXkgJFJ1bGVOdW1iZXIgPSAxOwogICAgICAgICAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9ICkgewogICAgICAgICAgICAgICAgJFJ1bGUtPntFcnJvcn0gPSAkRXJyb3J7ICRSdWxlLT57UnVsZUlEfSB9OwogICAgICAgICAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50UnVsZSA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCAleyRSdWxlfSApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUnVsZU51bWJlciA9PiAkUnVsZU51bWJlcisrLAogICAgICAgICAgICAgICAgICAgICAgICAleyRSdWxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldEFwcG9pbnRtZW50UnVsZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgYW55IHNlYXJjaCBwYXJhbWV0ZXIgYmxvY2tzIHRvby4KICAgICAgICAgICAgICAgICRTZWxmLT5fU2hvd1RpY2tldEFwcG9pbnRtZW50UGFyYW1zKCAleyRSdWxlfSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBjYWxlbmRhcgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2FsZW5kYXIgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTeXN0ZW0gd2FzIHVuYWJsZSB0byBjcmVhdGUgQ2FsZW5kYXIhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50cyBpbiBhc3luYyBjYWxsIHRvIGNvcmUgbW9kdWxlIG1ldGhvZC4KICAgICAgICAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25OYW1lICAgPT4gJ1RpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyJywKICAgICAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdCcgKSB7CgogICAgICAgICMgZ2V0IGRhdGEKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgJEdldFBhcmFte0NhbGVuZGFySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NhbGVuZGFySUQnICkgfHwgJyc7CgogICAgICAgIGlmICggISRHZXRQYXJhbXtDYWxlbmRhcklEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENhbGVuZGFySUQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhciBkYXRhCiAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDYWxlbmRhciApIHsKCiAgICAgICAgICAgICMgZmFrZSBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdZb3UgaGF2ZSBubyBhY2Nlc3MgdG8gdGhpcyBjYWxlbmRhciEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlbGVjdGlvbnMKICAgICAgICBteSAkR3JvdXBTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9Hcm91cFNlbGVjdGlvbkdldCglQ2FsZW5kYXIpOwogICAgICAgIG15ICRDb2xvclBhbGV0dGUgICAgICAgPSAkU2VsZi0+X0NvbG9yUGFsZXR0ZUdldCgpOwogICAgICAgIG15ICRWYWxpZFNlbGVjdGlvbiAgICAgPSAkU2VsZi0+X1ZhbGlkU2VsZWN0aW9uR2V0KCVDYWxlbmRhcik7CiAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50cyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCk7CgogICAgICAgIG15ICRSdWxlQ291bnQgPSBzY2FsYXIgQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUNhbGVuZGFyLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cFNlbGVjdGlvbiwKICAgICAgICAgICAgICAgIENvbG9yUGFsZXR0ZSA9PiAkQ29sb3JQYWxldHRlLAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRWYWxpZFNlbGVjdGlvbiwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbiAgICA9PiAnVXBkYXRlJywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgICAgIFJ1bGVDb3VudCAgICA9PiAkUnVsZUNvdW50LAogICAgICAgICAgICAgICAgV2lkZ2V0U3RhdHVzID0+ICRSdWxlQ291bnQgPyAnRXhwYW5kZWQnIDogJ0NvbGxhcHNlZCcsCiAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgU2hvdyBhbGwgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYmxvY2tzLgogICAgICAgIG15ICRSdWxlTnVtYmVyID0gMTsKICAgICAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9ICkgewogICAgICAgICAgICBteSAlVGlja2V0QXBwb2ludG1lbnRSdWxlID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudHMoICV7JFJ1bGV9ICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRSdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFJ1bGVOdW1iZXIgPT4gJFJ1bGVOdW1iZXIrKywKICAgICAgICAgICAgICAgICAgICAleyRSdWxlfSwKICAgICAgICAgICAgICAgICAgICAlVGlja2V0QXBwb2ludG1lbnRSdWxlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2hvdyBhbnkgc2VhcmNoIHBhcmFtZXRlciBibG9ja3MgdG9vLgogICAgICAgICAgICAkU2VsZi0+X1Nob3dUaWNrZXRBcHBvaW50bWVudFBhcmFtcyggJXskUnVsZX0gKTsKCiAgICAgICAgICAgICMgaW5pdGlhbGl6ZSBidXR0b24gYmVoYXZpb3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGVJbml0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JFJ1bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIENhbGVuZGFyTmFtZSBDb2xvciBHcm91cElEKSkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICROZWVkZWQgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CgogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFzayggJVBhcmFtLCAlR2V0UGFyYW0sICVFcnJvciApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjYWxlbmRhciB3aXRoIHNhbWUgbmFtZQogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAkR2V0UGFyYW17Q2FsZW5kYXJOYW1lfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhbGVuZGFye0NhbGVuZGFySUR9ICYmICRDYWxlbmRhcntDYWxlbmRhcklEfSAhPSAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcntDYWxlbmRhck5hbWVJbnZhbGlkfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICRFcnJvcntDYWxlbmRhck5hbWVFeGlzdHN9ICA9IDE7CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSA9ICRTZWxmLT5fR2V0VGlja2V0QXBwb2ludG1lbnRQYXJhbXMoJUdldFBhcmFtKTsKCiAgICAgICAgIyBHZXQgcXVldWUgY3JlYXRlIHBlcm1pc3Npb25zIGZvciB0aGUgdXNlci4KICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgIG15IEBWYWxpZElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBRdWV1ZSBmaWVsZCBpbiB0aWNrZXQgYXBwb2ludG1lbnRzIGlzIG1hbmRhdG9yeSwgY2hlY2sgaWYgaXQncyBwcmVzZW50IGFuZCB2YWxpZC4KICAgICAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkR2V0UGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJ1bGUtPntRdWV1ZUlEfSAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRSdWxlLT57UXVldWVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBRVUVVRV9JRDoKICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQgQHsgJFJ1bGUtPntRdWV1ZUlEfSB8fCBbXSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICFncmVwIHsgJF8gZXEgJFF1ZXVlRGF0YXtWYWxpZElEfSB9IEBWYWxpZElEcwogICAgICAgICAgICAgICAgICAgICAgICB8fCAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRSdWxlLT57UnVsZUlEfSB9LT57UXVldWVJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBRVUVVRV9JRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7ICRSdWxlLT57UnVsZUlEfSB9LT57UXVldWVJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgc2VsZWN0aW9ucwogICAgICAgICAgICBteSAkR3JvdXBTZWxlY3Rpb24gICAgID0gJFNlbGYtPl9Hcm91cFNlbGVjdGlvbkdldCglR2V0UGFyYW0pOwogICAgICAgICAgICBteSAkQ29sb3JQYWxldHRlICAgICAgID0gJFNlbGYtPl9Db2xvclBhbGV0dGVHZXQoKTsKICAgICAgICAgICAgbXkgJFZhbGlkU2VsZWN0aW9uICAgICA9ICRTZWxmLT5fVmFsaWRTZWxlY3Rpb25HZXQoJUdldFBhcmFtKTsKICAgICAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50cyA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRzKCk7CgogICAgICAgICAgICBteSAkUnVsZUNvdW50ID0gc2NhbGFyIEB7ICRHZXRQYXJhbXtUaWNrZXRBcHBvaW50bWVudHN9IHx8IFtdIH07CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyRWRpdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBTZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgQ29sb3JQYWxldHRlID0+ICRDb2xvclBhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+ICRWYWxpZFNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb24gICAgPT4gJ1VwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnRWRpdCBDYWxlbmRhcicpLAogICAgICAgICAgICAgICAgICAgIFJ1bGVDb3VudCAgICA9PiAkUnVsZUNvdW50LAogICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudHMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTaG93IGFsbCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBibG9ja3MuCiAgICAgICAgICAgIG15ICRSdWxlTnVtYmVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRSdWxlICggQHsgJEdldFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gfHwgW10gfSApIHsKICAgICAgICAgICAgICAgICRSdWxlLT57RXJyb3J9ID0gJEVycm9yeyAkUnVsZS0+e1J1bGVJRH0gfTsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFJ1bGUgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50cyggJXskUnVsZX0gKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEFwcG9pbnRtZW50UnVsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVOdW1iZXIgPT4gJFJ1bGVOdW1iZXIrKywKICAgICAgICAgICAgICAgICAgICAgICAgJXskUnVsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXRBcHBvaW50bWVudFJ1bGUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBTaG93IGFueSBzZWFyY2ggcGFyYW1ldGVyIGJsb2NrcyB0b28uCiAgICAgICAgICAgICAgICAkU2VsZi0+X1Nob3dUaWNrZXRBcHBvaW50bWVudFBhcmFtcyggJXskUnVsZX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgY2FsZW5kYXIKICAgICAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJVcGRhdGUoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yIHVwZGF0aW5nIHRoZSBjYWxlbmRhciEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUHJvY2VzcyB0aWNrZXQgYXBwb2ludG1lbnRzIGluIGFzeW5jIGNhbGwgdG8gY29yZSBtb2R1bGUgbWV0aG9kLgogICAgICAgICRTZWxmLT5Bc3luY0NhbGwoCiAgICAgICAgICAgIE9iamVjdE5hbWUgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgICAgICAgICBGdW5jdGlvbk5hbWUgICA9PiAnVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXInLAogICAgICAgICAgICBGdW5jdGlvblBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRHZXRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYWxlbmRhckltcG9ydCcgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgZ2V0IHRoZSB1cGxvYWRlZCBmaWxlIGNvbnRlbnQKICAgICAgICBteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKSB8fCAnJzsKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgbXkgJENvbnRlbnQgPSAkVXBsb2FkU3R1ZmZ7Q29udGVudH07CgogICAgICAgICMgY2hlY2sgZm9yIG92ZXJ3cml0aW5nIG9wdGlvbgogICAgICAgIG15ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMnICkgfHwgMDsKCiAgICAgICAgIyBleHRyYWN0IHRoZSB0ZWFtIGRhdGEgZnJvbSB0aGUgdXBsb2FkZWQgZmlsZQogICAgICAgIG15ICRDYWxlbmRhckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5Mb2FkKCBEYXRhID0+ICRDb250ZW50ICk7CiAgICAgICAgaWYgKCByZWYgJENhbGVuZGFyRGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCJDb3VsZG4ndCByZWFkIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24gZmlsZS4iKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgbWFrZSBzdXJlIHlvdXIgZmlsZSBpcyB2YWxpZC4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaW1wb3J0IHRoZSBjYWxlbmRhcgogICAgICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckltcG9ydCgKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+ICRPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFBhcmFte05vdGlmeU1lc3NhZ2V9ID0gewogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgaW1wb3J0IHRoZSBjYWxlbmRhciEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZnlNZXNzYWdlfSA9IHsKICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhciBpbXBvcnRlZCEnKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2FsZW5kYXJFeHBvcnQnICkgewoKICAgICAgICAjIGNoZWNrIGZvciBDYWxlbmRhcklECiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2FsZW5kYXJJRCcgKSB8fCAnJzsKICAgICAgICBpZiAoICEkQ2FsZW5kYXJJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgQ2FsZW5kYXJJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNhbGVuZGFyIGRhdGEKICAgICAgICBteSAlQ2FsZW5kYXJEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQ2FsZW5kYXJEYXRhICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgcmV0cmlldmUgZGF0YSBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IHRoZSBjYWxlbmRhciBkYXRhIGhhc2ggdG8gc3RyaW5nCiAgICAgICAgbXkgJENhbGVuZGFyRGF0YVlBTUwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6WUFNTCcpLT5EdW1wKCBEYXRhID0+IFwlQ2FsZW5kYXJEYXRhICk7CgogICAgICAgICMgcHJlcGFyZSBjYWxlbmRhciBuYW1lIHRvIGJlIHBhcnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgbXkgJENhbGVuZGFyTmFtZSA9ICRDYWxlbmRhckRhdGF7Q2FsZW5kYXJEYXRhfS0+e0NhbGVuZGFyTmFtZX07CiAgICAgICAgJENhbGVuZGFyTmFtZSA9fiBzL1xzKy9fL2c7CgogICAgICAgICMgc2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBicm93c2VyCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJENhbGVuZGFyRGF0YVlBTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydF9DYWxlbmRhcl8nIC4gJENhbGVuZGFyTmFtZSAuICcueW1sJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbXBvcnRBcHBvaW50bWVudHNTdWNjZXNzJyApIHx8ICcnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gPSB7CiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICVzIGFwcG9pbnRtZW50KHMpIHRvIGNhbGVuZGFyICVzLicsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvdW50JyApIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICkgIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICVQYXJhbSA9ICRTZWxmLT5fT3ZlcnZpZXcoJVBhcmFtKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9NYXNrKCVQYXJhbSk7Cn0KCnN1YiBfT3ZlcnZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAjIGdldCBhbGwgY2FsZW5kYXJzIHVzZXIgaGFzIFJXIGFjY2VzcyB0bwogICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDYWxlbmRhckZpbHRlcicsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdDYWxlbmRhcnMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICAkUGFyYW17VmFsaWRDb3VudH0gPSAwOwogICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewoKICAgICAgICAjIGdyb3VwIG5hbWUKICAgICAgICAkQ2FsZW5kYXItPntHcm91cH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFyLT57R3JvdXBJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB2YWxpZCB0ZXh0CiAgICAgICAgJENhbGVuZGFyLT57VmFsaWR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZElEID0+ICRDYWxlbmRhci0+e1ZhbGlkSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ2FsZW5kYXItPntWYWxpZElEfSA9PSAxICkgewogICAgICAgICAgICAkUGFyYW17VmFsaWRDb3VudH0rKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFjY2VzcyB0b2tlbnMKICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICBVc2VyTG9naW4gID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggc2NhbGFyIEBDYWxlbmRhcnMgPT0gMCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJOb0RhdGFSb3cnLAogICAgICAgICk7CiAgICB9CiAgICAkUGFyYW17T3ZlcnZpZXd9ID0gMTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNYWluQWN0aW9ucycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uSW1wb3J0JyApOwoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgIGlmICggJFBhcmFte05vdGlmeU1lc3NhZ2V9ICkgewogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAleyAkUGFyYW17Tm90aWZ5TWVzc2FnZX0gfSwKICAgICAgICApOwogICAgfQoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0VkaXQgQ2FsZW5kYXInKSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0dyb3VwU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGlzdCBvZiBncm91cHMgd2hlcmUgdXNlciBoYXMgUlcgcGVybWlzc2lvbnMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CgogICAgbXkgJEdyb3VwU2VsZWN0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlR3JvdXBMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ0dyb3VwSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0dyb3VwSUR9IHx8ICcnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICApOwoKICAgIHJldHVybiAkR3JvdXBTZWxlY3Rpb247Cn0KCnN1YiBfQ29sb3JQYWxldHRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29sb3IgcGFsZXR0ZQogICAgbXkgJENhbGVuZGFyQ29sb3JzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckNvbG9ycycpIHx8IFsKICAgICAgICAnIzAwMDAwMCcsICcjMUUxRTFFJywgJyMzQTNBM0EnLCAnIzU0NTQ1MycsICcjNkU2RTZFJywgJyM4Nzg2ODcnLCAnIzg4ODc4NycsICcjQTA5RkEwJywKICAgICAgICAnI0I4QjhCOCcsICcjRDBEMEQwJywgJyNFOEU4RTgnLCAnI0ZGRkZGRicsICcjODkxMTAwJywgJyM4OTQ4MDAnLCAnIzg4ODUwMScsICcjNDU4NDAxJywKICAgICAgICAnIzAyODQwMScsICcjMDE4NDQ4JywgJyMwMDg2ODgnLCAnIzAwNEE4OCcsICcjMDAxODg4JywgJyM0OTFBODgnLCAnIzg5MUU4OCcsICcjODkxNjQ4JywKICAgICAgICAnI0ZGMjEwMScsICcjRkY4ODAyJywgJyNGRkZBMDMnLCAnIzgzRjkwMicsICcjMDVGODAyJywgJyMwM0Y5ODcnLCAnIzAwRkRGRicsICcjMDA4Q0ZGJywKICAgICAgICAnIzAwMkVGRicsICcjODkzMUZGJywgJyNGRjM5RkYnLCAnI0ZGMjk4NycsICcjRkY3MjZFJywgJyNGRkNFNkUnLCAnI0ZGRkI2RCcsICcjQ0VGQTZFJywKICAgICAgICAnIzY4Rjk2RScsICcjNjhGREZGJywgJyM2OEZCRDAnLCAnIzZBQ0ZGRicsICcjNkU3NkZGJywgJyNEMjc4RkYnLCAnI0ZGN0FGRicsICcjRkY3RkQzJywKICAgIF07CgogICAgcmV0dXJuICRDYWxlbmRhckNvbG9yczsKfQoKc3ViIF9WYWxpZFNlbGVjdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVWYWxpZCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICRWYWxpZFNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIElEICAgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICBUaXRsZSAgICAgID0+IFRyYW5zbGF0YWJsZSgiVmFsaWQiKSwKICAgICk7CgogICAgcmV0dXJuICRWYWxpZFNlbGVjdGlvbjsKfQoKc3ViIF9Vc2VyU2VsZWN0aW9uR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoKTsKCiAgICBteSAkVXNlclNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiBcJVVzZXJMaXN0LAogICAgICAgIE5hbWUgPT4gKCAkUGFyYW17UnVsZUlEfSAmJiAkUGFyYW17UGFyYW1OYW1lfSApCiAgICAgICAgPyAnU2VhcmNoUGFyYW1fJyAuICRQYXJhbXtSdWxlSUR9IC4gJ18nIC4gJFBhcmFte1BhcmFtTmFtZX0KICAgICAgICA6ICdTZWFyY2hQYXJhbVVzZXInLAogICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICBDbGFzcyAgICAgID0+ICdTZWFyY2hQYXJhbSBNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1BhcmFtVmFsdWV9IHx8IFtdLAogICAgKTsKCiAgICAjIEFkZCBwYXJhbSBuYW1lIGFzIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciByZWZlcmVuY2UgaW4gSlMuCiAgICBpZiAoICRQYXJhbXtQYXJhbU5hbWV9ICkgewogICAgICAgICRVc2VyU2VsZWN0aW9uID1+IHMvPHNlbGVjdC88c2VsZWN0IGRhdGEtcGFyYW09IiRQYXJhbXtQYXJhbU5hbWV9Ii87CiAgICB9CgogICAgcmV0dXJuICRVc2VyU2VsZWN0aW9uOwp9CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGZpZWxkIGlkIHN1ZmZpeAogICAgbXkgJEZpZWxkSUQgPSAnJzsKICAgIGlmICggJFBhcmFte1J1bGVJRH0gKSB7CiAgICAgICAgJEZpZWxkSUQgPSAnXycgLiAkUGFyYW17UnVsZUlEfTsKICAgIH0KCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRzOwoKICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICApOwoKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwogICAgbXkgJUF2YWlsYWJsZVF1ZXVlczsKCiAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgIFFVRVVFSUQ6CiAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVF1ZXVlcyApIHsKICAgICAgICBteSAlUXVldWVEYXRhID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAkQXZhaWxhYmxlUXVldWVzeyRRdWV1ZUlEfSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1F1ZXVlSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgIENsYXNzID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yfS0+e1F1ZXVlSURJbnZhbGlkfSAvLyAnJyApLAogICAgICAgIERhdGEgPT4gXCVBdmFpbGFibGVRdWV1ZXMsCiAgICAgICAgTXVsdGlwbGUgICAgICAgICAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdRdWV1ZUlEJyAuICRGaWVsZElELAogICAgICAgIFRyZWVWaWV3ICAgICAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgT25DaGFuZ2VTdWJtaXQgICAgID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZScpIC8vIHt9OwogICAgbXkgQEFwcG9pbnRtZW50VHlwZXM7CiAgICBteSBARHluYW1pY0ZpZWxkVHlwZXM7CgogICAgVFlQRToKICAgIGZvciBteSAkVHlwZUtleSAoIHNvcnQga2V5cyAleyRUaWNrZXRBcHBvaW50bWVudENvbmZpZ30gKSB7CiAgICAgICAgbmV4dCBUWVBFIGlmICEkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9OwogICAgICAgIG5leHQgVFlQRSBpZiAhJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX07CgogICAgICAgIGlmICggJFR5cGVLZXkgPX4gL0R5bmFtaWNGaWVsZCQvICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiBhbGwgdmFsaWQgZGF0ZSBhbmQgZGF0ZS90aW1lIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlJyAmJiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZVRpbWUnICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZFR5cGVzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gc3ByaW50ZiggJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwgICREeW5hbWljRmllbGQtPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IHNwcmludGYoICRUaWNrZXRBcHBvaW50bWVudENvbmZpZy0+eyRUeXBlS2V5fS0+e05hbWV9LCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgVFlQRTsKICAgICAgICB9CgogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50VHlwZXMsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57TmFtZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICBteSBAU3RhcnREYXRlVHlwZXMgPSAoIEBBcHBvaW50bWVudFR5cGVzLCBARHluYW1pY0ZpZWxkVHlwZXMgKTsKICAgICRUaWNrZXRBcHBvaW50bWVudHN7U3RhcnREYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgICAgPT4gXEBTdGFydERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YXJ0RGF0ZScgLiAkRmllbGRJRCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTdGFydERhdGV9LAogICAgKTsKCiAgICBteSBARW5kUGx1c1R5cGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzUgbWludXRlcycpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnUGx1c18xNScsCiAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnKzE1IG1pbnV0ZXMnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJyszMCBtaW51dGVzJyksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdQbHVzXzYwJywKICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCcrMSBob3VyJyksCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQEVuZERhdGVUeXBlcyA9ICggQEVuZFBsdXNUeXBlcywgQER5bmFtaWNGaWVsZFR5cGVzICk7CiAgICAkVGlja2V0QXBwb2ludG1lbnRze0VuZERhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgRGF0YSAgICAgICA9PiBcQEVuZERhdGVUeXBlcywKICAgICAgICBNdWx0aXBsZSAgID0+IDAsCiAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgPT4gJ0VuZERhdGUnIC4gJEZpZWxkSUQsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RW5kRGF0ZX0sCiAgICApOwoKICAgIG15ICRTZWFyY2hQYXJhbXNDb25maWcgPQogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQXBwb2ludG1lbnRDYWxlbmRhcjo6VGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbScpIC8vIHt9OwoKICAgICMgVHJhbnNsYXRlIHNlYXJjaCBwYXJhbWV0ZXIgbGFiZWxzIHByaW9yIHRvIHNvcnRpbmcuCiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbXNDb25maWd9ICkgewogICAgICAgICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJFNlYXJjaFBhcmFtc0NvbmZpZy0+eyRQYXJhbU5hbWV9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNvcnQgc2VhcmNoIHBhcmFtZXRlciBsaXN0IGJ5IHRyYW5zbGF0ZWQgbGFiZWxzLgogICAgbXkgQFNlYXJjaFBhcmFtczsKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCB7ICRTZWFyY2hQYXJhbXNDb25maWctPnskYX0gY21wICRTZWFyY2hQYXJhbXNDb25maWctPnskYn0gfSBrZXlzICV7JFNlYXJjaFBhcmFtc0NvbmZpZ30gKSB7CiAgICAgICAgcHVzaCBAU2VhcmNoUGFyYW1zLCB7CiAgICAgICAgICAgIEtleSAgICAgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgID0+ICRTZWFyY2hQYXJhbXNDb25maWctPnskUGFyYW1OYW1lfSwKICAgICAgICAgICAgRGlzYWJsZWQgPT4gJFBhcmFte1NlYXJjaFBhcmFtfS0+eyRQYXJhbU5hbWV9IHx8IDAsCiAgICAgICAgfTsKICAgIH0KCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgQ2xhc3MgICAgPT4gJ1NlYXJjaFBhcmFtcyBNb2Rlcm5pemUnLAogICAgICAgIERhdGEgICAgID0+IFxAU2VhcmNoUGFyYW1zLAogICAgICAgIE11bHRpcGxlID0+IDAsCiAgICAgICAgU2l6ZSAgICAgPT4gMCwKICAgICAgICBOYW1lICAgICA9PiAnU2VhcmNoUGFyYW1zJyAuICRGaWVsZElELAogICAgKTsKCiAgICAkVGlja2V0QXBwb2ludG1lbnRze1NlYXJjaFBhcmFtVXNlcn0gPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoKTsKCiAgICByZXR1cm4gJVRpY2tldEFwcG9pbnRtZW50czsKfQoKc3ViIF9HZXRUaWNrZXRBcHBvaW50bWVudFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBjcmVhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFBhcmFtczsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSBRdWV1ZUlEIFNlYXJjaFBhcmFtKSkgewogICAgICAgICAgICBpZiAoICRLZXkgPX4gL14ke0ZpZWxkfV8oW0EtWmEtejAtOV0rKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkUnVsZUlEID0gJDE7CgogICAgICAgICAgICAgICAgIyBpZiBydWxlIGlkIGlzIGludGVnZXIsIGdlbmVyYXRlIHJhbmRvbSBndWlkCiAgICAgICAgICAgICAgICBpZiAoIElzSW50ZWdlcigkUnVsZUlEKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntSdWxlSUR9ID0gJE1haW5PYmplY3QtPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnYScgLi4gJ2YnIF0sICAgICMgaGV4YWRlY2ltYWwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB1c2UgaXQgYXMtaXMKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1J1bGVJRH0gPSAkUnVsZUlEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgZXEgJ1NlYXJjaFBhcmFtJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL15TZWFyY2hQYXJhbV8ke1J1bGVJRH1fKFtBLVphLXpdKykkLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHNlYXJjaCBwYXJhbXM6CiAgICAgICAgICAgICAgICAgICAgICAgICMgICAtIGFzIHNjYWxhciwgcGVyIFRpY2tldFNlYXJjaCgpIGRvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBtdWx0aXBsZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgIyAgIC0gYXMgYXJyYXkgcmVmLCBzaW5nbGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJFNlYXJjaFBhcmFtIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFBhcmFtc3skUnVsZUlEfS0+e1NlYXJjaFBhcmFtfS0+eyRTZWFyY2hQYXJhbX0gPSAkUGFyYW17JEtleX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPntTZWFyY2hQYXJhbX0tPnskU2VhcmNoUGFyYW19ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9LT57U2VhcmNoUGFyYW19LT57JFNlYXJjaFBhcmFtfSA9IFsgJFBhcmFteyRLZXl9IF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRQYXJhbXN7JFJ1bGVJRH0tPnskRmllbGR9ID0gJFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhbnNmb3JtIHRvIGFycmF5CiAgICBteSBAVGlja2V0QXBwb2ludG1lbnREYXRhOwogICAgZm9yIG15ICRSdWxlSUQgKCBzb3J0IGtleXMgJVRpY2tldEFwcG9pbnRtZW50UGFyYW1zICkgewogICAgICAgIHB1c2ggQFRpY2tldEFwcG9pbnRtZW50RGF0YSwgJFRpY2tldEFwcG9pbnRtZW50UGFyYW1zeyRSdWxlSUR9OwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEFwcG9pbnRtZW50RGF0YTsKfQoKc3ViIF9TaG93VGlja2V0QXBwb2ludG1lbnRQYXJhbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkUGFyYW1OYW1lICggc29ydCBrZXlzICV7ICRQYXJhbXtTZWFyY2hQYXJhbX0gfSApIHsKICAgICAgICBteSAkUGFyYW1WYWx1ZTsKICAgICAgICBteSAkUGFyYW1TdHJnOwoKICAgICAgICBpZiAoIGdyZXAgeyAkUGFyYW1OYW1lIGVxICRfIH0gQHsgJFNlbGYtPntTZWFyY2hQYXJhbVNjYWxhcn0gfSApIHsKICAgICAgICAgICAgJFBhcmFtVmFsdWUgPSAkUGFyYW17U2VhcmNoUGFyYW19LT57JFBhcmFtTmFtZX07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggcmVmICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAkUGFyYW1WYWx1ZSA9ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfS0+WzBdIC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBPd25lcklEcyBhbmQgUmVzcG9uc2libGVJRHMgYXJlIG11bHRpcGxlIHNlbGVjdGlvbiB1c2VyIGZpZWxkcy4KICAgICAgICBpZiAoICRQYXJhbU5hbWUgZXEgJ093bmVySURzJyB8fCAkUGFyYW1OYW1lIGVxICdSZXNwb25zaWJsZUlEcycgKSB7CiAgICAgICAgICAgICRQYXJhbVN0cmcgPSAkU2VsZi0+X1VzZXJTZWxlY3Rpb25HZXQoCiAgICAgICAgICAgICAgICBQYXJhbU5hbWUgID0+ICRQYXJhbU5hbWUsCiAgICAgICAgICAgICAgICBQYXJhbVZhbHVlID0+ICRQYXJhbXtTZWFyY2hQYXJhbX0tPnskUGFyYW1OYW1lfSAvLyBbXSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUGFyYW1OYW1lICA9PiAkUGFyYW1OYW1lLAogICAgICAgICAgICAgICAgUGFyYW1WYWx1ZSA9PiAkUGFyYW1WYWx1ZSwKICAgICAgICAgICAgICAgIFBhcmFtU3RyZyAgPT4gJFBhcmFtU3RyZywKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntPdmVydmlld1NjcmVlbn0gPSAnQ2FsZW5kYXJPdmVydmlldyc7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIHVzZXIncyB2YWxpZCBjYWxlbmRhcnMKICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICApOwoKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgKTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgR2V0IHVzZXIncyBwZXJtaXNzaW9ucyB0byBhc3NvY2lhdGVkIG1vZHVsZXMgd2hpY2ggYXJlIGRpc3BsYXllZCBhcyBsaW5rcy4KICAgIGZvciBteSAkTW9kdWxlIChxdyhBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UpKSB7CiAgICAgICAgbXkgJE1vZHVsZUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpCiAgICAgICAgICAgIC0+eyRNb2R1bGV9LT57R3JvdXB9IC8vIFtdOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTW9kdWxlR3JvdXBzKSApIHsKICAgICAgICAgICAgTU9EVUxFX0dST1VQOgogICAgICAgICAgICBmb3IgbXkgJE1vZHVsZUdyb3VwICggQHskTW9kdWxlR3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+eyJVc2VySXNHcm91cFskTW9kdWxlR3JvdXBdIn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte01vZHVsZVBlcm1pc3Npb25zfS0+eyRNb2R1bGV9ID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IE1PRFVMRV9HUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBbHdheXMgYWxsb3cgbGlua3MgaWYgbm8gZ3JvdXBzIGFyZSBzcGVjaWZpZWQuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgd2UgZm91bmQgc29tZQogICAgaWYgKEBDYWxlbmRhcnMpIHsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAgICAgIyBuZXcgYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FwcG9pbnRtZW50Q3JlYXRlJyApIHsKICAgICAgICAgICAgJFBhcmFte0FwcG9pbnRtZW50Q3JlYXRlfSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0JyApICAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBFbmQgICAgICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VuZCcgKSAgICAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1BsdWdpbktleScgKSAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKSAgICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09iamVjdElEJyApICAvLyB1bmRlZiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc2V0dGluZ3MgZGlhbG9nCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhbGVuZGFyU2V0dGluZ3NTaG93JyApIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyU2V0dGluZ3NTaG93fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudElEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcHBvaW50bWVudElEJyApIC8vIHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJEaXYnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENhbGVuZGFyV2lkdGggPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYWxlbmRhcldpZGdldCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgdXNlciBwcmVmZXJlbmNlIGtleQogICAgICAgIG15ICRTaG93bkFwcG9pbnRtZW50c1ByZWZLZXkgPSAnVXNlcicgLiAkU2VsZi0+e092ZXJ2aWV3U2NyZWVufSAuICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgbXkgJFNob3duQXBwb2ludG1lbnRzUHJlZlZhbCA9ICRQcmVmZXJlbmNlc3skU2hvd25BcHBvaW50bWVudHNQcmVmS2V5fSB8fCAxOwoKICAgICAgICAjIHNob3duIGFwcG9pbnRtZW50cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17U2hvd25BcHBvaW50bWVudHNTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FsbCBhcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgIDIgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBcHBvaW50bWVudHMgYXNzaWduZWQgdG8gbWUnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTaG93bkFwcG9pbnRtZW50cycsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnU2hvd25BcHBvaW50bWVudHMnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2hvd25BcHBvaW50bWVudHNQcmVmVmFsLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgb25seSBhc3NpZ25lZCBhcHBvaW50bWVudHMgdG8gY3VycmVudCB1c2VyCiAgICAgICAgaWYgKCAkU2hvd25BcHBvaW50bWVudHNQcmVmVmFsID09IDIgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEfSA9ICRTZWxmLT57VXNlcklEfTsKCiAgICAgICAgICAgICMgZGlzcGxheSBub3RpZnkgbGluZQogICAgICAgICAgICAkUGFyYW17Tm90aWZ5TGluZX0gPSB7CiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnV2FybmluZycsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoJ1Nob3dpbmcgb25seSBhcHBvaW50bWVudHMgYXNzaWduZWQgdG8geW91ISBDaGFuZ2Ugc2V0dGluZ3MnKSwKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O1N1YmFjdGlvbj1DYWxlbmRhclNldHRpbmdzU2hvdycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkQ2FsZW5kYXJMaW1pdCA9IGludCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkNhbGVuZGFyTGltaXRPdmVydmlldycpIHx8IDEwOwogICAgICAgIG15ICRDYWxlbmRhclNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7ICdVc2VyJyAuICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59IC4gJ0NhbGVuZGFyU2VsZWN0aW9uJyB9IHx8ICdbXScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEN1cnJlbnRDYWxlbmRhciA9IDE7CiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFycykgewoKICAgICAgICAgICAgIyBjaGVjayB0aGUgY2FsZW5kYXIgaWYgc3RvcmVkIGluIHByZWZlcmVuY2VzCiAgICAgICAgICAgIGlmICggc2NhbGFyIEB7JENhbGVuZGFyU2VsZWN0aW9ufSApIHsKICAgICAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfID09ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9IH0gQHskQ2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjYWxlbmRhciBieSBkZWZhdWx0IGlmIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhci0+e0NoZWNrZWR9ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiICcgaWYgJEN1cnJlbnRDYWxlbmRhciA8PSAkQ2FsZW5kYXJMaW1pdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYWNjZXNzIHRva2VucwogICAgICAgICAgICAkQ2FsZW5kYXItPntBY2Nlc3NUb2tlbn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldEFjY2Vzc1Rva2VuKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjYWxlbmRhciBjaGVja2JveCBpbiB0aGUgd2lkZ2V0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FsZW5kYXJTd2l0Y2gnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2FsZW5kYXJ9LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSBiZXN0IHRleHQgY29sb3IKICAgICAgICAgICAgJFBhcmFte1RleHRDb2xvcn0gPSAkQ2FsZW5kYXJPYmplY3QtPkdldFRleHRDb2xvcigKICAgICAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJENhbGVuZGFyLT57Q29sb3J9LAogICAgICAgICAgICApIHx8ICcjRkZGRkZGJzsKCiAgICAgICAgICAgICMgY2FsZW5kYXIgc291cmNlIChKU09OKQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JENhbGVuZGFyfSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbGVuZGFyU291cmNlQ29tbWEnLAogICAgICAgICAgICApIGlmICRDdXJyZW50Q2FsZW5kYXIgPCBzY2FsYXIgQENhbGVuZGFyczsKCiAgICAgICAgICAgICRDdXJyZW50Q2FsZW5kYXIrKzsKICAgICAgICB9CgogICAgICAgICMgc2V0IGluaXRpYWwgdmlldwogICAgICAgICRQYXJhbXtEZWZhdWx0Vmlld30gPSAkUHJlZmVyZW5jZXN7ICdVc2VyJyAuICRTZWxmLT57T3ZlcnZpZXdTY3JlZW59IC4gJ0RlZmF1bHRWaWV3JyB9CiAgICAgICAgICAgIHx8ICd0aW1lbGluZVdlZWsnOwoKICAgICAgICAjIGNoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQKICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgIyBzaG93IHJlc291cmNlIGJsb2NrIGluIHRvb2x0aXBzCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpLT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgZ2V0IHJlZ2lzdGVyZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICAgICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKTsKCiAgICAgICAgbXkgJEN1cnJlbnRUeXBlID0gMTsKICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgKSB7CiAgICAgICAgICAgIG15ICROb0RyYWcgPSAwOwoKICAgICAgICAgICAgIyBwcmV2ZW50IGRyYWdnaW5nIG9mIHRpY2tldCBlc2NhbGF0aW9uIGFwcG9pbnRtZW50cwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkVHlwZSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICB8fCAkVHlwZSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUeXBlIGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICROb0RyYWcgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBjb25maWd1cmVkIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIG1hcmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudE1hcmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50TWFyayA9PiBsYyBzdWJzdHIoICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfS0+e01hcmt9LCAwLCAxICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDdXJyZW50VHlwZSA8IHNjYWxhciBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnRNYXJrQ29tbWEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgY29uZmlndXJlZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBkcmFnZ2FiaWxpdHkKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRBcHBvaW50bWVudE5vRHJhZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgTm9EcmFnICAgICAgICAgID0+ICROb0RyYWcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDdXJyZW50VHlwZSA8IHNjYWxhciBrZXlzICVUaWNrZXRBcHBvaW50bWVudFR5cGVzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQ3VycmVudFR5cGUrKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHdvcmtpbmcgaG91ciBhcHBvaW50bWVudHMKICAgICAgICBteSBAV29ya2luZ0hvdXJzID0gJFNlbGYtPl9HZXRXb3JraW5nSG91cnMoKTsKCiAgICAgICAgbXkgJEN1cnJlbnRBcHBvaW50bWVudCA9IDE7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQFdvcmtpbmdIb3VycykgewoKICAgICAgICAgICAgIyBzb3J0IGRheXMgb2YgdGhlIHdlZWsKICAgICAgICAgICAgbXkgQERvVyA9IHNvcnQgQHsgJEFwcG9pbnRtZW50LT57RG9XfSB9OwoKICAgICAgICAgICAgIyBvdXRwdXQgYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXb3JraW5nSG91cnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgICAgIERvVyA9PiAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFxARG9XICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1dvcmtpbmdIb3Vyc0NvbW1hJywKICAgICAgICAgICAgKSBpZiAkQ3VycmVudEFwcG9pbnRtZW50IDwgc2NhbGFyIEBXb3JraW5nSG91cnM7CgogICAgICAgICAgICAkQ3VycmVudEFwcG9pbnRtZW50Kys7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBubyBjYWxlbmRhciBmb3VuZCBtZXNzYWdlCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9DYWxlbmRhcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0ZXh0IGRpcmVjdGlvbiBmcm9tIGxhbmd1YWdlIG9iamVjdAogICAgbXkgJFRleHREaXJlY3Rpb24gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT57VGV4dERpcmVjdGlvbn0gfHwgJyc7CgogICAgIyBvdXRwdXQgcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgaWYgKCAkUGFyYW17Tm90aWZ5TGluZX0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICV7ICRQYXJhbXtOb3RpZnlMaW5lfSB9LAogICAgICAgICk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRWRpdEFjdGlvbiAgICAgICAgPT4gJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgRWRpdE1hc2tTdWJhY3Rpb24gPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgUHJlZlN1YmFjdGlvbiAgICAgPT4gJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgTGlzdEFjdGlvbiAgICAgICAgPT4gJ0FnZW50QXBwb2ludG1lbnRMaXN0JywKICAgICAgICAgICAgRGF5c1N1YmFjdGlvbiAgICAgPT4gJ0FwcG9pbnRtZW50RGF5cycsCiAgICAgICAgICAgIEZpcnN0RGF5ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAwLAogICAgICAgICAgICBJc1JUTExhbmd1YWdlICAgICA9PiAoICRUZXh0RGlyZWN0aW9uIGVxICdydGwnICkgPyAndHJ1ZScgOiAnZmFsc2UnLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfR2V0V29ya2luZ0hvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgd29ya2luZyBob3VycyBmcm9tIHN5c2NvbmZpZwogICAgbXkgJFdvcmtpbmdIb3Vyc0NvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGltZVdvcmtpbmdIb3VycycpOwoKICAgICMgY3JlYXRlIHdvcmtpbmcgaG91ciBhcHBvaW50bWVudHMgZm9yIGVhY2ggZGF5CiAgICBteSBAV29ya2luZ0hvdXJzOwogICAgZm9yIG15ICREYXlOYW1lICggc29ydCBrZXlzICV7JFdvcmtpbmdIb3Vyc0NvbmZpZ30gKSB7CgogICAgICAgICMgZGF5IG9mIHRoZSB3ZWVrCiAgICAgICAgbXkgJERvVyA9IDA7ICAgICMgU3VuCiAgICAgICAgaWYgKCAkRGF5TmFtZSBlcSAnTW9uJyApIHsKICAgICAgICAgICAgJERvVyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ1R1ZScgKSB7CiAgICAgICAgICAgICREb1cgPSAyOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdXZWQnICkgewogICAgICAgICAgICAkRG9XID0gMzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRGF5TmFtZSBlcSAnVGh1JyApIHsKICAgICAgICAgICAgJERvVyA9IDQ7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJERheU5hbWUgZXEgJ0ZyaScgKSB7CiAgICAgICAgICAgICREb1cgPSA1OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICREYXlOYW1lIGVxICdTYXQnICkgewogICAgICAgICAgICAkRG9XID0gNjsKICAgICAgICB9CgogICAgICAgIG15ICRTdGFydFRpbWUgPSAwOwogICAgICAgIG15ICRFbmRUaW1lICAgPSAwOwoKICAgICAgICBTVEFSVF9USU1FOgogICAgICAgIGZvciAoICRTdGFydFRpbWUgPSAwOyAkU3RhcnRUaW1lIDwgMjQ7ICRTdGFydFRpbWUrKyApIHsKCiAgICAgICAgICAgICMgaXMgdGhpcyB3b3JraW5nIGhvdXI/CiAgICAgICAgICAgIGlmICggZ3JlcCB7ICRfIGVxICRTdGFydFRpbWUgfSBAeyAkV29ya2luZ0hvdXJzQ29uZmlnLT57JERheU5hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBnbyB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nIGhvdXJzCiAgICAgICAgICAgICAgICBmb3IgKCBteSAkRW5kSG91ciA9ICRTdGFydFRpbWU7ICRFbmRIb3VyIDwgMjQ7ICRFbmRIb3VyKysgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICRFbmRIb3VyIH0gQHsgJFdvcmtpbmdIb3Vyc0NvbmZpZy0+eyREYXlOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRW5kVGltZSA9ICRFbmRIb3VyOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA+ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBXb3JraW5nSG91cnMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gc3ByaW50ZiggJyUwMmQ6MDA6MDAnLCAkU3RhcnRUaW1lICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+IHNwcmludGYoICclMDJkOjAwOjAwJywgJEVuZFRpbWUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb1cgICAgICAgPT4gWyREb1ddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIHNvbWUgaG91cnMKICAgICAgICAgICAgICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRFbmRIb3VyOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTVEFSVF9USU1FOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbGxhcHNlIGFwcG9pbnRtZW50cyB3aXRoIHNhbWUgc3RhcnQgYW5kIGVuZCB0aW1lcwogICAgZm9yIG15ICRBcHBvaW50bWVudEEgKEBXb3JraW5nSG91cnMpIHsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50QiAoQFdvcmtpbmdIb3VycykgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRBLT57U3RhcnRUaW1lfSAmJiAkQXBwb2ludG1lbnRCLT57U3RhcnRUaW1lfQogICAgICAgICAgICAgICAgJiYgJEFwcG9pbnRtZW50QS0+e1N0YXJ0VGltZX0gZXEgJEFwcG9pbnRtZW50Qi0+e1N0YXJ0VGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntFbmRUaW1lfSBlcSAkQXBwb2ludG1lbnRCLT57RW5kVGltZX0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudEEtPntEb1d9IG5lICRBcHBvaW50bWVudEItPntEb1d9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQHsgJEFwcG9pbnRtZW50QS0+e0RvV30gfSwgQHsgJEFwcG9pbnRtZW50Qi0+e0RvV30gfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudEIgPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBvbmx5IG5vbi1lbXB0eSBhcHBvaW50bWVudHMKICAgIHJldHVybiBncmVwIHsgc2NhbGFyIGtleXMgJXskX30gfSBAV29ya2luZ0hvdXJzOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50RWRpdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntFbXB0eVN0cmluZ30gPSAnLSc7CgogICAgIyBnZXQgdGltZSB6b25lIG9mZnNldAogICAgJFNlbGYtPntUaW1lWm9uZX0gPSAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gfHwgMDsKICAgICRTZWxmLT57VGltZVNlY0RpZmZ9ID0gJFNlbGYtPntUaW1lWm9uZX0gKiAzNjAwOyAgICAjIDYwICogNjAKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgUEFSQU1OQU1FOgogICAgZm9yIG15ICRLZXkgKEBQYXJhbU5hbWVzKSB7CgogICAgICAgICMgc2tpcCB0aGUgQWN0aW9uIHBhcmFtZXRlciwgaXQncyBnaXZpbmcgQnVpbGREYXRlU2VsZWN0aW9uIHByb2JsZW1zIGZvciBzb21lIHJlYXNvbgogICAgICAgIG5leHQgUEFSQU1OQU1FIGlmICRLZXkgZXEgJ0FjdGlvbic7CgogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICBteSAlUGVybWlzc2lvbkxldmVsID0gKAogICAgICAgICdybycgICAgICAgID0+IDEsCiAgICAgICAgJ21vdmVfaW50bycgPT4gMiwKICAgICAgICAnY3JlYXRlJyAgICA9PiAzLAogICAgICAgICdub3RlJyAgICAgID0+IDQsCiAgICAgICAgJ293bmVyJyAgICAgPT4gNSwKICAgICAgICAncHJpb3JpdHknICA9PiA2LAogICAgICAgICdydycgICAgICAgID0+IDcsCiAgICApOwoKICAgIG15ICRQZXJtaXNzaW9ucyA9ICdydyc7CgogICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sKICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGVkaXQgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0VkaXRNYXNrJyApIHsKCiAgICAgICAgIyBnZXQgYWxsIHVzZXIncyB2YWxpZCBjYWxlbmRhcnMKICAgICAgICBteSAkVmFsaWRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJ3ZhbGlkJywKICAgICAgICApOwogICAgICAgIG15IEBDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCgKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gZGF0YSBmb3Igc2VsZWN0IGJveAogICAgICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBJRCBsb29rdXAKICAgICAgICBteSAlQ2FsZW5kYXJMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0NhbGVuZGFySUR9ID0+ICRfLT57Q2FsZW5kYXJOYW1lfQogICAgICAgIH0gQENhbGVuZGFyczsKCiAgICAgICAgZm9yIG15ICRDYWxlbmRhciAoQENhbGVuZGFyRGF0YSkgewoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0tleX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25MZXZlbHskQ2FsZW5kYXJQZXJtaXNzaW9ufSA8IDMgKSB7CgogICAgICAgICAgICAgICAgIyBwZXJtaXNzaW9ucyA8IGNyZWF0ZQogICAgICAgICAgICAgICAgJENhbGVuZGFyLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgeWVhciBib3VuZGFyaWVzCiAgICAgICAgbXkgKCAlWWVhclBlcmlvZFBhc3QsICVZZWFyUGVyaW9kRnV0dXJlICk7CiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcgKFN0YXJ0IEVuZCBSZWN1cnJlbmNlVW50aWwpKSB7CiAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IDU7CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGF0ZSBzZWxlY3Rpb24gdGltZSB6b25lIGNhbGN1bGF0aW9uIGJ5IGRlZmF1bHQKICAgICAgICBteSAkT3ZlcnJpZGVUaW1lWm9uZSA9IDE7CgogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBub24tZXhpc3RlbnQgYXBwb2ludG1lbnQKICAgICAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdBcHBvaW50bWVudCBub3QgZm91bmQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVzZSB0aW1lIHpvbmUgY2FsY3VsYXRpb24gaWYgZWRpdGluZyBleGlzdGluZyBhcHBvaW50bWVudHMKICAgICAgICAgICAgIyBidXQgb25seSBpZiBub3QgZGVhbGluZyB3aXRoIGFuIGFsbCBkYXkgYXBwb2ludG1lbnQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3ZlcnJpZGVUaW1lWm9uZSA9ICRBcHBvaW50bWVudHtBbGxEYXl9IHx8IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgJFBlcm1pc3Npb25zID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3RhcnQgdGltZSBjb21wb25lbnRzCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBteSAkU3RhcnRTZWNvbmQsICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSwgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSwgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0sICRBcHBvaW50bWVudHtTdGFydFdlZWtEYXl9CiAgICAgICAgICAgICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSApOwoKICAgICAgICAgICAgIyBnZXQgZW5kIHRpbWUgY29tcG9uZW50cwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSA4NjQwMDsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgbXkgJEVuZFNlY29uZCwgJEFwcG9pbnRtZW50e0VuZE1pbnV0ZX0sICRBcHBvaW50bWVudHtFbmRIb3VyfSwgJEFwcG9pbnRtZW50e0VuZERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9LCAkQXBwb2ludG1lbnR7RW5kWWVhcn0KICAgICAgICAgICAgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCggU3lzdGVtVGltZSA9PiAkRW5kVGltZSApOwoKICAgICAgICAgICAgIyBnZXQgcmVjdXJyZW5jZSB1bnRpbCBjb21wb25lbnRzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTZWNvbmQsICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxNaW51dGV9LCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbERheX0sICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9CiAgICAgICAgICAgICAgICApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KCBTeXN0ZW1UaW1lID0+ICRSZWN1cnJlbmNlVW50aWwgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0IEVuZCBSZWN1cnJlbmNlVW50aWwpKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHsiJHtGaWVsZH1ZZWFyIn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERpZmYgPSAkQXBwb2ludG1lbnR7IiR7RmllbGR9WWVhciJ9IC0gJFllYXI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlmZiA+IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IGFicyAkRGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGlmZiA8IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17RGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJEdldFBhcmFte0RheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheSAoQERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ICs9ICREYXlPZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSA4ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtEYXlzfSA9IGpvaW4oICIsIiwgQERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoRGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkR2V0UGFyYW17TW9udGhEYXlzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1vbnRoRGF5IChATW9udGhEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ICs9ICREYXlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ID0gMSBpZiAkRGF5ID09IDMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9ID0gam9pbiggIiwiLCBATW9udGhEYXlzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoc30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkR2V0UGFyYW17TW9udGhzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aHMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSBqb2luKCAiLCIsIEBNb250aHMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudC4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldElEfSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgR2V0IGRhdGUgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUnVsZS0+eyRUeXBlfSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seVN0YXJ0fSAgICA9IDEgaWYgJFR5cGUgZXEgJ1N0YXJ0RGF0ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlEdXJhdGlvbn0gPSAxIGlmICRUeXBlIGVxICdFbmREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlLT57JFR5cGV9ID1+IC9eUGx1c19bMC05XSskLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlbGVjdGVkIHRpbWVzdGFtcAogICAgICAgIG15ICRTZWxlY3RlZFRpbWVzdGFtcCA9IHNwcmludGYoCiAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICApOwoKICAgICAgICAjIGdldCBjdXJyZW50IGRheQogICAgICAgIG15ICRTZWxlY3RlZFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZWN0ZWRUaW1lc3RhbXAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxlY3RlZFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgd2VlayBkYXkgaWYgbm90IHNldAogICAgICAgIGlmICggISRBcHBvaW50bWVudHtEYXlzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJERhdGVJbmZvWzZdOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbW9udGggZGF5IGlmIG5vdCBzZXQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7TW9udGhEYXlzfSApIHsKICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkRGF0ZUluZm9bM107CiAgICAgICAgfQoKICAgICAgICAjIHNldCBtb250aCBpZiBub3Qgc2V0CiAgICAgICAgaWYgKCAhJEFwcG9pbnRtZW50e01vbnRoc30gKSB7CiAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ID0gJERhdGVJbmZvWzRdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWxlbmRhciBJRCBzZWxlY3Rpb24KICAgICAgICBteSAkQ2FsZW5kYXJJRCA9ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSAvLyAkR2V0UGFyYW17Q2FsZW5kYXJJRH07CgogICAgICAgICMgY2FsZW5kYXIgbmFtZQogICAgICAgIGlmICgkQ2FsZW5kYXJJRCkgewogICAgICAgICAgICAkUGFyYW17Q2FsZW5kYXJOYW1lfSA9ICRDYWxlbmRhckxvb2t1cHskQ2FsZW5kYXJJRH07CiAgICAgICAgfQoKICAgICAgICAjIGNhbGVuZGFyIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtDYWxlbmRhcklEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAQ2FsZW5kYXJEYXRhLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENhbGVuZGFySUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2FsZW5kYXJJRCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgYWxsIGRheQogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte0FsbERheX0gfHwKICAgICAgICAgICAgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gJiYgJEFwcG9pbnRtZW50e0FsbERheX0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17QWxsRGF5U3RyaW5nfSAgPSBUcmFuc2xhdGFibGUoJ1llcycpOwogICAgICAgICAgICAkUGFyYW17QWxsRGF5Q2hlY2tlZH0gPSAnY2hlY2tlZD0iY2hlY2tlZCInOwoKICAgICAgICAgICAgIyBzdGFydCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtTdGFydERhdGV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgLy8gJEdldFBhcmFte1N0YXJ0WWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gLy8gJEdldFBhcmFte1N0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtFbmREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZFllYXJ9ICAvLyAkR2V0UGFyYW17RW5kWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9IC8vICRHZXRQYXJhbXtFbmRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kRGF5fSAgIC8vICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0FsbERheVN0cmluZ30gID0gVHJhbnNsYXRhYmxlKCdObycpOwogICAgICAgICAgICAkUGFyYW17QWxsRGF5Q2hlY2tlZH0gPSAnJzsKCiAgICAgICAgICAgICMgc3RhcnQgZGF0ZQogICAgICAgICAgICAkUGFyYW17U3RhcnREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAgLy8gJEdldFBhcmFte1N0YXJ0WWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydERheX0gICAgLy8gJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydEhvdXJ9ICAgLy8gJEdldFBhcmFte1N0YXJ0SG91cn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGVuZCBkYXRlCiAgICAgICAgICAgICRQYXJhbXtFbmREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRZZWFyfSAgIC8vICRHZXRQYXJhbXtFbmRZZWFyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNb250aH0gIC8vICRHZXRQYXJhbXtFbmRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kRGF5fSAgICAvLyAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRIb3VyfSAgIC8vICRHZXRQYXJhbXtFbmRIb3VyfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtTdGFydERhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIFN0YXJ0SG91ciAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgU3RhcnRNaW51dGUgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0+ICdFbmQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGVuZCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtFbmREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdFbmQnLAogICAgICAgICAgICBFbmRIb3VyICAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kSG91cn0gLy8gJEdldFBhcmFte0VuZEhvdXJ9LAogICAgICAgICAgICBFbmRNaW51dGUgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kTWludXRlfSAvLyAkR2V0UGFyYW17RW5kTWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBWYWxpZGF0ZURhdGVBZnRlclByZWZpeCA9PiAnU3RhcnQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICAgICA9PiAkWWVhclBlcmlvZFBhc3R7RW5kfSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7RW5kfSwKICAgICAgICAgICAgT3ZlcnJpZGVUaW1lWm9uZSAgICAgICAgPT4gJE92ZXJyaWRlVGltZVpvbmUsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFpbiBvYmplY3QKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICggJE1haW5PYmplY3QtPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgICAgICAgICAgbXkgJFRlYW1JRHMgPSAkQXBwb2ludG1lbnR7VGVhbUlEfTsKICAgICAgICAgICAgaWYgKCAhJFRlYW1JRHMgKSB7CiAgICAgICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgICAgICRUZWFtSURzID0gXEBUZWFtSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUmVzb3VyY2VJRHMgPSAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH07CiAgICAgICAgICAgIGlmICggISRSZXNvdXJjZUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdSZXNvdXJjZUlEW10nICk7CiAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRHMgPSBcQFJlc291cmNlSURzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAjIGdldCBhbGxvd2VkIHRlYW0gbGlzdCBmb3IgY3VycmVudCB1c2VyCiAgICAgICAgICAgIG15ICVUZWFtTGlzdCA9ICRUZWFtT2JqZWN0LT5BbGxvd2VkVGVhbUxpc3QoCiAgICAgICAgICAgICAgICBQcmV2ZW50RW1wdHkgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHRlYW0gbmFtZXMKICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgJFRlYW1MaXN0eyRUZWFtSUR9IGlmICRUZWFtTGlzdHskVGVhbUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAVGVhbU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSBqb2luKCAnPGJyPicsIEBUZWFtTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZWFtTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17VGVhbUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1MaXN0LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZWFtSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUZWFtSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHNlbGVjdGVkIHRlYW1zCiAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CiAgICAgICAgICAgIFRFQU1JRDoKICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyRUZWFtSURzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlc291cmNlIG5hbWVzCiAgICAgICAgICAgIG15IEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyRSZXNvdXJjZUlEc30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfSBpZiAkVGVhbVVzZXJMaXN0QWxseyRSZXNvdXJjZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHNjYWxhciBAUmVzb3VyY2VOYW1lcyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFJlc291cmNlTmFtZXMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZU5hbWVzfSA9ICRTZWxmLT57RW1wdHlTdHJpbmd9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRlYW0gdXNlciBsaXN0IHN0cmluZwogICAgICAgICAgICAkUGFyYW17UmVzb3VyY2VJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUZWFtVXNlckxpc3RBbGwsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlc291cmNlSURzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNvdXJjZUlEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9IDA7CiAgICAgICAgbXkgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAnQ3VzdG9tRGFpbHknOyAgICAjIGRlZmF1bHQKCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKCiAgICAgICAgICAgICMgZnJvbSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKICAgICAgICAgICAgaWYgKCAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSA9fiAvQ3VzdG9tLyApIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGU7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSAgICAgICA9ICdDdXN0b20nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmV2ZXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0RhaWx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgRGF5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdXZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBXZWVrJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdNb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgTW9udGgnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1llYXJseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFllYXInKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVJlY3VycmVuY2VUeXBlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBAUmVjdXJyZW5jZVR5cGVzOwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAkUmVjdXJyZW5jZVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZVR5cGV9LAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAUmVjdXJyZW5jZVR5cGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZVR5cGUnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgY3VzdG9tIHR5cGUKICAgICAgICBteSBAUmVjdXJyZW5jZUN1c3RvbVR5cGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdEYWlseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnV2Vla2x5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTW9udGhseScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnWWVhcmx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXM7CiAgICAgICAgbXkgJFJlY3VycmVuY2VDdXN0b21UeXBlID0gJFJlY3VycmVuY2VDdXN0b21UeXBlTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICBsYyAkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgKSBpZiAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbSc7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VDdXN0b21UeXBlJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIHJlY3VycmVuY2UgaW50ZXJ2YWwKICAgICAgICBteSAkU2VsZWN0ZWRJbnRlcnZhbCA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSApIHsKICAgICAgICAgICAgbXkgJVJlY3VycmVuY2VJbnRlcnZhbExvb2t1cCA9ICgKICAgICAgICAgICAgICAgICdDdXN0b21EYWlseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdkYXkocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21XZWVrbHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnd2VlayhzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbU1vbnRobHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnbW9udGgocyknLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdDdXN0b21ZZWFybHknID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAneWVhcihzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgJiYgJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbScgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2V2ZXJ5JykKICAgICAgICAgICAgICAgICAgICAuICcgJyAuICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkUmVjdXJyZW5jZUludGVydmFsTG9va3VweyRTZWxlY3RlZFJlY3VycmVuY2VDdXN0b21UeXBlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgaW50ZXJ2YWwgc2VsZWN0aW9uICgxLTMxKQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWw7CiAgICAgICAgZm9yICggbXkgJERheU51bWJlciA9IDE7ICREYXlOdW1iZXIgPCAzMjsgJERheU51bWJlcisrICkgewogICAgICAgICAgICBwdXNoIEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkRGF5TnVtYmVyLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFxAUmVjdXJyZW5jZUN1c3RvbUludGVydmFsLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxlY3RlZEludGVydmFsLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZWN1cnJlbmNlSW50ZXJ2YWwnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBsaW1pdAogICAgICAgIG15ICRSZWN1cnJlbmNlTGltaXQgPSAxOwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXQgPSAyOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdmb3IgJXMgdGltZShzKScsICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0IHN0cmluZwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlTGltaXRTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCd1bnRpbCAuLi4nKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ2ZvciAuLi4gdGltZShzKScpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRSZWN1cnJlbmNlTGltaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVjdXJyZW5jZUxpbWl0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gMDsKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgYW5kIHN0YXJ0IHRpbWUgZm9yIGRpZmZlcmVuY2UKICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBZZWFyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICA9PiAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICAgICBIb3VyICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gJFN0YXJ0VGltZSAtICRTeXN0ZW1UaW1lICsgNjAgKiA2MCAqIDI0ICogMzsgICAgIyBzdGFydCArMyBkYXlzCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxEYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd1bnRpbCAlcycsICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIHVudGlsIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICA9PiAnUmVjdXJyZW5jZVVudGlsJywKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgICAgID0+ICRSZWN1cnJlbmNlVW50aWxEaWZmVGltZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvblRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBub3RpZmljYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uVGVtcGxhdGVzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvblRlbXBsYXRlfSB8fCAnMCc7CiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSA9ICROb3RpZmljYXRpb25UZW1wbGF0ZUxvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgbm90aWZpY2F0aW9uIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25UZW1wbGF0ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cwogICAgICAgIG15IEBOb3RpZmljYXRpb25DdXN0b21Vbml0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGUocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnaG91cihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnZGF5cycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2RheShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0czsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0ID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0gfHwgJ21pbnV0ZXMnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVVuaXRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICB8fCAnYmVmb3Jlc3RhcnQnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZGF0ZSB1bml0cyBmb3IgdGhlIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gKSB7CgogICAgICAgICAgICAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gZGF0ZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGggID0+ICRNb250aCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkgICAgPT4gJERheSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyICAgPT4gJEhvdXIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlID0+ICRNaW51dGUsCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7U3RhcnR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSByYWRpbyBidXR0b24gZm9yIGN1c3RvbSBkYXRlIHRpbWUgYW5kIHJlbGF0aXZlIGlucHV0CiAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gfHw9ICcnOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJyAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICYmICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0TG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXR9CiAgICAgICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgICAgICAuICROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXB7JFNlbGVjdGVkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGx1Z2luIGxpc3QKICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0gPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaXN0KCk7CgogICAgICAgICMgbmV3IGFwcG9pbnRtZW50IHBsdWdpbiBzZWFyY2gKICAgICAgICBpZiAoICRHZXRQYXJhbXtQbHVnaW5LZXl9ICYmICggJEdldFBhcmFte1NlYXJjaH0gfHwgJEdldFBhcmFte09iamVjdElEfSApICkgewoKICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEdldFBhcmFte1BsdWdpbktleX0gfSBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgc2VhcmNoIHVzaW5nIHBsdWdpbgogICAgICAgICAgICAgICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyAkR2V0UGFyYW17UGx1Z2luS2V5fSB9ID0gW107CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5ID0gc29ydCBrZXlzICV7JFJlc3VsdExpc3R9OwoKICAgICAgICAgICAgICAgICMgYWRkIHBvc3NpYmxlIGxpbmtzCiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rTmFtZSA9PiAkUmVzdWx0TGlzdC0+eyRMaW5rSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rVVJMICA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5VUkx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtJRAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkxpc3R9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0tPntMaW5rTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBMaW5rQXJyYXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYXBwb2ludG1lbnQgcGx1Z2luIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UGx1Z2luTGlzdH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICRMaW5rTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtMaXN0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9ID0gW107CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmtJRCAoIHNvcnQga2V5cyAleyRMaW5rTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnskUGx1Z2luS2V5fSB9LCAkTGlua0xpc3QtPnskTGlua0lEfTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksICRMaW5rTGlzdC0+eyRMaW5rSUR9LT57TGlua0lEfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnskUGx1Z2luS2V5fS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFZGl0TWFzaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgUGVybWlzc2lvbkxldmVsID0+ICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCByZWdpc3RlcmVkIGxvY2F0aW9uIGxpbmtzCiAgICAgICAgbXkgJExvY2F0aW9uTGlua0NvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQWdlbnRBcHBvaW50bWVudEVkaXQ6OkxvY2F0aW9uOjpMaW5rJykgLy8ge307CiAgICAgICAgZm9yIG15ICRDb25maWdLZXkgKCBzb3J0IGtleXMgJXskTG9jYXRpb25MaW5rQ29uZmlnfSApIHsKCiAgICAgICAgICAgICMgc2hvdyBsaW5rIGljb24KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMb2NhdGlvbkxpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gPT4gJEFwcG9pbnRtZW50e0xvY2F0aW9ufSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAleyAkTG9jYXRpb25MaW5rQ29uZmlnLT57JENvbmZpZ0tleX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRhdGVwaWNrZXIgaW5pdGlhbGl6YXRpb24KICAgICAgICAjIG9ubHkgaWYgdXNlciBoYXMgcGVybWlzc2lvbnMgbW92ZV9pbnRvIGFuZCBhYm92ZQogICAgICAgIGlmICggJFBlcm1pc3Npb25zICYmICggJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9IDwgMiApID8gMCA6IDEgKSB7CgogICAgICAgICAgICAjIGdldCB0ZXh0IGRpcmVjdGlvbgogICAgICAgICAgICBteSAkVGV4dERpcmVjdGlvbiA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPntUZXh0RGlyZWN0aW9ufSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHZhY2F0aW9uIGRheXMKICAgICAgICAgICAgbXkgJFZhY2F0aW9uRGF5c0pTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgICAgbXkgJFdlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAxOwoKICAgICAgICAgICAgIyBzb21lIGdlbmVyYWwgZGF0ZXBpY2tlciBjb2RlCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckRhdGEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzICA9PiAkVmFjYXRpb25EYXlzSlNPTiwKICAgICAgICAgICAgICAgICAgICBJc1JUTExhbmd1YWdlID0+ICggJFRleHREaXJlY3Rpb24gZXEgJ3J0bCcgKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW5pdGlhbGl6ZSBkYXRlcGlja2VycyBmb3IgZGlmZmVyZW50IGRhdGUgZmllbGRzCiAgICAgICAgICAgIGZvciBteSAkUHJlZml4IChxdyhTdGFydCBFbmQgUmVjdXJyZW5jZVVudGlsIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRGF0ZXBpY2tlckluaXQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXggICAgICAgPT4gJFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgV2Vla0RheVN0YXJ0ID0+ICRXZWVrRGF5U3RhcnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkL2VkaXQgYXBwb2ludG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFZGl0QXBwb2ludG1lbnQnICkgewogICAgICAgIG15ICVBcHBvaW50bWVudDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgICAgICAkUGVybWlzc2lvbnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMjsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gJiYgJEdldFBhcmFte0NhbGVuZGFySUR9ICE9ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSApIHsKCiAgICAgICAgICAgICAgICAjIGluIG9yZGVyIHRvIG1vdmUgYXBwb2ludG1lbnQgdG8gYW5vdGhlciBjYWxlbmRhciwgdXNlciBuZWVkcyAiY3JlYXRlIiBwZXJtaXNzaW9uCiAgICAgICAgICAgICAgICAkUmVxdWlyZWRQZXJtaXNzaW9uID0gMzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30gPCAkUmVxdWlyZWRQZXJtaXNzaW9uICkgewoKICAgICAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbgoKICAgICAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAgID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QWxsRGF5fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFllYXJ9LCAkR2V0UGFyYW17U3RhcnRNb250aH0sICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZQogICAgICAgICAgICBpZiAoICRFbmRUaW1lIDwgJFN0YXJ0VGltZSApIHsKICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtYWtlIGVuZCB0aW1lIGluY2x1c2l2ZSwgYWRkIHdob2xlIGRheQogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyA4NjQwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ1N0YXJ0VGltZScgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdFbmRUaW1lJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUgKyAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lICsgJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte0VuZFllYXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNb250aH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZEhvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kSG91cn0sICRHZXRQYXJhbXtFbmRNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCBlbmQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRW5kVGltZSAtPSAkU2VsZi0+e1RpbWVTZWNEaWZmfTsKCiAgICAgICAgICAgICAgICAjIFByZXZlbnQgc3RvcmluZyBlbmQgdGltZSBiZWZvcmUgc3RhcnQgdGltZS4KICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRBcHBvaW50bWVudHtFbmRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVW50aWwgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJpbmd9ICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gKSB7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdEYWlseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbScgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RheXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF5cyA9IHNwbGl0KCAiLCIsICRHZXRQYXJhbXtEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNl0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCggIiwiLCAkR2V0UGFyYW17TW9udGhEYXlzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICREYXRlSW5mb1szXSBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VDdXN0b21UeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtNb250aHN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBATW9udGhzID0gc3BsaXQoICIsIiwgJEdldFBhcmFte01vbnRoc30gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gXEBNb250aHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9ID0gWyAkRGF0ZUluZm9bNF0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdW50aWwgLi4uCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcxJwogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsRGF5fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDAwOjAwOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsWWVhcn0sICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBwcmV2ZW50IHJlY3VycmVuY2UgdW50aWwgZGF0ZXMgYmVmb3JlIHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbCA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkR2V0UGFyYW17U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUNvdW50fSA9IHVuZGVmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciAuLi4gdGltZShzKQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlTGltaXR9IGVxICcyJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIG5vdGlmaWNhdGlvbiBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lIC09ICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIENhbGN1bGF0ZSBlbmQgdGltZSB1c2luZyBwcmVzZXQgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkU3RhcnRUaW1lICsgNjAgKiAkUHJlc2V0OwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzOwoKICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICBmb3IgbXkgJFBhcmFtICggc29ydCBrZXlzICVHZXRQYXJhbSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyRQYXJhbX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHBhc3MgY3VycmVudCB1c2VyIElECiAgICAgICAgJEdldFBhcmFte1VzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICMgR2V0IHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICBteSBAUGx1Z2luUGFyYW1zID0gZ3JlcCB7ICRfID1+IC9eUGx1Z2luXy8gfSBrZXlzICVHZXRQYXJhbTsKCiAgICAgICAgaWYgKCVBcHBvaW50bWVudCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMgYmVmb3JlIHRoZSB1cGRhdGUuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gPyAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gOiAkU3VjY2VzczsKCiAgICAgICAgaWYgKCRBcHBvaW50bWVudElEKSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGZyZXNoIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJvY2VzcyBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoJEFwcG9pbnRtZW50SUQpOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgJF8tPntBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBncmVwIHsKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkXy0+e1BhcmVudElEfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkXy0+e1BhcmVudElEfSBlcSAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9IEBDYWxlbmRhckFwcG9pbnRtZW50czsKCiAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbGwgZXhpc3RpbmcgbGlua3MuCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3MgY291bGQgbm90IGJlIGRlbGV0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbnMhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgID0+ICRFcnJvciwKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVXBkYXRlUHJlZmVyZW5jZXMnICkgewoKICAgICAgICBteSAkU3VjY2VzcyA9IDA7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVmYXVsdFZpZXd9IHx8ICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0KICAgICAgICAgICAgICAgIHx8ICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApCiAgICAgICAgICAgICAgICB8fCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9CiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXk7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdEZWZhdWx0Vmlldyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17Q2FsZW5kYXJTZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnQ2FsZW5kYXJTZWxlY3Rpb24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1Nob3duUmVzb3VyY2VzfSAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25BcHBvaW50bWVudHN9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgPSAnU2hvd25BcHBvaW50bWVudHMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXInIC4gJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAuICRQcmVmZXJlbmNlS2V5IC4gJFByZWZlcmVuY2VLZXlTdWZmaXgsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJEdldFBhcmFteyRQcmVmZXJlbmNlS2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gJiYgJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9ICkgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3N9IGVxICdTaG93blJlc291cmNlcycgJiYgJEdldFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSAgICAgICA9ICdTaG93blJlc291cmNlcyc7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICItJEdldFBhcmFte1RlYW1JRH0iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJsYW5rIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlYW0gbGlzdCBzZWxlY3Rpb24gdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVhbVVzZXJMaXN0JyApIHsKICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICBteSAlVGVhbVVzZXJMaXN0QWxsOwoKICAgICAgICAjIENoZWNrIGlmIHRlYW0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nKTsKICAgICAgICAgICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoQFRlYW1JRHMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVBTUlEIGlmICEkVGVhbUlEOwoKICAgICAgICAgICAgICAgICMgZ2V0IGxpc3Qgb2YgdGVhbSBtZW1iZXJzCiAgICAgICAgICAgICAgICBteSAlVGVhbVVzZXJMaXN0ID0gJFRlYW1PYmplY3QtPlRlYW1Vc2VyTGlzdCgKICAgICAgICAgICAgICAgICAgICBUZWFtSUQgPT4gJFRlYW1JRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVUZWFtVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRlYW1Vc2VyTGlzdHskVXNlcklEfSA9ICRVc2Vye1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVRlYW1Vc2VyTGlzdEFsbCA9ICggJVRlYW1Vc2VyTGlzdEFsbCwgJVRlYW1Vc2VyTGlzdCApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRlYW1Vc2VyTGlzdCA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKc3ViIF9EYXlPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGNvbnZlcnQgdGltZXN0YW1wIHRvIHVuaXggdGltZQogICAgbXkgJE9yaWdpbmFsVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1RpbWV9LAogICAgKTsKCiAgICAjIGdldCBvcmlnaW5hbCBkYXRlIGluZm8KICAgIG15IEBPcmlnaW5hbERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJE9yaWdpbmFsVGltZVN5c3RlbSwKICAgICk7CgogICAgIyBjYWxjdWxhdGUgZGVzdGluYXRpb24gdGltZSAoYWNjb3JkaW5nIHRvIHVzZXIgdGltZXpvbmUpCiAgICBteSAkRGVzdGluYXRpb25UaW1lU3lzdGVtID0gJE9yaWdpbmFsVGltZVN5c3RlbSArICRTZWxmLT57VGltZVNlY0RpZmZ9OwoKICAgICMgZ2V0IGRlc3RpbmF0aW9uIGRhdGUgaW5mbwogICAgbXkgQERlc3RpbmF0aW9uRGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkRGVzdGluYXRpb25UaW1lU3lzdGVtLAogICAgKTsKCiAgICAjIGNvbXBhcmUgZGF5cyAtIGFycmF5cyBjb250YWlucyBmb2xsb3dpbmcgdmFsdWVzOiBTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciBhbmQgRGF5T2ZXZWVrCiAgICBpZiAoICRPcmlnaW5hbERhdGVJbmZvWzNdID09ICREZXN0aW5hdGlvbkRhdGVJbmZvWzNdICkgewoKICAgICAgICAjIHNhbWUgZGF5CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBlbHNpZiAoICRPcmlnaW5hbFRpbWVTeXN0ZW0gPiAkRGVzdGluYXRpb25UaW1lU3lzdGVtICkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50SW1wb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSW1wb3J0JyApIHsKCiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICBteSAkRm9ybUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKSB8fCAnJzsKCiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKSBpZiAhJEZvcm1JRDsKCiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICJGaWxlVXBsb2FkIiwKICAgICAgICApOwoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICBteSAkVXBkYXRlRXhpc3RpbmcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVXBkYXRlRXhpc3RpbmdBcHBvaW50bWVudHMnICkgfHwgJyc7CiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2FsZW5kYXJJRCcgKSB8fCAnJzsKCiAgICAgICAgbXkgJUVycm9yczsKCiAgICAgICAgaWYgKCAhJENhbGVuZGFySUQgKSB7CiAgICAgICAgICAgICRFcnJvcnN7Q2FsZW5kYXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBmaWxlIGluIHVwbG9hZCBjYWNoZQogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgbXkgJEFkZGVkID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRGb3JtSUQsCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGlmIGZpbGUgZ290IG5vdCBhZGRlZCB0byBzdG9yYWdlCiAgICAgICAgICAgICMgKGUuIGcuIGJlY2F1c2Ugb2YgMSBNQiBtYXhfYWxsb3dlZF9wYWNrZXQgTXlTUUwgcHJvYmxlbSkKICAgICAgICAgICAgaWYgKCAhJEFkZGVkICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29udGVudCBmcm9tIHVwbG9hZCBjYWNoZQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJEZvcm1JRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhQEF0dGFjaG1lbnREYXRhIHx8ICggJEF0dGFjaG1lbnREYXRhWzBdICYmICEleyAkQXR0YWNobWVudERhdGFbMF0gfSApICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tGaWxlVXBsb2FkSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmID0gJXsgJEF0dGFjaG1lbnREYXRhWzBdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGVtcHR5CiAgICAgICAgaWYgKCAhJFVwbG9hZFN0dWZme0NvbnRlbnR9ICkgewogICAgICAgICAgICAkRXJyb3Jze0ZpbGVVcGxvYWRJbnZhbGlkfSA9ICJTZXJ2ZXJFcnJvciI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9ycykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9PdmVydmlldygKICAgICAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUNhbGVuZGFyOwoKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICAgICAgaWYgKCRDYWxlbmRhcklEKSB7CiAgICAgICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNhbGVuZGFyIHBlcm1pc3Npb25zCiAgICAgICAgaWYgKCAhJUNhbGVuZGFyICkgewoKICAgICAgICAgICAgIyBubyBwZXJtaXNzaW9ucwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIHBlcm1pc3Npb25zJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHBlcm1pc3Npb25zIGNoZWNrCiAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ2NyZWF0ZScgJiYgJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKCiAgICAgICAgICAgICMgbm8gcGVybWlzc2lvbnMgdG8gaW1wb3J0IHRvIHRoZSBleGlzdGluZyBjYWxlbmRhcgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIHBlcm1pc3Npb25zJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ291bnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkltcG9ydDo6SUNhbCcpLT5JbXBvcnQoCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgSUNhbCAgICAgICAgICAgPT4gJFVwbG9hZFN0dWZme0NvbnRlbnR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFVwZGF0ZUV4aXN0aW5nID0+ICRVcGRhdGVFeGlzdGluZywKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQ291bnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1N5c3RlbSB3YXMgdW5hYmxlIHRvIGltcG9ydCBmaWxlIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBJbXBvcnQgb2sKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO0ltcG9ydEFwcG9pbnRtZW50c1N1Y2Nlc3M9MTtDb3VudD0ke0NvdW50fTtOYW1lPSIKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJENhbGVuZGFye0NhbGVuZGFyTmFtZX0gKSwKICAgICAgICApOwoKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+X092ZXJ2aWV3KCk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fTWFzayglUGFyYW0pOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEdldCB1c2VyJ3MgcGVybWlzc2lvbnMgdG8gYXNzb2NpYXRlZCBtb2R1bGVzIHdoaWNoIGFyZSBkaXNwbGF5ZWQgYXMgbGlua3MuCiAgICBmb3IgbXkgJE1vZHVsZSAocXcoQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlKSkgewogICAgICAgIG15ICRNb2R1bGVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKQogICAgICAgICAgICAtPnskTW9kdWxlfS0+e0dyb3VwfSAvLyBbXTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1vZHVsZUdyb3VwcykgKSB7CiAgICAgICAgICAgIE1PRFVMRV9HUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRNb2R1bGVHcm91cCAoIEB7JE1vZHVsZUdyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPnsiVXNlcklzR3JvdXBbJE1vZHVsZUdyb3VwXSJ9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtNb2R1bGVQZXJtaXNzaW9uc30tPnskTW9kdWxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBNT0RVTEVfR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQWx3YXlzIGFsbG93IGxpbmtzIGlmIG5vIGdyb3VwcyBhcmUgc3BlY2lmaWVkLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUGVybWlzc2lvbnN9LT57JE1vZHVsZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17VGl0bGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIik7CiAgICAkUGFyYW17Q2FsZW5kYXJJREludmFsaWR9IC8vPSAnJzsKCiAgICBteSBAQ2FsZW5kYXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyTGlzdCgKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdjcmVhdGUnLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkXy0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgfQogICAgfSBzb3J0IHsgJGEtPntDYWxlbmRhck5hbWV9IGNtcCAkYi0+e0NhbGVuZGFyTmFtZX0gfSBAQ2FsZW5kYXJMaXN0OwoKICAgICRQYXJhbXtDYWxlbmRhcn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXEBDYWxlbmRhckRhdGEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDYWxlbmRhcklEJywKICAgICAgICBJRCAgICAgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAkUGFyYW17Q2FsZW5kYXJJREludmFsaWR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRpdGxlICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkNhbGVuZGFyIiksCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSB8fCAnJywKICAgICk7CgogICAgIyBnZXQgRm9ybUlEIGZyb20gcGFyYW1zCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICkgfHwgJyc7CgogICAgIyBnZW5lcmF0ZSBGb3JtSUQgaWYgZW1wdHkKICAgICRQYXJhbXtGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCkgaWYgISRQYXJhbXtGb3JtSUR9OwoKICAgIHJldHVybiAkU2VsZi0+X01hc2soJVBhcmFtKTsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBwYWdlCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRBcHBvaW50bWVudEltcG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50TGlzdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgdGltZSB6b25lIG9mZnNldAogICAgJFNlbGYtPntUaW1lWm9uZX0gPSAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gfHwgMDsKICAgICRTZWxmLT57VGltZVNlY0RpZmZ9ID0gJFNlbGYtPntUaW1lWm9uZX0gKiAzNjAwOyAgICAjIDYwICogNjAKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IG5hbWVzIG9mIGFsbCBwYXJhbWV0ZXJzCiAgICBteSBAUGFyYW1OYW1lcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW1OYW1lcygpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChAUGFyYW1OYW1lcykgewogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0FwcG9pbnRtZW50SURzJzsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKCBEYXRhID0+IFtdICk7CgogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgY2hlY2sgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xpc3RBcHBvaW50bWVudHMnICkgewoKICAgICAgICBpZiAoICRHZXRQYXJhbXtDYWxlbmRhcklEfSApIHsKCiAgICAgICAgICAgICMgYXBwZW5kIG1pZG5pZ2h0IHRvIHRoZSB0aW1lc3RhbXBzCiAgICAgICAgICAgIGZvciBteSAkVGltZXN0YW1wIChxdyhTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyRUaW1lc3RhbXB9ICYmICEoICRHZXRQYXJhbXskVGltZXN0YW1wfSA9fiAvXHNcZHsyfTpcZHsyfTpcZHsyfSQvICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lc3RhbXB9ID0gJEdldFBhcmFteyRUaW1lc3RhbXB9IC4gJyAwMDowMDowMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCB0byBsb2NhbCB0aW1lCiAgICAgICAgICAgICRTdGFydFRpbWUgLT0gJFNlbGYtPntUaW1lU2VjRGlmZn07CiAgICAgICAgICAgICRFbmRUaW1lICAgLT0gJFNlbGYtPntUaW1lU2VjRGlmZn07CgogICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IGVtcHR5IHBhcmFtZXRlcnMKICAgICAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdvIHRocm91Z2ggYWxsIGFwcG9pbnRtZW50cwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3Igbm90aWZpY2F0aW9uIGRhdGUKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQXBwb2ludG1lbnQtPntOb3RpZmljYXRpb25EYXRlfSBlcSAnMDAwMC0wMC0wMCAwMDowMDowMCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBzeXN0ZW0gdGltZXMKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNhdmUgdGltZSBzdGFtcHMgZm9yIGRpc3BsYXkgYmVmb3JlIGNhbGN1bGF0aW9uCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntTdGFydERhdGV9ID0gJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZERhdGV9ICAgPSAkQXBwb2ludG1lbnQtPntFbmRUaW1lfTsKCiAgICAgICAgICAgICAgICAjIGVuZCB0aW1lcyBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgYXJlIGluY2x1c2l2ZSwgc3VidHJhY3Qgd2hvbGUgZGF5CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVuZFRpbWUgLT0gODY0MDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRW5kVGltZSA8ICRTdGFydFRpbWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbmRUaW1lID0gJFN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGxvY2FsIHRpbWVzIGZvciBjb250cm9sCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3RhcnRUaW1lICs9ICRTZWxmLT57VGltZVNlY0RpZmZ9OwogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lICs9ICRTZWxmLT57VGltZVNlY0RpZmZ9OwogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e0VuZFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRlZCBkYXRlL3RpbWUgc3RyaW5ncyB1c2VkIGluIGRpc3BsYXkKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N0YXJ0RGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnIC4gKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ID8gJ1Nob3J0JyA6ICcnICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntFbmREYXRlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57RW5kRGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnIC4gKCAkQXBwb2ludG1lbnQtPntBbGxEYXl9ID8gJ1Nob3J0JyA6ICcnICkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50LT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpbmNsdWRlIHJlc291cmNlIGRhdGEKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RlYW1OYW1lfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntSZXNvdXJjZU5hbWVzfSA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgU2lsZW50ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1RlYW1JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBUZWFtTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIFRFQU1JRDoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtSUQgKCBAeyAkQXBwb2ludG1lbnQtPntUZWFtSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRFQU1JRCBpZiAhJFRlYW1JRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEID0+ICRUZWFtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBUZWFtTmFtZXMsICRUZWFte05hbWV9IGlmICVUZWFtOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGVhbUNvdW50ID0gc2NhbGFyIEBUZWFtTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFRlYW1Db3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQFRlYW1OYW1lcywgMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFRlYW1OYW1lcywgc3ByaW50ZiggVHJhbnNsYXRhYmxlKCcrJWQgbW9yZScpLCAkVGVhbUNvdW50IC0gMyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUZWFtTmFtZXN9ID0gam9pbiggJ1xuJywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBSZXNvdXJjZU5hbWVzOwogICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRUlEOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyAkQXBwb2ludG1lbnQtPntSZXNvdXJjZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBSRVNPVVJDRUlEIGlmICEkUmVzb3VyY2VJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUmVzb3VyY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCAkVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIHRydW5jYXRlIG1vcmUgdGhhbiB0aHJlZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICBteSAkUmVzb3VyY2VDb3VudCA9IHNjYWxhciBAUmVzb3VyY2VOYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVzb3VyY2VDb3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2UgQFJlc291cmNlTmFtZXMsIDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBSZXNvdXJjZU5hbWVzLCBzcHJpbnRmKCBUcmFuc2xhdGFibGUoJyslZCBtb3JlJyksICRSZXNvdXJjZUNvdW50IC0gMyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntSZXNvdXJjZU5hbWVzfSA9IGpvaW4oICdcbicsIEBSZXNvdXJjZU5hbWVzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaW5jbHVkZSBwbHVnaW4gKGxpbmspIGRhdGEKICAgICAgICAgICAgICAgIG15ICRQbHVnaW5MaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlzdCgpOwogICAgICAgICAgICAgICAgZm9yIG15ICRQbHVnaW5LZXkgKCBzb3J0IGtleXMgJXskUGx1Z2luTGlzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBATGlua0FycmF5OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATGlua0FycmF5LCAkTGlua0xpc3QtPnskTGlua0lEfS0+e0xpbmtOYW1lfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgdHJ1bmNhdGUgbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgbXkgJExpbmtDb3VudCA9IHNjYWxhciBATGlua0FycmF5OwogICAgICAgICAgICAgICAgICAgIGlmICggJExpbmtDb3VudCA+IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZSBATGlua0FycmF5LCAzOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBMaW5rQXJyYXksIHNwcmludGYoIFRyYW5zbGF0YWJsZSgnKyVkIG1vcmUnKSwgJExpbmtDb3VudCAtIDMgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1BsdWdpbkRhdGF9LT57JFBsdWdpbktleX0gPSBqb2luKCAnXG4nLCBATGlua0FycmF5ICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBkZWFsaW5nIHdpdGggdGlja2V0IGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudC0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0eXBlcyBmcm9tIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZQogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPntUaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZX0gPSAkUnVsZS0+e1N0YXJ0RGF0ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50RW5kRGF0ZX0gICA9ICRSdWxlLT57RW5kRGF0ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gKAogICAgICAgICAgICAgICAgICAgIFxAQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FwcG9pbnRtZW50RGF5cycgKSB7CgogICAgICAgICMgYXBwZW5kIG1pZG5pZ2h0IHRvIHRoZSB0aW1lc3RhbXBzCiAgICAgICAgZm9yIG15ICRUaW1lc3RhbXAgKHF3KFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskVGltZXN0YW1wfSAmJiAhKCAkR2V0UGFyYW17JFRpbWVzdGFtcH0gPX4gL1xzXGR7Mn06XGR7Mn06XGR7Mn0kLyApICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRUaW1lc3RhbXB9ID0gJEdldFBhcmFteyRUaW1lc3RhbXB9IC4gJyAwMDowMDowMCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVzZXQgZW1wdHkgcGFyYW1ldGVycwogICAgICAgIGZvciBteSAkUGFyYW0gKCBzb3J0IGtleXMgJUdldFBhcmFtICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVBcHBvaW50bWVudERheXMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGF5cygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gKAogICAgICAgICAgICAgICAgXCVBcHBvaW50bWVudERheXMsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEFwcG9pbnRtZW50UGx1Z2luU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgbXkgJFNlYXJjaCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZXJtJyApIHx8ICcnOwogICAgbXkgJFBsdWdpbktleSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQbHVnaW5LZXknICk7CiAgICBteSAkTWF4UmVzdWx0cyA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ01heFJlc3VsdHMnICkgfHwgMjAgKTsKCiAgICAjIHdvcmthcm91bmQsIGFsbCBhdXRvIGNvbXBsZXRpb24gcmVxdWVzdHMgZ2V0IHBvc3RlZCBieSB1dGY4IGFueXdheQogICAgIyBjb252ZXJ0IGFueSB0byA4Yml0IHN0cmluZyBpZiBhcHBsaWNhdGlvbiBpcyBub3QgcnVubmluZyBpbiB1dGY4CiAgICAkU2VhcmNoID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5Db252ZXJ0MkNoYXJzZXRJbnRlcm5hbCgKICAgICAgICBUZXh0ID0+ICRTZWFyY2gsCiAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgKTsKCiAgICBteSAkUmVzdWx0TGlzdDsKCiAgICBpZiAoJFBsdWdpbktleSkgewoKICAgICAgICAjIGdldCBwbHVnaW4gb2JqZWN0CiAgICAgICAgbXkgJFBsdWdpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgICAgICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggICAgPT4gJFNlYXJjaCwKICAgICAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGRhdGEKICAgIG15IEBEYXRhOwogICAgbXkgJE1heFJlc3VsdENvdW50ID0gJE1heFJlc3VsdHM7CgogICAgT0JKRUNUSUQ6CiAgICBmb3IgbXkgJE9iamVjdElEICgKICAgICAgICBzb3J0IHsgJFJlc3VsdExpc3QtPnskYX0gY21wICRSZXN1bHRMaXN0LT57JGJ9IH0KICAgICAgICBrZXlzICV7JFJlc3VsdExpc3R9CiAgICAgICAgKQogICAgewogICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgS2V5ICAgPT4gJE9iamVjdElELAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzdWx0TGlzdC0+eyRPYmplY3RJRH0sCiAgICAgICAgfTsKCiAgICAgICAgJE1heFJlc3VsdENvdW50LS07CiAgICAgICAgbGFzdCBPQkpFQ1RJRCBpZiAkTWF4UmVzdWx0Q291bnQgPD0gMDsKICAgIH0KCiAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSA9PiBcQERhdGEgfHwge30sCiAgICApOwoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpQdWJsaWNDYWxlbmRhcjsKCiN1c2UgQ0dJOjpBdXRoOjpCYXNpYzsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIE1JTUU6OkJhc2U2NCBxdygpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW07CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVXNlciBUb2tlbikpIHsKICAgICAgICAkR2V0UGFyYW17JE5lZWRlZH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkTmVlZGVkICk7CiAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vICVzIScsICROZWVkZWQgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdXNlcgogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBzdWNoIHVzZXIhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDYWxlbmRhck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwoKICAgICMgZ2V0IGNhbGVuZGFyCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJEdldFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJUNhbGVuZGFyICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJENhbGVuZGFye1ZhbGlkSUR9ICE9IDEgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBjYWxlbmRhciEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBhY2Nlc3MgdG9rZW4KICAgIG15ICRBY2Nlc3NUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlckxvZ2luICA9PiAkR2V0UGFyYW17VXNlcn0sCiAgICApOwoKICAgIGlmICggJEFjY2Vzc1Rva2VuIG5lICRHZXRQYXJhbXtUb2tlbn0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBVUkwhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlDYWxlbmRhciBzdHJpbmcKICAgIG15ICRJQ2FsU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKS0+RXhwb3J0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJElDYWxTdHJpbmcgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGhlcmUgd2FzIGFuIGVycm9yIGV4cG9ydGluZyB0aGUgY2FsZW5kYXIhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSB0aGUgZmlsZSBuYW1lCiAgICBteSAkRmlsZW5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgRmlsZW5hbWUgPT4gIiRDYWxlbmRhcntDYWxlbmRhck5hbWV9LmljcyIsCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICAjIHNlbmQgaUNhbCByZXNwb25zZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvY2FsZW5kYXInLAogICAgICAgIENoYXJzZXQgICAgID0+ICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSUNhbFN0cmluZywKICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGxpbmsgb2JqZWN0IChhcHBvaW50bWVudCkuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50LT5uZXcoCiAgICAgICAgVXNlckxhbmd1YWdlID0+ICdlbicsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlckxhbmd1YWdlIFVzZXJJRCkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBvdXIgb3duIExheW91dE9iamVjdCBpbnN0YW5jZSB0byBhdm9pZCBibG9jayBkYXRhIGNvbGxpc2lvbnMgd2l0aCB0aGUgbWFpbiBwYWdlCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0gPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlcwogICAgJFNlbGYtPntPYmplY3REYXRhfSA9IHsKICAgICAgICBPYmplY3QgICAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgUmVhbG5hbWUgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIE9iamVjdE5hbWUgPT4gJ1NvdXJjZU9iamVjdElEJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBUYWJsZUNyZWF0ZUNvbXBsZXgoKQoKcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIGJsb2NrIGRhdGEKClJldHVybgoKICAgICVCbG9ja0RhdGEgPSAoCiAgICAgICAgewogICAgICAgICAgICBPYmplY3ROYW1lID0+ICdTb3VyY2VPYmplY3RJRCcsCiAgICAgICAgICAgIE9iamVjdElEICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0ICAgICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgICAgICBCbG9ja25hbWUgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEhlYWRsaW5lICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ1RpdGxlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMjAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICdTdGFydCBUaW1lJywKICAgICAgICAgICAgICAgICAgICBXaWR0aCAgID0+IDE1MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnRW5kIFRpbWUnLAogICAgICAgICAgICAgICAgICAgIFdpZHRoICAgPT4gMTUwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgSXRlbUxpc3QgPT4gWwogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0FwcG9pbnRtZW50IHRpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgPT4gJ0FwcG9pbnRtZW50IGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDE2LTAxLTAxIDEyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnVGltZUxvbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICcyMDE2LTAxLTAxIDEzOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICBAQmxvY2tEYXRhID0gJEJhY2tlbmRPYmplY3QtPlRhYmxlQ3JlYXRlQ29tcGxleCgKICAgICAgICBPYmplY3RMaW5rTGlzdFdpdGhEYXRhID0+ICRPYmplY3RMaW5rTGlzdFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgVGFibGVDcmVhdGVDb21wbGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNvbnZlcnQgdGhlIGxpc3QKICAgIG15ICVMaW5rTGlzdDsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICggc29ydCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICRMaW5rTGlzdHskQXBwb2ludG1lbnRJRH0tPntEYXRhfSA9ICREaXJlY3Rpb25MaXN0LT57JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDb21wbGV4VGFibGVEYXRhID0gJENvbmZpZ09iamVjdC0+R2V0KCJMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUiKTsKICAgIG15ICREZWZhdWx0Q29sdW1uczsKICAgIGlmICgKICAgICAgICAkQ29tcGxleFRhYmxlRGF0YQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCRDb21wbGV4VGFibGVEYXRhKQogICAgICAgICYmICRDb21wbGV4VGFibGVEYXRhLT57QXBwb2ludG1lbnR9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDb21wbGV4VGFibGVEYXRhLT57QXBwb2ludG1lbnR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJERlZmF1bHRDb2x1bW5zID0gJENvbXBsZXhUYWJsZURhdGEtPnsiQXBwb2ludG1lbnQifS0+eyJEZWZhdWx0Q29sdW1ucyJ9OwogICAgfQoKICAgIG15IEBUaW1lTG9uZ1R5cGVzID0gKAogICAgICAgICJDcmVhdGVkIiwKICAgICAgICAiQ2hhbmdlZCIsCiAgICAgICAgIlN0YXJ0VGltZSIsCiAgICAgICAgIkVuZFRpbWUiLAogICAgICAgICJOb3RpZmljYXRpb25UaW1lIiwKICAgICk7CgogICAgIyBkZWZpbmUgdGhlIGJsb2NrIGRhdGEKICAgIG15IEBIZWFkbGluZSA9ICgKICAgICAgICB7CiAgICAgICAgICAgIENvbnRlbnQgPT4gJ1RpdGxlJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBsb2FkIHVzZXIgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRGVmYXVsdENvbHVtbnMgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCREZWZhdWx0Q29sdW1ucykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNaXNzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIExpbmtPYmplY3Q6OkNvbXBsZXhUYWJsZSMjI0FwcG9pbnRtZW50IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBHZXQgZGVmYXVsdCBjb2x1bW4gcHJpb3JpdHkgZnJvbSBTeXNDb25maWcKICAgICMgRWFjaCBjb2x1bW4gaW4gdGFibGUgKFRpdGxlLCBTdGFydFRpbWUsIEVuZFRpbWUsLi4uKSBoYXMgZGVmaW5lZCBQcmlvcml0eSBpbiBTeXNDb25maWcuCiAgICAjIFN5c3RlbSB1c2UgdGhpcyBwcmlvcml0eSB0byBzb3J0IGNvbHVtbnMsIGlmIHVzZXIgZG9lc24ndCBoYXZlIG93biBzZXR0aW5ncy4KICAgIG15ICVTb3J0T3JkZXI7CgogICAgaWYgKAogICAgICAgICRDb21wbGV4VGFibGVEYXRhLT57IkFwcG9pbnRtZW50In0tPnsiUHJpb3JpdHkifQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQ29tcGxleFRhYmxlRGF0YS0+eyJBcHBvaW50bWVudCJ9LT57IlByaW9yaXR5In0gKQogICAgICAgICkKICAgIHsKICAgICAgICAlU29ydE9yZGVyID0gJXsgJENvbXBsZXhUYWJsZURhdGEtPnsiQXBwb2ludG1lbnQifS0+eyJQcmlvcml0eSJ9IH07CiAgICB9CgogICAgbXkgJVVzZXJDb2x1bW5zID0gJXskRGVmYXVsdENvbHVtbnN9OwoKICAgIGlmICggJFByZWZlcmVuY2VzeydMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUtQXBwb2ludG1lbnQnfSApIHsKICAgICAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgogICAgICAgIG15ICRDb2x1bW5zRW5hYmxlZCA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFByZWZlcmVuY2VzeydMaW5rT2JqZWN0OjpDb21wbGV4VGFibGUtQXBwb2ludG1lbnQnfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb2x1bW5zRW5hYmxlZAogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSgkQ29sdW1uc0VuYWJsZWQpCiAgICAgICAgICAgICYmICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfQogICAgICAgICAgICAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRDb2x1bW5zRW5hYmxlZC0+e09yZGVyfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgQ2xlYXIgc29ydCBvcmRlcgogICAgICAgICAgICAlU29ydE9yZGVyID0gKCk7CgogICAgICAgICAgICBERUZBVUxUQ09MVU1OOgogICAgICAgICAgICBmb3IgbXkgJERlZmF1bHRDb2x1bW4gKCBzb3J0IGtleXMgJVVzZXJDb2x1bW5zICkgewogICAgICAgICAgICAgICAgbXkgJEluZGV4ID0gMDsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJTZXR0aW5nICggQHsgJENvbHVtbnNFbmFibGVkLT57T3JkZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGVmYXVsdENvbHVtbiBlcSAkVXNlclNldHRpbmcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyQ29sdW1uc3skRGVmYXVsdENvbHVtbn0gPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAkU29ydE9yZGVyeyREZWZhdWx0Q29sdW1ufSAgID0gJEluZGV4OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBERUZBVUxUQ09MVU1OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG5vdCBmb3VuZCwgbWVhbnMgdXNlciBjaG9zZSB0byBoaWRlIHRoaXMgaXRlbQogICAgICAgICAgICAgICAgaWYgKCAkVXNlckNvbHVtbnN7JERlZmF1bHRDb2x1bW59ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJDb2x1bW5zeyREZWZhdWx0Q29sdW1ufSA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNvcnRPcmRlcnskRGVmYXVsdENvbHVtbn0gPSAwOyAgICAjIFNldCAwLCBpdCBzeXN0ZW0gd2lsbCBoaWRlIHRoaXMgaXRlbSBhbnl3YXlzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIHVzZXIgaGFzIG5vIG93biBzZXR0aW5ncwogICAgICAgIGZvciBteSAkQ29sdW1uICggc29ydCBrZXlzICVVc2VyQ29sdW1ucyApIHsKICAgICAgICAgICAgaWYgKCAhJFNvcnRPcmRlcnskQ29sdW1ufSApIHsKICAgICAgICAgICAgICAgICRTb3J0T3JkZXJ7JENvbHVtbn0gPSAwOyAgICAgICAgICAgICAgICMgU2V0IDAsIGl0IHN5c3RlbSB3aWxsIGhpZGUgdGhpcyBpdGVtIGFueXdheXMKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIERlZmluZSBIZWFkbGluZSBjb2x1bW5zCgogICAgIyBTb3J0CiAgICBteSBAQWxsQ29sdW1uczsKICAgIENPTFVNTjoKICAgIGZvciBteSAkQ29sdW1uICggc29ydCB7ICRTb3J0T3JkZXJ7JGF9IDw9PiAkU29ydE9yZGVyeyRifSB9IGtleXMgJVVzZXJDb2x1bW5zICkgewoKICAgICAgICBteSAkQ29sdW1uVHJhbnNsYXRlID0gJENvbHVtbjsKICAgICAgICBpZiAoICRDb2x1bW4gZXEgJ0NhbGVuZGFyTmFtZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ0NhbGVuZGFyIG5hbWUnKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAkQ29sdW1uVHJhbnNsYXRlID0gVHJhbnNsYXRhYmxlKCdTdGFydCBkYXRlJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnRW5kVGltZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ0VuZCBkYXRlJyk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnTm90aWZpY2F0aW9uVGltZScgKSB7CiAgICAgICAgICAgICRDb2x1bW5UcmFuc2xhdGUgPSBUcmFuc2xhdGFibGUoJ05vdGlmaWNhdGlvbicpOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQWxsQ29sdW1ucywgewogICAgICAgICAgICBDb2x1bW5OYW1lICAgICAgPT4gJENvbHVtbiwKICAgICAgICAgICAgQ29sdW1uVHJhbnNsYXRlID0+ICRDb2x1bW5UcmFuc2xhdGUsCiAgICAgICAgfTsKCiAgICAgICAgbmV4dCBDT0xVTU4gaWYgJENvbHVtbiBlcSAnVGl0bGUnOyAgICAjIEFsd2F5cyBwcmVzZW50LCBhbHJlYWR5IGFkZGVkLgoKICAgICAgICAjIGlmIGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAgIGlmICggJFVzZXJDb2x1bW5zeyRDb2x1bW59ID09IDIgKSB7CgogICAgICAgICAgICAjIGFwcG9pbnRtZW50IGZpZWxkcwogICAgICAgICAgICBteSAkQ29sdW1uTmFtZSA9ICRDb2x1bW5UcmFuc2xhdGU7CgogICAgICAgICAgICBwdXNoIEBIZWFkbGluZSwgewogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uTmFtZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGl0ZW0gbGlzdCAodGFibGUgY29udGVudCkKICAgIG15IEBJdGVtTGlzdDsKCiAgICBBUFBPSU5UTUVOVElEOgogICAgZm9yIG15ICRBcHBvaW50bWVudElEICgKICAgICAgICBzb3J0IHsgJExpbmtMaXN0eyRhfXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9IDw9PiAkTGlua0xpc3R7JGJ9e0RhdGF9LT57QXBwb2ludG1lbnRJRH0gfQogICAgICAgIGtleXMgJUxpbmtMaXN0CiAgICAgICAgKQogICAgewogICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhJEFwcG9pbnRtZW50SUQ7CgogICAgICAgICMgZXh0cmFjdCBhcHBvaW50bWVudCBhbmQgY2FsZW5kYXIgZGF0YQogICAgICAgIG15ICRBcHBvaW50bWVudCA9ICRMaW5rTGlzdHskQXBwb2ludG1lbnRJRH17RGF0YX07CiAgICAgICAgbXkgJUNhbGVuZGFyICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudC0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CgogICAgICAgICMgVGl0bGUgYmUgcHJlc2VudCAoc2luY2UgaXQgY29udGFpbnMgbWFzdGVyIGxpbmsgdG8gdGhlIGFwcG9pbnRtZW50KQogICAgICAgIG15IEBJdGVtQ29sdW1ucyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQXBwb2ludG1lbnQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPScKICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDcwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgU29ydAogICAgICAgIENPTFVNTjoKICAgICAgICBmb3IgbXkgJENvbHVtbiAoIHNvcnQgeyAkU29ydE9yZGVyeyRhfSA8PT4gJFNvcnRPcmRlcnskYn0gfSBrZXlzICVVc2VyQ29sdW1ucyApIHsKCiAgICAgICAgICAgIG5leHQgQ09MVU1OIGlmICRDb2x1bW4gZXEgJ1RpdGxlJzsgICAgIyBBbHdheXMgcHJlc2VudCwgYWxyZWFkeSBhZGRlZC4KCiAgICAgICAgICAgICMgaWYgZW5hYmxlZCBieSBkZWZhdWx0CiAgICAgICAgICAgIGlmICggJFVzZXJDb2x1bW5zeyRDb2x1bW59ID09IDIgKSB7CgogICAgICAgICAgICAgICAgbXkgJUhhc2g7CiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkQ29sdW1uIH0gQFRpbWVMb25nVHlwZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J1R5cGUnfSA9ICdUaW1lTG9uZyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnVHlwZSd9ID0gJ1RleHQnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJENvbHVtbiBlcSAnTm90aWZpY2F0aW9uVGltZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7J0NvbnRlbnQnfSA9ICRBcHBvaW50bWVudC0+e05vdGlmaWNhdGlvbkRhdGV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQ29sdW1uIGVxICdDcmVhdGVkJyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJEFwcG9pbnRtZW50LT57Q3JlYXRlVGltZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRDb2x1bW4gZXEgJ0NoYW5nZWQnICkgewogICAgICAgICAgICAgICAgICAgICRIYXNoeydDb250ZW50J30gPSAkQXBwb2ludG1lbnQtPntDaGFuZ2VUaW1lfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbHVtbiBlcSAnQ2FsZW5kYXJOYW1lJyApIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJENhbGVuZGFye0NhbGVuZGFyTmFtZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkSGFzaHsnQ29udGVudCd9ID0gJEFwcG9pbnRtZW50LT57JENvbHVtbn07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUNvbHVtbnMsIFwlSGFzaDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBASXRlbUxpc3QsIFxASXRlbUNvbHVtbnM7CiAgICB9CgogICAgcmV0dXJuIGlmICFASXRlbUxpc3Q7CgogICAgbXkgJUJsb2NrID0gKAogICAgICAgIE9iamVjdCAgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0sCiAgICAgICAgQmxvY2tuYW1lICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57UmVhbG5hbWV9LAogICAgICAgIE9iamVjdE5hbWUgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdE5hbWV9LAogICAgICAgIE9iamVjdElEICAgPT4gJFBhcmFte09iamVjdElEfSwKICAgICAgICBIZWFkbGluZSAgID0+IFxASGVhZGxpbmUsCiAgICAgICAgSXRlbUxpc3QgICA9PiBcQEl0ZW1MaXN0LAogICAgICAgIEFsbENvbHVtbnMgPT4gXEBBbGxDb2x1bW5zLAogICAgKTsKCiAgICByZXR1cm4gKCBcJUJsb2NrICk7Cn0KCj1pdGVtIFRhYmxlQ3JlYXRlU2ltcGxlKCkKCnJldHVybiBhIGhhc2ggd2l0aCB0aGUgbGluayBvdXRwdXQgZGF0YQoKUmV0dXJuCgogICAgJUxpbmtPdXRwdXREYXRhID0gKAogICAgICAgIE5vcm1hbDo6U291cmNlID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJ0E6MScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnVGl0bGUgb2YgYXBwb2ludG1lbnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgKTsKCiAgICAlTGlua091dHB1dERhdGEgPSAkQmFja2VuZE9iamVjdC0+VGFibGVDcmVhdGVTaW1wbGUoCiAgICAgICAgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSA9PiAkT2JqZWN0TGlua0xpc3RSZWYsCiAgICApOwoKPWN1dAoKc3ViIFRhYmxlQ3JlYXRlU2ltcGxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RMaW5rTGlzdFdpdGhEYXRhfSB8fCByZWYgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0TGlua0xpc3RXaXRoRGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVMaW5rT3V0cHV0RGF0YTsKICAgIGZvciBteSAkTGlua1R5cGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9IH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkUGFyYW17T2JqZWN0TGlua0xpc3RXaXRoRGF0YX0tPnskTGlua1R5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyRMaW5rVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFBhcmFte09iamVjdExpbmtMaXN0V2l0aERhdGF9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259OwoKICAgICAgICAgICAgbXkgQEl0ZW1MaXN0OwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKAogICAgICAgICAgICAgICAgc29ydCB7CiAgICAgICAgICAgICAgICAgICAgbGMgJERpcmVjdGlvbkxpc3QtPnskYX0tPntOYW1lU2hvcnR9IGNtcCBsYyAkRGlyZWN0aW9uTGlzdC0+eyRifS0+e05hbWVTaG9ydH0KICAgICAgICAgICAgICAgIH0ga2V5cyAleyREaXJlY3Rpb25MaXN0fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IGFwcG9pbnRtZW50IGRhdGEKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudCA9ICREaXJlY3Rpb25MaXN0LT57JEFwcG9pbnRtZW50SUR9OwoKICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0ZW0gZGF0YQogICAgICAgICAgICAgICAgbXkgJUl0ZW0gPSAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAiQTokQXBwb2ludG1lbnRJRCIsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiBUcmFuc2xhdGFibGUoJ0FwcG9pbnRtZW50JyksCiAgICAgICAgICAgICAgICAgICAgTGluayAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgIE1heExlbmd0aCA9PiAyMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBASXRlbUxpc3QsIFwlSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgaXRlbSBsaXN0IHRvIGxpbmsgb3V0cHV0IGRhdGEKICAgICAgICAgICAgJExpbmtPdXRwdXREYXRheyAkTGlua1R5cGUgLiAnOjonIC4gJERpcmVjdGlvbiB9LT57QXBwb2ludG1lbnR9ID0gXEBJdGVtTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rT3V0cHV0RGF0YTsKfQoKPWl0ZW0gQ29udGVudFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm4gYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgQ29udGVudERhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NvbnRlbnREYXRhfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29udGVudERhdGEhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gU2VsZWN0YWJsZU9iamVjdExpc3QoKQoKcmV0dXJuIGFuIGFycmF5IGhhc2ggd2l0aCBzZWxlY3RhYmxlIG9iamVjdHMKClJldHVybgoKICAgIEBTZWxlY3RhYmxlT2JqZWN0TGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIFZhbHVlID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlbGVjdGFibGVPYmplY3RMaXN0ID0gJEJhY2tlbmRPYmplY3QtPlNlbGVjdGFibGVPYmplY3RMaXN0KAogICAgICAgIFNlbGVjdGVkID0+ICRJZGVudGlmaWVyLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFNlbGVjdGFibGVPYmplY3RMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGVjdGVkOwogICAgaWYgKCAkUGFyYW17U2VsZWN0ZWR9ICYmICRQYXJhbXtTZWxlY3RlZH0gZXEgJFNlbGYtPntPYmplY3REYXRhfS0+e09iamVjdH0gKSB7CiAgICAgICAgJFNlbGVjdGVkID0gMTsKICAgIH0KCiAgICAjIG9iamVjdCBzZWxlY3QgbGlzdAogICAgbXkgQE9iamVjdFNlbGVjdExpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e09iamVjdERhdGF9LT57T2JqZWN0fSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlbGYtPntPYmplY3REYXRhfS0+e1JlYWxuYW1lfSwKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gJFNlbGVjdGVkLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAT2JqZWN0U2VsZWN0TGlzdDsKfQoKPWl0ZW0gU2VhcmNoT3B0aW9uTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgaGFzaCB3aXRoIHNlYXJjaCBvcHRpb25zCgpSZXR1cm4KCiAgICBAU2VhcmNoT3B0aW9uTGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXBwb2ludG1lbnRUaXRsZScsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnMTIzNCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQXBwb2ludG1lbnREZXNjcmlwdGlvbicsCiAgICAgICAgICAgIE5hbWUgICAgICA9PiAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICBJbnB1dFN0cmcgPT4gJEZvcm1TdHJpbmcsCiAgICAgICAgICAgIEZvcm1EYXRhICA9PiAnQmxhQmxhJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBcHBvaW50bWVudENhbGVuZGFySUQnLAogICAgICAgICAgICBOYW1lICAgICAgPT4gJ0NhbGVuZGFyJywKICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRGb3JtU3RyaW5nLAogICAgICAgICAgICBGb3JtRGF0YSAgPT4gJ0NhbGVuZGFyMScsCiAgICAgICAgfSwKICAgICk7CgogICAgQFNlYXJjaE9wdGlvbkxpc3QgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoT3B0aW9uTGlzdCgKICAgICAgICBTdWJPYmplY3QgPT4gJ0JsYScsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoT3B0aW9uTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbUhvb2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6SG9vaycpIHx8ICdUaWNrZXQjJzsKCiAgICAjIHNlYXJjaCBvcHRpb24gbGlzdAogICAgbXkgQFNlYXJjaE9wdGlvbkxpc3QgPSAoCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdBcHBvaW50bWVudFRpdGxlJywKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ1RpdGxlJyksCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdBcHBvaW50bWVudERlc2NyaXB0aW9uJywKICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0Rlc2NyaXB0aW9uJyksCiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgID0+ICdBcHBvaW50bWVudENhbGVuZGFySUQnLAogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnQ2FsZW5kYXInKSwKICAgICAgICAgICAgVHlwZSA9PiAnTGlzdCcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBhZGQgZm9ybWtleQogICAgZm9yIG15ICRSb3cgKEBTZWFyY2hPcHRpb25MaXN0KSB7CiAgICAgICAgJFJvdy0+e0Zvcm1LZXl9ID0gJ1NFQVJDSDo6JyAuICRSb3ctPntLZXl9OwogICAgfQoKICAgICMgYWRkIGZvcm0gZGF0YSBhbmQgaW5wdXQgc3RyaW5nCiAgICBST1c6CiAgICBmb3IgbXkgJFJvdyAoQFNlYXJjaE9wdGlvbkxpc3QpIHsKCiAgICAgICAgbmV4dCBST1cgaWYgJFJvdy0+e1R5cGV9IGVxICdIaWRkZW4nOwoKICAgICAgICAjIFByZXBhcmUgdGV4dCBpbnB1dCBmaWVsZHMuCiAgICAgICAgaWYgKCAkUm93LT57VHlwZX0gZXEgJ1RleHQnICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUm93LT57Rm9ybUtleX0gKTsKCiAgICAgICAgICAgICMgcGFyc2UgdGhlIGlucHV0IHRleHQgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lucHV0VGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUm93LT57Rm9ybUtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFJvdy0+e0Zvcm1EYXRhfSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgaW5wdXQgc3RyaW5nCiAgICAgICAgICAgICRSb3ctPntJbnB1dFN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0xpbmtPYmplY3QnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQcmVwYXJlIGRyb3AgZG93biBsaXN0cy4KICAgICAgICBlbHNpZiAoICRSb3ctPntUeXBlfSBlcSAnTGlzdCcgKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgbXkgQEZvcm1EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSggUGFyYW0gPT4gJFJvdy0+e0Zvcm1LZXl9ICk7CiAgICAgICAgICAgICRSb3ctPntGb3JtRGF0YX0gPSBcQEZvcm1EYXRhOwoKICAgICAgICAgICAgaWYgKCAkUm93LT57S2V5fSBlcSAnQXBwb2ludG1lbnRDYWxlbmRhcklEJyApIHsKICAgICAgICAgICAgICAgIG15IEBDYWxlbmRhckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gJ3J3JywKICAgICAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15IEBDYWxlbmRhckRhdGEgPSBtYXAgewogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gc29ydCB7ICRhLT57Q2FsZW5kYXJOYW1lfSBjbXAgJGItPntDYWxlbmRhck5hbWV9IH0gQENhbGVuZGFyTGlzdDsKCiAgICAgICAgICAgICAgICAkUm93LT57SW5wdXRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRSb3ctPntGb3JtS2V5fSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRSb3ctPntGb3JtRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaE9wdGlvbkxpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzOjpBcHBvaW50bWVudE5vdGlmaWNhdGlvbkV2ZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBhbGwgbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMKICAgIG15ICRUcmFuc3BvcnRDb25maWdSYXcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uOjpUcmFuc3BvcnQnKSB8fCB7fTsKCiAgICAjIGdldCBtYWluIG9iamVjdAogICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgc2tpcCBhbGwgbm9uIGV4ZWN1dGFibGUgdHJhbnNwb3J0cwogICAgVFJBTlNQT1JUOgogICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICggc29ydCBrZXlzICV7JFRyYW5zcG9ydENvbmZpZ1Jhd30gKSB7CgogICAgICAgICMgZGlzY2FyZCBub24gYXZhaWxhYmxlIHRyYW5zcG9ydHMKICAgICAgICBteSAkVHJhbnNwb3J0TG9hZGVkID0gJE1haW5PYmplY3QtPlJlcXVpcmUoCiAgICAgICAgICAgICRUcmFuc3BvcnRDb25maWdSYXctPnskVHJhbnNwb3J0TmFtZX0tPntNb2R1bGV9LAogICAgICAgICAgICBTaWxlbnQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNraXAgdHJhbnNwb3J0CiAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgISRUcmFuc3BvcnRMb2FkZWQ7CgogICAgICAgICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfS0+eyRUcmFuc3BvcnROYW1lfSA9ICRUcmFuc3BvcnRDb25maWdSYXctPnskVHJhbnNwb3J0TmFtZX07CiAgICB9CgogICAgIyBnZXQgTm90aWZpY2F0aW9uRXZlbnQgb2JqZWN0CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICBteSAlTm90aWZpY2F0aW9uTGlzdCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uTGlzdCggVHlwZSA9PiAnQXBwb2ludG1lbnQnICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbkNvbmZpZwogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6QWRtaW46OkFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCcpOwoKICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgTk9USUZJQ0FUSU9OOgogICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoIHNvcnQga2V5cyAlTm90aWZpY2F0aW9uTGlzdCApIHsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIGRldGFpbHMKICAgICAgICBteSAlTm90aWZpY2F0aW9uID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICApOwoKICAgICAgICAjIGRpc2NhcmQgaW52YWxpZCBub3RpZmljYXRpb25zCiAgICAgICAgbXkgQFZhbGlkSURzID0gJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpOwogICAgICAgIG5leHQgTk9USUZJQ0FUSU9OIGlmICFncmVwIHsgJE5vdGlmaWNhdGlvbntWYWxpZElEfSA9PSAkXyB9IEBWYWxpZElEczsKCiAgICAgICAgIyBkaXNjYXJkIGFsbCBub24gY3VzdG9taXphYmxlIG5vdGlmaWNhdGlvbnMKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH07CiAgICAgICAgbmV4dCBOT1RJRklDQVRJT04gaWYgISROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9LT5bMF07CgogICAgICAgICMgcmVtZW1iZXIgbm90aWZpY2F0aW9uIGRhdGEKICAgICAgICAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JE5vdGlmaWNhdGlvbklEfSA9IFwlTm90aWZpY2F0aW9uOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtczsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgcHJpbnQgdGFibGUgaGVhZGVyCiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHNvcnQgeyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskYX0tPntQcmlvfSA8PT4gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGJ9LT57UHJpb30gfQogICAgICAgIGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0KICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRUcmFuc3BvcnRDb25maWcgPSAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskTmFtZX07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zcG9ydE5hbWUgPT4gJFRyYW5zcG9ydENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgVHJhbnNwb3J0SWNvbiA9PiAkVHJhbnNwb3J0Q29uZmlnLT57SWNvbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCB0YWJsZSBib2R5CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSApICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sU3BhbiA9PiAoIHNjYWxhciBrZXlzICV7ICRTZWxmLT57VHJhbnNwb3J0Q29uZmlnfSB9ICkgKyAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgdGhlIHVzZXIgcHJlZmVyZW5jZXMgKHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbmx5IG9uY2UpCiAgICAgICAgbXkgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1VzZXJEYXRhfS0+e0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fSwKICAgICAgICApOwoKICAgICAgICBOT1RJRklDQVRJT046CiAgICAgICAgZm9yIG15ICROb3RpZmljYXRpb25JRCAoCiAgICAgICAgICAgIHNvcnQgeyAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JGF9LT57TmFtZX0gY21wICRTZWxmLT57Tm90aWZpY2F0aW9uTGlzdH0tPnskYn0tPntOYW1lfSB9CiAgICAgICAgICAgIGtleXMgJXsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSB9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgICAgICAjIGZpbGwgbm90aWZpY2F0aW9uIGNvbHVtbiBibG9jawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHlSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTmFtZSAgPT4gJE5vdGlmaWNhdGlvbi0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRpdGxlID0+ICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudFRvb2x0aXB9LT5bMF0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50ICAgPT4gJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFRSQU5TUE9SVDoKICAgICAgICAgICAgZm9yIG15ICRUcmFuc3BvcnROYW1lICgKICAgICAgICAgICAgICAgIHNvcnQgeyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30tPnskYX0tPntQcmlvfSA8PT4gJFNlbGYtPntUcmFuc3BvcnRDb25maWd9LT57JGJ9LT57UHJpb30gfQogICAgICAgICAgICAgICAga2V5cyAleyAkU2VsZi0+e1RyYW5zcG9ydENvbmZpZ30gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgbXkgJElkZW50aWZpZXIgPSAiTm90aWZpY2F0aW9uLSROb3RpZmljYXRpb25JRC0kVHJhbnNwb3J0TmFtZSI7CgogICAgICAgICAgICAgICAgbXkgJFRyYW5zcG9ydEVuYWJsZWQgPSBncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntUcmFuc3BvcnRzfSB9OwoKICAgICAgICAgICAgICAgIG15ICRBZ2VudEVuYWJsZWRCeURlZmF1bHQKICAgICAgICAgICAgICAgICAgICA9IGdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0TmFtZSB9IEB7ICROb3RpZmljYXRpb24tPntEYXRhfS0+e0FnZW50RW5hYmxlZEJ5RGVmYXVsdH0gfTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2UgZm9yIHRoaXMgdHJhbnNwb3J0IGFuZCBub3RpZmljYXRpb24gb3IgZmFsbCBiYWNrIHRvCiAgICAgICAgICAgICAgICAjICAgbm90aWZpY2F0aW9uIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm8gdXNlciBwcmVmZXJlbmNlCiAgICAgICAgICAgICAgICBteSAkVXNlID0gJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnQtPnskSWRlbnRpZmllcn0gLy8gJEFnZW50RW5hYmxlZEJ5RGVmYXVsdDsKCiAgICAgICAgICAgICAgICBteSAkQ2hlY2tlZCAgICAgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICAgICAgbXkgJEhpZGRlblZhbHVlID0gMTsKICAgICAgICAgICAgICAgIGlmICggISRVc2UgKSB7CiAgICAgICAgICAgICAgICAgICAgJENoZWNrZWQgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJEhpZGRlblZhbHVlID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbGwgZWFjaCB0cmFuc3BvcnQgY29sdW1uCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5VHJhbnNwb3J0Q29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkVHJhbnNwb3J0RW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5VHJhbnNwb3J0Q29sdW1uRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uTmFtZSA9PiAkTm90aWZpY2F0aW9uLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnROYW1lICAgID0+ICRUcmFuc3BvcnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllciAgICAgICA9PiAkSWRlbnRpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZWQgICAgICAgICAgPT4gJENoZWNrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRkZW5WYWx1ZSAgICAgID0+ICRIaWRkZW5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1ByZWZlcmVuY2VzTm90aWZpY2F0aW9uRXZlbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHJldHVybiBzdHJ1Y3R1cmUgZm9yIGdlbmVyaWMgIk9wdGlvbiIgYmxvY2sgaW4gQWdlbnRQcmVmZXJlbmNlcwogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBCbG9jayA9PiAnUmF3SFRNTCcsCiAgICAgICAgICAgIEhUTUwgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIE5hbWUgID0+ICdOb3RpZmljYXRpb25FdmVudFRyYW5zcG9ydCcsCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBASWRlbnRpZmllckxpc3Q7CiAgICBteSBATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzOwoKICAgIE5PVElGSUNBVElPTjoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fSB9ICkgewoKICAgICAgICBuZXh0IE5PVElGSUNBVElPTiBpZiAhJFNlbGYtPntOb3RpZmljYXRpb25MaXN0fS0+eyROb3RpZmljYXRpb25JRH07CgogICAgICAgIG15ICROb3RpZmljYXRpb24gICAgICAgICAgPSAkU2VsZi0+e05vdGlmaWNhdGlvbkxpc3R9LT57JE5vdGlmaWNhdGlvbklEfTsKICAgICAgICBteSAkTm90aWZpY2F0aW9uTWFuZGF0b3J5ID0gMDsKICAgICAgICBpZiAoICROb3RpZmljYXRpb24tPntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0gJiYgJE5vdGlmaWNhdGlvbi0+e0RhdGF9LT57VmlzaWJsZUZvckFnZW50fS0+WzBdID09IDIgKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb25NYW5kYXRvcnkgPSAxOwogICAgICAgICAgICBwdXNoIEBNYW5kYXRvcnlOb3RpZmljYXRpb25JRHMsICROb3RpZmljYXRpb25JRDsKICAgICAgICB9CgogICAgICAgIFRSQU5TUE9SVDoKICAgICAgICBmb3IgbXkgJFRyYW5zcG9ydE5hbWUgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntUcmFuc3BvcnRDb25maWd9IH0gKSB7CiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICFncmVwIHsgJF8gZXEgJFRyYW5zcG9ydE5hbWUgfSBAeyAkTm90aWZpY2F0aW9uLT57RGF0YX0tPntUcmFuc3BvcnRzfSB9OwogICAgICAgICAgICBwdXNoIEBJZGVudGlmaWVyTGlzdCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gIk5vdGlmaWNhdGlvbi0kTm90aWZpY2F0aW9uSUQtJFRyYW5zcG9ydE5hbWUiLAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICAgICAgICAgSXNNYW5kYXRvcnkgICAgPT4gJE5vdGlmaWNhdGlvbk1hbmRhdG9yeSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVXNlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0OwogICAgbXkgJU1hbmRhdG9yeUZ1bGZpbGxlZDsKICAgIGZvciBteSAkSWRlbnRpZmllciAoQElkZW50aWZpZXJMaXN0KSB7CiAgICAgICAgJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnR7ICRJZGVudGlmaWVyLT57TmFtZX0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRJZGVudGlmaWVyLT57TmFtZX0gKSB8fCAwOwoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgaXMgYSBtYW5kYXRvcnkgbm90aWZpY2F0aW9uIGFuZCB0aGlzIHRyYW5zcG9ydCBpcyBzZWxlY3RlZAogICAgICAgIGlmICggJFVzZXJOb3RpZmljYXRpb25UcmFuc3BvcnR7ICRJZGVudGlmaWVyLT57TmFtZX0gfSA9PSAxICkgewogICAgICAgICAgICAkTWFuZGF0b3J5RnVsZmlsbGVkeyAkSWRlbnRpZmllci0+e05vdGlmaWNhdGlvbklEfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG5vdyBjaGVjayBpZiB0aGVyZSBhcmUgbm90aWZpY2F0aW9ucyBmb3Igd2hpY2ggbm8gdHJhbnNwb3J0IGhhcyBiZWVuIHNlbGVjdGVkCiAgICBmb3IgbXkgJE5vdGlmaWNhdGlvbklEIChATWFuZGF0b3J5Tm90aWZpY2F0aW9uSURzKSB7CiAgICAgICAgaWYgKCAkTWFuZGF0b3J5RnVsZmlsbGVkeyROb3RpZmljYXRpb25JRH0gIT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntFcnJvcn0gPSBUcmFuc2xhdGFibGUoCiAgICAgICAgICAgICAgICAiUGxlYXNlIG1ha2Ugc3VyZSB5b3UndmUgY2hvc2VuIGF0IGxlYXN0IG9uZSB0cmFuc3BvcnQgbWV0aG9kIGZvciBtYW5kYXRvcnkgbm90aWZpY2F0aW9ucy4iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gXCVVc2VyTm90aWZpY2F0aW9uVHJhbnNwb3J0LAogICAgKTsKCiAgICAjIHVwZGF0ZSB1c2VyIHByZWZlcmVuY2VzCiAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0RlbW9TeXN0ZW0nKSApIHsKICAgICAgICAkVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydCcsCiAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWUgLy8gJycsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+e01lc3NhZ2V9ID0gVHJhbnNsYXRhYmxlKCdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57RXJyb3J9IHx8ICcnOwp9CgpzdWIgTWVzc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e01lc3NhZ2V9IHx8ICcnOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgVGhpcyBpcyBhIGR1bW15IHRlbXBsYXRlIGZpbGUgZm9yIHdvcmthcm91bmQgb2YgYnVnIzEyMzg3OgojIFNlZSBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzg3IGZvciBkZXRhaWxzLgoKWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJZb3Ugd2lsbCByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGVhY2ggdGltZSBhIHJlbWluZGVyIHRpbWUgaXMgcmVhY2hlZCBmb3Igb25lIG9mIHlvdXIgYXBwb2ludG1lbnRzLiIpIHwgaHRtbCAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxsYWJlbCBmb3I9IlJlY2lwaWVudEVtYWlsIj5bJSBUcmFuc2xhdGUoIkFkZGl0aW9uYWwgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3NlcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KPGRpdiBjbGFzcz0iRmllbGQiPgogICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlJlY2lwaWVudEVtYWlsIiBpZD0iUmVjaXBpZW50RW1haWwiIGNsYXNzPSJXNTBwYyIgdmFsdWU9IlslIERhdGEuUmVjaXBpZW50RW1haWwgfCBodG1sICVdIi8+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8bGFiZWwgZm9yPSJUcmFuc3BvcnRFbWFpbFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIkVtYWlsIHRlbXBsYXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICBbJSBEYXRhLlRyYW5zcG9ydEVtYWlsVGVtcGxhdGVTdHJnICVdCiAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJVc2UgdGhpcyB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGUgZW1haWwgKG9ubHkgZm9yIEhUTUwgZW1haWxzKS4iKSB8IGh0bWwgJV08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFNFVCBPVFJTQnVzaW5lc3NMYWJlbCA9ICc8c3Ryb25nPk9UUlMgQnVzaW5lc3MgU29sdXRpb248L3N0cm9uZz7ihKInICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgTm90aWZpY2F0aW9uIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25MaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyB0byBvdmVydmlldyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbk92ZXJ2aWV3IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uQWRkIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1BZGQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+WyUgVHJhbnNsYXRlKCJBZGQgbm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkV4cG9ydCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT5bJSBUcmFuc2xhdGUoIkV4cG9ydCBOb3RpZmljYXRpb25zIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uQWRkIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkltcG9ydCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkNvbmZpZ3VyYXRpb24gSW1wb3J0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYXBwb2ludG1lbnQgbm90aWZpY2F0aW9ucyB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBtb2R1bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iTm90aWZpY2F0aW9uSW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJTZXBhcmF0ZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Ik92ZXJ3cml0ZUV4aXN0aW5nTm90aWZpY2F0aW9ucyIgbmFtZT0iT3ZlcndyaXRlRXhpc3RpbmdOb3RpZmljYXRpb25zIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPdmVyd3JpdGVFeGlzdGluZ05vdGlmaWNhdGlvbnMiPlslIFRyYW5zbGF0ZSgiT3ZlcndyaXRlIGV4aXN0aW5nIG5vdGlmaWNhdGlvbnM/IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXBsb2FkIE5vdGlmaWNhdGlvbiBjb25maWd1cmF0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJJbXBvcnQgTm90aWZpY2F0aW9uIGNvbmZpZ3VyYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkltcG9ydCIpICVdCiAgICA8L2Rpdj4KCgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzIwcGMiPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDb21tZW50IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNoYW5nZWQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIgVzEwcGMiPlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0RhdGFGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9EYXRhRm91bmRNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbJSBJRiBEYXRhLlZhbGlkSUQgIT0gMSVdY2xhc3M9IkludmFsaWQiWyUgRU5EICVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1DaGFuZ2U7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuQ29tbWVudCB8IGh0bWwgJV0iPlslIERhdGEuQ29tbWVudCB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5DcmVhdGVUaW1lIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249Tm90aWZpY2F0aW9uRXhwb3J0O0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtZG93bmxvYWQiPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV08L3NwYW4+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+PGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPU5vdGlmaWNhdGlvbkNvcHk7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jb3B5Ij48L2k+PHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ29weSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVHJhc2hDYW4gTm90aWZpY2F0aW9uRGVsZXRlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RGVsZXRlO0lEPVslIERhdGEuSUQgfCB1cmkgJV07WyUgRW52KCJDaGFsbGVuZ2VUb2tlblBhcmFtIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUgdGhpcyBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJy5Ob3RpZmljYXRpb25EZWxldGUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewoKICAgIGlmICh3aW5kb3cuY29uZmlybShbJSBUcmFuc2xhdGUoIkRvIHlvdSByZWFsbHkgd2FudCB0byBkZWxldGUgdGhpcyBub3RpZmljYXRpb24/IikgfCBKU09OICVdKSkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuYXR0cignaHJlZicpOwogICAgfQoKICAgIC8vIGRvbid0IGludGVyZmVyZSB3aXRoIE1hc3RlckFjdGlvbgogICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgoKWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KCiAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik5vdGlmaWNhdGlvbkV2ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWRkIE5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJFZGl0IikgJV0KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJFZGl0IE5vdGlmaWNhdGlvbiIpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJFZGl0IikgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJbJSBEYXRhLkFjdGlvbiB8IHVyaSAlXUFjdGlvbiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOYW1lIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLk5hbWVTZXJ2ZXJFcnJvciAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZpc2libGVGb3JBZ2VudCI+WyUgVHJhbnNsYXRlKCJTaG93IGluIGFnZW50IHByZWZlcmVuY2VzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlZpc2libGVGb3JBZ2VudFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZpc2libGVGb3JBZ2VudFRvb2x0aXAiPlslIFRyYW5zbGF0ZSgiQWdlbnQgcHJlZmVyZW5jZXMgdG9vbHRpcCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlZpc2libGVGb3JBZ2VudFRvb2x0aXAiIGlkPSJWaXNpYmxlRm9yQWdlbnRUb29sdGlwIiBjbGFzcz0iVzUwcGMiIHZhbHVlPSJbJSBEYXRhLlZpc2libGVGb3JBZ2VudFRvb2x0aXAgfCBodG1sICVdIiBbJSBEYXRhLlZpc2libGVGb3JBZ2VudFRvb2x0aXBSZWFkb25seSAlXS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBzaG93biBvbiB0aGUgYWdlbnQgcHJlZmVyZW5jZXMgc2NyZWVuIGFzIGEgdG9vbHRpcCBmb3IgdGhpcyBub3RpZmljYXRpb24uIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWxpZE9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkV2ZW50cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJFdmVudHMiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRXZlbnQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRXZlbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRXZlbnRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJFdmVudHNTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiBjaG9vc2Ugd2hpY2ggZXZlbnRzIHdpbGwgdHJpZ2dlciB0aGlzIG5vdGlmaWNhdGlvbi4gQW4gYWRkaXRpb25hbCBhcHBvaW50bWVudCBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgYmVsb3cgdG8gb25seSBzZW5kIGZvciBhcHBvaW50bWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIENvbGxhcHNlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IEZpbHRlciIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUeXBlSUQiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UeXBlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFySUQiPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaXRsZSI+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpdGxlIiBpZD0iVGl0bGUiIGNsYXNzPSJXNzVwYyIgdmFsdWU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMb2NhdGlvbiI+WyUgVHJhbnNsYXRlKCJMb2NhdGlvbiIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxvY2F0aW9uIiBpZD0iTG9jYXRpb24iIGNsYXNzPSJXNzVwYyIgdmFsdWU9IlslIERhdGEuTG9jYXRpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld1VwZGF0ZVRlYW0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UZWFtU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdVcGRhdGVUZWFtIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiUmVzb3VyY2UiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzb3VyY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlJlY2lwaWVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50cyI+WyUgVHJhbnNsYXRlKCJTZW5kIHRvIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudHNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZWNpcGllbnRBZ2VudHMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byB0aGVzZSBhZ2VudHMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjaXBpZW50QWdlbnRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50R3JvdXBzIj5bJSBUcmFuc2xhdGUoIlNlbmQgdG8gYWxsIGdyb3VwIG1lbWJlcnMiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjaXBpZW50R3JvdXBzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjaXBpZW50Um9sZXMiPlslIFRyYW5zbGF0ZSgiU2VuZCB0byBhbGwgcm9sZSBtZW1iZXJzIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY2lwaWVudFJvbGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VuZE9uT3V0T2ZPZmZpY2UiPlslIFRyYW5zbGF0ZSgiU2VuZCBvbiBvdXQgb2Ygb2ZmaWNlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IlNlbmRPbk91dE9mT2ZmaWNlIiBpZD0iU2VuZE9uT3V0T2ZPZmZpY2UiIHZhbHVlPSIxIiBbJSBEYXRhLlNlbmRPbk91dE9mT2ZmaWNlQ2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBbHNvIHNlbmQgaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IG91dCBvZiBvZmZpY2UuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPbmNlUGVyRGF5Ij5bJSBUcmFuc2xhdGUoIk9uY2UgcGVyIGRheSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJPbmNlUGVyRGF5IiBpZD0iT25jZVBlckRheSIgdmFsdWU9IjEiIFslIERhdGEuT25jZVBlckRheUNoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm90aWZ5IHVzZXIganVzdCBvbmNlIHBlciBkYXkgYWJvdXQgYSBzaW5nbGUgYXBwb2ludG1lbnQgdXNpbmcgYSBzZWxlY3RlZCB0cmFuc3BvcnQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBNZXRob2RzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgVHJhbnNwb3J0c0NvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZW5kIHRoaXMgbm90aWZpY2F0aW9uIHRvIGVhY2ggb2YgdGhlIHJlY2lwaWVudHMuIFBsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIG1ldGhvZCBiZWxvdy4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBEYXRhLlRyYW5zcG9ydE5hbWUgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmFuc3BvcnRSb3dFbmFibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5hYmxlIHRoaXMgbm90aWZpY2F0aW9uIG1ldGhvZCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUcmFuc3BvcnRzIiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdIiBjbGFzcz0iVmFsaWRhdGVfT25lQ2hlY2tlZCBbJSBEYXRhLlRyYW5zcG9ydHNTZXJ2ZXJFcnJvciAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVHJhbnNwb3J0IikgJV06IFslIFRyYW5zbGF0ZShEYXRhLlRyYW5zcG9ydCkgJV0iIFslIERhdGEuVHJhbnNwb3J0Q2hlY2tlZCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHJhbnNwb3J0WyUgRGF0YS5UcmFuc3BvcnQgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkF0IGxlYXN0IG9uZSBtZXRob2QgaXMgbmVlZGVkIHBlciBub3RpZmljYXRpb24uIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUcmFuc3BvcnRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiQXQgbGVhc3Qgb25lIG1ldGhvZCBpcyBuZWVkZWQgcGVyIG5vdGlmaWNhdGlvbi4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdFslIERhdGEuVHJhbnNwb3J0IHwgaHRtbCAlXSIgY2xhc3M9IkFnZW50RW5hYmxlZEJ5RGVmYXVsdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFjdGl2ZSBieSBkZWZhdWx0IGluIGFnZW50IHByZWZlcmVuY2VzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBBZ2VudEVuYWJsZWRCeURlZmF1bHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJBZ2VudEVuYWJsZWRCeURlZmF1bHQiIGlkPSJBZ2VudEVuYWJsZWRCeURlZmF1bHRbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlRyYW5zcG9ydCB8IGh0bWwgJV0iICB0aXRsZT0iIiBbJSBEYXRhLkFnZW50RW5hYmxlZEJ5RGVmYXVsdENoZWNrZWQgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFzc2lnbmVkIHJlY2lwaWVudCBhZ2VudHMgd2hvIGRpZG4ndCBtYWtlIGEgY2hvaWNlIGZvciB0aGlzIG5vdGlmaWNhdGlvbiBpbiB0aGVpciBwcmVmZXJlbmNlcyB5ZXQuIElmIHRoZSBib3ggaXMgZW5hYmxlZCwgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHNlbnQgdG8gc3VjaCBhZ2VudHMuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXR0aW5nc1N0cmluZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93RW5hYmxlZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvd0Rpc2FibGVkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBJbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pbk9UUlNCdXNpbmVzcyIgY2xhc3M9IkJ1dHRvbiI+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLWRvdWJsZS11cCI+PC9pPiBbJSBUcmFuc2xhdGUoIlVwZ3JhZGUgdG8gJXMiLCBPVFJTQnVzaW5lc3NMYWJlbCkgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHJhbnNwb3J0Um93UmVjb21tZW5kYXRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyYW5zcG9ydFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk5vRGF0YUZvdW5kTXNnVHJhbnNwb3J0IikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gbm90aWZpY2F0aW9uIG1ldGhvZCBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+ClslIFJlbmRlckJsb2NrRW5kKCJOb0RhdGFGb3VuZE1zZ1RyYW5zcG9ydCIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZE1ldGhvZCgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIGZ1bmN0aW9uKFZhbHVlLCBFbGVtZW50KSB7CiAgICAgICAgaWYoJCgiLlZhbGlkYXRlX09uZUNoZWNrZWQ6Y2hlY2tib3g6Y2hlY2tlZCIpLmxlbmd0aCA+IDApewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfT25lQ2hlY2tlZCIsIHsKICAgICAgICBWYWxpZGF0ZV9PbmVDaGVja2VkOiB0cnVlCiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk5vdGlmaWNhdGlvbiBUZXh0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MgPSJOb3RpZmljYXRpb25MYW5ndWFnZUNvbnRhaW5lciI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSaWNoVGV4dCIpICVdClslIEluc2VydFRlbXBsYXRlKCJSaWNoVGV4dEVkaXRvci50dCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb3RpZmljYXRpb25MYW5ndWFnZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIFslIElGICFEYXRhLkxhbmd1YWdlICVdIENvbGxhcHNlZCBbJSBFTkQgJV0gIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTGFuZ3VhZ2UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuTGFuZ3VhZ2UpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iV2FybmluZyI+J1slIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV0nICZtZGFzaDsgWyUgVHJhbnNsYXRlKCJUaGlzIGxhbmd1YWdlIGlzIG5vdCBwcmVzZW50IG9yIGVuYWJsZWQgb24gdGhlIHN5c3RlbS4gVGhpcyBub3RpZmljYXRpb24gdGV4dCBjb3VsZCBiZSBkZWxldGVkIGlmIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZS4iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2VSZW1vdmVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fTGFuZ3VhZ2VfUmVtb3ZlIiBocmVmPSIiIG5hbWU9IkRhdGEuTGFuZ3VhZ2VJRF9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vdGlmaWNhdGlvbkxhbmd1YWdlUmVtb3ZlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGFuZ3VhZ2VJRCIgY2xhc3M9Ikxhbmd1YWdlSUQiIHZhbHVlPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9MYWJlbF9TdWJqZWN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9TdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuU3ViamVjdFNlcnZlckVycm9yIHwgaHRtbCAlXSIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX1N1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHkiIGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0xhYmVsX0JvZHkiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgaWQ9IlslIERhdGEuTGFuZ3VhZ2VJRCB8IGh0bWwgJV1fQm9keSIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5Cb2R5U2VydmVyRXJyb3IgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNZXNzYWdlIGJvZHkiKSB8IGh0bWwgJV0iIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5MYW5ndWFnZUlEIHwgaHRtbCAlXV9Cb2R5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLkxhbmd1YWdlSUQgfCBodG1sICVdX0JvZHlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm90aWZpY2F0aW9uTGFuZ3VhZ2UiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIFRlbXBsYXRlIE5vdGlmaWNhdGlvbkxhbmd1YWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IlRpdGxlIj48L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdmFsdWU9IlJlbW92ZSBMYW5ndWFnZSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBMYW5ndWFnZVJlbW92ZSIgaWQ9IlRlbXBsYXRlX0xhbmd1YWdlX1JlbW92ZSIgaHJlZj0iIiBuYW1lPSJUZW1wbGF0ZV9MYW5ndWFnZV9SZW1vdmUiPjxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPjxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBOb3RpZmljYXRpb24gTGFuZ3VhZ2UiKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiBjbGFzcz0iTGFuZ3VhZ2VJRCIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX0xhYmVsX1N1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVGVtcGxhdGVfU3ViamVjdCIgaWQ9IlRlbXBsYXRlX1N1YmplY3QiIHZhbHVlPSIiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUZW1wbGF0ZV9TdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlbXBsYXRlX0JvZHkiIGlkPSJUZW1wbGF0ZV9MYWJlbF9Cb2R5IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlRlbXBsYXRlX0JvZHkiIGNsYXNzPSIiIG5hbWU9IlRlbXBsYXRlX0JvZHkiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1lc3NhZ2UgYm9keSIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVfQm9keUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJMYW5ndWFnZSI+WyUgVHJhbnNsYXRlKCJBZGQgbmV3IG5vdGlmaWNhdGlvbiBsYW5ndWFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhbmd1YWdlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYW5ndWFnZU9yaWdTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwpDb3JlLkFnZW50LkFkbWluLk5vdGlmaWNhdGlvbkV2ZW50LkluaXQoewogICAgTG9jYWxpemF0aW9uOiB7CiAgICAgICAgRGVsZXRlTm90aWZpY2F0aW9uTGFuZ3VhZ2VNc2c6IFslIFRyYW5zbGF0ZSgiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIG5vdGlmaWNhdGlvbiBsYW5ndWFnZT8iKSB8IEpTT04gJV0KICAgIH0KfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTYXZlIENoYW5nZXMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSI+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIFNwYWNpbmdUb3AgQ29sbGFwc2VkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlRhZyBSZWZlcmVuY2UiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byBhbiBhZ2VudC4iKSB8IGh0bWwgJV08L3A+CgogICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJZb3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHRhZ3MiKSB8IGh0bWwgJV06PC9wPgoKICAgICAgICAgICAgICAgIDxkbD4KICAgICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEVbMjBdJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyBnZXQgdGhlIGZpcnN0IDIwIGNoYXJhY3RlciBvZiB0aGUgYXBwb2ludG1lbnQgdGl0bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0FQUE9JTlRNRU5UXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgYXBwb2ludG1lbnQgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OywgJmx0O09UUlNfQVBQT0lOVE1FTlRfREVTQ1JJUFRJT04mZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NBTEVOREFSXyomZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgICAgICAgICAgPGRkPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRvIGdldCB0aGUgY2FsZW5kYXIgYXR0cmlidXRlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIChbJSBUcmFuc2xhdGUoIiBlLiBnLiIpIHwgaHRtbCAlXSA8Y29kZT4mbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUklEJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FJmd0OywgJmx0O09UUlNfQ0FMRU5EQVJfQ09MT1ImZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTXyomZ3Q7PC9jb2RlPiBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfKiZndDs8L2NvZGU+PC9kdD4KICAgICAgICAgICAgICAgICAgICA8ZGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXR0cmlidXRlcyBvZiB0aGUgcmVjaXBpZW50IHVzZXIgZm9yIHRoZSBub3RpZmljYXRpb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgKFslIFRyYW5zbGF0ZSgiIGUuIGcuIikgfCBodG1sICVdIDxjb2RlPiZsdDtPVFJTX1VzZXJGdWxsbmFtZSZndDs8L2NvZGU+IFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRnVsbG5hbWUmZ3Q7PC9jb2RlPikuCiAgICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPiZsdDtPVFJTX0NPTkZJR18qJmd0OzwvY29kZT48L2R0PgogICAgICAgICAgICAgICAgICAgIDxkZD4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWcgb3B0aW9ucyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAoWyUgVHJhbnNsYXRlKCIgZS4gZy4iKSB8IGh0bWwgJV0gPGNvZGU+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzwvY29kZT4pLgogICAgICAgICAgICAgICAgICAgIDwvZGQ+CiAgICAgICAgICAgICAgICA8L2RsPgoKICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkV4YW1wbGUgbm90aWZpY2F0aW9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3ViamVjdEV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3RFeGFtcGxlIiBpZD0iU3ViamVjdEV4YW1wbGUiIHZhbHVlPSJSZW1pbmRlcjogJmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7IiBzaXplPSI4MCIgbWF4bGVuZ3RoPSI4MCIgcmVhZG9ubHkgLz4KICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNwb25zZUV4YW1wbGUiPlslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTwvbGFiZWw+OgogICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPSIxMiIgY29scz0iNzAiIG5hbWU9IlJlc3BvbnNlRXhhbXBsZSIgaWQ9IlJlc3BvbnNlRXhhbXBsZSIgcmVhZG9ubHk+CkhpICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssCgphcHBvaW50bWVudCAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGFzIHJlYWNoZWQgaXRzIG5vdGlmaWNhdGlvbiB0aW1lLgoKRGVzY3JpcHRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OwpMb2NhdGlvbjogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7CkNhbGVuZGFyOiAmbHQ7T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUUmZ3Q7ClN0YXJ0IGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDsKRW5kIGRhdGU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7CkFsbC1kYXk6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0FMTERBWSZndDsKUmVwZWF0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9SRUNVUlJJTkcmZ3Q7CgombHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OwoKLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7CiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3VXBkYXRlIikgJV0KCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPGRpdiBjbGFzcz0iT3ZlcnZpZXdCb3ggQVJJQVJvbGVNYWluIFslIERhdGEuVmlldyB8IGh0bWwgJV0iPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQWdlbmRhIE92ZXJ2aWV3IikgfCBodG1sICVdPC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJPdmVydmlld0NvbnRyb2wiIGlkPSJPdmVydmlld0NvbnRyb2wiPgogICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRyb2xSb3ciPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXIiKSAlXQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iQWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Ik92ZXJ2aWV3Q29udHJvbCIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1N0YXJ0PVslIERhdGEuU3RhcnQgfCB1cmkgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXJJdGVtU2VsZWN0ZWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld05hdkJhckZpbHRlckl0ZW1TZWxlY3RlZE5vdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJPdmVydmlld0NvbnRyb2wiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO0ZpbHRlcj1bJSBEYXRhLkZpbHRlciB8IHVyaSAlXTtTdGFydD1bJSBEYXRhLlN0YXJ0IHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbVNlbGVjdGVkTm90IikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3TmF2QmFyRmlsdGVySXRlbSIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdOYXZCYXJGaWx0ZXIiKSAlXQoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJCdXR0b25zIEhlYWRlckxlZnQiPgpbJSBJRiBEYXRhLk1vZHVsZVBlcm1pc3Npb25zLkFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU92ZXJ2aWV3IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXItbyI+PC9pPiBbJSBUcmFuc2xhdGUoIk1hbmFnZSBDYWxlbmRhcnMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGlkPSJBcHBvaW50bWVudENyZWF0ZUJ1dHRvbiIgaHJlZj0iIyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gSW5saW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+IFslIFRyYW5zbGF0ZSgiQWRkIEFwcG9pbnRtZW50IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQnV0dG9ucyBIZWFkZXJSaWdodCI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIlRvZGF5IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtGaWx0ZXI9WyUgRGF0YS5GaWx0ZXIgfCB1cmkgJV07U3RhcnQ9WyUgRGF0YS5TdGFydCB8IHVyaSAlXTtKdW1wPVByZXYiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWxlZnQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07RmlsdGVyPVslIERhdGEuRmlsdGVyIHwgdXJpICVdO1N0YXJ0PVslIERhdGEuU3RhcnQgfCB1cmkgJV07SnVtcD1OZXh0IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtY2hldnJvbi1yaWdodCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgRGF0YS5IZWFkZXJUaXRsZSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9IldlZWtOdW1iZXIiPlslIERhdGEuSGVhZGVyVGl0bGVDVyB8IGh0bWwgJV08L3NwYW4+PC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9Ik92ZXJ2aWV3Qm9keSIgY2xhc3M9Ik92ZXJ2aWV3IFRpY2tldExpc3QiPgogICAgPHRhYmxlIGNsYXNzPSJUYWJsZVNtYWxsIE5vQ2VsbHNwYWNpbmciPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29sb3IiKSB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ik92ZXJ2aWV3SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8YT5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJPdmVydmlld0hlYWRlciBXMTBwYyI+CiAgICAgICAgICAgICAgICAgICAgPGE+WyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIgVzEwcGMiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiUmVwZWF0IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iT3ZlcnZpZXdIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxhPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3RoZWFkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHBvaW50bWVudEdyb3VwIikgJV0KICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgIDx0ciBjbGFzcz0iRGF0ZURpdmlkZXIgWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjgiPlslIERhdGEuQ3VycmVudERheSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGJvZHk+CiAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHBvaW50bWVudEFjdGlvblJvdyIpICVdCiAgICAgICAgICAgIDx0ciBpZD0iQXBwb2ludG1lbnRJRF9bJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhckRhdGEuJHtEYXRhLkNhbGVuZGFySUR9LkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ2FsZW5kYXJDb2xvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IFslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5Db2xvciB8IGh0bWwgJV07Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ2FsZW5kYXJEYXRhLiR7RGF0YS5DYWxlbmRhcklEfS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhckRhdGEuJHtEYXRhLkNhbGVuZGFySUR9LkNhbGVuZGFyTmFtZSB8IHRydW5jYXRlKDIxKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiIGRhdGEtYXBwb2ludG1lbnQtaWQ9IlslIERhdGEuQXBwb2ludG1lbnRJRCB8IGh0bWwgJV0iIGhyZWY9IiMiIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCB0cnVuY2F0ZSgzNikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJ0RGF0ZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5FbmREYXRlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkFsbERheSA9PSAxICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiWWVzIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuUmVjdXJyaW5nID09IDEgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJZZXMiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Ob3RpZmljYXRpb25EYXRlICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTm90aWZpY2F0aW9uRGF0ZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBcHBvaW50bWVudEFjdGlvblJvdyIpICVdCiAgICAgICAgPC90Ym9keT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFwcG9pbnRtZW50R3JvdXAiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcHBvaW50bWVudE5vRGF0YVJvdyIpICVdCiAgICAgICAgPHRib2R5PgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3Rib2R5PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnROb0RhdGFSb3ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhcnNOb3RGb3VuZCIpICVdCiAgICAgICAgPHRib2R5PgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBjYWxlbmRhcnMgZm91bmQuIFBsZWFzZSBhZGQgYSBjYWxlbmRhciBmaXJzdCBieSB1c2luZyBNYW5hZ2UgQ2FsZW5kYXJzIHBhZ2UuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGJvZHk+ClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhcnNOb3RGb3VuZCIpICVdCiAgICA8L3RhYmxlPgo8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKCkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc0xvYWRpbmcnLCBbJSBUcmFuc2xhdGUoIkxvYWRpbmcuLi4iKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJBZ2VuZGFPdmVydmlldycsIHRydWUpOwoKdmFyIFBhcmFtcyA9IHsKICAgIERpYWxvZ1RleHQ6IHsKICAgICAgICBFZGl0VGl0bGU6IFslIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRpdGxlOiBbJSBUcmFuc2xhdGUoIlRoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQiKSB8IEpTT04gJV0sCiAgICAgICAgT2NjdXJyZW5jZVRleHQ6IFslIFRyYW5zbGF0ZSgiV291bGQgeW91IGxpa2UgdG8gZWRpdCBqdXN0IHRoaXMgb2NjdXJyZW5jZSBvciBhbGwgb2NjdXJyZW5jZXM/IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VBbGw6IFslIFRyYW5zbGF0ZSgiQWxsIG9jY3VycmVuY2VzIikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VKdXN0VGhpczogWyUgVHJhbnNsYXRlKCJKdXN0IHRoaXMgb2NjdXJyZW5jZSIpIHwgSlNPTiAlXQogICAgfSwKICAgIENhbGxiYWNrczogewogICAgICAgIEVkaXRBY3Rpb246IFslIERhdGEuRWRpdEFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRWRpdE1hc2tTdWJhY3Rpb246IFslIERhdGEuRWRpdE1hc2tTdWJhY3Rpb24gfCBKU09OICVdCiAgICB9Cn07CgokKCcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgIFN0YXJ0OiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWyUgRGF0YS5TdGFydCB8IEpTT04gJV0pLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgRW5kOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWyUgRGF0YS5TdGFydCB8IEpTT04gJV0pLmFkZCgyLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICB9KTsKCiAgICByZXR1cm4gZmFsc2U7Cn0pOwokKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKSwKICAgICAgICBBcHBvaW50bWVudElEID0gJE1hc3RlckFjdGlvbkxpbmsuZGF0YSgnYXBwb2ludG1lbnRJZCcpOwoKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsKICAgICAgICBDYWxFdmVudDogewogICAgICAgICAgICBpZDogQXBwb2ludG1lbnRJRAogICAgICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBmYWxzZTsKfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgoKICAgIDxoMSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IEltcG9ydCIpIHwgaHRtbCAlXTwvaDE+CgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlICVdCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkJhY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gYmFjayIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVXBsb2FkZWQgZmlsZSBtdXN0IGJlIGluIHZhbGlkIGlDYWwgZm9ybWF0ICguaWNzKS4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIklmIGRlc2lyZWQgQ2FsZW5kYXIgaXMgbm90IGxpc3RlZCBoZXJlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgYXQgbGVhc3QgJ2NyZWF0ZScgcGVybWlzc2lvbnMuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBBcHBvaW50bWVudHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGaWxlVXBsb2FkIiBjbGFzcz0iTWFuZGF0b3J5Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVXBsb2FkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iMTgiIGNsYXNzPSJGaXhlZCBXMTAwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5GaWxlVXBsb2FkSW52YWxpZCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGaWxlVXBsb2FkU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFySUQiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNhbGVuZGFyICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYWxlbmRhcklERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJVcGRhdGVFeGlzdGluZ0FwcG9pbnRtZW50cyI+WyUgVHJhbnNsYXRlKCJVcGRhdGUgZXhpc3RpbmcgYXBwb2ludG1lbnRzPyIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9IlVwZGF0ZUV4aXN0aW5nQXBwb2ludG1lbnRzIiBpZD0iVXBkYXRlRXhpc3RpbmdBcHBvaW50bWVudHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQWxsIGV4aXN0aW5nIGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIgd2l0aCBzYW1lIFVuaXF1ZUlEIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJVcGxvYWQgY2FsZW5kYXIiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiSW1wb3J0IGFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgoKICAgIDxoMSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBJRiBFbnYoIlN1YmFjdGlvbiIpID09ICJPdmVydmlldyIgJV0KWyUgSUYgRGF0YS5Nb2R1bGVQZXJtaXNzaW9ucy5BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkJhY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1sZWZ0Ij48L2k+WyUgVHJhbnNsYXRlKCJHbyBiYWNrIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIEVMU0lGIEVudigiU3ViYWN0aW9uIikgIT0gIiIgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJCYWNrIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIGJhY2siKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBFTFNFICVdClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJPdmVydmlldyIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNhbGVuZGFyIE92ZXJ2aWV3IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhciI+PC9pPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIgT3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBFTkQgJV0KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1haW5BY3Rpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJBZGQiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU5ldyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgbmV3IENhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIENhbGVuZGFyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgSUYgRGF0YS5Nb2R1bGVQZXJtaXNzaW9ucy5BZ2VudEFwcG9pbnRtZW50SW1wb3J0ICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgpbJSBJRiBEYXRhLlZhbGlkQ291bnQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkltcG9ydEFwcG9pbnRtZW50cyIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRJbXBvcnQiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSW1wb3J0IEFwcG9pbnRtZW50cyIpIHwgaHRtbCAlXSI+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkltcG9ydEFwcG9pbnRtZW50cyIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIERpc2FibGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdIj4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJJbXBvcnQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJNYWluQWN0aW9ucyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uSW1wb3J0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIgSW1wb3J0IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSGVyZSB5b3UgY2FuIHVwbG9hZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbXBvcnQgYSBjYWxlbmRhciB0byB5b3VyIHN5c3RlbS4gVGhlIGZpbGUgbmVlZHMgdG8gYmUgaW4gLnltbCBmb3JtYXQgYXMgZXhwb3J0ZWQgYnkgY2FsZW5kYXIgbWFuYWdlbWVudCBtb2R1bGUuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ2FsZW5kYXJJbXBvcnQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkZpbGVVcGxvYWQiIGlkPSJGaWxlVXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSIxOCIgY2xhc3M9IkZpeGVkIFcxMDBwYyBWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLkZpbGVVcGxvYWRJbnZhbGlkIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRmlsZVVwbG9hZEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkZpbGVVcGxvYWRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Ik92ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXNJbXBvcnQiIG5hbWU9Ik92ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXMiIHZhbHVlPSIxIiBjaGVja2VkPSJjaGVja2VkIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik92ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXNJbXBvcnQiPlslIFRyYW5zbGF0ZSgiT3ZlcndyaXRlIGV4aXN0aW5nIGVudGl0aWVzIikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciBTcGFjaW5nVG9wIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwbG9hZCBjYWxlbmRhciBjb25maWd1cmF0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtdXBsb2FkIj48L2k+WyUgVHJhbnNsYXRlKCJJbXBvcnQgQ2FsZW5kYXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkltcG9ydCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlckNhbGVuZGFycyI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIGNhbGVuZGFycyIpIHwgaHRtbCAlXTwvbGFiZWw+PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJGaWx0ZXJDYWxlbmRhcnMiIGNsYXNzPSJGaWx0ZXJCb3giIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkp1c3Qgc3RhcnQgdHlwaW5nIHRvIGZpbHRlci4uLiIpIHwgaHRtbCAlXSIgbmFtZT0iRmlsdGVyQ2FsZW5kYXJzIiB2YWx1ZT0iIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIGNhbGVuZGFycyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJGaWx0ZXIiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkRlcGVuZGluZyBvbiB0aGUgZ3JvdXAgZmllbGQsIHRoZSBzeXN0ZW0gd2lsbCBhbGxvdyB1c2VycyB0aGUgYWNjZXNzIHRvIHRoZSBjYWxlbmRhciBhY2NvcmRpbmcgdG8gdGhlaXIgcGVybWlzc2lvbiBsZXZlbC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlJlYWQgb25seTogdXNlcnMgY2FuIHNlZSBhbmQgZXhwb3J0IGFsbCBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTW92ZSBpbnRvOiB1c2VycyBjYW4gbW9kaWZ5IGFwcG9pbnRtZW50cyBpbiB0aGUgY2FsZW5kYXIsIGJ1dCB3aXRob3V0IGNoYW5naW5nIHRoZSBjYWxlbmRhciBzZWxlY3Rpb24uIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDcmVhdGU6IHVzZXJzIGNhbiBjcmVhdGUgYW5kIGRlbGV0ZSBhcHBvaW50bWVudHMgaW4gdGhlIGNhbGVuZGFyLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUmVhZC93cml0ZTogdXNlcnMgY2FuIG1hbmFnZSB0aGUgY2FsZW5kYXIgaXRzZWxmLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXciKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIiBpZD0iVXNlciI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiR3JvdXAiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiQ2hhbmdlZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIFcxMHBjIj5bJSBUcmFuc2xhdGUoIkV4cG9ydCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJEb3dubG9hZCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciBXMTBwYyI+WyUgVHJhbnNsYXRlKCJVUkwiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0clslIElGIERhdGEuVmFsaWRJRCAhPSAxICVdIGNsYXNzPSJJbnZhbGlkIlslIEVORCAlXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXTsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck1hbmFnZTtTdWJhY3Rpb249RWRpdDtDYWxlbmRhcklEPVslIERhdGEuQ2FsZW5kYXJJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+WyUgRGF0YS5Hcm91cCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ2hhbmdlVGltZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuQ3JlYXRlVGltZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJFeHBvcnRMaW5rIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlO1N1YmFjdGlvbj1DYWxlbmRhckV4cG9ydDtDYWxlbmRhcklEPVslIERhdGEuQ2FsZW5kYXJJRCB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRXhwb3J0IGNhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWRvd25sb2FkIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkV4cG9ydCBjYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgojIFVzZSBhbXBlcnNhbmRzICgmKSBpbnN0ZWFkIG9mIHNlbWljb2xvbnMgKDspIGZvciBVUkwgcGFyYW1ldGVyIGRlbGltaXRlci4gVGhpcyBoYXMgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQKIyAgIGNhbGVuZGFyIGltcGxlbWVudGF0aW9ucyBhbmQgd2lsbCBwcmV2ZW50IHRoZW0gZnJvbSByZS1lbmNvZGluZyB0aGUgcXVlcnkgc3RyaW5nIGFuZCBlc3NlbnRpYWxseSBzdHJpcCB0aGUgZGF0YS4KIyAgIFBsZWFzZSBzZWUgYnVnIzEyNjY3IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJEb3dubG9hZExpbmsiIGhyZWY9IlslIENvbmZpZygiSHR0cFR5cGUiKSAlXTovL1slIENvbmZpZygiRlFETiIpICVdL1slIENvbmZpZygiU2NyaXB0QWxpYXMiKSAlXXB1YmxpYy5wbD9BY3Rpb249UHVibGljQ2FsZW5kYXImQ2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0mVXNlcj1bJSBFbnYoIlVzZXJMb2dpbiIpIHwgdXJpICVdJlRva2VuPVslIERhdGEuQWNjZXNzVG9rZW4gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRvd25sb2FkIGNhbGVuZGFyIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNsb3VkLWRvd25sb2FkIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkRvd25sb2FkIGNhbGVuZGFyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iSW5saW5lQnV0dG9uIENvcHlUb0NsaXBib2FyZCIgZGF0YS1jbGlwYm9hcmQtdGV4dD0iWyUgQ29uZmlnKCJIdHRwVHlwZSIpICVdOi8vWyUgQ29uZmlnKCJGUUROIikgJV0vWyUgQ29uZmlnKCJTY3JpcHRBbGlhcyIpICVdcHVibGljLnBsP0FjdGlvbj1QdWJsaWNDYWxlbmRhciZDYWxlbmRhcklEPVslIERhdGEuQ2FsZW5kYXJJRCB8IHVyaSAlXSZVc2VyPVslIEVudigiVXNlckxvZ2luIikgfCB1cmkgJV0mVG9rZW49WyUgRGF0YS5BY2Nlc3NUb2tlbiB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNsaXBib2FyZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJDb3B5IHB1YmxpYyBjYWxlbmRhciBVUkwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhck5vRGF0YVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJOb0RhdGFSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI5IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50OyI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgnI0ZpbHRlckNhbGVuZGFycycpLCAkKCcjVXNlcicpKTsKCiAgICB2YXIgQ2xpcGJvYXJkSlMgPSBuZXcgQ2xpcGJvYXJkKCcuQ29weVRvQ2xpcGJvYXJkJyk7CiAgICBDbGlwYm9hcmRKUy5vbignc3VjY2VzcycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoRXZlbnQudHJpZ2dlcikuaGlkZSgpCiAgICAgICAgICAgIC5mYWRlSW4oKTsKICAgICAgICBFdmVudC5jbGVhclNlbGVjdGlvbigpOwogICAgfSk7CgogICAgQ2xpcGJvYXJkSlMub24oJ2Vycm9yJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICBDb3JlLkZvcm0uRXJyb3JUb29sdGlwcy5Jbml0VG9vbHRpcCgkKEV2ZW50LnRyaWdnZXIpLCAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnKTsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmZvY3VzKCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyRWRpdCIpICVdCiAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9IkNhbGVuZGFyRnJvbSIgaWQ9IkNhbGVuZGFyRnJvbSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJbJSBEYXRhLlN1YmFjdGlvbiB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2FsZW5kYXJJRCIgdmFsdWU9IlslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2FsZW5kYXJOYW1lIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNhbGVuZGFyIG5hbWUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ2FsZW5kYXJOYW1lIiBuYW1lPSJDYWxlbmRhck5hbWUiIHZhbHVlPSJbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIFc1MHBjIFslIERhdGEuQ2FsZW5kYXJOYW1lSW52YWxpZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYWxlbmRhck5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIElGIERhdGEuQ2FsZW5kYXJOYW1lRXhpc3RzICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYWxlbmRhck5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDYWxlbmRhck5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29sb3IiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ29sb3IiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iQ29sb3IiIG5hbWU9IkNvbG9yIiB2YWx1ZT0iWyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCBXNTBwYyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNvbG9yRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iR3JvdXBJRCIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJQZXJtaXNzaW9uIGdyb3VwIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkdyb3VwSUQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbGlkSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVmFsaWRpdHkiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRJRCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBbJSBEYXRhLldpZGdldFN0YXR1cyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJUaWNrZXQgQXBwb2ludG1lbnRzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEFwcG9pbnRtZW50UnVsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGlkPSJSdWxlX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXSIgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiUnVsZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iUnVsZU51bWJlciI+WyUgRGF0YS5SdWxlTnVtYmVyIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xlZ2VuZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhcnREYXRlX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRW5kRGF0ZV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5FbmREYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJVc2Ugb3B0aW9ucyBiZWxvdyB0byBuYXJyb3cgZG93biBmb3Igd2hpY2ggdGlja2V0cyBhcHBvaW50bWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJRdWV1ZUlEX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJRdWV1ZXMiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVJRFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlF1ZXVlSURfWyUgRGF0YS5SdWxlSUQgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUXVldWVJRF9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNlbGVjdCBhIHZhbGlkIHF1ZXVlLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VhcmNoUGFyYW1zX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlYXJjaCBhdHRyaWJ1dGVzIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTZWFyY2hQYXJhbXNDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZWFyY2hQYXJhbXNTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWRkQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRBcHBvaW50bWVudFJ1bGVTZWFyY2hQYXJhbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFBhcmFtX1slIERhdGEuUnVsZUlEIHwgaHRtbCAlXV9bJSBEYXRhLlBhcmFtTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoQ29uZmlnKCJBcHBvaW50bWVudENhbGVuZGFyOjpUaWNrZXRBcHBvaW50bWVudFNlYXJjaFBhcmFtIikuJHtEYXRhLlBhcmFtTmFtZX0pIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuUGFyYW1TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QYXJhbVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBuYW1lPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdIiBkYXRhLXBhcmFtPSJbJSBEYXRhLlBhcmFtTmFtZSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGNsYXNzPSJTZWFyY2hQYXJhbSBWYWxpZGF0ZV9SZXF1aXJlZCBXMjVwYyIgdmFsdWU9IlslIERhdGEuUGFyYW1WYWx1ZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZWFyY2hQYXJhbV9bJSBEYXRhLlJ1bGVJRCB8IGh0bWwgJV1fWyUgRGF0YS5QYXJhbU5hbWUgfCBodG1sICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50UnVsZVNlYXJjaFBhcmFtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnRSdWxlIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVmaW5lIHJ1bGVzIGZvciBjcmVhdGluZyBhdXRvbWF0aWMgYXBwb2ludG1lbnRzIGluIHRoaXMgY2FsZW5kYXIgYmFzZWQgb24gdGlja2V0IGRhdGEuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iQWRkUnVsZUJ1dHRvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFkZCBSdWxlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdmFsdWU9IlNhdmUiIHR5cGU9InN1Ym1pdCIgaWQ9IlN1Ym1pdCIgY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgaWQ9IlRpY2tldEFwcG9pbnRtZW50UnVsZXNUZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgPGxlZ2VuZD4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJSdWxlIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJSdWxlTnVtYmVyIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJSZW1vdmVCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSB0aGlzIGVudHJ5IikgfCBodG1sICVdIiBocmVmPSIjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9sZWdlbmQ+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFydERhdGUiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFydERhdGVTdHJnICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkVuZERhdGUiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuRW5kRGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlVzZSBvcHRpb25zIGJlbG93IHRvIG5hcnJvdyBkb3duIGZvciB3aGljaCB0aWNrZXRzIGFwcG9pbnRtZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlF1ZXVlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJRdWV1ZXMiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVJRFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJRdWV1ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZWFyY2hQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VhcmNoIGF0dHJpYnV0ZXMiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU2VhcmNoUGFyYW1zQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlYXJjaFBhcmFtc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWRkQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJBZGQgZW50cnkiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iVGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbVRlbXBsYXRlIiBjbGFzcz0iSGlkZGVuIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcFNtYWxsIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlYXJjaFBhcmFtIiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIFslIERhdGEuU2VhcmNoUGFyYW1Vc2VyICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlNlYXJjaFBhcmFtIiBuYW1lPSJTZWFyY2hQYXJhbSIgdHlwZT0idGV4dCIgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIiAvPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VhcmNoUGFyYW1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iUmVtb3ZlQnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1vdmUgdGhpcyBlbnRyeSIpIHwgaHRtbCAlXSIgaHJlZj0iIyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlLkluaXRUaWNrZXRBcHBvaW50bWVudHMoWyUgRGF0YS5SdWxlQ291bnQgfCBKU09OICVdKTsKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRSdWxlSW5pdCIpICVdCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UuSW5pdFRpY2tldEFwcG9pbnRtZW50UnVsZShbJSBEYXRhLlJ1bGVJRCB8IEpTT04gJV0sICQoJyNSdWxlXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlJ1bGVJRCB8IEpTT04gJV0pKSk7ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudFJ1bGVJbml0IikgJV0KJCgnaW5wdXQjQ29sb3InKS5zcGVjdHJ1bSh7CiAgICBjb2xvcjogWyUgRGF0YS5Db2xvciB8IEpTT04gJV0sCiAgICBjb250YWluZXJDbGFzc05hbWU6ICdDb2xvclBhbGV0dGVDb250YWluZXInLAogICAgaGlkZUFmdGVyUGFsZXR0ZVNlbGVjdDogdHJ1ZSwKICAgIHByZWZlcnJlZEZvcm1hdDogJ2hleCcsCiAgICByZXBsYWNlckNsYXNzTmFtZTogJ0NvbG9yUGFsZXR0ZUJ1dHRvbicsCiAgICBzaG93SW5wdXQ6IHRydWUsCiAgICBzaG93UGFsZXR0ZTogdHJ1ZSwKICAgIHNob3dQYWxldHRlT25seTogdHJ1ZSwKICAgIHNob3dTZWxlY3Rpb25QYWxldHRlOiBmYWxzZSwKICAgIHRvZ2dsZVBhbGV0dGVPbmx5OiB0cnVlLAogICAgdG9nZ2xlUGFsZXR0ZU1vcmVUZXh0OiBbJSBUcmFuc2xhdGUoIk1vcmUiKSB8IEpTT04gJV0sCiAgICB0b2dnbGVQYWxldHRlTGVzc1RleHQ6IFslIFRyYW5zbGF0ZSgiTGVzcyIpIHwgSlNPTiAlXSwKICAgIGNob29zZVRleHQ6IFslIFRyYW5zbGF0ZSgiQ29uZmlybSIpIHwgSlNPTiAlXSwKICAgIGNhbmNlbFRleHQ6IFslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBKU09OICVdLAogICAgcGFsZXR0ZTogWwogICAgICAgICdbJSBEYXRhLkNvbG9yUGFsZXR0ZS5qb2luKCInLCciKSAlXScKICAgIF0KfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJFZGl0IikgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIgT3ZlcnZpZXciKSB8IGh0bWwgJV08L2gxPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIEVudigiVXNlckNoYWxsZW5nZVRva2VuIikgJV0iIG5hbWU9IkNoYWxsZW5nZVRva2VuIiBpZD0iQ2hhbGxlbmdlVG9rZW4iIC8+CiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQWN0aW9ucyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9uTGlzdCI+ClslIElGIERhdGEuTW9kdWxlUGVybWlzc2lvbnMuQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2U7U3ViYWN0aW9uPU92ZXJ2aWV3IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhbGVuZGFyLW8iPjwvaT5bJSBUcmFuc2xhdGUoIk1hbmFnZSBDYWxlbmRhcnMiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIiBocmVmPSIjIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBuZXcgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+WyUgVHJhbnNsYXRlKCJBZGQgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXBwb2ludG1lbnRDcmVhdGVCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyV2lkZ2V0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXJzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJGaWx0ZXJDYWxlbmRhcnMiIGNsYXNzPSJGaWx0ZXJCb3giIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkp1c3Qgc3RhcnQgdHlwaW5nIHRvIGZpbHRlci4uLiIpIHwgaHRtbCAlXSIgbmFtZT0iRmlsdGVyQ2FsZW5kYXJzIiB2YWx1ZT0iIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGaWx0ZXIgZm9yIGNhbGVuZGFycyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSBTcGFjaW5nVG9wU21hbGwiIGlkPSJDYWxlbmRhcnMiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXMTBwYyI+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzEwcGMiPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIFcxMHBjIj5bJSBUcmFuc2xhdGUoIlVSTCIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyU3dpdGNoIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJDYWxlbmRhclN3aXRjaCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQ2FsZW5kYXJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiBuYW1lPSJDYWxlbmRhclslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iIGRhdGEtaWQ9IlslIERhdGEuQ2FsZW5kYXJJRCB8IGh0bWwgJV0iIFslIERhdGEuQ2hlY2tlZCAlXS8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJGbGFncyBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFyWyUgRGF0YS5DYWxlbmRhcklEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNhbGVuZGFyQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXTsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ2FsZW5kYXJbJSBEYXRhLkNhbGVuZGFySUQgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhck5hbWUgfCB0cnVuY2F0ZSgyMSkgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiMgVXNlIGFtcGVyc2FuZHMgKCYpIGluc3RlYWQgb2Ygc2VtaWNvbG9ucyAoOykgZm9yIFVSTCBwYXJhbWV0ZXIgZGVsaW1pdGVyLiBUaGlzIGhhcyBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIGRpZmZlcmVudAojICAgY2FsZW5kYXIgaW1wbGVtZW50YXRpb25zIGFuZCB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIHJlLWVuY29kaW5nIHRoZSBxdWVyeSBzdHJpbmcgYW5kIGVzc2VudGlhbGx5IHN0cmlwIHRoZSBkYXRhLgojICAgUGxlYXNlIHNlZSBidWcjMTI2NjcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvcHlUb0NsaXBib2FyZCBJbmxpbmVCdXR0b24iIGRhdGEtY2xpcGJvYXJkLXRleHQ9IlslIENvbmZpZygiSHR0cFR5cGUiKSAlXTovL1slIENvbmZpZygiRlFETiIpICVdL1slIENvbmZpZygiU2NyaXB0QWxpYXMiKSAlXXB1YmxpYy5wbD9BY3Rpb249UHVibGljQ2FsZW5kYXImQ2FsZW5kYXJJRD1bJSBEYXRhLkNhbGVuZGFySUQgfCB1cmkgJV0mVXNlcj1bJSBFbnYoIlVzZXJMb2dpbiIpIHwgdXJpICVdJlRva2VuPVslIERhdGEuQWNjZXNzVG9rZW4gfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvcHkgcHVibGljIGNhbGVuZGFyIFVSTCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jbGlwYm9hcmQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ29weSBwdWJsaWMgY2FsZW5kYXIgVVJMIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhclN3aXRjaCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRmlsdGVyTWVzc2FnZSBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPlslIFRyYW5zbGF0ZSgiTm8gbWF0Y2hlcyBmb3VuZC4iKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI0NhbGVuZGFycycpKTsKCiAgICB2YXIgQ2xpcGJvYXJkSlMgPSBuZXcgQ2xpcGJvYXJkKCcuQ29weVRvQ2xpcGJvYXJkJyk7CiAgICBDbGlwYm9hcmRKUy5vbignc3VjY2VzcycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoRXZlbnQudHJpZ2dlcikuaGlkZSgpCiAgICAgICAgICAgIC5mYWRlSW4oKTsKICAgICAgICBFdmVudC5jbGVhclNlbGVjdGlvbigpOwogICAgfSk7CgogICAgQ2xpcGJvYXJkSlMub24oJ2Vycm9yJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICBDb3JlLkZvcm0uRXJyb3JUb29sdGlwcy5Jbml0VG9vbHRpcCgkKEV2ZW50LnRyaWdnZXIpLCAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnKTsKICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmZvY3VzKCk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhcldpZGdldCIpICVdCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgQ2FsZW5kYXJXaWRnZXQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uTWVudSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFNldHRpbmdzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkNhbGVuZGFyU2V0dGluZ3NCdXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNldHRpbmdzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jb2ciPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2FsZW5kYXIiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCAiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9DYWxlbmRhciIpICVdCiAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5vIGNhbGVuZGFycyBmb3VuZC4gUGxlYXNlIGFkZCBhIGNhbGVuZGFyIGZpcnN0IGJ5IHVzaW5nIE1hbmFnZSBDYWxlbmRhcnMgcGFnZS4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJOb0NhbGVuZGFyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyRGl2IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiBbJSBEYXRhLkNhbGVuZGFyV2lkdGggfCBodG1sICVdJTsgbWFyZ2luOiAwIGF1dG87IHotaW5kZXg6IDEwOyIgaWQ9ImNhbGVuZGFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNhbGVuZGFyRGl2IikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNMb2FkaW5nJywgWyUgVHJhbnNsYXRlKCJMb2FkaW5nLi4uIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc0hlYWRsaW5lJywgWyUgVHJhbnNsYXRlKCJUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzIikgfCBKU09OICVdKTsKQ29yZS5Db25maWcuU2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zVG9vTWFueUNhbGVuZGFyc1RleHQnLCBbJSBUcmFuc2xhdGUoIlBsZWFzZSBlaXRoZXIgdHVybiBzb21lIG9mZiBmaXJzdCBvciBpbmNyZWFzZSB0aGUgbGltaXQgaW4gY29uZmlndXJhdGlvbi4iKSB8IEpTT04gJV0pOwpDb3JlLkNvbmZpZy5TZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNZZXMnLCBbJSBUcmFuc2xhdGUoIlllcyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NldHRpbmdzJywgWyUgVHJhbnNsYXRlKCJTZXR0aW5ncyIpIHwgSlNPTiAlXSk7CkNvcmUuQ29uZmlnLlNldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1NhdmUnLCBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IEpTT04gJV0pOwoKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkluaXQoewogICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgQWxsRGF5VGV4dDogWyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBKU09OICVdLAogICAgSXNSVEw6IFslIERhdGEuSXNSVExMYW5ndWFnZSAlXSwKICAgIE1vbnRoTmFtZXM6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIkphbnVhcnkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXlfbG9uZyIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bmUiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJKdWx5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiQXVndXN0IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiU2VwdGVtYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0b2JlciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjZW1iZXIiKSB8IEpTT04gJV0KICAgIF0sCiAgICBNb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIkphbiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZlYiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1hciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1biIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkp1bCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkF1ZyIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk9jdCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk5vdiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkRlYyIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzOiBbCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTdW5kYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJNb25kYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJUdWVzZGF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiV2VkbmVzZGF5IikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVGh1cnNkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJGcmlkYXkiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTYXR1cmRheSIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzU2hvcnQ6IFsKICAgICAgICBbJSBUcmFuc2xhdGUoIlN1biIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vbiIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlR1ZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIldlZCIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlRodSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlNhdCIpIHwgSlNPTiAlXQogICAgXSwKICAgIERheU5hbWVzTWluOiBbCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTdSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIk1vIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiVHUiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJXZSIpIHwgSlNPTiAlXSwKICAgICAgICBbJSBUcmFuc2xhdGUoIlRoIikgfCBKU09OICVdLAogICAgICAgIFslIFRyYW5zbGF0ZSgiRnIiKSB8IEpTT04gJV0sCiAgICAgICAgWyUgVHJhbnNsYXRlKCJTYSIpIHwgSlNPTiAlXQogICAgXSwKICAgIEJ1dHRvblRleHQ6IHsKICAgICAgICB0b2RheTogWyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgSlNPTiAlXSwKICAgICAgICBtb250aDogWyUgVHJhbnNsYXRlKCJNb250aCIpIHwgSlNPTiAlXSwKICAgICAgICB3ZWVrOiBbJSBUcmFuc2xhdGUoIldlZWsiKSB8IEpTT04gJV0sCiAgICAgICAgZGF5OiBbJSBUcmFuc2xhdGUoIkRheSIpIHwgSlNPTiAlXSwKICAgICAgICB0aW1lbGluZU1vbnRoOiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIE1vbnRoIikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lV2VlazogWyUgVHJhbnNsYXRlKCJUaW1lbGluZSBXZWVrIikgfCBKU09OICVdLAogICAgICAgIHRpbWVsaW5lRGF5OiBbJSBUcmFuc2xhdGUoIlRpbWVsaW5lIERheSIpIHwgSlNPTiAlXSwKICAgICAgICBqdW1wOlslIFRyYW5zbGF0ZSgiSnVtcCIpIHwgSlNPTiAlXSwKICAgICAgICBwcmV2RGF0ZXBpY2tlcjogWyUgVHJhbnNsYXRlKCJQcmV2aW91cyIpIHwgSlNPTiAlXSwKICAgICAgICBuZXh0RGF0ZXBpY2tlcjogWyUgVHJhbnNsYXRlKCJOZXh0IikgfCBKU09OICVdCiAgICB9LAogICAgRmlyc3REYXk6IFslIERhdGEuRmlyc3REYXkgfCBodG1sICVdLAogICAgRGVmYXVsdFZpZXc6IFslIERhdGEuRGVmYXVsdFZpZXcgfCBKU09OICVdLAogICAgSGVhZGVyOiB7CiAgICAgICAgbGVmdDogJ21vbnRoLGFnZW5kYVdlZWssYWdlbmRhRGF5IHRpbWVsaW5lTW9udGgsdGltZWxpbmVXZWVrLHRpbWVsaW5lRGF5JywKICAgICAgICBjZW50ZXI6ICd0aXRsZScsCiAgICAgICAgcmlnaHQ6ICdqdW1wLHRvZGF5IHByZXYsbmV4dCcKICAgIH0sCiAgICBEaWFsb2dUZXh0OiB7CiAgICAgICAgRWRpdFRpdGxlOiBbJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUaXRsZTogWyUgVHJhbnNsYXRlKCJUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50IikgfCBKU09OICVdLAogICAgICAgIE9jY3VycmVuY2VUZXh0OiBbJSBUcmFuc2xhdGUoIldvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlQWxsOiBbJSBUcmFuc2xhdGUoIkFsbCBvY2N1cnJlbmNlcyIpIHwgSlNPTiAlXSwKICAgICAgICBPY2N1cnJlbmNlSnVzdFRoaXM6IFslIFRyYW5zbGF0ZSgiSnVzdCB0aGlzIG9jY3VycmVuY2UiKSB8IEpTT04gJV0sCiAgICAgICAgQ2xvc2U6IFslIFRyYW5zbGF0ZSgiQ2xvc2UiKSB8IEpTT04gJV0sCiAgICAgICAgRGlzbWlzczogWyUgVHJhbnNsYXRlKCJEaXNtaXNzIikgfCBKU09OICVdCiAgICB9LAogICAgT3ZlcnZpZXdTY3JlZW46ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgIENhbGVuZGFyU2V0dGluZ3NCdXR0b246ICdDYWxlbmRhclNldHRpbmdzQnV0dG9uJywKICAgIENhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXI6ICdDYWxlbmRhclNldHRpbmdzRGlhbG9nQ29udGFpbmVyJywKICAgIENhbGVuZGFyU2V0dGluZ3NTaG93OiBbJSBEYXRhLkNhbGVuZGFyU2V0dGluZ3NTaG93IHwgSlNPTiAlXSwKICAgIFRpY2tldEFwcG9pbnRtZW50TWFya3M6IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnRNYXJrIikgJV0KICAgICAgICBbJSBEYXRhLkFwcG9pbnRtZW50VHlwZSAlXTogWyUgRGF0YS5BcHBvaW50bWVudE1hcmsgfCBKU09OICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEFwcG9pbnRtZW50TWFya0NvbW1hIikgJV0KICAgICAgICAsClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE1hcmtDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRBcHBvaW50bWVudE1hcmsiKSAlXQogICAgfSwKICAgIENhbGxiYWNrczogewogICAgICAgIEVkaXRBY3Rpb246IFslIERhdGEuRWRpdEFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgRWRpdE1hc2tTdWJhY3Rpb246IFslIERhdGEuRWRpdE1hc2tTdWJhY3Rpb24gfCBKU09OICVdLAogICAgICAgIEVkaXRTdWJhY3Rpb246IFslIERhdGEuRWRpdFN1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgQWRkU3ViYWN0aW9uOiBbJSBEYXRhLkFkZFN1YmFjdGlvbiB8IEpTT04gJV0sCiAgICAgICAgUHJlZlN1YmFjdGlvbjogWyUgRGF0YS5QcmVmU3ViYWN0aW9uIHwgSlNPTiAlXSwKICAgICAgICBMaXN0QWN0aW9uOiBbJSBEYXRhLkxpc3RBY3Rpb24gfCBKU09OICVdLAogICAgICAgIERheXNTdWJhY3RvbjogWyUgRGF0YS5EYXlzU3ViYWN0aW9uIHwgSlNPTiAlXQogICAgfSwKICAgIEFwcG9pbnRtZW50OiB7CiAgICAgICAgQXBwb2ludG1lbnRDcmVhdGU6IFslIERhdGEuQXBwb2ludG1lbnRDcmVhdGUgfHwgIm51bGwiICVdLAogICAgICAgIEFwcG9pbnRtZW50SUQ6IFslIERhdGEuQXBwb2ludG1lbnRJRCB8IEpTT04gJV0sCiAgICAgICAgQXBwb2ludG1lbnRDcmVhdGVCdXR0b246ICdBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicKICAgIH0sCiAgICBDYWxlbmRhcnM6IHsKICAgICAgICBTb3VyY2VzOiB7ClslIFJlbmRlckJsb2NrU3RhcnQoIkNhbGVuZGFyU291cmNlIikgJV0KICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXTogewogICAgICAgICAgICAgICAgdXJsOiBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAogICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdEFwcG9pbnRtZW50cycsCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRDogWyUgRGF0YS5DYWxlbmRhcklEIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUlEOiBbJSBEYXRhLlJlc291cmNlSUQgfCBKU09OICVdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29sb3I6IFslIERhdGEuQ29sb3IgfCBKU09OICVdLAogICAgICAgICAgICAgICAgdGV4dENvbG9yOiBbJSBEYXRhLlRleHRDb2xvciB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4yKScsCiAgICAgICAgICAgICAgICBzdGFydFBhcmFtOiAnU3RhcnRUaW1lJywKICAgICAgICAgICAgICAgIGVuZFBhcmFtOiAnRW5kVGltZScsCgogICAgICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgcmVtb3ZlRXZlbnRTb3VyY2UKICAgICAgICAgICAgICAgIGdvb2dsZUNhbGVuZGFySWQ6IFslIERhdGEuQ2FsZW5kYXJJRCB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudE5vRHJhZyA9IHsKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkFwcG9pbnRtZW50VHlwZSAlXTogcGFyc2VJbnQoWyUgRGF0YS5Ob0RyYWcgfCBKU09OICVdLCAxMCkgPyB0cnVlIDogZmFsc2UKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWdDb21tYSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldEFwcG9pbnRtZW50Tm9EcmFnQ29tbWEiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QXBwb2ludG1lbnROb0RyYWciKSAlXQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBBcHBvaW50bWVudERhdGEuQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQ6IEFwcG9pbnRtZW50RGF0YS5QYXJlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IEFwcG9pbnRtZW50RGF0YS5TdGFydFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogQXBwb2ludG1lbnREYXRhLlN0YXJ0RGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBBcHBvaW50bWVudERhdGEuRW5kVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogQXBwb2ludG1lbnREYXRhLkVuZERhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBBcHBvaW50bWVudERhdGEuVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBBcHBvaW50bWVudERhdGEuRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBBcHBvaW50bWVudERhdGEuTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFySWQ6IEFwcG9pbnRtZW50RGF0YS5DYWxlbmRhcklELAogICAgICAgICAgICAgICAgICAgICAgICBhbGxEYXk6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5BbGxEYXksIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJyaW5nOiBwYXJzZUludChBcHBvaW50bWVudERhdGEuUmVjdXJyaW5nLCAxMCkgPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1JZHM6IEFwcG9pbnRtZW50RGF0YS5UZWFtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1OYW1lczogQXBwb2ludG1lbnREYXRhLlRlYW1OYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZUlELAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWVzOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2VOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRGF0YTogQXBwb2ludG1lbnREYXRhLlBsdWdpbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyTmFtZTogWyUgRGF0YS5DYWxlbmRhck5hbWUgfCBKU09OICVdLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uOiBBcHBvaW50bWVudERhdGEuTm90aWZpY2F0aW9uRGF0ZS5sZW5ndGggPyB0cnVlIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkRhdGU6IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLAogICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRBcHBvaW50bWVudFR5cGU6IEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRFZGl0YWJsZTogVGlja2V0QXBwb2ludG1lbnROb0RyYWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlXSA/IGZhbHNlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogdHlwZW9mIEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudEVuZERhdGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgVGlja2V0QXBwb2ludG1lbnROb0RyYWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50RW5kRGF0ZV0gIT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDYWxlbmRhclNvdXJjZUNvbW1hIikgJV0KICAgICAgICAgICAgLApbJSBSZW5kZXJCbG9ja0VuZCgiQ2FsZW5kYXJTb3VyY2VDb21tYSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJDYWxlbmRhclNvdXJjZSIpICVdCiAgICAgICAgfSwKICAgICAgICBTd2l0Y2hlczogJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nKSwKICAgICAgICBMaW1pdDogWyUgQ29uZmlnKCJBcHBvaW50bWVudENhbGVuZGFyOjpDYWxlbmRhckxpbWl0T3ZlcnZpZXciKSB8fCAxMCAlXQogICAgfSwKICAgIFdvcmtpbmdIb3VyczogWwpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXb3JraW5nSG91cnMiKSAlXQogICAgICAgIHsKICAgICAgICAgICAgaWQ6ICd3b3JraW5nSG91cnMnLAogICAgICAgICAgICBzdGFydDogWyUgRGF0YS5TdGFydFRpbWUgfCBKU09OICVdLAogICAgICAgICAgICBlbmQ6IFslIERhdGEuRW5kVGltZSB8IEpTT04gJV0sCiAgICAgICAgICAgIGNvbG9yOiAnI0Q3RDdENycsCiAgICAgICAgICAgIHJlbmRlcmluZzogJ2ludmVyc2UtYmFja2dyb3VuZCcsCiAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZG93OiBbJSBEYXRhLkRvVyAlXQogICAgICAgIH0KWyUgUmVuZGVyQmxvY2tTdGFydCgiV29ya2luZ0hvdXJzQ29tbWEiKSAlXQogICAgICAgICwKWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtpbmdIb3Vyc0NvbW1hIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIldvcmtpbmdIb3VycyIpICVdCiAgICBdCn0pOwoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgIDxkaXYgaWQ9IkNhbGVuZGFyU2V0dGluZ3NEaWFsb2dDb250YWluZXIiIGNsYXNzPSJIaWRkZW4iPgogICAgICAgIDxmb3JtIGlkPSJDb250ZXh0U2V0dGluZ3NEaWFsb2dDYWxlbmRhck92ZXJ2aWV3IiBjbGFzcz0iIj4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNob3duQXBwb2ludG1lbnRzIj5bJSBUcmFuc2xhdGUoIlNob3ciKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNob3duQXBwb2ludG1lbnRzU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJBcHBvaW50bWVudFRvb2x0aXBUZW1wbGF0ZSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSWNvbnMiPjwvZGl2PgogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkJhc2ljIGluZm9ybWF0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiV0aXRsZSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lZGVzY3JpcHRpb24lPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWxvY2F0aW9uJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDYWxlbmRhckNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogJWNhbGVuZGFyQ29sb3IlOyI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgJWNhbGVuZGFyTmFtZSUKICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UiKSAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiV0ZWFtTmFtZXMlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUZWFtIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lcmVzb3VyY2VOYW1lcyU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UiKSAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkRhdGUvVGltZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4lc3RhcnREYXRlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhcnQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWVuZERhdGUlPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJFbmQgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JWFsbERheSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFsbC1kYXkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVyZWN1cnJpbmclPC9wPgogICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZXBlYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIElGIERhdGEuUGx1Z2luTGlzdCAlXQogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkxpbmsiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+ClslIEZPUkVBQ0ggUGx1Z2luS2V5IElOIERhdGEuUGx1Z2luTGlzdC5rZXlzICVdCiAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JVslIFBsdWdpbktleSAlXSU8L3A+CiAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5QbHVnaW5MaXN0LiRQbHVnaW5LZXkuUGx1Z2luTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPC9maWVsZHNldD4KWyUgRU5EICVdCiAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiVub3RpZmljYXRpb25EYXRlJTwvcD4KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgogICAgPC9kaXY+Cgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFNFVCBPVFJTQnVzaW5lc3NMYWJlbCA9ICc8c3Ryb25nPk9UUlMgQnVzaW5lc3MgU29sdXRpb248L3N0cm9uZz7ihKInICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCI+CiAgICA8Zm9ybSBpZD0iRWRpdEFwcG9pbnRtZW50Rm9ybSIgY2xhc3M9IlZhbGlkYXRlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQ2hhbGxlbmdlVG9rZW4iIG5hbWU9IkNoYWxsZW5nZVRva2VuIiB2YWx1ZT0iWyUgRW52KCJVc2VyQ2hhbGxlbmdlVG9rZW4iKSB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQWN0aW9uIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJTdWJhY3Rpb24iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkVkaXRBcHBvaW50bWVudCIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBcHBvaW50bWVudElEIiBuYW1lPSJBcHBvaW50bWVudElEIiB2YWx1ZT0iWyUgRGF0YS5BcHBvaW50bWVudElEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJpbmciIG5hbWU9IlJlY3VycmluZyIgdmFsdWU9IlslIERhdGEuUmVjdXJyaW5nIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlRGF5cyIgbmFtZT0iUmVjdXJyZW5jZURheXMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VEYXlzIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlTW9udGhzIiBuYW1lPSJSZWN1cnJlbmNlTW9udGhzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlTW9udGhzIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJSZWN1cnJlbmNlTW9udGhEYXlzIiBuYW1lPSJSZWN1cnJlbmNlTW9udGhEYXlzIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJlbmNlTW9udGhEYXlzIHwgaHRtbCAlXSIvPgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIkJhc2ljIGluZm9ybWF0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUaXRsZSJbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdIGNsYXNzPSJNYW5kYXRvcnkiWyUgRU5EICVdPlslIElGIERhdGEuUGVybWlzc2lvbkxldmVsID49IDIgJV08c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBFTkQgJV1bJSBUcmFuc2xhdGUoIlRpdGxlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L3A+ClslIEVMU0UgJV0KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGl0bGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUaXRsZSIgbmFtZT0iVGl0bGUiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIiAvPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVzY3JpcHRpb24iPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJEZXNjcmlwdGlvbiIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuRGVzY3JpcHRpb24gfHwgIi0iIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJEZXNjcmlwdGlvbiIgbmFtZT0iRGVzY3JpcHRpb24iIGNsYXNzPSJXNzVwYyIgcm93cz0iNCI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3RleHRhcmVhPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iTG9jYXRpb24iPlslIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJMb2NhdGlvbiIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuTG9jYXRpb24gfHwgIi0iIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJMb2NhdGlvbiIgbmFtZT0iTG9jYXRpb24iIHZhbHVlPSJbJSBEYXRhLkxvY2F0aW9uIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiAvPgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTG9jYXRpb25MaW5rIikgJV0KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJMb2NhdGlvbkxpbmsgSGlkZGVuIFslIERhdGEuQ1NTQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLlVSTCB8IGh0bWwgJV1bJSBEYXRhLkxvY2F0aW9uIHwgdXJpICVdIiBkYXRhLWJhc2UtdXJsPSJbJSBEYXRhLlVSTCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5UZXh0KSB8IGh0bWwgJV0iIHRhcmdldD0iWyUgRGF0YS5UYXJnZXQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgWyUgRGF0YS5JY29uTmFtZSB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgIDwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNhbGVuZGFySUQiWyUgSUYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMyAlXSBjbGFzcz0iTWFuZGF0b3J5IlslIEVORCAlXT4KWyUgSUYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMyAlXQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkNhbGVuZGFyIikgfCBodG1sICVdOgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAzICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iQ2FsZW5kYXJJRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuQ2FsZW5kYXJOYW1lIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5DYWxlbmRhcklEU3RyZyAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2FsZW5kYXJJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJSZXNvdXJjZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgSUYgRGF0YS5UZWFtSURTdHJnICVdCiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRlYW1JRCI+WyUgVHJhbnNsYXRlKCJUZWFtIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGVhbUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UZWFtTmFtZXMgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGVhbUlEU3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVzb3VyY2VJRCI+WyUgVHJhbnNsYXRlKCJBZ2VudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlJlc291cmNlSUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlJlc291cmNlTmFtZXMgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuUmVzb3VyY2VJRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZS4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIEluZm8iPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFkbWluT1RSU0J1c2luZXNzIiBjbGFzcz0iQnV0dG9uIj48aSBjbGFzcz0iZmEgZmEtYW5nbGUtZG91YmxlLXVwIj48L2k+IFslIFRyYW5zbGF0ZSgiVXBncmFkZSB0byAlcyIsIE9UUlNCdXNpbmVzc0xhYmVsKSAlXTwvYT4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFydERheSI+WyUgVHJhbnNsYXRlKCJTdGFydCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgKCBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUmVhZE9ubHlTdGFydCApIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlN0YXJ0RGF5IiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5TdGFydERhdGUgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iU3RhcnREYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBiZWZvcmUgRW5kIGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXJ0RGF0ZVN0cmluZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iRW5kRGF5Ij5bJSBUcmFuc2xhdGUoIkVuZCBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgKCBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUmVhZE9ubHlEdXJhdGlvbiApIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkVuZERheSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuRW5kRGF0ZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJFbmREYXlFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCBkYXRlISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgdGhpcyB0byB2YWx1ZSBhZnRlciBTdGFydCBkYXRlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgWyUgRGF0YS5FbmREYXRlU3RyaW5nICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJBbGxEYXkiPlslIFRyYW5zbGF0ZSgiQWxsLWRheSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iQWxsRGF5IiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgVHJhbnNsYXRlKERhdGEuQWxsRGF5U3RyaW5nKSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IkFsbERheSIgbmFtZT0iQWxsRGF5IiBbJSBEYXRhLkFsbERheUNoZWNrZWQgJV0gLz4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlY3VycmVuY2VUeXBlIj5bJSBUcmFuc2xhdGUoIlJlcGVhdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGFyZW50SUQgJV0KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50LiIpIHwgaHRtbCAlXTxicj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJFZGl0UGFyZW50Ij5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gc2VlIHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPC9hPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iUmVjdXJyZW5jZVR5cGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlJlY3VycmVuY2VWYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBhcmVudElEICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBhbiBvY2N1cnJlbmNlIG9mIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50LiIpIHwgaHRtbCAlXTxicj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJFZGl0UGFyZW50Ij5bJSBUcmFuc2xhdGUoIkNsaWNrIGhlcmUgdG8gZWRpdCB0aGUgcGFyZW50IGFwcG9pbnRtZW50LiIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9kaXY+ClslIEVMU0UgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5SZWN1cnJlbmNlVHlwZVN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJGcmVxdWVuY3kiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRXZlcnkiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VJbnRlcnZhbFN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRleHREYXkgSGlkZGVuIj5bJSBUcmFuc2xhdGUoImRheShzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRleHRXZWVrIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJ3ZWVrKHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dE1vbnRoIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJtb250aChzKSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRleHRZZWFyIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJ5ZWFyKHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJEYXlzIiBuYW1lPSJEYXlzIiB2YWx1ZT0iWyUgRGF0YS5EYXlzICVdIiAvPgoKIyBXZWVrbHkgdGFibGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkJ1dHRvblRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iMSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW9uZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTW9uIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSIyIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUdWVzZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVHVlIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSIzIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJXZWRuZXNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJXZWQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRodXJzZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGh1IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI1IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGcmlkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJGcmkiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjYiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNhdHVyZGF5IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2F0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSI3IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdW5kYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KIyBXZWVrbHkgdGFibGUgZW5kCgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJNb250aERheXMiIG5hbWU9Ik1vbnRoRGF5cyIgdmFsdWU9IlslIERhdGEuTW9udGhEYXlzICVdIiAvPgoKIyBNb250aGx5IHRhYmxlIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJCdXR0b25UYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgQ291bnQgPSAxICVdClslIFdISUxFIENvdW50IDwgMzIgJV0KWyUgSUYgQ291bnQgJSA3ID09IDEgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgRU5EICVdCgojIGpvaW4gc3RyaW5ncyAoTW9udGhseTEsIE1vbnRobHkyLC4uLikKWyUgTW9udGhseUNvdW50ID0gIk1vbnRobHkiIF8gQ291bnQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlslIENvdW50ICVdIiB0aXRsZT0iWyUgQ291bnQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgQ291bnQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgSUYgQ291bnQgJSA3ID09IDAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIEVORCAlXQoKWyUgQ291bnQgPSBDb3VudCArIDEgJV0KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KIyBNb250aGx5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk9uIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJNb250aHMiIG5hbWU9Ik1vbnRocyIgdmFsdWU9IlslIERhdGEuTW9udGhzICVdIiAvPgoKIyBZZWFybHkgdGFibGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkJ1dHRvblRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJKYW51YXJ5IikgfCBodG1sICVdIiB2YWx1ZT0iMSIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJKYW4iKXwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBodG1sICVdIiB2YWx1ZT0iMyIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IGh0bWwgJV0iIHZhbHVlPSI0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWF5X2xvbmciKSB8IGh0bWwgJV0iIHZhbHVlPSI1IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJKdW5lIikgfCBodG1sICVdIiB2YWx1ZT0iNiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJKdW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVseSIpIHwgaHRtbCAlXSIgdmFsdWU9IjciID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1Z3VzdCIpIHwgaHRtbCAlXSIgdmFsdWU9IjgiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IGh0bWwgJV0iIHZhbHVlPSI5IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTAiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlY2VtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgWWVhcmx5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VMaW1pdERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VMaW1pdFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZVVudGlsRGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VVbnRpbFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZUNvdW50RGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUmVjdXJyZW5jZUNvdW50IiBuYW1lPSJSZWN1cnJlbmNlQ291bnQiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgoKICAgICAgICAgICAgPGxhYmVsIGZvcj0iTm90aWZpY2F0aW9uVGVtcGxhdGUiPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTm90aWZpY2F0aW9uVGVtcGxhdGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLk5vdGlmaWNhdGlvblZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25TdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYiPgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiPlslIFRyYW5zbGF0ZSgiUmVsYXRpdmUgcG9pbnQgb2YgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiIHZhbHVlPSIiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpbyAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgdmFsdWU9IlslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICA8L2ZpZWxkc2V0PgoKWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBLZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1wbHVnaW4ta2V5PSJbJSBLZXkgfCBodG1sICVdIiBkYXRhLXBsdWdpbi11cmw9IlslIERhdGEuUGx1Z2luTGlzdC4kS2V5LlBsdWdpblVSTCB8IGh0bWwgJV0iIGNsYXNzPSJQbHVnaW5GaWVsZCBXNzVwYyIgLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJQbHVnaW5fWyUgS2V5IHwgaHRtbCAlXSIgbmFtZT0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIHZhbHVlPSdbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5MaW5rTGlzdCB8fCAiW10iICVdJyAvPgpbJSBFTFNFICVdClslIElGIERhdGEuUGx1Z2luRGF0YS4kS2V5LnNpemUgPT0gMCAlXQogICAgICAgICAgICAgICAgPHAgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPi08L3A+ClslIEVORCAlXQpbJSBFTkQgJV0KIyBrZWVwIGZvbGxvd2luZyBibG9jayBvbiBhIHNpbmdsZSBsaW5lLCBzbyA6ZW1wdHkgQ1NTIHNlbGVjdG9yIHdvdWxkIHdvcmshCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJQbHVnaW5Db250YWluZXJfWyUgS2V5IHwgaHRtbCAlXSJbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdIGNsYXNzPSJQbHVnaW5Db250YWluZXIiWyUgRU5EICVdPlslIEZPUkVBQ0ggTGluayBJTiBEYXRhLlBsdWdpbkRhdGEuJEtleSAlXTxkaXYgY2xhc3M9IkxpbmtfWyUgTGluay5MaW5rSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iWyUgTGluay5MaW5rVVJMICVdIj5bJSBMaW5rLkxpbmtOYW1lIHwgaHRtbCAlXTwvYT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgZGF0YS1wbHVnaW4ta2V5PSJbJSBLZXkgfCBodG1sICVdIiBkYXRhLWxpbmstaWQ9IlslIExpbmsuTGlua0lEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPlslIEVORCAlXQogICAgICAgICAgICAgICAgPC9kaXY+WyUgRU5EICVdPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIEVORCAlXQogICAgICAgIDwvZmllbGRzZXQ+ClslIEVORCAlXQogICAgPC9mb3JtPgo8L2Rpdj4KCjxkaXYgY2xhc3M9IkNvbnRlbnRGb290ZXIgQ2VudGVyIj4KWyUgSUYgIURhdGEuUGVybWlzc2lvbkxldmVsIHx8IERhdGEuUGVybWlzc2lvbkxldmVsID4gMSAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1TdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNvcHkiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybURlbGV0ZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtQ2FuY2VsIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpDb3JlLkZvcm0uVmFsaWRhdGUuSW5pdCgpOwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTG9jYXRpb25MaW5rSW5pdCgkKCcjTG9jYXRpb24nKSwgJCgnLkxvY2F0aW9uTGluaycpKTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkFsbERheUluaXQoJCgnI0FsbERheScpKTsKQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlJlY3VycmluZ0luaXQoewogICAgJFJlY3VycmluZzogJCgnI1JlY3VycmluZycpLAogICAgJFJlY3VycmVuY2VUeXBlOiAkKCcjUmVjdXJyZW5jZVR5cGUnKSwKICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZTogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdicpLAogICAgJFJlY3VycmVuY2VJbnRlcnZhbFRleHQ6ICQoJyNSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0JyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYnKSwKICAgICRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2JyksCiAgICAkUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYnKSwKICAgICRSZWN1cnJlbmNlTGltaXREaXY6ICQoJyNSZWN1cnJlbmNlTGltaXREaXYnKSwKICAgICRSZWN1cnJlbmNlTGltaXQ6ICQoJyNSZWN1cnJlbmNlTGltaXQnKSwKICAgICRSZWN1cnJlbmNlVW50aWxEaXY6ICQoJyNSZWN1cnJlbmNlVW50aWxEaXYnKSwKICAgICRSZWN1cnJlbmNlVW50aWxEYXk6ICQoJyNSZWN1cnJlbmNlVW50aWxEYXknKSwKICAgICRSZWN1cnJlbmNlQ291bnREaXY6ICQoJyNSZWN1cnJlbmNlQ291bnREaXYnKQp9KTsKCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5Ob3RpZmljYXRpb25Jbml0KHsKICAgICROb3RpZmljYXRpb25UZW1wbGF0ZTogJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0JyksCiAgICAkTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUnKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXknKSwKICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aCcpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91cjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91cicpLAogICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGUnKQp9KTsKCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5UZWFtSW5pdCgkKCcjVGVhbUlEJyksICQoJyNSZXNvdXJjZUlEJyksICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLCAkKCdsYWJlbFtmb3I9IlRlYW1JRCJdICsgZGl2LkZpZWxkIHAuUmVhZE9ubHlWYWx1ZScpLCAkKCdsYWJlbFtmb3I9IlJlc291cmNlSUQiXSArIGRpdi5GaWVsZCBwLlJlYWRPbmx5VmFsdWUnKSk7ClslIElGICFEYXRhLlBlcm1pc3Npb25MZXZlbCBPUiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+IDEgJV0KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlBsdWdpbkluaXQoJCgnLlBsdWdpbkZpZWxkJyksICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpKTsKWyUgRU5EICVdCgpDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKSwgZnVuY3Rpb24gKEZvcm0pIHsKICAgIHZhciBEYXRhID0gbmV3IE9iamVjdCgpLAogICAgICAgIERheXMgPSBuZXcgQXJyYXkoKSwKICAgICAgICBNb250aERheXMgPSBuZXcgQXJyYXkoKSwKICAgICAgICBNb250aHMgPSBuZXcgQXJyYXkoKTsKCiAgICAvLyBzZXJpYWxpemUgZGF5cwogICAgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICBEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICB9KTsKICAgICQoImlucHV0I0RheXMiKS52YWwoRGF5cy5qb2luKCkpOwoKICAgIC8vIHNlcmlhbGl6ZSBtb250aCBkYXlzCiAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICBNb250aERheXMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgIH0pOwogICAgJCgiaW5wdXQjTW9udGhEYXlzIikudmFsKE1vbnRoRGF5cy5qb2luKCkpOwoKICAgIC8vIHNlcmlhbGl6ZSBtb250aHMKICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgTW9udGhzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICB9KTsKICAgICQoImlucHV0I01vbnRocyIpLnZhbChNb250aHMuam9pbigpKTsKCiAgICAkKEZvcm0pLmZpbmQoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKEluZGV4LCBFbGVtZW50KSB7CiAgICAgICAgaWYgKEVsZW1lbnQudHlwZSA9PSAnY2hlY2tib3gnKSB7CiAgICAgICAgICAgIERhdGFbRWxlbWVudC5pZF0gPSAkKEVsZW1lbnQpLnByb3AoJ2NoZWNrZWQnKSA/ICcxJyA6ICcwJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBEYXRhW0VsZW1lbnQuaWRdID0gJChFbGVtZW50KS52YWwoKTsKICAgICAgICB9CiAgICB9KTsKCiAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5FZGl0QXBwb2ludG1lbnQoRGF0YSk7Cn0pOwoKCiQoIi5CdXR0b25UYWJsZSBidXR0b24iKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKICAgICQodGhpcykudG9nZ2xlQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwp9KTsKCi8vIER1cGxpY2F0ZSBhcHBvaW50bWVudAokKCcjRWRpdEZvcm1Db3B5Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAvLyBSZXNldCBBcHBvaW50bWVudElELCByZW1vdmUgQ29weSAmIERlbGV0ZSBidXR0b25zCiAgICAkKCIjRWRpdEFwcG9pbnRtZW50Rm9ybSBpbnB1dCNBcHBvaW50bWVudElEIikudmFsKCIiKTsKICAgICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJykuc3VibWl0KCk7Cn0pOwoKLy8gU2F2ZSB0aGUgYXBwb2ludG1lbnQKJCgnI0VkaXRGb3JtU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLnN1Ym1pdCgpOwp9KTsKClslIElGIERhdGEuQXBwb2ludG1lbnRJRCAlXQoKLy8gRGVsZXRlIHRoZSBhcHBvaW50bWVudAokKCcjRWRpdEZvcm1EZWxldGUnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgIGlmICh3aW5kb3cuY29uZmlybShbJSBUcmFuc2xhdGUoIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4iKSB8IEpTT04gJV0pKSB7CiAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkVkaXRBcHBvaW50bWVudCh7CiAgICAgICAgICAgIENhbGVuZGFySUQ6IFslIERhdGEuQ2FsZW5kYXJJRCB8IEpTT04gJV0sCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IFslIERhdGEuQXBwb2ludG1lbnRJRCB8IEpTT04gJV0sCiAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgU3ViYWN0aW9uOiAnRGVsZXRlQXBwb2ludG1lbnQnCiAgICAgICAgfSk7CiAgICB9Cn0pOwoKWyUgRU5EICVdCgpbJSBJRiBEYXRhLlBhcmVudElEICVdCgovLyBFZGl0IHBhcmVudCBhcHBvaW50bWVudAokKCcjRWRpdFBhcmVudCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgdmFyIERhdGEgPSB7CiAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICBTdWJhY3Rpb246ICdFZGl0TWFzaycsCiAgICAgICAgQXBwb2ludG1lbnRJRDogWyUgRGF0YS5QYXJlbnRJRCB8IEpTT04gJV0KICAgIH07CgogICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgRGF0YSwKICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhIVE1MLCBbJSBUcmFuc2xhdGUoIkFwcG9pbnRtZW50IikgfCBKU09OICVdLCAnMTBweCcsICdDZW50ZXInLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpOwogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICB9LCAnaHRtbCcKICAgICk7Cn0pOwoKWyUgRU5EICVdCgovLyBDbG9zZSB0aGUgZGlhbG9nCiQoJyNFZGl0Rm9ybUNhbmNlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwp9KTsKClslIEluc2VydFRlbXBsYXRlKCJEYXRlcGlja2VyLnR0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRhdGVwaWNrZXJJbml0IikgJV0KQ29yZS5VSS5EYXRlcGlja2VyLkluaXQoewogICAgRGF5OiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFslIERhdGEuUHJlZml4IHwgSlNPTiAlXSkgKyAiRGF5IiksCiAgICBNb250aDogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIk1vbnRoIiksCiAgICBZZWFyOiAkKCIjIiArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFslIERhdGEuUHJlZml4IHwgSlNPTiAlXSkgKyAiWWVhciIpLAogICAgSG91cjogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIkhvdXIiKSwKICAgIE1pbnV0ZTogJCgiIyIgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihbJSBEYXRhLlByZWZpeCB8IEpTT04gJV0pICsgIk1pbnV0ZSIpLAogICAgV2Vla0RheVN0YXJ0OiBbJSBEYXRhLldlZWtEYXlTdGFydCB8IEpTT04gJV0KfSk7ClslIFJlbmRlckJsb2NrRW5kKCJEYXRlcGlja2VySW5pdCIpICVdCgovL11dPjwvc2NyaXB0PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIkVkaXRNYXNrIikgJV0KClslIFJlbmRlckJsb2NrRW5kKCJFZGl0TWFzayIpICVdCjxwPlRlc3Q8L3A+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6QXBwb2ludG1lbnRDYWxlbmRhcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWcgTmFtZSBVc2VySUQpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJE5lZWRlZCEiIGlmICggISRTZWxmLT57JE5lZWRlZH0gKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjdXJyZW50IGZpbHRlcgogICAgbXkgJE5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKSB8fCAnJzsKICAgIG15ICRQcmVmZXJlbmNlc0tleSA9ICdEYXNoYm9hcmRDYWxlbmRhckFwcG9pbnRtZW50RmlsdGVyJyAuICRTZWxmLT57TmFtZX07CiAgICBpZiAoICRTZWxmLT57TmFtZX0gZXEgJE5hbWUgKSB7CiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHJlbWVtYmVyIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gKSB7CgogICAgICAgICMgdXBkYXRlIHNlc3Npb24KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJFByZWZlcmVuY2VzS2V5LAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdEZW1vU3lzdGVtJykgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkUHJlZmVyZW5jZXNLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFNlbGYtPntGaWx0ZXJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGZpbHRlciBpZiBub3Qgc2V0IHlldAogICAgaWYgKCAhJFNlbGYtPntGaWx0ZXJ9ICkgewogICAgICAgICRTZWxmLT57RmlsdGVyfSA9ICRTZWxmLT57JFByZWZlcmVuY2VzS2V5fSB8fCAkU2VsZi0+e0NvbmZpZ30tPntGaWx0ZXJ9IHx8ICdUb2RheSc7CiAgICB9CgogICAgIyBzZXR1cCB0aGUgcHJlZnJlbmNlcyBrZXlzCiAgICAkU2VsZi0+e1ByZWZLZXlTaG93bn0gICA9ICdBcHBvaW50bWVudERhc2hib2FyZFByZWYnIC4gJFNlbGYtPntOYW1lfSAuICctU2hvd24nOwogICAgJFNlbGYtPntQcmVmS2V5UmVmcmVzaH0gPSAnQXBwb2ludG1lbnREYXNoYm9hcmRQcmVmJyAuICRTZWxmLT57TmFtZX0gLiAnLVJlZnJlc2gnOwoKICAgICRTZWxmLT57UGFnZVNob3dufSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+eyAkU2VsZi0+e1ByZWZLZXlTaG93bn0gfQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+e0xpbWl0fSB8fCAxMDsKCiAgICAkU2VsZi0+e1BhZ2VSZWZyZXNofSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+eyAkU2VsZi0+e1ByZWZLZXlSZWZyZXNofSB9CiAgICAgICAgfHwgMTsKCiAgICAkU2VsZi0+e1N0YXJ0SGl0fSA9IGludCggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N0YXJ0SGl0JyApIHx8IDEgKTsKCiAgICAkU2VsZi0+e0NhY2hlS2V5fSA9ICRTZWxmLT57TmFtZX0gLiAnOjonOwoKICAgICMgZ2V0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmdWxsIG5hbWUgb3JkZXIgZm9yIHVzZXIgbmFtZXMKICAgICMgYW5kIGFwcGVuZCBpdCB0byB0aGUgY2FjaGUga2V5IHRvIG1ha2Ugc3VyZSwgdGhhdCB0aGUKICAgICMgY29ycmVjdCBkYXRhIHdpbGwgYmUgZGlzcGxheWVkIGV2ZXJ5IHRpbWUKICAgIG15ICRGaXJzdG5hbWVMYXN0TmFtZU9yZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdGaXJzdG5hbWVMYXN0bmFtZU9yZGVyJykgfHwgMDsKICAgICRTZWxmLT57Q2FjaGVLZXl9IC49ICc6OicgLiAkRmlyc3RuYW1lTGFzdE5hbWVPcmRlcjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBQYXJhbXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBEZXNjICA9PiBUcmFuc2xhdGFibGUoJ1Nob3duJyksCiAgICAgICAgICAgIE5hbWUgID0+ICRTZWxmLT57UHJlZktleVNob3dufSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIDUgID0+ICcgNScsCiAgICAgICAgICAgICAgICAxMCA9PiAnMTAnLAogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgICAgIDIwID0+ICcyMCcsCiAgICAgICAgICAgICAgICAyNSA9PiAnMjUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZi0+e1BhZ2VTaG93bn0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIERlc2MgID0+IFRyYW5zbGF0YWJsZSgnUmVmcmVzaCAobWludXRlcyknKSwKICAgICAgICAgICAgTmFtZSAgPT4gJFNlbGYtPntQcmVmS2V5UmVmcmVzaH0sCiAgICAgICAgICAgIEJsb2NrID0+ICdPcHRpb24nLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAwICA9PiBUcmFuc2xhdGFibGUoJ29mZicpLAogICAgICAgICAgICAgICAgMSAgPT4gJzEnLAogICAgICAgICAgICAgICAgMiAgPT4gJzInLAogICAgICAgICAgICAgICAgNSAgPT4gJzUnLAogICAgICAgICAgICAgICAgNyAgPT4gJzcnLAogICAgICAgICAgICAgICAgMTAgPT4gJzEwJywKICAgICAgICAgICAgICAgIDE1ID0+ICcxNScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZWxmLT57UGFnZVJlZnJlc2h9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBAUGFyYW1zOwp9CgpzdWIgQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICgKICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKCiAgICAgICAgQ2FuUmVmcmVzaCA9PiAxLAoKICAgICAgICAjIHJlbWVtYmVyLCBkbyBub3QgYWxsb3cgdG8gdXNlIHBhZ2UgY2FjaGUKICAgICAgICAjIChpdCdzIG5vdCB3b3JraW5nIGJlY2F1c2Ugb2YgaW50ZXJuYWwgZmlsdGVyKQogICAgICAgIENhY2hlS2V5ID0+IHVuZGVmLAogICAgICAgIENhY2hlVFRMID0+IHVuZGVmLAogICAgKTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBzZXR0aW5ncwogICAgbXkgJElkbGVNaW51dGVzID0gJFNlbGYtPntDb25maWd9LT57SWRsZU1pbnV0ZXN9IHx8IDYwOwogICAgbXkgJFNvcnRCeSAgICAgID0gJFNlbGYtPntDb25maWd9LT57U29ydEJ5fSAgICAgIHx8ICdVc2VyRnVsbG5hbWUnOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhdCBsZWFzdCByZWFkYWJsZSBjYWxlbmRhcnMKICAgIG15IEBDYWxlbmRhckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgIyBjb2xsZWN0IGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudCBkYXRhCiAgICAjIHNlcGFyYXRlIGFwcG9pbnRtZW50cyB0byB0b2RheSwgdG9tb3Jyb3cKICAgICMgYW5kIHRoZSBuZXh0IGZpdmUgZGF5cyAoc29vbikKICAgIG15ICVDYWxlbmRhcnM7CiAgICBteSAlQXBwb2ludG1lbnRzOwogICAgbXkgJUFwcG9pbnRtZW50c0NvdW50OwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleUNhbGVuZGFycyAgICAgICAgID0gJFNlbGYtPntDYWNoZUtleX0gLiAkU2VsZi0+e1VzZXJJRH0gLiAnOjpDYWxlbmRhcnMnOwogICAgbXkgJENhY2hlS2V5QXBwb2ludG1lbnRzICAgICAgPSAkU2VsZi0+e0NhY2hlS2V5fSAuICRTZWxmLT57VXNlcklEfSAuICc6OkFwcG9pbnRtZW50czo6JyAuICRTZWxmLT57RmlsdGVyfTsKICAgIG15ICRDYWNoZUtleUFwcG9pbnRtZW50c0NvdW50ID0gJFNlbGYtPntDYWNoZUtleX0gLiAkU2VsZi0+e1VzZXJJRH0gLiAnOjpBcHBvaW50bWVudHNDb3VudCc7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgY2FjaGVkIGRhdGEKICAgIG15ICREYXRhQ2FsZW5kYXJzID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnRGFzaGJvYXJkJywKICAgICAgICBLZXkgID0+ICRDYWNoZUtleUNhbGVuZGFycywKICAgICk7CiAgICBteSAkRGF0YUFwcG9pbnRtZW50cyA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHMsCiAgICApOwogICAgbXkgJERhdGFBcHBvaW50bWVudHNDb3VudCA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHNDb3VudCwKICAgICk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIGNhY2hlIGlzIHVwLXRvLWRhdGUsIHVzZSB0aGUgZ2l2ZW4gZGF0YQogICAgaWYgKAogICAgICAgIHJlZiAkRGF0YUNhbGVuZGFycyBlcSAnSEFTSCcKICAgICAgICAmJiByZWYgJERhdGFBcHBvaW50bWVudHMgZXEgJ0hBU0gnCiAgICAgICAgJiYgcmVmICREYXRhQXBwb2ludG1lbnRzQ291bnQgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICVDYWxlbmRhcnMgICAgICAgICA9ICV7JERhdGFDYWxlbmRhcnN9OwogICAgICAgICVBcHBvaW50bWVudHMgICAgICA9ICV7JERhdGFBcHBvaW50bWVudHN9OwogICAgICAgICVBcHBvaW50bWVudHNDb3VudCA9ICV7JERhdGFBcHBvaW50bWVudHNDb3VudH07CiAgICB9CgogICAgIyBjb2xsZWN0IHRoZSBkYXRhIGFnYWluIGlmIG5lY2Vzc2FyeQogICAgZWxzZSB7CgogICAgICAgIENBTEVOREFSOgogICAgICAgIGZvciBteSAkQ2FsZW5kYXIgKEBDYWxlbmRhckxpc3QpIHsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVIgaWYgISRDYWxlbmRhcjsKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJENhbGVuZGFyKTsKICAgICAgICAgICAgbmV4dCBDQUxFTkRBUiBpZiAkQ2FsZW5kYXJzeyAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSB9OwoKICAgICAgICAgICAgJENhbGVuZGFyc3sgJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0gfSA9ICRDYWxlbmRhcjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlIGZvciBjYWxlbmRhcnMKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Rhc2hib2FyZCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleUNhbGVuZGFycywKICAgICAgICAgICAgVmFsdWUgPT4gXCVDYWxlbmRhcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0NhY2hlVFRMTG9jYWx9ICogNjAsCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIGNhbGVuZGFyIGFwcG9pbnRtZW50cwogICAgICAgIG15ICVBcHBvaW50bWVudHNVbnNvcnRlZDsKCiAgICAgICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgICAgIENBTEVOREFSSUQ6CiAgICAgICAgZm9yIG15ICRDYWxlbmRhcklEICggc29ydCBrZXlzICVDYWxlbmRhcnMgKSB7CgogICAgICAgICAgICBuZXh0IENBTEVOREFSSUQgaWYgISRDYWxlbmRhcklEOwoKICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50VGltZXN0YW1wR2V0KCksCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0FMRU5EQVJJRCBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQEFwcG9pbnRtZW50cyApOwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKCiAgICAgICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5UIGlmICEkQXBwb2ludG1lbnQ7CiAgICAgICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkQXBwb2ludG1lbnQpOwoKICAgICAgICAgICAgICAgICMgc2F2ZSBzeXN0ZW0gdGltZSBvZiBTdGFydFRpbWUKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1N5c3RlbVRpbWVTdGFydH0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2F2ZSBhcHBvaW50bWVudCBpbiBuZXcgaGFzaCBmb3IgbGF0ZXIgc29ydGluZwogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c1Vuc29ydGVkeyAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSB9ID0gJEFwcG9pbnRtZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkYXRldGltZSBzdHJpbmdzIGZvciB0aGUgZGF0ZXMgd2l0aCByZWxhdGVkIG9mZnNldHMKICAgICAgICAjICh0b2RheSwgdG9tb3Jyb3cgYW5kIHNvb24gLSB3aGljaCBtZWFucyB0aGUgbmV4dCA1IGRheXMKICAgICAgICAjIGV4Y2VwdCB0b2RheSBhbmQgdG9tb3Jyb3cgY291bnRlZCBmcm9tIGN1cnJlbnQgdGltZXN0YW1wKQogICAgICAgIG15ICVEYXRlT2Zmc2V0ID0gKAogICAgICAgICAgICBUb2RheSAgICAgPT4gMCwKICAgICAgICAgICAgVG9tb3Jyb3cgID0+IDg2NDAwLAogICAgICAgICAgICBQbHVzVHdvICAgPT4gMTcyODAwLAogICAgICAgICAgICBQbHVzVGhyZWUgPT4gMjU5MjAwLAogICAgICAgICAgICBQbHVzRm91ciAgPT4gMzQ1NjAwLAogICAgICAgICk7CgogICAgICAgIG15ICVEYXRlczsKCiAgICAgICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgICAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CgogICAgICAgIGZvciBteSAkRGF0ZU9mZnNldEtleSAoIHNvcnQga2V5cyAlRGF0ZU9mZnNldCApIHsKCiAgICAgICAgICAgICMgZ2V0IGRhdGUgdW5pdHMgd2l0aCBjdXJyZW50IG9mZnNldAogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRDdXJyZW50U3lzdGVtVGltZSArICREYXRlT2Zmc2V0eyREYXRlT2Zmc2V0S2V5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICREYXRlc3skRGF0ZU9mZnNldEtleX0KICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwMmQiLCAkWWVhciApIC4gJy0nIC4gc3ByaW50ZiggIiUwMmQiLCAkTW9udGggKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJERheSApOwogICAgICAgIH0KCiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSAgICA9IDA7CiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvbW9ycm93fSA9IDA7CiAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1Nvb259ICAgICA9IDA7CgogICAgICAgIEFQUE9JTlRNRU5USUQ6CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICggc29ydCBrZXlzICVBcHBvaW50bWVudHNVbnNvcnRlZCApIHsKCiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhJEFwcG9pbnRtZW50SUQ7CiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRBcHBvaW50bWVudHNVbnNvcnRlZHskQXBwb2ludG1lbnRJRH0gKTsKICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVElEIGlmICEkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9LT57U3RhcnRUaW1lfTsKCiAgICAgICAgICAgICMgZXh0cmFjdCBjdXJyZW50IGRhdGUgKHdpdGhvdXQgdGltZSkKICAgICAgICAgICAgbXkgJFN0YXJ0RGF0ZVN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISRTdGFydERhdGVTeXN0ZW1UaW1lOwoKICAgICAgICAgICAgbXkgKCAkQ1NlY29uZCwgJENNaW51dGUsICRDSG91ciwgJENEYXksICRDTW9udGgsICRDWWVhciwgJENEYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0RGF0ZVN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3RhcnREYXRlCiAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDJkIiwgJENZZWFyICkgLiAnLScgLiBzcHJpbnRmKCAiJTAyZCIsICRDTW9udGggKSAuICctJyAuIHNwcmludGYoICIlMDJkIiwgJENEYXkgKTsKCiAgICAgICAgICAgICMgdG9kYXkKICAgICAgICAgICAgaWYgKCAkU3RhcnREYXRlIGVxICREYXRlc3tUb2RheX0gKSB7CgogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSsrOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntGaWx0ZXJ9IGVxICdUb2RheScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRzVW5zb3J0ZWR7JEFwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvbW9ycm93CiAgICAgICAgICAgIGVsc2lmICggJFN0YXJ0RGF0ZSBlcSAkRGF0ZXN7VG9tb3Jyb3d9ICkgewoKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHNDb3VudHtUb21vcnJvd30rKzsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RmlsdGVyfSBlcSAnVG9tb3Jyb3cnICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzb29uCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRTdGFydERhdGUgZXEgJERhdGVze1BsdXNUd299CiAgICAgICAgICAgICAgICB8fCAkU3RhcnREYXRlIGVxICREYXRlc3tQbHVzVGhyZWV9CiAgICAgICAgICAgICAgICB8fCAkU3RhcnREYXRlIGVxICREYXRlc3tQbHVzRm91cn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50c0NvdW50e1Nvb259Kys7CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0ZpbHRlcn0gZXEgJ1Nvb24nICkgewogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50c1Vuc29ydGVkeyRBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUgZm9yIGFwcG9pbnRtZW50cwogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRGFzaGJvYXJkJywKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5QXBwb2ludG1lbnRzLAogICAgICAgICAgICBWYWx1ZSA9PiBcJUFwcG9pbnRtZW50cywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwoKICAgICAgICAjIHNldCBjYWNoZSBmb3IgYXBwb2ludG1lbnRzIGNvdW50CiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdEYXNoYm9hcmQnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXlBcHBvaW50bWVudHNDb3VudCwKICAgICAgICAgICAgVmFsdWUgPT4gXCVBcHBvaW50bWVudHNDb3VudCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDb25maWd9LT57Q2FjaGVUVExMb2NhbH0gKiA2MCwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJEFwcG9pbnRtZW50VGFibGVCbG9jayA9ICdDb250ZW50U21hbGxUYWJsZSc7CgogICAgIyBwcmVwYXJlIGFwcG9pbnRtZW50cyB0YWJsZQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ29udGVudFNtYWxsVGFibGUnLAogICAgKTsKCiAgICAjIGdldCB0aW1lem9uZSBvZmZzZXQgZm9yIGN1cnJlbnQgdXNlcgogICAgbXkgJFRpbWV6b25lT2Zmc2V0UmF3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICRUaW1lem9uZU9mZnNldCA9ICRUaW1lem9uZU9mZnNldFJhdyAqIDYwICogNjA7CgogICAgbXkgJENvdW50ID0gMDsKICAgIG15ICRTaG93biA9IDA7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoCiAgICAgICAgc29ydCB7CiAgICAgICAgICAgICRBcHBvaW50bWVudHN7JGF9LT57U3lzdGVtVGltZVN0YXJ0fSA8PT4gJEFwcG9pbnRtZW50c3skYn0tPntTeXN0ZW1UaW1lU3RhcnR9CiAgICAgICAgICAgICAgICB8fCAkQXBwb2ludG1lbnRzeyRhfS0+e0FwcG9pbnRtZW50SUR9IDw9PiAkQXBwb2ludG1lbnRzeyRifS0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgfSBrZXlzICVBcHBvaW50bWVudHMKICAgICAgICApCiAgICB7CiAgICAgICAgIyBwYWdpbmF0aW9uIGhhbmRsaW5nCiAgICAgICAgbGFzdCBBUFBPSU5UTUVOVElEIGlmICRTaG93biA+PSAkU2VsZi0+e1BhZ2VTaG93bn07CgogICAgICAgIGlmICggKCAkU2VsZi0+e1N0YXJ0SGl0fSAtIDEgKSA+ICRDb3VudCApIHsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgIG5leHQgQVBQT0lOVE1FTlRJRDsKICAgICAgICB9CgogICAgICAgIG15ICRTdGFydFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgKCAkQVNlY29uZCwgJEFNaW51dGUsICRBSG91ciwgJEFEYXksICRBTW9udGgsICRBWWVhciwgJEFEYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRTeXN0ZW1UaW1lICsgJFRpbWV6b25lT2Zmc2V0LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBkYXRlcyBhbmQgdGltZXMKICAgICAgICBteSAkU3RhcnRUaW1lID0gc3ByaW50ZiggIiUwMmQiLCAkQUhvdXIgKSAuICc6JyAuIHNwcmludGYoICIlMDJkIiwgJEFNaW51dGUgKTsKICAgICAgICBteSAkU3RhcnRUaW1lTG9uZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e1N0YXJ0VGltZX0sICdEYXRlRm9ybWF0TG9uZycgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICRBcHBvaW50bWVudHN7JEFwcG9pbnRtZW50SUR9LT57VGl0bGV9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lTG9uZyA9PiAkU3RhcnRUaW1lTG9uZywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICAgPT4gJENhbGVuZGFyc3sgJEFwcG9pbnRtZW50c3skQXBwb2ludG1lbnRJRH0tPntDYWxlbmRhcklEfSB9LT57Q29sb3J9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJOYW1lICA9PiAkQ2FsZW5kYXJzeyAkQXBwb2ludG1lbnRzeyRBcHBvaW50bWVudElEfS0+e0NhbGVuZGFySUR9IH0tPntDYWxlbmRhck5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgaW5jcmVhc2Ugc2hvd24gaXRlbSBjb3VudAogICAgICAgICRTaG93bisrOwogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUFwcG9pbnRtZW50cyApICkgewoKICAgICAgICAjIHNob3cgdXAgbWVzc2FnZSBmb3Igbm8gYXBwb2ludG1lbnRzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50Tm9uZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjc3MgY2xhc3MKICAgIG15ICVTdW1tYXJ5OwogICAgJFN1bW1hcnl7ICRTZWxmLT57RmlsdGVyfSAuICc6OlNlbGVjdGVkJyB9ID0gJ1NlbGVjdGVkJzsKCiAgICAjIGZpbHRlciBiYXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NvbnRlbnRTbWFsbEFwcG9pbnRtZW50RmlsdGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXsgJFNlbGYtPntDb25maWd9IH0sCiAgICAgICAgICAgICVTdW1tYXJ5LAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgIFRvZGF5Q291bnQgICAgPT4gJEFwcG9pbnRtZW50c0NvdW50e1RvZGF5fSwKICAgICAgICAgICAgVG9tb3Jyb3dDb3VudCA9PiAkQXBwb2ludG1lbnRzQ291bnR7VG9tb3Jyb3d9LAogICAgICAgICAgICBTb29uQ291bnQgICAgID0+ICRBcHBvaW50bWVudHNDb3VudHtTb29ufSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGFkZCBwYWdlIG5hdiBiYXIKICAgIG15ICRUb3RhbCAgICA9ICRBcHBvaW50bWVudHNDb3VudHsgJFNlbGYtPntGaWx0ZXJ9IH0gfHwgMDsKICAgIG15ICRMaW5rUGFnZSA9ICdTdWJhY3Rpb249RWxlbWVudDtOYW1lPScgLiAkU2VsZi0+e05hbWV9IC4gJztGaWx0ZXI9JyAuICRTZWxmLT57RmlsdGVyfSAuICc7JzsKICAgIG15ICVQYWdlTmF2ICA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgU3RhcnRIaXQgICAgICAgPT4gJFNlbGYtPntTdGFydEhpdH0sCiAgICAgICAgUGFnZVNob3duICAgICAgPT4gJFNlbGYtPntQYWdlU2hvd259LAogICAgICAgIEFsbEhpdHMgICAgICAgID0+ICRUb3RhbCB8fCAxLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICdBY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPntBY3Rpb259LAogICAgICAgIExpbmsgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICBXaW5kb3dTaXplICAgICA9PiA1LAogICAgICAgIEFKQVhSZXBsYWNlICAgID0+ICdEYXNoYm9hcmQnIC4gJFNlbGYtPntOYW1lfSwKICAgICAgICBJRFByZWZpeCAgICAgICA9PiAnRGFzaGJvYXJkJyAuICRTZWxmLT57TmFtZX0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICV7ICRTZWxmLT57Q29uZmlnfSB9LAogICAgICAgICAgICBOYW1lID0+ICRTZWxmLT57TmFtZX0sCiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIHJlZnJlc2ggdGltZQogICAgbXkgJFJlZnJlc2ggPSAkTGF5b3V0T2JqZWN0LT57ICRTZWxmLT57UHJlZktleVJlZnJlc2h9IH0gLy8gMTsKCiAgICBteSAkTmFtZUhUTUwgPSAkU2VsZi0+e05hbWV9OwogICAgJE5hbWVIVE1MID1+IHN7LX17X314bXNnOwoKICAgIG15ICRDb250ZW50ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnREYXNoYm9hcmRBcHBvaW50bWVudENhbGVuZGFyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ30gfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntOYW1lfSwKICAgICAgICAgICAgTmFtZUhUTUwgICAgPT4gJE5hbWVIVE1MLAogICAgICAgICAgICBSZWZyZXNoVGltZSA9PiAkUmVmcmVzaCAqIDYwLAogICAgICAgIH0sCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0FKQVh9LAogICAgKTsKCiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztTdWJhY3Rpb249QXBwb2ludG1lbnRDcmVhdGUiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIEZ1bGxzaXplIENlbnRlciI+CiAgICA8c3Bhbj4KICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT4KICAgICAgICBbJSBUcmFuc2xhdGUoIk5ldyBBcHBvaW50bWVudCIpIHwgaHRtbCAlXQogICAgPC9zcGFuPgo8L2E+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlciIpICVdCjxkaXYgY2xhc3M9IkRhc2hib2FyZEFjdGlvbnMiPgogICAgPHVsIGNsYXNzPSJBcHBvaW50bWVudEZpbHRlciBUYWIgQWN0aW9ucyI+CiAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLml0ZW0oIlRvZGF5OjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Ub2RheSIgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9kYXk6OlNlbGVjdGVkIikgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUb2RheSIpIHwgaHRtbCAlXSAoWyUgRGF0YS5Ub2RheUNvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuaXRlbSgiVG9tb3Jyb3c6OlNlbGVjdGVkIikgfCBodG1sICVdIj48YSBocmVmPSIjIiBpZD0iRGFzaGJvYXJkWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVRvbW9ycm93IiBjbGFzcz0iWyUgRGF0YS5pdGVtKCJUb21vcnJvdzo6U2VsZWN0ZWQiKSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvbW9ycm93IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlRvbW9ycm93IikgfCBodG1sICVdIChbJSBEYXRhLlRvbW9ycm93Q291bnQgfCBodG1sICVdKTwvYT48L2xpPgogICAgICAgIDxsaSBjbGFzcz0iWyUgRGF0YS5pdGVtKCJTb29uOjpTZWxlY3RlZCIpIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyIgaWQ9IkRhc2hib2FyZFslIERhdGEuTmFtZSB8IGh0bWwgJV1Tb29uIiBjbGFzcz0iWyUgRGF0YS5pdGVtKCJTb29uOjpTZWxlY3RlZCIpIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU29vbiIpIHwgaHRtbCAlXSAoWyUgVHJhbnNsYXRlKCI1IGRheXMiKSB8IGh0bWwgJV0pIj5bJSBUcmFuc2xhdGUoIlNvb24iKSB8IGh0bWwgJV0gKFslIERhdGEuU29vbkNvdW50IHwgaHRtbCAlXSk8L2E+PC9saT4KICAgIDwvdWw+CjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwoKICAgIC8vIGxvYWQgZmlsdGVyIGZvciB0b2RheQogICAgJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpICsgJ1RvZGF5JykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdO0ZpbHRlcj1Ub2RheScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAvLyBsb2FkIGZpbHRlciBmb3IgdG9tb3Jyb3cKICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdUb21vcnJvdycpLnVuYmluZCgnY2xpY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgQ29yZS5BSkFYLkNvbnRlbnRVcGRhdGUoJCgnI0Rhc2hib2FyZCcgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcignWyUgRGF0YS5OYW1lIHwgaHRtbCAlXScpKSwgJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FbGVtZW50O05hbWU9WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTtGaWx0ZXI9VG9tb3Jyb3cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgLy8gbG9hZCBmaWx0ZXIgZm9yIHNvb24KICAgICQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSArICdTb29uJykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICBDb3JlLkFKQVguQ29udGVudFVwZGF0ZSgkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykpLCAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVsZW1lbnQ7TmFtZT1bJSBEYXRhLk5hbWUgfCBodG1sICVdO0ZpbHRlcj1Tb29uJywgZnVuY3Rpb24gKCkgewogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXJOYXZCYXIiKSAlXQo8c3BhbiBjbGFzcz0iU3BhY2luZ1RvcCBQYWdpbmF0aW9uIj4KICAgIFslIERhdGEuU2l0ZU5hdkJhciAlXQo8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudEZpbHRlck5hdkJhciIpICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnRGaWx0ZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsVGFibGUiKSAlXQo8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICA8dGhlYWQ+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGggc3R5bGU9IndpZHRoOiAxNHB4OyI+PC90aD4KICAgICAgICAgICAgPHRoIHN0eWxlPSJ3aWR0aDogMTRweDsiPlslIFRyYW5zbGF0ZSgiU3RhcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgPC90cj4KICAgIDwvdGhlYWQ+CiAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93IikgJV0KICAgICAgICA8dHIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iRmxhZ3MgQ2VudGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiIHRpdGxlPSJbJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXTsgYm9yZGVyOiAxcHggc29saWQgI0JCQjsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsgYm94LXNpemluZzogYm9yZGVyLWJveDsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgdGl0bGU9IlslIERhdGEuU3RhcnRUaW1lTG9uZyB8IGh0bWwgJV0iPlslIERhdGEuU3RhcnRUaW1lIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgIDx0ZD48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD1bJSBEYXRhLkFwcG9pbnRtZW50SUQgfCB1cmwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPjwvdGQ+CiAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbEFwcG9pbnRtZW50Um93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29udGVudFNtYWxsQXBwb2ludG1lbnROb25lIikgJV0KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgibm9uZSIpIHwgaHRtbCAlXQogICAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJDb250ZW50U21hbGxBcHBvaW50bWVudE5vbmUiKSAlXQogICAgPC90Ym9keT4KPC90YWJsZT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbnRlbnRTbWFsbFRhYmxlIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgokKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKICAgIC8vIHByZXZlbnQgTWFzdGVyQWN0aW9uIG9uIER5bmFtaWMgRmllbGRzIGxpbmtzCiAgICBpZiAoJChFdmVudC50YXJnZXQpLmhhc0NsYXNzKCdEeW5hbWljRmllbGRMaW5rJykpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgaWYgKEV2ZW50LmN0cmxLZXkgfHwgRXZlbnQubWV0YUtleSkgewogICAgICAgICAgICB3aW5kb3cub3BlbigkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0pOwoKQ29yZS5Db25maWcuU2V0KCdSZWZyZXNoU2Vjb25kc19bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScsIHBhcnNlSW50KCJbJSBEYXRhLlJlZnJlc2hUaW1lIHwgaHRtbCAlXSIsIDEwKSB8fCAwKTsKaWYgKENvcmUuQ29uZmlnLkdldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSkgewogICAgQ29yZS5Db25maWcuU2V0KCdUaW1lcl9bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScsIHdpbmRvdy5zZXRUaW1lb3V0KAogICAgICAgIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnLWJveCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgIENvcmUuQUpBWC5Db250ZW50VXBkYXRlKCQoJyNEYXNoYm9hcmQnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoJ1slIERhdGEuTmFtZSB8IGh0bWwgJV0nKSksICdbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RWxlbWVudDtOYW1lPVslIERhdGEuTmFtZSB8IGh0bWwgJV0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCcjRGFzaGJvYXJkJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKCdbJSBEYXRhLk5hbWUgfCBodG1sICVdJykgKyAnLWJveCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbGVhclRpbWVvdXQoQ29yZS5Db25maWcuR2V0KCdUaW1lcl9bJSBEYXRhLk5hbWVIVE1MIHwgaHRtbCAlXScpKTsKICAgICAgICB9LAogICAgICAgIENvcmUuQ29uZmlnLkdldCgnUmVmcmVzaFNlY29uZHNfWyUgRGF0YS5OYW1lSFRNTCB8IGh0bWwgJV0nKSAqIDEwMDApCiAgICApOwp9CgovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIERpZ2VzdDo6TUQ1Owp1c2UgTUlNRTo6QmFzZTY0ICgpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIHZhcnMgcXcoQElTQSk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXIgLSBjYWxlbmRhciBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGNhbGVuZGFyIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgQElTQSA9IHF3KAogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIKICAgICk7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQXBwb2ludG1lbnRDYWxlbmRhcjo6RXZlbnRNb2R1bGVQb3N0JywKICAgICk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ0NhbGVuZGFyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ2FsZW5kYXJDcmVhdGUoKQoKY3JlYXRlcyBhIG5ldyBjYWxlbmRhciBmb3IgZ2l2ZW4gdXNlci4KCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgIENhbGVuZGFyTmFtZSAgICA9PiAnTWVldGluZ3MnLCAgICAgICAgICAjIChyZXF1aXJlZCkgUGVyc29uYWwgY2FsZW5kYXIgbmFtZQogICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgR3JvdXBJRAogICAgICAgIENvbG9yICAgICAgICAgICA9PiAnI0ZGNzcwMCcsICAgICAgICAgICAjIChyZXF1aXJlZCkgQ29sb3IgaW4gaGV4YWRlY2ltYWwgUkdCIG5vdGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnRzLCBhcnJheSByZWYgb2YgaGFzaGVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgPT4gWyAyIF0sCiAgICAgICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdUaGlzIGlzIGEgdGl0bGUnLAogICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCgogICAgICAgIFZhbGlkSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERlZmF1bHQgaXMgMS4KICAgICk7CgpyZXR1cm5zIENhbGVuZGFyIGhhc2ggaWYgc3VjY2Vzc2Z1bDoKICAgICVDYWxlbmRhciA9ICgKICAgICAgICBDYWxlbmRhcklEICAgPT4gMiwKICAgICAgICBHcm91cElEICAgICAgPT4gMywKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICBDcmVhdGVUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICA9PiA0LAogICAgICAgIENoYW5nZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgID0+IDQsCiAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICApOwoKRXZlbnRzOgogICAgQ2FsZW5kYXJDcmVhdGUKCj1jdXQKCnN1YiBDYWxlbmRhckNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJOYW1lIEdyb3VwSUQgQ29sb3IgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29sb3IKICAgIGlmICggISggJFBhcmFte0NvbG9yfSA9fiAvI1tBLUYwLTldezMsNn0vaSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29sb3IgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCB0aWNrZXQgYXBwb2ludG1lbnRzCiAgICBpZiAoICEoIHNjYWxhciBAeyAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSAvLyBbXSB9ICkgKSB7CiAgICAgICAgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSB1bmRlZjsKICAgIH0KCiAgICAjIG1ha2UgaXQgdXBwZXJjYXNlIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeQogICAgJFBhcmFte0NvbG9yfSA9IHVjICRQYXJhbXtDb2xvcn07CgogICAgbXkgJFZhbGlkSUQgPSBkZWZpbmVkICRQYXJhbXtWYWxpZElEfSA/ICRQYXJhbXtWYWxpZElEfSA6IDE7CgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgY2FsZW5kYXIgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIHJldHVybiBpZiAlQ2FsZW5kYXI7CgogICAgIyBjcmVhdGUgc2FsdCBzdHJpbmcKICAgIG15ICRTYWx0U3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoID0+IDY0LAogICAgKTsKCiAgICAjIHNlcmlhbGl6ZSBhbmQgZW5jb2RlIHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRzOwogICAgaWYgKCAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSApIHsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0b3JhYmxlJyktPlNlcmlhbGl6ZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSwKICAgICAgICApOwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlT3V0cHV0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgICAgICRUaWNrZXRBcHBvaW50bWVudHMgPSBNSU1FOjpCYXNlNjQ6OmVuY29kZV9iYXNlNjQoJFRpY2tldEFwcG9pbnRtZW50cyk7CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcgogICAgICAgICAgICAoZ3JvdXBfaWQsIG5hbWUsIHNhbHRfc3RyaW5nLCBjb2xvciwgdGlja2V0X2FwcG9pbnRtZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgdmFsaWRfaWQpCiAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8sID8pCiAgICAnOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0dyb3VwSUR9LCBcJFBhcmFte0NhbGVuZGFyTmFtZX0sIFwkU2FsdFN0cmluZywgXCRQYXJhbXtDb2xvcn0sCiAgICAgICAgICAgIFwkVGlja2V0QXBwb2ludG1lbnRzLCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRWYWxpZElECiAgICAgICAgXSwKICAgICk7CgogICAgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17Q2FsZW5kYXJOYW1lfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICElQ2FsZW5kYXI7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjYWNoZSB2YWx1ZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFyLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICAjIHJlc2V0IENhbGVuZGFyTGlzdAogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyTGlzdCcsCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgJUNhbGVuZGFyLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJUNhbGVuZGFyOwp9Cgo9aXRlbSBDYWxlbmRhckdldCgpCgpnZXQgY2FsZW5kYXIgYnkgbmFtZSBvZCBpZC4KCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAnTWVldGluZ3MnLCAgICAgICAgICAjIChyZXF1aXJlZCkgQ2FsZW5kYXIgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhcklECgogICAgICAgIFVzZXJJRCAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVXNlcklEIC0gU3lzdGVtIHdpbGwgY2hlY2sgaWYgdXNlciBoYXMgYWNjZXNzIHRvIGNhbGVuZGFyIGlmIHByb3ZpZGVkCiAgICApOwoKcmV0dXJucyBDYWxlbmRhciBkYXRhOgogICAgJUNhbGVuZGFyID0gKAogICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAyLAogICAgICAgIEdyb3VwSUQgICAgICAgICAgICA9PiAzLAogICAgICAgIENhbGVuZGFyTmFtZSAgICAgICA9PiAnTWVldGluZ3MnLAogICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGNzcwMCcsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3RhcnREYXRlID0+ICdGaXJzdFJlc3BvbnNlJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICA9PiBbIDIgXSwKICAgICAgICAgICAgICAgIFNlYXJjaFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgVHlwZXMgPT4gJ1RoaXMgaXMgYSB0eXBlJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICA9PiAxLAogICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2FsZW5kYXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NhbGVuZGFySUR9ICYmICEkUGFyYW17Q2FsZW5kYXJOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ2FsZW5kYXJJRCBvciBDYWxlbmRhck5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQ2FsZW5kYXI7CgogICAgaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdmFsdWUgaXMgY2FjaGVkCiAgICAgICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRGF0YSkgKSB7CiAgICAgICAgICAgICVDYWxlbmRhciA9ICV7JERhdGF9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICElQ2FsZW5kYXIgKSB7CgogICAgICAgICMgY3JlYXRlIGRiIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICBteSAkU1FMID0gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIGdyb3VwX2lkLCBuYW1lLCBjb2xvciwgdGlja2V0X2FwcG9pbnRtZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgdmFsaWRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcgogICAgICAgICAgICBXSEVSRQogICAgICAgICc7CgogICAgICAgIG15IEBCaW5kOwogICAgICAgIGlmICggJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICAgICAkU1FMIC49ICcKICAgICAgICAgICAgICAgIGlkPT8KICAgICAgICAgICAgJzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gJwogICAgICAgICAgICAgICAgbmFtZT0/CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZGIgcXVlcnkKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgIyBkZWNvZGUgYW5kIGRlc2VyaWFsaXplIHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgIG15ICRUaWNrZXRBcHBvaW50bWVudHM7CiAgICAgICAgICAgIGlmICggJFJvd1s0XSApIHsKICAgICAgICAgICAgICAgIG15ICREZWNvZGVkRGF0YSA9IE1JTUU6OkJhc2U2NDo6ZGVjb2RlX2Jhc2U2NCggJFJvd1s0XSApOwogICAgICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5EZXNlcmlhbGl6ZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREZWNvZGVkRGF0YSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gdW5kZWYgaWYgcmVmICRUaWNrZXRBcHBvaW50bWVudHMgbmUgJ0FSUkFZJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9ICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7R3JvdXBJRH0gICAgICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhck5hbWV9ICAgICAgID0gJFJvd1syXTsKICAgICAgICAgICAgJENhbGVuZGFye0NvbG9yfSAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSA9ICRUaWNrZXRBcHBvaW50bWVudHM7CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVUaW1lfSAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAgICAgJENhbGVuZGFye0NyZWF0ZUJ5fSAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlVGltZX0gICAgICAgICA9ICRSb3dbN107CiAgICAgICAgICAgICRDYWxlbmRhcntDaGFuZ2VCeX0gICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAgICAgJENhbGVuZGFye1ZhbGlkSUR9ICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17Q2FsZW5kYXJJRH0gKSB7CgogICAgICAgICAgICAjIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICYmICRDYWxlbmRhcntHcm91cElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICAgICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkQ2FsZW5kYXJ7R3JvdXBJRH0gPT0gJF8gfSBrZXlzICVHcm91cExpc3QgKSB7CiAgICAgICAgICAgICAgICAlQ2FsZW5kYXIgPSAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUNhbGVuZGFyOwp9Cgo9aXRlbSBDYWxlbmRhckxpc3QoKQoKZ2V0IGNhbGVuZGFyIGxpc3QuCgogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFVzZXJJRCAgICAgPT4gNCwgICAgICAgICAgICAjIChvcHRpb25hbCkgRm9yIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsICAgICAgICAgIyAob3B0aW9uYWwpIFJlcXVpcmVkIHBlcm1pc3Npb24gKGRlZmF1bHQgcm8pCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLCAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMCAtIEFsbCBzdGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxIC0gQWxsIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMiAtIEFsbCBpbnZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyAtIEFsbCB0ZW1wb3JhcnkgaW52YWxpZAogICAgKTsKCnJldHVybnM6CiAgICBAUmVzdWx0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDIsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICAgICAgQ3JlYXRlQnkgICAgID0+IDMsCiAgICAgICAgICAgIENoYW5nZVRpbWUgICA9PiAnMjAxNi0wMS0wMSAwODowMDowMCcsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgICA9PiAzLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDMsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ0N1c3RvbWVyIHByZXNlbnRhdGlvbnMnLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNCQjAwQkInLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDg6MDA6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgICAgPT4gMywKICAgICAgICAgICAgQ2hhbmdlVGltZSAgID0+ICcyMDE2LTAxLTAxIDA4OjAwOjAwJywKICAgICAgICAgICAgQ2hhbmdlQnkgICAgID0+IDMsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgLi4uCiAgICBdOwoKPWN1dAoKc3ViIENhbGVuZGFyTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgTWFrZSBkaWZmZXJlbnQgY2FjaGUgdHlwZSBmb3IgbGlzdCAoc28gd2UgY2FuIGNsZWFyIGNhY2hlIGJ5IHRoaXMgdmFsdWUpCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICdDYWxlbmRhckxpc3QnOwogICAgbXkgJENhY2hlS2V5VXNlciAgPSAkUGFyYW17VXNlcklEfSB8fCAnYWxsLXVzZXItaWRzJzsKICAgIG15ICRDYWNoZUtleVZhbGlkID0gJFBhcmFte1ZhbGlkSUR9IHx8ICdhbGwtdmFsaWQtaWRzJzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBjYWNoZWQgdmFsdWUgaWYgZXhpc3RzCiAgICBteSAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICIkQ2FjaGVLZXlVc2VyLSRDYWNoZUtleVZhbGlkIiwKICAgICk7CgogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCREYXRhKSApIHsKCiAgICAgICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgbXkgJFNRTCA9ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBncm91cF9pZCwgbmFtZSwgY29sb3IsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnksCiAgICAgICAgICAgIHZhbGlkX2lkCiAgICAgICAgICAgIEZST00gY2FsZW5kYXIKICAgICAgICAgICAgV0hFUkUgMT0xCiAgICAgICAgJzsKICAgICAgICBteSBAQmluZDsKCiAgICAgICAgaWYgKCAkUGFyYW17VmFsaWRJRH0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gJyBBTkQgdmFsaWRfaWQ9PyAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1ZhbGlkSUR9OwogICAgICAgIH0KICAgICAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCBBU0MnOwoKICAgICAgICAjIGRiIHF1ZXJ5CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFJlc3VsdDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgbXkgJUNhbGVuZGFyOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gICA9ICRSb3dbMF07CiAgICAgICAgICAgICRDYWxlbmRhcntHcm91cElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFyTmFtZX0gPSAkUm93WzJdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q29sb3J9ICAgICAgICA9ICRSb3dbM107CiAgICAgICAgICAgICRDYWxlbmRhcntDcmVhdGVUaW1lfSAgID0gJFJvd1s0XTsKICAgICAgICAgICAgJENhbGVuZGFye0NyZWF0ZUJ5fSAgICAgPSAkUm93WzVdOwogICAgICAgICAgICAkQ2FsZW5kYXJ7Q2hhbmdlVGltZX0gICA9ICRSb3dbNl07CiAgICAgICAgICAgICRDYWxlbmRhcntDaGFuZ2VCeX0gICAgID0gJFJvd1s3XTsKICAgICAgICAgICAgJENhbGVuZGFye1ZhbGlkSUR9ICAgICAgPSAkUm93WzhdOwogICAgICAgICAgICBwdXNoIEBSZXN1bHQsIFwlQ2FsZW5kYXI7CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIGRhdGEKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVVzZXItJENhY2hlS2V5VmFsaWQiLAogICAgICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKCiAgICAgICAgJERhdGEgPSBcQFJlc3VsdDsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewoKICAgICAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSB8fCAncm8nLAogICAgICAgICk7CgogICAgICAgIG15IEBSZXN1bHQ7CgogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JERhdGF9ICkgewogICAgICAgICAgICBpZiAoIGdyZXAgeyAkSXRlbS0+e0dyb3VwSUR9ID09ICRfIH0ga2V5cyAlR3JvdXBMaXN0ICkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVzdWx0LCAkSXRlbTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJERhdGEgPSBcQFJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gQHskRGF0YX07Cn0KCj1pdGVtIENhbGVuZGFyVXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXhpc3RpbmcgY2FsZW5kYXIuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgIENhbGVuZGFySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBHcm91cElEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBDYWxlbmRhciBncm91cAogICAgICAgIENhbGVuZGFyTmFtZSAgICAgPT4gJ01lZXRpbmdzJywgICAgICAgICAgIyAocmVxdWlyZWQpIFBlcnNvbmFsIGNhbGVuZGFyIG5hbWUKICAgICAgICBDb2xvciAgICAgICAgICAgID0+ICcjRkY5OTAwJywgICAgICAgICAgICMgKHJlcXVpcmVkKSBDb2xvciBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24KICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDQsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQgKHdobyBtYWRlIHVwZGF0ZSkKICAgICAgICBWYWxpZElEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZElECgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50cywgYXJyYXkgcmVmIG9mIGhhc2hlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBTdGFydERhdGUgPT4gJ0ZpcnN0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgID0+IFsgMiBdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnVGhpcyBpcyBhIHRpdGxlJywKICAgICAgICAgICAgICAgICAgICBUeXBlcyA9PiAnVGhpcyBpcyBhIHR5cGUnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBDYWxlbmRhclVwZGF0ZQoKPWN1dAoKc3ViIENhbGVuZGFyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIFVzZXJJRCBWYWxpZElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgY29sb3IKICAgIGlmICggISggJFBhcmFte0NvbG9yfSA9fiAvI1tBLUYwLTldezMsNn0vaSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ29sb3IgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCB0aWNrZXQgYXBwb2ludG1lbnRzCiAgICBpZiAoICEoIHNjYWxhciBAeyAkUGFyYW17VGlja2V0QXBwb2ludG1lbnRzfSAvLyBbXSB9ICkgKSB7CiAgICAgICAgJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gPSB1bmRlZjsKICAgIH0KCiAgICAjIG1ha2UgaXQgdXBwZXJjYXNlIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeQogICAgJFBhcmFte0NvbG9yfSA9IHVjICRQYXJhbXtDb2xvcn07CgogICAgIyBzZXJpYWxpemUgYW5kIGVuY29kZSB0aWNrZXQgYXBwb2ludG1lbnQgZGF0YQogICAgbXkgJFRpY2tldEFwcG9pbnRtZW50czsKICAgIGlmICggJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RpY2tldEFwcG9pbnRtZW50c30sCiAgICAgICAgKTsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZU91dHB1dCgkVGlja2V0QXBwb2ludG1lbnRzKTsKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRzID0gTUlNRTo6QmFzZTY0OjplbmNvZGVfYmFzZTY0KCRUaWNrZXRBcHBvaW50bWVudHMpOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyCiAgICAgICAgU0VUIGdyb3VwX2lkPT8sIG5hbWU9PywgY29sb3I9PywgdGlja2V0X2FwcG9pbnRtZW50cz0/LCBjaGFuZ2VfdGltZT1jdXJyZW50X3RpbWVzdGFtcCwKICAgICAgICBjaGFuZ2VfYnk9PywgdmFsaWRfaWQ9PwogICAgJzsKCiAgICBteSBAQmluZDsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17R3JvdXBJRH0sIFwkUGFyYW17Q2FsZW5kYXJOYW1lfSwgXCRQYXJhbXtDb2xvcn0sIFwkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtWYWxpZElEfTsKCiAgICAkU1FMIC49ICcKICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBnZXQgY2FjaGUgb2JqZWN0CiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFyIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnQ2FsZW5kYXJMaXN0JywKICAgICk7CgogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ2FsZW5kYXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDYWxlbmRhckltcG9ydCgpCgppbXBvcnQgYSBjYWxlbmRhcgoKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckltcG9ydCgKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJEYXRhID0+IHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICA9PiAyLAogICAgICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ01lZXRpbmdzJywKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGNzcwMCcsCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhID0+IHsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+IDAsICAgICAjIChvcHRpb25hbCkgT3ZlcndyaXRlIGV4aXN0aW5nIGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudHMsIGRlZmF1bHQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGVuZGFyIHdpdGggc2FtZSBuYW1lIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFwcG9pbnRtZW50cyB3aXRoIHNhbWUgVW5pcXVlSUQgaW4gZXhpc3RpbmcgY2FsZW5kYXIgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsCgo9Y3V0CgpzdWIgQ2FsZW5kYXJJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfSApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfSApOwoKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFyRGF0YX0tPntUaWNrZXRBcHBvaW50bWVudHN9CiAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57VGlja2V0QXBwb2ludG1lbnRzfSApCiAgICAgICAgKQogICAgewogICAgICAgICMgR2V0IHF1ZXVlIGNyZWF0ZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgIG15IEBWYWxpZElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpOwoKICAgICAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBRdWV1ZSBmaWVsZCBpbiB0aWNrZXQgYXBwb2ludG1lbnRzIGlzIG1hbmRhdG9yeSwgY2hlY2sgaWYgaXQncyBwcmVzZW50IGFuZCB2YWxpZC4KICAgICAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJ1bGUtPntRdWV1ZUlEfSAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRSdWxlLT57UXVldWVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBRVUVVRV9JRDoKICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQgQHsgJFJ1bGUtPntRdWV1ZUlEfSB8fCBbXSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICFncmVwIHsgJF8gZXEgJFF1ZXVlRGF0YXtWYWxpZElEfSB9IEBWYWxpZElEcwogICAgICAgICAgICAgICAgICAgICAgICB8fCAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBxdWV1ZSBJRCAkUXVldWVJRCBpbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBvciBubyBwZXJtaXNzaW9ucyEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBxdWV1ZSBJRCBpbiB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZXMhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgYW4gZXhpc3RpbmcgY2FsZW5kYXIKICAgIG15ICVFeGlzdGluZ0NhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9LT57Q2FsZW5kYXJOYW1lfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CgogICAgIyBjcmVhdGUgbmV3IGNhbGVuZGFyCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVFeGlzdGluZ0NhbGVuZGFyICkgKSB7CiAgICAgICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICAleyAkUGFyYW17RGF0YX0tPntDYWxlbmRhckRhdGF9IH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgIHJldHVybiBpZiAhJENhbGVuZGFye0NhbGVuZGFySUR9OwoKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIHVwZGF0ZSBleGlzdGluZyBjYWxlbmRhcgogICAgZWxzZSB7CiAgICAgICAgaWYgKCAkUGFyYW17T3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllc30gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkNhbGVuZGFyVXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJEYXRhfSB9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkRXhpc3RpbmdDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRFeGlzdGluZ0NhbGVuZGFye0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgaW1wb3J0IGFwcG9pbnRtZW50cwogICAgaWYgKCAkQ2FsZW5kYXJJRCAmJiBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0gKSApIHsKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKCBAeyAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudERhdGF9IH0gKSB7CgogICAgICAgICAgICAjIGFkZCB0byBleGlzdGluZyBjYWxlbmRhcgogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfSA9ICRDYWxlbmRhcklEOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGFwcG9pbnRtZW50IGlmIE5PVCBvdmVyd3JpdGluZyBleGlzdGluZyBlbnRpdGllcwogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntVbmlxdWVJRH0gPSB1bmRlZiBpZiAhJFBhcmFte092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXN9OwoKICAgICAgICAgICAgIyBza2lwIGFkZGluZyBhdXRvbWF0aWMgcmVjdXJyaW5nIG9jY3VycmVuY2VzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1JlY3VycmluZ1Jhd30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwYXJlbnQgaWQgdG8gbGFzdCBhcHBvaW50bWVudCBpZAogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudC0+e1BhcmVudElEfSApIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1BhcmVudElEfSA9ICRBcHBvaW50bWVudElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50SUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDYWxlbmRhckV4cG9ydCgpCgpleHBvcnQgYSBjYWxlbmRhcgoKICAgIG15ICVEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICBDYWxlbmRhcklEID0+IDIsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfQoKcmV0dXJucyBjYWxlbmRhciBoYXNoIHdpdGggZGF0YToKCiAgICAlRGF0YSA9ICgKICAgICAgICBDYWxlbmRhckRhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gMiwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAnTWVldGluZ3MnLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFwcG9pbnRtZW50RGF0YSA9PiAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICB9LAogICAgICAgICAgICAuLi4KICAgICAgICApLAogICAgKTsKCj1jdXQKCnN1YiBDYWxlbmRhckV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgZGF0YQogICAgbXkgJUNhbGVuZGFyRGF0YSA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQ2FsZW5kYXJEYXRhICk7CgogICAgIyBnZXQgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBnZXQgbGlzdCBvZiBhcHBvaW50bWVudHMKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICApOwoKICAgIG15IEBBcHBvaW50bWVudERhdGE7CgogICAgQVBQT0lOVE1FTlRJRDoKICAgIGZvciBteSAkQXBwb2ludG1lbnRJRCAoQEFwcG9pbnRtZW50cykgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgISVBcHBvaW50bWVudDsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5USUQgaWYgJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfTsKCiAgICAgICAgcHVzaCBAQXBwb2ludG1lbnREYXRhLCBcJUFwcG9pbnRtZW50OwogICAgfQoKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgQ2FsZW5kYXJEYXRhICAgID0+IFwlQ2FsZW5kYXJEYXRhLAogICAgICAgIEFwcG9pbnRtZW50RGF0YSA9PiBcQEFwcG9pbnRtZW50RGF0YSwKICAgICk7CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIENhbGVuZGFyUGVybWlzc2lvbkdldCgpCgpnZXQgcGVybWlzc2lvbiBsZXZlbCBmb3IgZ2l2ZW4gQ2FsZW5kYXJJRCBhbmQgVXNlcklELgoKICAgIG15ICRQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgQ2FsZW5kYXJJRCAgPT4gMSwgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBVc2VySUQgICAgICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJuczoKICAgICRQZXJtaXNzaW9uID0gJ3J3JzsgICAgIyAncm8nLCAncncnLC4uLgoKPWN1dAoKc3ViIENhbGVuZGFyUGVybWlzc2lvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIHN1cmUgc3VwZXIgdXNlciBoYXMgcmVhZC93cml0ZSBwZXJtaXNzaW9uCiAgICByZXR1cm4gJ3J3JyBpZiAkUGFyYW17VXNlcklEfSBlcSAxOwoKICAgIG15ICVDYWxlbmRhciA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICcnOwoKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgIFRZUEU6CiAgICBmb3IgbXkgJFR5cGUgKHF3KHJvIG1vdmVfaW50byBjcmVhdGUgcncpKSB7CgogICAgICAgIG15ICVHcm91cERhdGEgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkVHlwZSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cERhdGF7ICRDYWxlbmRhcntHcm91cElEfSB9ICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFR5cGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsYXN0IFRZUEU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NUaWNrZXQoKQoKSGFuZGxlIHRoZSBhdXRvbWF0aWMgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHRpY2tldC4KCiAgICAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCgKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKClRoaXMgbWV0aG9kIGRvZXMgbm90IGhhdmUgcmV0dXJuIHZhbHVlLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1RpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGFsbCB2YWxpZCBjYWxlbmRhcnMKICAgIG15IEBDYWxlbmRhcnMgPSAkU2VsZi0+Q2FsZW5kYXJMaXN0KAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CiAgICByZXR1cm4gaWYgIUBDYWxlbmRhcnM7CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdvIHRocm91Z2ggYWxsIGNhbGVuZGFycyB3aXRoIGRlZmluZWQgdGlja2V0IGFwcG9pbnRtZW50cwogICAgQ0FMRU5EQVI6CiAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJzKSB7CiAgICAgICAgbXkgJUNhbGVuZGFyRGF0YSA9ICRTZWxmLT5DYWxlbmRhckdldCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXItPntDYWxlbmRhcklEfSwKICAgICAgICApOwogICAgICAgIG5leHQgQ0FMRU5EQVIgaWYgISRDYWxlbmRhckRhdGF7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICAgICAgVElDS0VUX0FQUE9JTlRNRU5UUzoKICAgICAgICBmb3IgbXkgJFRpY2tldEFwcG9pbnRtZW50cyAoIEB7ICRDYWxlbmRhckRhdGF7VGlja2V0QXBwb2ludG1lbnRzfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcHBvaW50bWVudCB0eXBlcwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKCiAgICAgICAgICAgICAgICAjIGFsbG93IHNwZWNpYWwgdGltZSBwcmVzZXRzIGZvciBFbmREYXRlCiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZCBuZSAnRW5kRGF0ZScgJiYgISggJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gPX4gL15QbHVzXy8gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBza2lwIGlmIHRpY2tldCBhcHBvaW50bWVudCB0eXBlIGlzIGludmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50cy0+eyRGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRfQVBQT0lOVE1FTlRTOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aWNrZXQgc2F0aXNmaWVzIHRoZSBzZWFyY2ggZmlsdGVyIGZyb20gdGhlIHRpY2tldCBhcHBvaW50bWVudCBydWxlCiAgICAgICAgICAgICMgcGFzcyBhbGwgY29uZmlndXJlZCBwYXJhbWV0ZXJzIHRvIHRpY2tldCBzZWFyY2gsIGluY2x1ZGluZyB0aWNrZXQgaWQKICAgICAgICAgICAgbXkgJEZpbHRlcmVkID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgJXsgJFRpY2tldEFwcG9pbnRtZW50cy0+e1NlYXJjaFBhcmFtfSAvLyB7fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB0aWNrZXQgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICgkRmlsdGVyZWQpIHsKCiAgICAgICAgICAgICAgICAjIHByb2Nlc3MgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgICAgICAgICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NSdWxlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiBcJVRpY2tldEFwcG9pbnRtZW50VHlwZXMsCiAgICAgICAgICAgICAgICAgICAgUnVsZSAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGlja2V0IHdhcyBub3QgZm91bmQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyByZW1vdmUgYW55IGV4aXN0aW5nIHRpY2tldCBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1J1bGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUHJvY2Vzc2VkIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRpY2tldCAkUGFyYW17VGlja2V0SUR9LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyKCkKCkhhbmRsZSB0aGUgYXV0b21hdGljIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIHRoZSBjYWxlbmRhci4KCiAgICBteSAlUmVzdWx0ID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhcigKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICApOwoKUmV0dXJucyBsb2cgb2YgcHJvY2Vzc2VkIHRpY2tldHMgYW5kIHJ1bGVzOgoKJVJlc3VsdCA9ICgKICAgIFByb2Nlc3MgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgVGlja2V0SUQgPT4gMiwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICB9LAogICAgXSwKICAgIENsZWFudXAgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgUnVsZUlEICA9PiAnYjI3MmEwMzVlZDgyZDY1YTkyN2E5OTMwMGUwMGM5YjUnLAogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgfSwKICAgIF0sCik7Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDYWxlbmRhcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCBjYWxlbmRhciBjb25maWd1cmF0aW9uLgogICAgbXkgJUNhbGVuZGFyID0gJFNlbGYtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgIGlmICggISVDYWxlbmRhciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBmaW5kIGNhbGVuZGFyICRQYXJhbXtDYWxlbmRhcklEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBhcHBvaW50bWVudCB0eXBlcwogICAgbXkgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnRUeXBlc0dldCgpOwoKICAgIG15IEBQcm9jZXNzOwogICAgbXkgQENsZWFudXA7CiAgICBteSAlUnVsZUlETG9va3VwOwoKICAgICMgQ2hlY2sgdGlja2V0IGFwcG9pbnRtZW50cyBjb25maWcuCiAgICBpZiAoICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9ICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gKSApIHsKCiAgICAgICAgIyBHZXQgYWN0aXZlIHJ1bGUgSURzIGZyb20gdGhlIGNhbGVuZGFyIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgJVJ1bGVJRExvb2t1cCA9IG1hcCB7ICRfLT57UnVsZUlEfSA9PiAxIH0gQHsgJENhbGVuZGFye1RpY2tldEFwcG9pbnRtZW50c30gfTsKCiAgICAgICAgVElDS0VUX0FQUE9JTlRNRU5UUzoKICAgICAgICBmb3IgbXkgJFRpY2tldEFwcG9pbnRtZW50cyAoIEB7ICRDYWxlbmRhcntUaWNrZXRBcHBvaW50bWVudHN9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGFwcG9pbnRtZW50IHR5cGVzLgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydERhdGUgRW5kRGF0ZSkpIHsKCiAgICAgICAgICAgICAgICAjIEFsbG93IHNwZWNpYWwgdGltZSBwcmVzZXRzIGZvciBFbmREYXRlLgogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQgbmUgJ0VuZERhdGUnICYmICEoICRUaWNrZXRBcHBvaW50bWVudHMtPnskRmllbGR9ID1+IC9eUGx1c18vICkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBpZiB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZSBpcyBpbnZhbGlkLgogICAgICAgICAgICAgICAgICAgIGlmICggISRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyAkVGlja2V0QXBwb2ludG1lbnRzLT57JEZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRJQ0tFVF9BUFBPSU5UTUVOVFM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBwcmV2aW91c2x5IGNyZWF0ZWQgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgdGhpcyBydWxlLgogICAgICAgICAgICBteSAlT2xkQXBwb2ludG1lbnRzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJFRpY2tldEFwcG9pbnRtZW50cy0+e1J1bGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEZpbmQgdGlja2V0cyB0aGF0IG1hdGNoIHNlYXJjaCBmaWx0ZXIKICAgICAgICAgICAgbXkgQFRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgIFJlc3VsdCAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICAgICAgJXsgJFRpY2tldEFwcG9pbnRtZW50cy0+e1NlYXJjaFBhcmFtfSAvLyB7fSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBQcm9jZXNzIGVhY2ggdGlja2V0IGJhc2VkIG9uIHRpY2tldCBhcHBvaW50bWVudCBydWxlLgogICAgICAgICAgICBUSUNLRVRJRDoKICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIHNvcnQgQFRpY2tldElEcyApIHsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc1J1bGUoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiBcJVRpY2tldEFwcG9pbnRtZW50VHlwZXMsCiAgICAgICAgICAgICAgICAgICAgUnVsZSAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBQcm9jZXNzLCB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBSZW1vdmUgcHJldmlvdXNseSBjcmVhdGVkIHRpY2tldCBhcHBvaW50bWVudHMgaWYgdGhleSBkb24ndCBtYXRjaCB0aGUgcnVsZSBhbnltb3JlLgogICAgICAgICAgICBPTERUSUNLRVRJRDoKICAgICAgICAgICAgZm9yIG15ICRPbGRUaWNrZXRJRCAoIHNvcnQga2V5cyAlT2xkQXBwb2ludG1lbnRzICkgewogICAgICAgICAgICAgICAgbmV4dCBPTERUSUNLRVRJRCBpZiBncmVwIHsgJE9sZFRpY2tldElEID09ICRfIH0gQFRpY2tldElEczsKCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRPbGRBcHBvaW50bWVudHN7JE9sZFRpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRPbGRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgID0+ICRUaWNrZXRBcHBvaW50bWVudHMtPntSdWxlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbnVwLCB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkT2xkQXBwb2ludG1lbnRzeyRPbGRUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkT2xkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICAgICAgICA9PiAkVGlja2V0QXBwb2ludG1lbnRzLT57UnVsZUlEfSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSBAUnVsZUlEcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwoKICAgICMgUmVtb3ZlIHRpY2tldCBhcHBvaW50bWVudHMgZm9yIG1pc3NpbmcgcnVsZXMuCiAgICBmb3IgbXkgJFJ1bGVJRCAoQFJ1bGVJRHMpIHsKICAgICAgICBpZiAoICEkUnVsZUlETG9va3VweyRSdWxlSUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkUnVsZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAQ2xlYW51cCwgewogICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlELAogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlYnVnJykgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQcm9jZXNzZWQgdGlja2V0IGFwcG9pbnRtZW50cyBmb3IgY2FsZW5kYXIgJFBhcmFte0NhbGVuZGFySUR9LiIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIFByb2Nlc3MgPT4gXEBQcm9jZXNzLAogICAgICAgIENsZWFudXAgPT4gXEBDbGVhbnVwLAogICAgKTsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSgpCgpQcm9jZXNzIHRoZSB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZSBhbmQgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGFwcG9pbnRtZW50IGlmIG5lY2Vzc2FyeS4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgRHluYW1pY0ZpZWxkX1Rlc3REYXRlID0+IHsKICAgICAgICAgICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC4uLgogICAgICAgIH0sCiAgICAgICAgUnVsZSA9PiB7CiAgICAgICAgICAgIFN0YXJ0RGF0ZSA9PiAnRHluYW1pY0ZpZWxkX1Rlc3REYXRlJywKICAgICAgICAgICAgRW5kRGF0ZSAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICBRdWV1ZUlEICAgPT4gWyAyIF0sCiAgICAgICAgICAgIFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1dlbGNvbWUqJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzUnVsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBDb25maWcgUnVsZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Q29uZmlnfSApOwogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1J1bGV9ICk7CgogICAgbXkgJEVycm9yOwogICAgbXkgJEFwcG9pbnRtZW50VHlwZTsKICAgIG15ICVBcHBvaW50bWVudERhdGE7CgogICAgbXkgJE1haW5PYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBnZXQgc3RhcnQgYW5kIGVuZCB0aW1lIHZhbHVlcwogICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnREYXRlIEVuZERhdGUpKSB7CiAgICAgICAgbXkgJFR5cGUgPSAkUGFyYW17UnVsZX0tPnskRmllbGR9OwoKICAgICAgICAjIGFwcG9pbnRtZW50IGZpZWxkcyBhcmUgbmFtZWQgZGlmZmVyZW50bHkKICAgICAgICBteSAkQXBwb2ludG1lbnRGaWVsZCA9ICRGaWVsZDsKICAgICAgICAkQXBwb2ludG1lbnRGaWVsZCA9fiBzL0RhdGUkL1RpbWUvOwoKICAgICAgICAjIGNoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZWdpc3RlcmVkIHR5cGUKICAgICAgICBpZiAoICRQYXJhbXtDb25maWd9LT57JFR5cGV9ICYmICRQYXJhbXtDb25maWd9LT57JFR5cGV9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkUGFyYW17Q29uZmlnfS0+eyRUeXBlfS0+e01vZHVsZX07CgogICAgICAgICAgICAjIGdldCB0aGUgdGltZSB2YWx1ZSB2aWEgdGhlIG1vZHVsZSBtZXRob2QKICAgICAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICktPkdldFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxIGlmICEkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIHByZXNldHMgYXJlIHZhbGlkIG9ubHkgZm9yIGVuZCB0aW1lIGFuZCBleGlzdGluZyBzdGFydCB0aW1lCiAgICAgICAgZWxzaWYgKCAkRmllbGQgZXEgJ0VuZERhdGUnICYmICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXlBsdXNfKFswLTldKykkLyApIHsKICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgIyBnZXQgc3RhcnQgdGltZQogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSBlbmQgdGltZSB1c2luZyBwcmVzZXQgdmFsdWUKICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lID0gJFN0YXJ0VGltZSArIDYwICogJFByZXNldDsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IDE7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHRpbWUgcHJlc2V0OiAkVHlwZSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVua25vd24gdHlwZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXZlbnQgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUKICAgIGlmICggJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9ICYmICRBcHBvaW50bWVudERhdGF7RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudERhdGF7U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIG15ICRFbmRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RGF0YXtFbmRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggJEVuZFRpbWUgPCAkU3RhcnRUaW1lICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnREYXRhe0VuZFRpbWV9ID0gJEFwcG9pbnRtZW50RGF0YXtTdGFydFRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCB0aXRsZQogICAgaWYgKCAhJEVycm9yICkgewoKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICBteSAkVGlja2V0SG9va0RpdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKTsKICAgICAgICBteSAlVGlja2V0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRBcHBvaW50bWVudERhdGF7VGl0bGV9ID0gIlskVGlja2V0SG9vayRUaWNrZXRIb29rRGl2aWRlciRUaWNrZXR7VGlja2V0TnVtYmVyfV0gJFRpY2tldHtUaXRsZX0iOwogICAgfQoKICAgIG15ICRTdWNjZXNzOwoKICAgICMgY2hlY2sgaWYgdGlja2V0IGFwcG9pbnRtZW50IGFscmVhZHkgZXhpc3RzCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxmLT5fVGlja2V0QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFJ1bGVJRCAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICk7CgogICAgIyB0aWNrZXQgYXBwb2ludG1lbnQgd2FzIGZvdW5kCiAgICBpZiAoJEFwcG9pbnRtZW50SUQpIHsKCiAgICAgICAgIyBkZWxldGUgdGhlIHRpY2tldCBhcHBvaW50bWVudCwgaWYgZXJyb3Igd2FzIHJhaXNlZAogICAgICAgIGlmICgkRXJyb3IpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJFBhcmFte1J1bGV9LT57UnVsZUlEfSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgdGlja2V0IGFwcG9pbnRtZW50LCBvdGhlcndpc2UKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+X1RpY2tldEFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgICA9PiAkUGFyYW17UnVsZX0tPntSdWxlSUR9LAogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50RGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgdGlja2V0IGFwcG9pbnRtZW50IGlmIG5vdCBmb3VuZAogICAgZWxzaWYgKCAhJEVycm9yICkgewogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgUnVsZUlEICAgICA9PiAkUGFyYW17UnVsZX0tPntSdWxlSUR9LAogICAgICAgICAgICAlQXBwb2ludG1lbnREYXRhLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdWNjZXNzOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCgpCgpVcGRhdGVzIHRoZSB0aWNrZXQgd2l0aCBkYXRhIGZyb20gdGlja2V0IGFwcG9pbnRtZW50LgoKICAgICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgIFRpY2tldElEICAgICAgPT4gMSwKICAgICk7CgpUaGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHJldHVybiB2YWx1ZS4KCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzdG9wIGlmIG5vdCB0aWNrZXQgYXBwb2ludG1lbnQKICAgIHJldHVybiBpZiAhJEFwcG9pbnRtZW50RGF0YXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH07CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUKICAgIG15ICRSdWxlID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudERhdGF7Q2FsZW5kYXJJRH0sCiAgICAgICAgUnVsZUlEICAgICA9PiAkQXBwb2ludG1lbnREYXRhe1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICk7CiAgICByZXR1cm4gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRSdWxlKTsKCiAgICAjIGdldCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZXMKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJFNlbGYtPlRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKTsKCiAgICBteSAkTWFpbk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBwcm9jZXNzIHN0YXJ0IGFuZCBlbmQgdGltZSB2YWx1ZXMKICAgIGZvciBteSAkRmllbGQgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgIG15ICRUeXBlID0gJFJ1bGUtPnskRmllbGR9OwoKICAgICAgICAjIGFwcG9pbnRtZW50IGZpZWxkcyBhcmUgbmFtZWQgZGlmZmVyZW50bHkKICAgICAgICBteSAkQXBwb2ludG1lbnRGaWVsZCA9ICRGaWVsZDsKICAgICAgICAkQXBwb2ludG1lbnRGaWVsZCA9fiBzL0RhdGUkL1RpbWUvOwoKICAgICAgICAjIGNoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZWdpc3RlcmVkIHR5cGUKICAgICAgICBpZiAoICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfSAmJiAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3skVHlwZX0tPntNb2R1bGV9ICkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRUeXBlfS0+e01vZHVsZX07CgogICAgICAgICAgICAjIHNldCB0aGUgdGltZSB2YWx1ZSB2aWEgdGhlIG1vZHVsZSBtZXRob2QKICAgICAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CgogICAgICAgICAgICAgICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgdGlja2V0IGV2ZW50IG1vZHVsZSBmcm9tIHJ1bm5pbmcKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6QWxyZWFkeVByb2Nlc3NlZCd9LT57ICRQYXJhbXtUaWNrZXRJRH0gfSsrOwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0gKS0+U2V0VGltZSgKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXBwb2ludG1lbnREYXRheyRBcHBvaW50bWVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXJyb3Igc2V0dGluZyAkVHlwZSBmb3IgdGlja2V0ICRQYXJhbXtUaWNrZXRJRH0hIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWJ1ZycpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXBkYXRlZCB0aWNrZXQgJFBhcmFte1RpY2tldElEfSBmcm9tIGFwcG9pbnRtZW50ICRQYXJhbXtBcHBvaW50bWVudElEfS4iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFRpY2tldElEKCkKCmdldCB0aWNrZXQgaWQgb2YgYSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFRpY2tldElEID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFRpY2tldElEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIGFwcG9pbnRtZW50IElEIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEFwcG9pbnRtZW50SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCB0aWNrZXRfaWQKICAgICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICAgICAgV0hFUkUgYXBwb2ludG1lbnRfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFRpY2tldElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFRpY2tldElEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFRpY2tldElEOwp9Cgo9aXRlbSBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRHNHZXQoKQoKZ2V0IHVzZWQgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGVzIGZvciBzcGVjaWZpYyBjYWxlbmRhci4KCiAgICBteSBAUnVsZUlEcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlSURzR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgID0+IDEsICAgICMgKG9wdGlvbmFsKSBSZXR1cm4gcnVsZXMgdXNlZCBvbmx5IGZvciBzcGVjaWZpYyB0aWNrZXQKICAgICk7CgpyZXR1cm5zIGFycmF5IG9mIHJ1bGUgSURzIGlmIGZvdW5kLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBydWxlX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudF90aWNrZXQKICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgICc7CiAgICBteSBAQmluZDsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CgogICAgIyBzcGVjaWZpYyB0aWNrZXQgcXVlcnkgY29uZGl0aW9uCiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCB0aWNrZXRfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVSdWxlSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJ1bGVJRHN7ICRSb3dbMF0gfSA9IDE7CiAgICB9CgogICAgIyByZXR1cm4gdW5pcXVlIHJ1bGUgaWRzCiAgICByZXR1cm4ga2V5cyAlUnVsZUlEczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KCkKCmdldCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZS4KCiAgICBteSAkUnVsZSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRSdWxlR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBSdWxlSUQgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsCiAgICApOwoKcmV0dXJucyBydWxlIGhhc2g6Cgo9Y3V0CgpzdWIgVGlja2V0QXBwb2ludG1lbnRSdWxlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ2FsZW5kYXIgPSAkU2VsZi0+Q2FsZW5kYXJHZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfTsKCiAgICBteSAkUmVzdWx0OwoKICAgIFJVTEU6CiAgICBmb3IgbXkgJFJ1bGUgKCBAeyAkQ2FsZW5kYXJ7VGlja2V0QXBwb2ludG1lbnRzfSB8fCBbXSB9ICkgewogICAgICAgIGlmICggJFJ1bGUtPntSdWxlSUR9IGVxICRQYXJhbXtSdWxlSUR9ICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFJ1bGU7CiAgICAgICAgICAgIGxhc3QgUlVMRTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCj1pdGVtIFRpY2tldEFwcG9pbnRtZW50VHlwZXNHZXQoKQoKZ2V0IGRlZmluZWQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzIGZyb20gY29uZmlnLgoKICAgIG15ICVUaWNrZXRBcHBvaW50bWVudFR5cGVzID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0KCk7CgpyZXR1cm5zIGhhc2ggb2YgYXBwb2ludG1lbnQgdHlwZXM6CgogICAgJVRpY2tldEFwcG9pbnRtZW50VHlwZXMgPSAoKTsKCj1jdXQKCnN1YiBUaWNrZXRBcHBvaW50bWVudFR5cGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzCiAgICBteSAkVGlja2V0QXBwb2ludG1lbnRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OlRpY2tldEFwcG9pbnRtZW50VHlwZScpCiAgICAgICAgLy8ge307CiAgICByZXR1cm4gaWYgISRUaWNrZXRBcHBvaW50bWVudENvbmZpZzsKCiAgICBteSAlVGlja2V0QXBwb2ludG1lbnRUeXBlczsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIFRZUEU6CiAgICBmb3IgbXkgJFR5cGVLZXkgKCBzb3J0IGtleXMgJXskVGlja2V0QXBwb2ludG1lbnRDb25maWd9ICkgewogICAgICAgIG5leHQgVFlQRSBpZiAhJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fTsKCiAgICAgICAgaWYgKCAkVHlwZUtleSA9fiAvRHluYW1pY0ZpZWxkJC8gKSB7CgogICAgICAgICAgICAjIGdldCBsaXN0IG9mIGFsbCB2YWxpZCBkYXRlIGFuZCBkYXRlL3RpbWUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9IG5lICdEYXRlJyAmJiAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfSBuZSAnRGF0ZVRpbWUnOwoKICAgICAgICAgICAgICAgIG15ICRLZXkgPSBzcHJpbnRmKCAkVGlja2V0QXBwb2ludG1lbnRDb25maWctPnskVHlwZUtleX0tPntLZXl9LCAkRHluYW1pY0ZpZWxkLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICRUaWNrZXRBcHBvaW50bWVudFR5cGVzeyRLZXl9ID0gJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IFRZUEU7CiAgICAgICAgfQoKICAgICAgICAkVGlja2V0QXBwb2ludG1lbnRUeXBlc3sgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9LT57S2V5fSB9ID0KICAgICAgICAgICAgJFRpY2tldEFwcG9pbnRtZW50Q29uZmlnLT57JFR5cGVLZXl9OwogICAgfQoKICAgIHJldHVybiAlVGlja2V0QXBwb2ludG1lbnRUeXBlczsKfQoKPWl0ZW0gVGlja2V0QXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlIHRpY2tldCBhcHBvaW50bWVudChzKS4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBUaWNrZXRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgSUQgaXMga25vd24KICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBBcHBvaW50bWVudCBJRCBpcyBrbm93bgogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFRpY2tldEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSBAQXBwb2ludG1lbnRJRHM7CiAgICBwdXNoIEBBcHBvaW50bWVudElEcywgJFBhcmFte0FwcG9pbnRtZW50SUR9IGlmICRQYXJhbXtBcHBvaW50bWVudElEfTsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXBwb2ludG1lbnQgaWQgaXMgdW5rbm93bgogICAgaWYgKCAhQEFwcG9pbnRtZW50SURzICkgewogICAgICAgIG15ICRTUUwgPSAnCiAgICAgICAgICAgIFNFTEVDVCBhcHBvaW50bWVudF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBteSBAQmluZDsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1J1bGVJRH07CgogICAgICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgICAgICBBTkQgdGlja2V0X2lkID0gPwogICAgICAgICAgICAnOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgICMgZGIgcXVlcnkKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRJRHMsICRSb3dbMF07CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIHRoZSByZWxhdGlvbihzKSBmcm9tIGRhdGFiYXNlCiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkID0gPyBBTkQgcnVsZV9pZCA9ID8KICAgICc7CiAgICBteSBAQmluZDsKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UnVsZUlEfTsKCiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnCiAgICAgICAgICAgIEFORCB0aWNrZXRfaWQgPSA/CiAgICAgICAgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1RpY2tldElEfTsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGdldCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGNsZWFudXAgdGlja2V0IGFwcG9pbnRtZW50cwogICAgQVBQT0lOVE1FTlRfSUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudElEcykgewoKICAgICAgICAjIGNoZWNrIGlmIGFwcG9pbnRtZW50IGV4aXN0cwogICAgICAgIG5leHQgQVBQT0lOVE1FTlRfSUQgaWYgISRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIGFwcG9pbnRtZW50CiAgICAgICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0QWNjZXNzVG9rZW4oKQoKZ2V0IGFjY2VzcyB0b2tlbiBmb3IgdGhlIGNhbGVuZGFyLgoKICAgIG15ICRUb2tlbiA9ICRDYWxlbmRhck9iamVjdC0+R2V0QWNjZXNzVG9rZW4oCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLCAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIENhbGVuZGFySUQKICAgICAgICBVc2VyTG9naW4gID0+ICdhZ2VudC0xJywgICAgICAjIChyZXF1aXJlZCkgVXNlciBsb2dpbgogICAgKTsKCnJldHVybnM6CiAgICAkVG9rZW4gPSAncncnOwoKPWN1dAoKc3ViIEdldEFjY2Vzc1Rva2VuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFVzZXJMb2dpbikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1Qgc2FsdF9zdHJpbmcgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFNhbHRTdHJpbmc7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2FsdFN0cmluZyA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2FsdFN0cmluZzsKCiAgICAjIEVuY29kZSB1c2VyIGxvZ2luIHRvIFVURjggcmVwcmVzZW50YXRpb24sIHNpbmNlIE1ENSBpcyBkZWZpbmVkIG9ubHkgZm9yIHN0cmluZ3Mgb2YgYnl0ZXMuCiAgICAjICAgSWYgbG9naW4gY29udGFpbnMgYSBVbmljb2RlIGNoYXJhY3RlciwgTUQ1IG1pZ2h0IGZhaWwgb3RoZXJ3aXNlLiBQbGVhc2Ugc2VlIGJ1ZyMxMjU5MyBmb3IKICAgICMgICBtb3JlIGluZm9ybWF0aW9uLgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoIFwkUGFyYW17VXNlckxvZ2lufSApOwoKICAgICMgY2FsY3VsYXRlIG1kNSBzdW0KICAgIG15ICRTdHJpbmcgPSAiJFBhcmFte1VzZXJMb2dpbn0tJFNhbHRTdHJpbmciOwogICAgbXkgJE1ENSAgICA9IERpZ2VzdDo6TUQ1LT5uZXcoKS0+YWRkKCRTdHJpbmcpLT5oZXhkaWdlc3QoKTsKCiAgICByZXR1cm4gJE1ENTsKfQoKPWl0ZW0gR2V0VGV4dENvbG9yKCkKCnJldHVybnMgYmVzdCB0ZXh0IGNvbG9yIGZvciBzdXBwbGllZCBiYWNrZ3JvdW5kLCBiYXNlZCBvbiBsdW1pbm9zaXR5IGRpZmZlcmVuY2UgYWxnb3JpdGhtLgoKICAgIG15ICRCZXN0VGV4dENvbG9yID0gJENhbGVuZGFyT2JqZWN0LT5HZXRUZXh0Q29sb3IoCiAgICAgICAgQmFja2dyb3VuZCA9PiAnI0ZGRicsICAgICMgKHJlcXVpcmVkKSBtdXN0IGJlIGluIHZhbGlkIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbgogICAgKTsKCnJldHVybnM6CiAgICAkQmVzdFRleHRDb2xvciA9ICcjMDAwJzsKCj1jdXQKCnN1YiBHZXRUZXh0Q29sb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEJhY2tncm91bmQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjb2xvcgogICAgaWYgKCAhKCAkUGFyYW17QmFja2dyb3VuZH0gPX4gLyNbQS1GMC05XXszLDZ9L2kgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiBoZXhhZGVjaW1hbCBSR0Igbm90YXRpb24sIGVnLiAjRkZGRkZGLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB2YWx1ZSBpcyBjYWNoZWQKICAgIG15ICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdHZXRUZXh0Q29sb3InLAogICAgICAgIEtleSAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgKTsKICAgIHJldHVybiAkRGF0YSBpZiAkRGF0YTsKCiAgICAjIGdldCBSR0IgdmFsdWVzCiAgICBteSBAQmFja2dyb3VuZENvbG9yOwogICAgbXkgJFJHQkhleCA9IHN1YnN0ciggJFBhcmFte0JhY2tncm91bmR9LCAxICk7CgogICAgIyBzaXggY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZyAoZWcuICNGRkZGRkYpCiAgICBpZiAoIGxlbmd0aCAkUkdCSGV4ID09IDYgKSB7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclswXSA9IGhleCBzdWJzdHIoICRSR0JIZXgsIDAsIDIgKTsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzFdID0gaGV4IHN1YnN0ciggJFJHQkhleCwgMiwgMiApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXggc3Vic3RyKCAkUkdCSGV4LCA0LCAyICk7CiAgICB9CgogICAgIyB0aHJlZSBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nIChlZy4gI0ZGRikKICAgIGVsc2lmICggbGVuZ3RoICRSR0JIZXggPT0gMyApIHsKICAgICAgICAkQmFja2dyb3VuZENvbG9yWzBdID0gaGV4KCBzdWJzdHIoICRSR0JIZXgsIDAsIDEgKSAuIHN1YnN0ciggJFJHQkhleCwgMCwgMSApICk7CiAgICAgICAgJEJhY2tncm91bmRDb2xvclsxXSA9IGhleCggc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgLiBzdWJzdHIoICRSR0JIZXgsIDEsIDEgKSApOwogICAgICAgICRCYWNrZ3JvdW5kQ29sb3JbMl0gPSBoZXgoIHN1YnN0ciggJFJHQkhleCwgMiwgMSApIC4gc3Vic3RyKCAkUkdCSGV4LCAxLCAxICkgKTsKICAgIH0KCiAgICAjIGludmFsaWQgaGV4YWRlY2ltYWwgc3RyaW5nCiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0JhY2tncm91bmQgbXVzdCBiZSBpbiB2YWxpZCAzIG9yIDYgY2hhcmFjdGVyIGhleGFkZWNpbWFsIFJHQiBub3RhdGlvbiwgZWcuICNGRkYgb3IgI0ZGRkZGRi4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcHJlZGVmaW5lZCB0ZXh0IGNvbG9ycwogICAgbXkgJVRleHRDb2xvcnMgPSAoCiAgICAgICAgV2hpdGUgPT4gWyAnMjU1JywgJzI1NScsICcyNTUnIF0sCiAgICAgICAgR3JheSAgPT4gWyAnMTI4JywgJzEyOCcsICcxMjgnIF0sCiAgICAgICAgQmxhY2sgPT4gWyAnMCcsICAgJzAnLCAgICcwJyBdLAogICAgKTsKCiAgICAjIGNhbGN1bGF0ZSBiYWNrZ3JvdW5kIGx1bWlub3NpdHkKICAgIG15ICRCYWNrZ3JvdW5kTHVtID0KICAgICAgICAwLjIxMjYgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMF0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjcxNTIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAwLjA3MjIgKiAoICRCYWNrZ3JvdW5kQ29sb3JbMl0gLyAyNTUqKjIuMiApOwoKICAgICMgY2FsY3VsYXRlIGx1bWlub3NpdHkgZGlmZmVyZW5jZQogICAgbXkgJUx1bURpZmY7CiAgICBmb3IgbXkgJFRleHRDb2xvciAoIHNvcnQga2V5cyAlVGV4dENvbG9ycyApIHsKICAgICAgICBteSAkVGV4dEx1bSA9CiAgICAgICAgICAgIDAuMjEyNiAqICggJFRleHRDb2xvcnN7JFRleHRDb2xvcn0tPlswXSAvIDI1NSoqMi4yICkgKwogICAgICAgICAgICAwLjcxNTIgKiAoICRUZXh0Q29sb3JzeyRUZXh0Q29sb3J9LT5bMV0gLyAyNTUqKjIuMiApICsKICAgICAgICAgICAgMC4wNzIyICogKCAkVGV4dENvbG9yc3skVGV4dENvbG9yfS0+WzJdIC8gMjU1KioyLjIgKTsKCiAgICAgICAgaWYgKCAkQmFja2dyb3VuZEx1bSA+ICRUZXh0THVtICkgewogICAgICAgICAgICAkTHVtRGlmZnskVGV4dENvbG9yfSA9ICggJEJhY2tncm91bmRMdW0gKyAwLjA1ICkgLyAoICRUZXh0THVtICsgMC4wNSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEx1bURpZmZ7JFRleHRDb2xvcn0gPSAoICRUZXh0THVtICsgMC4wNSApIC8gKCAkQmFja2dyb3VuZEx1bSArIDAuMDUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWF4aW11bSBsdW1pbm9zaXR5IGRpZmZlcmVuY2UKICAgIG15ICgkTWF4THVtRGlmZikgPSBzb3J0IHsgJGIgPD0+ICRhIH0gdmFsdWVzICVMdW1EaWZmOwogICAgcmV0dXJuIGlmICEkTWF4THVtRGlmZjsKCiAgICAjIGlkZW50aWZ5IGJlc3Qgc3VpdGVkIGNvbG9yCiAgICBteSAoJEJlc3RUZXh0Q29sb3IpID0gZ3JlcCB7ICRMdW1EaWZmeyRffSBlcSAkTWF4THVtRGlmZiB9IGtleXMgJUx1bURpZmY7CiAgICByZXR1cm4gaWYgISRCZXN0VGV4dENvbG9yOwoKICAgICMgY29udmVydCB0byBoZXggc3RyaW5nCiAgICBteSAkVGV4dENvbG9yID0gc3ByaW50ZigKICAgICAgICAnIyVYJVglWCcsCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMF0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMV0sCiAgICAgICAgJFRleHRDb2xvcnN7JEJlc3RUZXh0Q29sb3J9LT5bMl0sCiAgICApOwoKICAgICMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0dldFRleHRDb2xvcicsCiAgICAgICAgS2V5ICAgPT4gJFBhcmFte0JhY2tncm91bmR9LAogICAgICAgIFZhbHVlID0+ICRUZXh0Q29sb3IsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAkVGV4dENvbG9yOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRHZXQoKQoKZ2V0IHRpY2tldCBhcHBvaW50bWVudCBpZCBpZiBleGlzdHMuCgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudEdldCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICk7CgpyZXR1cm5zIGFwcG9pbnRtZW50IElEIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpY2tldElEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBhcHBvaW50bWVudF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHRpY2tldF9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGlja2V0SUR9LCBcJFBhcmFte1J1bGVJRH0sIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRMaXN0KCkKCkdldCBsaXN0IG9mIHRpY2tldCBhcHBvaW50bWVudHMgYmFzZWQgb24gYSBydWxlLgoKICAgIG15ICVBcHBvaW50bWVudHMgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudExpc3QoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBLZXkgICAgICAgID0+ICdUaWNrZXRJRCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJldHVybiByZXN1bHQgd2lsbCBiZSBiYXNlZCBvbiB0aGlzIGtleS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IFRpY2tldElELCBQb3NzaWJsZTogVGlja2V0SUR8QXBwb2ludG1lbnRJRAogICAgKTsKClJldHVybnMgbGlzdCBvZiB0aWNrZXQgYXBwb2ludG1lbnRzLCB3aGVyZSBrZXkgd2lsbCBiZSBlaXRoZXIgVGlja2V0SUQgKGRlZmF1bHQpIG9yIEFwcG9pbnRtZW50SUQ6CgolQXBwb2ludG1lbnRzID0gKAogICAgMSA9PiAxLAogICAgMiA9PiAyLAogICAgLi4uCik7Cgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFJ1bGVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17S2V5fSB8fD0gJ1RpY2tldElEJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgYXBwb2ludG1lbnRfaWQsIHRpY2tldF9pZAogICAgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8gQU5EIHJ1bGVfaWQgPSA/CiAgICAgICAgJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlc3VsdHsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtLZXl9IGVxICdBcHBvaW50bWVudElEJyApIHsKICAgICAgICAlUmVzdWx0ID0gcmV2ZXJzZSAlUmVzdWx0OwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aXRlbSBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlIHRpY2tldCBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+X1RpY2tldEFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBUaWNrZXRJRCAgID0+IDEsCiAgICAgICAgUnVsZUlEICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLAogICAgICAgIFRpdGxlICAgICAgPT4gJ1tUaWNrZXQjMjAxNjA4MjM4MTAwMDAwMTBdIFNvbWUgVGlja2V0IFRpdGxlJywKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA4LTIzIDAwOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA4LTI0IDAwOjAwOjAwJywKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBfVGlja2V0QXBwb2ludG1lbnRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgVGlja2V0SUQgUnVsZUlEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaXRsZX0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICRQYXJhbXtSdWxlSUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICEkQXBwb2ludG1lbnRJRDsKCiAgICAjIHNhdmUgdGhlIHJlbGF0aW9uIGluIGRhdGFiYXNlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGNhbGVuZGFyX2FwcG9pbnRtZW50X3RpY2tldAogICAgICAgICAgICAgICAgKGNhbGVuZGFyX2lkLCB0aWNrZXRfaWQsIGFwcG9pbnRtZW50X2lkLCBydWxlX2lkKQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8pCiAgICAgICAgJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtUaWNrZXRJRH0sIFwkQXBwb2ludG1lbnRJRCwgXCRQYXJhbXtSdWxlSUR9LCBdLAogICAgKTsKfQoKPWl0ZW0gX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlKCkKCnVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2FsZW5kYXJPYmplY3QtPl9UaWNrZXRBcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAxLAogICAgICAgIFJ1bGVJRCAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywKICAgICAgICBUaXRsZSAgICAgICAgID0+ICdbVGlja2V0IzIwMTYwODIzODEwMDAwMDEwXSBTb21lIFRpY2tldCBUaXRsZScsCiAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wOC0yNCAwMDowMDowMCcsCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwuCgo9Y3V0CgpzdWIgX1RpY2tldEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFRpY2tldElEIFJ1bGVJRCBUaXRsZSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCBjdXJyZW50IHRpY2tldCBhcHBvaW50bWVudCBkYXRhCiAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHRpY2tldCBhcHBvaW50bWVudCBkb2VzIG5vdCBleGlzdAogICAgaWYgKCAhJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewoKICAgICAgICAjIHJlbW92ZSB0aGUgcmVsYXRpb24gYXMgd2VsbAogICAgICAgICRTZWxmLT5UaWNrZXRBcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYXBwb2ludG1lbnQKICAgICAgICByZXR1cm4gJFNlbGYtPl9UaWNrZXRBcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb29wIHByb3RlY3Rpb246IHByZXZlbnQgYXBwb2ludG1lbnQgZXZlbnQgbW9kdWxlIGZyb20gcnVubmluZwogICAgJFNlbGYtPnsnX1RpY2tldEFwcG9pbnRtZW50czo6VGlja2V0VXBkYXRlJ30tPnsgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IH0rKzsKCiAgICAjIHVwZGF0ZSB0aWNrZXQgYXBwb2ludG1lbnQKICAgIHJldHVybiAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGl0bGV9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCA9PiAkUGFyYW17UnVsZUlEfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3I7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6VGltZSkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3IgLSBzaWduYXR1cmUgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBzaWduYXR1cmUgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e1JpY2hUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBOb3RpZmljYXRpb25FdmVudCgpCgpyZXBsYWNlIGFsbCBPVFJTIHNtYXJ0IHRhZ3MgaW4gdGhlIG5vdGlmaWNhdGlvbiBib2R5IGFuZCBzdWJqZWN0CgogICAgbXkgJU5vdGlmaWNhdGlvbkV2ZW50ID0gJENhbGVuZGFyVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMTIzLAogICAgICAgIFJlY2lwaWVudCAgICAgPT4gJFVzZXJEYXRhSGFzaFJlZiwgICAgICAgICAgIyBBZ2VudCBkYXRhIGdldCByZXN1bHQKICAgICAgICBOb3RpZmljYXRpb24gID0+ICROb3RpZmljYXRpb25EYXRhSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZpY2F0aW9uRXZlbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5vdGlmaWNhdGlvbiBSZWNpcGllbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZpY2F0aW9ufSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm90aWZpY2F0aW9uIGlzIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIGdldCBzeXN0ZW0gZGVmYXVsdCBsYW5ndWFnZQogICAgbXkgJERlZmF1bHRMYW5ndWFnZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICBteSAkTGFuZ3VhZ2VzID0gWyAkUGFyYW17UmVjaXBpZW50fS0+e1VzZXJMYW5ndWFnZX0sICREZWZhdWx0TGFuZ3VhZ2UsICdlbicgXTsKCiAgICBteSAkTGFuZ3VhZ2U7CiAgICBMQU5HVUFHRToKICAgIGZvciBteSAkSXRlbSAoIEB7JExhbmd1YWdlc30gKSB7CiAgICAgICAgbmV4dCBMQU5HVUFHRSBpZiAhJEl0ZW07CiAgICAgICAgbmV4dCBMQU5HVUFHRSBpZiAhJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRJdGVtfTsKCiAgICAgICAgIyBzZXQgbGFuZ3VhZ2UKICAgICAgICAkTGFuZ3VhZ2UgPSAkSXRlbTsKICAgICAgICBsYXN0IExBTkdVQUdFOwogICAgfQoKICAgICMgaWYgbm8gbGFuZ3VhZ2UsIHRoZW4gdGFrZSB0aGUgZmlyc3Qgb25lIGF2YWlsYWJsZQogICAgaWYgKCAhJExhbmd1YWdlICkgewogICAgICAgIG15IEBOb3RpZmljYXRpb25MYW5ndWFnZXMgPSBzb3J0IGtleXMgJXsgJE5vdGlmaWNhdGlvbntNZXNzYWdlfSB9OwogICAgICAgICRMYW5ndWFnZSA9ICROb3RpZmljYXRpb25MYW5ndWFnZXNbMF07CiAgICB9CgogICAgIyBjb3B5IHRoZSBjb3JyZWN0IGxhbmd1YWdlIG1lc3NhZ2UgYXR0cmlidXRlcyB0byBhIGZsYXQgc3RydWN0dXJlCiAgICBmb3IgbXkgJEF0dHJpYnV0ZSAocXcoU3ViamVjdCBCb2R5IENvbnRlbnRUeXBlKSkgewogICAgICAgICROb3RpZmljYXRpb257JEF0dHJpYnV0ZX0gPSAkTm90aWZpY2F0aW9ue01lc3NhZ2V9LT57JExhbmd1YWdlfS0+eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gbXt0ZXh0XC9odG1sfSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgfQoKICAgICMgZ2V0IGh0bWwgdXRpbHMgb2JqZWN0CiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEhUTUxVdGlsc09iamVjdC0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRIVE1MVXRpbHNPYmplY3QtPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbm90aWZ5IHRleHRzCiAgICBmb3IgbXkgJFRleHQgKHF3KFN1YmplY3QgQm9keSkpIHsKICAgICAgICBpZiAoICEkTm90aWZpY2F0aW9ueyRUZXh0fSApIHsKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbnskVGV4dH0gPSAiTm8gTm90aWZpY2F0aW9uICRUZXh0IGZvciAkUGFyYW17VHlwZX0gZm91bmQhIjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJE5vdGlmaWNhdGlvbntCb2R5fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgICAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICApOwoKICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICA9PiAwLAogICAgICAgIFRleHQgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICBSZWNpcGllbnQgICAgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICApOwoKICAgICMgYWRkIFVSTHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIEhUTUwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVOb3RpZmljYXRpb247Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1jdXQKCnN1YiBfUmVwbGFjZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRleHQgUmljaFRleHQgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIG1haWx0byBsaW5rcwogICAgIyBzaW5jZSB0aGUgc3ViamVjdCBhbmQgYm9keSBvZiB0aG9zZSBtYWlsdG8gbGlua3MgYXJlCiAgICAjIHVyaSBlc2NhcGVkIHdlIGhhdmUgdG8gdXJpIHVuZXNjYXBlIHRoZW0sIHJlcGxhY2UKICAgICMgcG9zc2libGUgcGxhY2Vob2xkZXJzIGFuZCB0aGVuIHJlLXVyaSBlc2NhcGUgdGhlbQogICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgKGhyZWY9Im1haWx0bzpbXlw/XStcPykoW14iXSsiKQogICAgfQogICAgewogICAgICAgIG15ICRNYWlsVG9IcmVmICAgICAgICA9ICQxOwogICAgICAgIG15ICRNYWlsVG9IcmVmQ29udGVudCA9ICQyOwoKICAgICAgICAkTWFpbFRvSHJlZkNvbnRlbnQgPX4gc3sKICAgICAgICAgICAgKCg/OnN1YmplY3R8Ym9keSk9KSguKz8pKCJ8JikKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keVByZWZpeCAgPSAkMTsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50ID0gJDI7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5U3VmZml4ICA9ICQzOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50VW5lc2NhcGVkID0gVVJJOjpFc2NhcGU6OnVyaV91bmVzY2FwZSAkU3ViamVjdE9yQm9keUNvbnRlbnQ7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRleHQgICAgID0+ICRTdWJqZWN0T3JCb2R5Q29udGVudFVuZXNjYXBlZCwKICAgICAgICAgICAgICAgIFJpY2hUZXh0ID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRFc2NhcGVkID0gVVJJOjpFc2NhcGU6OnVyaV9lc2NhcGVfdXRmOCAkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZDsKCiAgICAgICAgICAgICRTdWJqZWN0T3JCb2R5UHJlZml4IC4gJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCAuICRTdWJqZWN0T3JCb2R5U3VmZml4OwogICAgICAgIH1lZ3g7CgogICAgICAgICRNYWlsVG9IcmVmIC4gJE1haWxUb0hyZWZDb250ZW50OwogICAgfWVneDsKCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oXG58XHIpLy9nOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiAgICBteSAlQ2FsZW5kYXI7CiAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgICAgICAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0NhbGVuZGFySUR9ICkgewogICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzcGVjaWFsIHJlcGxhY2UgZnJvbSBzZWNyZXQgY29uZmlnIG9wdGlvbnMKICAgIG15IEBTZWNyZXRDb25maWdPcHRpb25zID0gcXcoCiAgICAgICAgRGF0YWJhc2VQdwogICAgICAgIFNlYXJjaFVzZXJQdwogICAgICAgIFVzZXJQdwogICAgICAgIFNlbmRtYWlsTW9kdWxlOjpBdXRoUGFzc3dvcmQKICAgICAgICBBdXRoTW9kdWxlOjpSYWRpdXM6OlBhc3N3b3JkCiAgICAgICAgUEdQOjpLZXk6OlBhc3N3b3JkCiAgICAgICAgQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OkRCOjpDdXN0b21lclBhc3N3b3JkCiAgICAgICAgQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OlJhZGl1czo6UGFzc3dvcmQKICAgICAgICBQdWJsaWNGcm9udGVuZDo6QXV0aFBhc3N3b3JkCiAgICApOwoKICAgICMgcmVwbGFjZSB0aGUgc2VjcmV0IGNvbmZpZyBvcHRpb25zIGJlZm9yZSB0aGUgbm9ybWFsIGNvbmZpZyBvcHRpb25zCiAgICBmb3IgbXkgJFNlY3JldENvbmZpZ09wdGlvbiAoQFNlY3JldENvbmZpZ09wdGlvbnMpIHsKCiAgICAgICAgbXkgJFRhZyA9ICRTdGFydCAuICdPVFJTX0NPTkZJR18nIC4gJFNlY3JldENvbmZpZ09wdGlvbiAuICRFbmQ7CiAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7JFRhZ317eHh4fWd4OwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgbXkgJFRhZyA9ICRTdGFydCAuICdPVFJTX0NPTkZJR18nOwogICAgJFBhcmFte1RleHR9ID1+IHN7JFRhZyguKz8pJEVuZH17JENvbmZpZ09iamVjdC0+R2V0KCQxKSAvLyAnJ31lZ3g7CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgIG15ICVSZWNpcGllbnQgPSAleyAkUGFyYW17UmVjaXBpZW50fSB8fCB7fSB9OwoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgaWYgKCAhJVJlY2lwaWVudCAmJiAkUGFyYW17UmVjaXBpZW50SUR9ICkgewoKICAgICAgICAlUmVjaXBpZW50ID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtSZWNpcGllbnRJRH0sCiAgICAgICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGEgbG9jYWwgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGdldCB0aW1lem9uZSBvZmZzZXQgZm9yIGN1cnJlbnQgcmVjaXBpZW50CiAgICBteSAkVGltZXpvbmVPZmZzZXRSYXcgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgIFVzZXJJRCA9PiAkUmVjaXBpZW50e1VzZXJJRH0sCiAgICApIHx8IDA7CgogICAgbXkgJFRpbWV6b25lT2Zmc2V0ID0gJFRpbWV6b25lT2Zmc2V0UmF3ICogNjAgKiA2MDsKCiAgICAjIGluc3RhbmNpYXRlIGEgbmV3IGxhbmd1YWdlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYW5ndWFnZQogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkUGFyYW17TGFuZ3VhZ2V9IHx8ICdlbicsCiAgICApOwoKICAgICMgc3VwcG9ydGVkIGFwcG9pbnRtZW50IGZpZWxkcwogICAgbXkgJUFwcG9pbnRtZW50VGFnc1NraXAgPSAoCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUlEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VFeGNsdWRlICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRDb3VudCAgICAgICAgICAgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0ICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lICAgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gMSwKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IDEsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAxLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYSBsb2NhbCB0aW1lIG9iamVjdAogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcHJvY2VzcyBhcHBvaW50bWVudAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgJFRhZyA9ICRTdGFydCAuICdPVFJTX0FQUE9JTlRNRU5UXyc7CgogICAgIyByZXBsYWNlIGFwcG9pbnRtZW50IHRhZ3MKICAgIEFUVFJJQlVURToKICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVBcHBvaW50bWVudCApIHsKCiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRBdHRyaWJ1dGU7CiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgJEFwcG9pbnRtZW50VGFnc1NraXB7JEF0dHJpYnV0ZX07CgogICAgICAgICMgc2V0dXAgYSBuZXcgdGFnIGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUKICAgICAgICBteSAkTWF0Y2hUYWcgPSAkVGFnIC4gdWMgJEF0dHJpYnV0ZTsKCiAgICAgICAgIyBtYXAgTm90aWZpY2F0aW9uVGltZSBhdHRyaWJ1dGUKICAgICAgICBpZiAoICRBdHRyaWJ1dGUgZXEgJ05vdGlmaWNhdGlvbkRhdGUnICkgewogICAgICAgICAgICAkTWF0Y2hUYWcgPSAkVGFnIC4gJ05PVElGSUNBVElPTlRJTUUnOwogICAgICAgIH0KCiAgICAgICAgbXkgJFJlcGxhY2VtZW50ID0gJyc7CgogICAgICAgICMgcHJvY2VzcyBkYXRldGltZSBzdHJpbmdzICh0aW1lc3RhbXBzKQogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dHJpYnV0ZSBlcSAnU3RhcnRUaW1lJwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdFbmRUaW1lJwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdOb3RpZmljYXRpb25EYXRlJwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdDcmVhdGVUaW1lJwogICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdDaGFuZ2VUaW1lJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIHN5c3RlbSB0aW1lIG9mIHRoZSBnaXZlbiB0aW1lc3RhbXAKICAgICAgICAgICAgICAgIG15ICRUYWdTeXN0ZW1UaW1lID0gJFRpbWVPYmplY3QtPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSByZWxhdGVkIHRpbWV6b25lIG9mZnNldAogICAgICAgICAgICAgICAgbXkgJE5ld1RpbWVTdGFtcCA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRUYWdTeXN0ZW1UaW1lICsgJFRpbWV6b25lT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRGF0ZUZvcm1hdCA9ICdEYXRlRm9ybWF0JzsKCiAgICAgICAgICAgICAgICAjIERvIG5vdCBpbmNsdWRlIHRpbWUgY29tcG9uZW50IGZvciBhbGwtZGF5IGFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICMgICBidXQgb25seSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRlcy4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7QWxsRGF5fQogICAgICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dHJpYnV0ZSBlcSAnU3RhcnRUaW1lJwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkQXR0cmlidXRlIGVxICdFbmRUaW1lJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJERhdGVGb3JtYXQgLj0gJ1Nob3J0JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByZXBhcmUgZGF0ZXMgYW5kIHRpbWVzCiAgICAgICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkTGFuZ3VhZ2VPYmplY3QtPkZvcm1hdFRpbWVTdHJpbmcoICROZXdUaW1lU3RhbXAsICREYXRlRm9ybWF0ICkgfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBjcmVhdGVieSBhbmQgY2hhbmdlYnkKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0NyZWF0ZUJ5JyB8fCAkQXR0cmlidXRlIGVxICdDaGFuZ2VCeScgKSB7CgogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIHRlYW0gaWRzCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdUZWFtSUQnICkgewoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaW5zdGFuY2lhdGUgYSBuZXcgdGVhbSBvYmplY3QKICAgICAgICAgICAgbXkgJFRlYW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0tPm5ldygpOwoKICAgICAgICAgICAgIyBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSAocmVhZGFibGUpIHRlYW1zCiAgICAgICAgICAgIG15ICVUZWFtTGlzdCA9ICRUZWFtT2JqZWN0LT5UZWFtTGlzdCgKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUZWFtTGlzdCApOwoKICAgICAgICAgICAgbXkgQFRlYW1OYW1lczsKCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlVGVhbUxpc3QgKSApIHsKCiAgICAgICAgICAgICAgICBURUFNS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtS2V5ICggQHsgJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9IH0gKSB7CgogICAgICAgICAgICAgICAgICAgIG5leHQgVEVBTUtFWSBpZiAhJFRlYW1MaXN0eyRUZWFtS2V5fTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkVGVhbUxpc3R7JFRlYW1LZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFRlYW1OYW1lcyApOwoKICAgICAgICAgICAgIyByZXBsYWNlIHRlYW0gaWRzIHdpdGggYSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiB0ZWFtIG5hbWVzCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9IGpvaW4gJywgJywgQFRlYW1OYW1lczsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyByZXNvdXJjZSBpZHMKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1Jlc291cmNlSUQnICkgewoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICk7CgogICAgICAgICAgICBteSBAVXNlck5hbWVzOwoKICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRBcHBvaW50bWVudHskQXR0cmlidXRlfSB9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlcklEOwoKICAgICAgICAgICAgICAgIG15ICRVc2VyTmFtZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBVU0VSSUQgaWYgISRVc2VyTmFtZTsKCiAgICAgICAgICAgICAgICBwdXNoIEBVc2VyTmFtZXMsICRVc2VyTmFtZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggXEBVc2VyTmFtZXMgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSByZXNvdXJjZSBpZHMgd2l0aCBhIGNvbW1hIHNlcGVyYXRlZCBsaXN0IG9mIHRlYW0gbmFtZXMKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gam9pbiAnLCAnLCBAVXNlck5hbWVzOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGFsbCBkYXkgYW5kIHJlY3VycmluZyB0YWdzCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkQXR0cmlidXRlIGVxICdBbGxEYXknCiAgICAgICAgICAgIHx8ICRBdHRyaWJ1dGUgZXEgJ1JlY3VycmluZycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRTdHJpbmcgPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnTm8nKTsKCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50eyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFRyYW5zbGF0ZWRTdHJpbmcgPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSgnWWVzJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRUcmFuc2xhdGVkU3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGFsbCBvdGhlciBzaW5nbGUgdmFsdWVzCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRBcHBvaW50bWVudHskQXR0cmlidXRlfSApIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICctJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRBcHBvaW50bWVudHskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFJlcGxhY2VtZW50IHx8PSAnJzsKCiAgICAgICAgIyByZXBsYWNlIHRoZSB0YWdzCiAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7JE1hdGNoVGFnJEVuZH17JFJlcGxhY2VtZW50fWVneDsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBwcm9jZXNzIGNhbGVuZGFyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyByZXBsYWNlIGNvbmZpZyBvcHRpb25zCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfQ0FMRU5EQVJfJzsKCiAgICAjIHJlcGxhY2UgYXBwb2ludG1lbnQgdGFncwogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJUNhbGVuZGFyICkgewoKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJEF0dHJpYnV0ZTsKCiAgICAgICAgIyBzZXR1cCBhIG5ldyB0YWcgZm9yIHRoZSBjdXJyZW50IGF0dHJpYnV0ZQogICAgICAgIG15ICRNYXRjaFRhZyA9ICRUYWcgLiB1YyAkQXR0cmlidXRlOwoKICAgICAgICBteSAkUmVwbGFjZW1lbnQgPSAnJzsKCiAgICAgICAgIyBwcm9jZXNzIGRhdGV0aW1lIHN0cmluZ3MgKHRpbWVzdGFtcHMpCiAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdDcmVhdGVUaW1lJyB8fCAkQXR0cmlidXRlIGVxICdDaGFuZ2VUaW1lJyApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBzeXN0ZW0gdGltZSBvZiB0aGUgZ2l2ZW4gdGltZXN0YW1wCiAgICAgICAgICAgIG15ICRUYWdTeXN0ZW1UaW1lID0gJFRpbWVPYmplY3QtPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDYWxlbmRhcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSByZWxhdGVkIHRpbWV6b25lIG9mZnNldAogICAgICAgICAgICBteSAkTmV3VGltZVN0YW1wID0gJFRpbWVPYmplY3QtPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGFnU3lzdGVtVGltZSArICRUaW1lem9uZU9mZnNldCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBkYXRlcyBhbmQgdGltZXMKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJExhbmd1YWdlT2JqZWN0LT5Gb3JtYXRUaW1lU3RyaW5nKCAkTmV3VGltZVN0YW1wLCAnRGF0ZUZvcm1hdCcgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgcHJvY2VzcyBjcmVhdGVieSBhbmQgY2hhbmdlYnkKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ0NyZWF0ZUJ5JyB8fCAkQXR0cmlidXRlIGVxICdDaGFuZ2VCeScgKSB7CgogICAgICAgICAgICAkUmVwbGFjZW1lbnQgPSAkVXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJENhbGVuZGFyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGdyb3VwIGlkCiAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdHcm91cElEJyApIHsKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgdmFsaWQgaWQKICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1ZhbGlkSUQnICkgewoKICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICAgICAgVmFsaWRJRCA9PiAkQ2FsZW5kYXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRSZXBsYWNlbWVudCA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCRSZXBsYWNlbWVudCk7CiAgICAgICAgfQoKICAgICAgICAjIHByb2Nlc3MgYWxsIG90aGVyIHNpbmdsZSB2YWx1ZXMKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJENhbGVuZGFyeyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJy0nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlcGxhY2VtZW50ID0gJENhbGVuZGFyeyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlcGxhY2UgdGhlIHRhZ3MKICAgICAgICAkUGFyYW17VGV4dH0gPX4gc3skTWF0Y2hUYWckRW5kfXskUmVwbGFjZW1lbnR9ZWd4OwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKCiAgICBteSAkSGFzaEdsb2JhbFJlcGxhY2UgPSBzdWIgewogICAgICAgIG15ICggJFRhZywgJUggKSA9IEBfOwoKICAgICAgICAjIEdlbmVyYXRlIG9uZSBzaW5nbGUgbWF0Y2hpbmcgc3RyaW5nIGZvciBhbGwga2V5cyB0byBzYXZlIHBlcmZvcm1hbmNlLgogICAgICAgIG15ICRLZXlzID0gam9pbiAnfCcsIG1hcCB7cXVvdGVtZXRhfSBncmVwIHsgZGVmaW5lZCAkSHskX30gfSBrZXlzICVIOwoKICAgICAgICAjIEFkZCBhbGwga2V5cyBhbHNvIGFzIGxvd2VyY2FzZSB0byBiZSBhYmxlIHRvIG1hdGNoIGNhc2UgaW5zZW5zaXRpdmUsCiAgICAgICAgIyAgIGUuIGcuIDxPVFJTX0NVU1RPTUVSX0Zyb20+IGFuZCA8T1RSU19DVVNUT01FUl9GUk9NPi4KICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlSCApIHsKICAgICAgICAgICAgJEh7IGxjICRLZXkgfSA9ICRIeyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvKD86JFRhZykoJEtleXMpJEVuZC8kSHsgbGMgJDEgfS9pZWc7CiAgICB9OwoKICAgICMgZ2V0IHJlY2lwaWVudCBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UUlNfLi4uCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UUlNfJzsKCiAgICAjIGluY2x1ZGUgbW9yZSByZWFkYWJsZSB0YWcgPE9UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVAogICAgbXkgJFJlY2lwaWVudFRhZyA9ICRTdGFydCAuICdPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfJzsKCiAgICBpZiAoJVJlY2lwaWVudCkgewoKICAgICAgICAjIEhUTUwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVSZWNpcGllbnQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFJlY2lwaWVudHskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgICRSZWNpcGllbnR7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlY2lwaWVudHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRIYXNoR2xvYmFsUmVwbGFjZS0+KCAiJFRhZ3wkUmVjaXBpZW50VGFnIiwgJVJlY2lwaWVudCApOwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFJlY2lwaWVudFRhZy4rPyRFbmQvLS9naTsKCiAgICByZXR1cm4gJFBhcmFte1RleHR9Owp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpFbWFpbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpMYXlvdXRPYmplY3QpCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6UGFyYW1PYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgYmFzZSBxdyhLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkJhc2UpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV2ZW50OjpUcmFuc3BvcnQ6OkVtYWlsIC0gZW1haWwgdHJhbnNwb3J0IGxheWVyIGZvciBhcHBvaW50bWVudCBub3RpZmljYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCk5vdGlmaWNhdGlvbiBldmVudCB0cmFuc3BvcnQgbGF5ZXIuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG5vdGlmaWNhdGlvbiB0cmFuc3BvcnQgb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoJycpOwogICAgbXkgJFRyYW5zcG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6OlRyYW5zcG9ydDo6RW1haWwnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU2VuZE5vdGlmaWNhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIE5vdGlmaWNhdGlvbiBSZWNpcGllbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCAkTmVlZGVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwIGV2ZW50IGRhdGEKICAgICRTZWxmLT57RXZlbnREYXRhfSA9IHVuZGVmOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YQogICAgbXkgJVJlY2lwaWVudCA9ICV7ICRQYXJhbXtSZWNpcGllbnR9IH07CgogICAgcmV0dXJuIGlmICEkUmVjaXBpZW50e1VzZXJFbWFpbH07CiAgICByZXR1cm4gaWYgJFJlY2lwaWVudHtVc2VyRW1haWx9ICF+IC9ALzsKCiAgICBteSAkSXNMb2NhbEFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgQWRkcmVzcyA9PiAkUmVjaXBpZW50e1VzZXJFbWFpbH0sCiAgICApOwoKICAgIHJldHVybiBpZiAkSXNMb2NhbEFkZHJlc3M7CgogICAgIyBjcmVhdGUgbmV3IGFycmF5IHRvIHByZXZlbnQgYXR0YWNobWVudCBncm93dGggKHNlZSBidWcjNTExNCkKICAgIG15IEBBdHRhY2htZW50czsKCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0F0dGFjaG1lbnRzfSApICkgewogICAgICAgIEBBdHRhY2htZW50cyA9IEB7ICRQYXJhbXtBdHRhY2htZW50c30gfTsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uCiAgICBteSAkRnJvbSA9ICRDb25maWdPYmplY3QtPkdldCgnTm90aWZpY2F0aW9uU2VuZGVyTmFtZScpIC4gJyA8JwogICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdOb3RpZmljYXRpb25TZW5kZXJFbWFpbCcpIC4gJz4nOwoKICAgIGlmICggJFBhcmFte05vdGlmaWNhdGlvbn0tPntDb250ZW50VHlwZX0gJiYgJFBhcmFte05vdGlmaWNhdGlvbn0tPntDb250ZW50VHlwZX0gZXEgJ3RleHQvaHRtbCcgKSB7CgogICAgICAgICMgR2V0IGNvbmZpZ3VyZWQgdGVtcGxhdGUgd2l0aCBmYWxsYmFjayB0byBEZWZhdWx0LgogICAgICAgIG15ICRFbWFpbFRlbXBsYXRlID0gJFBhcmFte05vdGlmaWNhdGlvbn0tPntEYXRhfS0+e1RyYW5zcG9ydEVtYWlsVGVtcGxhdGV9LT5bMF0gfHwgJ0RlZmF1bHQnOwoKICAgICAgICBteSAkSG9tZSAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKTsKICAgICAgICBteSAkVGVtcGxhdGVEaXIgICAgICAgPSAiJEhvbWUvS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CiAgICAgICAgbXkgJEN1c3RvbVRlbXBsYXRlRGlyID0gIiRIb21lL0N1c3RvbS9LZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL05vdGlmaWNhdGlvbkV2ZW50L0VtYWlsIjsKCiAgICAgICAgaWYgKCAhLXIgIiRUZW1wbGF0ZURpci8kRW1haWxUZW1wbGF0ZS50dCIgJiYgIS1yICIkQ3VzdG9tVGVtcGxhdGVEaXIvJEVtYWlsVGVtcGxhdGUudHQiICkgewogICAgICAgICAgICAkRW1haWxUZW1wbGF0ZSA9ICdEZWZhdWx0JzsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgSFRNTAogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiTm90aWZpY2F0aW9uRXZlbnQvRW1haWwvJEVtYWlsVGVtcGxhdGUiLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwoKICAgICMgc2VuZCBub3RpZmljYXRpb24KICAgIG15ICRTZW50ID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgIEZyb20gICAgICAgPT4gJEZyb20sCiAgICAgICAgVG8gICAgICAgICA9PiAkUmVjaXBpZW50e1VzZXJFbWFpbH0sCiAgICAgICAgU3ViamVjdCAgICA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgIE1pbWVUeXBlICAgPT4gJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0sCiAgICAgICAgVHlwZSAgICAgICA9PiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSwKICAgICAgICBDaGFyc2V0ICAgID0+ICd1dGYtOCcsCiAgICAgICAgQm9keSAgICAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgIExvb3AgICAgICAgPT4gMSwKICAgICAgICBBdHRhY2htZW50ID0+ICRQYXJhbXtBdHRhY2htZW50c30gfHwgW10sCiAgICApOwoKICAgIGlmICggISRTZW50ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJyROb3RpZmljYXRpb257TmFtZX0nIG5vdGlmaWNhdGlvbiBjb3VsZCBub3QgYmUgc2VudCB0byBhZ2VudCAnJFJlY2lwaWVudHtVc2VyRW1haWx9ICIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9nIGV2ZW50CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgYWdlbnQgJyROb3RpZmljYXRpb257TmFtZX0nIG5vdGlmaWNhdGlvbiB0byAnJFJlY2lwaWVudHtVc2VyRW1haWx9Jy4iLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIEdldFRyYW5zcG9ydFJlY2lwaWVudHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTm90aWZpY2F0aW9uKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBSZWNpcGllbnRzOwoKICAgICMgZ2V0IHJlY2lwaWVudHMgYnkgUmVjaXBpZW50RW1haWwKICAgIGlmICggJFBhcmFte05vdGlmaWNhdGlvbn0tPntEYXRhfS0+e1JlY2lwaWVudEVtYWlsfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0tPlswXSApIHsKICAgICAgICAgICAgbXkgJVJlY2lwaWVudDsKICAgICAgICAgICAgJFJlY2lwaWVudHtSZWFsbmFtZX0gID0gJyc7CiAgICAgICAgICAgICRSZWNpcGllbnR7VHlwZX0gICAgICA9ICdDdXN0b21lcic7CiAgICAgICAgICAgICRSZWNpcGllbnR7VXNlckVtYWlsfSA9ICRQYXJhbXtOb3RpZmljYXRpb259LT57RGF0YX0tPntSZWNpcGllbnRFbWFpbH0tPlswXTsKCiAgICAgICAgICAgICMgY2hlY2sgcmVjaXBpZW50cwogICAgICAgICAgICBpZiAoICRSZWNpcGllbnR7VXNlckVtYWlsfSAmJiAkUmVjaXBpZW50e1VzZXJFbWFpbH0gPX4gL0AvICkgewogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50cywgXCVSZWNpcGllbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBSZWNpcGllbnRzOwp9CgpzdWIgVHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKHF3KFJlY2lwaWVudEVtYWlsKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17RGF0YX0tPnskS2V5fTsKICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkUGFyYW17RGF0YX0tPnskS2V5fS0+WzBdOwogICAgICAgICRQYXJhbXskS2V5fSA9ICRQYXJhbXtEYXRhfS0+eyRLZXl9LT5bMF07CiAgICB9CgogICAgbXkgJEhvbWUgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CiAgICBteSAkVGVtcGxhdGVEaXIgICAgICAgPSAiJEhvbWUvS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9Ob3RpZmljYXRpb25FdmVudC9FbWFpbCI7CiAgICBteSAkQ3VzdG9tVGVtcGxhdGVEaXIgPSAiJEhvbWUvQ3VzdG9tL0tlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvTm90aWZpY2F0aW9uRXZlbnQvRW1haWwiOwoKICAgIG15IEBGaWxlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRUZW1wbGF0ZURpciwKICAgICAgICBGaWx0ZXIgICAgPT4gJyoudHQnLAogICAgKTsKICAgIGlmICggLWQgJEN1c3RvbVRlbXBsYXRlRGlyICkgewogICAgICAgIHB1c2ggQEZpbGVzLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5EaXJlY3RvcnlSZWFkKAogICAgICAgICAgICBEaXJlY3RvcnkgPT4gJEN1c3RvbVRlbXBsYXRlRGlyLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gJyoudHQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBmb3IgZGVkdXBsaWNhdGlvbgogICAgbXkgJVRlbXBsYXRlczsKCiAgICBmb3IgbXkgJEZpbGUgKEBGaWxlcykgewogICAgICAgICRGaWxlID1+IHN7Xi4qLyhbXi9dKylcLnR0fXskMX1zbXhnOwogICAgICAgICRUZW1wbGF0ZXN7JEZpbGV9ID0gJEZpbGU7CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkUGFyYW17VHJhbnNwb3J0RW1haWxUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgPT4gXCVUZW1wbGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1RyYW5zcG9ydEVtYWlsVGVtcGxhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0RhdGF9LT57VHJhbnNwb3J0RW1haWxUZW1wbGF0ZX0sCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgSFRNTAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudFRyYW5zcG9ydEVtYWlsU2V0dGluZ3MnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoR2V0UGFyYW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgUEFSQU1FVEVSOgogICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFJlY2lwaWVudEVtYWlsIE5vdGlmaWNhdGlvbkFydGljbGVUeXBlSUQgVHJhbnNwb3J0RW1haWxUZW1wbGF0ZSkpIHsKICAgICAgICBteSBARGF0YSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICBuZXh0IFBBUkFNRVRFUiBpZiAhQERhdGE7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0RhdGF9LT57JFBhcmFtZXRlcn0gPSBcQERhdGE7CiAgICB9CgogICAgIyBOb3RlOiBFeGFtcGxlIGhvdyB0byBzZXQgZXJyb3JzIGFuZCB1c2UgdGhlbQogICAgIyBvbiB0aGUgbm9ybWFsIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAjICMgc2V0IGVycm9yCiAgICAjICRQYXJhbXtHZXRQYXJhbX0tPnskUGFyYW1ldGVyLidTZXJ2ZXJFcnJvcid9ID0gJ1NlcnZlckVycm9yJzsKCiAgICByZXR1cm4gMTsKfQoKc3ViIElzVXNhYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgaWYgdGhpcyB0cmFuc3BvcnQgaXMgdXNhYmxlIG9uCiAgICAjIHRoaXMgc3BlY2lmaWMgbW9tZW50CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VHJhbnNwb3J0OjpCYXNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6Ok5vdGlmaWNhdGlvbkV2ZW50OjpUcmFuc3BvcnQ6OkJhc2UgLSBjb21tb24gbm90aWZpY2F0aW9uIGV2ZW50IHRyYW5zcG9ydCBmdW5jdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIFNlbmROb3RpZmljYXRpb24oKQoKc2VuZCBhIG5vdGlmaWNhdGlvbiB1c2luZyBhbiBzcGVjaWZpZWQgdHJhbnNwb3J0CgogICAgbXkgJFN1Y2Nlc3MgPSAkVHJhbnNwb3J0T2JqZWN0LT5TZW5kTm90aWZpY2F0aW9uKAogICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIE5vdGlmaWNhdGlvbiA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICBSZWNpcGllbnQgICAgPT4gewogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEyMywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnc29tZSBsb2dpbicsCiAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJ3NvbWUgdGl0bGUnLAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdzb21lIGZpcnN0IG5hbWUnLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdzb21lIGxhc3QgbmFtZScuCiAgICAgICAgICAgICMgLi4uCiAgICAgICAgfSwKICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKcmV0dXJucwoKICAgICRTdWNjZXNzID0gMTsgICAgICAgIyBvciBmYWxzZSBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0Cgo9aXRlbSBHZXRUcmFuc3BvcnRSZWNpcGllbnRzKCkKCmdlbmVyYXRlcyBhIGxpc3Qgb2YgcmVjaXBpZW50cyBleGNsdXNpdmUgZm9yIGEgZGV0ZXJtaW5lZCB0cmFuc3BvcnQsIHRoZSBjb250ZW50IG9mIHRoZSBsaXN0IGlzCnVzdWFsbHkgYW4gYXR0cmlidXRlIG9mIGFuIEFnZW50IG9yIEN1c3RvbWVyIGFuZCBpdCBkZXBlbmRzIG9uIGVhY2ggdHJhbnNwb3J0CgogICAgbXkgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSAkVHJhbnNwb3J0T2JqZWN0LT5HZXRUcmFuc3BvcnRSZWNpcGllbnRzKAogICAgICAgIE5vdGlmaWNhdGlvbiA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICk7CgpyZXR1cm5zOgoKICAgIEBUcmFuc3BvcnRSZWNpcGVudHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBVc2VyRW1haWwgICAgPT4gJ3NvbWUgZW1haWwnLCAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgICAgIFVzZXJGaXNybmFtZSA9PiAnc29tZSBuYW1lJywgICAgICAgICMgb3B0aW9uYWwKICAgICAgICAgICAgIyAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIH0KICAgICk7CgpvcgogICAgQFRyYW5zcG9ydFJlY2lwaWVudHMgPSB1bmRlZjsgICBpbiBjYXNlIG9mIGFuIGVycm9yCgo9Y3V0Cgo9aXRlbSBUcmFuc3BvcnRTZXR0aW5nc0Rpc3BsYXlHZXQoKQoKZ2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBIVE1MIGNvZGUgdG8gZGlzcGxheSBleGNsdXNpdmUgc2V0dGluZ3MgZm9yIGVhY2ggdHJhbnNwb3J0LgoKICAgIG15ICRIVE1MT3V0cHV0ID0gJFRyYW5zcG9ydE9iamVjdC0+VHJhbnNwb3J0U2V0dGluZ3NEaXNwbGF5R2V0KAogICAgICAgIERhdGEgPT4gJE5vdGlmaWNhdGlvbkRhdGFBdHRyaWJ1dGUsICAgICAgICAgICAjIGFzIHJldHJpZXZlZCBmcm9tIEtlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudDo6Tm90aWZpY2F0aW9uR2V0KCkKICAgICk7CgpyZXR1cm5zCgogICAgJEhUTUxPdXB1dCA9ICdzb21lIEhUTUwgY29kZSc7Cgo9Y3V0Cgo9aXRlbSBUcmFuc3BvcnRQYXJhbVNldHRpbmdzR2V0KCkKCmdldHMgc3BlY2lmaWMgcGFyYW1ldGVycyBmcm9tIHRoZSB3ZWIgcmVxdWVzdCBhbmQgcHV0IHRoZW0gYmFjayBpbiB0aGUgR2V0UGFyYW0gYXR0cmlidXRlIHRvIGJlCnNhdmVkIGluIHRoZSBub3RpZmljYXRpb24gYXMgdGhlIHN0YW5kYXJkIHBhcmFtZXRlcnMKCiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPlRyYW5zcG9ydFBhcmFtU2V0dGluZ3NHZXQoCiAgICAgICAgR2V0UGFyYW0gPT4gJFBhcm1IYXNoUmVmLAogICAgKTsKCnJldHVybnMKCiAgICAkU3VjY2VzcyA9IDE7ICAgICAgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhIGZhaWx1cmUKCj1jdXQKCj1pdGVtIElzVXNhYmxlKCk7CgpyZXR1cm5zIGlmIHRoZSB0cmFuc3BvcnQgY2FuIGJlIHVzZWQgaW4gdGhlIHN5c3RlbSBlbnZpcm9ubWVudCwKCiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPklzVXNhYmxlKCk7CgpyZXR1cm5zCgogICAgJFN1Y2Nlc3MgPSAxOyAgICAgICAjIG9yIGZhbHNlCgo9Y3V0Cgo9aXRlbSBHZXRUcmFuc3BvcnRFdmVudERhdGEoKQoKcmV0dXJucyB0aGUgbmVlZGVkIGV2ZW50IGluZm9ybWF0aW9uIGFmdGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHNlbnQKCiAgICBteSAkRXZlbnREYXRhID0gJFRyYW5zcG9ydE9iamVjdC0+IEdldFRyYW5zcG9ydEV2ZW50RGF0YSgpOwoKcmV0dXJuczoKCiAgICAkRXZlbnREYXRhID0gewogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlQWdlbnROb3RpZmljYXRpb24nLCAgICAjIG9yICdBcnRpY2xlQ3VzdG9tZXJOb3RpZmljYXRpb24nCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgPT4gMTIzLAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUcmFuc3BvcnRFdmVudERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntFdmVudERhdGF9IC8vIHt9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBEaWdlc3Q6Ok1ENTsKCnVzZSB2YXJzIHF3KEBJU0EpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQgLSBjYWxlbmRhciBhcHBvaW50bWVudCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGFwcG9pbnRtZW50IGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIEBJU0EgPSBxdygKICAgICAgICBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyCiAgICApOwoKICAgICMgaW5pdCBvZiBldmVudCBoYW5kbGVyCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgPT4gJ0FwcG9pbnRtZW50Q2FsZW5kYXI6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdBcHBvaW50bWVudCc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEFwcG9pbnRtZW50Q3JlYXRlKCkKCmNyZWF0ZXMgYSBuZXcgYXBwb2ludG1lbnQuCgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB2YWxpZCBQYXJlbnRJRCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSB2YWxpZCBDYWxlbmRhcklECiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgID0+ICdqd2lvamktZndqaW8nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHByb3ZpZGUgZGVzaXJlZCBVbmlxdWVJRDsgaWYgdGhlcmUgaXMgYWxyZWFkeSBleGlzdGluZyBBcHBvaW50bWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICB3aXRoIHNhbWUgVW5pcXVlSUQsIHN5c3RlbSB3aWxsIGRlbGV0ZSBpdAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgPT4gWyAxIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCiAgICAgICAgUmVjdXJyaW5nUmF3ICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHNraXAgbG9vcCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cyAoZG8gbm90IGNyZWF0ZSBvY2N1cnJlbmNlcyEpCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICAgID0+ICdEYWlseScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgUmVjdXJyaW5nKSBQb3NzaWJsZSAiRGFpbHkiLCAiV2Vla2x5IiwgIk1vbnRobHkiLCAiWWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgoKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ICAgPT4gWzEsIDMsIDVdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBDdXN0b20gUmVjdXJyaW5nKSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tV2Vla2x5OiAxLU1vbiwgMi1UdWUsLi4uLCA3LVN1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21Nb250aGx5OiAxLTFzdCwgMi0ybmQsLi4sIDMxdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tWWVhcmx5OiAxLUphbiwgMi1GZWIsLi4uLCAxMi1EZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBIb3cgbWFueSBBcHBvaW50bWVudHMgdG8gY3JlYXRlCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJlcGVhdGluZyBpbnRlcnZhbCAoZGVmYXVsdCAxKQogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBVbnRpbCBkYXRlCiAgICAgICAgUmVjdXJyZW5jZUlEICAgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEV4cGVjdGVkIHN0YXJ0IHRpbWUgZm9yIHRoaXMgb2NjdXJyZW5jZQogICAgICAgIFJlY3VycmVuY2VFeGNsdWRlICAgICA9PiBbICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBXaGljaCBzcGVjaWZpYyBvY2N1cnJlbmNlcyB0byBleGNsdWRlCiAgICAgICAgICAgICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgJzIwMTYtMDEtMTEgMDA6MDA6MDAnLAogICAgICAgIF0sCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgID0+ICdyZWxhdGl2ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTm90aWZpY2F0aW9uIGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgIyAob3B0aW9uYWwpIFRpY2tldCBhcHBvaW50bWVudCBydWxlIElEIChmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5ISkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyBwYXJlbnQgQXBwb2ludG1lbnRJRCBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBBcHBvaW50bWVudENyZWF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwoKICAgICMgaWYgUmVjdXJyaW5nIGlzIHByb3ZpZGVkLCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSBwcmVzZW50CiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICBteSBAUmVjdXJyZW5jZVR5cGVzID0gKAogICAgICAgICAgICAiRGFpbHkiLCAgICAgICAiV2Vla2x5IiwgICAgICAgIk1vbnRobHkiLCAgICAgICAiWWVhcmx5IiwKICAgICAgICAgICAgIkN1c3RvbURhaWx5IiwgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17UmVjdXJyZW5jZVR5cGV9CiAgICAgICAgICAgIHx8ICFncmVwIHsgJF8gZXEgJFBhcmFte1JlY3VycmVuY2VUeXBlfSB9IEBSZWN1cnJlbmNlVHlwZXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VUeXBlIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICEkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VGcmVxdWVuY3kgbmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHw9IDE7CgogICAgaWYgKCAkUGFyYW17VW5pcXVlSUR9ICYmICEkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgVW5pcXVlSUQgICA9PiAkUGFyYW17VW5pcXVlSUR9LAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBhcHBvaW50bWVudCB3aXRoIHNhbWUgVW5pcXVlSUQKICAgICAgICBpZiAoICVBcHBvaW50bWVudCAmJiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBQYXJlbnRJRAogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICYmICFJc0ludGVnZXIoICRQYXJhbXtQYXJlbnRJRH0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBhcmVudElEIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFN0YXJ0VGltZQogICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgU3RhcnRUaW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBVbmlxdWVJRAogICAgaWYgKCAhJFBhcmFte1VuaXF1ZUlEfSApIHsKICAgICAgICAkUGFyYW17VW5pcXVlSUR9ID0gJFNlbGYtPkdldFVuaXF1ZUlEKAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBFbmRUaW1lCiAgICBteSAkRW5kVGltZVZhbGlkID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVWYWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRW5kVGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYXJyYXkgcmVmcwogICAgbXkgJUFycmF5czsKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhUZWFtSUQgUmVzb3VyY2VJRCBSZWN1cnJlbmNlRnJlcXVlbmN5IFJlY3VycmVuY2VFeGNsdWRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiBAeyAkUGFyYW17JFBhcmFtZXRlcn0gLy8gW10gfSApIHsKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbm90IEFSUkFZUkVGISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17JFBhcmFtZXRlcn0gfTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgQEFycmF5ID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAQXJyYXk7CgogICAgICAgICAgICAkQXJyYXlzeyRQYXJhbWV0ZXJ9ID0gam9pbiggJywnLCBAQXJyYXkgKSBpZiBAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbnVtYmVycwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFJlY3VycmluZyBSZWN1cnJlbmNlQ291bnQgUmVjdXJyZW5jZUludGVydmFsKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUmVjdXJyZW5jZVVudGlsCiAgICBpZiAoICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAjIHVzdWFsbHkgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgPSAwLiBJbiB0aGlzIGNhc2UsIHRha2UgdGltZSBmcm9tIFN0YXJ0VGltZQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpLT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICB8fCAkU3RhcnRUaW1lU3lzdGVtID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyBwYXJlbnQgSUQgc3VwcGxpZWQKICAgIG15ICRQYXJlbnRJRENvbCA9IG15ICRQYXJlbnRJRFZhbCA9ICcnOwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRQYXJlbnRJRENvbCA9ICdwYXJlbnRfaWQsJzsKICAgICAgICAkUGFyZW50SURWYWwgPSAnPywnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17UGFyZW50SUR9OwoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCByZWN1cnJpbmcgZmllbGRzCiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJpbmd9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VVbnRpbH07CiAgICB9CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17VGl0bGV9LCBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICBcJFBhcmFte0xvY2F0aW9ufSwgXCRQYXJhbXtTdGFydFRpbWV9LCAgIFwkUGFyYW17RW5kVGltZX0sICAgXCRQYXJhbXtBbGxEYXl9LAogICAgICAgIFwkQXJyYXlze1RlYW1JRH0sICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgXCRQYXJhbXtSZWN1cnJpbmd9LCBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSwKICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlSUR9LCAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VFeGNsdWRlfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkRhdGV9LCAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH07CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAoJFBhcmVudElEQ29sIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieSkKICAgICAgICBWQUxVRVMgKCRQYXJlbnRJRFZhbCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pCiAgICAiOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgIyByZXR1cm4gcGFyZW50IGlkIGZvciBhcHBvaW50bWVudCBvY2N1cnJlbmNlcwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRBcHBvaW50bWVudElEID0gJFBhcmFte1BhcmVudElEfTsKICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBpZCBmb3IgcGFyZW50IGFwcG9pbnRtZW50CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFNFTEVDVCBpZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQ9PyBBTkQgcGFyZW50X2lkIElTIE5VTEwKICAgICAgICAgICAgJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBpZiB0aGVyZSBpcyBub3QgYXBwb2ludG1lbnQgY3JlYXRlZAogICAgICAgIGlmICggISRBcHBvaW50bWVudElEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IGdldCBBcHBvaW50bWVudElEIGZyb20gSU5TRVJUIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSAmJiAhJFBhcmFte1JlY3VycmluZ1Jhd30gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICApOwogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnRDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aXRlbSBBcHBvaW50bWVudExpc3QoKQoKZ2V0IGEgaGFzaCBvZiBBcHBvaW50bWVudHMuCgogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRpdGxlLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBkZXNjcmlwdGlvbiwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgbG9jYXRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRlYW0KICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSByZXNvdXJjZQogICAgICAgIFJlc3VsdCAgICAgICAgICAgICAgPT4gJ0hBU0gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCksIEhBU0h8QVJSQVkKICAgICk7CgpyZXR1cm5zIGFuIGFycmF5IG9mIGhhc2hlcyB3aXRoIHNlbGVjdCBBcHBvaW50bWVudCBkYXRhIG9yIHNpbXBsZSBhcnJheSBvZiBBcHBvaW50bWVudElEczoKClJlc3VsdCA9PiAnSEFTSCc6CgogICAgQEFwcG9pbnRtZW50cyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmluZyAocGFyZW50KSBhcHBvaW50bWVudHMgb25seQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMgb25seQogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE4MDAwMC1BNzhCNTdAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgPT4gJzIwMTYtMDEtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICBUZWFtSUQgICAgICAgID0+IFsgMSBdLAogICAgICAgICAgICBSZXNvdXJjZUlEICAgID0+IFsgMSwgMyBdLAogICAgICAgICAgICBBbGxEYXkgICAgICAgID0+IDAsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUZWFtSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMSwgMyBdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjEwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgICAgICAgICAgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgICAgIyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5IQogICAgICAgIH0sCiAgICAgICAgLi4uCiAgICBdOwoKUmVzdWx0ID0+ICdBUlJBWSc6CgogICAgQEFwcG9pbnRtZW50cyA9IFsgMSwgMiwgLi4uIF0KCj1jdXQKCnN1YiBBcHBvaW50bWVudExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBvdXRwdXQgYXJyYXkgb2YgaGFzaGVzIGJ5IGRlZmF1bHQKICAgICRQYXJhbXtSZXN1bHR9ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0hBU0gnOwoKICAgICMgY2FjaGUga2V5cwogICAgbXkgJENhY2hlVHlwZSAgICAgICAgPSAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkUGFyYW17Q2FsZW5kYXJJRH07CiAgICBteSAkQ2FjaGVLZXlUaXRsZSAgICA9ICRQYXJhbXtUaXRsZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlEZXNjICAgICA9ICRQYXJhbXtEZXNjcmlwdGlvbn0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlMb2NhdGlvbiA9ICRQYXJhbXtMb2NhdGlvbn0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlTdGFydCAgICA9ICRQYXJhbXtTdGFydFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgICAgPSAkUGFyYW17RW5kVGltZX0gfHwgJ2FueSc7CiAgICBteSAkQ2FjaGVLZXlUZWFtICAgICA9ICRQYXJhbXtUZWFtSUR9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5UmVzb3VyY2UgPSAkUGFyYW17UmVzb3VyY2VJRH0gfHwgJ2FueSc7CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte1RpdGxlfSA9fiAvXltcKl0rJC8gKSB7CiAgICAgICAgJENhY2hlS2V5VGl0bGUgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17RGVzY3JpcHRpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleURlc2MgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17TG9jYXRpb259ICYmICRQYXJhbXtMb2NhdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleUxvY2F0aW9uID0gJ2FueSc7CiAgICB9CgogICAgbXkgJENhY2hlS2V5CiAgICAgICAgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kUGFyYW17UmVzdWx0fSI7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gQHskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZVN5c3RlbSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte1N0YXJ0VGltZX0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lU3lzdGVtICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFBhcmFte0VuZFRpbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lU3lzdGVtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIHRlYW1faWQsIHJlc291cmNlX2lkLCBhbGxfZGF5LCByZWN1cnJpbmcsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQ9PwogICAgJzsKCiAgICBteSBAQmluZDsKCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9OwoKICAgICMgRmlsdGVyIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQgbG9jYXRpb24gZmllbGRzIGJ5IHVzaW5nIFF1ZXJ5Q29uZGl0aW9uIG1ldGhvZCwgd2hpY2ggd2lsbAogICAgIyAgIHJldHVybiBiYWNrZW5kIHNwZWNpZmljIFNRTCBzdGF0ZW1lbnRzIGluIG9yZGVyIHRvIHByb3ZpZGUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBhbmQKICAgICMgICB3aWxkY2FyZCBzdXBwb3J0LgogICAgRklMVEVSOgogICAgZm9yIG15ICRGaWx0ZXIgKHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uKSkgewogICAgICAgIG5leHQgRklMVEVSIGlmICEkUGFyYW17JEZpbHRlcn07CiAgICAgICAgJFNRTCAuPSAnIEFORCAnIC4gJERCT2JqZWN0LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+IGxjICRGaWx0ZXIsCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17JEZpbHRlcn0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCA9PiAnKicsCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCA9PiAnKicsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCAoCiAgICAgICAgICAgIChzdGFydF90aW1lID49ID8gQU5EIHN0YXJ0X3RpbWUgPCA/KSBPUgogICAgICAgICAgICAoZW5kX3RpbWUgPiA/IEFORCBlbmRfdGltZSA8PSA/KSBPUgogICAgICAgICAgICAoc3RhcnRfdGltZSA8PSA/IEFORCBlbmRfdGltZSA+PSA/KQogICAgICAgICkgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAhJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIGVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgc3RhcnRfdGltZSA8PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgaWQgQVNDJzsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBSZXN1bHQ7CgogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggJywnLCAkUm93WzldIC8vICcnICk7CiAgICAgICAgaWYgKCAkUGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgIWdyZXAgeyAkXyA9PSAkUGFyYW17VGVhbUlEfSB9IEBUZWFtSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgJFJvd1sxMF0gPSAkUm93WzEwXSA/ICRSb3dbMTBdIDogMDsKICAgICAgICBteSBAUmVzb3VyY2VJRCA9ICRSb3dbMTBdID1+IC8sLyA/IHNwbGl0KCAnLCcsICRSb3dbMTBdICkgOiAoICRSb3dbMTBdICk7CiAgICAgICAgaWYgKCAkUGFyYW17UmVzb3VyY2VJRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1Jlc291cmNlSUR9IH0gQFJlc291cmNlSUQ7CiAgICAgICAgfQoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzddLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTJdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTNdIHx8ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTRdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTVdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRSb3dbMTZdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRSb3dbMTddLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRSb3dbMThdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRSb3dbMTldIHx8ICcnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICRSb3dbMjBdLAogICAgICAgICk7CiAgICAgICAgcHVzaCBAUmVzdWx0LCBcJUFwcG9pbnRtZW50OwogICAgfQoKICAgICMgaWYgUmVzdWx0IHdhcyBBUlJBWSwgb3V0cHV0IG9ubHkgSURzCiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgQFJlc3VsdExpc3Q7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQFJlc3VsdCkgewogICAgICAgICAgICBwdXNoIEBSZXN1bHRMaXN0LCAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfTsKICAgICAgICB9CiAgICAgICAgQFJlc3VsdCA9IEBSZXN1bHRMaXN0OwogICAgfQoKICAgICMgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBAUmVzdWx0Owp9Cgo9aXRlbSBBcHBvaW50bWVudERheXMoKQoKZ2V0IGEgaGFzaCBvZiBkYXlzIHdpdGggQXBwb2ludG1lbnRzIGluIGFsbCB1c2VyIGNhbGVuZGFycy4KCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgc3RhcnQgZGF0ZQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGVuZCBkYXRlCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBVc2VySUQKICAgICk7CgpyZXR1cm5zIGEgaGFzaCB3aXRoIGRheXMgYXMga2V5cyBhbmQgbnVtYmVyIG9mIEFwcG9pbnRtZW50cyBhcyB2YWx1ZXM6CgogICAgJUFwcG9pbnRtZW50RGF5cyA9IHsKICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAnMjAxNi0wMS0xMycgPT4gMiwKICAgICAgICAnMjAxNi0wMS0zMCcgPT4gMSwKICAgIH07Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREYXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlS2V5U3RhcnQgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgID0gJFBhcmFte0VuZFRpbWV9IHx8ICdhbnknOwoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVWYWxpZCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdGFydFRpbWVWYWxpZCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZVZhbGlkID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRFbmRUaW1lVmFsaWQgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICIkQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQiLAogICAgKTsKCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JERhdGF9OwogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSAlR3JvdXBMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICk7CiAgICBteSBAR3JvdXBJRHMgPSBzb3J0IGtleXMgJUdyb3VwTGlzdDsKCiAgICBteSAkU1FMID0gIgogICAgICAgIFNFTEVDVCBjYS5zdGFydF90aW1lLCBjYS5lbmRfdGltZQogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgY2EKICAgICAgICBKT0lOIGNhbGVuZGFyIGMgT04gY2EuY2FsZW5kYXJfaWQgPSBjLmlkCiAgICAgICAgV0hFUkUgYy5ncm91cF9pZCBJTiAoICR7XChqb2luICcsICcsIEBHcm91cElEcyl9ICkKICAgICI7CgogICAgbXkgQEJpbmQ7CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCAoCiAgICAgICAgICAgIChjYS5zdGFydF90aW1lID49ID8gQU5EIGNhLnN0YXJ0X3RpbWUgPCA/KSBPUgogICAgICAgICAgICAoY2EuZW5kX3RpbWUgPiA/IEFORCBjYS5lbmRfdGltZSA8PSA/KSBPUgogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA8PSA/IEFORCBjYS5lbmRfdGltZSA+PSA/KQogICAgICAgICkgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAhJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgY2EuZW5kX3RpbWUgPj0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggISRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLnN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgY2EuaWQgQVNDJzsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICggJFN0YXJ0VGltZSwgJEVuZFRpbWUsICRTdGFydFRpbWVTeXN0ZW0sICRFbmRUaW1lU3lzdGVtICk7CgogICAgICAgICMgU3RhcnRUaW1lCiAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF0gbHQgJFBhcmFte1N0YXJ0VGltZX0gPyAkUGFyYW17U3RhcnRUaW1lfSA6ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgRW5kVGltZQogICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ICkgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV0gZ3QgJFBhcmFte0VuZFRpbWV9ID8gJFBhcmFte0VuZFRpbWV9IDogJFJvd1sxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHN5c3RlbSB0aW1lcwogICAgICAgICRTdGFydFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgZm9yICgKICAgICAgICAgICAgbXkgJExvb3BTeXN0ZW1UaW1lID0gJFN0YXJ0VGltZVN5c3RlbTsKICAgICAgICAgICAgJExvb3BTeXN0ZW1UaW1lIDwgJEVuZFRpbWVTeXN0ZW07CiAgICAgICAgICAgICRMb29wU3lzdGVtVGltZSArPSA2MCAqIDYwICogMjQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJExvb3BUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRMb29wU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMb29wVGltZSA9fiBzL1xzLio/JC8vZ3NtOwoKICAgICAgICAgICAgaWYgKCAkUmVzdWx0eyRMb29wVGltZX0gKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7JExvb3BUaW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICAgICBWYWx1ZSA9PiBcJVJlc3VsdCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIEFwcG9pbnRtZW50R2V0KCkKCmdldCBBcHBvaW50bWVudC4KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLCAjIChyZXF1aXJlZCkgd2lsbCByZXR1cm4gb25seSBwYXJlbnQgZm9yIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgYSBoYXNoOgogICAgJUFwcG9pbnRtZW50ID0gKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgID0+IFsKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDowMCcsCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRDb3VudCAgICAgICA9PiAnMTInLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgICAgICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICApOwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte0FwcG9pbnRtZW50SUR9CiAgICAgICAgJiYgISggJFBhcmFte1VuaXF1ZUlEfSAmJiAkUGFyYW17Q2FsZW5kYXJJRH0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQXBwb2ludG1lbnRJRCBvciBVbmlxdWVJRCBhbmQgQ2FsZW5kYXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICREYXRhOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSBAQmluZDsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieQogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRQogICAgJzsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkU1FMIC49ICdpZD0/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJ3VuaXF1ZV9pZD0/IEFORCBjYWxlbmRhcl9pZD0/IEFORCBwYXJlbnRfaWQgSVMgTlVMTCAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggJywnLCAkUm93WzEwXSAvLyAnJyApOwoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgbXkgQFJlc291cmNlSUQgPSBzcGxpdCggJywnLCAkUm93WzExXSAvLyAnMCcgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGZyZXF1ZW5jeQogICAgICAgIG15IEBSZWN1cnJlbmNlRnJlcXVlbmN5ID0gJFJvd1sxNF0gPyBzcGxpdCggJywnLCAkUm93WzE0XSApIDogdW5kZWY7CgogICAgICAgICMgcmVjdXJyZW5jZSBleGNsdWRlCiAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gJFJvd1sxOV0gPyBzcGxpdCggJywnLCAkUm93WzE5XSApIDogdW5kZWY7CgogICAgICAgICRSZXN1bHR7QXBwb2ludG1lbnRJRH0gICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRSZXN1bHR7UGFyZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRSZXN1bHR7Q2FsZW5kYXJJRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRSZXN1bHR7VW5pcXVlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICRSZXN1bHR7VGl0bGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzRdOwogICAgICAgICRSZXN1bHR7RGVzY3JpcHRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzVdOwogICAgICAgICRSZXN1bHR7TG9jYXRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICRSZXN1bHR7U3RhcnRUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzddOwogICAgICAgICRSZXN1bHR7RW5kVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzhdOwogICAgICAgICRSZXN1bHR7QWxsRGF5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgICRSZXN1bHR7VGVhbUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcQFRlYW1JRDsKICAgICAgICAkUmVzdWx0e1Jlc291cmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBSZXNvdXJjZUlEOwogICAgICAgICRSZXN1bHR7UmVjdXJyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VUeXBlfSAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRnJlcXVlbmN5fSAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUZyZXF1ZW5jeTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VDb3VudH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxNV07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTZdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZVVudGlsfSAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE3XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VJRH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxOF07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRXhjbHVkZX0gICAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25EYXRlfSAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjBdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICAgICAgICAgICAgICAgICAgPSAkUm93WzIxXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbX0gICAgICAgICAgICAgICAgICAgID0gJFJvd1syMl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gICA9ICRSb3dbMjNdIHx8IDA7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9ICAgICAgICA9ICRSb3dbMjRdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gPSAkUm93WzI1XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1syNl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gICAgICAgICAgICAgICA9ICRSb3dbMjddOwogICAgICAgICRSZXN1bHR7Q3JlYXRlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzI4XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOV07CiAgICAgICAgJFJlc3VsdHtDaGFuZ2VUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzBdOwogICAgICAgICRSZXN1bHR7Q2hhbmdlQnl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMxXTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjYWNoZQogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1pdGVtIEFwcG9pbnRtZW50VXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBDYWxlbmRhcklECiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpdGxlCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsICAgICAgICAgIyAob3B0aW9uYWwpIERlc2NyaXB0aW9uCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIExvY2F0aW9uCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERlZmF1bHQgMAogICAgICAgIFRlYW0gICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICA9PiBbIDEsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmbGFnIHRoZSBhcHBvaW50bWVudCBhcyByZWN1cnJpbmcgKHBhcmVudCBvbmx5ISkKCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICAgID0+ICdEYWlseScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgUmVjdXJyaW5nKSBQb3NzaWJsZSAiRGFpbHkiLCAiV2Vla2x5IiwgIk1vbnRobHkiLCAiWWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgoKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBDdXN0b20gUmVjdXJyaW5nKSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tV2Vla2x5OiAxLU1vbiwgMi1UdWUsLi4uLCA3LVN1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21Nb250aGx5OiAxLUphbiwgMi1GZWIsLi4uLCAxMi1EZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4uLgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBIb3cgbWFueSBBcHBvaW50bWVudHMgdG8gY3JlYXRlCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFJlcGVhdGluZyBpbnRlcnZhbCAoZGVmYXVsdCAxKQogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgICA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBVbnRpbCBkYXRlCiAgICAgICAgTm90aWZpY2F0aW9uVGltZSAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgID0+ICdyZWxhdGl2ZScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTm90aWZpY2F0aW9uIGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgIyAob3B0aW9uYWwpIFRpY2tldCBhcHBvaW50bWVudCBydWxlIElEIChmb3IgdGlja2V0IGFwcG9pbnRtZW50cyBvbmx5ISkKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVXNlcklECiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudFVwZGF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIENhbGVuZGFySUQgVGl0bGUgU3RhcnRUaW1lIEVuZFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgICMgY2hlY2sgU3RhcnRUaW1lCiAgICBteSAkU3RhcnRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lU3lzdGVtICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhcnRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIEVuZFRpbWUKICAgIG15ICRFbmRUaW1lU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVTeXN0ZW0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyB1c3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUKICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUmVjdXJyZW5jZVVudGlsU3lzdGVtCiAgICAgICAgICAgIHx8ICRTdGFydFRpbWVTeXN0ZW0gPiAkUmVjdXJyZW5jZVVudGlsU3lzdGVtCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVW50aWwgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByZXZpb3VzIENhbGVuZGFySUQKICAgIG15ICRQcmV2aW91c0NhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzZXQgcmVjdXJyZW5jZSBleGNsdWRlIGxpc3QKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIGdldCBSZWN1cnJlbmNlSUQKICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHVzZSBleGNsdWRlIGxpc3QgdG8gZmxhZyB0aGUgcmVjdXJyaW5nIG9jY3VycmVuY2UgYXMgdXBkYXRlZAogICAgaWYgKCRSZWN1cnJlbmNlSUQpIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoJFJlY3VycmVuY2VJRCk7CiAgICB9CgogICAgIyByZXNldCBleGNsdWRlIGxpc3QgaWYgcmVjdXJyZW5jZSBpcyB0dXJuZWQgb2ZmCiAgICBlbHNpZiAoICEkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoKTsKICAgIH0KCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhCiAgICBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApIHx8IHVuZGVmOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHJlY3VycmVkIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHJlY3VycmluZyBBcHBvaW50bWVudCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVAogICAgICAgICAgICBjYWxlbmRhcl9pZD0/LCB0aXRsZT0/LCBkZXNjcmlwdGlvbj0/LCBsb2NhdGlvbj0/LCBzdGFydF90aW1lPT8sIGVuZF90aW1lPT8sIGFsbF9kYXk9PywKICAgICAgICAgICAgdGVhbV9pZD0/LCByZXNvdXJjZV9pZD0/LCByZWN1cnJpbmc9PywgcmVjdXJfdHlwZT0/LCByZWN1cl9mcmVxPT8sIHJlY3VyX2NvdW50PT8sCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsPT8sIHJlY3VyX3VudGlsPT8sIHJlY3VyX2V4Y2x1ZGU9Pywgbm90aWZ5X3RpbWU9Pywgbm90aWZ5X3RlbXBsYXRlPT8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b209Pywgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50PT8sIG5vdGlmeV9jdXN0b21fdW5pdD0/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQ9Pywgbm90aWZ5X2N1c3RvbV9kYXRlPT8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkPT8sCiAgICAgICAgICAgIGNoYW5nZV90aW1lPWN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnk9PwogICAgICAgIFdIRVJFIGlkPT8KICAgICc7CgogICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17VGl0bGV9LCAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtBbGxEYXl9LCAgICAgIFwkQXJyYXlze1RlYW1JRH0sCiAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICBcJFBhcmFte1JlY3VycmluZ30sICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVR5cGV9LAogICAgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgXCRSZWN1cnJlbmNlRXhjbHVkZSwgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBhZGQgcmVjdXJyZWQgYXBwb2ludG1lbnRzIGFnYWluCiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBBcHBvaW50bWVudCA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgbXkgQENhbGVuZGFySURzID0gKCAkUGFyYW17Q2FsZW5kYXJJRH0gKTsKICAgIHB1c2ggQENhbGVuZGFySURzLCAkUHJldmlvdXNDYWxlbmRhcklEIGlmICRQcmV2aW91c0NhbGVuZGFySUQgbmUgJFBhcmFte0NhbGVuZGFySUR9OwogICAgZm9yIG15ICRDYWxlbmRhcklEIChAQ2FsZW5kYXJJRHMpIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJENhbGVuZGFySUQsCiAgICAgICAgKTsKICAgIH0KICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50VXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudERlbGV0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBDYWxlbmRhcklECiAgICBteSAkQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHVzZXIncyBwZXJtaXNzaW9ucyBmb3IgdGhpcyBjYWxlbmRhcgogICAgbXkgJFBlcm1pc3Npb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQFJlcXVpcmVkUGVybWlzc2lvbnMgPSAoICdjcmVhdGUnLCAncncnICk7CgogICAgaWYgKCAhZ3JlcCB7ICRQZXJtaXNzaW9uIGVxICRfIH0gQFJlcXVpcmVkUGVybWlzc2lvbnMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyKCRQYXJhbXtVc2VySUR9KSBoYXMgbm8gcGVybWlzc2lvbiB0byBkZWxldGUgQXBwb2ludG1lbnQoJFBhcmFte0FwcG9pbnRtZW50SUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzYXZlIGV4Y2x1c2lvbiBpbmZvIHRvIHBhcmVudCBhcHBvaW50bWVudAogICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9ICkgewogICAgICAgICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdFeGNsdWRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSwKICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnRzIGNvdWxkblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBpZD0/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50RGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKCkKCmRlbGV0ZXMgYSBzaW5nbGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50IG9jY3VycmVuY2UuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgKICAgICAgICBVbmlxdWVJRCAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgICAgIyAocmVxdWlyZWQpCiAgICAgICAgUmVjdXJyZW5jZUlEID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bDoKICAgICRTdWNjZXNzID0gMTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVuaXF1ZUlEIENhbGVuZGFySUQgUmVjdXJyZW5jZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgIFdIRVJFIHVuaXF1ZV9pZD0/IEFORCBjYWxlbmRhcl9pZD0/IEFORCByZWN1cl9pZD0/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1JlY3VycmVuY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgIyBnZXQgYWRkaXRpb25hbCBpbmZvCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuIGlmICElQXBwb2ludG1lbnQ7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICAgPT4gJ0RFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nLAogICAgICAgIEJpbmQgID0+IFsgXCRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNhY2hlIG9iamVjdAogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0VW5pcXVlSUQoKQoKcmV0dXJucyBVbmlxdWVJRCBjb250YWluaW5nIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUsIHJhbmRvbSBoYXNoIGFuZCBzeXN0ZW0gRlFETi4KCiAgICBteSAkVW5pcXVlSUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkdldFVuaXF1ZUlEKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBTdGFydFRpbWUgID0+IDE0NTE2MDY0MDAsICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCiAgICAkVW5pcXVlSUQgPSAnJzsKCj1jdXQKCnN1YiBHZXRVbmlxdWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBTdGFydFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FsY3VsYXRlIGEgaGFzaAogICAgbXkgJFJhbmRvbVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKCBMZW5ndGggPT4gMzIgKTsKICAgIG15ICRTdHJpbmcgICAgICAgPSAiJFBhcmFte0NhbGVuZGFySUR9LSRSYW5kb21TdHJpbmctJFBhcmFte1VzZXJJRH0iOwogICAgbXkgJERpZ2VzdCAgICAgICA9IHVucGFjayggJ04nLCBEaWdlc3Q6Ok1ENS0+bmV3KCktPmFkZCgkU3RyaW5nKS0+ZGlnZXN0KCkgKTsKICAgIG15ICREaWdlc3RIZXggICAgPSBzcHJpbnRmKCAnJXgnLCAkRGlnZXN0ICk7CiAgICBteSAkSGFzaCAgICAgICAgID0gdWMoIHNwcmludGYoICIlLjZzIiwgJERpZ2VzdEhleCApICk7CgogICAgIyBwcmVwYXJlIHN0YXJ0IHRpbWVzdGFtcCBmb3IgVW5pcXVlSUQKICAgIG15ICRTdGFydFRpbWVTdHJnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKS0+VGltZXN0YW1wR2V0KAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICApOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9bLTpdLy9nOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9ccy9ULzsKCiAgICAjIGdldCBzeXN0ZW0gRlFETgogICAgbXkgJEZRRE4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKCiAgICAjIHJldHVybiBVbmlxdWVJRAogICAgcmV0dXJuICIkU3RhcnRUaW1lU3RyZy0kSGFzaFxAJEZRRE4iOwp9Cgo9aXRlbSBBcHBvaW50bWVudFVwY29taW5nR2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudCBzdGFydCBvciBlbmQuCgogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAnMjAxNi0wOC0wMiAwMzo1OTowMCcsICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgKTsKCnJldHVybnM6CgogICAgQXBwb2ludG1lbnQgZGF0YSBvZiBBcHBvaW50bWVudEdldCgpLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBjb21pbmdHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXA7CgogICAgIyBjcmVhdGUgbmVlZGVkIHNxbCBxdWVyeSBiYXNlZCBvbiB0aGUgY3VycmVudCBvciBhIGdpdmVuIHRpbWVzdGFtcAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50ICc7CgogICAgaWYgKCAkUGFyYW17VGltZXN0YW1wfSApIHsKCiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkUGFyYW17VGltZXN0YW1wfTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA9ID8gIjsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkQ3VycmVudFRpbWVzdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyktPkN1cnJlbnRUaW1lc3RhbXBHZXQoKTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA+PSA/ICI7CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgbm90aWZ5X3RpbWUgQVNDJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VycmVudFRpbWVzdGFtcCBdLAogICAgKTsKCiAgICBteSBAUmVzdWx0UmF3OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlVXBjb21pbmdBcHBvaW50bWVudDsKCiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1BhcmVudElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtDYWxlbmRhcklEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7VW5pcXVlSUR9ICAgICAgPSAkUm93WzNdOwoKICAgICAgICBwdXNoIEBSZXN1bHRSYXcsIFwlVXBjb21pbmdBcHBvaW50bWVudDsKICAgIH0KCiAgICBteSBAUmVzdWx0czsKCiAgICBBUFBPSU5UTUVOVERBVEE6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50RGF0YSAoQFJlc3VsdFJhdykgewoKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEFwcG9pbnRtZW50RGF0YSk7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntDYWxlbmRhcklEfTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhJEFwcG9pbnRtZW50RGF0YS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoICV7JEFwcG9pbnRtZW50RGF0YX0gKTsKCiAgICAgICAgcHVzaCBAUmVzdWx0cywgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICByZXR1cm4gQFJlc3VsdHM7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKQoKRGVsZXRlIGFsbCBjYWxlbmRhciBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhIGxvY2FsIHNjaGVkdWxlciBkYiBvYmplY3QKICAgIG15ICRTY2hlZHVsZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGFscmVhZHkgc3RvcmVkIGZ1dHVyZSB0YXNrcwogICAgbXkgQEZ1dHVyZVRhc2tMaXN0ID0gJFNjaGVkdWxlck9iamVjdC0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICApOwoKICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggXEBGdXR1cmVUYXNrTGlzdCApICkgewoKICAgICAgICBGVVRVUkVUQVNLOgogICAgICAgIGZvciBteSAkRnV0dXJlVGFzayAoQEZ1dHVyZVRhc2tMaXN0KSB7CgogICAgICAgICAgICBuZXh0IEZVVFVSRVRBU0sgaWYgISRGdXR1cmVUYXNrOwogICAgICAgICAgICBuZXh0IEZVVFVSRVRBU0sgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRGdXR1cmVUYXNrKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlck9iamVjdC0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBkZWxldGUgZnV0dXJlIHRhc2sgd2l0aCBpZCAkRnV0dXJlVGFzay0+e1Rhc2tJRH0hIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIE9UUlMgZGFlbW9uIGZ1dHVyZSB0YXNrIGxpc3QgZm9yIHVwY29taW5nIGFwcG9pbnRtZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KCk7CgogICAgIyBjaGVjayBmb3Igbm8gdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBpbnZhbGlkIHRhc2sgY291bnQgKGp1c3Qgb25lIHRhc2sgbWF4IGFsbG93ZWQpCiAgICBpZiAoIHNjYWxhciBARnV0dXJlVGFza0xpc3QgPiAxICkgewoKICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgZGVsZXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgaXQgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2sgbGlzdAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgIyBnZXQgYSBsb2NhbCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAgICAgbXkgJFVwZGF0ZU5lZWRlZCA9IDA7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzaykKICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e1Rhc2tJRH0KICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e0V4ZWN1dGlvblRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgc3RvcmVkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRnV0dXJlVGFza0RhdGEgKSApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB1bml4IHRpbWVzdGFtcHMgb2Ygc3RvcmVkIGFuZCB1cGNvbWluZyB0aW1lcyB0byBjb21wYXJlCiAgICAgICAgICAgIG15ICRGdXR1cmVUYXNrVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntOb3RpZnlUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFVwY29taW5nQXBwb2ludG1lbnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZSB1cGNvbWluZyBub3RpZmljYXRpb24gdGltZSBlcXVhbHMgdGhlIHN0b3JlZCB2YWx1ZQogICAgICAgICAgICBpZiAoICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZSAhPSAkRnV0dXJlVGFza1RpbWUgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRVcGRhdGVOZWVkZWQpIHsKCiAgICAgICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNjaGVkdWxlIG5ldyBmdXR1cmUgdGFza3MgZm9yIG5vdGlmaWNhdGlvbiBhY3Rpb25zCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlck9iamVjdC0+VGFza0FkZCgKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICBUeXBlICAgICAgICAgID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgTm90aWZ5VGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkVGFza0lEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNjaGVkdWxlIGZ1dHVyZSB0YXNrIGZvciBBcHBvaW50bWVudElEICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e0FwcG9pbnRtZW50SUR9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKQoKUHJlcGFyZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIHByZXBhcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IG5vdGlmaWNhdGlvbiBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0IE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gPSB1bmRlZjsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIHBvc3NpYmxlIG5vdGlmaWNhdGlvbiBwYXJhbXMKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAjIGdldCBhIGxvY2FsIGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIwogICAgIyB0ZW1wbGF0ZSBTdGFydAogICAgIwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gZXEgJ1N0YXJ0JyApIHsKCiAgICAgICAgIyBzZXR1cCB0aGUgYXBwb2ludG1lbnQgc3RhcnQgZGF0ZSBhcyBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9OwoKICAgICAgICAjIGdldCBhIHVuaXggdGltZXN0YW1wIG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUKICAgICAgICBteSAkU3RhcnRMb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9LAogICAgICAgICk7CgogICAgICAgICMgc2F2ZSB0aGUgc3RhcnQgdGltZSAtIG9mZnNldCBhcyBuZXcgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkU3RhcnRMb2NhbFRpbWUgLSAkT2Zmc2V0ICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIEN1c3RvbQogICAgIwogICAgZWxzZSB7CgogICAgICAgICMgQ29tcHV0ZSBkYXRlIG9mIGN1c3RvbSByZWxhdGl2ZSBpbnB1dC4KICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKCiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0Q291bnQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0ICAgICAgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdFBvaW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX07CgogICAgICAgICAgICAjIHNldHVwIHRoZSBjb3VudCB0byBjb21wdXRlIGZvciB0aGUgb2Zmc2V0CiAgICAgICAgICAgIG15ICVVbml0T2Zmc2V0Q29tcHV0ZSA9ICgKICAgICAgICAgICAgICAgIG1pbnV0ZXMgPT4gNjAsCiAgICAgICAgICAgICAgICBob3VycyAgID0+IDM2MDAsCiAgICAgICAgICAgICAgICBkYXlzICAgID0+IDg2NDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkxvY2FsVGltZTsKCiAgICAgICAgICAgICMgY29tcHV0ZSBmcm9tIHN0YXJ0IHRpbWUKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJzdGFydCcgKSB7CgogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSBmcm9tIGVuZCB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcmVuZCcgKSB7CgogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG5vdCBzdXBwb3J0ZWQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wdXRlIHRoZSBvZmZzZXQgdG8gYmUgdXNlZAogICAgICAgICAgICBteSAkT2Zmc2V0ID0gKCAkQ3VzdG9tVW5pdENvdW50ICogJFVuaXRPZmZzZXRDb21wdXRleyRDdXN0b21Vbml0fSApOwoKICAgICAgICAgICAgIyBzYXZlIHRoZSBuZXdseSBjb21wdXRlZCBub3RpZmljYXRpb24gZGF0ZXRpbWUgc3RyaW5nCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lIC0gJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICROb3RpZmljYXRpb25Mb2NhbFRpbWUgKyAkT2Zmc2V0ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gZGF0ZS90aW1lIGlucHV0LgogICAgICAgIGVsc2lmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAjIHZhbGlkYXRpb24KICAgICAgICAgICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgZ2l2ZW4gZGF0ZSB0aW1lIHZhbHVlcyBhcyBub3RpZmljYXRpb24gZGF0ZXRpbWUgc3RyaW5nIChpLmUuIDIwMTYtMDYtMjggMDI6MDA6MDApCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gdW5kZWY7CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCkKCldpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBPVFJTIGRhZW1vbiB0byBmaXJlIGV2ZW50cyBmb3IgYXBwb2ludG1lbnRzLAp0aGF0IHJlYWNoZXMgaXQncyByZW1pbmRlciAobm90aWZpY2F0aW9uKSB0aW1lLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudE5vdGlmaWNhdGlvbigpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIG5vdGlmeSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudE5vdGlmaWNhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTm90aWZ5VGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAkUGFyYW17Tm90aWZ5VGltZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICk7CgogICAgIyBzbGVlcCBhdCBsZWFzdCAxIHNlY29uZCB0byBtYWtlIHN1cmUgdGhlIHRpbWVzdGFtcCBkb2Vzbid0CiAgICAjIGVxdWFscyB0aGUgbGFzdCBvbmUgZm9yIHVwZGF0ZSB1cGNvbWluZyBmdXR1cmUgdGFza3MKICAgIHNsZWVwIDE7CgogICAgVVBDT01JTkdBUFBPSU5UTUVOVDoKICAgIGZvciBteSAkVXBjb21pbmdBcHBvaW50bWVudCAoQFVwY29taW5nQXBwb2ludG1lbnRzKSB7CgogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhJFVwY29taW5nQXBwb2ludG1lbnQ7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkVXBjb21pbmdBcHBvaW50bWVudCk7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICAjIGZpcmUgZXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnROb3RpZmljYXRpb24nLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1jdXQKCnN1YiBfQXBwb2ludG1lbnRSZWN1cnJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhcmVudElEIEFwcG9pbnRtZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICApOwogICAgbXkgJEVuZFRpbWVTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntFbmRUaW1lfSwKICAgICk7CgogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSAvLyBbXSB9OwoKICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgcmVzZXQgdGhlIHBhcmFtZXRlciBmb3Igb2NjdXJyZW5jZXMKICAgICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRXhjbHVkZX0gPSB1bmRlZjsKCiAgICBteSAkT3JpZ2luYWxTdGFydFRpbWUgPSAkU3RhcnRUaW1lU3lzdGVtOwogICAgbXkgJE9yaWdpbmFsRW5kVGltZSAgID0gJEVuZFRpbWVTeXN0ZW07CiAgICBteSAkU3RlcCAgICAgICAgICAgICAgPSAwOwoKICAgICMgdW50aWwgLi4uCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgVU5USUxfVElNRToKICAgICAgICB3aGlsZSAoICRTdGFydFRpbWVTeXN0ZW0gPD0gJFJlY3VycmVuY2VVbnRpbFN5c3RlbSApIHsKICAgICAgICAgICAgJFN0ZXAgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJpbmcgdGltZXMKICAgICAgICAgICAgJFN0YXJ0VGltZVN5c3RlbSA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICA9PiAkU3RlcCwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRFbmRUaW1lU3lzdGVtID0gJFN0YXJ0VGltZVN5c3RlbSArICRPcmlnaW5hbEVuZFRpbWUgLSAkT3JpZ2luYWxTdGFydFRpbWU7CgogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgISRTdGFydFRpbWVTeXN0ZW07CiAgICAgICAgICAgIGxhc3QgVU5USUxfVElNRSBpZiAkU3RhcnRUaW1lU3lzdGVtID4gJFJlY3VycmVuY2VVbnRpbFN5c3RlbTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZVN5c3RlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1Z2ZpeDogT24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZQogICAgICAgICAgICAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgVU5USUxfVElNRSBpZiBncmVwIHsgJFN0YXJ0VGltZSBlcSAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtBcHBvaW50bWVudH0gfSwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmb3IgLi4uIHRpbWUocykKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gKSB7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciAoIDEgLi4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gLSAxICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lU3lzdGVtID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lU3lzdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEVuZFRpbWVTeXN0ZW0gPSAkU3RhcnRUaW1lU3lzdGVtICsgJE9yaWdpbmFsRW5kVGltZSAtICRPcmlnaW5hbFN0YXJ0VGltZTsKCiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgISRTdGFydFRpbWVTeXN0ZW07CgogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWVTeXN0ZW0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJEVuZFRpbWVTeXN0ZW0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVnZml4OiBPbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlCiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCBleGNsdWRlZCBhcHBvaW50bWVudHMKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiBncmVwIHsgJFN0YXJ0VGltZSBlcSAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtBcHBvaW50bWVudH0gfSwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXBwb2ludG1lbnRSZWN1cnJpbmdEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhcmVudElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBwYXJlbnRfaWQ9PwogICAgJzsKCiAgICAjIGRlbGV0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXBwb2ludG1lbnRSZWN1cnJpbmdFeGNsdWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCBSZWN1cnJlbmNlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcmVjdXJfZXhjbHVkZSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkPT8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGdldCBleGlzdGluZyBleGNsdXNpb25zCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzcGxpdCggJywnLCAkUm93WzBdICkgaWYgJFJvd1swXTsKICAgIH0KICAgIHB1c2ggQFJlY3VycmVuY2VFeGNsdWRlLCAkUGFyYW17UmVjdXJyZW5jZUlEfTsKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IHNvcnQgQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgam9pbiBpbnRvIHN0cmluZwogICAgbXkgJFJlY3VycmVuY2VFeGNsdWRlOwogICAgaWYgKEBSZWN1cnJlbmNlRXhjbHVkZSkgewogICAgICAgICRSZWN1cnJlbmNlRXhjbHVkZSA9IGpvaW4oICcsJywgQFJlY3VycmVuY2VFeGNsdWRlICk7CiAgICB9CgogICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50IFNFVCByZWN1cl9leGNsdWRlPT8gV0hFUkUgaWQ9PycsCiAgICAgICAgQmluZCA9PiBbIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsIFwkUGFyYW17UGFyZW50SUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc3FsIHF1ZXJ5CiAgICBteSAkU1FMICA9ICdTRUxFQ1QgY2FsZW5kYXJfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZD0/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDYWxlbmRhcklEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJENhbGVuZGFySUQ7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRSZWN1cnJlbmNlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHJlY3VyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQ9Pyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFJlY3VycmVuY2VJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZWN1cnJlbmNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUmVjdXJyZW5jZUlEOwp9CgpzdWIgX0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudCBTdGVwIE9yaWdpbmFsVGltZSBDdXJyZW50VGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgbXkgJFN5c3RlbVRpbWUgPSAkUGFyYW17Q3VycmVudFRpbWV9OwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnRGFpbHknICkgewoKICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgJFN5c3RlbVRpbWUgKz0gNjAgKiA2MCAqIDI0OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdXZWVrbHknICkgewoKICAgICAgICAjIGFkZCA3IGRheXMKICAgICAgICAkU3lzdGVtVGltZSArPSA2MCAqIDYwICogMjQgKiA3OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdNb250aGx5JyApIHsKCiAgICAgICAgIyBhZGQgb25lIG1vbnRoCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgID0+ICRQYXJhbXtPcmlnaW5hbFRpbWV9LAogICAgICAgICAgICBNb250aHMgPT4gJFBhcmFte1N0ZXB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScgKSB7CgogICAgICAgICMgYWRkIG9uZSB5ZWFyCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgIFllYXJzID0+ICRQYXJhbXtTdGVwfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21EYWlseScgKSB7CiAgICAgICAgJFN5c3RlbVRpbWUgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0gKiA2MCAqIDYwICogMjQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgZWFjaCBuLXRoIE1vbmRheSBhbmQgRnJpZGF5CgogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgKCAkT3JpZ2luYWxXZWVrRGF5LCAkT3JpZ2luYWxDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICApOwoKICAgICAgICAjIGxvb3AgdXAgdG8gNypuIHRpbWVzICg3IGRheXMgaW4gd2VlayAqIGZyZXF1ZW5jeSkKICAgICAgICBMT09QOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCA3ICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCAxIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZSArPSA2MCAqIDYwICogMjQ7CgogICAgICAgICAgICBteSAoICRXZWVrRGF5LCAkQ1cgKTsKCiAgICAgICAgICAgIG15ICVEaWZmUGFyYW1ldGVycyA9ICgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgICA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ1dEaWZmID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DV0RpZmYoCiAgICAgICAgICAgICAgICAlRGlmZlBhcmFtZXRlcnMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IExPT1AgaWYgJENXRGlmZiAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBTeXN0ZW1UaW1lIG1hdGNoIHJlcXVpcmVtZW50cwogICAgICAgICAgICBpZiAoIGdyZXAgeyAkV2Vla0RheSA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9ICkgewogICAgICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CgogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JyApIHsKCiAgICAgICAgIyBPY2N1cnMgZXZlcnkgMm5kIG1vbnRoIG9uIDV0aCwgMTB0aCBhbmQgMTV0aCBkYXkKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgIG15ICggJE9yaWdpbmFsU2VjLCAkT3JpZ2luYWxNaW4sICRPcmlnaW5hbEhvdXIsICRPcmlnaW5hbERheSwgJE9yaWdpbmFsTW9udGgsICRPcmlnaW5hbFllYXIsICRPcmlnaW5hbFdlZWtEYXkgKQogICAgICAgICAgICA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgIyBsb29wIHRocm91Z2ggZWFjaCBkYXkgKG1heCBvbmUgeWVhciksIGFuZCBjaGVjayBpZiBkYXkgbWF0Y2hlcy4KICAgICAgICBEQVk6CiAgICAgICAgZm9yICggbXkgJENvdW50ZXIgPSAwOyAkQ291bnRlciA8IDMxICogMzY2OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZSArPSAyNCAqIDYwICogNjA7CgogICAgICAgICAgICBteSAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkV2Vla0RheSApOwoKICAgICAgICAgICAgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJFdlZWtEYXkgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFNraXAgbW9udGggaWYgbmVlZGVkCiAgICAgICAgICAgIG5leHQgREFZIGlmICggJE1vbnRoIC0gJE9yaWdpbmFsTW9udGggKSAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBuZXh0IGRheSBpZiB0aGlzIGRheSBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICAgICBuZXh0IERBWSBpZiAhZ3JlcCB7ICREYXkgPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgREFZOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKCiAgICAgICAgIyB0aGlzIGJsb2NrIGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2U6CiAgICAgICAgIyBPY2N1cnMgZWFjaCAzdGggeWVhciwgSmFudWFyeSAxOHRoIGFuZCBNYXJjaCAxOHRoCiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICBteSAoICRPcmlnaW5hbFNlYywgJE9yaWdpbmFsTWluLCAkT3JpZ2luYWxIb3VyLCAkT3JpZ2luYWxEYXksICRPcmlnaW5hbE1vbnRoLCAkT3JpZ2luYWxZZWFyLCAkT3JpZ2luYWxXZWVrRGF5ICkKICAgICAgICAgICAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFBhcmFte09yaWdpbmFsVGltZX0sCiAgICAgICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW07CiAgICAgICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbFN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIE1PTlRIOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMTs7ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgbW9udGgKICAgICAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgIFRpbWUgICA9PiAkUGFyYW17T3JpZ2luYWxUaW1lfSwKICAgICAgICAgICAgICAgIE1vbnRocyA9PiAkQ291bnRlciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGlzIHRpbWUsIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGNoZWNrZWQKICAgICAgICAgICAgbmV4dCBNT05USCBpZiAkU3lzdGVtVGltZSA8ICRQYXJhbXtDdXJyZW50VGltZX0gKyAyNCAqIDYwICogNjA7CgogICAgICAgICAgICAjIGNoZWNrIGxvb3AgY29uZGl0aW9ucyAoYWNjb3JkaW5nIHRvIFVudGlsIC8gKQogICAgICAgICAgICBpZiAoJFJlY3VycmVuY2VVbnRpbFN5c3RlbSkgewogICAgICAgICAgICAgICAgbGFzdCBNT05USCBpZiAkU3lzdGVtVGltZSA+ICRSZWN1cnJlbmNlVW50aWxTeXN0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRICiAgICAgICAgICAgICAgICAgICAgaWYgJENvdW50ZXIKICAgICAgICAgICAgICAgICAgICA+IDEyICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0gKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJFdlZWtEYXkgKTsKCiAgICAgICAgICAgICggJFNlYywgJE1pbiwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICRXZWVrRGF5ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB5ZWFyIGlzIE9LCiAgICAgICAgICAgIG5leHQgTU9OVEggaWYgKCAkWWVhciAtICRPcmlnaW5hbFllYXIgKSAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBuZXh0IG1vbnRoIGlmIHRoaXMgbW9udGggc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBNT05USCBpZiAhZ3JlcCB7ICRNb250aCA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9OwoKICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgbGFzdCBNT05USDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTeXN0ZW1UaW1lOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6VGltZSkKCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0ZVRpbWU7CnVzZSBUaW1lOjpQaWVjZTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXI7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlciAtIGNhbGVuZGFyIGhlbHBlciBtZXRob2RzCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBoZWxwZXIgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVGltZUNoZWNrKCkKCmNoZWNrIGlmIFRpbWUgYW5kIE9yaWdpbmFsVGltZSBoYXZlIHNhbWUgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgdmFsdWUsIGFuZCByZXR1cm4gdGltZXN0YW1wIHdpdGggdmFsdWVzIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgYXMgaW4gVGltZS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgT3JpZ2luYWxUaW1lICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDI6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAyLTAxIDAwOjAxOjAwJzsKPWN1dAoKc3ViIFRpbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoT3JpZ2luYWxUaW1lIFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzdWx0ID0gJyc7CgogICAgJFBhcmFte09yaWdpbmFsVGltZX0gPX4gLyguKj8pXHMoLio/KSQvOwogICAgbXkgJE9yaWdpbmFsRGF0ZSA9ICQxOwogICAgbXkgJE9yaWdpbmFsVGltZSA9ICQyOwoKICAgICRQYXJhbXtUaW1lfSA9fiAvKC4qPylccyguKj8pJC87CiAgICBteSAkRGF0ZSA9ICQxOwoKICAgICRSZXN1bHQgPSAiJERhdGUgJE9yaWdpbmFsVGltZSI7CiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWl0ZW0gU3lzdGVtVGltZUdldCgpCgpyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLWxlYXAgc2Vjb25kcyBzaW5jZSB3aGF0IGV2ZXIgdGltZSB0aGUgc3lzdGVtIGNvbnNpZGVycyB0byBiZSB0aGUgZXBvY2gKKHRoYXQncyAwMDowMDowMCwgSmFudWFyeSAxLCAxOTA0IGZvciBNYWMgT1MsIGFuZCAwMDowMDowMCBVVEMsIEphbnVhcnkgMSwgMTk3MCBmb3IgbW9zdCBvdGhlciBzeXN0ZW1zKS4KCiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgIFN0cmluZyAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcxNDUxNjA2NDYwJzsKPWN1dAoKc3ViIFN5c3RlbVRpbWVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBTdHJpbmcgKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc3lzdGVtIHRpbWUKICAgIG15ICRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdHJpbmd9LAogICAgKTsKCiAgICByZXR1cm4gJFN5c3RlbVRpbWU7Cn0KCj1pdGVtIFRpbWVzdGFtcEdldCgpCgpyZXR1cm5zIGEgdGltZSBzdGFtcCBmb3IgYSBnaXZlbiBzeXN0ZW0gdGltZSBpbiAieXl5eS1tbS1kZCAyMzo1OTo1OSIgZm9ybWF0LgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICBTeXN0ZW1UaW1lICAgICA9PiAnMTQ1MTYwNjQ2MCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzIwMTYtMDEtMDEgMDA6MDE6MDAnOwo9Y3V0CgpzdWIgVGltZXN0YW1wR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3lzdGVtVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aW1lc3RhbXAKICAgIG15ICRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtTeXN0ZW1UaW1lfSwKICAgICk7CgogICAgcmV0dXJuICRUaW1lc3RhbXA7Cn0KCj1pdGVtIEN1cnJlbnRUaW1lc3RhbXBHZXQoKQoKcmV0dXJucyBhIGN1cnJlbnQgdGltZSBzdGFtcCBmb3IgYSBnaXZlbiBzeXN0ZW0gdGltZSBpbiAieXl5eS1tbS1kZCAyMzo1OTo1OSIgZm9ybWF0LgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRUaW1lc3RhbXBHZXQoKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzIwMTYtMDEtMDEgMDA6MDE6MDAnOwo9Y3V0CgpzdWIgQ3VycmVudFRpbWVzdGFtcEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZXN0YW1wCiAgICBteSAkQ3VycmVudFRpbWVzdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKCiAgICByZXR1cm4gJEN1cnJlbnRUaW1lc3RhbXA7Cn0KCj1pdGVtIEN1cnJlbnRTeXN0ZW1UaW1lKCkKCnJldHVybnMgdGhlIG51bWJlciBvZiBub24tbGVhcCBzZWNvbmRzIHNpbmNlIHdoYXQgZXZlciB0aW1lIHRoZSBzeXN0ZW0gY29uc2lkZXJzIHRvIGJlIHRoZSBlcG9jaCB1bnRpbGwgbm93LgoodGhhdCdzIDAwOjAwOjAwLCBKYW51YXJ5IDEsIDE5MDQgZm9yIE1hYyBPUywgYW5kIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwIGZvciBtb3N0IG90aGVyIHN5c3RlbXMpLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcxNDYyODcxMTYyJzsKPWN1dAoKc3ViIEN1cnJlbnRTeXN0ZW1UaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgbXkgJEN1cnJlbnRTeXN0ZW1UaW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+U3lzdGVtVGltZSgpOwoKICAgIHJldHVybiAkQ3VycmVudFN5c3RlbVRpbWU7Cn0KCj1pdGVtIERhdGVHZXQoKQoKcmV0dXJucyBkYXRlL3RpbWUgaW5mb3JtYXRpb24gaW4gYSBoYXNoIGZvciBnaXZlbiB1bml4IHRpbWUuCgogICAgbXkgKCRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDYyODcxMTYyJywKICAgICk7CgpyZXR1cm5zOgogICAgJFNlY29uZCAgICA9ICcwJzsKICAgICRNaW51dGUgICAgPSAnMCc7CiAgICAkSG91ciAgICAgID0gJzEnOwogICAgJERheSAgICAgICA9ICcxJzsKICAgICRNb250aCAgICAgPSAnMSc7CiAgICAkWWVhciAgICAgID0gJzIwMTYnOwogICAgJERheU9mV2VlayA9ICcyJzsgICAjIDEtbW9uZGF5LC4uLiwgNy1zdW5kYXkKCj1jdXQKCnN1YiBEYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3lzdGVtVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRQYXJhbXtTeXN0ZW1UaW1lfSwKICAgICAgICApOwogICAgJFNlY29uZCAgICA9IGludCAkU2Vjb25kOwogICAgJE1pbnV0ZSAgICA9IGludCAkTWludXRlOwogICAgJEhvdXIgICAgICA9IGludCAkSG91cjsKICAgICREYXkgICAgICAgPSBpbnQgJERheTsKICAgICRNb250aCAgICAgPSBpbnQgJE1vbnRoOwogICAgJFllYXIgICAgICA9IGludCAkWWVhcjsKICAgICREYXlPZldlZWsgPSBpbnQgJERheU9mV2VlazsKCiAgICAjIEtlcm5lbDo6U3lzdGVtOjpUaW1lIG9iamVjdCByZXR1cm5zIDAgZm9yIFN1bmRheSAtIHdlIG5lZWQgdG8gY2hhbmdlIHRoaXMgdG8gNyAobGlrZSBvbiBvdGhlciBwbGFjZXMpCiAgICBpZiAoICEkRGF5T2ZXZWVrICkgewogICAgICAgICREYXlPZldlZWsgPSA3OwogICAgfQoKICAgIHJldHVybiAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICk7Cn0KCj1pdGVtIERhdGUyU3lzdGVtVGltZSgpCgpyZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLWxlYXAgc2Vjb25kcyBzaW5jZSB3aGF0IGV2ZXIgdGltZSB0aGUgc3lzdGVtIGNvbnNpZGVycyB0byBiZSB0aGUgZXBvY2ggZm9yIGdpdmVuIHBhcmFtZXRlcnMuCih0aGF0J3MgMDA6MDA6MDAsIEphbnVhcnkgMSwgMTkwNCBmb3IgTWFjIE9TLCBhbmQgMDA6MDA6MDAgVVRDLCBKYW51YXJ5IDEsIDE5NzAgZm9yIG1vc3Qgb3RoZXIgc3lzdGVtcykuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZTJTeXN0ZW1UaW1lKAogICAgICAgIFllYXIgICAgICA9PiAnMjAxNicsCiAgICAgICAgTW9udGggICAgID0+ICcxJywKICAgICAgICBEYXkgICAgICAgPT4gJzEnLAogICAgICAgIEhvdXIgICAgICA9PiAnMScsCiAgICAgICAgTWludXRlICAgID0+ICcwJywKICAgICk7CgpyZXR1cm5zOgogICAgJFJlc3VsdCA9ICcxNDUxNjEwMDAwJzsKPWN1dAoKc3ViIERhdGUyU3lzdGVtVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFllYXIgTW9udGggRGF5ICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte0hvdXJ9ICAgLy89IDA7CiAgICAkUGFyYW17TWludXRlfSAvLz0gMDsKICAgICRQYXJhbXtTZWNvbmR9IC8vPSAwOwoKICAgICMgZ2V0IHN5c3RlbSB0aW1lCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkU3lzdGVtVGltZTsKfQoKPWl0ZW0gQWRkUGVyaW9kKCkKCmFkZHMgdGltZSBwZXJpb2QgKHllYXJzIGFuZCBtb250aHMpIHRvIHRoZSB0aW1lIGdpdmVuIGluIFVuaXggZm9ybWF0LgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICBUaW1lICAgICAgID0+ICcxNDYyODcxMTYyJywgICAgICMgKHJlcXVpcmVkKSB0aW1lIGluIFVuaXggZm9ybWF0CiAgICAgICAgWWVhcnMgICAgICA9PiAnMScsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgeWVhcnMgdG8gYWRkCiAgICAgICAgTW9udGhzICAgICA9PiAnMScsICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbW9udGhzIHRvIGFkZAogICAgKTsKCnJldHVybnM6CiAgICAkUmVzdWx0ID0gJzE0OTcwODU1NjInOwo9Y3V0CgpzdWIgQWRkUGVyaW9kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte01vbnRoc30gLy89IDA7CiAgICAkUGFyYW17WWVhcnN9ICAvLz0gMDsKCiAgICBteSAkVGltZVBpZWNlID0gbG9jYWx0aW1lKCAkUGFyYW17VGltZX0gKTsKICAgIG15ICRTdGFydERheSAgPSAkVGltZVBpZWNlLT5kYXlfb2ZfbW9udGgoKTsKCiAgICBteSAkTmV4dFRpbWVQaWVjZSA9ICRUaW1lUGllY2UtPmFkZF9tb250aHMoICRQYXJhbXtNb250aHN9ICk7CiAgICAkTmV4dFRpbWVQaWVjZSA9ICROZXh0VGltZVBpZWNlLT5hZGRfeWVhcnMoICRQYXJhbXtZZWFyc30gKTsKICAgIG15ICRFbmREYXkgPSAkTmV4dFRpbWVQaWVjZS0+ZGF5X29mX21vbnRoKCk7CgogICAgIyBjaGVjayBpZiBtb250aCBkb2Vzbid0IGhhdmUgZW5vdWdoIGRheXMgKGZvciBleGFtcGxlOiBKYW51YXJ5IDMxICsgMSBtb250aCA9IE1hcmNoIDAxKQogICAgaWYgKCAkU3RhcnREYXkgIT0gJEVuZERheSApIHsKCiAgICAgICAgIyBTdWJ0cmFjdCBuZWVkZWQgZGF5cwogICAgICAgIG15ICREYXlzID0gJE5leHRUaW1lUGllY2UtPmRheV9vZl9tb250aCgpOwogICAgICAgICROZXh0VGltZVBpZWNlIC09ICREYXlzICogMjQgKiA2MCAqIDYwOwogICAgfQoKICAgIHJldHVybiAkTmV4dFRpbWVQaWVjZS0+ZXBvY2goKTsKfQoKPWl0ZW0gVGltZXpvbmVPZmZzZXRHZXQoKQoKcmV0dXJucyBvZmZzZXQgb2Ygc3BlY2lmaWVkIHRpbWUgem9uZSBvciB1c2VyJ3MgdGltZSB6b25lLgoKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgIFVzZXJJRCAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBUaW1lem9uZUlEICA9PiAnRXVyb3BlL0JlcmxpbicgICAgICAjIChvcHRpb25hbCkgVGltZXpvbmUgbmFtZQogICAgICAgIFRpbWUgICAgICAgID0+ICcxNDYyODcxMTYyJywgICAgICAgICMgKG9wdGlvbmFsKSBUaW1lIGluIFVuaXggZm9ybWF0IHlvdSB3YW50IG9mZnNldCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgb3RoZXJ3aXNlLCBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkCiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAyOwoKPWN1dAoKc3ViIFRpbWV6b25lT2Zmc2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gJiYgISRQYXJhbXtUaW1lem9uZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEIG9yIFRpbWV6b25lSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewogICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFVzZXJ7VXNlclRpbWVab25lfSA/IGludCAkVXNlcntVc2VyVGltZVpvbmV9IDogMDsKICAgIH0KCiAgICAjIE9mZnNldCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHNwZWNpZmljIHRpbWUsIGJlY2F1c2Ugb2YgZGF5bGlnaHQgc2F2aW5ncy4KICAgICMgICBJZiBub3Qgc3VwcGxpZWQsIHVzZSBjdXJyZW50IHRpbWUuCiAgICBteSAkRGF0ZVRpbWUgPSBldmFsIHsgRGF0ZVRpbWUtPmZyb21fZXBvY2goIGVwb2NoID0+ICRQYXJhbXtUaW1lfSA/ICRQYXJhbXtUaW1lfSA6IHRpbWUoKSApIH07CiAgICByZXR1cm4gMCBpZiAhJERhdGVUaW1lOwoKICAgICMgRGF0ZVRpbWU6OlRpbWVab25lIG1pZ2h0IG5vdCByZWNvZ25pemUgdGltZXpvbmUgYnkgaXRzIG5hbWUgYW5kIGRpZSwKICAgICMgICBtYWtlIHRoZSBjYWxsIGluIGFuIGV2YWwgYmxvY2suCiAgICBteSAkVGltZXpvbmUgPSBldmFsIHsgRGF0ZVRpbWU6OlRpbWVab25lLT5uZXcoIG5hbWUgPT4gJFBhcmFte1RpbWV6b25lSUR9ICkgfTsKCiAgICBpZiAoJFRpbWV6b25lKSB7CiAgICAgICAgcmV0dXJuICRUaW1lem9uZS0+b2Zmc2V0X2Zvcl9kYXRldGltZSgkRGF0ZVRpbWUpIC8gMzYwMC4wMDsgICAgIyBpbiBob3VycwogICAgfQoKICAgICMgTGFzdCByZXNvcnQgZGV0ZWN0aW9uIG9mIHRpbWV6b25lIG9mZnNldCBmcm9tIHRoZSBzdXBwbGllZCBUaW1lem9uZUlELAogICAgIyAgIGkuZS4gKFVUQyswMTowMCkgQmVsZ3LDoWQsIEJ1ZGFwZXN0LCBManVibGphbmEsIFBvenNvbnksIFByw6FnYQogICAgIyAgIFBsZWFzZSBzZWUgYnVnIzEyNDg1IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgaWYgKCAkUGFyYW17VGltZXpvbmVJRH0gPX4gLyhbKy1dPykoWzAtOV0rKTooWzAtOV0rKS8gKSB7CiAgICAgICAgbXkgJFNpZ24gID0gaW50ICIkezF9MSI7CiAgICAgICAgbXkgJEhvdXJzID0gJDIgKyAkMyAvIDYwLjAwOwogICAgICAgIHJldHVybiAkU2lnbiAqICRIb3VyczsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZmluZCBvZmZzZXQgZm9yICckUGFyYW17VGltZXpvbmVJRH0nLCBhc3N1bWluZyBVVEMhIiwKICAgICk7CgogICAgcmV0dXJuIDA7Cn0KCj1pdGVtIExvY2FsVGltZXpvbmVPZmZzZXRHZXQoKQoKcmV0dXJucyBvZmZzZXQgb2YgbG9jYWwgdGltZSB6b25lIGZvciBhIHNwZWNpZmllZCBVVEMgc3lzdGVtIHRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICBUaW1lID0+ICcxNDYyODcxMTYyJywgICAgICMgKHJlcXVpcmVkKSB0aW1lIGluIFVuaXggZm9ybWF0CiAgICApOwoKcmV0dXJuczoKICAgICRSZXN1bHQgPSAyOwoKPWN1dAoKc3ViIExvY2FsVGltZXpvbmVPZmZzZXRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17VGltZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkVGltZSAgID0gbG9jYWx0aW1lKCAkUGFyYW17VGltZX0gKTsKICAgIG15ICRPZmZzZXQgPSAkVGltZS0+dHpvZmZzZXQoKSAvIDM2MDAuMDA7ICAgICMgaW4gaG91cnMKCiAgICByZXR1cm4gJE9mZnNldDsKfQoKPWl0ZW0gV2Vla0RldGFpbHNHZXQoKQoKZ2V0IHdlZWsgZGV0YWlscyBmb3IgYSBnaXZlbiB1bml4IHRpbWUuCgogICAgbXkgKCRXZWVrRGF5LCAkQ1cpID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDYyODgwNzc4JywKICAgICk7CgpyZXR1cm5zOgogICAgJFdlZWtEYXkgPSA0OyAjIDctc3VuLCAxLW1vbgogICAgJENXID0gMTk7Cj1jdXQKCnN1YiBXZWVrRGV0YWlsc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyggU3lzdGVtVGltZSApKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBUaW1lOjpQaWVjZSBvYmplY3QKICAgIG15ICRUaW1lID0gbG9jYWx0aW1lKCAkUGFyYW17U3lzdGVtVGltZX0gKTsKCiAgICAjIFRpbWU6OlBpZWNlIG9iamVjdCByZXR1cm5zIDAgZm9yIFN1bmRheSAtIHdlIG5lZWQgdG8gY2hhbmdlIHRoaXMgdG8gNyAobGlrZSBvbiBvdGhlciBwbGFjZXMpCiAgICBteSAkRGF5T2ZXZWVrID0gJFRpbWUtPmRheV9vZl93ZWVrKCk7CiAgICBpZiAoICEkRGF5T2ZXZWVrICkgewogICAgICAgICREYXlPZldlZWsgPSA3OwogICAgfQoKICAgIHJldHVybiAoICREYXlPZldlZWssICRUaW1lLT53ZWVrKCkgKTsKfQoKPWl0ZW0gQ1dEaWZmKCkKCnJldHVybnMgaG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgaGFzIGJlZW4gcGFzc2VkIGJldHdlZW4gdHdvIHVuaXggdGltZXMuCgogICAgbXkgJENXRGlmZiA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q1dEaWZmKAogICAgICAgIFN5c3RlbVRpbWUgICA9PiAnMTQ2Mjg4MDc3OCcsCiAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcxNDYyOTgwNzc4JywKICAgICk7CgpyZXR1cm5zOgogICAgJENXRGlmZiA9IDU7Cj1jdXQKCnN1YiBDV0RpZmYgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoIFN5c3RlbVRpbWUgT3JpZ2luYWxUaW1lICkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFydFRpbWUgPSBsb2NhbHRpbWUoICRQYXJhbXtPcmlnaW5hbFRpbWV9ICk7CiAgICBteSAkRW5kVGltZSAgID0gbG9jYWx0aW1lKCAkUGFyYW17U3lzdGVtVGltZX0gKTsKCiAgICBteSAkU3RhcnRZZWFyID0gJFN0YXJ0VGltZS0+eWVhcigpOwogICAgbXkgJEVuZFllYXIgICA9ICRFbmRUaW1lLT55ZWFyKCk7CgogICAgbXkgJFJlc3VsdCA9ICRFbmRUaW1lLT53ZWVrKCkgLSAkU3RhcnRUaW1lLT53ZWVrKCk7CiAgICBpZiAoICRSZXN1bHQgPCAwICYmICRFbmRUaW1lLT5tZGF5KCkgPT0gMzEgJiYgJEVuZFRpbWUtPm1vbigpID09IDEyICkgewoKICAgICAgICAjIElmIGRhdGUgaXMgZW5kIG9mIHRoZSB5ZWFyIGFuZCBkYXRlIENXIHN0YXJ0cyB3aXRoIDEsIHdlIG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIHllYXIuCiAgICAgICAgJEVuZFllYXIrKzsKICAgIH0KCiAgICBmb3IgbXkgJFllYXIgKCAkU3RhcnRZZWFyIC4uICRFbmRZZWFyIC0gMSApIHsKCiAgICAgICAgbXkgJENXICA9IDA7CiAgICAgICAgbXkgJERheSA9IDMxOwoKICAgICAgICB3aGlsZSAoICRDVyA8IDUwICkgewoKICAgICAgICAgICAgIyBUbyBnZXQgaG93IG1hbnkgQ1cncyBhcmUgaW4gdGhpcyB5ZWFyLCB3ZSBzZXQgdGVtcG9yYXJ5IGRhdGUgdG8gMzEtZGVjLgogICAgICAgICAgICBteSAkVGltZXN0YW1wICA9ICIkWWVhci0xMi0kRGF5IDIzOjU5OjAwIjsKICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGltZXN0YW1wLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFRpbWUgPSBsb2NhbHRpbWUoJFN5c3RlbVRpbWUpOwoKICAgICAgICAgICAgJENXID0gJFRpbWUtPndlZWsoKTsKICAgICAgICAgICAgJERheS0tOwogICAgICAgIH0KCiAgICAgICAgJFJlc3VsdCArPSAkQ1c7CgogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW47Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbiAtIFBsdWdpbiBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGFwcG9pbnRtZW50IHBsdWdpbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRlYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzCiAgICBteSAkUGx1Z2luQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpQbHVnaW4iKTsKCiAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgIyBsb2FkIHBsdWdpbiBtb2R1bGVzCiAgICBQTFVHSU46CiAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5Db25maWd9ICkgewoKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e01vZHVsZX07CiAgICAgICAgbmV4dCBQTFVHSU4gaWYgISRHZW5lcmljTW9kdWxlOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgcGx1Z2luIG1vZHVsZSAkR2VuZXJpY01vZHVsZSEgJEAiKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57UGx1Z2luc30tPnskUGx1Z2luS2V5fS0+e1BsdWdpbk5hbWV9ID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TmFtZX0gLy8gJEdlbmVyaWNNb2R1bGU7CiAgICAgICAgJFNlbGYtPntQbHVnaW5zfS0+eyRQbHVnaW5LZXl9LT57UGx1Z2luTW9kdWxlfSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgIG15ICRQbHVnaW5VUkwgPSAkUGx1Z2luQ29uZmlnLT57JFBsdWdpbktleX0tPntVUkx9OwogICAgICAgICRQbHVnaW5VUkwgPX4gc3s8T1RSU19DT05GSUdfKC4rPyk+fXskS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJDEpfWVneDsKICAgICAgICAkU2VsZi0+e1BsdWdpbnN9LT57JFBsdWdpbktleX0tPntQbHVnaW5VUkx9ID0gJFBsdWdpblVSTDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFBsdWdpbkxpc3QoKQoKcmV0dXJucyB0aGUgaGFzaCBvZiByZWdpc3RlcmVkIHBsdWdpbnMKCiAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCj1jdXQKCnN1YiBQbHVnaW5MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVBsdWdpbkxpc3QgPSBtYXAgewogICAgICAgICRfID0+IHsKICAgICAgICAgICAgUGx1Z2luTmFtZSA9PiAkU2VsZi0+e1BsdWdpbnN9LT57JF99LT57UGx1Z2luTmFtZX0sCiAgICAgICAgICAgIFBsdWdpblVSTCAgPT4gJFNlbGYtPntQbHVnaW5zfS0+eyRffS0+e1BsdWdpblVSTH0sCiAgICAgICAgICAgIH0KICAgIH0ga2V5cyAleyAkU2VsZi0+e1BsdWdpbnN9IH07CgogICAgcmV0dXJuIFwlUGx1Z2luTGlzdDsKfQoKPWl0ZW0gUGx1Z2luS2V5cygpCgpyZXR1cm5zIHRoZSBoYXNoIG9mIHByb3BlciBwbHVnaW4ga2V5cyBmb3IgbG93ZXJjYXNlIG1hdGNoaW5nCgogICAgbXkgJFBsdWdpbktleXMgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5LZXlzKCk7Cgo9Y3V0CgpzdWIgUGx1Z2luS2V5cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVQbHVnaW5LZXlzID0gbWFwIHsKICAgICAgICBsYyAkXyA9PiAkXwogICAgfSBrZXlzICV7ICRTZWxmLT57UGx1Z2luc30gfTsKCiAgICByZXR1cm4gXCVQbHVnaW5LZXlzOwp9Cgo9aXRlbSBQbHVnaW5MaW5rQWRkKCkKCmxpbmsgYXBwb2ludG1lbnQgYnkgcGx1Z2luCgogICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rQWRkKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICBQbHVnaW5LZXkgICAgID0+ICcwMTAwLVRpY2tldCcsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAnNDInLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luTGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBQbHVnaW5LZXkgUGx1Z2luRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpbk1vZHVsZX0tPkxpbmtBZGQoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIFBsdWdpbkxpbmtMaXN0KCkKCnJldHVybnMgbGlzdCBvZiBsaW5rcyBmb3Igc3VwcGxpZWQgYXBwb2ludG1lbnQKCiAgICBteSAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAnMDEwMC1UaWNrZXQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUGx1Z2luTGlua0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQgUGx1Z2luS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UGx1Z2luVVJMfSA9ICRTZWxmLT57UGx1Z2luc30tPnsgJFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpblVSTH07CgogICAgbXkgJExpbmtMaXN0ID0gJFNlbGYtPntQbHVnaW5zfS0+eyAkUGFyYW17UGx1Z2luS2V5fSB9LT57UGx1Z2luTW9kdWxlfS0+TGlua0xpc3QoJVBhcmFtKTsKCiAgICByZXR1cm4gJExpbmtMaXN0Owp9Cgo9aXRlbSBQbHVnaW5MaW5rRGVsZXRlKCkKCnJlbW92ZXMgYWxsIGxpbmtzIGZvciBhbiBhcHBvaW50bWVudAoKICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0RlbGV0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBQbHVnaW5MaW5rRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtEZWxldGVBbGwoCiAgICAgICAgT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIGRlbGV0ZSBwbHVnaW4gbGlua3MhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWl0ZW0gUGx1Z2luU2VhcmNoKCkKCnNlYXJjaCBmb3IgcGx1Z2luIG9iamVjdHMKCiAgICBteSAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICBQbHVnaW5LZXkgPT4gJFBsdWdpbktleSwgICAgICAgICMgKHJlcXVpcmVkKQoKICAgICAgICBTZWFyY2ggICAgPT4gJFNlYXJjaCwgICAgICAgICAgICMgKHJlcXVpcmVkKSBTZWFyY2ggc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCiAgICAgICAgT2JqZWN0SUQgID0+ICRPYmplY3RJRCAgICAgICAgICAjIChyZXF1aXJlZCkgT2JqZWN0IElECgogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sICAgIyAocmVxdWlyZWQpCiAgICApOwoKPWN1dAoKc3ViIFBsdWdpblNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGx1Z2luS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXtTZWFyY2h9ICYmICEkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgU2VhcmNoIG9yIE9iamVjdElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFJlc3VsdExpc3QgPSAkU2VsZi0+e1BsdWdpbnN9LT57ICRQYXJhbXtQbHVnaW5LZXl9IH0tPntQbHVnaW5Nb2R1bGV9LT5TZWFyY2goCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW46OlRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0IC0gVGlja2V0IHBsdWdpbgoKPWhlYWQxIFNZTk9QU0lTCgpUaWNrZXQgYXBwb2ludG1lbnQgcGx1Z2luLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRUaWNrZXRQbHVnaW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0FkZCgpCgphZGRzIGEgbGluayBmcm9tIGFuIGFwcG9pbnRtZW50IHRvIHRoZSB0aWNrZXQKCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRQbHVnaW5PYmplY3QtPkxpbmtBZGQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxMjMsCiAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFBsdWdpbkRhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGlja2V0IGlkCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1BsdWdpbkRhdGF9LAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJVRpY2tldDsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRQYXJhbXtQbHVnaW5EYXRhfSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1pdGVtIExpbmtMaXN0KCkKCnJldHVybnMgYSBoYXNoIG9mIGxpbmtlZCB0aWNrZXRzIHRvIGFuIGFwcG9pbnRtZW50CgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGx1Z2luT2JqZWN0LT5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCBQbHVnaW5VUkwpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUxpbmtLZXlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QxID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICBTdGF0ZSAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgJVJlc3VsdCA9IG1hcCB7CiAgICAgICAgJF8gPT4gewogICAgICAgICAgICBMaW5rSUQgICA9PiAkTGlua0tleUxpc3R7JF99LT57VGlja2V0SUR9LAogICAgICAgICAgICBMaW5rTmFtZSA9PiAkTGlua0tleUxpc3R7JF99LT57VGlja2V0TnVtYmVyfSAuICcgJyAuICRMaW5rS2V5TGlzdHskX30tPntUaXRsZX0sCiAgICAgICAgICAgIExpbmtVUkwgID0+IHNwcmludGYoICRQYXJhbXtQbHVnaW5VUkx9LCAkTGlua0tleUxpc3R7JF99LT57VGlja2V0SUR9ICksCiAgICAgICAgICAgIH0KICAgIH0ga2V5cyAlTGlua0tleUxpc3Q7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aXRlbSBTZWFyY2goKQoKc2VhcmNoIGZvciB0aWNrZXQgYW5kIHJldHVybiBhIGhhc2ggb2YgZm91bmQgdGlja2V0cwoKICAgIG15ICRSZXN1bHRMaXN0ID0gJFRpY2tldFBsdWdpbk9iamVjdC0+U2VhcmNoKAogICAgICAgIFNlYXJjaCAgID0+ICcqKicsICAgIyBzZWFyY2ggYnkgdGlja2V0IG51bWJlciBvciB0aXRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIE9iamVjdElEID0+IDEsICAgICAgIyBzZWFyY2ggYnkgdGlja2V0IElEIChzaW5nbGUgcmVzdWx0KQoKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17U2VhcmNofSAmJiAhJFBhcmFte09iamVjdElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlYXJjaCBvciBPYmplY3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQFRpY2tldElEczsKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgc2VhcmNoIHRoZSB0aWNrZXRzIGJ5IHRpY2tldCBudW1iZXIKICAgICAgICBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIExpbWl0ICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0aGUgdGl0bGUgc2VhcmNoIGlmIG5vIHJlc3VsdHMgd2VyZSBmb3VuZAogICAgICAgIGlmICggIUBUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJyUnIC4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBBcmNoaXZlRmxhZ3MgPT4gWyduJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17T2JqZWN0SUR9ICkgewogICAgICAgIEBUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17T2JqZWN0SUR9LAogICAgICAgICAgICBMaW1pdCAgICAgICAgPT4gMTAwLAogICAgICAgICAgICBSZXN1bHQgICAgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgQXJjaGl2ZUZsYWdzID0+IFsnbiddLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlUmVzdWx0TGlzdDsKCiAgICAjIGNsZWFuIHRoZSByZXN1bHRzCiAgICBUSUNLRVQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CgogICAgICAgIG5leHQgVElDS0VUIGlmICEkVGlja2V0SUQ7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVQgaWYgISVUaWNrZXQ7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIHRpY2tldCBpbmZvcm1hdGlvbiBzdHJpbmcKICAgICAgICAkUmVzdWx0TGlzdHsgJFRpY2tldHtUaWNrZXRJRH0gfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfSAuICcgJyAuICRUaWNrZXR7VGl0bGV9OwogICAgfQoKICAgIHJldHVybiBcJVJlc3VsdExpc3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6Tm90aWZpY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJUZW1wbGF0ZUdlbmVyYXRvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhFdmVudCBEYXRhIENvbmZpZyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gJiYgISRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgQ2FsZW5kYXJJRCBvciBBcHBvaW50bWVudElEIGluIERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBub3RpZmljYXRpb24gZXZlbnQgb2JqZWN0CiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIGNoZWNrIGlmIGV2ZW50IGlzIGFmZmVjdGVkCiAgICBteSBASURzID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudENoZWNrKAogICAgICAgIEV2ZW50ID0+ICRQYXJhbXtFdmVudH0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIG5vIG5vdGlmaWNhdGlvbiBmb3IgZXZlbnQgZXhpc3RzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxASURzICkgKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSBmdXR1cmUgdGFza3MKICAgICAgICAkU2VsZi0+X0Z1dHVyZVRhc2tVcGRhdGUoKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CgogICAgbXkgJUNhbGVuZGFyOwogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgIGlmICggJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IHx8ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9ICkgewogICAgICAgICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0RhdGF9LT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBOT1RJRklDQVRJT05JRDoKICAgIGZvciBteSAkTm90aWZpY2F0aW9uSUQgKEBJRHMpIHsKCiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbiA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBJRCA9PiAkTm90aWZpY2F0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgY29uZGl0aW9ucwogICAgICAgIG15ICRQYXNzRmlsdGVyID0gJFNlbGYtPl9Ob3RpZmljYXRpb25GaWx0ZXIoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+IFwlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIENhbGVuZGFyICAgICA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBOT1RJRklDQVRJT05JRCBpZiAhJFBhc3NGaWx0ZXI7CgogICAgICAgICMgZ2V0IHJlY2lwaWVudHMKICAgICAgICBteSBAUmVjaXBpZW50VXNlcnMgPSAkU2VsZi0+X1JlY2lwaWVudHNHZXQoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+IFwlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIENhbGVuZGFyICAgICA9PiBcJUNhbGVuZGFyLAogICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkJ1bmRsZTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZ2VuZXJhdG9yIG9iamVjdDsKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXJUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAjIHBhcnNlIGFsbCBub3RpZmljYXRpb24gdGFncyBmb3IgZWFjaCB1c2VyCiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKEBSZWNpcGllbnRVc2VycykgewoKICAgICAgICAgICAgbXkgJVJlcGxhY2VkTm90aWZpY2F0aW9uID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtEYXRhfS0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uICA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gJFJlY2lwaWVudC0+e0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE5vdGlmaWNhdGlvbkJ1bmRsZSwgewogICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgICAgICAgICAgID0+ICRSZWNpcGllbnQsCiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgICAgICAgICAgPT4gXCVSZXBsYWNlZE5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgIFJlY2lwaWVudE5vdGlmaWNhdGlvblRyYW5zcG9ydCA9PiAkVXNlck5vdGlmaWNhdGlvblRyYW5zcG9ydCwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBnZXQgbm90aWZpY2F0aW9uIHRyYW5zcG9ydCBjb25maWcKICAgICAgICBteSAlVHJhbnNwb3J0Q29uZmlnID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdBcHBvaW50bWVudE5vdGlmaWNhdGlvbjo6VHJhbnNwb3J0JykgfHwge30gfTsKCiAgICAgICAgIyByZW1lbWJlciBhbHJlYWR5IHNlbnQgYWdlbnQgbm90aWZpY2F0aW9ucwogICAgICAgIG15ICVBbHJlYWR5U2VudDsKCiAgICAgICAgIyBsb29wIG92ZXIgdHJhbnNwb3J0cyBmb3IgZWFjaCBub3RpZmljYXRpb24KICAgICAgICBUUkFOU1BPUlQ6CiAgICAgICAgZm9yIG15ICRUcmFuc3BvcnQgKCBzb3J0IGtleXMgJVRyYW5zcG9ydENvbmZpZyApIHsKCiAgICAgICAgICAgICMgb25seSBjb25maWd1cmVkIHRyYW5zcG9ydHMgZm9yIHRoaXMgbm90aWZpY2F0aW9uCiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAkVHJhbnNwb3J0IH0gQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1RyYW5zcG9ydHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9ICk7CiAgICAgICAgICAgIG5leHQgVFJBTlNQT1JUIGlmICEkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfTsKCiAgICAgICAgICAgICMgZ2V0IHRyYW5zcG9ydCBvYmplY3QKICAgICAgICAgICAgbXkgJFRyYW5zcG9ydE9iamVjdDsKICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAkVHJhbnNwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCggJFRyYW5zcG9ydENvbmZpZ3skVHJhbnNwb3J0fS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggISRUcmFuc3BvcnRPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGEgbmV3ICRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9IG9iamVjdCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFRSQU5TUE9SVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCByZWYgJFRyYW5zcG9ydE9iamVjdCBuZSAkVHJhbnNwb3J0Q29uZmlneyRUcmFuc3BvcnR9LT57TW9kdWxlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRUcmFuc3BvcnRDb25maWd7JFRyYW5zcG9ydH0tPntNb2R1bGV9IG9iamVjdCBpcyBpbnZhbGlkIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBUUkFOU1BPUlQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgdHJhbnNwb3J0IGlzIHVzYWJsZQogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhJFRyYW5zcG9ydE9iamVjdC0+SXNVc2FibGUoKTsKCiAgICAgICAgICAgIEJVTkRMRToKICAgICAgICAgICAgZm9yIG15ICRCdW5kbGUgKEBOb3RpZmljYXRpb25CdW5kbGUpIHsKCiAgICAgICAgICAgICAgICBteSAkVXNlclByZWZlcmVuY2UgPSAiTm90aWZpY2F0aW9uLSROb3RpZmljYXRpb257SUR9LSRUcmFuc3BvcnQiOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYWdlbnQgc2hvdWxkIGdldCB0aGUgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICBteSAkQWdlbnRTZW5kTm90aWZpY2F0aW9uID0gMDsKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQnVuZGxlLT57UmVjaXBpZW50Tm90aWZpY2F0aW9uVHJhbnNwb3J0fS0+eyRVc2VyUHJlZmVyZW5jZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9ICRCdW5kbGUtPntSZWNpcGllbnROb3RpZmljYXRpb25UcmFuc3BvcnR9LT57JFVzZXJQcmVmZXJlbmNlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRUcmFuc3BvcnQgfSBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57QWdlbnRFbmFibGVkQnlEZWZhdWx0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRBZ2VudFNlbmROb3RpZmljYXRpb24gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICFJc0FycmF5UmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0tPntWaXNpYmxlRm9yQWdlbnR9ICkKICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEFnZW50U2VuZE5vdGlmaWNhdGlvbiA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBza2lwIHNlbmRpbmcgdGhlIG5vdGlmaWNhdGlvbiBpZiB0aGUgYWdlbnQgaGFzIGRpc2FibGUgaXQgaW4gaXRzIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkTm90aWZpY2F0aW9ue0RhdGF9LT57VmlzaWJsZUZvckFnZW50fSApCiAgICAgICAgICAgICAgICAgICAgJiYgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1Zpc2libGVGb3JBZ2VudH0tPlswXQogICAgICAgICAgICAgICAgICAgICYmICRCdW5kbGUtPntSZWNpcGllbnR9LT57VHlwZX0gZXEgJ0FnZW50JwogICAgICAgICAgICAgICAgICAgICYmICEkQWdlbnRTZW5kTm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5leHQgQlVORExFOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9TZW5kUmVjaXBpZW50Tm90aWZpY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9IHx8ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gJEJ1bmRsZS0+e05vdGlmaWNhdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30sCiAgICAgICAgICAgICAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRCdW5kbGUtPntSZWNpcGllbnR9LAogICAgICAgICAgICAgICAgICAgIEV2ZW50ICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXZlbnR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCAgICAgICAgICAgICA9PiAkVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE9iamVjdCAgICAgICA9PiAkVHJhbnNwb3J0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBoYXZlIHNlbnQKICAgICAgICAgICAgICAgICRBbHJlYWR5U2VudHsgJEJ1bmRsZS0+e1JlY2lwaWVudH0tPntVc2VySUR9IH0gPSAxOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc3BlY2lhbCByZWNpcGllbnRzIHNwZWNpZmljIGZvciBlYWNoIHRyYW5zcG9ydAogICAgICAgICAgICBteSBAVHJhbnNwb3J0UmVjaXBpZW50cyA9ICRUcmFuc3BvcnRPYmplY3QtPkdldFRyYW5zcG9ydFJlY2lwaWVudHMoCiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gPT4gXCVOb3RpZmljYXRpb24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRSQU5TUE9SVCBpZiAhQFRyYW5zcG9ydFJlY2lwaWVudHM7CgogICAgICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgICAgIGZvciBteSAkUmVjaXBpZW50IChAVHJhbnNwb3J0UmVjaXBpZW50cykgewoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBhbGwgbm90aWZpY2F0aW9uIHRhZ3MgZm9yIGVhY2ggc3BlY2lhbCByZWNpcGllbnQKICAgICAgICAgICAgICAgIG15ICVSZXBsYWNlZE5vdGlmaWNhdGlvbiA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+Tm90aWZpY2F0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkUmVjaXBpZW50LAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiAgICAgICAgICA9PiBcJU5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJFBhcmFte0RhdGF9LT57Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9TZW5kUmVjaXBpZW50Tm90aWZpY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9IHx8ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gXCVSZXBsYWNlZE5vdGlmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJFBhcmFte0RhdGF9LT57Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICBSZWNpcGllbnQgICAgICAgICAgICAgPT4gJFJlY2lwaWVudCwKICAgICAgICAgICAgICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgICAgICAgICAgICAgPT4gJFRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRPYmplY3QgICAgICAgPT4gJFRyYW5zcG9ydE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICVBbHJlYWR5U2VudCAmJiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9ICYmICRQYXJhbXtEYXRhfS0+e0FydGljbGVUeXBlfSApIHsKCiAgICAgICAgICAgICMgdXBkYXRlIHRvIGZpZWxkCiAgICAgICAgICAgIG15ICRVcGRhdGVUb1N1Y2Nlc3MgPSAkU2VsZi0+X0FydGljbGVUb1VwZGF0ZSgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgID0+ICRQYXJhbXtEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAkUGFyYW17RGF0YX0tPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgICAgICBVc2VySURzICAgICA9PiBcJUFscmVhZHlTZW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGZvciBlcnJvcnMKICAgICAgICAgICAgaWYgKCAhJFVwZGF0ZVRvU3VjY2VzcyApIHsKCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdXBkYXRlIFRvIGZpZWxkIGZvciBBcnRpY2xlOiAkUGFyYW17RGF0YX0tPntBcnRpY2xlSUR9LiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcwogICAgJFNlbGYtPl9GdXR1cmVUYXNrVXBkYXRlKCk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfTm90aWZpY2F0aW9uRmlsdGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnQgQ2FsZW5kYXIgTm90aWZpY2F0aW9uKSkgewogICAgICAgIHJldHVybiBpZiAhJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICMgc2V0IGxvY2FsIHZhbHVlcwogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgcmV0dXJuIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJE5vdGlmaWNhdGlvbntEYXRhfSApOwoKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257RGF0YX0gfSApIHsKCiAgICAgICAgIyBpZ25vcmUgbm90IGFwcG9pbnRtZW50IHJlbGF0ZWQgYXR0cmlidXRlcwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NraXBSZWNpcGllbnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdSZWNpcGllbnRBZ2VudHMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1JlY2lwaWVudEdyb3Vwcyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnUmVjaXBpZW50Um9sZXMnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1RyYW5zcG9ydEVtYWlsVGVtcGxhdGUnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0V2ZW50cyc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVNlbmRlclR5cGVJRCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZVN1YmplY3RNYXRjaCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZUJvZHlNYXRjaCc7CiAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnQXJ0aWNsZUF0dGFjaG1lbnRJbmNsdWRlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdOb3RpZmljYXRpb25BcnRpY2xlVHlwZUlEJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdUcmFuc3BvcnRzJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdPbmNlUGVyRGF5JzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdWaXNpYmxlRm9yQWdlbnQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1Zpc2libGVGb3JBZ2VudFRvb2x0aXAnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ0xhbmd1YWdlSUQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NlbmRPbk91dE9mT2ZmaWNlJzsKICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdBZ2VudEVuYWJsZWRCeURlZmF1bHQnOwogICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ05vdGlmaWNhdGlvblR5cGUnOwoKICAgICAgICAjIGNoZWNrIHJlY2lwaWVudCBmaWVsZHMgZnJvbSB0cmFuc3BvcnQgbWV0aG9kcwogICAgICAgIGlmICggJEtleSA9fiBte1xBIFJlY2lwaWVudH14bXMgKSB7CiAgICAgICAgICAgIG5leHQgS0VZOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBhcHBvaW50bWVudCBhdHRyaWJ1dGVzCiAgICAgICAgbmV4dCBLRVkgaWYgISROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fTsKICAgICAgICBuZXh0IEtFWSBpZiAhQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+eyRLZXl9IH07CiAgICAgICAgbmV4dCBLRVkgaWYgISROb3RpZmljYXRpb257RGF0YX0tPnskS2V5fS0+WzBdOwoKICAgICAgICBteSAkTWF0Y2ggPSAwOwoKICAgICAgICBWQUxVRToKICAgICAgICBmb3IgbXkgJFZhbHVlICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+eyRLZXl9IH0gKSB7CgogICAgICAgICAgICBuZXh0IFZBTFVFIGlmICEkVmFsdWU7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkS2V5IGVxICdUZWFtSUQnCiAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdSZXNvdXJjZUlEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBleGlzdGluZyBvYmplY3QgaWRzIGluIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gKTsKCiAgICAgICAgICAgICAgICBPQkpFQ1RJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0SUQgKCBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1RJRCBpZiAhJE9iamVjdElEOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZSBlcSAkT2JqZWN0SUQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNYXRjaCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17QXBwb2ludG1lbnR9LT57JEtleX0gJiYgJFZhbHVlIGVxICRQYXJhbXtBcHBvaW50bWVudH0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAkTWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJE1hdGNoOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1JlY2lwaWVudHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudCBDYWxlbmRhciBOb3RpZmljYXRpb24pKSB7CiAgICAgICAgcmV0dXJuIGlmICEkUGFyYW17JE5lZWRlZH07CiAgICB9CgogICAgIyBzZXQgbG9jYWwgdmFsdWVzCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKICAgIG15ICVBcHBvaW50bWVudCAgPSAleyAkUGFyYW17QXBwb2ludG1lbnR9IH07CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15IEBSZWNpcGllbnRVc2VySURzOwogICAgbXkgQFJlY2lwaWVudFVzZXJzOwoKICAgICMgYWRkIHByZS1jYWxjdWxhdGVkIHJlY2lwaWVudAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1JlY2lwaWVudHN9ICkgKSB7CiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgQHsgJFBhcmFte0RhdGF9LT57UmVjaXBpZW50c30gfTsKICAgIH0KCiAgICAjIHJlbWVtYmVyIHByZS1jYWxjdWxhdGVkIHVzZXIgcmVjaXBpZW50cyBmb3IgbGF0ZXIgY29tcGFyaXNvbnMKICAgIG15ICVQcmVjYWxjdWxhdGVkVXNlcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAUmVjaXBpZW50VXNlcklEczsKCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudHMKICAgIGlmICggJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudHN9ICkgewoKICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgZm9yIG15ICRSZWNpcGllbnQgKCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50c30gfSApIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRSZWNpcGllbnQKICAgICAgICAgICAgICAgID1+IC9eQXBwb2ludG1lbnQoQWdlbnRzfEFnZW50UmVhZFBlcm1pc3Npb25zfEFnZW50V3JpdGVQZXJtaXNzaW9ucykkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICRSZWNpcGllbnQgZXEgJ0FwcG9pbnRtZW50QWdlbnRzJyApIHsKCiAgICAgICAgICAgICAgICAgICAgUkVTT1VSQ0VJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlc291cmNlSUQgKCBAeyAkQXBwb2ludG1lbnR7UmVzb3VyY2VJRH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUkVTT1VSQ0VJRCBpZiAhJFJlc291cmNlSUQ7CgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9IH0sICRSZXNvdXJjZUlEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnQXBwb2ludG1lbnRBZ2VudFJlYWRQZXJtaXNzaW9ucycgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGNhbGVuZGFyIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gfHwgJFBhcmFte0NhbGVuZGFyfS0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCBhIGxpc3Qgb2YgcmVhZCBhY2Nlc3MgdXNlcnMgZm9yIHRoZSByZWxhdGVkIGNhbGVuZGFyCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJENhbGVuZGFye0dyb3VwSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgVVNFUklEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVVc2VycyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgVVNFUklEIGlmICEkVXNlcklEOwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkTm90aWZpY2F0aW9ue0RhdGF9LT57UmVjaXBpZW50QWdlbnRzfSB9LCAkVXNlcklEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJlY2lwaWVudCBlcSAnQXBwb2ludG1lbnRBZ2VudFdyaXRlUGVybWlzc2lvbnMnICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBjYWxlbmRhciBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9IHx8ICRQYXJhbXtDYWxlbmRhcn0tPntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgYSBsaXN0IG9mIHJlYWQgYWNjZXNzIHVzZXJzIGZvciB0aGUgcmVsYXRlZCBjYWxlbmRhcgogICAgICAgICAgICAgICAgICAgIG15ICVVc2VycyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRDYWxlbmRhcntHcm91cElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncncnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIFVTRVJJRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRCBpZiAhJFVzZXJJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfSwgJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjaXBpZW50IGFnZW50cwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRBZ2VudHN9ICkgKSB7CiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEFnZW50c30gfTsKICAgIH0KCiAgICAjIGhhc2ggdG8ga2VlcCB0cmFjayB3aGljaCBhZ2VudHMgYXJlIGFscmVhZHkgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCiAgICBteSAlQWdlbnRVc2VkID0gbWFwIHsgJF8gPT4gMSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHJlY2lwaWVudHMgYnkgUmVjaXBpZW50R3JvdXBzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRHcm91cHN9ICkgewoKICAgICAgICBSRUNJUElFTlQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggQHsgJE5vdGlmaWNhdGlvbntEYXRhfS0+e1JlY2lwaWVudEdyb3Vwc30gfSApIHsKCiAgICAgICAgICAgIG15ICVHcm91cE1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cFVzZXJHZXQoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgR1JPVVBNRU1CRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVHcm91cE1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBHUk9VUE1FTUJFUiBpZiAkVXNlcklEID09IDE7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQTUVNQkVSIGlmICRBZ2VudFVzZWR7JFVzZXJJRH07CgogICAgICAgICAgICAgICAgJEFnZW50VXNlZHskVXNlcklEfSA9IDE7CgogICAgICAgICAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcklEcywgJFVzZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCByZWNpcGllbnRzIGJ5IFJlY2lwaWVudFJvbGVzCiAgICBpZiAoICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gKSB7CgogICAgICAgIFJFQ0lQSUVOVDoKICAgICAgICBmb3IgbXkgJFJvbGVJRCAoIEB7ICROb3RpZmljYXRpb257RGF0YX0tPntSZWNpcGllbnRSb2xlc30gfSApIHsKCiAgICAgICAgICAgIG15ICVSb2xlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblJvbGVVc2VyR2V0KAogICAgICAgICAgICAgICAgUm9sZUlEID0+ICRSb2xlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBST0xFTUVNQkVSOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUm9sZU1lbWJlckxpc3QgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBST0xFTUVNQkVSIGlmICRVc2VySUQgPT0gMTsKICAgICAgICAgICAgICAgIG5leHQgUk9MRU1FTUJFUiBpZiAkQWdlbnRVc2VkeyRVc2VySUR9OwoKICAgICAgICAgICAgICAgICRBZ2VudFVzZWR7JFVzZXJJRH0gPSAxOwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlY2lwaWVudFVzZXJJRHMsICRVc2VySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBteSAlU2tpcFJlY2lwaWVudHM7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57U2tpcFJlY2lwaWVudHN9ICkgKSB7CiAgICAgICAgJVNraXBSZWNpcGllbnRzID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRQYXJhbXtEYXRhfS0+e1NraXBSZWNpcGllbnRzfSB9OwogICAgfQoKICAgICMgYWdlbnQgMSBzaG91bGQgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9ucwogICAgJFNraXBSZWNpcGllbnRzeycxJ30gPSAxOwoKICAgICMgcmVtb3ZlIHJlY2lwaWVudHMgc2hvdWxkIG5vdCByZWNlaXZlIGEgbm90aWZpY2F0aW9uCiAgICBAUmVjaXBpZW50VXNlcklEcyA9IGdyZXAgeyAhJFNraXBSZWNpcGllbnRzeyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgZ2V0IHZhbGlkIHVzZXJzIGxpc3QKICAgIG15ICVWYWxpZFVzZXJzTGlzdCA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICAgICAgICAgID0+ICdTaG9ydCcsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAxLAogICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMCwKICAgICk7CgogICAgIyByZW1vdmUgaW52YWxpZCB1c2VycwogICAgQFJlY2lwaWVudFVzZXJJRHMgPSBncmVwIHsgJFZhbGlkVXNlcnNMaXN0eyRffSB9IEBSZWNpcGllbnRVc2VySURzOwoKICAgICMgcmVtb3ZlIGR1cGxpY2F0ZWQKICAgIG15ICVUZW1wUmVjaXBpZW50VXNlcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAUmVjaXBpZW50VXNlcklEczsKICAgIEBSZWNpcGllbnRVc2VySURzID0gc29ydCBrZXlzICVUZW1wUmVjaXBpZW50VXNlcklEczsKCiAgICAjIGdldCB0aW1lIG9iamVjdAogICAgbXkgJFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZS1zdGFtcAogICAgbXkgJFRpbWUgPSAkVGltZU9iamVjdC0+U3lzdGVtVGltZSgpOwoKICAgICMgZ2V0IGFsbCBkYXRhIGZvciByZWNpcGllbnRzIGFzIHRoZXkgc2hvdWxkIGJlIG5lZWRlZCBieSBhbGwgbm90aWZpY2F0aW9uIHRyYW5zcG9ydHMKICAgIFJFQ0lQSUVOVDoKICAgIGZvciBteSAkVXNlcklEIChAUmVjaXBpZW50VXNlcklEcykgewoKICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbmV4dCBSRUNJUElFTlQgaWYgISVVc2VyOwoKICAgICAgICAjIHNraXAgdXNlciB0aGF0IHRyaWdnZXJzIHRoZSBldmVudCAoaXQgc2hvdWxkIG5vdCBiZSBub3RpZmllZCkgYnV0IG9ubHkgaWYgaXQgaXMgbm90CiAgICAgICAgIyAgIGEgcHJlLWNhbGN1bGF0ZWQgcmVjaXBpZW50CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJENvbmZpZ09iamVjdC0+R2V0KCdBZ2VudFNlbGZOb3RpZnlPbkFjdGlvbicpCiAgICAgICAgICAgICYmICRVc2Vye1VzZXJJRH0gPT0gJFBhcmFte1VzZXJJRH0KICAgICAgICAgICAgJiYgISRQcmVjYWxjdWxhdGVkVXNlcklEc3sgJFBhcmFte1VzZXJJRH0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVDsKICAgICAgICB9CgogICAgICAgICMgc2tpcCB1c2VycyBvdXQgb2YgdGhlIG9mZmljZSBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbntEYXRhfS0+e1NlbmRPbk91dE9mT2ZmaWNlfSAmJiAkVXNlcntPdXRPZk9mZmljZX0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydCA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LCAkVXNlcntPdXRPZk9mZmljZVN0YXJ0TW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VTdGFydERheX0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFRpbWVTdGFydCA9ICRUaW1lT2JqZWN0LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmQgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5IiwKICAgICAgICAgICAgICAgICRVc2Vye091dE9mT2ZmaWNlRW5kWWVhcn0sICRVc2Vye091dE9mT2ZmaWNlRW5kTW9udGh9LAogICAgICAgICAgICAgICAgJFVzZXJ7T3V0T2ZPZmZpY2VFbmREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRUaW1lRW5kID0gJFRpbWVPYmplY3QtPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbmQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFJFQ0lQSUVOVCBpZiAkVGltZVN0YXJ0IDwgJFRpbWUgJiYgJFRpbWVFbmQgPiAkVGltZTsKICAgICAgICB9CgogICAgICAgICMgc2tpcCBQb3N0TWFzdGVyVXNlcklECiAgICAgICAgbXkgJFBvc3RtYXN0ZXJVc2VySUQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Bvc3RtYXN0ZXJVc2VySUQnKSB8fCAxOwogICAgICAgIG5leHQgUkVDSVBJRU5UIGlmICRVc2Vye1VzZXJJRH0gPT0gJFBvc3RtYXN0ZXJVc2VySUQ7CgogICAgICAgICRVc2Vye1R5cGV9ID0gJ0FnZW50JzsKCiAgICAgICAgcHVzaCBAUmVjaXBpZW50VXNlcnMsIFwlVXNlcjsKICAgIH0KCiAgICByZXR1cm4gQFJlY2lwaWVudFVzZXJzOwp9CgpzdWIgX1NlbmRSZWNpcGllbnROb3RpZmljYXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCBOb3RpZmljYXRpb24gUmVjaXBpZW50IEV2ZW50IFRyYW5zcG9ydCBUcmFuc3BvcnRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUcmFuc3BvcnRPYmplY3QgPSAkUGFyYW17VHJhbnNwb3J0T2JqZWN0fTsKCiAgICAjIHNlbmQgbm90aWZpY2F0aW9uIHRvIGVhY2ggcmVjaXBpZW50CiAgICBteSAkU3VjY2VzcyA9ICRUcmFuc3BvcnRPYmplY3QtPlNlbmROb3RpZmljYXRpb24oCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb3RpZmljYXRpb24gICAgICAgICAgPT4gJFBhcmFte05vdGlmaWNhdGlvbn0sCiAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LAogICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBFdmVudCAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0V2ZW50fSwKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgICAgPT4gJFBhcmFte0F0dGFjaG1lbnRzfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkU3VjY2VzczsKCiAgICBteSAlRXZlbnREYXRhID0gJXsgJFRyYW5zcG9ydE9iamVjdC0+R2V0VHJhbnNwb3J0RXZlbnREYXRhKCkgfTsKCiAgICByZXR1cm4gMSBpZiAhJUV2ZW50RGF0YTsKCiAgICBpZiAoICEkRXZlbnREYXRhe0V2ZW50fSB8fCAhJEV2ZW50RGF0YXtEYXRhfSB8fCAhJEV2ZW50RGF0YXtVc2VySUR9ICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB0cmlnZ2VyIG5vdGlmaWNhdGlvbiBwb3N0IHNlbmQgZXZlbnQiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9GdXR1cmVUYXNrVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICAjIGdldCB0aGUgbmV4dCB1cGNvbWluZyBhcHBvaW50bWVudAogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCB1cGRhdGUgdXBjb21pbmcgYXBwb2ludG1lbnQgZGF0YSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFdmVudDo6VGlja2V0QXBwb2ludG1lbnRzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIGJhc2UgcXcoS2VybmVsOjpTeXN0ZW06OkFzeW5jaHJvbm91c0V4ZWN1dG9yKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRXZlbnQgRGF0YSBDb25maWcgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBBcHBvaW50bWVudElEIGluIERhdGEhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb3AgcHJvdGVjdGlvbjogcHJldmVudCBmcm9tIHJ1bm5pbmcgaWYgdXBkYXRlIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHRpY2tldCB1cGRhdGUKICAgIGlmICgKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKQogICAgICAgIC0+eydfVGlja2V0QXBwb2ludG1lbnRzOjpUaWNrZXRVcGRhdGUnfQogICAgICAgIC0+eyAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSB9KysKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgIyBydW4gb25seSBvbiB0aWNrZXQgYXBwb2ludG1lbnRzIChnZXQgdGlja2V0IGlkKQogICAgbXkgJFRpY2tldElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPlRpY2tldEFwcG9pbnRtZW50VGlja2V0SUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXRJRDsKCiAgICAjIHVwZGF0ZSB0aWNrZXQgaW4gYW4gYXN5bmNocm9ub3VzIGNhbGwKICAgIHJldHVybiAkU2VsZi0+QXN5bmNDYWxsKAogICAgICAgIE9iamVjdE5hbWUgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgICAgIEZ1bmN0aW9uTmFtZSAgID0+ICdUaWNrZXRBcHBvaW50bWVudFVwZGF0ZVRpY2tldCcsCiAgICAgICAgRnVuY3Rpb25QYXJhbXMgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICB9LAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0YTo6SUNhbDsKdXNlIERhdGE6OklDYWw6OkVudHJ5OjpFdmVudDsKdXNlIERhdGU6OklDYWw7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgp1c2UgY29uc3RhbnQgUEFDS0FHRV9OQU1FID0+ICdPVFJTQXBwb2ludG1lbnRDYWxlbmRhcic7CgpvdXIgJFBhY2thZ2VWZXJzaW9uOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCAtIGlDYWxlbmRhciBleHBvcnQgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkV4cG9ydCBmdW5jdGlvbnMgZm9yIGlDYWxlbmRhciBmb3JtYXQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXhwb3J0OjpJQ2FsJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIG15ICRQYWNrYWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnKTsKCiAgICBteSAkUGFja2FnZUluc3RhbGxlZCA9ICRQYWNrYWdlT2JqZWN0LT5QYWNrYWdlSXNJbnN0YWxsZWQoCiAgICAgICAgTmFtZSA9PiBQQUNLQUdFX05BTUUsCiAgICApOwoKICAgICMgSWYgcGFja2FnZSBpcyBpbnN0YWxsZWQsIGdldCB2ZXJzaW9uIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlci4KICAgIGlmICgkUGFja2FnZUluc3RhbGxlZCkgewogICAgICAgIG15IEBMaXN0ID0gJFBhY2thZ2VPYmplY3QtPlJlcG9zaXRvcnlMaXN0KAogICAgICAgICAgICBSZXN1bHQgPT4gJ3Nob3J0JywKICAgICAgICApOwoKICAgICAgICBQQUNLQUdFOgogICAgICAgIGZvciBteSAkUGFja2FnZSAoQExpc3QpIHsKICAgICAgICAgICAgaWYgKCAkUGFja2FnZS0+e05hbWV9IGVxIFBBQ0tBR0VfTkFNRSApIHsKICAgICAgICAgICAgICAgICRQYWNrYWdlVmVyc2lvbiA9ICRQYWNrYWdlLT57VmVyc2lvbn07CiAgICAgICAgICAgICAgICBsYXN0IFBBQ0tBR0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBPdGhlcndpc2UsIGluY2x1ZGUgZnJhbWV3b3JrIHZlcnNpb24gb25seS4KICAgIGVsc2UgewogICAgICAgICRQYWNrYWdlVmVyc2lvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVmVyc2lvbicpOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRXhwb3J0KCkKCmV4cG9ydCBjYWxlbmRhciB0byBpQ2FsZW5kYXIgZm9ybWF0CgogICAgbXkgJElDYWxTdHJpbmcgPSAkRXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCAgID0+IDEsICAgICMgKHJlcXVpcmVkKSBWYWxpZCBDYWxlbmRhcklECiAgICAgICAgVXNlcklEICAgICAgID0+IDEsICAgICMgKHJlcXVpcmVkKSBVc2VySUQKICAgICk7CgpyZXR1cm5zIGlDYWxlbmRhciBzdHJpbmcgaWYgc3VjY2Vzc2Z1bAoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUNhbGVuZGFyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIG15IEBBcHBvaW50bWVudElEcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICk7CgogICAgbXkgJElDYWxDYWxlbmRhciA9IERhdGE6OklDYWwtPm5ldygKICAgICAgICBjYWxuYW1lID0+ICRDYWxlbmRhcntDYWxlbmRhck5hbWV9LAogICAgKTsKCiAgICAjIGV4cG9ydCBjb2xvciBmb3IgYXBwbGUgY2FsZW5kYXIKICAgICRJQ2FsQ2FsZW5kYXItPmFkZF9wcm9wZXJ0eSgKICAgICAgICAneC1hcHBsZS1jYWxlbmRhci1jb2xvcicgPT4gJENhbGVuZGFye0NvbG9yfSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CgogICAgbXkgJFRlYW1PYmplY3Q7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICB9CgogICAgQVBQT0lOVE1FTlRfSUQ6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudElEcykgewogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfTsKCiAgICAgICAgIyBjYWxjdWxhdGUgc3RhcnQgdGltZQogICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICApOwogICAgICAgIG15ICRJQ2FsU3RhcnRUaW1lID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICBlcG9jaCA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2FsY3VsYXRlIGVuZCB0aW1lCiAgICAgICAgbXkgJEVuZFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7RW5kVGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbEVuZFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgIGVwb2NoID0+ICRFbmRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnQsIGRpc2NhcmQgdGltZSBkYXRhCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7QWxsRGF5fSApIHsKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkSUNhbFN0YXJ0VGltZSA9IERhdGU6OklDYWwtPm5ldygKICAgICAgICAgICAgICAgIHllYXIgICA9PiAkWWVhciwKICAgICAgICAgICAgICAgIG1vbnRoICA9PiAkTW9udGgsCiAgICAgICAgICAgICAgICBkYXkgICAgPT4gJERheSwKICAgICAgICAgICAgICAgIG9mZnNldCA9PiAnKzAwMDAnLCAgICAjIFVUQwogICAgICAgICAgICApOwogICAgICAgICAgICAoICRTZWMsICRNaW4sICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwogICAgICAgICAgICAkSUNhbEVuZFRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICB5ZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICBtb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgZGF5ICAgID0+ICREYXksCiAgICAgICAgICAgICAgICBvZmZzZXQgPT4gJyswMDAwJywgICAgIyBVVEMKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGlDYWxlbmRhciBldmVudCBlbnRyeQogICAgICAgIG15ICRJQ2FsRXZlbnQgPSBEYXRhOjpJQ2FsOjpFbnRyeTo6RXZlbnQtPm5ldygpOwoKICAgICAgICAjIG9wdGlvbmFsIHByb3BlcnRpZXMKICAgICAgICBteSAlSUNhbEV2ZW50UHJvcGVydGllczsKCiAgICAgICAgIyByZXBlYXRhYmxlIHByb3BlcnRpZXMKICAgICAgICBteSBASUNhbFJlcGVhdGFibGVQcm9wZXJ0aWVzOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtEZXNjcmlwdGlvbn0gKSB7CiAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze2Rlc2NyaXB0aW9ufSA9ICRBcHBvaW50bWVudHtEZXNjcmlwdGlvbn07CiAgICAgICAgfQogICAgICAgIGlmICggJEFwcG9pbnRtZW50e0xvY2F0aW9ufSApIHsKICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7bG9jYXRpb259ID0gJEFwcG9pbnRtZW50e0xvY2F0aW9ufTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9ID0gJyc7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1EQUlMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdXZWVrbHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICdGUkVRPVdFRUtMWSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdNb250aGx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAnRlJFUT1NT05USExZJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScgKSB7CiAgICAgICAgICAgICAgICAkSUNhbEV2ZW50UHJvcGVydGllc3tycnVsZX0gLj0gJ0ZSRVE9WUVBUkxZJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbURhaWx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1EQUlMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICJGUkVRPVdFRUtMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfSI7CgogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlRnJlcXVlbmN5fSApICkgewogICAgICAgICAgICAgICAgICAgIG15IEBEYXlOYW1lczsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREYXkgKCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF5ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ01PJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnVFUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSAzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdXRSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1RIJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREYXkgPT0gNSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheU5hbWVzLCAnRlInOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJERheSA9PSA2ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5TmFtZXMsICdTQSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGF5ID09IDcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlOYW1lcywgJ1NVJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICI7QllEQVk9IiAuIGpvaW4oICIsIiwgQERheU5hbWVzICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JyApIHsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiRlJFUT1NT05USExZO0lOVEVSVkFMPSRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9IjsKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVze3JydWxlfSAuPSAiO0JZTU9OVEhEQVk9IiAuIGpvaW4oICIsIiwgQHsgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VGcmVxdWVuY3l9IH0gKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknICkgewogICAgICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICJGUkVRPVlFQVJMWTtJTlRFUlZBTD0kQXBwb2ludG1lbnR7UmVjdXJyZW5jZUludGVydmFsfTtCWU1PTlRIREFZPSREYXkiOwogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICI7QllNT05USD0iIC4gam9pbiggIiwiLCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApOwoKICAgICAgICAgICAgICAgICMgUlJVTEU6RlJFUT1ZRUFSTFk7VU5USUw9MjAyMDA2MDJUMDgwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MTtCWU1PTlRIPTQKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWwgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZVVudGlsID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlVW50aWwsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICc7VU5USUw9JyAuIHN1YnN0ciggJElDYWxSZWN1cnJlbmNlVW50aWwtPmljYWwoKSwgMCwgLTEgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9ICkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudFByb3BlcnRpZXN7cnJ1bGV9IC49ICc7Q09VTlQ9JyAuICRBcHBvaW50bWVudHtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmVuY2VFeGNsdWRlfSApIHsKICAgICAgICAgICAgICAgIFJFQ1VSUkVOQ0VfRVhDTFVERToKICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgKCBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUV4Y2x1ZGV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBSRUNVUlJFTkNFX0VYQ0xVREUgaWYgISRSZWN1cnJlbmNlRXhjbHVkZTsKICAgICAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZUlEID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlY3VycmVuY2VFeGNsdWRlLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJElDYWxSZWN1cnJlbmNlSUQgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBASUNhbFJlcGVhdGFibGVQcm9wZXJ0aWVzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5ID0+ICdleGRhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXBwb2ludG1lbnR7QWxsRGF5fQogICAgICAgICAgICAgICAgICAgICAgICA/IHN1YnN0ciggJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKSwgMCwgLTEgKQogICAgICAgICAgICAgICAgICAgICAgICA6ICRJQ2FsUmVjdXJyZW5jZUlELT5pY2FsKCksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvY2N1cnJlbmNlIGFwcG9pbnRtZW50CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICkgewoKICAgICAgICAgICAgIyBvdmVycmlkZGVuIG9jY3VycmVuY2VzIG9ubHkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJRH0KICAgICAgICAgICAgICAgICYmIGdyZXAgeyAoICRfIC8vICcnICkgZXEgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJRH0gfSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUV4Y2x1ZGV9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmVuY2UgaWQKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRJQ2FsUmVjdXJyZW5jZUlEID0gRGF0ZTo6SUNhbC0+bmV3KAogICAgICAgICAgICAgICAgICAgIGVwb2NoID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRJQ2FsRXZlbnRQcm9wZXJ0aWVzeydyZWN1cnJlbmNlLWlkJ30KICAgICAgICAgICAgICAgICAgICA9ICRBcHBvaW50bWVudHtBbGxEYXl9ID8gc3Vic3RyKCAkSUNhbFJlY3VycmVuY2VJRC0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxSZWN1cnJlbmNlSUQtPmljYWwoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBza2lwIGlmIG5vdCBvdmVycmlkZGVuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVF9JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjYWxjdWxhdGUgbGFzdCBtb2RpZmllZCB0aW1lCiAgICAgICAgbXkgJENoYW5nZVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7Q2hhbmdlVGltZX0sCiAgICAgICAgKTsKICAgICAgICBteSAkSUNhbENoYW5nZVRpbWUgPSBEYXRlOjpJQ2FsLT5uZXcoCiAgICAgICAgICAgIGVwb2NoID0+ICRDaGFuZ2VUaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgIGlmICgkVGVhbU9iamVjdCkgewoKICAgICAgICAgICAgIyBpbmNsdWRlIHRlYW0gbmFtZXMKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtczsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZWFtIG5hbWVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7ICRBcHBvaW50bWVudHtUZWFtSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRUZWFtSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVRlYW0gPSAkVGVhbU9iamVjdC0+VGVhbUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRUZWFte05hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVGVhbXMsICRUZWFte05hbWV9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEBUZWFtcykgewogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICAgICAieC1vdHJzLXRlYW0iID0+IGpvaW4oICcsJywgQFRlYW1zICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpbmNsdWRlIHJlc291cmNlIG5hbWVzCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgQFVzZXJzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIEB7ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgkVXNlcklEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJ7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJzLCAkVXNlcntVc2VyTG9naW59OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEBVc2VycykgewogICAgICAgICAgICAgICAgICAgICRJQ2FsRXZlbnQtPmFkZF9wcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgICAgICAieC1vdHJzLXJlc291cmNlIiA9PiBqb2luKCAnLCcsIEBVc2VycyApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaW5jbHVkZSBwbHVnaW4gKGxpbmspIGRhdGEKICAgICAgICBteSAkUGx1Z2luTGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKICAgICAgICBmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5MaXN0fSApIHsKICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBMaW5rQXJyYXk7CiAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQExpbmtBcnJheSkgewogICAgICAgICAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgICAgICAgICAgIngtb3Rycy1wbHVnaW4tJFBsdWdpbktleSIgPT4gam9pbiggJywnLCBATGlua0FycmF5ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBib3RoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgIyByZW1vdmUgdGltZSB6b25lIGZsYWcgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzCiAgICAgICAgJElDYWxFdmVudC0+YWRkX3Byb3BlcnRpZXMoCiAgICAgICAgICAgIHN1bW1hcnkgICAgICAgICA9PiAkQXBwb2ludG1lbnR7VGl0bGV9LAogICAgICAgICAgICBkdHN0YXJ0ICAgICAgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0gPyBzdWJzdHIoICRJQ2FsU3RhcnRUaW1lLT5pY2FsKCksIDAsIC0xICkgOiAkSUNhbFN0YXJ0VGltZS0+aWNhbCgpLAogICAgICAgICAgICBkdGVuZCAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e0FsbERheX0gPyBzdWJzdHIoICRJQ2FsRW5kVGltZS0+aWNhbCgpLCAwLCAtMSApIDogJElDYWxFbmRUaW1lLT5pY2FsKCksCiAgICAgICAgICAgIHVpZCAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7VW5pcXVlSUR9LAogICAgICAgICAgICAnbGFzdC1tb2RpZmllZCcgPT4gJElDYWxDaGFuZ2VUaW1lLT5pY2FsKCksCiAgICAgICAgICAgICVJQ2FsRXZlbnRQcm9wZXJ0aWVzLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJlcGVhdGFibGUgcHJvcGVydGllcwogICAgICAgIGZvciBteSAkUmVwZWF0YWJsZSAoQElDYWxSZXBlYXRhYmxlUHJvcGVydGllcykgewogICAgICAgICAgICAkSUNhbEV2ZW50LT5hZGRfcHJvcGVydGllcygKICAgICAgICAgICAgICAgICRSZXBlYXRhYmxlLT57UHJvcGVydHl9ID0+ICRSZXBlYXRhYmxlLT57VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJElDYWxDYWxlbmRhci0+YWRkX2VudHJ5KCRJQ2FsRXZlbnQpOwogICAgfQoKICAgIHJldHVybiAkSUNhbENhbGVuZGFyLT5hc19zdHJpbmcoKTsKfQoKewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCgogICAgIyBJbmNsdWRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpbiBwcm9kdWN0IElEIHByb3BlcnR5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGJ5IHJlZGVmaW5pbmcKICAgICMgICBleHRlcm5hbCBsaWJyYXJ5IG1ldGhvZC4KICAgIHN1YiBEYXRhOjpJQ2FsOjpwcm9kdWN0X2lkIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgcmV0dXJuIFBBQ0tBR0VfTkFNRSAuICcgJyAuICRQYWNrYWdlVmVyc2lvbjsKICAgIH0KfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRGF0YTo6SUNhbDsKdXNlIERhdGE6OklDYWw6OkVudHJ5OjpFdmVudDsKdXNlIERhdGU6OklDYWw7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwgLSBpQ2FsZW5kYXIgaW1wb3J0IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpJbXBvcnQgZnVuY3Rpb25zIGZvciBpQ2FsZW5kYXIgZm9ybWF0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJbXBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkV4cG9ydDo6SUNhbCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEltcG9ydCgpCgppbXBvcnQgY2FsZW5kYXIgaW4gaUNhbGVuZGFyIGZvcm1hdAogICAgbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgPT4gMTIzLAogICAgICAgIElDYWwgICAgICAgICAgID0+ICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBpQ2FsIHN0cmluZwogICAgICAgICAgICAnCiAgICAgICAgICAgICAgICBCRUdJTjpWQ0FMRU5EQVIKICAgICAgICAgICAgICAgIFBST0RJRDpaaW1icmEtQ2FsZW5kYXItUHJvdmlkZXIKICAgICAgICAgICAgICAgIFZFUlNJT046Mi4wCiAgICAgICAgICAgICAgICBNRVRIT0Q6UkVRVUVTVAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICcsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAogICAgICAgIFVwZGF0ZUV4aXN0aW5nID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWxldGUgZXhpc3RpbmcgQXBwb2ludG1lbnRzIHdpdGhpbiBzYW1lIENhbGVuZGFyIGlmIFVuaXF1ZUlEIG1hdGNoZXMKICAgICAgICBVbnRpbExpbWl0ICAgICA9PiAnMjAxNy0wMS0wMSAwMDowMDowMCcsICAjIChvcHRpb25hbCkgSWYgcHJvdmlkZWQsIHN5c3RlbSB3aWxsIHVzZSB0aGlzIHZhbHVlIGZvciBsaW1pdGluZyByZWN1cnJpbmcgQXBwb2ludG1lbnRzIHdpdGhvdXQgZGVmaW5lZCBlbmQgZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBBcHBvaW50bWVudENhbGVuZGFyOjpJbXBvcnQ6OlJlY3VycmluZ01vbnRoc0xpbWl0IHRvIGRvIHRoZSBjYWxjdWxhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTk9URTogUExFQVNFIFVTRSBUSElTIFBBUkFNRVRFUiBGT1IgVU5JVCBURVNUUyBPTkxZCiAgICApOwoKcmV0dXJucyBudW1iZXIgb2YgaW1wb3J0ZWQgYXBwb2ludG1lbnRzIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSAwCgo9Y3V0CgpzdWIgSW1wb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIElDYWwgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVbnRpbExpbWl0ZWRUaW1lc3RhbXAgPSAkUGFyYW17VW50aWxMaW1pdH0gfHwgJyc7CgogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICBpZiAoICEkVW50aWxMaW1pdGVkVGltZXN0YW1wICkgewoKICAgICAgICAjIGNhbGN1bGF0ZSB1bnRpbCB0aW1lIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiB0aGVyZSBpcyBhbnkgcmVjdXJyaW5nIEFwcG9pbnRtZW50IHdpdGhvdXQgZW5kIHRpbWUgZGVmaW5lZC4KICAgICAgICBteSAkQ3VycmVudFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CiAgICAgICAgbXkgJFJlY3VycmluZ01vbnRoc0xpbWl0CiAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJBcHBvaW50bWVudENhbGVuZGFyOjpJbXBvcnQ6OlJlY3VycmluZ01vbnRoc0xpbWl0IikKICAgICAgICAgICAgfHwgJzEyJzsgICAgIyBkZWZhdWx0IDEyIG1vbnRocwoKICAgICAgICBteSAkVW50aWxMaW1pdGVkU3lzdGVtID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgIFRpbWUgICA9PiAkQ3VycmVudFN5c3RlbVRpbWUsCiAgICAgICAgICAgIE1vbnRocyA9PiAkUmVjdXJyaW5nTW9udGhzTGltaXQsCiAgICAgICAgKTsKICAgICAgICAkVW50aWxMaW1pdGVkVGltZXN0YW1wID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFVudGlsTGltaXRlZFN5c3RlbSwKICAgICAgICApOwogICAgfQoKICAgICMgVHVybiBvbiBVVEY4IGZsYWcgb24gc3VwcGxpZWQgc3RyaW5nIGZvciBjb3JyZWN0IGVuY29kaW5nIGluIFBvc3RncmVTUUwgYmFja2VuZC4KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoIFwkUGFyYW17SUNhbH0gKTsKCiAgICBteSAkQ2FsZW5kYXIgPSBEYXRhOjpJQ2FsLT5uZXcoIGRhdGEgPT4gJFBhcmFte0lDYWx9ICk7CgogICAgIyBJZiBleHRlcm5hbCBsaWJyYXJ5IGVuY291bnRlcmVkIGFuIGVycm9yIHdoaWxlIHBhcnNpbmcgdGhlIElDUyBmaWxlLCBsb2cgdGhlIHJlY2VpdmVkIG1lc3NhZ2UKICAgICMgICBhdCB0aGlzIHRpbWUgYW5kIHJldHVybi4KICAgIGlmICggJENhbGVuZGFyLT57ZXJybm99ICkgewogICAgICAgIG15ICRFcnJvck1lc3NhZ2UgPSAkQ2FsZW5kYXItPntlcnJvcl9tZXNzYWdlfSAvLyAnJzsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltEYXRhOjpJQ2FsXSAkRXJyb3JNZXNzYWdlIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBARW50cmllcyAgICAgICAgICAgICAgPSBAeyAkQ2FsZW5kYXItPmVudHJpZXMoKSB9OwogICAgbXkgJEFwcG9pbnRtZW50c0ltcG9ydGVkID0gMDsKICAgIG15ICVJQ2FsVGltZVpvbmVzOwoKICAgIG15ICRQbHVnaW5PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5IChARW50cmllcykgewogICAgICAgIG15ICRQcm9wZXJ0aWVzID0gJEVudHJ5LT5wcm9wZXJ0aWVzKCk7CgogICAgICAgIG15ICVQYXJhbWV0ZXJzOwogICAgICAgIG15ICVMaW5rZWRPYmplY3RzOwoKICAgICAgICAjIFByb2Nlc3MgdGltZXpvbmUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgSUNhbCBmaWxlLgogICAgICAgIGlmICggcmVmICRFbnRyeSBlcSAnRGF0YTo6SUNhbDo6RW50cnk6OlRpbWVab25lJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eyd0emlkJ30gKQogICAgICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3R6aWQnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3R6aWQnfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQgPSAkUHJvcGVydGllcy0+eyd0emlkJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgICAgICAgICAgbXkgJFRpbWV6b25lT2Zmc2V0OwoKICAgICAgICAgICAgICAgIG15IEBUaW1lem9uZUVudHJpZXMgPSBAeyAkRW50cnktPmVudHJpZXMoKSB9OwogICAgICAgICAgICAgICAgZm9yIG15ICRUaW1lem9uZUVudHJ5IChAVGltZXpvbmVFbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWV6b25lUHJvcGVydGllcyA9ICRUaW1lem9uZUVudHJ5LT5wcm9wZXJ0aWVzKCk7CgogICAgICAgICAgICAgICAgICAgICMgU2F2ZSBvbmx5IHNpbXBsZSB0aW1lIHpvbmVzLCB3aXRob3V0IGRheWxpZ2h0IHNhdmluZ3MgcnVsZXMuCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBFeHRlbmQgdG8gaW5jbHVkZSBhbGwgb3RoZXIgZGVmaW5pdGlvbnMsIGVzcGVjaWFsbHkgd2l0aCBjb21wbGljYXRlZAogICAgICAgICAgICAgICAgICAgICMgICAgICAgcnVsZXMgZm9yIGRheWxpZ2h0IHNhdmluZ3MgKHNlZSBFZ3lwdCkuCiAgICAgICAgICAgICAgICAgICAgaWYgKCByZWYgJFRpbWV6b25lRW50cnkgZXEgJ0RhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6U3RhbmRhcmQnICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFuZGFyZCB0aW1lIHpvbmVzIHNob3VsZCBoYXZlIFRaT0ZGU0VUVE8gYW5kIFRaT0ZGU0VURlJPTSBzZXQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICMgICBzYW1lIHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXR0byd9ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0dG8nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXR0byd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0ZnJvbSd9ICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlZiAkVGltZXpvbmVQcm9wZXJ0aWVzLT57J3R6b2Zmc2V0ZnJvbSd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaW1lem9uZVByb3BlcnRpZXMtPnsndHpvZmZzZXR0byd9LT5bMF0tPnsndmFsdWUnfSBlcQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldGZyb20nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lT2Zmc2V0ID0gJFRpbWV6b25lUHJvcGVydGllcy0+eyd0em9mZnNldHRvJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHpvbmVzLCB0aGlzIHdpbGwgYmUgb2ZmbG9hZGVkIHRvIERhdGVUaW1lOjpUaW1lWm9uZQogICAgICAgICAgICAgICAgICAgICMgICBvYmplY3QgZm9yIGNvbXBsZXhpdHkuCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCByZWYgJFRpbWV6b25lRW50cnkgZXEgJ0RhdGE6OklDYWw6OkVudHJ5OjpUaW1lWm9uZTo6RGF5bGlnaHQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVPZmZzZXQgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRUaW1lem9uZU9mZnNldCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBPZmZzZXRzIGFyZSBkZWZpbmVkIGFzIGhvdXJzIGFuZCBtaW51dGVzLCBpLmUuICIrMDIwMCIsIHdlIG5lZWQgZGVjaW1hbCBob3Vycy4KICAgICAgICAgICAgICAgICAgICBpZiAoICRUaW1lem9uZU9mZnNldCA9fiAvICgtfFwrKT8gKFswLTldezIsfSkgKFswLTldezIsfSkgL3ggKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTaWduICAgPSAkMTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE9mZnNldCA9ICQyICsgJDMgLyA2MDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2lnbiBlcSAnLScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2Zmc2V0ICo9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRJQ2FsVGltZVpvbmVzeyRUaW1lem9uZUlEfSA9ICRPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1aWQKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnsndWlkJ30gKQogICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsndWlkJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3VpZCd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW1ldGVyc3tVbmlxdWVJRH0gPSAkUHJvcGVydGllcy0+eyd1aWQnfS0+WzBdLT57J3ZhbHVlJ307CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aXRsZQogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydzdW1tYXJ5J30gKQogICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsnc3VtbWFyeSd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydzdW1tYXJ5J30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbWV0ZXJze1RpdGxlfSA9ICRQcm9wZXJ0aWVzLT57J3N1bW1hcnknfS0+WzBdLT57J3ZhbHVlJ307CiAgICAgICAgfQoKICAgICAgICAjIGdldCBkZXNjcmlwdGlvbgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydkZXNjcmlwdGlvbid9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2Rlc2NyaXB0aW9uJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J2Rlc2NyaXB0aW9uJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbWV0ZXJze0Rlc2NyaXB0aW9ufSA9ICRQcm9wZXJ0aWVzLT57J2Rlc2NyaXB0aW9uJ30tPlswXS0+eyd2YWx1ZSd9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3RhcnQgdGltZQogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30gKQogICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBteSAkVGltZXpvbmVJRDsKCiAgICAgICAgICAgIGlmICggcmVmICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgaXQncyBhbiBhbGwgZGF5IGV2ZW50CiAgICAgICAgICAgICAgICAjIDEpIHRoZXJlIGlzIG5vIHRpbWUgY29tcG9uZW50IGZvciB0aGUgZGF0ZSB2YWx1ZQogICAgICAgICAgICAgICAgIyAyKSB0aGVyZSBpcyBhbiBleHBsaWNpdCB2YWx1ZSBwYXJhbWV0ZXIgc2V0IHRvIERBVEUKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBsZW5ndGggJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsndmFsdWUnfSA9PSA4CiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVkFMVUUnfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1ZBTFVFJ30gZXEgJ0RBVEUnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tBbGxEYXl9ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIHRpbWV6b25lCiAgICAgICAgICAgICAgICBpZiAoICRQcm9wZXJ0aWVzLT57J2R0c3RhcnQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsnZHRzdGFydCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdGFydFRpbWVJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgVGltZSA9PiAkUHJvcGVydGllcy0+eydkdHN0YXJ0J30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTdGFydFRpbWVJQ2FsLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRUaW1lem9uZUlEKSB7CiAgICAgICAgICAgICAgICBteSAkT2Zmc2V0ID0gJElDYWxUaW1lWm9uZXN7JFRpbWV6b25lSUR9IC8vICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAkVGltZXpvbmVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YXJ0VGltZSAtPSAkT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJFBhcmFtZXRlcnN7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NhbE9mZnNldCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YXJ0VGltZSArPSAkTG9jYWxPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW1ldGVyc3tTdGFydFRpbWV9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBlbmQgdGltZQogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydkdGVuZCd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRUaW1lem9uZUlEOwoKICAgICAgICAgICAgaWYgKCByZWYgJFByb3BlcnRpZXMtPnsnZHRlbmQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGltZXpvbmUKICAgICAgICAgICAgICAgIGlmICggJFByb3BlcnRpZXMtPnsnZHRlbmQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lem9uZUlEID0gJFByb3BlcnRpZXMtPnsnZHRlbmQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRW5kVGltZUlDYWwgPSAkU2VsZi0+X0Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICBUaW1lID0+ICRQcm9wZXJ0aWVzLT57J2R0ZW5kJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRW5kVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRW5kVGltZUlDYWwsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFRpbWV6b25lSUQpIHsKICAgICAgICAgICAgICAgIG15ICRPZmZzZXQgPSAkSUNhbFRpbWVab25lc3skVGltZXpvbmVJRH0gLy8gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICBUaW1lem9uZUlEID0+ICRUaW1lem9uZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEVuZFRpbWUgLT0gJE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRQYXJhbWV0ZXJze0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTG9jYWxPZmZzZXQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkxvY2FsVGltZXpvbmVPZmZzZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRW5kVGltZSArPSAkTG9jYWxPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW1ldGVyc3tFbmRUaW1lfSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRW5kVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU29tZSBpQ2FsZW5kYXIgaW1wbGVtZW50YXRpb25zIChsb29raW5nIGF0IHlvdSBpY2FsZW5kYXItcnVieSkgZG8gbm90IHJlcXVpcmUgbm9yIGluY2x1ZGUKICAgICAgICAjICAgZW5kIHRpbWUgZm9yIGFwcG9pbnRtZW50cy4gSW4gdGhpcyBjYXNlLCBwcmV2ZW50IGZhaWxpbmcgYW5kIHVzZSBzdGFydCB0aW1lIGluc3RlYWQuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbWV0ZXJze0VuZFRpbWV9ID0gJFBhcmFtZXRlcnN7U3RhcnRUaW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxvY2F0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57J2xvY2F0aW9uJ30gKQogICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsnbG9jYXRpb24nfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsnbG9jYXRpb24nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFtZXRlcnN7TG9jYXRpb259ID0gJFByb3BlcnRpZXMtPnsnbG9jYXRpb24nfS0+WzBdLT57J3ZhbHVlJ307CiAgICAgICAgfQoKICAgICAgICAjIGdldCBycnVsZQogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydycnVsZSd9ICkKICAgICAgICAgICAgJiYgcmVmICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICggJEZyZXF1ZW5jeSwgJFVudGlsLCAkSW50ZXJ2YWwsICRDb3VudCwgJERheU5hbWVzLCAkTW9udGhEYXksICRNb250aHMgKTsKCiAgICAgICAgICAgIG15IEBSdWxlcyA9IHNwbGl0ICc7JywgJFByb3BlcnRpZXMtPnsncnJ1bGUnfS0+WzBdLT57J3ZhbHVlJ307CgogICAgICAgICAgICBSVUxFOgogICAgICAgICAgICBmb3IgbXkgJFJ1bGUgKEBSdWxlcykgewoKICAgICAgICAgICAgICAgIGlmICggJFJ1bGUgPX4gL0ZSRVE9KC4qPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEZyZXF1ZW5jeSA9ICQxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUnVsZSA9fiAvVU5USUw9KC4qPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFVudGlsID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9JTlRFUlZBTD0oXGQrPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEludGVydmFsID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9DT1VOVD0oXGQrPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50ID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9CWURBWT0oLio/KSQvaSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF5TmFtZXMgPSAkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFJ1bGUgPX4gL0JZTU9OVEhEQVk9KC4qPykkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ID0gJDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlID1+IC9CWU1PTlRIPSguKj8pJC9pICkgewogICAgICAgICAgICAgICAgICAgICRNb250aHMgPSAkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEludGVydmFsIHx8PSAxOyAgICAjIGRlZmF1bHQgdmFsdWUKCiAgICAgICAgICAgICMgdGhpcyBhcHBvaW50bWVudCBpcyByZXBlYXRpbmcKICAgICAgICAgICAgaWYgKCAkRnJlcXVlbmN5IGVxICJEQUlMWSIgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJpbmd9ICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VUeXBlfSAgICAgPSAkSW50ZXJ2YWwgPT0gMSA/ICJEYWlseSIgOiAiQ3VzdG9tRGFpbHkiOwogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRnJlcXVlbmN5IGVxICJXRUVLTFkiICkgewogICAgICAgICAgICAgICAgaWYgKCREYXlOYW1lcykgewoKICAgICAgICAgICAgICAgICAgICAjIGN1c3RvbQoKICAgICAgICAgICAgICAgICAgICBteSBARGF5czsKCiAgICAgICAgICAgICAgICAgICAgIyBTVSxNTyxUVSxXRSxUSCxGUixTQQogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5TmFtZSAoIHNwbGl0KCAnLCcsICREYXlOYW1lcyApICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB1YyAkRGF5TmFtZSBlcSAnTU8nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdUVScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCAyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1dFJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnVEgnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgNDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHVjICREYXlOYW1lIGVxICdGUicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXlzLCA1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggdWMgJERheU5hbWUgZXEgJ1NBJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQERheXMsIDY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCB1YyAkRGF5TmFtZSBlcSAnU1UnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF5cywgNzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCBzY2FsYXIgQERheXMgPiAwICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyaW5nfSAgICAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgICA9ICJDdXN0b21XZWVrbHkiOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlSW50ZXJ2YWx9ICA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQERheXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBlYWNoIG4gZGF5cwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VUeXBlfSAgICAgPSAiV2Vla2x5IjsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlSW50ZXJ2YWx9ID0gJEludGVydmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEZyZXF1ZW5jeSBlcSAiTU9OVEhMWSIgKSB7CgogICAgICAgICAgICAgICAgIyBTa2lwIHVuc3VwcG9ydGVkIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBydWxlczoKICAgICAgICAgICAgICAgICMgICAtIEZSRVE9TU9OVEhMWTtCWURBWT0yU0EKICAgICAgICAgICAgICAgIGlmICgkRGF5TmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNraXAgaW1wb3J0IG9mIHVuc3VwcG9ydGVkIHJlY3VycmluZyBydWxlOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRQcm9wZXJ0aWVzLT57J3JydWxlJ30tPlswXS0+eyd2YWx1ZSd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJE1vbnRoRGF5KSB7CgogICAgICAgICAgICAgICAgICAgICMgQ3VzdG9tCiAgICAgICAgICAgICAgICAgICAgIyBGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAxMDFUMDgwMDAwWjtCWU1PTlRIREFZPTE2LDMxJwogICAgICAgICAgICAgICAgICAgIG15IEBEYXlzID0gc3BsaXQoICcsJywgJE1vbnRoRGF5ICk7CgogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlVHlwZX0gICAgICA9ICJDdXN0b21Nb250aGx5IjsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxARGF5czsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlSW50ZXJ2YWx9ICA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VUeXBlfSAgICAgPSAiTW9udGhseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUludGVydmFsfSA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGcmVxdWVuY3kgZXEgIllFQVJMWSIgKSB7CgogICAgICAgICAgICAgICAgIyBTa2lwIHVuc3VwcG9ydGVkIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIHJ1bGVzOgogICAgICAgICAgICAgICAgIyAgIC0gRlJFUT1ZRUFSTFk7QllNT05USD0zO0JZREFZPS0xU1UKICAgICAgICAgICAgICAgICMgICAtIEZSRVE9WUVBUkxZO0JZTU9OVEg9MTA7QllEQVk9LTFTVQogICAgICAgICAgICAgICAgaWYgKCREYXlOYW1lcykgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2tpcCBpbXBvcnQgb2YgdW5zdXBwb3J0ZWQgcmVjdXJyaW5nIHJ1bGU6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFByb3BlcnRpZXMtPnsncnJ1bGUnfS0+WzBdLT57J3ZhbHVlJ30sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBNb250aHMgPSBzcGxpdCggJywnLCAkTW9udGhzIHx8ICcnICk7CgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZVN5c3RlbSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFtZXRlcnN7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBARGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWVTeXN0ZW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBzY2FsYXIgQE1vbnRocyA+IDEKICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhciBATW9udGhzID09IDEKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJERhdGVbM10gIT0gJE1vbnRoc1swXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyaW5nfSAgICAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VUeXBlfSAgICAgID0gIkN1c3RvbVllYXJseSI7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoczsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlSW50ZXJ2YWx9ICA9ICRJbnRlcnZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmluZ30gICAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgICAgICRQYXJhbWV0ZXJze1JlY3VycmVuY2VUeXBlfSAgICAgPSAiWWVhcmx5IjsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tSZWN1cnJlbmNlSW50ZXJ2YWx9ID0gJEludGVydmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZSRVE9WUVBUkxZO0lOVEVSVkFMPTI7QllNT05USD0xLDIsMTIKICAgICAgICAgICAgIyBGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAzMDJUMTIxNTAwWicKICAgICAgICAgICAgIyBGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAyMDJUMDkwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MzEnLAogICAgICAgICAgICAjIEZSRVE9V0VFS0xZO0lOVEVSVkFMPTI7QllEQVk9VFUKICAgICAgICAgICAgIyBGUkVRPVlFQVJMWTtVTlRJTD0yMDIwMDYwMlQwODAwMDBaO0lOVEVSVkFMPTI7QllNT05USERBWT0xO0JZTU9OVEg9NCc7CgogICAgICAgICAgICAjIEZSRVE9REFJTFk7Q09VTlQ9MwoKICAgICAgICAgICAgaWYgKCRVbnRpbCkgewogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVVudGlsfSA9ICRTZWxmLT5fRm9ybWF0VGltZSgKICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRVbnRpbCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRDb3VudCkgewogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUNvdW50fSA9ICRDb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICMgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZVVudGlsfSA9ICRVbnRpbExpbWl0ZWRUaW1lc3RhbXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXhjbHVkZWQgZGF0ZXMKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57J2V4ZGF0ZSd9ICkgKSB7CiAgICAgICAgICAgICAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEV4Y2x1ZGUgKCBAeyAkUHJvcGVydGllcy0+eydleGRhdGUnfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmICRFeGNsdWRlIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEV4Y2x1ZGUtPnsndmFsdWUnfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGltZXpvbmVJRDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZWYgJEV4Y2x1ZGUtPnsnX3BhcmFtZXRlcnMnfSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aW1lem9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRXhjbHVkZS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZXpvbmVJRCA9ICRFeGNsdWRlLT57J19wYXJhbWV0ZXJzJ30tPnsnVFpJRCd9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkRXhjbHVkZVRpbWVJQ2FsID0gJFNlbGYtPl9Gb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkRXhjbHVkZS0+eyd2YWx1ZSd9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEV4Y2x1ZGVUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFeGNsdWRlVGltZUlDYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFRpbWV6b25lSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRPZmZzZXQgPSAkSUNhbFRpbWVab25lc3skVGltZXpvbmVJRH0gLy8gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lem9uZUlEID0+ICRUaW1lem9uZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgPT4gJEV4Y2x1ZGVUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNsdWRlVGltZSAtPSAkT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFtZXRlcnN7QWxsRGF5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbE9mZnNldCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+TG9jYWxUaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRFeGNsdWRlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjbHVkZVRpbWUgKz0gJExvY2FsT2Zmc2V0ICogMzYwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAUmVjdXJyZW5jZUV4Y2x1ZGUsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkRXhjbHVkZVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVjdXJyZW5jZUV4Y2x1ZGV9ID0gXEBSZWN1cnJlbmNlRXhjbHVkZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRlYW0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eyd4LW90cnMtdGVhbSd9ICkKICAgICAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eyd4LW90cnMtdGVhbSd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAgICAgJiYgJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfS0+WzBdLT57J3ZhbHVlJ30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQFRlYW1zID0gc3BsaXQoICIsIiwgJFByb3BlcnRpZXMtPnsneC1vdHJzLXRlYW0nfS0+WzBdLT57J3ZhbHVlJ30gKTsKCiAgICAgICAgICAgICAgICBpZiAoQFRlYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFRlYW1JRHM7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHRlYW0gaWRzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUZWFtTmFtZSAoQFRlYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUZWFtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyktPlRlYW1HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFRlYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBUZWFtSURzLCAkVGVhbXtJRH0gaWYgJFRlYW17SUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUGFyYW1ldGVyc3tUZWFtSUR9ID0gXEBUZWFtSURzIGlmIEBUZWFtSURzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCByZXNvdXJjZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0FycmF5UmVmV2l0aERhdGEoICRQcm9wZXJ0aWVzLT57J3gtb3Rycy1yZXNvdXJjZSd9ICkKICAgICAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eyd4LW90cnMtcmVzb3VyY2UnfS0+WzBdIGVxICdEYXRhOjpJQ2FsOjpQcm9wZXJ0eScKICAgICAgICAgICAgICAgICYmICRQcm9wZXJ0aWVzLT57J3gtb3Rycy1yZXNvdXJjZSd9LT5bMF0tPnsndmFsdWUnfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSBAUmVzb3VyY2VzID0gc3BsaXQoICIsIiwgJFByb3BlcnRpZXMtPnsneC1vdHJzLXJlc291cmNlJ30tPlswXS0+eyd2YWx1ZSd9ICk7CgogICAgICAgICAgICAgICAgaWYgKEBSZXNvdXJjZXMpIHsKICAgICAgICAgICAgICAgICAgICBteSBAVXNlcnM7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgaWRzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyTG9naW4gKEBSZXNvdXJjZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAVXNlcnMsICRVc2VySUQgaWYgJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFtZXRlcnN7UmVzb3VyY2VJRH0gPSBcQFVzZXJzIGlmIEBVc2VyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXZhaWxhYmxlIHBsdWdpbiBrZXlzIHN1aXRhYmxlIGZvciBsb3dlcmNhc2Ugc2VhcmNoCiAgICAgICAgbXkgJFBsdWdpbktleXMgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5LZXlzKCk7CgogICAgICAgICMgcGx1Z2luIGZpZWxkcyAoc3RhcnQgd2l0aCAneC1vdHJzLXBsdWdpbi0nKQogICAgICAgIG15IEBQbHVnaW5GaWVsZHMgPSBncmVwIHsgJF8gPX4gL3gtb3Rycy1wbHVnaW4tL2kgfSBrZXlzICV7JFByb3BlcnRpZXN9OwoKICAgICAgICBQTFVHSU5GSUVMRDoKICAgICAgICBmb3IgbXkgJFBsdWdpbkZpZWxkIChAUGx1Z2luRmllbGRzKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzQXJyYXlSZWZXaXRoRGF0YSggJFByb3BlcnRpZXMtPnskUGx1Z2luRmllbGR9ICkKICAgICAgICAgICAgICAgICYmIHJlZiAkUHJvcGVydGllcy0+eyRQbHVnaW5GaWVsZH0tPlswXSBlcSAnRGF0YTo6SUNhbDo6UHJvcGVydHknCiAgICAgICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eyRQbHVnaW5GaWVsZH0tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBsb3dlcmNhc2UgcGx1Z2luIGtleQogICAgICAgICAgICAgICAgJFBsdWdpbkZpZWxkID1+IC94LW90cnMtcGx1Z2luLSguKikkLzsKICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXlMQyA9ICQxOwoKICAgICAgICAgICAgICAgICMgZ2V0IHByb3BlciBwbHVnaW4ga2V5CiAgICAgICAgICAgICAgICBteSAkUGx1Z2luS2V5ID0gJFBsdWdpbktleXMtPnskUGx1Z2luS2V5TEN9OwogICAgICAgICAgICAgICAgbmV4dCBQTFVHSU5GSUVMRCBpZiAhJFBsdWdpbktleTsKCiAgICAgICAgICAgICAgICBteSBAUGx1Z2luRGF0YSA9IHNwbGl0KCAiLCIsICRQcm9wZXJ0aWVzLT57JFBsdWdpbkZpZWxkfS0+WzBdLT57J3ZhbHVlJ30gKTsKICAgICAgICAgICAgICAgICRMaW5rZWRPYmplY3RzeyRQbHVnaW5LZXl9ID0gXEBQbHVnaW5EYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0IEVOVFJZIGlmICEkUGFyYW1ldGVyc3tUaXRsZX07CgogICAgICAgIG15ICVBcHBvaW50bWVudDsKCiAgICAgICAgIyBnZXQgcmVjdXJyZW5jZSBpZAogICAgICAgIGlmICgKICAgICAgICAgICAgSXNBcnJheVJlZldpdGhEYXRhKCAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30gKQogICAgICAgICAgICAmJiByZWYgJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0gZXEgJ0RhdGE6OklDYWw6OlByb3BlcnR5JwogICAgICAgICAgICAmJiAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eyd2YWx1ZSd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgZ2V0IHBhcmVudCBpZAogICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgVW5pcXVlSUQgICA9PiAkUGFyYW1ldGVyc3tVbmlxdWVJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgJFBhcmFtZXRlcnN7UGFyZW50SUR9ID0gJFBhcmVudEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICAgICAgbXkgJFRpbWV6b25lSUQ7CiAgICAgICAgICAgIGlmICggcmVmICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdLT57J19wYXJhbWV0ZXJzJ30gZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGltZXpvbmUKICAgICAgICAgICAgICAgIGlmICggJFByb3BlcnRpZXMtPnsncmVjdXJyZW5jZS1pZCd9LT5bMF0tPnsnX3BhcmFtZXRlcnMnfS0+eydUWklEJ30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFRpbWV6b25lSUQgPSAkUHJvcGVydGllcy0+eydyZWN1cnJlbmNlLWlkJ30tPlswXS0+eydfcGFyYW1ldGVycyd9LT57J1RaSUQnfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VJRElDYWwgPSAkU2VsZi0+X0Zvcm1hdFRpbWUoCiAgICAgICAgICAgICAgICBUaW1lID0+ICRQcm9wZXJ0aWVzLT57J3JlY3VycmVuY2UtaWQnfS0+WzBdLT57J3ZhbHVlJ30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlY3VycmVuY2VJRElDYWwsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJFRpbWV6b25lSUQpIHsKICAgICAgICAgICAgICAgIG15ICRPZmZzZXQgPSAkSUNhbFRpbWVab25lc3skVGltZXpvbmVJRH0gLy8gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICBUaW1lem9uZUlEID0+ICRUaW1lem9uZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWUgICAgICAgPT4gJFJlY3VycmVuY2VJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUmVjdXJyZW5jZUlEIC09ICRPZmZzZXQgKiAzNjAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW1ldGVyc3tBbGxEYXl9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsT2Zmc2V0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5Mb2NhbFRpbWV6b25lT2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpbWUgPT4gJFJlY3VycmVuY2VJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUmVjdXJyZW5jZUlEICs9ICRMb2NhbE9mZnNldCAqIDM2MDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlSUR9ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRSZWN1cnJlbmNlSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBvdmVycmlkZGVuIG9jY3VycmVuY2UKICAgICAgICAgICAgJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoCiAgICAgICAgICAgICAgICBVbmlxdWVJRCAgICAgPT4gJFBhcmFtZXRlcnN7VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkUGFyYW17UmVjdXJyZW5jZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgaWYgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlEIGluIHRoZSBzYW1lIGNhbGVuZGFyIGFscmVhZHkgZXhpc3RzLgogICAgICAgIGVsc2UgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgVW5pcXVlSUQgICA9PiAkUGFyYW1ldGVyc3tVbmlxdWVJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgJiYgKCAhJFBhcmFte1VwZGF0ZUV4aXN0aW5nfSB8fCAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gIT0gJFBhcmFte0NhbGVuZGFySUR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBJZiBvdmVyd3JpdGUgb3B0aW9uIGlzbid0IGFjdGl2YXRlZCwgY3JlYXRlIG5ldyBhcHBvaW50bWVudCBieSBjbGVhcmluZyB0aGUgVW5pcXVlSUQuCiAgICAgICAgICAgICAgICBpZiAoJUFwcG9pbnRtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbWV0ZXJze1VuaXF1ZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyBhcHBvaW50bWVudCBleGlzdHMgaW4gc2FtZSBDYWxlbmRhciwgdXBkYXRlIGl0CiAgICAgICAgaWYgKAogICAgICAgICAgICAlQXBwb2ludG1lbnQKICAgICAgICAgICAgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICYmICRQYXJhbXtDYWxlbmRhcklEfSA9PSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAlUGFyYW1ldGVycywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGhlcmUgaXMgbm8gYXBwb2ludG1lbnQsIGNyZWF0ZSBuZXcgb25lCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICVQYXJhbWV0ZXJzLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgICAgICBQTFVHSU5LRVk6CiAgICAgICAgICAgIGZvciBteSAkUGx1Z2luS2V5ICggc29ydCBrZXlzICVMaW5rZWRPYmplY3RzICkgewogICAgICAgICAgICAgICAgbmV4dCBQTFVHSU5LRVkgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJExpbmtlZE9iamVjdHN7JFBsdWdpbktleX0gKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBsaW5rcwogICAgICAgICAgICAgICAgZm9yIG15ICRQbHVnaW5EYXRhICggQHsgJExpbmtlZE9iamVjdHN7JFBsdWdpbktleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkTGlua1N1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXkgICAgID0+ICRQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgICAgPT4gJFBsdWdpbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJExpbmtTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgb2JqZWN0IGxpbmsgKEFwcG9pbnRtZW50SUQ9JFN1Y2Nlc3MgLSAkUGx1Z2luS2V5PSRQbHVnaW5EYXRhKSBkdXJpbmcgY2FsZW5kYXIgaW1wb3J0ISIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRBcHBvaW50bWVudHNJbXBvcnRlZCsrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEFwcG9pbnRtZW50c0ltcG9ydGVkOwp9CgpzdWIgX0Zvcm1hdFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRpbWVTdGFtcDsKCiAgICBpZiAoICRQYXJhbXtUaW1lfSA9fiAvKFxkezR9KShcZHsyfSkoXGR7Mn0pVChcZHsyfSkoXGR7Mn0pKFxkezJ9KS9pICkgewoKICAgICAgICAjIGZvcm1hdCBzdHJpbmcKICAgICAgICAkVGltZVN0YW1wID0gIiQxLSQyLSQzICQ0OiQ1OiQ2IjsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1RpbWV9ID1+IC8oXGR7NH0pKFxkezJ9KShcZHsyfSkvICkgewoKICAgICAgICAjIG9ubHkgZGF0ZSBpcyBnaXZlbiAod2l0aG91dCB0aW1lKQogICAgICAgICRUaW1lU3RhbXAgPSAiJDEtJDItJDMgMDA6MDA6MDAiOwogICAgfQoKICAgIHJldHVybiAkVGltZVN0YW1wOwp9Cgp7CiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOyAgICAjIyBubyBjcml0aWMKCiAgICAjIEluY2x1ZGUgYWRkaXRpb25hbCBvcHRpb25hbCByZXBlYXRhYmxlIHByb3BlcnRpZXMgdXNlZCBieSBzb21lIGlDYWxlbmRhciBpbXBsZW1lbnRhdGlvbnMsIGluIG9yZGVyCiAgICAjICAgdG8gcHJldmVudCBQZXJsIHdhcm5pbmdzLgogICAgc3ViIERhdGE6OklDYWw6OkVudHJ5OjpBbGFybTo6b3B0aW9uYWxfcmVwZWF0YWJsZV9wcm9wZXJ0aWVzIHsgICAgIyMgbm8gY3JpdGljCiAgICAgICAgcXcoCiAgICAgICAgICAgIHVpZCBhY2tub3dsZWRnZWQgcmVsYXRlZC10byBkZXNjcmlwdGlvbgogICAgICAgICk7CiAgICB9Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCAtIER5bmFtaWNGaWVsZCBhcHBvaW50bWVudCB0eXBlCgo9aGVhZDEgU1lOT1BTSVMKCkR5bmFtaWNGaWVsZCB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0RHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkR5bmFtaWNGaWVsZCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEdldFRpbWUoKQoKcmV0dXJucyB0aW1lIHZhbHVlIGZvciBkeW5hbWljIGZpZWxkIGFwcG9pbnRtZW50IHR5cGUuCgogICAgbXkgJFN0YXJ0VGltZSA9ICRUaWNrZXREeW5hbWljRmllbGRPYmplY3QtPkdldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0VGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBUaWNrZXRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YSBpbmNsLiBkeW5hbWljIGZpZWxkcwogICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwogICAgcmV0dXJuIGlmICEkVGlja2V0eyAkUGFyYW17VHlwZX0gfTsKCiAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIGEgdmFsaWQgdGltZSB2YWx1ZSBhbmQgcmV0dXJuIGl0CiAgICBpZiAoICRUaWNrZXR7ICRQYXJhbXtUeXBlfSB9ID1+ICdcZHs0fS1cZHsyfS1cZHsyfSBcZHsyfTpcZHsyfTpcZHsyfScgKSB7CiAgICAgICAgcmV0dXJuICRUaWNrZXR7ICRQYXJhbXtUeXBlfSB9OwogICAgfQoKICAgIHJldHVybjsKfQoKPWl0ZW0gU2V0VGltZSgpCgpzZXQgdGlja2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgdG8gc3VwcGxpZWQgdGltZSB2YWx1ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXREeW5hbWljRmllbGRPYmplY3QtPlNldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ0R5bmFtaWNGaWVsZF9UZXN0RGF0ZScsCiAgICAgICAgVmFsdWUgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgVGlja2V0SUQgPT4gMSwKICAgICk7CgpyZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KCj1jdXQKCnN1YiBTZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFZhbHVlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgZGF0YQogICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkUGFyYW17VHlwZX07CiAgICAkRHluYW1pY0ZpZWxkTmFtZSA9fiBzL15EeW5hbWljRmllbGRfLy87CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICk7CiAgICByZXR1cm4gaWYgISREeW5hbWljRmllbGQ7CgogICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZQogICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKS0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZC0+e0lEfSwKICAgICAgICBPYmplY3RJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OkVzY2FsYXRpb25UaW1lIC0gRXNjYWxhdGlvblRpbWUgYXBwb2ludG1lbnQgdHlwZQoKPWhlYWQxIFNZTk9QU0lTCgpFc2NhbGF0aW9uVGltZSB0aWNrZXQgYXBwb2ludG1lbnQgdHlwZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGlja2V0RXNjYWxhdGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRpY2tldDo6RXNjYWxhdGlvblRpbWUnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZXRUaW1lKCkKCnJldHVybnMgdGltZSB2YWx1ZSBmb3IgZXNjYWxhdGlvbiB0aW1lIGFwcG9pbnRtZW50IHR5cGUuCgogICAgbXkgJFNvbHV0aW9uVGltZSA9ICRUaWNrZXRFc2NhbGF0aW9uVGltZU9iamVjdC0+R2V0VGltZSgKICAgICAgICBUeXBlICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBHZXRUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUeXBlIFRpY2tldElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRUaWNrZXR7ICRQYXJhbXtUeXBlfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07CgogICAgIyByZXR1cm4gZXNjYWxhdGlvbiBkZXN0aW5hdGlvbiBkYXRlCiAgICByZXR1cm4gJFRpY2tldHsgJFBhcmFte1R5cGV9IC4gJ0Rlc3RpbmF0aW9uRGF0ZScgfTsKfQoKPWl0ZW0gU2V0VGltZSgpCgpkb2VzIG5vdGhpbmcsIGFzIHlvdSBjYW5ub3QgZXhwbGljaXRseSBzZXQgdGlja2V0IGVzY2FsYXRpb24gdGltZXMuCnJldHVybnMgMSB0byBwcmV2ZW50IGVycm9ycyBpbiBsb2cuCgo9Y3V0CgpzdWIgU2V0VGltZSB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGlja2V0OjpFc2NhbGF0aW9uVGltZSAtIFBlbmRpbmdUaW1lIGFwcG9pbnRtZW50IHR5cGUKCj1oZWFkMSBTWU5PUFNJUwoKUGVuZGluZ1RpbWUgdGlja2V0IGFwcG9pbnRtZW50IHR5cGUuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHksIGluc3RlYWQgdXNlOgoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJFRpY2tldFBlbmRpbmdUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUaWNrZXQ6OlBlbmRpbmdUaW1lJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2V0VGltZSgpCgpyZXR1cm5zIHRpbWUgdmFsdWUgZm9yIHBlbmRpbmcgdGltZSBhcHBvaW50bWVudCB0eXBlLgoKICAgIG15ICRQZW5kaW5nVGltZSA9ICRUaWNrZXRQZW5kaW5nVGltZU9iamVjdC0+R2V0VGltZSgKICAgICAgICBUeXBlICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpY2tldElEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEdldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldHtVbnRpbFRpbWV9OwoKICAgICMgZ2V0IGNhbGVuZGFyIGhlbHBlciBvYmplY3QKICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgIyByZXR1cm4gcGVuZGluZyB0aW1lCiAgICByZXR1cm4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyAkVGlja2V0e1VudGlsVGltZX0sCiAgICApOwp9Cgo9aXRlbSBTZXRUaW1lKCkKCnNldCB0aWNrZXQgcGVuZGluZyB0aW1lIHRvIHN1cHBsaWVkIHRpbWUgdmFsdWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0UGVuZGluZ1RpbWVPYmplY3QtPlNldFRpbWUoCiAgICAgICAgVHlwZSAgICAgPT4gJ1BlbmRpbmdUaW1lJywKICAgICAgICBWYWx1ZSAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcKICAgICAgICBUaWNrZXRJRCA9PiAxLAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsLgoKPWN1dAoKc3ViIFNldFRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgVmFsdWUgVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2FsZW5kYXIgaGVscGVyIG9iamVjdAogICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKCiAgICAjIGdldCBkYXRlIGNvbXBvbmVudHMKICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCggU3RyaW5nID0+ICRQYXJhbXtWYWx1ZX0gKSwKICAgICk7CgogICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgWWVhciAgICAgPT4gJFllYXIsCiAgICAgICAgTW9udGggICAgPT4gJE1vbnRoLAogICAgICAgIERheSAgICAgID0+ICREYXksCiAgICAgICAgSG91ciAgICAgPT4gJEhvdXIsCiAgICAgICAgTWludXRlICAgPT4gJE1pbnV0ZSwKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6RGFlbW9uTW9kdWxlczo6U2NoZWR1bGVyVGFza1dvcmtlcjo6Q2FsZW5kYXJBcHBvaW50bWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OkJhc2VUYXNrV29ya2VyKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQgLSBTY2hlZHVsZXIgZGFlbW9uIHRhc2sgaGFuZGxlciBtb2R1bGUgZm9yIENhbGVuZGFyQXBwb2ludG1lbnQKCj1oZWFkMSBTWU5PUFNJUwoKVGhpcyB0YXNrIGhhbmRsZXIgZXhlY3V0ZXMgY2FsZW5kYXIgYXBwb2ludG1lbnQgam9icwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGFza0hhbmRsZXJPYmplY3QgPSAkS2VybmVsOjpPTS1HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkNhbGVuZGFyQXBwb2ludG1lbnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RGVidWd9ICAgICAgPSAkUGFyYW17RGVidWd9OwogICAgJFNlbGYtPntXb3JrZXJOYW1lfSA9ICdXb3JrZXI6IENhbGVuZGFyQXBwb2ludG1lbnQnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gUnVuKCkKCnBlcmZvcm1zIHRoZSBzZWxlY3RlZCB0YXNrLgoKICAgIG15ICRSZXN1bHQgPSAkVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgICAgICBUYXNrSUQgICA9PiAxMjMsCiAgICAgICAgVGFza05hbWUgPT4gJ3NvbWUgbmFtZScsICAgICMgb3B0aW9uYWwKICAgICAgICBEYXRhICAgICA9PiB7ICAgICAgICAgICAgICAgIyBhcHBvaW50bWVudCBpZCBhcyBnb3QgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50OjpBcHBvaW50bWVudEdldCgpCiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLAogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICAkUmVzdWx0ID0gMTsgIyBvciBmYWlsIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHRhc2sgcGFyYW1zCiAgICBteSAkQ2hlY2tSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVGFza1BhcmFtcygKICAgICAgICAlUGFyYW0sCiAgICAgICAgTmVlZGVkRGF0YUF0dHJpYnV0ZXMgPT4gWydOb3RpZnlUaW1lJ10sCiAgICApOwoKICAgICMgc3RvcCBleGVjdXRpb24gaWYgYW4gZXJyb3IgaW4gcGFyYW1zIGlzIGRldGVjdGVkCiAgICByZXR1cm4gaWYgISRDaGVja1Jlc3VsdDsKCiAgICAjIHRyaWdnZXIgdGhlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbgogICAgbXkgJFN1Y2Nlc3MKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnROb3RpZmljYXRpb24oICV7ICRQYXJhbXtEYXRhfSB9ICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdHJpZ2dlciBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZm9yIEFwcG9pbnRtZW50SUQgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50Cgo9aGVhZDEgU1lOT1BTSVMKCkFwcG9pbnRtZW50IGJhY2tlbmQgZm9yIHRoZSBhcHBvaW50bWVudCBsaW5rIG9iamVjdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkTGlua09iamVjdEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gTGlua0xpc3RXaXRoRGF0YSgpCgpmaWxsIHVwIHRoZSBsaW5rIGxpc3Qgd2l0aCBkYXRhCgogICAgJFN1Y2Nlc3MgPSAkTGlua09iamVjdEJhY2tlbmQtPkxpbmtMaXN0V2l0aERhdGEoCiAgICAgICAgTGlua0xpc3QgICAgICAgICAgICAgICAgICAgICA9PiAkSGFzaFJlZiwKICAgICAgICBJZ25vcmVMaW5rZWRUaWNrZXRTdGF0ZVR5cGVzID0+IDB8MSwgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0V2l0aERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTGlua0xpc3QgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIGlmICggcmVmICRQYXJhbXtMaW5rTGlzdH0gbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTGlua0xpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5rVHlwZSAoIHNvcnQga2V5cyAleyAkUGFyYW17TGlua0xpc3R9IH0gKSB7CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9IH0gKSB7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudElEICggc29ydCBrZXlzICV7ICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGlkIGZyb20gaGFzaCBpZiBubyBzZXJ2aWNlIGRhdGEgd2FzIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQXBwb2ludG1lbnQgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn0tPnskQXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBUFBPSU5UTUVOVDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFkZCBhcHBvaW50bWVudCBkYXRhCiAgICAgICAgICAgICAgICAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259LT57JEFwcG9pbnRtZW50SUR9ID0gXCVBcHBvaW50bWVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gT2JqZWN0UGVybWlzc2lvbigpCgpjaGVja3MgcmVhZCBwZXJtaXNzaW9uIGZvciBhIGdpdmVuIG9iamVjdCBhbmQgVXNlcklELgoKICAgICRQZXJtaXNzaW9uID0gJExpbmtPYmplY3QtPk9iamVjdFBlcm1pc3Npb24oCiAgICAgICAgT2JqZWN0ICA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIEtleSAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0UGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBUT0RPOiBQZXJtaXNzaW9uIGhhbmRsaW5nCgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+IDEyMywKICAgICAgICBMb25nICAgPT4gIlRoZSBBcHBvaW50bWVudCBUaXRsZSIsCiAgICApOwoKICAgICVEZXNjcmlwdGlvbiA9ICRMaW5rT2JqZWN0LT5PYmplY3REZXNjcmlwdGlvbkdldCgKICAgICAgICBLZXkgICAgID0+IDEyMywKICAgICAgICBNb2RlICAgID0+ICdUZW1wb3JhcnknLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgZGVzY3JpcHRpb24KICAgIG15ICVEZXNjcmlwdGlvbiA9ICgKICAgICAgICBOb3JtYWwgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBMb25nICAgPT4gJ0FwcG9pbnRtZW50JywKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbiBpZiAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdUZW1wb3JhcnknOwoKICAgICMgZ2V0IHRpY2tldAogICAgbXkgJUFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtLZXl9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISVBcHBvaW50bWVudDsKCiAgICAjIGNyZWF0ZSBkZXNjcmlwdGlvbgogICAgJURlc2NyaXB0aW9uID0gKAogICAgICAgIE5vcm1hbCA9PiAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgTG9uZyAgID0+ICRBcHBvaW50bWVudHtUaXRsZX0sCiAgICApOwoKICAgIHJldHVybiAlRGVzY3JpcHRpb247Cn0KCj1pdGVtIE9iamVjdFNlYXJjaCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgdGhlIHNlYXJjaCByZXN1bHRzCgpSZXR1cm4KICAgICRTZWFyY2hMaXN0ID0gewogICAgICAgIE5PVExJTktFRCA9PiB7CiAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgIDIxMiA9PiAkRGF0YU9mSXRlbTIxMiwKICAgICAgICAgICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkU2VhcmNoTGlzdCA9ICRMaW5rT2JqZWN0QmFja2VuZC0+T2JqZWN0U2VhcmNoKAogICAgICAgIFN1Yk9iamVjdCAgICA9PiAnQmxhJywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFNlYXJjaFBhcmFtcyA9PiAkSGFzaFJlZiwgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgcGFyYW1zCiAgICAkUGFyYW17U2VhcmNoUGFyYW1zfSB8fD0ge307CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwoKICAgIG15ICVTZWFyY2g7CiAgICBteSBAQ2FsZW5kYXJJRHM7CiAgICBteSBAQXBwb2ludG1lbnRzOwoKICAgICMgU2VhcmNoIGJ5IGFwcG9pbnRtZW50IHRpdGxlIGFuZCBkZXNjcmlwdGlvbiwgaWYgc3VwcGxpZWQuIFRoZSBjb252ZXJzaW9uIG9mIHBhcmFtZXRlciBuYW1lcyBpcwogICAgIyAgIG5lY2Vzc2FyeSwgc2luY2UgbGluayBvYmplY3Qgc2VhcmNoIHBhcmFtZXRlcnMgc2hvdWxkIGhhdmUgdW5pcXVlIG5hbWVzLgogICAgaWYgKCAkUGFyYW17U2VhcmNoUGFyYW1zfS0+e0FwcG9pbnRtZW50VGl0bGV9ICkgewogICAgICAgICRTZWFyY2h7VGl0bGV9ID0gJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudFRpdGxlfTsKICAgIH0KICAgIGlmICggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudERlc2NyaXB0aW9ufSApIHsKICAgICAgICAkU2VhcmNoe0Rlc2NyaXB0aW9ufSA9ICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnREZXNjcmlwdGlvbn07CiAgICB9CgogICAgIyBTZWFyY2ggYnkgc3BlY2lmaWMgY2FsZW5kYXIgSURzLgogICAgaWYgKAogICAgICAgICRQYXJhbXtTZWFyY2hQYXJhbXN9LT57QXBwb2ludG1lbnRDYWxlbmRhcklEfQogICAgICAgICYmIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudENhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgQENhbGVuZGFySURzID0gQHsgJFBhcmFte1NlYXJjaFBhcmFtc30tPntBcHBvaW50bWVudENhbGVuZGFySUR9IH07CiAgICB9CgogICAgIyBTZWFyY2ggaW4gYWxsIGF2YWlsYWJsZSBjYWxlbmRhcnMgZm9yIHRoZSB1c2VyLgogICAgZWxzZSB7CiAgICAgICAgbXkgQENhbGVuZGFyTGlzdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBQZXJtaXNzaW9uID0+ICdydycsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBAQ2FsZW5kYXJJRHMgPSBtYXAgeyAkXy0+e0NhbGVuZGFySUR9IH0gQENhbGVuZGFyTGlzdDsKICAgIH0KCiAgICBmb3IgbXkgJENhbGVuZGFySUQgKEBDYWxlbmRhcklEcykgewogICAgICAgIG15IEBDYWxlbmRhckFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAlU2VhcmNoLAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50cywgQENhbGVuZGFyQXBwb2ludG1lbnRzOwogICAgfQoKICAgICMgYWRkIGFwcG9pbnRtZW50IGRhdGEKICAgIG15ICVTZWFyY2hMaXN0OwogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICRTZWFyY2hMaXN0e05PVExJTktFRH0tPntTb3VyY2V9LT57ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IH0gPSAkQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoTGlzdDsKfQoKPWl0ZW0gTGlua0FkZFByZSgpCgpsaW5rIGFkZCBwcmUgZXZlbnQgbW9kdWxlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0FkZFByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZFByZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgVHlwZSBTdGF0ZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxIGlmICRQYXJhbXtTdGF0ZX0gZXEgJ1RlbXBvcmFyeSc7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtBZGRQb3N0KCkKCmxpbmsgYWRkIHByZSBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtBZGRQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGRQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVQcmUoKQoKbGluayBkZWxldGUgcHJlIGV2ZW50IG1vZHVsZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQcmUoCiAgICAgICAgS2V5ICAgICAgICAgID0+IDEyMywKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gMzIxLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTGlua0RlbGV0ZVBvc3QoKQoKbGluayBkZWxldGUgcG9zdCBldmVudCBtb2R1bGUKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gMTIzLAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAzMjEsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGVQb3N0KAogICAgICAgIEtleSAgICAgICAgICA9PiAxMjMsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+IDMyMSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVQb3N0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBUeXBlIFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlRpY2tldEFwcG9pbnRtZW50czsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBiYXNlIHF3KEtlcm5lbDo6U3lzdGVtOjpBc3luY2hyb25vdXNFeGVjdXRvcik7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte0RhdGF9LT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQgaW4gRGF0YSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgbG9vcCBwcm90ZWN0aW9uOiBvbmx5IGV4ZWN1dGUgdGhpcyBoYW5kbGVyIG9uY2UgZm9yIGVhY2ggdGlja2V0CiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpCiAgICAgICAgLT57J19UaWNrZXRBcHBvaW50bWVudHM6OkFscmVhZHlQcm9jZXNzZWQnfQogICAgICAgIC0+eyAkUGFyYW17RGF0YX0tPntUaWNrZXRJRH0gfSsrCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGhhbmRsZSB0aWNrZXQgYXBwb2ludG1lbnRzIGluIGFuIGFzeW5jaHJvbm91cyBjYWxsCiAgICByZXR1cm4gJFNlbGYtPkFzeW5jQ2FsbCgKICAgICAgICBPYmplY3ROYW1lICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJywKICAgICAgICBGdW5jdGlvbk5hbWUgICA9PiAnVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzVGlja2V0JywKICAgICAgICBGdW5jdGlvblBhcmFtcyA9PiB7CiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKCiAgICB9LAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG5lZWRlZCBvYmplY3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRIZWxwZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJEdyb3VwT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVGVzdEVtYWlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsOjpUZXN0Jyk7Cm15ICRDYWxlbmRhck9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjb25maWcgY2hhbmdlcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRpc2FibGUgcmljaCB0ZXh0IGVkaXRvcgpteSAkU3VjY2VzcyA9ICRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgVmFsdWUgPT4gMCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRGlzYWJsZSBSaWNoVGV4dCB3aXRoIHRydWUiLAopOwoKIyB1c2UgVGVzdCBlbWFpbCBiYWNrZW5kCiRTdWNjZXNzID0gJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ1NlbmRtYWlsTW9kdWxlJywKICAgIFZhbHVlID0+ICdLZXJuZWw6OlN5c3RlbTo6RW1haWw6OlRlc3QnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJTZXQgRW1haWwgVGVzdCBiYWNrZW5kIHdpdGggdHJ1ZSIsCik7CgojIHNldCBub3Qgc2VsZiBub3RpZnkKJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnQWdlbnRTZWxmTm90aWZ5T25BY3Rpb24nLAogICAgVmFsdWUgPT4gMCwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRGlzYWJsZSBBZ2VudCBTZWxmIE5vdGlmeSBPbiBBY3Rpb24iLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGVtYWlsIHRlc3QgYmFja2VuZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU3VjY2VzcyA9ICRUZXN0RW1haWxPYmplY3QtPkNsZWFuVXAoKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdJbml0aWFsIGNsZWFudXAnLAopOwoKJFNlbGYtPklzRGVlcGx5KAogICAgJFRlc3RFbWFpbE9iamVjdC0+RW1haWxzR2V0KCksCiAgICBbXSwKICAgICdUZXN0IGJhY2tlbmQgZW1wdHkgYWZ0ZXIgaW5pdGlhbCBjbGVhbnVwJywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyB1c2VyIGNyZWF0ZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBhIG5ldyB1c2VyIGZvciBjdXJyZW50IHRlc3QKbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXJPYmplY3QtPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFsndXNlcnMnXSwKKTsKbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICBVc2VyID0+ICRVc2VyTG9naW4sCik7Cm15ICRVc2VySUQgPSAkVXNlckRhdGF7VXNlcklEfTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBncm91cCBjcmVhdGUKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBJRCA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICd1bml0dGVzdGdyb3VwJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCksCiAgICBDb21tZW50ID0+ICdjb21tZW50IGRlc2NyaWJpbmcgdGhlIGdyb3VwJywKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEdyb3VwSUQsCiAgICAnR3JvdXAgY3JlYXRlJywKKTsKCiRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICdHcm91cCB1c2VyIGFkZCcsCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgY2FsZW5kYXIgY3JlYXRlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIGNhbGVuZGFyIGFuZCBhcHBvaW50bWVudApteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICd1bml0dGVzdGNhbGVuZGFyJyAuICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCksCiAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICBWYWxpZElEICAgICAgPT4gMSwKKTsKCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lID0+ICdTaW5nbGUgUmVjaXBpZW50QWdlbnQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBFdmVudHMgICAgICAgICAgID0+IFsnQ2FsZW5kYXJVcGRhdGUnXSwKICAgICAgICAgICAgUmVjaXBpZW50QWdlbnRzICA9PiBbJFVzZXJJRF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblR5cGUgPT4gWydBcHBvaW50bWVudCddLAogICAgICAgIH0sCiAgICAgICAgRXhwZWN0ZWRSZXN1bHRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVG9BcnJheSA9PiBbICRVc2VyRGF0YXtVc2VyRW1haWx9IF0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICJDYWxlbmRlcjogJENhbGVuZGFye0NhbGVuZGFyTmFtZX09XG4iLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgPT4gJ1JlY2lwaWVudCBDdXN0b21lciAtIEp1c3RUb1JlYWxDdXN0b21lciBlbmFibGVkJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgRXZlbnRzICAgICAgICAgICA9PiBbJ0NhbGVuZGFyVXBkYXRlJ10sCiAgICAgICAgICAgIFJlY2lwaWVudHMgICAgICAgPT4gWydDdXN0b21lciddLAogICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICB9LAogICAgICAgIEV4cGVjdGVkUmVzdWx0cyAgICA9PiBbXSwKICAgICAgICBKdXN0VG9SZWFsQ3VzdG9tZXIgPT4gMSwKICAgIH0sCik7CgpteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcpOwpteSAkRXZlbnROb3RpZmljYXRpb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6RXZlbnQ6Ok5vdGlmaWNhdGlvbicpOwoKbXkgJENvdW50ID0gMDsKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIGFkZCB0cmFuc3BvcnQgc2V0dGluZwogICAgJFRlc3QtPntEYXRhfS0+e1RyYW5zcG9ydHN9ID0gWydFbWFpbCddOwoKICAgICMgc2V0IGp1c3QgdG8gcmVhbCBjdXN0b21lcgogICAgbXkgJEp1c3RUb1JlYWxDdXN0b21lciA9ICRUZXN0LT57SnVzdFRvUmVhbEN1c3RvbWVyfSB8fCAwOwogICAgJFN1Y2Nlc3MgPSAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTm90aWZ5SnVzdFRvUmVhbEN1c3RvbWVyJywKICAgICAgICBWYWx1ZSA9PiAkSnVzdFRvUmVhbEN1c3RvbWVyLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiU2V0IG5vdGlmaWNhdGlvbnMganVzdCB0byByZWFsIGN1c3RvbWVyOiAkSnVzdFRvUmVhbEN1c3RvbWVyLiIsCiAgICApOwoKICAgIG15ICROb3RpZmljYXRpb25JRCA9ICROb3RpZmljYXRpb25FdmVudE9iamVjdC0+Tm90aWZpY2F0aW9uQWRkKAogICAgICAgIE5hbWUgICAgPT4gIkpvYk5hbWUkQ291bnQiLAogICAgICAgIERhdGEgICAgPT4gJFRlc3QtPntEYXRhfSwKICAgICAgICBNZXNzYWdlID0+IHsKICAgICAgICAgICAgZW4gPT4gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgPT4gJ0pvYk5hbWUnLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJ0NhbGVuZGVyOiA8T1RSU19DQUxFTkRBUl9DQUxFTkRBUk5BTUU+JywKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIENvbW1lbnQgPT4gJ0FuIG9wdGlvbmFsIGNvbW1lbnQnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICMgc2FuaXR5IGNoZWNrCiAgICAkU2VsZi0+SXNOb3QoCiAgICAgICAgJE5vdGlmaWNhdGlvbklELAogICAgICAgIHVuZGVmLAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm90aWZpY2F0aW9uQWRkKCkgc2hvdWxkIG5vdCBiZSB1bmRlZiIsCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAkRXZlbnROb3RpZmljYXRpb25FdmVudE9iamVjdC0+UnVuKAogICAgICAgIEV2ZW50ID0+ICdDYWxlbmRhclVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7fSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgJEVtYWlscyA9ICRUZXN0RW1haWxPYmplY3QtPkVtYWlsc0dldCgpOwoKICAgICMgcmVtb3ZlIG5vdCBuZWVkZWQgZGF0YQogICAgZm9yIG15ICRFbWFpbCAoIEB7JEVtYWlsc30gKSB7CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KEZyb20gSGVhZGVyKSkgewogICAgICAgICAgICBkZWxldGUgJEVtYWlsLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQoKICAgICAgICAjIGRlLXJlZmVyZW5jZSBib2R5CiAgICAgICAgJEVtYWlsLT57Qm9keX0gPSAkeyAkRW1haWwtPntCb2R5fSB9OwogICAgfQoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkRW1haWxzLAogICAgICAgICRUZXN0LT57RXhwZWN0ZWRSZXN1bHRzfSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlY2lwaWVudHMiLAogICAgKTsKCiAgICAjIGRlbGV0ZSBub3RpZmljYXRpb24gZXZlbnQKICAgIG15ICROb3RpZmljYXRpb25EZWxldGUgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkRlbGV0ZSgKICAgICAgICBJRCAgICAgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIHNhbml0eSBjaGVjawogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5vdGlmaWNhdGlvbkRlbGV0ZSwKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vdGlmaWNhdGlvbkRlbGV0ZSgpIHN1Y2Nlc3NmdWwgZm9yIE5vdGlmaWNhdGlvbiBJRCAkTm90aWZpY2F0aW9uSUQiLAogICAgKTsKCiAgICAkVGVzdEVtYWlsT2JqZWN0LT5DbGVhblVwKCk7CgogICAgJENvdW50Kys7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKIyBjcmVhdGUgdGVzdCB1c2VyCm15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luICk7CgokU2VsZi0+VHJ1ZSgKICAgICRVc2VySUQsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgY3JlYXRlZCIsCik7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRSYW5kb21JRDsKbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIlRlc3QgZ3JvdXAgJFVzZXJJRCBjcmVhdGVkIiwKKTsKCiMgYWRkIHRlc3QgdXNlciB0byB0ZXN0IGdyb3VwCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgIGNyZWF0ZSAgICA9PiAxLAogICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgIHByaW9yaXR5ICA9PiAxLAogICAgICAgIHJ3ICAgICAgICA9PiAxLAogICAgfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJUZXN0IHVzZXIgJFVzZXJJRCBhZGRlZCB0byB0ZXN0IGdyb3VwICRHcm91cElEIiwKKTsKCm15IEBDYWxlbmRhcklEczsKCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJDcmVhdGUoKQojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBNaXNzaW5nIENhbGVuZGFyTmFtZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ29sb3IgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgR3JvdXBJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE1pc3NpbmcgQ29sb3InLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIFdyb25nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAncmVkJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIEFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJDcmVhdGUgLSBTYW1lIG5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIEludmFsaWQgc3RhdGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTIiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckNyZWF0ZSAtIE9wdGlvbmFsIHBhcmFtZXRlcnMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSAgICAgICA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTMiLAogICAgICAgICAgICBDb2xvciAgICAgICAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnRmlyc3RSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzUnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbMl0sCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgIGZvciBteSAkS2V5IChxdyhDYWxlbmRhcklEIEdyb3VwSUQgQ2FsZW5kYXJOYW1lIENvbG9yIENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSBWYWxpZElEKSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gJEtleSBleGlzdHMiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIERhdGEgZm9yICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQ2FsZW5kYXJJRHMsICRDYWxlbmRhcntDYWxlbmRhcklEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckdldCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBNaXNzaW5nIENhbGVuZGFyTmFtZSBhbmQgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJHZXQgLSBGaXJzdCBjYWxlbmRhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckdldCAtIFNlY29uZCBjYWxlbmRhcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyR2V0IC0gVGhpcmQgY2FsZW5kYXInLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlELTMiLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBkYXRhCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXkgKHF3KENhbGVuZGFySUQgR3JvdXBJRCBDYWxlbmRhck5hbWUgQ29sb3IgQ3JlYXRlVGltZSBDcmVhdGVCeSBDaGFuZ2VUaW1lIENoYW5nZUJ5IFZhbGlkSUQpKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJENhbGVuZGFyeyRLZXl9LAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBieSBpZAogICAgICAgIG15ICVDYWxlbmRhckJ5SUQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNvbXBhcmUgcmV0dXJuZWQgZGF0YQogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVDYWxlbmRhciwKICAgICAgICAgICAgXCVDYWxlbmRhckJ5SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gR2V0IGJ5IENhbGVuZGFySUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyTGlzdCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0NhbGVuZGFyTGlzdCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJMaXN0IC0gV2l0aCBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhckxpc3QgLSBXaXRoIFVzZXJJRCBhbmQgb25seSB2YWxpZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgQ291bnQgICA9PiAyLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyTGlzdCAtIFdpdGggVXNlcklEIGFuZCBvbmx5IGludmFsaWQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gMiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIENvdW50ICAgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIGRhdGEKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKCiAgICAgICAgIyBjaGVjayBjb3VudAogICAgICAgIGlmICggJFRlc3QtPntDb3VudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAUmVzdWx0LAogICAgICAgICAgICAgICAgJFRlc3QtPntDb3VudH0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlc3VsdCBjb3VudCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbXBhcmUgcmV0dXJuZWQgZGF0YQogICAgICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAUmVzdWx0KSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQ2FsZW5kYXJJRCBHcm91cElEIENhbGVuZGFyTmFtZSBDb2xvciBDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkgVmFsaWRJRCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhci0+eyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtICRLZXkgZXhpc3RzIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGJ5IGlkCiAgICAgICAgICAgICAgICBteSAlQ2FsZW5kYXJCeUlEID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhci0+e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBkZWxldGUgJENhbGVuZGFyQnlJRHtUaWNrZXRBcHBvaW50bWVudHN9OwoKICAgICAgICAgICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICAgICAgXCVDYWxlbmRhckJ5SUQsCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBDb21wYXJlIHJldHVybmVkIGRhdGEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBzY2FsYXIgQFJlc3VsdCA+IDEsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEhhcyByZXN1bHQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgQFJlc3VsdCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIENhbGVuZGFyVXBkYXRlKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDYWxlbmRhcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgR3JvdXBJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJDaGFuZ2UtJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBDYWxlbmRhck5hbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDb2xvciAgICAgID0+ICcjRkY5OTAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBNaXNzaW5nIENvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdDYWxlbmRhclVwZGF0ZSAtIE1pc3NpbmcgVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAyLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gTWlzc2luZyBWYWxpZElEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2hhbmdlLSRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIHBhcmFtcyBmaXJzdCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgID0+ICRDYWxlbmRhcklEc1swXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNoYW5nZS0kUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNGRjk5MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDIsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJVcGRhdGUgLSBBbGwgcmVxdWlyZWQgYW5kIGFuIG9wdGlvbmFsIHBhcmFtIHNlY29uZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNoYW5nZS0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdGaXJzdFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfNScsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ1RoaXMgaXMgYSB0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzID0+ICdUaGlzIGlzIGEgdHlwZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyVXBkYXRlIC0gQWxsIHJlcXVpcmVkIGFuZCBhbiBvcHRpb25hbCBwYXJhbSB0aGlyZCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgR3JvdXBJRCAgICAgICAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBDYWxlbmRhck5hbWUgICAgICAgPT4gIkNoYW5nZS0kUmFuZG9tSUQtMiIsCiAgICAgICAgICAgIENvbG9yICAgICAgICAgICAgICA9PiAnI0ZGOTkwMCcsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiB1bmRlZiwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgICAgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJVcGRhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBieSBpZAogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFRlc3QtPntDb25maWd9LT57Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdVc2VySUQnOwoKICAgICAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAgICAgJFRlc3QtPntDb25maWd9LT57JEtleX0sCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJ7JEtleX0sCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIERhdGEgZm9yICRLZXkiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDYWxlbmRhclBlcm1pc3Npb25HZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhclBlcm1pc3Npb25HZXQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIE1pc3NpbmcgQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uR2V0IC0gTWlzc2luZyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIEFsbCBwYXJhbXMgZmlyc3QnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzBdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgUmVzdWx0ICA9PiAncncnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyUGVybWlzc2lvbkdldCAtIEFsbCBwYXJhbXMgc2Vjb25kJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklEc1sxXSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJ3J3JywKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgIyBjaGVjayBwZXJtaXNzaW9uCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUGVybWlzc2lvbiwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFBlcm1pc3Npb24iLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRQZXJtaXNzaW9uLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgR2V0VGV4dENvbG9yKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnR2V0VGV4dENvbG9yIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBJbnZhbGlkIGNvbG9yJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjQ0NDQ0MnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0dldFRleHRDb2xvciAtIFdoaXRlJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjRkZGJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjMDAwJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBMaWdodCBHcmF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjODA4MDgwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjMDAwJywKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdHZXRUZXh0Q29sb3IgLSBEYXJrIEdyYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIEJhY2tncm91bmQgPT4gJyM3OTc5NzknLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFJlc3VsdCAgPT4gJyNGRkZGRkYnLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0dldFRleHRDb2xvciAtIEJsYWNrJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBCYWNrZ3JvdW5kID0+ICcjMDAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBSZXN1bHQgID0+ICcjRkZGRkZGJywKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJFRleHRDb2xvciA9ICRDYWxlbmRhck9iamVjdC0+R2V0VGV4dENvbG9yKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICAjIGNoZWNrIHRleHQgY29sb3IKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRUZXh0Q29sb3IsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUZXh0IGNvbG9yIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkVGV4dENvbG9yLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQ2FsZW5kYXJFeHBvcnQoKSBhbmQgQ2FsZW5kYXJJbXBvcnQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdDYWxlbmRhckV4cG9ydC9JbXBvcnQgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NhbGVuZGFyRXhwb3J0L0ltcG9ydCAtIE5vIENhbGVuZGFyRGF0YScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ2FsZW5kYXJFeHBvcnQvSW1wb3J0IC0gQWxsIHBhcmFtcyB3aXRoIG92ZXJ3cml0ZScsCiAgICAgICAgRXhwb3J0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMl0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgT3ZlcndyaXRlRXhpc3RpbmdFbnRpdGllcyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRHNbMl0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudDEtJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySURzWzJdLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQyLSRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgYXBwb2ludG1lbnRzCiAgICBpZiAoICRUZXN0LT57QXBwb2ludG1lbnRzfSApIHsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50ICggQHsgJFRlc3QtPntBcHBvaW50bWVudHN9IH0gKSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ3JlYXRlZCBhcHBvaW50bWVudCAoJEFwcG9pbnRtZW50SUQpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBleHBvcnQgY2FsZW5kYXIKICAgIGlmICggJFRlc3QtPntFeHBvcnR9ICkgewogICAgICAgIG15ICVEYXRhID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckV4cG9ydCgKICAgICAgICAgICAgJXsgJFRlc3QtPntFeHBvcnR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgJFRlc3QtPntDb25maWd9LT57RGF0YX0gPSBcJURhdGE7CiAgICB9CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJJbXBvcnQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgICMgY2hlY2sgcmVzdWx0CiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICV7ICRUZXN0LT57RXhwb3J0fSB9LAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgQ3JlYXRlVGltZSBhbmQgQ2hhbmdlVGltZSBzaW5jZSB0aGV5IG1pZ2h0IGRpZmZlcgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICRDYWxlbmRhcnskS2V5fSA9IHVuZGVmOwogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0NhbGVuZGFyRGF0YX0tPnskS2V5fSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcJUNhbGVuZGFyLAogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0NhbGVuZGFyRGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQ2FsZW5kYXIgZGF0YSIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0V4cG9ydH0gfSwKICAgICAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50RGF0YTsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSA9IHVuZGVmOwoKICAgICAgICAgICAgIyByZXNldCBDcmVhdGVUaW1lIGFuZCBDaGFuZ2VUaW1lIHNpbmNlIHRoZXkgbWlnaHQgZGlmZmVyCiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0gPSB1bmRlZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnREYXRhLCBcJUFwcG9pbnRtZW50OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoIEB7ICRUZXN0LT57Q29uZmlnfS0+e0RhdGF9LT57QXBwb2ludG1lbnREYXRhfSB9ICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9IHVuZGVmOwoKICAgICAgICAgICAgIyByZXNldCBDcmVhdGVUaW1lIGFuZCBDaGFuZ2VUaW1lIHNpbmNlIHRoZXkgbWlnaHQgZGlmZmVyCiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENoYW5nZVRpbWUpKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskS2V5fSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAQXBwb2ludG1lbnREYXRhLAogICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPntEYXRhfS0+e0FwcG9pbnRtZW50RGF0YX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgZGF0YSIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMgT3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7Cm15ICRVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRSYW5kb21JRDsKbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIlRlc3QgZ3JvdXAgJEdyb3VwSUQgY3JlYXRlZCIsCik7CgojIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGFkZCBpdCB0byB0aGUgdGVzdCBncm91cC4KbXkgJFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgR3JvdXBzID0+IFskR3JvdXBOYW1lXSwKKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBjYWxlbmRhcgpteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICJDYWxlbmRhci0kUmFuZG9tSUQiLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAopOwoKIwojIFRlc3RzIGZvciBBcHBvaW50bWVudENyZWF0ZSgpLCBBcHBvaW50bWVudEdldCgpIGFuZCBBcHBvaW50bWVudFVwZGF0ZSgpCiMKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIENhbGVuZGFySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpdGxlICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRDcmVhdGUgLSBObyBUaXRsZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gU3RhcnRUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudENyZWF0ZSAtIE5vIEVuZFRpbWUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gTm8gVXNlcklEJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gQWxsIHJlcXVpcmVkIHBhcmFtcycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlIC0gRGVzY3JpcHRpb24sIExvY2F0aW9uIGFuZCBBbGxEYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gIkFwcG9pbnRtZW50Mi0kUmFuZG9tSUQiLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2FsZW5kYXIgQXBwb2ludG1lbnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICcyMDE2LTAxLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAiQXBwb2ludG1lbnQyLSRSYW5kb21JRCIsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTb21lIGRlc2NyaXB0aW9uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1VTQScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICcyMDE2LTAxLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDEtMDMgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICApOwoKICAgICAgICBLRVk6CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntDb25maWd9IH0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1VzZXJJRCc7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7JEtleX0sCiAgICAgICAgICAgICAgICAkVGVzdC0+e0NvbmZpZ30tPnskS2V5fSwKICAgICAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gUmV0dXJuZWQgZGF0YSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRUZXN0LT57VXBkYXRlfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJXsgJFRlc3QtPntVcGRhdGV9IH0sCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBVcGRhdGVkIGFwcG9pbnRtZW50IiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1VwZGF0ZX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1VzZXJJRCc7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHskS2V5fSwKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1VwZGF0ZX0tPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFVwZGF0ZWQgZGF0YSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50TGlzdCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIE5vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQ2FsZW5kYXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBDb3VudCAgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50TGlzdCAtIFN0YXJ0VGltZSBhbmQgRW5kVGltZScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMiwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gQmVmb3JlIGFwcG9pbnRtZW50cycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTUtMTItMzEgMDA6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBBZnRlciBhcHBvaW50bWVudHMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMCwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gVGl0bGUgc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiQXBwb2ludG1lbnQqLSRSYW5kb21JRCIsICAgICMgd2lsZGNhcmQKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMiwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnRMaXN0IC0gRGVzY3JpcHRpb24gc2VhcmNoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdmb29iYXInLCAgICAgICAgICAgICAgICAgICAjIG5vbi1leGlzdGVudAogICAgICAgIH0sCiAgICAgICAgQ291bnQgICA9PiAwLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudExpc3QgLSBMb2NhdGlvbiBzZWFyY2gnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBMb2NhdGlvbiAgID0+ICd1c2EnLCAgICAgICAgICAgICAgICAgICAgICAgIyBsb3dlcmNhc2UKICAgICAgICB9LAogICAgICAgIENvdW50ICAgPT4gMSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKCiAgICAjIG1ha2UgdGhlIGNhbGwKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgICRUZXN0LT57Q291bnR9LAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFJlc3VsdCBjb3VudCIsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVGVzdC0+e0NvbmZpZ30tPntSZXN1bHR9ICYmICRUZXN0LT57Q29uZmlnfS0+e1Jlc3VsdH0gZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFVuaXF1ZUlEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSAkS2V5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgIFtdLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIGRheScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnRGFpbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIHBlciBkYXkKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywgICAgICMgaW5jbHVkZWQgbGFzdCBkYXkKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiA1LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTAzLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTAzLTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTAzLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgbW9udGgnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDEyLTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDEyLTAxLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnTW9udGhseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uY2UgcGVyIG1vbnRoCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxMy0wMS0wMyAxNjowMDowMCcsICAgICAjIGluY2x1ZGVkIGxhc3QgZGF5CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDEyLTAxLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxMy0wMS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTItMDEtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDItMjkgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDMtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDQtMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDUtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDYtMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDctMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDgtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMDktMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMTAtMzEgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMTEtMzAgMTU6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTItMTItMzEgMTU6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDEyLTAxLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAyLTI5IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTAzLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA0LTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA1LTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA2LTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA3LTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA4LTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTA5LTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEwLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTExLTMwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDEyLTEyLTMxIDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBFdmVyeSBtb250aCBhbGwtZGF5IHBlciBtb250aCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgPT4gJzIwMDgtMDQtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMDgtMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnTW9udGhseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCA9PiAzLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAwOC0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMDgtMDctMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMDgtMDQtMzAgMDA6MDA6MDAnLCAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aXRoIG9sZGVyIGRhdGUgdGltZSBsaWJyYXJ5CiAgICAgICAgICAgICAgICAnMjAwOC0wNS0zMCAwMDowMDowMCcsICAgICMgdGhlcmUgd2lsbCBiZSBhbiBhcHBvaW50bWVudCBvbiAyMDA4LTA1LTMxCiAgICAgICAgICAgICAgICAnMjAwOC0wNi0zMCAwMDowMDowMCcsICAgICMgYnV0IG5vdCBvbiAyMDA4LTA2LTMwCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMDgtMDUtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMDgtMDUtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMDgtMDctMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZVR5cGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gV3JvbmcgUmVjdXJyZW5jZVR5cGUnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ1dyb25nRGFpbHknLCAgICAgICAgICAgICAgIyBXcm9uZ0RhaWx5IGlzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIFdpdGhvdXQgUmVjdXJyZW5jZUZyZXF1ZW5jeScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTgtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTgtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tRGFpbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE4LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxOC0wMy0wMyAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOC0wMy0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZUZyZXF1ZW5jeSAoQ3VzdG9tV2Vla2x5KScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICA9PiAnMjAxNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE1pc3NpbmcgUmVjdXJyZW5jZUZyZXF1ZW5jeSAoQ3VzdG9tTW9udGhseSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbU1vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gTWlzc2luZyBSZWN1cnJlbmNlRnJlcXVlbmN5IChDdXN0b21ZZWFybHkpJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1JlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21ZZWFybHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT25jZSBwZXIgd2VlaycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdXZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTEwLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTEwLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ1dlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIHdlZWsKICAgICAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgID0+ICcyMDE2LTEwLTA2IDAwOjAwOjAwJywgICAgICAgICAgICAjIGluY2x1ZGVkIGxhc3QgZGF5CiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0xMC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0xMC0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIE9uY2UgcGVyIG1vbnRoJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ01vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgID0+ICcyMDE2LTEwLTA3IDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTEwLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhY2ggbW9udGgKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzIG1vbnRocwogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0xMC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTctMDEtMDggMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTEtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTItMDcgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBPbmNlIHBlciB5ZWFyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ1llYXJseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgPT4gJzIwMjctMTAtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgPT4gJzIwMjctMTAtMTAgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICA9PiAnWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhY2ggeWVhcgogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyB5ZWFycwogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIExpc3QgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAyNy0xMC0xMCAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMzAtMTAtMTEgMDA6MDA6MDAnLAogICAgICAgICAgICBDb3VudCAgICAgID0+IDMsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjctMTAtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjgtMTAtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjktMTAtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDI3LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI4LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI5LTEwLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSBFdmVyeSB0d28gZGF5cycsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgID0+ICdDdXN0b20gZGFpbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgID0+ICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNy0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICA9PiAnMjAxNy0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCA9PiAyLAogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTctMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE3LTAxLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAzIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNy0wMS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT24gV2VkbmVzZGF5LCByZWN1cnJpbmcgZXZlcnkgdHdvIHdlZWtzIG9uIE1vbmRheSBhbmQgRnJpZGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTA1LTA0IDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyB3ZWRuZXNkYXkKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wNS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIDJuZAogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgNSBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNb25kYXkgYW5kIEZyaWRheQogICAgICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzIGFwcG9pbnRtZW50cwogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDUtMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA1LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE2LTA1LTA0IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTA1LTA2IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTA1LTE2IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0wNiAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wNS0xNiAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgMm5kIG1vbnRoIG9uIDV0aCwgMTB0aCBhbmQgMTV0aCBkYXknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE5LTA3LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxOS0wNy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICJDdXN0b21Nb250aGx5IiwKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5IDIgbW9udGhzCiAgICAgICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gWyA1LCAxMCwgMTUgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXlzIGluIG1vbnRoCiAgICAgICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzIGFwcG9pbnRtZW50cwogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTktMDctMDUgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE5LTEwLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiA2LAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE5LTA3LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTA1IDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTEwIDE2OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTE1IDE2OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wNy0xNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0wNSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xMCAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxOS0wOS0xNSAxNzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gRXZlcnkgMm5kIHllYXIgb24gSmFudWFyeSA1dGgsIEZlYnJ1YXJ5IGFuZCBEZWNlbWJlcicsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAyMi0wMS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMjItMDEtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXZlcnkgMiB5ZWFycwogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMiwgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb250aHMKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMyBhcHBvaW50bWVudHMKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDIyLTAxLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAyNC0xMi0wNiAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyMi0wMS0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMi0wMi0wNSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyMi0xMi0wNSAxNjowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMjItMDEtMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMDItMDUgMTc6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMTItMDUgMTc6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1JlY3VycmluZyAtIEV2ZXJ5IDIgd2Vla3MsIG9uIE1vbiwgV2VkLCBUaHUsIEZyaSBhbmQgU3VuJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMjUtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlYWNoIDIgd2Vla3MKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDQsIDUsIDcgXSwgICAgICAgICAgICAgICAgIyBNb24sIFdlZCwgVGh1LCBGcmksIFN1bgogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDI2LTEwLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAjIG9jdG9iZXIKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDI1LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAyNi0xMC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTQzLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDI1LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTE1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTIxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTA5LTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTE1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEwLTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTExLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI1LTEyLTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTA5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTIxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTIzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAxLTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAyLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTAzLTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTE1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA0LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTExIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTEzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTE1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTI3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA1LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTExIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA2LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTA4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTA5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTEwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTEyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTIyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTIzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTI0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA3LTI2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTA1IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTA3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTA5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTE5IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTIxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTIzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA4LTMxIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTA2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTE0IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTE2IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTE3IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTE4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTIwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTI4IDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTA5LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDI2LTEwLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRW5kVGltZSA9PiBbCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0wOS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNS0xMi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wMy0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0yOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNS0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNi0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0xMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wNy0yNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0wOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0xOSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0yMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOC0zMSAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wMyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0wNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNiAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xNyAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0xOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0yOCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0wOS0zMCAwMDowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAyNi0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gT24gVHVlc2RheSBhbmQgRnJpZGF5LCByZWN1cnJpbmcgZXZlcnkgZml2ZSB3ZWVrcy4nLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudCcsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDktMDQgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0N1c3RvbVdlZWtseScsCiAgICAgICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhY2ggNXRoIHdlZWsKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDIsIDUgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHVlc2RheSBhbmQgRnJpZGF5CiAgICAgICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMjEtMTItMzEgMjM6NTk6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDktMDQgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDIyLTAyLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgQ291bnQgICAgICA9PiAxMjcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwoKICAgICAgICAgICAgICAgICMgZGF0ZXMgZnJvbSBwcmV2aW91cyB0ZXN0cwogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTEtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTItMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMTUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjItMDEtMDUgMTY6MDA6MDAnLAoKICAgICAgICAgICAgICAgICMgaGVyZSBjb21lcyBkYXRlcyBmcm9tIHRoaXMgdGVzdAogICAgICAgICAgICAgICAgJzIwMTYtMDktMDQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTAtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTEtMDggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTEtMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTItMTMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTYtMTItMTYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMTcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDEtMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDItMjEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDItMjQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDMtMjggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDMtMzEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDUtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDUtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDYtMDYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDYtMDkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDctMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDctMTQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDgtMTUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDgtMTggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDktMTkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMDktMjIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMTAtMjQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMTAtMjcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMTEtMjggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTctMTItMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDItMDYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDItMDkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMTMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDMtMTYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDQtMTcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDQtMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDUtMjIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDUtMjUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDYtMjYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDYtMjkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDctMzEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDgtMDMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDktMDQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMDktMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTAtMDkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTAtMTIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTEtMTMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTEtMTYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTItMTggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTgtMTItMjEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDEtMjIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDEtMjUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDItMjYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDMtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDQtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDQtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDUtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDUtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDYtMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDYtMTQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDctMTkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDgtMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDgtMjMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMjQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMDktMjcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMTAtMjkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMTEtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMTItMDMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTktMTItMDYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDEtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDEtMTAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDItMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDItMTQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDMtMTcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDMtMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDQtMjEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDQtMjQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDUtMjYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDUtMjkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDYtMzAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDctMDMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDgtMDQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDgtMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDktMDggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMDktMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTAtMTMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTAtMTYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTEtMTcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTEtMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTItMjIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjAtMTItMjUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDEtMjYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDEtMjkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDMtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDQtMDYgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDQtMDkgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDUtMTEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDUtMTQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDYtMTUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDYtMTggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDctMjAgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDctMjMgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDgtMjQgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDgtMjcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMDktMjggMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMTAtMDEgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMTEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMTEtMDUgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMTItMDcgMTY6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMjEtMTItMTAgMTY6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTE1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIyLTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTA5LTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEwLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTA4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTExLTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTEzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE2LTEyLTE2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTE3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAxLTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTIxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAyLTI0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTI4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTAzLTMxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA1LTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA2LTA5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA3LTE0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA4LTE4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTE5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTA5LTIyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEwLTI3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTExLTI4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE3LTEyLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAxLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAyLTA5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTEzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTAzLTE2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTE3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA0LTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTIyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA1LTI1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA2LTI5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA3LTMxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA4LTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTA5LTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTA5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEwLTEyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTEzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTExLTE2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTE4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE4LTEyLTIxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTIyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAxLTI1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAyLTI2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTAzLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA0LTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA1LTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA2LTE0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA3LTE5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA4LTIzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTA5LTI3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEwLTI5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTExLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE5LTEyLTA2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAxLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAyLTE0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTE3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTAzLTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTIxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA0LTI0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA1LTI5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA2LTMwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA3LTAzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA4LTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTA4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTA5LTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTEzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEwLTE2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTE3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTExLTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTIyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIwLTEyLTI1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAxLTI5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTAzLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA2IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA0LTA5IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTExIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA1LTE0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA2LTE4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIwIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA3LTIzIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI0IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA4LTI3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTA5LTI4IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEwLTAxIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTExLTA1IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTA3IDE3OjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDIxLTEyLTEwIDE3OjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdSZWN1cnJpbmcgLSAzIGRheSBhcHBvaW50bWVudCwgQ3VzdG9tIHdlZWtseShNb24sIFdlZCkgd2l0aCB1bnRpbCBjb25kaXRpb24uJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE1LTA3LTA2IDIzOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNS0wNy0wOCAwMTowMDowMCcsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAzLAogICAgICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMyBdLAogICAgICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDE1LTEyLTMxIDIzOjU5OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE1LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMjAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwoKICAgICAgICAgICAgICAgICMgcHJldmlvdXMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgICAgICAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMS0wMyAxNjowMDowMCcsCgogICAgICAgICAgICAgICAgIyBuZXcgYXBwb2ludG1lbnRzCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0wNiAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0wOCAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0yNyAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0yOSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOC0xNyAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOC0xOSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0wNyAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0wOSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0yOCAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0zMCAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMC0xOSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMC0yMSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMS0wOSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMS0xMSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMS0zMCAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0wMiAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0yMSAyMzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0yMyAyMzowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEVuZFRpbWUgPT4gWwoKICAgICAgICAgICAgICAgICMgcHJldmlvdXMgYXBwb2ludG1lbnRzCiAgICAgICAgICAgICAgICAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNi0wMS0wMyAxNzowMDowMCcsCgogICAgICAgICAgICAgICAgIyBuZXcgYXBwb2ludG1lbnRzCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0wOCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0xMCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0yOSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wNy0zMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOC0xOSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOC0yMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0wOSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0xMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0wOS0zMCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMC0wMiAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMC0yMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMC0yMyAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMS0xMSAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMS0xMyAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0wMiAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0wNCAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0yMyAwMTowMDowMCcsCiAgICAgICAgICAgICAgICAnMjAxNS0xMi0yNSAwMTowMDowMCcsCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnUmVjdXJyaW5nIC0gMyBkYXkgYXBwb2ludG1lbnQsIEN1c3RvbSB3ZWVrbHkoTW9uLCBXZWQpLCAxMCBhcHBvaW50bWVudHMuJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE0LTA3LTA2IDIzOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNC0wNy0wOCAwMTowMDowMCcsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAxMCwKICAgICAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgTGlzdCA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE0LTA3LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNS0wMS0wNSAwMDowMDowMCcsCiAgICAgICAgICAgIENvdW50ICAgICAgPT4gMTAsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gWwogICAgICAgICAgICAgICAgJzIwMTQtMDctMDYgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMDcgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMDkgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMTQgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMTYgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMjEgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMjMgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMjggMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDctMzAgMjM6MDA6MDAnLAogICAgICAgICAgICAgICAgJzIwMTQtMDgtMDQgMjM6MDA6MDAnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBFbmRUaW1lID0+IFsKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA4IDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTA5IDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTExIDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE2IDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTE4IDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTIzIDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTI1IDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA3LTMwIDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA4LTAxIDAxOjAwOjAwJywKICAgICAgICAgICAgICAgICcyMDE0LTA4LTA2IDAxOjAwOjAwJywKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgbWFrZSB0aGUgY2FsbAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIFN1Y2Nlc3MiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgY291bnQKICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICV7ICRUZXN0LT57TGlzdH0gLy8ge30gfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgICAgICRUZXN0LT57TGlzdH0tPntDb3VudH0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTGlzdCBjb3VudCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzdGFydCB0aW1lcwogICAgICAgIG15IEBTdGFydFRpbWVzOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgcHVzaCBAU3RhcnRUaW1lcywgJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFN0YXJ0VGltZXMsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3RhcnQgdGltZSByZXN1bHQiLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZW5kIHRpbWVzCiAgICAgICAgbXkgQEVuZFRpbWVzOwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgcHVzaCBARW5kVGltZXMsICRBcHBvaW50bWVudC0+e0VuZFRpbWV9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQEVuZFRpbWVzLAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPntFbmRUaW1lfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBFbmQgdGltZSByZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRBcHBvaW50bWVudElELAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgQXBwb2ludG1lbnREYXlzKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNaXNzaW5nIFVzZXJJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAxLTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBKYW51YXJ5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICcyMDE2LTAxLTAxJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMS0wMycgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERheXMgLSBNYXJjaCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTA0LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wMy0wMScgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDInID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTAzJyA9PiAxLAogICAgICAgICAgICAnMjAxNi0wMy0wNCcgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDMtMDUnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTAzLTA2JyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGF5cyAtIE1heScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3RhcnRUaW1lID0+ICcyMDE2LTA1LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgID0+ICcyMDE2LTA2LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAnMjAxNi0wNS0wNCcgPT4gMSwKICAgICAgICAgICAgJzIwMTYtMDUtMDYnID0+IDEsCiAgICAgICAgICAgICcyMDE2LTA1LTE2JyA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKCiAgICAgICAgIyBjaGVjayBkYXRlcwogICAgICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAgICAgXCVBcHBvaW50bWVudERheXMsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFwlQXBwb2ludG1lbnREYXlzLAogICAgICAgICAgICB7fSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzIiwKICAgICAgICApOwogICAgfQp9CgojIGdldCBhIGZldyBVbmlxdWVJRHMgaW4gcXVpY2sgc3VjY2Vzc2lvbgpteSBAVW5pcXVlSURzOwpmb3IgKCAxIC4uIDEwICkgewogICAgcHVzaCBAVW5pcXVlSURzLCAkQXBwb2ludG1lbnRPYmplY3QtPkdldFVuaXF1ZUlEKAogICAgICAgIENhbGVuZGFySUQgPT4gMSwKICAgICAgICBTdGFydFRpbWUgID0+IDE0NTE2MDY0MDAsICAgICMgc2FtZSBzdGFydCB0aW1lICcyMDE2LTAxLTAxIDAwOjAwOjAwJwogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cn0KCm15ICVTZWVuOwpmb3IgbXkgJFVuaXF1ZUlEIChAVW5pcXVlSURzKSB7CiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFNlZW57JFVuaXF1ZUlEfSsrLAogICAgICAgICJVbmlxdWVJRCAkVW5pcXVlSUQgaXMgdW5pcXVlIiwKICAgICk7Cn0KCiMgY3JlYXRlIGFub3RoZXIgdGVzdCBncm91cApteSAkR3JvdXBOYW1lMiA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkUmFuZG9tSUQgLiAnLTInOwpteSAkR3JvdXBJRDIgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRDIsCiAgICAiVGVzdCBncm91cCAkR3JvdXBJRDIgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cCB3aXRoIHJvIHBlcm1pc3Npb25zCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMCwKICAgICAgICBjcmVhdGUgICAgPT4gMCwKICAgICAgICBvd25lciAgICAgPT4gMCwKICAgICAgICBwcmlvcml0eSAgPT4gMCwKICAgICAgICBydyAgICAgICAgPT4gMCwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRDIgd2l0aCAncm8nIiwKKTsKCiMgY3JlYXRlIGFub3RoZXIgdGVzdCBjYWxlbmRhcgpteSAlQ2FsZW5kYXIyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIyLSRSYW5kb21JRCIsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElEMiwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFyMntDYWxlbmRhcklEfSIsCik7CgojCiMgVGVzdHMgZm9yIEFwcG9pbnRtZW50RGVsZXRlKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FwcG9pbnRtZW50RGVsZXRlIC0gTm8gQXBwb2ludG1lbnRJRCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQXBwb2ludG1lbnREZWxldGUgLSBObyBVc2VySUQnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIEFsbCBwYXJhbXMnLAogICAgICAgIENyZWF0ZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgID0+ICJBcHBvaW50bWVudC0kUmFuZG9tSUQiLAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wMi0yOSAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDItMjkgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAyLTI5IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBcHBvaW50bWVudERlbGV0ZSAtIE5vIHBlcm1pc3Npb25zJywKICAgICAgICBDcmVhdGUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIkFwcG9pbnRtZW50LVJPLSRSYW5kb21JRCIsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDctMDQgMTk6NDU6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTA3LTA0IDE5OjQ1OjAwJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBMaXN0ID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTA3LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICA9PiAnMjAxNi0wNy0wNSAwMDowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAoKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CgogICAgIyBjcmVhdGUgYXBwb2ludG1lbnQKICAgIGlmICggJFRlc3QtPntDcmVhdGV9ICkgewogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgJXsgJFRlc3QtPntDcmVhdGV9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gQXBwb2ludG1lbnQgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBzYXZlIGFwcG9pbnRtZW50IGlkCiAgICAgICAgJFRlc3QtPntDb25maWd9LT57QXBwb2ludG1lbnRJRH0gPSAkQXBwb2ludG1lbnRJRDsKCiAgICAgICAgIyBjaGVjayBsaXN0CiAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAleyAkVGVzdC0+e0xpc3R9IH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAxLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGxpc3Qgc3RhcnQiLAogICAgICAgICk7CiAgICB9CgogICAgIyBtYWtlIHRoZSBjYWxsCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGxpc3QgYWdhaW4KICAgIGlmICggJFRlc3QtPntDcmVhdGV9ICkgewogICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgJXsgJFRlc3QtPntMaXN0fSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgICAgICAgICAgJFRlc3QtPntTdWNjZXNzfSA/IDAgOiAxLAogICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IGxpc3QgZW5kIiwKICAgICAgICApOwogICAgfQp9CgojCiMgTm90aWZpY2F0aW9ucwojCgojIG5vdGlmaWNhdGlvbiBjcmVhdGlvbiB0ZXN0IGRlZmluaXRpb24KbXkgQE5vdGlmaWNhdGlvbkNyZWF0ZVRlc3RzID0gKAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggbm90aWZpY2F0aW9ucyBkaXNhYmxlZCBleHBsaWNpdGx5CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCB3cm9uZyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnd3Jvbmcgbm90aWZpY2F0aW9uIHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnV3JvbmdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZSB0ZW1wbGF0ZSAoQXBwb2ludG1lbnRTdGFydCkKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAzMCBtaW51dGVzIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA0JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAzMCBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjMwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBub3RpZmljYXRpb24gMTIgaG91cnMgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDQzMjAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAxMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNDMyMDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAyIGRheXMgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxNzI4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMwIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAxNzI4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIG5vdGlmaWNhdGlvbiAxIHdlZWsgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgd2VlayBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA2MDQ4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTI1IDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiA2MDQ4MDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDgnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGN1c3RvbSAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAyOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBzdGFydAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBob3VycyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAzIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBtaW51dGVzIGJlZm9yZSBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAyMzo1ODowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDI6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGFmdGVyIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDE5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMiBkYXlzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBob3VycyBiZWZvcmUgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBjdXN0b20gMCBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gY3VzdG9tIDAgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBtaW51dGVzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYWZ0ZXIgc3RhcnQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgaG91cnMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMCBkYXlzIGFmdGVyIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGRheXMgYWZ0ZXIgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBiZWZvcmUgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBob3VycyBiZWZvcmUgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIGRheXMgYmVmb3JlIGVuZAogICAgewogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDI4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnbm90aWZpY2F0aW9uIGRhdGUgMCBkYXlzIGJlZm9yZSBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMjknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgaG91cnMgYWZ0ZXIgZW5kCiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAwIGhvdXJzIGFmdGVyIGVuZCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDAgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gLTIzNDUgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIC0yMzQ1IGRheXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAtMjM0NSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzo1ODowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIyOjAwOjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjI6MDA6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgYWRkIGFwcG9pbnRtZW50IHdpdGggY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0CiAgICB7CiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgMzUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdub3RpZmljYXRpb24gZGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgbWludXRlcyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzNicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMjowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIGFkZCBhcHBvaW50bWVudCB3aXRoIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMiBob3VycyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzNycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgaG91cnMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiB1bmRlZiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMjowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBhZGQgYXBwb2ludG1lbnQgd2l0aCBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIgZGF5cyBhZnRlciBlbmQKICAgIHsKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ25vdGlmaWNhdGlvbiBkYXRlIDIgZGF5cyBhZnRlciBlbmQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+IHVuZGVmLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wNCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTA0IDAwOjAwOjAwJywKICAgICAgICB9LAogICAgfSwKKTsKCiMgbm90aWZpY2F0aW9uIGNyZWF0ZSB0ZXN0IGV4ZWN1dGlvbgpmb3IgbXkgJFRlc3QgKEBOb3RpZmljYXRpb25DcmVhdGVUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhfSB9LAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBjcmVhdGlvbgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBjcmVhdGVkIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgcmV0cmlldmUgc3RvcmVkIGFwcG9pbnRtZW50IGluZm9ybWF0aW9uCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBkYXRhIGdldAogICAgbXkgJENyZWF0ZWQgPSBJc0hhc2hSZWZXaXRoRGF0YSggXCVBcHBvaW50bWVudERhdGEgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDcmVhdGVkLAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgZGF0YSByZXRyaWV2ZWQgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyB2ZXJpZnkgcmVzdWx0cwogICAgZm9yIG15ICRSZXN1bHRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntSZXN1bHR9IH0gKSB7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJEFwcG9pbnRtZW50RGF0YXskUmVzdWx0S2V5fSwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57JFJlc3VsdEtleX0sCiAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICApOwogICAgfQp9CgojIG5vdGlmaWNhdGlvbiB1cGRhdGUgdGVzdCBkZWZpbml0aW9uCm15IEBOb3RpZmljYXRpb25VcGRhdGVUZXN0cyA9ICgKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIG5vIHRlbXBsYXRlIHRvIHdyb25nIHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIHdyb25nIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdXcm9uZ05vdGlmaWNhdGlvblRlbXBsYXRlJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1dyb25nTm90aWZpY2F0aW9uVGVtcGxhdGUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBubyB0ZW1wbGF0ZSB0byBzdGFydHRpbWUgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ0JlZm9yZSB1cGRhdGUgbm8gbm90aWZpY2F0aW9uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIHN0YXJ0dGltZSB0ZW1wbGF0ZSB0byAzMCBtaW51dGVzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewoKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnU3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMzozMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTgwMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gMzAgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gMTIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE4MDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDQnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMTI6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDQzMjAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gMiBkYXlzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNDMyMDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMTcyODAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMCAwMDowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMTcyODAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgewogICAgICAgIERhdGFCZWZvcmUgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDYnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE3MjgwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgNicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdCZWZvcmUgdXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSAxMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUgdG8gY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA3JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gdGVtcGxhdGUgY3VzdG9tIDIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgbm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IDcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgojIHVwZGF0ZSBhcHBvaW50bWVudCBmcm9tIGN1c3RvbSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA4JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOCcsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBob3VycyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOC0zMSAyMjowMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdob3VycycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCA5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJ1VwZGF0ZSB0byBub3RpZmljYXRpb24gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAyIDAwOjAwOjAwJywKICAgICAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnaG91cnMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgOScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzAgMDA6MDA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKCiMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGRheXMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vdGlmaWNhdGlvbiBkYXRlIDIgbWludXRlcyBiZWZvcmUgc3RhcnQgdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMiwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnZGF5cycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgIH0sCiAgICAgICAgRGF0YUFmdGVyID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTAnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGRhdGUgMiBtaW51dGVzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGltZXpvbmVJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gdW5kZWYsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTA4LTMxIDIzOjU4OjAwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDgtMzEgMjM6NTg6MDAnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdXBkYXRlIGFwcG9pbnRtZW50IGZyb20gY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIGhvdXJzIGJlZm9yZSBzdGFydCB0ZW1wbGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUKICAgIHsKICAgICAgICBEYXRhQmVmb3JlID0+IHsKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgID0+ICdVcGRhdGUgdG8gbm90aWZpY2F0aW9uIGN1c3RvbSByZWxhdGl2ZSBub3RpZmljYXRpb24gMiBkYXlzIGJlZm9yZSBzdGFydCcsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIERhdGFBZnRlciA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZScsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMiAwMDowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJycsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQgZnJvbSBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgaG91cnMgYmVmb3JlIHN0YXJ0IHRlbXBsYXRlIHRvIG5vIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgIyB2ZXJpZnkgdGhhdCBub3QgbmVlZGVkIHZhbHVlcyBhcmUgZmx1c2hlZCBhZnRlcndhcmRzCiAgICB7CiAgICAgICAgRGF0YUJlZm9yZSA9PiB7CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSBub3RpZmljYXRpb24gYXBwb2ludG1lbnQgMTEnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnVXBkYXRlIHRvIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDIgZGF5cyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICA9PiAnR2VybWFueScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgID0+ICcyMDE2LTA5LTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdkYXlzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgfSwKICAgICAgICBEYXRhQWZ0ZXIgPT4gewogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnVXBkYXRlIG5vdGlmaWNhdGlvbiBhcHBvaW50bWVudCAxMScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1VwZGF0ZSB0byBubyBub3RpZmljYXRpb24gdGVtcGxhdGUnLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDIgMDA6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMzAsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ2RheXMnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnJywKICAgICAgICB9LAogICAgfSwKKTsKCiMgbm90aWZpY2F0aW9uIHVwZGF0ZSB0ZXN0IGV4ZWN1dGlvbgpmb3IgbXkgJFRlc3QgKEBOb3RpZmljYXRpb25VcGRhdGVUZXN0cykgewoKICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgJXsgJFRlc3QtPntEYXRhQmVmb3JlfSB9LAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBjcmVhdGlvbgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgJ05vdGlmaWNhdGlvbiBhcHBvaW50bWVudCBjcmVhdGVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgcmV0cmlldmUgc3RvcmVkIGFwcG9pbnRtZW50IGluZm9ybWF0aW9uCiAgICBteSAlQXBwb2ludG1lbnREYXRhID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgKTsKCiAgICAjIHZlcmlmeSBhcHBvaW50bWVudCBkYXRhIGdldAogICAgbXkgJENyZWF0ZWQgPSBJc0hhc2hSZWZXaXRoRGF0YSggXCVBcHBvaW50bWVudERhdGEgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDcmVhdGVkLAogICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgZGF0YSByZXRyaWV2ZWQgLSAnIC4gJFRlc3QtPntEYXRhQmVmb3JlfS0+e0Rlc2NyaXB0aW9ufSwKICAgICk7CgogICAgIyB1cGRhdGUgYXBwb2ludG1lbnQKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAleyAkVGVzdC0+e0RhdGFBZnRlcn0gfSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgdXBkYXRlCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHVwZGF0ZWQgLSAnIC4gJFRlc3QtPntEYXRhQWZ0ZXJ9LT57RGVzY3JpcHRpb259LAogICAgKTsKCiAgICAjIHJldHJpZXZlIHN0b3JlZCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgJUFwcG9pbnRtZW50RGF0YSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgZGF0YSBnZXQKICAgICRDcmVhdGVkID0gSXNIYXNoUmVmV2l0aERhdGEoIFwlQXBwb2ludG1lbnREYXRhICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQ3JlYXRlZCwKICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IGRhdGEgcmV0cmlldmVkIC0gJyAuICRUZXN0LT57RGF0YUJlZm9yZX0tPntEZXNjcmlwdGlvbn0sCiAgICApOwoKICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgIGZvciBteSAkUmVzdWx0S2V5ICggc29ydCBrZXlzICV7ICRUZXN0LT57UmVzdWx0fSB9ICkgewoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRBcHBvaW50bWVudERhdGF7JFJlc3VsdEtleX0sCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YUFmdGVyfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICApOwogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBvdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0CmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBjYWxlbmRhciBoZWxwZXIgb2JqZWN0Cm15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgojCiMgVGVzdHMgZm9yIFRpbWVDaGVjaygpCiMKbXkgQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICA9PiAnTWlzc2luZyBUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc3NpbmcgT3JpZ2luYWxUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAyLTAxIDAwOjAyOjAwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDI6MDAnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiAnMjAxNi0wMi0wMSAwMDowMTowMCcsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lQ2hlY2soCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlRpbWVDaGVjayAtICRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAiVGltZUNoZWNrIC0gJFRlc3QtPntOYW1lfSAtIE5vIHN1Y2Nlc3MgIiwKICAgICAgICApOwogICAgfQp9CgojCiMgVGVzdHMgZm9yIFN5c3RlbVRpbWVHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FsbCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDUxNjA2NDYwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRSZXN1bHQsCiAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fSwKICAgICAgICAgICAgIlN5c3RlbVRpbWVHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlN5c3RlbVRpbWVHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgVGltZXN0YW1wR2V0KCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdBbGwgcGFyYW1zJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDUxNjA2NDYwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gJzIwMTYtMDEtMDEgMDA6MDE6MDAnLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIlRpbWVzdGFtcEdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBDdXJyZW50VGltZXN0YW1wR2V0KCkgYW5kIEN1cnJlbnRTeXN0ZW1UaW1lKCkKIwpAVGVzdHMgPSAoCiAgICB7CiAgICAgICAgTmFtZSAgICA9PiAnTm8gcGFyYW1zJywKICAgICAgICBDb25maWcgID0+IHt9LAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgJFJlc3VsdFRpbWVzdGFtcCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFRpbWVzdGFtcEdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CiAgICBteSAkUmVzdWx0U3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCwKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSAkVGVzdC0+e05hbWV9IC0gU3VjY2VzcyIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFN5c3RlbVRpbWUsCiAgICAgICAgICAgICJDdXJyZW50U3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBTdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFJlc3VsdFRpbWVzdGFtcCA9fiAvXGR7NH0tXGR7Mn0tXGR7Mn1cc1xkezJ9OlxkezJ9OlxkezJ9LywKICAgICAgICAgICAgIkN1cnJlbnRUaW1lc3RhbXBHZXQgLSBFeHBlY3RlZCBmb3JtYXQiLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBJc0ludGVnZXIoJFJlc3VsdFN5c3RlbVRpbWUpICYmICRSZXN1bHRTeXN0ZW1UaW1lID4gMTQ2MzA4MTc4MSwKICAgICAgICAgICAgIkN1cnJlbnRTeXN0ZW1UaW1lIC0gRXhwZWN0ZWQgZm9ybWF0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0VGltZXN0YW1wLAogICAgICAgICAgICAiQ3VycmVudFRpbWVzdGFtcEdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICRSZXN1bHRTeXN0ZW1UaW1lLAogICAgICAgICAgICAiQ3VycmVudFN5c3RlbVRpbWUgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgRGF0ZUdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnRnJpZGF5LCAyMDE2LTEyLTIzIDE0OjA1OjEwJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICcxNDgyNTAxOTEwJywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCA9PiBbCiAgICAgICAgICAgIDEwLAogICAgICAgICAgICA1LAogICAgICAgICAgICAxNCwKICAgICAgICAgICAgMjMsCiAgICAgICAgICAgIDEyLAogICAgICAgICAgICAyMDE2LAogICAgICAgICAgICA1LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1N1bmRheSwgMjAxNi0wNS0wOCAwMjowMzowNCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ2MjY3Mjk4NCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICA0LAogICAgICAgICAgICAzLAogICAgICAgICAgICAyLAogICAgICAgICAgICA4LAogICAgICAgICAgICA1LAogICAgICAgICAgICAyMDE2LAogICAgICAgICAgICA3LAogICAgICAgIF0sCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSBAUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICV7ICRUZXN0LT57Q29uZmlnfSB9LAogICAgKTsKCiAgICBpZiAoICRUZXN0LT57U3VjY2Vzc30gKSB7CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICBcQFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiRGF0ZUdldCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIHNjYWxhciBAUmVzdWx0LAogICAgICAgICAgICAiRGF0ZUdldCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBEYXRlMlN5c3RlbVRpbWUoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBZZWFyJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBEYXkgICAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBNb250aCcsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgWWVhciAgID0+ICcyMDE2JywKICAgICAgICAgICAgRGF5ICAgID0+ICcxJywKICAgICAgICAgICAgSG91ciAgID0+ICcxJywKICAgICAgICAgICAgTWludXRlID0+ICcwJywKICAgICAgICB9LAogICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgID0+ICdNaXNpbmcgRGF5JywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFyICAgPT4gJzIwMTYnLAogICAgICAgICAgICBNb250aCAgPT4gJzEnLAogICAgICAgICAgICBIb3VyICAgPT4gJzEnLAogICAgICAgICAgICBNaW51dGUgPT4gJzAnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJzIwMTYtMDEtMDEgMDE6MDA6MDAnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFllYXIgICA9PiAnMjAxNicsCiAgICAgICAgICAgIE1vbnRoICA9PiAnMScsCiAgICAgICAgICAgIERheSAgICA9PiAnMScsCiAgICAgICAgICAgIEhvdXIgICA9PiAnMScsCiAgICAgICAgICAgIE1pbnV0ZSA9PiAnMCcsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDUxNjEwMDAwJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGUyU3lzdGVtVGltZSgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiRGF0ZTJTeXN0ZW1UaW1lIC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIkRhdGUyU3lzdGVtVGltZSAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBBZGRQZXJpb2QoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ01pc2luZyBUaW1lJywKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBZZWFycyAgPT4gJzEnLAogICAgICAgICAgICBNb250aHMgPT4gJzEnLAogICAgICAgIH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0FsbCBwYXJhbXMnLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWUgICA9PiAnMTQ2Mjg3MTE2MicsCiAgICAgICAgICAgIFllYXJzICA9PiAnMScsCiAgICAgICAgICAgIE1vbnRocyA9PiAnMScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+ICcxNDk3MDg1NTYyJywKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAopOwoKZm9yIG15ICRUZXN0IChAVGVzdHMpIHsKICAgIG15ICRSZXN1bHQgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiQWRkUGVyaW9kIC0gJFRlc3QtPntOYW1lfSAtIFJlc3VsdCIsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgIkFkZFBlcmlvZCAtICRUZXN0LT57TmFtZX0gLSBObyBzdWNjZXNzICIsCiAgICAgICAgKTsKICAgIH0KfQoKIwojIFRlc3RzIGZvciBUaW1lem9uZU9mZnNldEdldCgpCiMKQFRlc3RzID0gKAogICAgewogICAgICAgIE5hbWUgICAgPT4gJ05vIHBhcmFtcycsCiAgICAgICAgQ29uZmlnICA9PiB7fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnVVRDIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ1VUQycsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDAsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NFVCAoQ2VudHJhbCBFdXJvcGVhbiBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnRXVyb3BlL0JlcmxpbicsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ1Njc4NjgwMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gMSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnQ0VEVCAoQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgICAgICAgICBUaW1lICAgICAgID0+IDE0NjI4NzExNjIsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IDIsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NTVCAoQ2VudHJhbCBTdGFuZGFyZCBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnQW1lcmljYS9NZXhpY29fQ2l0eScsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ1Njc4NjgwMCwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gLTYsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0NEVCAoQ2VudHJhbCBEYXlsaWdodCBUaW1lKScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgVGltZXpvbmVJRCA9PiAnQW1lcmljYS9NZXhpY29fQ2l0eScsCiAgICAgICAgICAgIFRpbWUgICAgICAgPT4gMTQ2Mjg3MTE2MiwKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gLTUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ0lTVCAoSW5kaWEgU3RhbmRhcmQgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FzaWEvQ2FsY3V0dGEnLAogICAgICAgIH0sCiAgICAgICAgUmVzdWx0ICA9PiA1LjUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ05QVCAoTmVwYWwgVGltZSknLAogICAgICAgIENvbmZpZyA9PiB7CiAgICAgICAgICAgIFRpbWV6b25lSUQgPT4gJ0FzaWEvS2F0aG1hbmR1JywKICAgICAgICB9LAogICAgICAgIFJlc3VsdCAgPT4gNS43NSwKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICA9PiAnT3V0bG9vayBleHBvcnQgKG5vbi1zdGFuZGFyZCBmb3JtYXQpJywgICAgIyBidWcjMTI0ODUKICAgICAgICBDb25maWcgPT4gewogICAgICAgICAgICBUaW1lem9uZUlEID0+ICcoVVRDLTAyOjMwKSBOZXdmb3VuZGxhbmQgU3RhbmRhcmQgVGltZSAoTlNUKScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgID0+IC0yLjUsCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgfSwKKTsKCmZvciBteSAkVGVzdCAoQFRlc3RzKSB7CiAgICBteSAkUmVzdWx0ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lem9uZU9mZnNldEdldCgKICAgICAgICAleyAkVGVzdC0+e0NvbmZpZ30gfSwKICAgICk7CgogICAgaWYgKCAkVGVzdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFJlc3VsdCwKICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LAogICAgICAgICAgICAiVGltZXpvbmVPZmZzZXRHZXQgLSAkVGVzdC0+e05hbWV9IC0gUmVzdWx0IiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkUmVzdWx0LAogICAgICAgICAgICAiVGltZXpvbmVPZmZzZXRHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCiMKIyBUZXN0cyBmb3IgV2Vla0RldGFpbHNHZXQoKQojCkBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgID0+ICdObyBwYXJhbXMnLAogICAgICAgIENvbmZpZyAgPT4ge30sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgPT4gJ1N1bmRheSwgMjAxNy0wNS0xNCAwNTowNTowNSwgQ1cxOScsCiAgICAgICAgQ29uZmlnID0+IHsKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAnMTQ5NDczODMwNScsCiAgICAgICAgfSwKICAgICAgICBSZXN1bHQgPT4gWwogICAgICAgICAgICA3LAogICAgICAgICAgICAxOSwKICAgICAgICBdLAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewogICAgbXkgQFJlc3VsdCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgJXsgJFRlc3QtPntDb25maWd9IH0sCiAgICApOwoKICAgIGlmICggJFRlc3QtPntTdWNjZXNzfSApIHsKICAgICAgICAkU2VsZi0+SXNEZWVwbHkoCiAgICAgICAgICAgIFxAUmVzdWx0LAogICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0sCiAgICAgICAgICAgICJXZWVrRGV0YWlsc0dldCAtICRUZXN0LT57TmFtZX0gLSBSZXN1bHQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIHNjYWxhciBAUmVzdWx0LAogICAgICAgICAgICAiV2Vla0RldGFpbHNHZXQgLSAkVGVzdC0+e05hbWV9IC0gTm8gc3VjY2VzcyAiLAogICAgICAgICk7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDb25maWdPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cm15ICRQbHVnaW5PYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6UGx1Z2luJyk7Cm15ICRNYWluT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7Cm15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgojIGdldCByZWdpc3RlcmVkIHBsdWdpbiBtb2R1bGVzCm15ICRQbHVnaW5Db25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkFwcG9pbnRtZW50Q2FsZW5kYXI6OlBsdWdpbiIpOwpteSAkUGx1Z2luQ291bnQgID0gc2NhbGFyIGtleXMgJXskUGx1Z2luQ29uZmlnfTsKCm15ICRQbHVnaW5MaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlzdCgpOwoKJFNlbGYtPlRydWUoCiAgICAkUGx1Z2luTGlzdCwKICAgICdQbHVnaW4gbGlzdCBsb2FkZWQnLAopOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIGtleXMgJXskUGx1Z2luTGlzdH0sCiAgICAkUGx1Z2luQ291bnQsCiAgICAnUmVnaXN0ZXJlZCBwbHVnaW4gY291bnQnLAopOwoKbXkgJFBsdWdpbktleVRpY2tldDsKCiMgY2hlY2sgYWxsIHJlZ2lzdGVyZWQgcGx1Z2luIG1vZHVsZXMKUExVR0lOOgpmb3IgbXkgJFBsdWdpbktleSAoIHNvcnQga2V5cyAleyRQbHVnaW5Db25maWd9ICkgewoKICAgIG15ICRHZW5lcmljTW9kdWxlID0gJFBsdWdpbkNvbmZpZy0+eyRQbHVnaW5LZXl9LT57TW9kdWxlfTsKICAgIG5leHQgUExVR0lOIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICBpZiAoICRHZW5lcmljTW9kdWxlIGVxICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlBsdWdpbjo6VGlja2V0JyApIHsKICAgICAgICAkUGx1Z2luS2V5VGlja2V0ID0gJFBsdWdpbktleTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIG1vZHVsZSBjYW4gYmUgcmVxdWlyZWQKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSwKICAgICAgICAiUmVxdWlyZWQgJyRHZW5lcmljTW9kdWxlJyBwbHVnaW4gbW9kdWxlIiwKICAgICk7CgogICAgbXkgJFBsdWdpbk1vZHVsZSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBjaGVjayBpZiBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkUGx1Z2luTW9kdWxlLAogICAgICAgICJQbHVnaW4gbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkiLAogICAgKTsKCiAgICAjIGNoZWNrIGNsYXNzIG5hbWUKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRQbHVnaW5Nb2R1bGUtPmlzYSgkR2VuZXJpY01vZHVsZSksCiAgICAgICAgJ1BsdWdpbiBtb2R1bGUgaGFzIGNvcnJlY3QgcGFja2FnZSBuYW1lJywKICAgICk7CgogICAgIyBjaGVjayByZXF1aXJlZCBtZXRob2RzCiAgICBmb3IgbXkgJE1ldGhvZE5hbWUgKHF3KExpbmtBZGQgTGlua0xpc3QgU2VhcmNoKSkgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUGx1Z2luTW9kdWxlLT5jYW4oJE1ldGhvZE5hbWUpLAogICAgICAgICAgICAiUGx1Z2luIG1vZHVsZSBpbXBsZW1lbnRzICRNZXRob2ROYW1lKCkiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFBsdWdpblVSTCA9ICRQbHVnaW5Db25maWctPnskUGx1Z2luS2V5fS0+e1VSTH07CgogICAgIyBjaGVjayBpZiBVUkwgY29udGFpbnMgSUQgcGxhY2Vob2xkZXIKICAgICRTZWxmLT5UcnVlKAogICAgICAgIHNjYWxhciAkUGx1Z2luVVJMID1+IC8lcy8sCiAgICAgICAgJ1BsdWdpbiBtb2R1bGUgVVJMIGNvbnRhaW5zIElEIHBsYWNlaG9sZGVyJywKICAgICk7Cn0KCiMgY2hlY2sgdGlja2V0IHBsdWdpbiBpZiByZWdpc3RlcmVkCmlmICgkUGx1Z2luS2V5VGlja2V0KSB7CgogICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgbXkgJEdyb3VwTmFtZSA9ICd0ZXN0LWNhbGVuZGFyLWdyb3VwLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRHcm91cElELAogICAgICAgICJUZXN0IGdyb3VwICRHcm91cElEIGNyZWF0ZWQiLAogICAgKTsKCiAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgIG15ICRVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICBHcm91cHMgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICApOwogICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRVc2VySUQsCiAgICAgICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAogICAgKTsKCiAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICMgY3JlYXRlIGEgdGVzdCB0aWNrZXQKICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICBUaXRsZSAgICAgICAgPT4gJ1Rlc3QgVGlja2V0ICcgLiAkUmFuZG9tSUQsCiAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ2N1c3RvbWVyQGV4YW1wbGUuY29tJywKICAgICAgICBPd25lcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgIlRpY2tldENyZWF0ZSgpIC0gJFRpY2tldElEIiwKICAgICk7CiAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkVXNlcklELAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRUaWNrZXROdW1iZXIsCiAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICApOwoKICAgICMgY3JldGUgdGVzdCBjYWxlbmRhcgogICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgQ2FsZW5kYXIgJyAuICRSYW5kb21JRCwKICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICJDYWxlbmRhckNyZWF0ZSgpIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKICAgICk7CgogICAgIyBjcmVhdGUgdGVzdCBhcHBvaW50bWVudAogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFRpdGxlICAgICAgPT4gJ1Rlc3QgYXBwb2ludG1lbnQgJyAuICRSYW5kb21JRCwKICAgICAgICBTdGFydFRpbWUgID0+ICcyMDE2LTAxLTAxIDEyOjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgID0+ICcyMDE2LTAxLTAxIDEzOjAwOjAwJywKICAgICAgICBUaW1lem9uZUlEID0+IDAsCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAiQXBwb2ludG1lbnRDcmVhdGUoKSAtICRBcHBvaW50bWVudElEIiwKICAgICk7CgogICAgIyBzZWFyY2ggdGhlIHRpY2tldCB2aWEgdGlja2V0IG51bWJlcgogICAgbXkgJFJlc3VsdExpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5TZWFyY2goCiAgICAgICAgU2VhcmNoICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkUmVzdWx0TGlzdCwKICAgICAgICB7CiAgICAgICAgICAgICRUaWNrZXRJRCA9PiAiJFRpY2tldE51bWJlciBUZXN0IFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgIH0sCiAgICAgICAgJ1BsdWdpblNlYXJjaCgpIC0gU2VhcmNoIHJlc3VsdHMgKGJ5IHRpY2tldCBudW1iZXIpJwogICAgKTsKCiAgICAjIHNlYXJjaCB0aGUgdGlja2V0IHZpYSB0aWNrZXQgaWQKICAgICRSZXN1bHRMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luU2VhcmNoKAogICAgICAgIE9iamVjdElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgUGx1Z2luS2V5ID0+ICRQbHVnaW5LZXlUaWNrZXQsCiAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkUmVzdWx0TGlzdCwKICAgICAgICB7CiAgICAgICAgICAgICRUaWNrZXRJRCA9PiAiJFRpY2tldE51bWJlciBUZXN0IFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgIH0sCiAgICAgICAgJ1BsdWdpblNlYXJjaCgpIC0gU2VhcmNoIHJlc3VsdHMgKGJ5IHRpY2tldCBJRCknCiAgICApOwoKICAgICMgbGluayBhcHBvaW50bWVudCB3aXRoIHRoZSB0aWNrZXQKICAgIG15ICRTdWNjZXNzID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBQbHVnaW5EYXRhICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdQbHVnaW5MaW5rQWRkKCkgLSBMaW5rIGFwcG9pbnRtZW50IHRvIHRoZSB0aWNrZXQnLAogICAgKTsKCiAgICAjIHZlcmlmeSBsaW5rCiAgICBteSAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0sCiAgICAgICAgJ1BsdWdpbkxpbmtMaXN0KCkgLSBWZXJpZnkgbGluayB0byB0aGUgdGlja2V0JwogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpbmtMaXN0LT57JFRpY2tldElEfS0+e0xpbmtJRH0sCiAgICAgICAgJFRpY2tldElELAogICAgICAgICdUaWNrZXRJRCcsCiAgICApOwoKICAgICMgY2hlY2sgVVJMCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkTGlua0xpc3QtPnskVGlja2V0SUR9LT57TGlua1VSTH0gPX4gL1RpY2tldElEPSRUaWNrZXRJRC8sCiAgICAgICAgJ1RpY2tldCBVUkwgY29udGFpbnMgdGlja2V0IElEJwogICAgICAgICksCgogICAgICAgICMgbGluayBuYW1lCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICRMaW5rTGlzdC0+eyRUaWNrZXRJRH0tPntMaW5rTmFtZX0sCiAgICAgICAgIiRUaWNrZXROdW1iZXIgVGVzdCBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAnTGluayBuYW1lJwogICAgICAgICksCgogICAgICAgICMgZGVsZXRlIGxpbmtzCiAgICAgICAgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1BsdWdpbkxpbmtEZWxldGUoKSAtIExpbmtzIGRlbGV0ZWQnCiAgICApOwoKICAgICMgdmVyaWZ5IGxpbmtzIGhhdmUgYmVlbiBkZWxldGVkCiAgICAkTGlua0xpc3QgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rTGlzdCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkTGlua0xpc3QsCiAgICAgICAge30sCiAgICAgICAgJ1BsdWdpbkxpbmtMaXN0KCkgLSBFbXB0eSBsaW5rIGxpc3QnLAogICAgKTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7Cm15ICRHcm91cE9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwpteSAkVXNlck9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkUXVldWVPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwpteSAkRHluYW1pY0ZpZWxkVmFsdWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWUnKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRDYWxlbmRhckhlbHBlck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwokU2VsZi0+VHJ1ZSgKICAgICRVc2VySUQsCiAgICAiVGVzdFVzZXJDcmVhdGUgLSAkVXNlcklEIiwKKTsKCiMgY3JlYXRlIHRlc3QgZ3JvdXAKbXkgJEdyb3VwTmFtZSA9ICdHcm91cCcgLiAkUmFuZG9tSUQ7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwokU2VsZi0+VHJ1ZSgKICAgICRHcm91cElELAogICAgIkdyb3VwQWRkIC0gJEdyb3VwTmFtZSAoJEdyb3VwSUQpIiwKKTsKCiMgYWRkIHRlc3QgdXNlciB0byB0ZXN0IGdyb3VwCm15ICRTdWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgR0lEICAgICAgICA9PiAkR3JvdXBJRCwKICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgIFBlcm1pc3Npb24gPT4gewogICAgICAgIHJ3ID0+IDEsCiAgICB9LAogICAgVXNlcklEID0+IDEsCik7CiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiUGVybWlzc2lvbkdyb3VwVXNlckFkZCAtIFRlc3QgdXNlciAkVXNlcklEIGFkZGVkIHRvIHRlc3QgZ3JvdXAgJEdyb3VwSUQiLAopOwoKIyBjcmVhdGUgdGVzdCBxdWV1ZSB3aXRoIGVzY2FsYXRpb24gcnVsZXMKbXkgJFF1ZXVlTmFtZSA9ICdRdWV1ZScgLiAkUmFuZG9tSUQ7Cm15ICRRdWV1ZUlEICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlQWRkKAogICAgTmFtZSAgICAgICAgICAgICAgICA9PiAkUXVldWVOYW1lLAogICAgVmFsaWRJRCAgICAgICAgICAgICA9PiAxLAogICAgR3JvdXBJRCAgICAgICAgICAgICA9PiAkR3JvdXBJRCwKICAgIEZpcnN0UmVzcG9uc2VUaW1lICAgPT4gMzAsCiAgICBGaXJzdFJlc3BvbnNlTm90aWZ5ID0+IDcwLAogICAgVXBkYXRlVGltZSAgICAgICAgICA9PiAyNDAsCiAgICBVcGRhdGVOb3RpZnkgICAgICAgID0+IDgwLAogICAgU29sdXRpb25UaW1lICAgICAgICA9PiAyNDQwLAogICAgU29sdXRpb25Ob3RpZnkgICAgICA9PiA5MCwKICAgIFN5c3RlbUFkZHJlc3NJRCAgICAgPT4gMSwKICAgIFNhbHV0YXRpb25JRCAgICAgICAgPT4gMSwKICAgIFNpZ25hdHVyZUlEICAgICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gMSwKICAgIENvbW1lbnQgICAgICAgICAgICAgPT4gJ1NvbWUgQ29tbWVudCcsCik7CiRTZWxmLT5UcnVlKAogICAgJFF1ZXVlSUQsCiAgICAiUXVldWVBZGQgLSAkUXVldWVOYW1lICgkUXVldWVJRCkiLAopOwoKIyBjcmVhdGUgdGVzdCBkeW5hbWljIGZpZWxkcwpteSBARHluYW1pY0ZpZWxkcyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlJyAuICRSYW5kb21JRCwKICAgICAgICBMYWJlbCAgICAgID0+ICdEYXRlJyAuICRSYW5kb21JRCwKICAgICAgICBDb25maWcgICAgID0+IHt9LAogICAgICAgIEZpZWxkT3JkZXIgPT4gMTAwMDAsCiAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgID0+ICdEYXRlVGltZScgLiAkUmFuZG9tSUQsCiAgICAgICAgTGFiZWwgICAgICA9PiAnRGF0ZVRpbWUnIC4gJFJhbmRvbUlELAogICAgICAgIENvbmZpZyAgICAgPT4ge30sCiAgICAgICAgRmllbGRPcmRlciA9PiAxMDAwMCwKICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgfSwKKTsKZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CiAgICBteSAkRHluYW1pY0ZpZWxkSUQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgJXskRHluYW1pY0ZpZWxkfSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtICREeW5hbWljRmllbGQtPntOYW1lfSAoJER5bmFtaWNGaWVsZElEKSIsCiAgICApOwogICAgJER5bmFtaWNGaWVsZC0+e0R5bmFtaWNGaWVsZElEfSA9ICREeW5hbWljRmllbGRJRDsKfQoKIyBGcmVlemUgdGltZSBhdCB0aGlzIHBvaW50IHNpbmNlIGNyZWF0aW5nIHRpY2tldHMgYW5kIGNoZWNraW5nIHJlc3VsdHMgY2FuIHRha2UKIyAgIHNldmVyYWwgc2Vjb25kcyB0byBjb21wbGV0ZS4KJEhlbHBlci0+Rml4ZWRUaW1lU2V0KAogICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpLAopOwoKbXkgJFRpY2tldENvdW50ID0gMzsKCiMgY3JlYXRlIGEgZmV3IHRlc3QgdGlja2V0cwpteSBAVGlja2V0SURzOwpmb3IgbXkgJENvdW50ICggMSAuLiAkVGlja2V0Q291bnQgKSB7CiAgICBteSAkVGlja2V0VGl0bGUgPSAiVGlja2V0JFJhbmRvbUlELSRDb3VudCI7CiAgICBteSAkVGlja2V0SUQgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgVGl0bGUgICAgPT4gJFRpY2tldFRpdGxlLAogICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ID0+ICczIG5vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgPT4gJ29wZW4nLAogICAgICAgIE93bmVySUQgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgIlRpY2tldENyZWF0ZSgpIC0gJFRpY2tldFRpdGxlICgkVGlja2V0SUQpIiwKICAgICk7CgogICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgbXkgJEFydGljbGVJRCA9ICRUaWNrZXRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVUeXBlICAgID0+ICdlbWFpbC1leHRlcm5hbCcsCiAgICAgICAgU2VuZGVyVHlwZSAgICAgPT4gJ2N1c3RvbWVyJywKICAgICAgICBGcm9tICAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBBIDxjdXN0b21lci1hQGV4YW1wbGUuY29tPicsCiAgICAgICAgVG8gICAgICAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsCiAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgICAgIEJvZHkgICAgICAgICAgID0+ICd0aGUgbWVzc2FnZSB0ZXh0JywKICAgICAgICBDb250ZW50VHlwZSAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNScsCiAgICAgICAgSGlzdG9yeVR5cGUgICAgPT4gJ0VtYWlsQ3VzdG9tZXInLAogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICdDdXN0b21lciBzZW50IGFuIGVtYWlsJywKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKSArIDYwICogNjAgKiAyNCwgICAgIyArMjRoCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICBZZWFyICAgICA9PiAkWWVhciwKICAgICAgICBNb250aCAgICA9PiAkTW9udGgsCiAgICAgICAgRGF5ICAgICAgPT4gJERheSwKICAgICAgICBIb3VyICAgICA9PiAkSG91ciwKICAgICAgICBNaW51dGUgICA9PiAkTWludXRlLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUaWNrZXRQZW5kaW5nVGltZVNldCAtIFRpY2tldCAkVGlja2V0SUQ6ICIKICAgICAgICAgICAgLiBzcHJpbnRmKCAnJWQtJTAyZC0lMDJkICUwMmQ6JTAyZCcsICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlICksCiAgICApOwoKICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgRmllbGRJRCAgPT4gJER5bmFtaWNGaWVsZHNbMF0tPntEeW5hbWljRmllbGRJRH0sCiAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgIFZhbHVlICAgID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVmFsdWVEYXRlVGltZSA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVmFsdWVTZXQgLSAkRHluYW1pY0ZpZWxkc1swXS0+e0R5bmFtaWNGaWVsZElEfSBmb3IgdGlja2V0ICRUaWNrZXRJRCIsCiAgICApOwoKICAgICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZFZhbHVlT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICBGaWVsZElEICA9PiAkRHluYW1pY0ZpZWxkc1sxXS0+e0R5bmFtaWNGaWVsZElEfSwKICAgICAgICBPYmplY3RJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVmFsdWUgICAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBWYWx1ZURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDEyOjAwOjAwJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJWYWx1ZVNldCAtICREeW5hbWljRmllbGRzWzFdLT57RHluYW1pY0ZpZWxkSUR9IGZvciB0aWNrZXQgJFRpY2tldElEIiwKICAgICk7CgogICAgcHVzaCBAVGlja2V0SURzLCAkVGlja2V0SUQ7Cn0KCiMgY3JlYXRlIHRlc3QgY2FsZW5kYXIKbXkgJENhbGVuZGFyTmFtZSA9ICJDYWxlbmRhciRSYW5kb21JRCI7Cm15ICVDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CiRTZWxmLT5UcnVlKAogICAgJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgIkNhbGVuZGFyQ3JlYXRlIC0gJENhbGVuZGFyTmFtZSAoJENhbGVuZGFye0NhbGVuZGFySUR9KSIsCik7CgojIEdlbmVyYXRlIGZldyByYW5kb20gc3RyaW5ncyBmb3IgUnVsZUlEcy4KbXkgQFJ1bGVJRHM7CmZvciAoIDEgLi4gNSApIHsKICAgIHB1c2ggQFJ1bGVJRHMsICRNYWluT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggICAgID0+IDMyLAogICAgICAgIERpY3Rpb25hcnkgPT4gWyAwIC4uIDksICdhJyAuLiAnZicgXSwKICAgICk7Cn0KCiMKIyBUZXN0cyBmb3IgdGlja2V0IGFwcG9pbnRtZW50cwojCm15IEBUZXN0cyA9ICgKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMF0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgICAgIEVuZERhdGUgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnRmlyc3RSZXNwb25zZVRpbWUnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICA9PiAnUGx1c181JywKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gW10sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzE1JywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfMTUnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1swXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICBUaWNrZXRBcHBvaW50bWVudHMgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSdWxlSUQgICAgICAgPT4gJFJ1bGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTdGFydERhdGUgICAgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgID0+IFskUXVldWVJRF0sCiAgICAgICAgICAgICAgICBTZWFyY2hQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICIqJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkVGlja2V0Q291bnQsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50ID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ1BsdXNfMzAnLAogICAgICAgICAgICBDbGVhbnVwICAgICAgICAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUnVsZUlEICA9PiAkUnVsZUlEc1sxXSwKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIE5hbWUgICAgICAgICAgICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgIFRpY2tldEFwcG9pbnRtZW50cyA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgICA9PiAkUnVsZUlEc1szXSwKICAgICAgICAgICAgICAgIFN0YXJ0RGF0ZSAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICAgICAgRW5kRGF0ZSAgICAgID0+ICdQbHVzXzYwJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICA9PiAnUGVuZGluZ1RpbWUnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICA9PiAnUGx1c182MCcsCiAgICAgICAgICAgIENsZWFudXAgICAgICAgICAgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgID0+ICRSdWxlSURzWzJdLAogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBTdGFydFRpbWUgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgPT4gJzIwMTYtMDEtMDEgMDE6MDA6MDAnLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlUmVzdWx0ID0+IHsKICAgICAgICAgICAgVW50aWxUaW1lID0+IC0oCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgLQogICAgICAgICAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUnVsZUlEICAgICAgID0+ICRSdWxlSURzWzRdLAogICAgICAgICAgICAgICAgU3RhcnREYXRlICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRzWzBdLT57TmFtZX0sCiAgICAgICAgICAgICAgICBFbmREYXRlICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiBbJFF1ZXVlSURdLAogICAgICAgICAgICAgICAgU2VhcmNoUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiKiRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJFRpY2tldENvdW50LAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudCA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMF0tPntOYW1lfSwKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSwKICAgICAgICAgICAgQ2xlYW51cCAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJ1bGVJRCAgPT4gJFJ1bGVJRHNbM10sCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAnMjAxNi0wMy0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICA9PiAnMjAxNi0wMy0wMSAwMTowMDowMCcsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVSZXN1bHQgPT4gewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkc1swXS0+e05hbWV9ID0+ICcyMDE2LTAzLTAxIDAwOjAwOjAwJywKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZHNbMV0tPntOYW1lfSA9PiAnMjAxNi0wMy0wMSAwMTowMDowMCcsCiAgICAgICAgfSwKICAgIH0sCik7Cgpmb3IgbXkgJFRlc3QgKEBUZXN0cykgewoKICAgICMgdXBkYXRlIHRlc3QgY2FsZW5kYXIKICAgIG15ICRTdWNjZXNzID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclVwZGF0ZSgKICAgICAgICAlQ2FsZW5kYXIsCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRzID0+ICRUZXN0LT57VGlja2V0QXBwb2ludG1lbnRzfSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiJFRlc3QtPntOYW1lfSAtIENhbGVuZGFyVXBkYXRlIC0gVXBkYXRlIHRpY2tldCBhcHBvaW50bWVudHMgcnVsZSIsCiAgICApOwoKICAgICMgUHJvY2VzcyB0aWNrZXQgYXBwb2ludG1lbnRzIG9mIHRoZSBjYWxlbmRhci4KICAgIG15ICVSZXN1bHQgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UHJvY2Vzc0NhbGVuZGFyKAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgKTsKCiAgICBteSAlUmVzdWx0Q29tcGFyZTsKICAgIGZvciBteSAkVGlja2V0SUQgKCBzb3J0IEBUaWNrZXRJRHMgKSB7CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0Q29tcGFyZXtQcm9jZXNzfSB9LCB7CiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgUnVsZUlEICAgPT4gJFRlc3QtPntUaWNrZXRBcHBvaW50bWVudHN9LT5bMF0tPntSdWxlSUR9LAogICAgICAgICAgICBTdWNjZXNzICA9PiAxLAogICAgICAgIH07CiAgICB9CiAgICAkUmVzdWx0Q29tcGFyZXtDbGVhbnVwfSA9ICRUZXN0LT57UmVzdWx0fS0+e0NsZWFudXB9OwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICBcJVJlc3VsdCwKICAgICAgICBcJVJlc3VsdENvbXBhcmUsCiAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXRBcHBvaW50bWVudFByb2Nlc3NDYWxlbmRhciAtIFJlc3VsdCIsCiAgICApOwoKICAgICMgZ2V0IGFwcG9pbnRtZW50cwogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGFwcG9pbnRtZW50IGNvdW50CiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMsCiAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57Q291bnR9LAogICAgICAgICIkVGVzdC0+e05hbWV9IC0gVGlja2V0IGFwcG9pbnRtZW50IGNvdW50IiwKICAgICk7CgogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAjIGdldCB0aWNrZXQgaWQgYnkgdGlja2V0IG51bWJlcgogICAgICAgICRBcHBvaW50bWVudC0+e1RpdGxlfSA9fiAvIyhbMC05XSspXF0vOwogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldAogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGFwcG9pbnRtZW50IGlzIG9mIHRpY2tldCBhcHBvaW50bWVudCB0eXBlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRBcHBvaW50bWVudC0+e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXQgYXBwb2ludG1lbnQgdHlwZSIsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoU3RhcnRUaW1lIEVuZFRpbWUpKSB7CiAgICAgICAgICAgIG15ICRLZXkgPSAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9OwoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgdGlja2V0IHZhbHVlIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgbXkgJFRpY2tldFZhbHVlOwoKICAgICAgICAgICAgIyBlc2NhbGF0aW9uIHRpbWVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ0ZpcnN0UmVzcG9uc2VUaW1lJwogICAgICAgICAgICAgICAgfHwgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgIHx8ICRUZXN0LT57UmVzdWx0fS0+eyRGaWVsZH0gZXEgJ1NvbHV0aW9uVGltZScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJFRpY2tldHsgJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSAuICdEZXN0aW5hdGlvbkRhdGUnIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcGVuZGluZyB0aW1lCiAgICAgICAgICAgIGVsc2lmICggJFRlc3QtPntSZXN1bHR9LT57JEZpZWxkfSBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCkgKyAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0VmFsdWUgPSAkVGlja2V0eyAkVGVzdC0+e1Jlc3VsdH0tPnskRmllbGR9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSBzdGFydCB0aW1lIHZhbHVlCiAgICAgICAgICAgIGlmICggJEZpZWxkIGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAgICAgJFRlc3QtPntSZXN1bHR9LT57U3RhcnRUaW1lVmFsdWV9ID0gJFRpY2tldFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRldGVybWluZSBwcmVzZXQgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbHVlOwogICAgICAgICAgICBpZiAoICRLZXkgPX4gL15QbHVzXyhbMC05XSspJC8gKSB7CiAgICAgICAgICAgICAgICBteSAkUHJlc2V0ID0gaW50ICQxOwoKICAgICAgICAgICAgICAgICMgZ2V0IHN0YXJ0IHRpbWUKICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUZXN0LT57UmVzdWx0fS0+e1N0YXJ0VGltZVZhbHVlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZSA9ICRTdGFydFRpbWUgKyA2MCAqICRQcmVzZXQ7CiAgICAgICAgICAgICAgICAkVGlja2V0VmFsdWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wYXJlIHZhbHVlcwogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQtPnskRmllbGR9LAogICAgICAgICAgICAgICAgJFRpY2tldFZhbHVlLAogICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBBcHBvaW50bWVudCAkRmllbGQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVGVzdC0+e1VwZGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgICV7ICRUZXN0LT57VXBkYXRlfSB9LAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiJFRlc3QtPntOYW1lfSAtIEFwcG9pbnRtZW50IHVwZGF0ZSIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1hbnVhbGx5IHRyaWdnZXIgYXBwb2ludG1lbnQgZXZlbnQgbW9kdWxlCiAgICAgICAgICAgICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRVcGRhdGVUaWNrZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdUaWNrZXQnICk7CgogICAgICAgICAgICAjIGdldCB0aWNrZXQgZGF0YSBhZ2FpbgogICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbXBhcmUgdmFsdWVzCiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntVcGRhdGVSZXN1bHR9IH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57VXBkYXRlUmVzdWx0fS0+eyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgIiRUZXN0LT57TmFtZX0gLSBUaWNrZXQgJEZpZWxkIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBvdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0CmxvY2FsICRFTlZ7VFp9ID0gJ1VUQyc7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwpteSAkR3JvdXBPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7Cm15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKbXkgJEV4cG9ydE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpFeHBvcnQ6OklDYWwnKTsKbXkgJEltcG9ydE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAVGVhbUlEOwpteSBAUmVzb3VyY2VJRDsKCiMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAppZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CgogICAgIyBjcmVhdGUgdGVzdCB0ZWFtCiAgICBteSAkVGVhbU5hbWUgPSAndGVzdC10ZWFtLScgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbUFkZCgKICAgICAgICBOYW1lICAgID0+ICRUZWFtTmFtZSwKICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+ICRVc2VySUQsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtQWRkKCkgLSBUZXN0IHRlYW0gY3JlYXRlZCcsCiAgICApOwoKICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgTmFtZSAgID0+ICRUZWFtTmFtZSwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJBZGQoCiAgICAgICAgVGVhbUlEICAgICA9PiAkVGVhbXtJRH0sCiAgICAgICAgVGVhbVVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgJ1RlYW1Vc2VyQWRkKCkgLSBBZGRlZCB0ZXN0IHVzZXIgdG8gdGVzdCB0ZWFtJywKICAgICk7CgogICAgcHVzaCBAVGVhbUlELCAgICAgJFRlYW17SUR9OwogICAgcHVzaCBAUmVzb3VyY2VJRCwgJFVzZXJJRDsKfQoKIyBjcmVhdGUgYSB0ZXN0IGNhbGVuZGFyIGZvciBleHBvcnQKbXkgJEV4cG9ydENhbGVuZGFyTmFtZSA9ICdFeHBvcnQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICVFeHBvcnRDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRFeHBvcnRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSggQ2FsZW5kYXJOYW1lID0+ICckRXhwb3J0Q2FsZW5kYXJOYW1lJywgQ29sb3IgPT4gJyMzQTg3QUQnLCBHcm91cElEID0+ICRHcm91cElELCBVc2VySUQgPT4gJFVzZXJJRCApIC0gQ2FsZW5kYXJJRDogJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9IiwKKTsKCiMgc2FtcGxlIGFwcG9pbnRtZW50cwpteSBAQXBwb2ludG1lbnRzID0gKAoKICAgICMgcmVndWxhcgogICAgewogICAgICAgIENhbGVuZGFySUQgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICA9PiAnMjAxNi0wMy0wMSAxMDowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgPT4gJzIwMTYtMDMtMDEgMTI6MDA6MDAnLAogICAgICAgIFRpdGxlICAgICAgID0+ICdSZWd1bGFyIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU2FtcGxlIGRlc2NyaXB0aW9uJywKICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIGFsbC1kYXkgd2l0aCByZXNvdXJjZQogICAgewogICAgICAgIENhbGVuZGFySUQgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDMtMDEgMDA6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgPT4gJzIwMTYtMDMtMDIgMDA6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgPT4gMSwKICAgICAgICBUaXRsZSAgICAgID0+ICdBbGwtZGF5IEFwcG9pbnRtZW50JywKICAgICAgICBMb2NhdGlvbiAgID0+ICdTYW1wbGUgbG9jYXRpb24nLAogICAgICAgIFRlYW1JRCAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgUmVzb3VyY2VJRCA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyBkYWlseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAxIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDEgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnRGFpbHknLAogICAgICAgIFJlY3VycmVuY2VDb3VudCA9PiAzLAogICAgICAgIFRpdGxlICAgICAgICAgICA9PiAnUmVjdXJyaW5nIERhaWx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IGRheSwgZm9yIDMgZGF5cycsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAoKICAgICMgcmVjdXJyaW5nIHdlZWtseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICA9PiAkRXhwb3J0Q2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgU3RhcnRUaW1lICAgICAgID0+ICcyMDE2LTAzLTAyIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgPT4gJzIwMTYtMDMtMDIgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICA9PiAnV2Vla2x5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBXZWVrbHkgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICA9PiAnRXZlcnkgd2VlaywgZm9yIDMgd2Vla3MnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyBtb250aGx5CiAgICB7CiAgICAgICAgQ2FsZW5kYXJJRCAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgPT4gJzIwMTYtMDMtMDMgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICA9PiAnMjAxNi0wMy0wMyAxNjowMDowMCcsCiAgICAgICAgUmVjdXJyaW5nICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgID0+ICdNb250aGx5JywKICAgICAgICBSZWN1cnJlbmNlQ291bnQgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgPT4gJ1JlY3VycmluZyBNb250aGx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IG1vbnRoLCBmb3IgMyBtb250aHMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIHJlY3VycmluZyB5ZWFybHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICA9PiAnMjAxNi0wMy0wNCAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgPT4gJ1llYXJseScsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ID0+IDMsCiAgICAgICAgVGl0bGUgICAgICAgICAgID0+ICdSZWN1cnJpbmcgWWVhcmx5IEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgPT4gJ0V2ZXJ5IFllYXJseSwgZm9yIDMgeWVhcnMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkVXNlcklELAogICAgfSwKCiAgICAjIGN1c3RvbSBkYWlseSByZWN1cnJpbmcKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICA9PiAnMjAxNi0wMy0wMSAxNTowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAzLTAxIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgPT4gJ0N1c3RvbURhaWx5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgPT4gMywKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBEYWlseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICA9PiAnRXZlcnkgMiBkYXlzLCAzIHRpbWVzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyAgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTAyIDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tV2Vla2x5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTW9uLCBXZWQsIFN1bgogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gNiwKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICdDdXN0b20gV2Vla2x5IFJlY3VycmluZyBBcHBvaW50bWVudCcsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnRXZlcnkgbW9uZGF5LCB3ZWRuZXNkYXkgYW5kIHN1bmRheSwgNiBhcHBvaW50bWVudHMnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgbW9udGhseQogICAgewogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTU6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDMtMDMgMTY6MDA6MDAnLAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgID0+ICdDdXN0b21Nb250aGx5JywKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgID0+IDIsCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSA9PiBbIDEsIDMsIDMxIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDFzdCwgM3RoIGFuZCAzMXN0CiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICA9PiAnMjAxNy0xMC0wMSAwMDowMDowMCcsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIE1vbnRobHkgUmVjdXJyaW5nIEFwcG9pbnRtZW50JywKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICdFdmVyeSAxc3QsIDN0aCBhbmQgMzFzdCBkYXksIHVudGlsIDIwMTctMTAtMDEnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgIH0sCgogICAgIyBjdXN0b20geWVhcmx5IHJlY3VycmluZyB5ZWFybHkKICAgIHsKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE1OjAwOjAwJywKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAzLTA0IDE2OjAwOjAwJywKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnQ3VzdG9tWWVhcmx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IFsgMSwgMywgMTIgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBqYW4sIG1hciwgZGVjCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VDb3VudCAgICAgPT4gMTAsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIFllYXJseSBSZWN1cnJpbmcgQXBwb2ludG1lbnQnLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0V2ZXJ5IDIgWWVhcnMgaW4gSmFuLCBGZWIgYW5kIE1hciAtIDEwIHRpbWVzJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICB9LAopOwoKZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICV7JEFwcG9pbnRtZW50fSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgIkFwcG9pbnRtZW50Q3JlYXRlKCkgLSBBcHBvaW50bWVudElEOiAkQXBwb2ludG1lbnRJRCIsCiAgICApOwp9CgojIGV4cG9ydCBhcHBvaW50bWVudHMKbXkgJElDYWxTdHJpbmcgPSAkRXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICBDYWxlbmRhcklEID0+ICRFeHBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKKTsKCiMgZ2V0IGV4cG9ydGVkIGFwcG9pbnRtZW50cwpteSBARXhwb3J0ZWRBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgIENhbGVuZGFySUQgPT4gJEV4cG9ydENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJQ2FsU3RyaW5nLAogICAgJ0V4cG9ydCgpIC0gQ2FsZW5kYXIgZXhwb3J0ZWQgdG8gaUNhbCBmb3JtYXQnLAopOwoKIyBjcmVhdGUgYSB0ZXN0IGNhbGVuZGFyIGZvciBpbXBvcnQKbXkgJEltcG9ydENhbGVuZGFyTmFtZSA9ICdJbXBvcnQgJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICVJbXBvcnRDYWxlbmRhciAgICAgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgQ2FsZW5kYXJOYW1lID0+ICRJbXBvcnRDYWxlbmRhck5hbWUsCiAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICJDYWxlbmRhckNyZWF0ZSggQ2FsZW5kYXJOYW1lID0+ICckSW1wb3J0Q2FsZW5kYXJOYW1lJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQ6ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSIsCik7CgojIGltcG9ydCBhcHBvaW50bWVudHMKJFN1Y2Nlc3MgPSAkSW1wb3J0T2JqZWN0LT5JbXBvcnQoCiAgICBDYWxlbmRhcklEID0+ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIElDYWwgICAgICAgPT4gJElDYWxTdHJpbmcsCiAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgJ0ltcG9ydCgpIC0gQ2FsZW5kYXIgaW1wb3J0ZWQgZnJvbSBpQ2FsIGZvcm1hdCcsCik7CgojIGdldCBpbXBvcnRlZCBhcHBvaW50bWVudHMKbXkgQEltcG9ydGVkQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRJbXBvcnRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAopOwoKIyBudW1iZXIgb2YgaW1wb3J0ZWQgYW5kIGV4cG9ydGVkIGFwcG9pbnRtZW50cyBtYXRjaAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEltcG9ydGVkQXBwb2ludG1lbnRzLAogICAgc2NhbGFyIEBFeHBvcnRlZEFwcG9pbnRtZW50cywKICAgICdJbXBvcnRlZCBhcHBvaW50bWVudCBjb3VudCcKKTsKCm15ICRDb3VudCA9IDE7CmZvciBteSAkSW1wb3J0ZWRBcHBvaW50bWVudCAoQEltcG9ydGVkQXBwb2ludG1lbnRzKSB7CgogICAgIyBkZWxldGUgc3BlY2lmaWMga2V5cwogICAgZGVsZXRlICRJbXBvcnRlZEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICBkZWxldGUgJEltcG9ydGVkQXBwb2ludG1lbnQtPntDYWxlbmRhcklEfTsKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e1VuaXF1ZUlEfTsKICAgIGRlbGV0ZSAkSW1wb3J0ZWRBcHBvaW50bWVudC0+e1BhcmVudElEfTsKICAgIGRlbGV0ZSAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXS0+e0FwcG9pbnRtZW50SUR9OwogICAgZGVsZXRlICRFeHBvcnRlZEFwcG9pbnRtZW50c1sgJENvdW50IC0gMSBdLT57Q2FsZW5kYXJJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntVbmlxdWVJRH07CiAgICBkZWxldGUgJEV4cG9ydGVkQXBwb2ludG1lbnRzWyAkQ291bnQgLSAxIF0tPntQYXJlbnRJRH07CgogICAgIyBjb21wYXJlIGltcG9ydGVkIGFuZCBleHBvcnRlZCBhcHBvaW50bWVudHMKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkSW1wb3J0ZWRBcHBvaW50bWVudCwKICAgICAgICAkRXhwb3J0ZWRBcHBvaW50bWVudHNbICRDb3VudCAtIDEgXSwKICAgICAgICAiSW1wb3J0ZWQgYXBwb2ludG1lbnQgJENvdW50IiwKICAgICk7CiAgICAkQ291bnQrKzsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKIyBPdmVycmlkZSBsb2NhbCB0aW1lIHpvbmUgZm9yIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LiBUaGlzIGlzIHJlcXVpcmVkIHNpbmNlIGV4cGVjdGVkIGltcG9ydGVkIGRhdGUKIyAgIHZhbHVlcyBhcmUgYWxsIGluIFVUQy4KbG9jYWwgJEVOVntUWn0gPSAnVVRDJzsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwpteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgojIGdldCBoZWxwZXIgb2JqZWN0CiRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicgPT4gewogICAgICAgIFJlc3RvcmVEYXRhYmFzZSA9PiAxLAogICAgfSwKKTsKbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKbXkgJFVzZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiMgY3JlYXRlIHRlc3QgdXNlcgpteSAkVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoKTsKbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKCBVc2VyTG9naW4gPT4gJFVzZXJMb2dpbiApOwoKJFNlbGYtPlRydWUoCiAgICAkVXNlcklELAogICAgIlRlc3QgdXNlciAkVXNlcklEIGNyZWF0ZWQiLAopOwoKIyBjcmVhdGUgdGVzdCBncm91cApteSAkR3JvdXBOYW1lID0gJ3Rlc3QtY2FsZW5kYXItZ3JvdXAtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cm15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkR3JvdXBJRCwKICAgICJUZXN0IGdyb3VwICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGFkZCB0ZXN0IHVzZXIgdG8gdGVzdCBncm91cApteSAkU3VjY2VzcyA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgIEdJRCAgICAgICAgPT4gJEdyb3VwSUQsCiAgICBVSUQgICAgICAgID0+ICRVc2VySUQsCiAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICBtb3ZlX2ludG8gPT4gMSwKICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICBvd25lciAgICAgPT4gMSwKICAgICAgICBwcmlvcml0eSAgPT4gMSwKICAgICAgICBydyAgICAgICAgPT4gMSwKICAgIH0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgYWRkZWQgdG8gdGVzdCBncm91cCAkR3JvdXBJRCIsCik7CgpteSBAVGVhbUlEOwpteSBAUmVzb3VyY2VJRDsKCiMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAppZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewoKICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CgogICAgIyBjcmVhdGUgdGVzdCB0ZWFtCiAgICAkU3VjY2VzcyA9ICRUZWFtT2JqZWN0LT5UZWFtQWRkKAogICAgICAgIE5hbWUgICAgPT4gJ1Rlc3QgVGVhbScsCiAgICAgICAgR3JvdXBJRCA9PiAxLCAgICAgICAgICAgICAjIGFkbWluCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwgICAgICAgICAgICAgIyByb290CiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtQWRkKCkgLSBUZXN0IHRlYW0gY3JlYXRlZCcsCiAgICApOwoKICAgIG15ICVUZWFtID0gJFRlYW1PYmplY3QtPlRlYW1HZXQoCiAgICAgICAgTmFtZSAgID0+ICdUZXN0IFRlYW0nLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRUZWFtT2JqZWN0LT5UZWFtVXNlckFkZCgKICAgICAgICBUZWFtSUQgICAgID0+ICRUZWFte0lEfSwKICAgICAgICBUZWFtVXNlcklEID0+IDEsICAgICAgICAgICAjIHJvb3QKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICdUZWFtVXNlckFkZCgpIC0gQWRkZWQgcm9vdCB1c2VyIHRvIHRlc3QgdGVhbScsCiAgICApOwoKICAgIHB1c2ggQFRlYW1JRCwgICAgICRUZWFte0lEfTsKICAgIHB1c2ggQFJlc291cmNlSUQsIDE7Cn0KCiMgdGhpcyB3aWxsIGJlIG9rCm15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gJ1Rlc3QgY2FsZW5kYXInLAogICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAiQ2FsZW5kYXJDcmVhdGUoIENhbGVuZGFyTmFtZSA9PiAnVGVzdCBjYWxlbmRhcicsIENvbG9yID0+ICcjM0E4N0FEJywgR3JvdXBJRCA9PiAkR3JvdXBJRCwgVXNlcklEID0+ICRVc2VySUQgKSAtIENhbGVuZGFySUQiLAopOwoKIyByZWFkIHNhbXBsZSAuaWNzIGZpbGUKbXkgJENvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgIERpcmVjdG9yeSA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT57SG9tZX0gLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvQ2FsZW5kYXIvJywKICAgIEZpbGVuYW1lICA9PiAnU2FtcGxlQ2FsZW5kYXIuaWNzJywKKTsKCiRTZWxmLT5UcnVlKAogICAgJHskQ29udGVudH0sCiAgICAnLmljcyBzdHJpbmcgbG9hZGVkJywKKTsKCm15ICRJbXBvcnRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpJbXBvcnQ6OklDYWwnKS0+SW1wb3J0KAogICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBJQ2FsICAgICAgID0+ICR7JENvbnRlbnR9LAogICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgVW50aWxMaW1pdCA9PiAnMjAxOC0wMS0wMSAwMDowMDowMCcsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJbXBvcnRTdWNjZXNzLAogICAgJ0ltcG9ydCBzdWNjZXNzJywKKTsKCm15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFwcG9pbnRtZW50cywKICAgIDE3MSwKICAgICdBcHBvaW50bWVudCBjb3VudCcsCik7CgpteSBAUmVzdWx0ID0gKAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wNSAwMDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQWxsIGRheScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0wNiAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0IGFsbCBkYXkgZXZlbnQnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMDk6MzA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xMiAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gJzEnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0xOSAwOTozMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0xOSAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMjYgMDk6MzA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjYgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0wMyAwOTozMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTAzIDEwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xMCAxMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ09uY2UgcGVyIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMCAwOTozMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE3IDA5OjMwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xNyAxMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMjQgMTA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25seSBvbmNlIHBlciB3ZWVrJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdCZWxncmFkZScsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnT25jZSBwZXIgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTI0IDA5OjMwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMzEgMDk6MzA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdPbmNlIHBlciB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTA3IDA5OjMwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTA3IDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0JlbGdyYWRlJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmx5IG9uY2UgcGVyIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMTIgMTI6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTIgMTE6MTU6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTEyIDExOjE1OjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0xMiAxMjowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTEyIDExOjE1OjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDYtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknCiAgICB9LAogICAgewogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTEyIDEyOjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmNlIHBlciBtb250aCcsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDgtMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA5LTEyIDExOjE1OjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOS0xMiAxMjowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ09uY2UgcGVyIG1vbnRoJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0xMiAxMToxNTowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTExLTEyIDEyOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMS0xMiAxMToxNTowMCcsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNb250aGx5IG1lZXRpbmcnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMTIgMTE6MTU6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0xMiAxMjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdPbmNlIHBlciBtb250aCcsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTEyIDExOjE1OjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTW9udGhseSBtZWV0aW5nJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnR2VybWFueScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnT25jZSBwZXIgbW9udGgnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDItMTIgMTI6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ01vbnRobHkgbWVldGluZycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTEyIDExOjE1OjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTMxIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTMwIDA2OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMzAgMDc6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMzEgMDY6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNi0zMCAwNzowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0zMCAwNjowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTMxIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMzEgMDY6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA4LTMxIDA3OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMzAgMDY6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA5LTMwIDA3OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMC0zMSAwNjowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTAtMzEgMDc6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMS0zMCAwNzowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMS0zMCAwNjowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0zMSAwNjowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFbmQgb2YgdGhlIG1vbnRoJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0xMi0zMSAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMS0zMSAwNzowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRW5kIG9mIHRoZSBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAxLTMxIDA2OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VuZCBvZiB0aGUgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDItMjggMDY6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDItMjggMDc6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMzEgMDk6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMS0zMSAxMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0zMSAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAyIG1vbnRocycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMzEgMTA6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ3Rlc3QnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1Rlc3QnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0zMSAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMzEgMDk6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA3LTMxIDEwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnVGVzdCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAndGVzdCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICd0ZXN0JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdUZXN0JywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDEtMzEgMTA6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMiBtb250aHMnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTMxIDA5OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA0LTEyIDA4OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMTQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0xNiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMTYgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE4IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wNC0xOCAwODowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yMCAwNzowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTIyIDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0yMiAwODowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI0IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDA3OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTI2IDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMjggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjggMDc6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0zMCAwNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMzAgMDg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDIgMDc6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMDQgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTA0IDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMDYgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTA2IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JwogICAgfSwKICAgIHsKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMDggMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0wOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA1LTEwIDA4OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xMiAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0xMiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTE0IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE0IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTE2IDA3OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0xNiAwODowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTE4IDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1Rlc3QgZGVzY3JpcHRpb24nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDUtMTggMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA1LTIwIDA3OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDUtMjAgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjIgMDc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA1LTIyIDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjQgMDg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMjQgMDc6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiAnU3RhcmEgUGF6b3ZhJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ015IGV2ZW50JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0yNiAwNzowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0yOCAwODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMjggMDc6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNS0zMCAwNzowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdNeSBldmVudCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA1LTMwIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gJ1N0YXJhIFBhem92YScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnVGVzdCBkZXNjcmlwdGlvbicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdUZXN0IGRlc2NyaXB0aW9uJywKICAgICAgICAnTG9jYXRpb24nICAgID0+ICdTdGFyYSBQYXpvdmEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA2LTAxIDA4OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnTXkgZXZlbnQnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA2LTAxIDA3OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMiB5ZWFycycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTgtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxOC0wNC0wMSAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDIgeWVhcnMnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMjAtMDQtMDEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMjAtMDQtMDEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0wMiAwMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMDMgMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDQtMDUgMDA6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDQtMDYgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiAnMScsCiAgICB9LAogICAgewogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0wOCAwMDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+ICcxJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA0LTA5IDAwOjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0xMiAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0xMSAwMDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMTQgMDA6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAzdGhkIGFsbCBkYXknLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA0LTE1IDAwOjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICA9PiAnMScKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNC0xNyAwMDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDQtMTggMDA6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgID0+ICcxJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yMSAwMDowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yMCAwMDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0yNCAwMDowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggM3RoZCBhbGwgZGF5JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMjMgMDA6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gJzEnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjcgMDA6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA0LTI2IDAwOjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNC0zMCAwMDowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+ICcxJywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTI5IDAwOjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDN0aGQgYWxsIGRheScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTA3IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRmlyc3QgMyBkYXlzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMDcgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAzLTA4IDE2OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMDggMTU6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0ZpcnN0IDMgZGF5cycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdGaXJzdCAzIGRheXMnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMy0wOSAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0wOSAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTAyIDE3OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ09uY2UgcGVyIG5leHQgMiBtb250aCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1JlY3VycmluZycgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDMtMDIgMTg6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdPbmNlIHBlciBuZXh0IDIgbW9udGgnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDQtMDIgMTc6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMDIgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDEtMDMgMTg6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnSmFudWFyeSAzdGggbmV4dCAzIHllYXJzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0phbnVhcnkgM3RoIG5leHQgMyB5ZWFycycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0wMS0wMyAxODowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxOC0wMS0wMyAxODowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxOC0wMS0wMyAxNzowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnSmFudWFyeSAzdGggbmV4dCAzIHllYXJzJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTEyIDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNC0xMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiAnMScsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNC0yNiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMjYgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNS0xMCAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDUtMTAgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDUtMjQgMTU6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA1LTI0IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wNi0wNyAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDYtMDcgMTU6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wNi0yMSAxNDowMDowMCcsCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDYtMjEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNy0wNSAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA3LTA1IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMTkgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTA3LTE5IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0wMiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDgtMDIgMTU6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMTYgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA4LTE2IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wOC0zMCAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTA4LTMwIDE0OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA5LTEzIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDktMTMgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wOS0yNyAxNTowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOS0yNyAxNDowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTAtMTEgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMTAtMTEgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JwogICAgfSwKICAgIHsKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEwLTI1IDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTAtMjUgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10KICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTExLTA4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTExLTA4IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMS0yMiAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0xMS0yMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEyLTA2IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0wNiAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0xMi0yMCAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMTItMjAgMTQ6MDA6MDAnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMS0wMyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wMS0wMyAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAxLTE3IDE0OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDEtMTcgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTAxLTMxIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTAxLTMxIDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDItMTQgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDItMTQgMTQ6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTAyLTI4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDItMjggMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMy0xNCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMDMtMTQgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wMy0yOCAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDMtMjggMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wNC0xMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA0LTExIDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNC0yNSAxNTowMDowMCcsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDQtMjUgMTQ6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wNS0wOSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDUtMDkgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTA1LTIzIDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDUtMjMgMTQ6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDYtMDYgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE3LTA2LTA2IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE3LTA2LTIwIDE1OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wNi0yMCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wNy0wNCAxNDowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTctMDctMDQgMTU6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTctMDctMTggMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTA3LTE4IDE1OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTA4LTAxIDE0OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNy0wOC0wMSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOC0xNSAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDgtMTUgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTA4LTI5IDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0wOC0yOSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDktMTIgMTQ6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOS0xMiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wOS0yNiAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTctMDktMjYgMTQ6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTEwLTEwIDE0OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNy0xMC0xMCAxNTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMC0yNCAxNTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdFYWNoIDJuZCB3ZWVrJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMC0yNCAxNDowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0xMS0wNyAxNDowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0xMS0wNyAxNTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTExLTIxIDE1OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdEZXZlbG9wZXIgbWVldGluZyBlYWNoIDJuZCBUdWVzZGF5JywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0VhY2ggMm5kIHdlZWsnLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNy0xMS0yMSAxNDowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTctMTItMDUgMTU6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ0RldmVsb3BlciBtZWV0aW5nIGVhY2ggMm5kIFR1ZXNkYXknLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE3LTEyLTA1IDE0OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnRGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheScsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE3LTEyLTE5IDE1OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnRWFjaCAybmQgd2VlaycsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTEyLTE5IDE0OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTExIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gJzEnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTExIDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMTMgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMS0xMyAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTE3IDA5OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMTcgMDg6MDA6MDAnLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDEtMjcgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTI3IDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAxJwogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTMxIDA4OjAwOjAwJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDItMTAgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMi0xMCAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICB9LAogICAgewogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0xNCAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTE0IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXQogICAgfSwKICAgIHsKICAgICAgICAnQWxsRGF5JyAgICAgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0yNCAwOTowMDowMCcsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI0IDA4OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAxJywKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI4IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IGF0IE1vbmRheSBhbmQgcmVwZWF0IGVhY2ggMm5kIFdlZG5lc2RheSBhbmQgU3VuZGF5LicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAyLTI4IDA5OjAwOjAwJwogICAgfSwKICAgIHsKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0wOSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAzLTA5IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wMy0xMyAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMScsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMDMtMTMgMDk6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMy0yMyAwOTowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTIzIDA4OjAwOjAwJywKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAzLTI3IDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDEnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAzLTI3IDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBhdCBNb25kYXkgYW5kIHJlcGVhdCBlYWNoIDJuZCBXZWRuZXNkYXkgYW5kIFN1bmRheS4nLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICB9LAogICAgewogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMTIgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMS0xMiAwOTowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAxLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTAxLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDEtMzEgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTMxIDA5OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdBbGxEYXknICAgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wMi0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wMi0xNiAwODowMDowMCcsCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDMtMTYgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDMtMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICAgPT4gW10sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMy0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknID0+IHVuZGVmCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDQtMTYgMDk6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTA0LTE2IDA4OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdFbmRUaW1lJyAgICA9PiAnMjAxNi0wNS0xNiAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdDYWxlbmRhcklEJyAgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDUtMTYgMDg6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wNS0zMSAwOTowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDUtMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDYtMTYgMDg6MDA6MDAnLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTYtMDYtMTYgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJwogICAgfSwKICAgIHsKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMDctMTYgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDInLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA3LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDctMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDctMzEgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTA4LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOC0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0wOC0zMSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDgtMzEgMDk6MDA6MDAnLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnICA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTA5LTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0wOS0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdDYWxlbmRhcklEJyA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgID0+ICdDdXN0b20gMicKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0xNiAwODowMDowMCcsCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEwLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0FsbERheScgPT4gdW5kZWYKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMC0zMSAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMTAtMzEgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTExLTE2IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gJ1N0YXJ0IG9uIGphbiAxMiwgcmVwZWF0IGVhY2ggbW9udGggb24gMTZ0aCBhbmQgMzF0aC4nLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTExLTE2IDA4OjAwOjAwJywKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgIH0sCiAgICB7CiAgICAgICAgJ1RlYW1JRCcgICAgICA9PiBbXSwKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgID0+ICdDdXN0b20gMicsCiAgICAgICAgJ1N0YXJ0VGltZScgICA9PiAnMjAxNi0xMi0xNiAwODowMDowMCcsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+ICdTdGFydCBvbiBqYW4gMTIsIHJlcGVhdCBlYWNoIG1vbnRoIG9uIDE2dGggYW5kIDMxdGguJywKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyAgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ1JlY3VycmluZycgPT4gdW5kZWYsCiAgICAgICAgJ0VuZFRpbWUnICAgPT4gJzIwMTYtMTItMTYgMDk6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNi0xMi0zMSAwODowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAyJywKICAgICAgICAnVGVhbUlEJyAgICAgPT4gW10sCiAgICAgICAgJ0VuZFRpbWUnICAgID0+ICcyMDE2LTEyLTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyAgPT4gdW5kZWYsCiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0Rlc2NyaXB0aW9uJyA9PiAnU3RhcnQgb24gamFuIDEyLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLicsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1Jlc291cmNlSUQnID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnICAgPT4gJzEnLAogICAgICAgICdFbmRUaW1lJyAgICAgPT4gJzIwMTYtMDEtMzEgMDk6MDA6MDAnLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMzEgMDg6MDA6MDAnLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAyLTI5IDA4OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdFbmRUaW1lJyAgID0+ICcyMDE2LTAyLTI5IDA5OjAwOjAwJywKICAgICAgICAnUmVjdXJyaW5nJyA9PiB1bmRlZgogICAgfSwKICAgIHsKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTEyLTMxIDA5OjAwOjAwJywKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdBbGxEYXknICAgICA9PiB1bmRlZiwKICAgICAgICAnU3RhcnRUaW1lJyAgPT4gJzIwMTYtMTItMzEgMDg6MDA6MDAnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ0N1c3RvbSAzJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgfSwKICAgIHsKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdUaXRsZScgICAgICAgPT4gJ0N1c3RvbSA0JywKICAgICAgICAnQ2FsZW5kYXJJRCcgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnU3RhcnRUaW1lJyAgID0+ICcyMDE2LTAxLTA0IDE1OjAwOjAwJywKICAgICAgICAnQWxsRGF5JyAgICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0xvY2F0aW9uJyAgICA9PiB1bmRlZiwKICAgICAgICAnUmVzb3VyY2VJRCcgID0+IFsKICAgICAgICAgICAgMCwKICAgICAgICBdLAogICAgICAgICdSZWN1cnJpbmcnID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICA9PiAnMjAxNi0wMS0wNCAxNjowMDowMCcKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE2LTAyLTA0IDE1OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNi0wMi0wNCAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ1N0YXJ0VGltZScgID0+ICcyMDE3LTAyLTA0IDE1OjAwOjAwJywKICAgICAgICAnQ2FsZW5kYXJJRCcgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICdUaXRsZScgICAgICA9PiAnQ3VzdG9tIDQnLAogICAgICAgICdUZWFtSUQnICAgICA9PiBbXSwKICAgICAgICAnUmVzb3VyY2VJRCcgPT4gWwogICAgICAgICAgICAwLAogICAgICAgIF0sCiAgICAgICAgJ0VuZFRpbWUnICAgICA9PiAnMjAxNy0wMi0wNCAxNjowMDowMCcsCiAgICAgICAgJ1JlY3VycmluZycgICA9PiB1bmRlZiwKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCiAgICB7CiAgICAgICAgJ0FsbERheScgICAgID0+IHVuZGVmLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnUmVjdXJyaW5nJyAgID0+ICcxJywKICAgICAgICAnRW5kVGltZScgICAgID0+ICcyMDE2LTAxLTA0IDE2OjAwOjAwJywKICAgICAgICAnRGVzY3JpcHRpb24nID0+IHVuZGVmLAogICAgICAgICdMb2NhdGlvbicgICAgPT4gdW5kZWYsCiAgICAgICAgJ0NhbGVuZGFySUQnICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgJ1RpdGxlJyAgICAgICA9PiAnWWVhcmx5JywKICAgICAgICAnVGVhbUlEJyAgICAgID0+IFtdLAogICAgICAgICdTdGFydFRpbWUnICAgPT4gJzIwMTYtMDEtMDQgMTU6MDA6MDAnCiAgICB9LAogICAgewogICAgICAgICdTdGFydFRpbWUnICA9PiAnMjAxNy0wMS0wNCAxNTowMDowMCcsCiAgICAgICAgJ0NhbGVuZGFySUQnID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAnVGl0bGUnICAgICAgPT4gJ1llYXJseScsCiAgICAgICAgJ1RlYW1JRCcgICAgID0+IFtdLAogICAgICAgICdSZWN1cnJpbmcnICA9PiB1bmRlZiwKICAgICAgICAnRW5kVGltZScgICAgPT4gJzIwMTctMDEtMDQgMTY6MDA6MDAnLAogICAgICAgICdSZXNvdXJjZUlEJyA9PiBbCiAgICAgICAgICAgIDAsCiAgICAgICAgXSwKICAgICAgICAnTG9jYXRpb24nICAgID0+IHVuZGVmLAogICAgICAgICdEZXNjcmlwdGlvbicgPT4gdW5kZWYsCiAgICAgICAgJ0FsbERheScgICAgICA9PiB1bmRlZiwKICAgIH0sCik7CgpMT09QOgpmb3IgKCBteSAkSW5kZXggPSAwOyAkSW5kZXggPCBzY2FsYXIgQEFwcG9pbnRtZW50czsgJEluZGV4KysgKSB7CiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUmVzdWx0WyRJbmRleF0gfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiB1bmRlZgogICAgICAgIGlmICggIWRlZmluZWQgJFJlc3VsdFskSW5kZXhdLT57JEtleX0gKSB7CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgIkNoZWNrIGlmICRLZXkgaXMgdW5kZWYuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgIG15ICVJdGVtcyA9ICgpOwogICAgICAgICAgICAkSXRlbXN7JF99ICs9IDEgZm9yZWFjaCAoIEB7ICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9IH0gKTsKICAgICAgICAgICAgJEl0ZW1zeyRffSAtPSAxIGZvcmVhY2ggKCBAeyAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSB9ICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICEoIGdyZXAgeyAkXyAhPSAwIH0gdmFsdWVzICVJdGVtcyApLAogICAgICAgICAgICAgICAgIkNoZWNrIGlmIGFycmF5ICRLZXkgaXMgT0suIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUmVzdWx0WyRJbmRleF0tPnskS2V5fSApICkgewoKICAgICAgICAgICAgIyBTa2lwIFBhcmVudElEIHNpbmNlIHRoaXMgdmFsdWUgY2FuJ3QgbWF0Y2ggQXBwb2ludG1lbnRJRCAoZXZlcnkgdGltZSBpcyBkaWZmZXJlbnQpCiAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzWyRJbmRleF0tPnskS2V5fSwKICAgICAgICAgICAgICAgICRSZXN1bHRbJEluZGV4XS0+eyRLZXl9LAogICAgICAgICAgICAgICAgIkNoZWNrIGlmICRLZXkgdmFsdWUgaXMgT0suIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZG8gbm90IGNoZWNrIFJpY2hUZXh0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsnYWRtaW4nXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIGNoZWNrIG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNsaWNrICJBZGQgbm90aWZpY2F0aW9uIgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZG1pbkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uRXZlbnQ7U3ViYWN0aW9uPUFkZCcgKV0iKQogICAgICAgICAgICAtPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayBhZGQgTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAgICAgZm9yIG15ICRJRCAoCiAgICAgICAgICAgIHF3KE5hbWUgQ29tbWVudCBWYWxpZElEIEV2ZW50cyBlbl9TdWJqZWN0IGVuX0JvZHkpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyB0b2dnbGUgVGlja2V0IGZpbHRlciB3aWRnZXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8xJyldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB0b2dnbGUgQXJ0aWNsZSBmaWx0ZXIgKE9ubHkgZm9yIEFydGljbGVDcmVhdGUgYW5kIEFydGljbGVTZW5kIGV2ZW50KSB3aWRnZXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAYXJpYS1jb250cm9scywgXCdDb3JlX1VJX0F1dG9nZW5lcmF0ZWRJRF8yJyldIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBOb3RpZmljYXRpb25FdmVudAogICAgICAgIG15ICROb3RpZkV2ZW50UmFuZG9tSUQgPSAiTm90aWZpY2F0aW9uRXZlbnQiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkTm90aWZFdmVudFRleHQgICAgID0gIlNlbGVuaXVtIE5vdGlmaWNhdGlvbkV2ZW50IHRlc3QiOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAgICAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICdjc3MnICktPnNlbmRfa2V5cygkTm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0V2ZW50cycpLnZhbCgnQXBwb2ludG1lbnROb3RpZmljYXRpb24nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJE5vdGlmRXZlbnRUZXh0KTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICAgICAgICdjc3MnICktPlZlcmlmaWVkU3VibWl0KCk7CgogICAgICAgICMgY2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBzaG93IG9uIEFkbWluTm90aWZpY2F0aW9uRXZlbnQgc2NyZWVuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkTm90aWZFdmVudFJhbmRvbUlEICkgPiAtMSwKICAgICAgICAgICAgIiROb3RpZkV2ZW50UmFuZG9tSUQgTm90aWZpY2Fpb25FdmVudCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlc3QgTm90aWZpY2F0aW9uRXZlbnQgdmFsdWVzCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICROb3RpZkV2ZW50UmFuZG9tSUQsICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50UmFuZG9tSUQsCiAgICAgICAgICAgICIjTmFtZSBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNDb21tZW50JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICROb3RpZkV2ZW50VGV4dCwKICAgICAgICAgICAgIiNDb21tZW50IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI2VuX1N1YmplY3QnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX1N1YmplY3Qgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjZW5fQm9keScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkTm90aWZFdmVudFRleHQsCiAgICAgICAgICAgICIjZW5fQm9keSBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNWYWxpZElEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICIjVmFsaWRJRCBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZWRpdCB0ZXN0IE5vdGlmaWNhdGlvbkV2ZW50IGFuZCBzZXQgaXQgdG8gaW52YWxpZAogICAgICAgIG15ICRFZGl0Tm90aWZFdmVudFRleHQgPSAiU2VsZW5pdW0gZWRpdGVkIE5vdGlmaWNhdGlvbkV2ZW50IHRlc3QiOwoKICAgICAgICAjIHRvZ2dsZSBBcnRpY2xlIGZpbHRlciAoT25seSBmb3IgQXJ0aWNsZUNyZWF0ZSBhbmQgQXJ0aWNsZVNlbmQgZXZlbnQpIHdpZGdldAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBhcmlhLWNvbnRyb2xzLCBcJ0NvcmVfVUlfQXV0b2dlbmVyYXRlZElEXzInKV0iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNlbl9Cb2R5IiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0Tm90aWZFdmVudFRleHQpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI2VuX1N1YmplY3QiLCAnY3NzJyApLT5zZW5kX2tleXMoJEVkaXROb3RpZkV2ZW50VGV4dCk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+VmVyaWZpZWRTdWJtaXQoKTsKCiAgICAgICAgIyBjaGVjayBlZGl0ZWQgTm90aWZjYXRpb25FdmVudCB2YWx1ZXMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJE5vdGlmRXZlbnRSYW5kb21JRCwgJ2xpbmtfdGV4dCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0NvbW1lbnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICIjQ29tbWVudCB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjZW5fQm9keScsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkRWRpdE5vdGlmRXZlbnRUZXh0LAogICAgICAgICAgICAiI2VuX0JvZHkgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1ZhbGlkSUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgMiwKICAgICAgICAgICAgIiNWYWxpZElEIHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZ28gYmFjayB0byBBZG1pbk5vdGlmaWNhdGlvbkV2ZW50IG92ZXJ2aWV3IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluQXBwb2ludG1lbnROb3RpZmljYXRpb25FdmVudCIpOwoKICAgICAgICAjIGNoZWNrIGNsYXNzIG9mIGludmFsaWQgTm90aWZpY2F0aW9uRXZlbnQgaW4gdGhlIG92ZXJ2aWV3IHRhYmxlCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0ci5JbnZhbGlkIHRkIGE6Y29udGFpbnMoJE5vdGlmRXZlbnRSYW5kb21JRCknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJUaGVyZSBpcyBhIGNsYXNzICdJbnZhbGlkJyBmb3IgdGVzdCBOb3RpZmljYXRpb25FdmVudCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgTm90aWZpY2F0aW9uRXZlbnRJRAogICAgICAgIG15ICVOb3RpZkV2ZW50SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKS0+Tm90aWZpY2F0aW9uR2V0KAogICAgICAgICAgICBOYW1lID0+ICROb3RpZkV2ZW50UmFuZG9tSUQKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGRlbGV0ZSBpY29uCiAgICAgICAgbXkgJENoZWNrQ29uZmlybUpTID0gPDwiSkFWQVNDUklQVCI7CihmdW5jdGlvbiAoKSB7CiAgICB3aW5kb3cuY29uZmlybSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Owp9KCkpOwpKQVZBU0NSSVBUCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgkQ2hlY2tDb25maXJtSlMpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IFNMQSB3aXRoIGRlbGV0ZSBidXR0b24KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTdWJhY3Rpb249RGVsZXRlO0lEPSROb3RpZkV2ZW50SUR7SUR9JyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgaWYgdGVzdCBOb3RpZmljYXRpb25FdmVudCBpcyBkZWxldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgndHIuSW52YWxpZCB0ZCBhOmNvbnRhaW5zKCROb3RpZkV2ZW50UmFuZG9tSUQpJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAiVGVzdCBOb3RpZmljYXRpb25FdmVudCBpcyBkZWxldGVkIC0gJE5vdGlmRXZlbnRSYW5kb21JRCIsCiAgICAgICAgKSB8fCBkaWU7CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkhlbHBlcicpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY3VzdG9tZXIgdXNlci4KICAgICAgICBteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlci0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCBjdXN0b21lciB1c2VyIjsKCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgZmV3IHRlc3QgY2FsZW5kYXJzLgogICAgICAgIG15IEBDYWxlbmRhcnM7CiAgICAgICAgbXkgJENvdW50ID0gMTsKICAgICAgICBmb3IgbXkgJENvbG9yICggJyMzQTg3QUQnLCAnI0VDOTA3MycsICcjNkJBRDU0JyApIHsKICAgICAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXIkQ291bnQtJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDYWxlbmRhcnMsIFwlQ2FsZW5kYXI7CgogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgIG15ICRDYWxlbmRhcldlZWtEYXlTdGFydCA9ICRDb25maWdPYmplY3QtPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCA3OwoKICAgICAgICAjIEdldCBzdGFydCBvZiB0aGUgd2Vlay4KICAgICAgICBteSAkU3RhcnRUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwogICAgICAgIG15ICggJFdlZWtEYXksICRDVyApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5XZWVrRGV0YWlsc0dldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgd2hpbGUgKCAkV2Vla0RheSAhPSAkQ2FsZW5kYXJXZWVrRGF5U3RhcnQgKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgLT0gNjAgKiA2MCAqIDI0OwogICAgICAgICAgICAoICRXZWVrRGF5LCAkQ1cgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgQXBwb2ludG1lbnQgdGltZXMgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrLgogICAgICAgIG15ICVTdGFydFRpbWUgPSAoCiAgICAgICAgICAgIERheSAgICA9PiAkRGF5LAogICAgICAgICAgICBNb250aCAgPT4gJE1vbnRoLAogICAgICAgICAgICBZZWFyICAgPT4gJFllYXIsCiAgICAgICAgICAgIEhvdXIgICA9PiAxMiwKICAgICAgICAgICAgTWludXRlID0+IDE1LAogICAgICAgICk7CgogICAgICAgICMgRGVmaW5lIGFwcG9pbnRtZW50IG5hbWVzLgogICAgICAgIG15IEBBcHBvaW50bWVudE5hbWVzID0gKCAnQXBwb2ludG1lbnQgMScsICdBcHBvaW50bWVudCAyJywgJ0FwcG9pbnRtZW50IDMnICk7CgogICAgICAgICMgR28gdG8gYWdlbmRhIG92ZXJ2aWV3IHBhZ2UuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Iik7CgogICAgICAgICMgQ2xpY2sgb24gdGhlIGFwcG9pbnRtZW50IGNyZWF0ZSBidXR0b24uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgcmVndWxhciBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzBdICk7CiAgICAgICAgZm9yIG15ICRHcm91cCAocXcoU3RhcnQgRW5kKSkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhIb3VyIE1pbnV0ZSBEYXkgTW9udGggWWVhcikpIHsKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgIlwkKCcjJEdyb3VwJEZpZWxkJykudmFsKCRTdGFydFRpbWV7JEZpZWxkfSkudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyc1swXS0+e0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgU2F2ZS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSByZWd1bGFyIGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMF0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiRmlyc3QgYXBwb2ludG1lbnQgJyRBcHBvaW50bWVudE5hbWVzWzBdJyBmb3VuZCBpbiB0aGUgdGFibGUiCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGljayBvbiB0aGUgY3JlYXRlIGJ1dHRvbiBmb3IgYW5vdGhlciBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgYW4gYWxsLWRheSBhcHBvaW50bWVudC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgICduYW1lJyApLT5zZW5kX2tleXMoICRBcHBvaW50bWVudE5hbWVzWzFdICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdBbGxEYXknLCAnbmFtZScgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMV0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CgogICAgICAgICMgVmVyaWZ5IHRoZSBhbGwtZGF5IGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgndGJvZHkgdHI6Y29udGFpbnMoJEFwcG9pbnRtZW50TmFtZXNbMV0pJykubGVuZ3RoOyIpLAogICAgICAgICAgICAiU2Vjb25kIGFwcG9pbnRtZW50ICckQXBwb2ludG1lbnROYW1lc1sxXScgZm91bmQgaW4gdGhlIHRhYmxlIgogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlQ291bnQgPSAzOwoKICAgICAgICAjIENsaWNrIGFnYWluIG9uIHRoZSBjcmVhdGUgYnV0dG9uIGZvciBhbiBhcHBvaW50bWVudCBkaWFsb2cuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQXBwb2ludG1lbnRDcmVhdGVCdXR0b24nLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBDcmVhdGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCAkQXBwb2ludG1lbnROYW1lc1syXSApOwogICAgICAgIGZvciBteSAkR3JvdXAgKHF3KFN0YXJ0IEVuZCkpIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAocXcoSG91ciBNaW51dGUgRGF5IE1vbnRoIFllYXIpKSB7CiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJcJCgnIyRHcm91cCRGaWVsZCcpLnZhbCgkU3RhcnRUaW1leyRGaWVsZH0pLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcnNbMl0tPntDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJFJlY3VycmVuY2VDb3VudCk7CgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmICFcJCgnLkRpYWxvZy5Nb2RhbCcpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkUmVmcmVzaCgpOwoKICAgICAgICAjIFZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgYXJlIHZpc2libGUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCd0Ym9keSB0cjpjb250YWlucygkQXBwb2ludG1lbnROYW1lc1syXSknKS5sZW5ndGggPT09ICRSZWN1cnJlbmNlQ291bnQ7IgogICAgICAgICAgICApLAogICAgICAgICAgICAiQWxsIHRoaXJkIGFwcG9pbnRtZW50IG9jY3VycmVuY2VzIGZvdW5kIGluIHRoZSB0YWJsZSIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0aGlyZCBhcHBvaW50bWVudCBtYXN0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICRBcHBvaW50bWVudE5hbWVzWzJdLCAnbGlua190ZXh0JyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1EZWxldGUnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+YWNjZXB0X2FsZXJ0KCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgIFwkKCd0Ym9keSB0cjpjb250YWlucygkQXBwb2ludG1lbnROYW1lc1syXSknKS5sZW5ndGggPT09IDA7IgogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IGFsbCB0aGlyZCBhcHBvaW50bWVudCBvY2N1cmVuY2VzIGhhdmUgYmVlbiByZW1vdmVkLgogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCd0Ym9keSB0cjpjb250YWlucygkQXBwb2ludG1lbnROYW1lc1syXSknKS5sZW5ndGg7IiksCiAgICAgICAgICAgICJBbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJlbmNlcyBkZWxldGVkIgogICAgICAgICk7CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgZ3JvdXAKICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgJ1Rlc3QgZ3JvdXAgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBxdWV1ZQogICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIlF1ZXVlJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzc0lEID0+IDEsCiAgICAgICAgICAgIFNhbHV0YXRpb25JRCAgICA9PiAxLAogICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTb21lIGNvbW1lbnQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRCwKICAgICAgICAgICAgJ1Rlc3QgcXVldWUgY3JlYXRlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyRHcm91cE5hbWVdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgdXNlcic7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIG9wZW4gQWdlbnRBcHBvaW50bWVudENhbGVuZGFyTWFuYWdlIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJNYW5hZ2UiKTsKCiAgICAgICAgIyBjbGljayBBZGQgbmV3IGNhbGVuZGFyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuU2lkZWJhckNvbHVtbiB1bC5BY3Rpb25MaXN0IGEjQWRkJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdyaXRlIGNhbGVuZGFyIG5hbWUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIik7CgogICAgICAgICMgc2V0IGl0IHRvIHRlc3QgZ3JvdXAKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjR3JvdXBJRCcpLnZhbCgkR3JvdXBJRCkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBzdWJtaXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgVmVyaWZ5IGRvd25sb2FkIGFuZCBjb3B5LXRvLWNsaXBib2FyZCBsaW5rcy4KICAgICAgICBmb3IgbXkgJENsYXNzIChxdyhEb3dubG9hZExpbmsgQ29weVRvQ2xpcGJvYXJkKSkgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLiRDbGFzcyIsICdjc3MnICk7CgogICAgICAgICAgICBteSAkVVJMOwogICAgICAgICAgICBpZiAoICRDbGFzcyBlcSAnRG93bmxvYWRMaW5rJyApIHsKICAgICAgICAgICAgICAgICRVUkwgPSAkRWxlbWVudC0+Z2V0X2F0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENsYXNzIGVxICdDb3B5VG9DbGlwYm9hcmQnICkgewogICAgICAgICAgICAgICAgJFVSTCA9ICRFbGVtZW50LT5nZXRfYXR0cmlidXRlKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVSTCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIHByZXNlbnQiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFVSTCBzaG91bGQgbm90IGNvbnRhaW4gT1RSUyBzcGVjaWZpYyBVUkwgZGVsaW1pdGVyIG9mIHNlbWljb2xvbiAoOykuCiAgICAgICAgICAgICMgICBGb3IgYmV0dGVyIGNvbXBhdGliaWxpdHksIHVzZSBzdGFuZGFyZCBhbXBlcnNhbmQgKCYpIGluc3RlYWQuCiAgICAgICAgICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMjY2NyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgKCAkVVJMID1+IC9bO10vICkgPyAxIDogMCwKICAgICAgICAgICAgICAgICIkQ2xhc3MgVVJMIGRvZXMgbm90IGNvbnRhaW4gZm9yYmlkZGVuIGNoYXJhY3RlcnMiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyBsZXQncyB0cnkgdG8gYWRkIGNhbGVuZGFyIHdpdGggc2FtZSBuYW1lCiAgICAgICAgIwogICAgICAgICMgY2xpY2sgQWRkIG5ldyBjYWxlbmRhcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLlNpZGViYXJDb2x1bW4gdWwuQWN0aW9uTGlzdCBhI0FkZCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3cml0ZSBjYWxlbmRhciBuYW1lCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBpbnB1dCNDYWxlbmRhck5hbWUnLCAnY3NzJyApLT5zZW5kX2tleXMoIkNhbGVuZGFyICRSYW5kb21JRCIpOwoKICAgICAgICAjIHNldCBpdCB0byB0ZXN0IGdyb3VwCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0dyb3VwSUQnKS52YWwoJEdyb3VwSUQpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgc3VibWl0CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBidXR0b24jU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIHNlcnZlciBzaWRlIGVycm9yCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnZGl2LkRpYWxvZyBidXR0b24jRGlhbG9nQnV0dG9uMScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9rIHRvIGRpc21pc3MKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Rpdi5EaWFsb2cgYnV0dG9uI0RpYWxvZ0J1dHRvbjEnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgdG9vbHRpcCBtZXNzYWdlCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnZGl2I09UUlNfVUlfVG9vbHRpcHNfRXJyb3JUb29sdGlwJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIGNhbGVuZGFyIG5hbWUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGlucHV0I0NhbGVuZGFyTmFtZScsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdmb3JtI0NhbGVuZGFyRnJvbSBpbnB1dCNDYWxlbmRhck5hbWUnLCAnY3NzJyApLT5zZW5kX2tleXMoIkNhbGVuZGFyICRSYW5kb21JRCAyIik7CgogICAgICAgICMgc2V0IGl0IHRvIGludmFsaWQKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjVmFsaWRJRCcpLnZhbCgyKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGFkZCB0aWNrZXQgYXBwb2ludG1lbnQgcnVsZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLldpZGdldFNpbXBsZS5Db2xsYXBzZWQgLldpZGdldEFjdGlvbi5Ub2dnbGUgYScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNBZGRSdWxlQnV0dG9uJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgc2V0IGEgcXVldWUKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUXVldWVJRF8xJykudmFsKCckUXVldWVJRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgQWRkIHRpdGxlIGFzIHNlYXJjaCBwYXJhbWV0ZXIuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1NlYXJjaFBhcmFtcycpLnZhbCgnVGl0bGUnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkFkZEJ1dHRvbicsICAgICAgICAgICAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjU2VhcmNoUGFyYW1fMV9UaXRsZScsICdjc3MnICktPnNlbmRfa2V5cygnVGVzdConKTsKCiAgICAgICAgIyBzdWJtaXQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2Zvcm0jQ2FsZW5kYXJGcm9tIGJ1dHRvbiNTdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IHR3byBjYWxlbmRhcnMgYXJlIHNob3duCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6dmlzaWJsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgICdBbGwgY2FsZW5kYXJzIGFyZSBkaXNwbGF5ZWQnLAogICAgICAgICk7CgogICAgICAgICMgZmlsdGVyIGp1c3QgYWRkZWQgY2FsZW5kYXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2lucHV0I0ZpbHRlckNhbGVuZGFycycsICdjc3MnICktPnNlbmRfa2V5cygiQ2FsZW5kYXIgJFJhbmRvbUlEIDIiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgb25seSBvbmUgY2FsZW5kYXIgaXMgc2hvd24KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ0NhbGVuZGFycyBhcmUgZmlsdGVyZWQgY29ycmVjdGx5JywKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB0aGUgY2FsZW5kYXIgaXMgaW52YWxpZAogICAgICAgIG15ICRMYW5ndWFnZU9iamVjdCA9IEtlcm5lbDo6TGFuZ3VhZ2UtPm5ldygKICAgICAgICAgICAgVXNlckxhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29udGVudENvbHVtbiB0YWJsZSB0Ym9keSB0cjpudGgtb2YtdHlwZSgyKSB0ZDpudGgtb2YtdHlwZSg0KScsICdjc3MnICkKICAgICAgICAgICAgICAgIC0+Z2V0X3RleHQoKSwKICAgICAgICAgICAgJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoJ2ludmFsaWQnKSwKICAgICAgICAgICAgJ0NhbGVuZGFyIGlzIG1hcmtlZCBpbnZhbGlkJywKICAgICAgICApOwoKICAgICAgICAjIGVkaXQgaW52YWxpZCBjYWxlbmRhcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQgYScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBzZXQgaXQgdG8gaW52YWxpZC10ZW1wb3JhcmlseQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNWYWxpZElEJykudmFsKDMpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IHJ1bGUgaGFzIGJlZW4gc3RvcmVkIHByb3Blcmx5CiAgICAgICAgJFNlbGYtPklzRGVlcGx5KAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnc2VsZWN0W2lkKj1cIlF1ZXVlSURfXCJdJykudmFsKCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICBbJFF1ZXVlSURdLAogICAgICAgICAgICAnUXVldWUgc3RvcmVkIHByb3Blcmx5JywKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJ2lucHV0W2lkKj1cIl9UaXRsZVwiXScpLnZhbCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ1Rlc3QqJywKICAgICAgICAgICAgJ1NlYXJjaCBwYXJhbSBzdG9yZWQgcHJvcGVybHknLAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIHRoZSBydWxlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuUmVtb3ZlQnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHN1Ym1pdAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnZm9ybSNDYWxlbmRhckZyb20gYnV0dG9uI1N1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhlIGNhbGVuZGFyIGlzIGludmFsaWQgdGVtcG9yYXJpbHkKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNvbnRlbnRDb2x1bW4gdGFibGUgdGJvZHkgdHI6bnRoLW9mLXR5cGUoMikgdGQ6bnRoLW9mLXR5cGUoNCknLCAnY3NzJyApCiAgICAgICAgICAgICAgICAtPmdldF90ZXh0KCksCiAgICAgICAgICAgICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCdpbnZhbGlkLXRlbXBvcmFyaWx5JyksCiAgICAgICAgICAgICdDYWxlbmRhciBpcyBtYXJrZWQgaW52YWxpZCB0ZW1wb3JhcmlseScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGVhbnVwCgogICAgICAgIG15ICREQk9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIG15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY2FsZW5kYXJzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBuYW1lID0gPyBPUiBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcIkNhbGVuZGFyICRSYW5kb21JRCIsIFwiQ2FsZW5kYXIgJFJhbmRvbUlEIDIiLCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFycyAtIENhbGVuZGFyICRSYW5kb21JRCAoMikiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgcXVldWUKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFF1ZXVlSUQsIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJEZWxldGVkIHRlc3QgcXVldWUgLSAkUXVldWVJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBSZW1vdmUgc2NoZWR1bGVkIGFzeW5jaHJvbm91cyB0YXNrcyBmcm9tIERCLCBhcyB0aGV5IG1heSBpbnRlcmZlcmUgd2l0aCB0ZXN0cyBydW4gbGF0ZXIuCiAgICAgICAgbXkgQFRhc2tJRHM7CiAgICAgICAgbXkgQEFsbFRhc2tzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAnQXN5bmNocm9ub3VzRXhlY3V0b3InLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUYXNrIChAQWxsVGFza3MpIHsKICAgICAgICAgICAgaWYgKCAkVGFzay0+e05hbWV9IGVxICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXItVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzQ2FsZW5kYXIoKScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBUYXNrSURzLCAkVGFzay0+e1Rhc2tJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIG15ICRUYXNrSUQgKEBUYXNrSURzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGFza0RlbGV0ZSAtIFJlbW92ZWQgc2NoZWR1bGVkIGFzeW5jaHJvbm91cyB0YXNrICRUYXNrSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIFF1ZXVlKSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgpteSAkRWxlbWVudFJlYWRPbmx5ID0gc3ViIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgIyBWYWx1ZSBpcyBvcHRpb25hbCBwYXJhbWV0ZXIKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbml0VGVzdE9iamVjdCBFbGVtZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPklzKAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyMkUGFyYW17RWxlbWVudH0uUmVhZE9ubHlWYWx1ZScpLmxlbmd0aDsiCiAgICAgICAgKSwKICAgICAgICAkUGFyYW17VmFsdWV9LAogICAgICAgICIkUGFyYW17RWxlbWVudH0gcmVhZCBvbmx5ICgkUGFyYW17VmFsdWV9KSIsCiAgICApOwp9OwoKbXkgJEVsZW1lbnRFeGlzdHMgPSBzdWIgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICAjIFZhbHVlIGlzIG9wdGlvbmFsIHBhcmFtZXRlcgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVuaXRUZXN0T2JqZWN0IEVsZW1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExlbmd0aCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgInJldHVybiBcJCgnIyIgLiAkUGFyYW17RWxlbWVudH0gLiAiJykubGVuZ3RoOyIKICAgICk7CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRQYXJhbXtVbml0VGVzdE9iamVjdH0tPlRydWUoCiAgICAgICAgICAgICRMZW5ndGgsCiAgICAgICAgICAgICIkUGFyYW17RWxlbWVudH0gZXhpc3RzIiwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1VuaXRUZXN0T2JqZWN0fS0+RmFsc2UoCiAgICAgICAgICAgICRMZW5ndGgsCiAgICAgICAgICAgICIkUGFyYW17RWxlbWVudH0gbm90IGV4aXN0cyIsCiAgICAgICAgKTsKICAgIH0KfTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkR3JvdXBPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICBteSAkQ2FsZW5kYXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgICAgICBteSAkVGltZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUyID0gInRlc3QtY2FsZW5kYXItZ3JvdXAyLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQyICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUyLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByb290IHRvIHRoZSBjcmVhdGVkIGdyb3VwCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAxLAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIG93bmVyICAgICA9PiAxLAogICAgICAgICAgICAgICAgcHJpb3JpdHkgID0+IDEsCiAgICAgICAgICAgICAgICBydyAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBnZXQgVXNlcklECiAgICAgICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCiAgICAgICAgbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoKQogICAgICAgICAgICB8fCBkaWUgJ0RpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlcic7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMSAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMiAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyNFQzkwNzMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyMyAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyM2QkFENTQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICVDYWxlbmRhcjQgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyNCAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyM3OEE3RkMnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSB0ZXN0IHRpY2tldAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICJMaW5rIFRpY2tldCAkUmFuZG9tSUQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIEN1c3RvbWVyTm8gICA9PiAnMTIzNDY1JywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICdjdXN0b21lckBleGFtcGxlLmNvbScsCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXRDcmVhdGUoKSAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldE51bWJlciwKICAgICAgICAgICAgIlRpY2tldE51bWJlckxvb2t1cCgpIC0gJFRpY2tldE51bWJlciIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgYWxsIHRocmVlIGNhbGVuZGFycyBhcmUgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5DYWxlbmRhclN3aXRjaDp2aXNpYmxlJykubGVuZ3RoOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMywKICAgICAgICAgICAgJ0FsbCB0aHJlZSBjYWxlbmRhcnMgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBWZXJpZnkgY29weS10by1jbGlwYm9hcmQgbGluay4KICAgICAgICBteSAkVVJMID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuQ29weVRvQ2xpcGJvYXJkJywgJ2NzcycgKS0+Z2V0X2F0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFVSTCwKICAgICAgICAgICAgJ0NvcHlUb0NsaXBib2FyZCBVUkwgcHJlc2VudCcKICAgICAgICApOwoKICAgICAgICAjIFVSTCBzaG91bGQgbm90IGNvbnRhaW4gT1RSUyBzcGVjaWZpYyBVUkwgZGVsaW1pdGVyIG9mIHNlbWljb2xvbiAoOykuCiAgICAgICAgIyAgIEZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eSwgdXNlIHN0YW5kYXJkIGFtcGVyc2FuZCAoJikgaW5zdGVhZC4KICAgICAgICAjICAgUGxlYXNlIHNlZSBidWcjMTI2NjcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAoICRVUkwgPX4gL1s7XS8gKSA/IDEgOiAwLAogICAgICAgICAgICAnQ29weVRvQ2xpcGJvYXJkIFVSTCBkb2VzIG5vdCBjb250YWluIGZvcmJpZGRlbiBjaGFyYWN0ZXJzJwogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gdGhlIHRpbWVsaW5lIHZpZXcgZm9yIGFuIGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIGRpYWxvZwogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1Db3B5KSkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cy0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAgICAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAxJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdMb2NhdGlvbicsICduYW1lJyApLT5zZW5kX2tleXMoJ1N0cmF1YmluZycpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnRW5kSG91cicsICAgICAgJ25hbWUnICktPnNlbmRfa2V5cygnMTgnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5QbHVnaW5GaWVsZCcsICdjc3MnICktPnNlbmRfa2V5cygkVGlja2V0TnVtYmVyKTsKCiAgICAgICAgIyB3YWl0IGZvciBhdXRvY29tcGxldGUgdG8gbG9hZAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGxpbmsgdGhlIHRpY2tldAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJ2xpLnVpLW1lbnUtaXRlbScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGNvcnJlY3QgdGlja2V0IGlzIGxpc3RlZAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5QbHVnaW5Db250YWluZXIgZGl2IGFbdGFyZ2V0PVwiX2JsYW5rXCJdJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIiRUaWNrZXROdW1iZXIgTGluayBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAgICAgJ0xpbmsgdGlja2V0IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlCiAgICAgICAgbXkgJExvY2F0aW9uTGlua1VSTCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkxvY2F0aW9uTGluaycsICdjc3MnICktPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9fiAvU3RyYXViaW5nJC8sCiAgICAgICAgICAgICdMb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGZpcnN0IGFwcG9pbnRtZW50IGlzIHZpc2libGUKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IDEnLAogICAgICAgICAgICAnRmlyc3QgYXBwb2ludG1lbnQgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byB0aGUgdGlja2V0IHpvb20gc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSR7VGlja2V0SUR9Iik7CgogICAgICAgICMgZmluZCBsaW5rIHRvIHRoZSBhcHBvaW50bWVudCBvbiBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdhLkxpbmtPYmplY3RMaW5rJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGNoZWNrIGRhdGEKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjVGl0bGUnKS52YWwoKTsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdBcHBvaW50bWVudCAxJywKICAgICAgICAgICAgJ1RpdGxlIG1hdGNoZXMnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoKTsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICdDYWxlbmRhciBtYXRjaGVzJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5QbHVnaW5Db250YWluZXIgZGl2IGFbdGFyZ2V0PVwiX2JsYW5rXCJdJykudGV4dCgpOyIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgIiRUaWNrZXROdW1iZXIgTGluayBUaWNrZXQgJFJhbmRvbUlEIiwKICAgICAgICAgICAgJ0xpbmsgdGlja2V0IG1hdGNoZXMnLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgbG9jYXRpb24gbGluayBjb250YWlucyBjb3JyZWN0IHZhbHVlCiAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkxvY2F0aW9uTGluaycsICdjc3MnICktPmdldF9hdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJExvY2F0aW9uTGlua1VSTCA9fiAvU3RyYXViaW5nJC8sCiAgICAgICAgICAgICdMb2NhdGlvbiBsaW5rIGNvbnRhaW5zIGNvcnJlY3QgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgY2FuY2VsIHRoZSBkaWFsb2cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybUNhbmNlbCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBnbyB0byBwcmV2aW91cyB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtcHJldi1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoZSB0aW1lbGluZSB2aWV3IGZvciBhbm90aGVyIGFwcG9pbnRtZW50IGRpYWxvZwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lV2Vlay12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDpudGgtY2hpbGQoNSknLCAnY3NzJyApCiAgICAgICAgICAgIC0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdBcHBvaW50bWVudCAyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdBbGxEYXknLCAnbmFtZScgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGhpZGUgdGhlIGZpcnN0IGNhbGVuZGFyIGZyb20gdmlldwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IHNlY29uZCBhcHBvaW50bWVudCBpcyB2aXNpYmxlCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZScpLnRleHQoKTsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdBcHBvaW50bWVudCAyJywKICAgICAgICAgICAgJ1NlY29uZCBhcHBvaW50bWVudCB2aXNpYmxlJywKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBzZWNvbmQgYXBwb2ludG1lbnQgaXMgYW4gYWxsIGRheSBhcHBvaW50bWVudAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmEtc3VuLW8nKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMScsCiAgICAgICAgICAgICdTZWNvbmQgYXBwb2ludG1lbnQgaW4gYW4gYWxsIGRheSBhcHBvaW50bWVudCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBhZ2FpbiBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmVXZWVrLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50Om50aC1jaGlsZCg1KScsICdjc3MnICkKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgV2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0FwcG9pbnRtZW50IDMnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjN7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0VuZEhvdXInLCAnbmFtZScgKS0+c2VuZF9rZXlzKCcxOCcpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnRGFpbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGhpZGUgdGhlIHNlY29uZCBjYWxlbmRhciBmcm9tIHZpZXcKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sICdpZCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJlbmNlcyBhcmUgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnNCcsCiAgICAgICAgICAgICdBbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgdmlzaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiBhbiBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRpbWVsaW5lLWV2ZW50JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIFdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGNsaWNrIG9uIERlbGV0ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtRGVsZXRlJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgIyBjb25maXJtCiAgICAgICAgJFNlbGVuaXVtLT5hY2NlcHRfYWxlcnQoKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSBhbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJlbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZAogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMCcsCiAgICAgICAgICAgICdBbGwgdGhpcmQgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMgcmVtb3ZlZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGFsbCB0aHJlZSBjYWxlbmRhcnMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sICdpZCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LCAnaWQnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgdmVyaWZ5IG9ubHkgdHdvIGFwcG9pbnRtZW50cyBhcmUgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS5sZW5ndGg7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnMicsCiAgICAgICAgICAgICdGaXJzdCBhbmQgc2Vjb25kIGFwcG9pbnRtZW50IHZpc2libGUnLAogICAgICAgICk7CgogICAgICAgICMgb3BlbiBkYXRlcGlja2VyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtanVtcC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyB2ZXJpZnkgZXhhY3RseSBvbmUgZGF5IHdpdGggYXBwb2ludG1lbnRzIGlzIGhpZ2hsaWdodGVkCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgLkhpZ2hsaWdodCcpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdEYXRlcGlja2VyIHByb3Blcmx5IGhpZ2hsaWdodGVkJywKICAgICAgICApOwoKICAgICAgICAjIGNsb3NlIGRhdGVwaWNrZXIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ2RpdiNEYXRlcGlja2VyT3ZlcmxheScsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBmaWx0ZXIganVzdCB0aGlyZCBjYWxlbmRhcgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnaW5wdXQjRmlsdGVyQ2FsZW5kYXJzJywgJ2NzcycgKS0+c2VuZF9rZXlzKCdDYWxlbmRhcjMnKTsKCiAgICAgICAgIyB3YWl0IGZvciBmaWx0ZXIgdG8gZmluaXNoCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgb25seSBvbmUgY2FsZW5kYXIgaXMgc2hvd24gaW4gdGhlIGxpc3QKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcuQ2FsZW5kYXJTd2l0Y2g6dmlzaWJsZScpLmxlbmd0aDsiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdDYWxlbmRhcnMgYXJlIGZpbHRlcmVkIGNvcnJlY3RseScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IEFwcG9pbnRtZW50IChhcyByb290KQogICAgICAgIG15ICRTdGFydFRpbWUgICAgICAgPSAkVGltZU9iamVjdC0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgIG15ICRTdGFydFRpbWVTeXN0ZW0gPSAkVGltZU9iamVjdC0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CiAgICAgICAgJFN0YXJ0VGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCwgICAgIyBsYXN0IHdlZWsKICAgICAgICApOwoKICAgICAgICBteSAkRW5kVGltZSA9ICRUaW1lT2JqZWN0LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lU3lzdGVtIC0gNyAqIDI0ICogNjAgKiA2MCArIDIgKiA2MCAqIDYwLCAgICAjIDIgaG91cnMgYWZ0ZXIgc3RhcnQgdGltZQogICAgICAgICk7CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ1Blcm1pc3Npb25zIGNoZWNrIGFwcG9pbnRtZW50JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIEVuZFRpbWUgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICBUaW1lem9uZUlEICA9PiAwLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgJ1Blcm1pc3Npb24gQXBwb2ludG1lbnQgY3JlYXRlZC4nLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJvIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVsb2FkIHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBzaG93IHRoZSBmb3VydGggY2FsZW5kYXIgYW5kIGhpZGUgYWxsIG90aGVycwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyNHtDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdDYWxlbmRhcicgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LCAnaWQnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ0NhbGVuZGFyJyAuICRDYWxlbmRhcjJ7Q2FsZW5kYXJJRH0sICdpZCcgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnQ2FsZW5kYXInIC4gJENhbGVuZGFyM3tDYWxlbmRhcklEfSwgJ2lkJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBmaW5kIHRoZSBhcHBvaW50bWVudCBsaW5rCiAgICAgICAgbXkgJEFwcG9pbnRtZW50TGluayA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLWV2ZW50LWNvbnRhaW5lciBhJywgJ2NzcycgKTsKCiAgICAgICAgIyAgICAgICAgJFNlbGVuaXVtLT5tb3VzZV9tb3ZlX3RvX2xvY2F0aW9uKCRBcHBvaW50bWVudExpbmspOwoKICAgICAgICAjIGNsaWNrIG9uIGFwcG9pbnRtZW50CiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkcyBhcmUgZGlzYWJsZWQKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoCiAgICAgICAgICAgIHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uIENhbGVuZGFySUQgVGVhbUlEIFJlc291cmNlSUQgU3RhcnREYXkgRW5kRGF5IEFsbERheQogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbGVtZW50cyB0aGF0IGFyZSBub3QgYWxsb3dlZCBvbiBwYWdlCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybVN1Ym1pdCBFZGl0Rm9ybURlbGV0ZSBFZGl0Rm9ybUNvcHkpKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgb24gcGFnZQogICAgICAgIGZvciBteSAkRWxlbWVudCAocXcoRWRpdEZvcm1DYW5jZWwpKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2xpY2sgb24gY2FuY2VsCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1DYW5jZWwnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgYWRkIG1vdmVfaW50byBwZXJtaXNzaW9ucyB0byB0aGUgdXNlcgogICAgICAgICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwVXNlckFkZCgKICAgICAgICAgICAgR0lEICAgICAgICA9PiAkR3JvdXBJRDIsCiAgICAgICAgICAgIFVJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiB7CiAgICAgICAgICAgICAgICBybyAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIG1vdmVfaW50byA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNsaWNrIG9uIGFwcG9pbnRtZW50CiAgICAgICAgJEFwcG9pbnRtZW50TGluay0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkcyBhcmUgZGlzYWJsZWQKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KCBDYWxlbmRhcklEICkpIHsKICAgICAgICAgICAgJEVsZW1lbnRSZWFkT25seS0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkcyBhcmUgZW5hYmxlZAogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICgKICAgICAgICAgICAgcXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24gVGVhbUlEIFJlc291cmNlSUQgU3RhcnREYXkgRW5kRGF5IEFsbERheSBSZWN1cnJlbmNlVHlwZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UIGlmICRFbGVtZW50IGVxICdUZWFtSUQnIHx8ICRFbGVtZW50IGVxICdSZXNvdXJjZUlEJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVsZW1lbnRSZWFkT25seS0+KAogICAgICAgICAgICAgICAgVW5pdFRlc3RPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIG9uIHBhZ2UKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKHF3KEVkaXRGb3JtRGVsZXRlIEVkaXRGb3JtQ29weSkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybVN1Ym1pdCBFZGl0Rm9ybUNhbmNlbCkpIHsKICAgICAgICAgICAgJEVsZW1lbnRFeGlzdHMtPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbGljayBvbiBjYW5jZWwKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybUNhbmNlbCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBhZGQgY3JlYXRlIHBlcm1pc3Npb25zIHRvIHRoZSB1c2VyCiAgICAgICAgJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBVc2VyQWRkKAogICAgICAgICAgICBHSUQgICAgICAgID0+ICRHcm91cElEMiwKICAgICAgICAgICAgVUlEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBQZXJtaXNzaW9uID0+IHsKICAgICAgICAgICAgICAgIHJvICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgbW92ZV9pbnRvID0+IDEsCiAgICAgICAgICAgICAgICBjcmVhdGUgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiBhcHBvaW50bWVudAogICAgICAgICRBcHBvaW50bWVudExpbmstPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBjaGVjayBpZiBmaWVsZHMgYXJlIGVuYWJsZWQKICAgICAgICBFTEVNRU5UOgogICAgICAgIGZvciBteSAkRWxlbWVudCAoCiAgICAgICAgICAgIHF3KFRpdGxlIERlc2NyaXB0aW9uIExvY2F0aW9uIENhbGVuZGFySUQgVGVhbUlEIFJlc291cmNlSUQgU3RhcnREYXkgRW5kRGF5IEFsbERheQogICAgICAgICAgICBSZWN1cnJlbmNlVHlwZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgY2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZAogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJywgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgICAgIG5leHQgRUxFTUVOVCBpZiAkRWxlbWVudCBlcSAnVGVhbUlEJyB8fCAkRWxlbWVudCBlcSAnUmVzb3VyY2VJRCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50UmVhZE9ubHktPigKICAgICAgICAgICAgICAgIFVuaXRUZXN0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgPT4gJEVsZW1lbnQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBvbiBwYWdlCiAgICAgICAgZm9yIG15ICRFbGVtZW50IChxdyhFZGl0Rm9ybUNvcHkgRWRpdEZvcm1TdWJtaXQgRWRpdEZvcm1EZWxldGUgRWRpdEZvcm1DYW5jZWwpKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzLT4oCiAgICAgICAgICAgICAgICBVbml0VGVzdE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgID0+ICRFbGVtZW50LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMKICAgICAgICAjIENsZWFudXAKICAgICAgICAjCgogICAgICAgIG15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICREQk9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIERlbGV0ZSBhcHBvaW50bWVudHMgYW5kIGNhbGVuZGFycy4KICAgICAgICBmb3IgbXkgJENhbGVuZGFySUQgKAogICAgICAgICAgICAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICAkQ2FsZW5kYXIye0NhbGVuZGFySUR9LAogICAgICAgICAgICAkQ2FsZW5kYXIze0NhbGVuZGFySUR9LAogICAgICAgICAgICAkQ2FsZW5kYXI0e0NhbGVuZGFySUR9LAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50SUQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERlbGV0ZSB0ZXN0IGNhbGVuZGFycy4KICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ICRDYWxlbmRhcklEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IHRpY2tldCAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBSZW1vdmUgc2NoZWR1bGVkIGFzeW5jaHJvbm91cyB0YXNrcyBmcm9tIERCLCBhcyB0aGV5IG1heSBpbnRlcmZlcmUgd2l0aCB0ZXN0cyBydW4gbGF0ZXIuCiAgICAgICAgbXkgQFRhc2tJRHM7CiAgICAgICAgbXkgQEFsbFRhc2tzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAnQXN5bmNocm9ub3VzRXhlY3V0b3InLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUYXNrIChAQWxsVGFza3MpIHsKICAgICAgICAgICAgaWYgKCAkVGFzay0+e05hbWV9IGVxICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXItVGlja2V0QXBwb2ludG1lbnRQcm9jZXNzVGlja2V0KCknICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGFza0lEcywgJFRhc2stPntUYXNrSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciBteSAkVGFza0lEIChAVGFza0lEcykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza0lELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIlRhc2tEZWxldGUgLSBSZW1vdmVkIHNjaGVkdWxlZCBhc3luY2hyb25vdXMgdGFzayAkVGFza0lEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIGdyb3VwLXVzZXIgcmVsYXRpb25zLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBncm91cF91c2VyIFdIRVJFIGdyb3VwX2lkID0gJEdyb3VwSUQgT1IgZ3JvdXBfaWQgPSAkR3JvdXBJRDIiLAogICAgICAgICk7CiAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiR3JvdXBVc2VyRGVsZXRlIC0gJFJhbmRvbUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIGdyb3Vwcy4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gZ3JvdXBzIFdIRVJFIGlkID0gJEdyb3VwSUQgT1IgaWQgPSAkR3JvdXBJRDIiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiR3JvdXBEZWxldGUgLSAkUmFuZG9tSUQiLAogICAgICAgICk7CgogICAgICAgICMgTWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoQXBwb2ludG1lbnQgQ2FsZW5kYXIgR3JvdXAgVGlja2V0KSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgb3ZlcnJpZGUgbG9jYWwgdGltZSB6b25lIGZvciBkdXJhdGlvbiBvZiB0aGUgdGVzdApsb2NhbCAkRU5We1RafSA9ICdVVEMnOwoKIyBnZXQgc2VsZW5pdW0gb2JqZWN0Cm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJENhbGVuZGFySGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpIZWxwZXInKTsKICAgICAgICBteSAkVXNlck9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkN1cnJlbnRTeXN0ZW1UaW1lKCk7CgogICAgICAgICMgYWRkIDEgbW9udGgKICAgICAgICAkU3lzdGVtVGltZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+QWRkUGVyaW9kKAogICAgICAgICAgICBUaW1lICAgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgIE1vbnRocyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGRhdGUgaW5mbyAoU2Vjb25kLCBNaW51dGUsIEhvdXIsIERheSwgTW9udGgsIFllYXIsIERheU9mV2VlaykKICAgICAgICBteSBARGF0ZUluZm8gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGFuZ2UgcmVzb2x1dGlvbiAoZGVza3RvcCBtb2RlKQogICAgICAgICRTZWxlbml1bS0+c2V0X3dpbmRvd19zaXplKCA3NjgsIDEwNTAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyCiAgICAgICAgbXkgJExhbmd1YWdlICAgICAgPSAnZW4nOwogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyAgID0+IFsgJ3VzZXJzJywgJEdyb3VwTmFtZSBdLAogICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICMgZ2V0IFVzZXJJRAogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgc3RhcnQgdGVzdAogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGZldyB0ZXN0IGNhbGVuZGFycwogICAgICAgIG15ICVDYWxlbmRhcjEgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIk15IENhbGVuZGFyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNsaWNrIG9uIHRoZSBtb250aCB2aWV3CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtbW9udGgtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBnbyB0byBuZXh0IG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdG9vbGJhciAuZmMtbmV4dC1idXR0b24nLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgJERhdGFEYXRlID0gIiREYXRlSW5mb1s1XS0iOwogICAgICAgIGlmICggJERhdGVJbmZvWzRdIDwgMTAgKSB7CiAgICAgICAgICAgICREYXRhRGF0ZSAuPSAiMCI7CiAgICAgICAgfQogICAgICAgICREYXRhRGF0ZSAuPSAiJERhdGVJbmZvWzRdLTAxIjsKCiAgICAgICAgIyBjcmVhdGUgZXZlcnkgZGF5IGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSBkYXknKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0RhaWx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czEgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgNCBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRzMSwKICAgICAgICAgICAgNCwKICAgICAgICAgICAgIkNyZWF0ZSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICREZWxldGUxID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzMVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUxLAogICAgICAgICAgICAiRGVsZXRlIGRhaWx5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSB3ZWVrIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdFdmVyeSB3ZWVrJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdXZWVrbHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMyLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15ICRTdGFydEFwcG9pbnRtZW50ICAgICAgID0gIiREYXRhRGF0ZSAwMDowMDowMCI7CiAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQyU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDcgKiAyNCAqIDM2MDAsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSArIDE0ICogMjQgKiAzNjAwLAogICAgICAgICAgICApLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uIDIgKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHMyWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MlN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgbXkgJERlbGV0ZTIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHMyWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTIsCiAgICAgICAgICAgICJEZWxldGUgd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBldmVyeSBtb250aCBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgbW9udGgnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ01vbnRobHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzMyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHMzLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQzU3RhcnRUaW1lcyA9ICgKICAgICAgICAgICAgJFN0YXJ0QXBwb2ludG1lbnQsCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUaW1lICAgPT4gJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApLAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgTW9udGhzID0+IDIsCiAgICAgICAgICAgICAgICAgICAgVGltZSAgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzM1skSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDNTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgIG15ICREZWxldGUzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzM1swXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGUzLAogICAgICAgICAgICAiRGVsZXRlIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGV2ZXJ5IHllYXIgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IHllYXInKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ1llYXJseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czQsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgeWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50NFN0YXJ0VGltZXMgPSAoCiAgICAgICAgICAgICRTdGFydEFwcG9pbnRtZW50LAogICAgICAgICAgICAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJENhbGVuZGFySGVscGVyT2JqZWN0LT5BZGRQZXJpb2QoCiAgICAgICAgICAgICAgICAgICAgWWVhcnMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUaW1lICA9PiAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgICAgICAgICBZZWFycyA9PiAyLAogICAgICAgICAgICAgICAgICAgIFRpbWUgID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNFskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDRTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgIG15ICREZWxldGU0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU0LAogICAgICAgICAgICAiRGVsZXRlIHllYXJseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYXBwb2ludG1lbnQgZXZlcnkgc2Vjb25kIGRheQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIGRheScpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFyMXtDYWxlbmRhcklEfQogICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlVHlwZScpLnZhbCgnQ3VzdG9tJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGpzIHNob3dzIEludGVydmFsCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUludGVydmFsOnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM1LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnQuIgogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudDVTdGFydFRpbWVzID0gKAogICAgICAgICAgICAkU3RhcnRBcHBvaW50bWVudCwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgMiAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydEFwcG9pbnRtZW50U3lzdGVtICsgNCAqIDI0ICogMzYwMCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNVskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDVTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU1ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNVswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU1LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSBkYWlseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0V2ZXJ5IDJuZCBNb25kYXksIFdlZG5lc2RheSBhbmQgU3VuZGF5Jyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbVdlZWtseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2OnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBkZXNlbGVjdCBzZWxlY3RlZCBkYXkKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ2ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDYsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjNikuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IE1vbgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiMVwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjFcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMSwKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBNb25kYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFdlZAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiM1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjMgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBXZWRuZXNkYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IFN1bgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uW3ZhbHVlPVwiN1wiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0NkZvcjcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvblt2YWx1ZT1cIjdcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ2Rm9yNywKICAgICAgICAgICAgIkN1c3RvbSB3ZWVrbHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiBTdW5kYXkgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnNicpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzNiA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSA2IGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM2LAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTYgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdENXNjsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50NlN0YXJ0VGltZXMgIT0gNiApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAoICRUbXAsICRDVzYgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+V2Vla0RldGFpbHNHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGN1cnJlbnQgZGF5CiAgICAgICAgICAgIGlmICggISRMYXN0Q1c2ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggZ3JlcCB7ICREYXlPZldlZWsgPT0gJF8gfSAoIDEsIDMsIDcgKSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNiAtICRMYXN0Q1c2ICkgJSAyID09IDAgKSAgICAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ2U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzYgPSAkQ1c2OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNiArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzNlskSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDZTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU2ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzNlswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU2LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20gd2Vla2x5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tV2Vla2x5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDcgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkNywKICAgICAgICAgICAgIkNoZWNrIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKCM3KS4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgd2VlawogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLnZhbCgnMicpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdSZWN1cnJlbmNlQ291bnQnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIGRpYWxvZyB0byBjbG9zZSBhbmQgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuRGlhbG9nOnZpc2libGUiKS5sZW5ndGggJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgIG15IEBBcHBvaW50bWVudHM3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czcsCiAgICAgICAgICAgIDMsCiAgICAgICAgICAgICJDcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnkgZGF5IHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50N1N0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU3ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RDVzc7CiAgICAgICAgbXkgJERheU9mV2Vlazc7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDdTdGFydFRpbWVzICE9IDMgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgKCAkVG1wLCAkQ1c3ICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPldlZWtEZXRhaWxzR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdENXNyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50N1N0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU3LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0Q1c3ICAgID0gJENXNzsKICAgICAgICAgICAgICAgICREYXlPZldlZWs3ID0gJERheU9mV2VlawogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheU9mV2VlayA9PSAkRGF5T2ZXZWVrNyApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJENXNyAtICRMYXN0Q1c3ICkgJSAyID09IDAgKSAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ3U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RDVzcgPSAkQ1c3OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lNyArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAyICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzN1skSW5kZXhdLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudDdTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGU3ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzN1swXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZWxldGU3LAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIG1vbnRoLCBvbiAzdGgsIDEwdGggYW5kIDMxdGggb2YgbW9udGguJyk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI0NhbGVuZGFySUQnKS52YWwoIgogICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdDdXN0b20nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgdW50aWwganMgc2hvd3MgSW50ZXJ2YWwKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlSW50ZXJ2YWw6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUN1c3RvbVR5cGUnKS52YWwoJ0N1c3RvbU1vbnRobHknKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwoKICAgICAgICAjIHdhaXQgZm9yIGpzCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIGRheQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgaXQncyBkZXNlbGVjdGVkCiAgICAgICAgbXkgJERlc2VsZWN0ZWQ4ID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuICEkKCIjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmxlbmd0aDsnCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlc2VsZWN0ZWQ4LAogICAgICAgICAgICAiQ2hlY2sgaWYgbm90aGluZyBpcyBzZWxlY3RlZCAoIzgpLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCAzdGgKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIzXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMyA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjNcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQ4Rm9yMywKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMyBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZWxlY3QgMTB0aAogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjEwXCJdJykuY2xpY2soKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBzZWxlY3RlZCBzdWNjZXNzZnVsCiAgICAgICAgbXkgJFdhaXQ4Rm9yMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXSIpLmhhc0NsYXNzKCJmYy1zdGF0ZS1hY3RpdmUiKScKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkV2FpdDhGb3IxMCwKICAgICAgICAgICAgIkN1c3RvbSBtb250aGx5IGFwcG9pbnRtZW50IC0gY2hlY2sgaWYgMTAgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IDMxCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgYnV0dG9uW3ZhbHVlPVwiMzFcIl0nKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNlbGVjdGVkIHN1Y2Nlc3NmdWwKICAgICAgICBteSAkV2FpdDhGb3IzMSA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvblt2YWx1ZT1cIjMxXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0OEZvcjMxLAogICAgICAgICAgICAiQ3VzdG9tIG1vbnRobHkgYXBwb2ludG1lbnQgLSBjaGVjayBpZiAzMSBpcyBzZWxlY3RlZC4iCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZWFjaCAybmQgd2VlawogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlSW50ZXJ2YWwnKS52YWwoMik7IgogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIDIwIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMjAnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czggPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9LAogICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGVyZSBhcmUgMjAgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czgsCiAgICAgICAgICAgIDIwLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudC4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50OFN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWU4ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICBTdHJpbmcgPT4gIiREYXRhRGF0ZSAwMDowMDowMCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RNb250aDg7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDhTdGFydFRpbWVzICE9IDIwICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0TW9udGg4ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RNb250aDggPSAkTW9udGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgKCBncmVwIHsgJERheSA9PSAkXyB9ICggMywgMTAsIDMxICkgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICggJE1vbnRoIC0gJExhc3RNb250aDggKSAlIDIgPT0gMCAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQ4U3RhcnRUaW1lcywgJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTgsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lOCArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAxOSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czhbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ4U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlOCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czhbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlOCwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gbW9udGhseSByZWN1cnJpbmcgYXBwb2ludG1lbnRzLiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgY3VzdG9tIHdlZWtseSByZWN1cnJpbmcgYXBwb2ludG1lbnQod2l0aG91dCBhbnl0aGluZyBzZWxlY3RlZCkKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ0N1c3RvbSBtb250aGx5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tTW9udGhseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCBmb3IganMKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdjp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgZGVzZWxlY3Qgc2VsZWN0ZWQgZGF5CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUnKS5jbGljaygpOyIKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBpdCdzIGRlc2VsZWN0ZWQKICAgICAgICBteSAkRGVzZWxlY3RlZDkgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikubGVuZ3RoOycKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVzZWxlY3RlZDksCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjOSkuIgogICAgICAgICk7CgogICAgICAgICMgc2V0IGVhY2ggMm5kIHllYXIKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUludGVydmFsJykudmFsKDIpOyIKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnUmVjdXJyZW5jZUNvdW50JywgJ25hbWUnICktPnNlbmRfa2V5cygnMycpOwoKICAgICAgICAjIGNsaWNrIG9uIFNhdmUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnRzOSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSAzIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudHM5LAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSBtb250aGx5IHJlY3VycmluZyBhcHBvaW50bWVudCh3aXRob3V0IGFueSBkYXkgc2VsZWN0ZWQpLiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQ5U3RhcnRUaW1lczsKICAgICAgICBteSAkU3lzdGVtVGltZTkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdE1vbnRoOTsKICAgICAgICBteSAkRGF5OTsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50OVN0YXJ0VGltZXMgIT0gMyApIHsKICAgICAgICAgICAgbXkgKCAkU2Vjb25kLCAkTWludXRlLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciwgJERheU9mV2VlayApID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZTksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdE1vbnRoOSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50OVN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWU5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0TW9udGg5ID0gJE1vbnRoOwogICAgICAgICAgICAgICAgJERheTkgICAgICAgPSAkRGF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheSA9PSAkRGF5OSApICAgICMgY2hlY2sgaWYgZGF5IGlzIHZhbGlkCiAgICAgICAgICAgICAgICAmJiAoICggJE1vbnRoIC0gJExhc3RNb250aDkgKSAlIDIgPT0gMCApICAgICMgY2hlY2sgaWYgSW50ZXJ2YWwgbWF0Y2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudDlTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lOSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdE1vbnRoOSA9ICRNb250aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgb25lIGRheQogICAgICAgICAgICAkU3lzdGVtVGltZTkgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czlbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQ5U3RhcnRUaW1lc1skSW5kZXhdLAogICAgICAgICAgICAgICAgIkNoZWNrIHN0YXJ0IHRpbWUgIyRJbmRleCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlOSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czlbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlOSwKICAgICAgICAgICAgIkRlbGV0ZSBjdXN0b20gd2Vla2x5IHJlY3VycmluZyBhcHBvaW50bWVudHMuIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBjdXN0b20geWVhcmx5IHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1RpdGxlJywgJ25hbWUnICktPnNlbmRfa2V5cygnRXZlcnkgMm5kIHllYXIsIGluIEZlYnJ1YXJ5LCBPY3RvYmVyIGFuZCBEZWNlbWJlci4nKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkMTAgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkMTAsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjMTApLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBGZWJydWFyeQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMlwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IyID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIyXCJdIikuaGFzQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRXYWl0MTBGb3IyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIEZlYnJ1YXJ5IGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNlbGVjdCBPY3RvYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMFwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMCA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTBcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQxMEZvcjEwLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIE9jdG9iZXIgaXMgc2VsZWN0ZWQuIgogICAgICAgICk7CgogICAgICAgICMgc2VsZWN0IERlY2VtYmVyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdiBidXR0b25bdmFsdWU9XCIxMlwiXScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgc2VsZWN0ZWQgc3VjY2Vzc2Z1bAogICAgICAgIG15ICRXYWl0MTBGb3IxMiA9ICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPVwiMTJcIl0iKS5oYXNDbGFzcygiZmMtc3RhdGUtYWN0aXZlIiknCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFdhaXQxMEZvcjEyLAogICAgICAgICAgICAiQ3VzdG9tIHllYXJseSBhcHBvaW50bWVudCAtIGNoZWNrIGlmIERlY2VtYmVyIGlzIHNlbGVjdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB3ZWVrCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgNiBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzYnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czEwID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDYgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czEwLAogICAgICAgICAgICA2LAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50LiIKICAgICAgICApOwoKICAgICAgICBteSBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXM7CiAgICAgICAgbXkgJFN5c3RlbVRpbWUxMCA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+U3lzdGVtVGltZUdldCgKICAgICAgICAgICAgU3RyaW5nID0+ICIkRGF0YURhdGUgMDA6MDA6MDAiLAogICAgICAgICk7CgogICAgICAgIG15ICRMYXN0WWVhcjEwOwogICAgICAgIG15ICREYXkxMDsKCiAgICAgICAgd2hpbGUgKCBzY2FsYXIgQEFwcG9pbnRtZW50MTBTdGFydFRpbWVzICE9IDYgKSB7CiAgICAgICAgICAgIG15ICggJFNlY29uZCwgJE1pbnV0ZSwgJEhvdXIsICREYXksICRNb250aCwgJFllYXIsICREYXlPZldlZWsgKSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+RGF0ZUdldCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0WWVhcjEwICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdFllYXIxMCA9ICRZZWFyOwogICAgICAgICAgICAgICAgJERheTEwICAgICAgPSAkRGF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICREYXkgPT0gJERheTEwCiAgICAgICAgICAgICAgICAmJiAoIGdyZXAgeyAkTW9udGggPT0gJF8gfSAoIDIsIDEwLCAxMiApICkgICAgIyBjaGVjayBpZiBkYXkgaXMgdmFsaWQKICAgICAgICAgICAgICAgICYmICggKCAkWWVhciAtICRMYXN0WWVhcjEwICkgJSAyID09IDAgKSAgICAgICAjIGNoZWNrIGlmIEludGVydmFsIG1hdGNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnQxMFN0YXJ0VGltZXMsICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUxMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9uZSBkYXkKICAgICAgICAgICAgJFN5c3RlbVRpbWUxMCArPSAyNCAqIDM2MDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiA1ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRzMTBbJEluZGV4XS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnQxMFN0YXJ0VGltZXNbJEluZGV4XSwKICAgICAgICAgICAgICAgICJDaGVjayBzdGFydCB0aW1lICMkSW5kZXgiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZTEwID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRzMTBbMF0tPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50cwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkRGVsZXRlMTAsCiAgICAgICAgICAgICJEZWxldGUgY3VzdG9tIG1vbnRobHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cy4iLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGN1c3RvbSB3ZWVrbHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQpCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuZmMtd2lkZ2V0LWNvbnRlbnQgdGRbZGF0YS1kYXRlPVwiJERhdGFEYXRlXCJdIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAjIGVudGVyIHNvbWUgZGF0YQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCdDdXN0b20geWVhcmx5IHdpdGhvdXQgYW55dGhpbmcgc2VsZWN0ZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgIC4gIikudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZVR5cGUnKS52YWwoJ0N1c3RvbScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBqcyBzaG93cyBJbnRlcnZhbAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VJbnRlcnZhbDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNSZWN1cnJlbmNlQ3VzdG9tVHlwZScpLnZhbCgnQ3VzdG9tWWVhcmx5JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyB3YWl0IGZvciBqcwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIGRlc2VsZWN0IHNlbGVjdGVkIG1vbnRoCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZScpLmNsaWNrKCk7IgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIGl0J3MgZGVzZWxlY3RlZAogICAgICAgIG15ICREZXNlbGVjdGVkMTEgPSAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gISQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5sZW5ndGg7JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREZXNlbGVjdGVkMTEsCiAgICAgICAgICAgICJDaGVjayBpZiBub3RoaW5nIGlzIHNlbGVjdGVkICgjMTEpLiIKICAgICAgICApOwoKICAgICAgICAjIHNldCBlYWNoIDJuZCB5ZWFyCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgInJldHVybiBcJCgnI1JlY3VycmVuY2VJbnRlcnZhbCcpLnZhbCgyKTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgMyBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAicmV0dXJuIFwkKCcjUmVjdXJyZW5jZUxpbWl0JykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJ1JlY3VycmVuY2VDb3VudCcsICduYW1lJyApLT5zZW5kX2tleXMoJzMnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50czExID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIDMgYXBwb2ludG1lbnRzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICBzY2FsYXIgQEFwcG9pbnRtZW50czExLAogICAgICAgICAgICAzLAogICAgICAgICAgICAiQ3JlYXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50KHdpdGhvdXQgYW55IG1vbnRoIHNlbGVjdGVkKS4iCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzOwogICAgICAgIG15ICRTeXN0ZW1UaW1lMTEgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgIFN0cmluZyA9PiAiJERhdGFEYXRlIDAwOjAwOjAwIiwKICAgICAgICApOwoKICAgICAgICBteSAkTGFzdFllYXIxMTsKICAgICAgICBteSAkRGF5MTE7CiAgICAgICAgbXkgJE1vbnRoMTE7CgogICAgICAgIHdoaWxlICggc2NhbGFyIEBBcHBvaW50bWVudDExU3RhcnRUaW1lcyAhPSAzICkgewogICAgICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyLCAkRGF5T2ZXZWVrICkgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkRhdGVHZXQoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGRheQogICAgICAgICAgICBpZiAoICEkTGFzdFllYXIxMSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RZZWFyMTEgPSAkWWVhcjsKICAgICAgICAgICAgICAgICREYXkxMSAgICAgID0gJERheTsKICAgICAgICAgICAgICAgICRNb250aDExICAgID0gJE1vbnRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICggJERheSA9PSAkRGF5MTEgKSAgICAjIGNoZWNrIGlmIGRheSBpcyB2YWxpZAogICAgICAgICAgICAgICAgJiYgJE1vbnRoID09ICRNb250aDExCiAgICAgICAgICAgICAgICAmJiAoICggJFllYXIgLSAkTGFzdFllYXIxMSApICUgMiA9PSAwICkgICAgIyBjaGVjayBpZiBJbnRlcnZhbCBtYXRjaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQEFwcG9pbnRtZW50MTFTdGFydFRpbWVzLCAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lMTEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBvbmUgZGF5CiAgICAgICAgICAgICRTeXN0ZW1UaW1lMTEgKz0gMjQgKiAzNjAwOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gMiApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50czExWyRJbmRleF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50MTFTdGFydFRpbWVzWyRJbmRleF0sCiAgICAgICAgICAgICAgICAiQ2hlY2sgc3RhcnQgdGltZSAjJEluZGV4IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREZWxldGUxMSA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50czExWzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBhcHBvaW50bWVudHMKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJERlbGV0ZTExLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbSB5ZWFybHkgcmVjdXJyaW5nIGFwcG9pbnRtZW50cyh3aXRob3V0IGFueSBtb250aCBzZWxlY3RlZCkuIiwKICAgICAgICApOwogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CgogICAgICAgICMgRGFzaGJvYXJkIHdpZGdldCBjb25maWcga2V5LgogICAgICAgIG15ICREYXNoYm9hcmRDb25maWdLZXkgPSAnMDUwMC1BcHBvaW50bWVudENhbGVuZGFyJzsKCiAgICAgICAgIyBUdXJuIG9uIGRhc2hib2FyZCB3aWRnZXQgYnkgZGVmYXVsdC4KICAgICAgICBteSAkRGFzaGJvYXJkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEYXNoYm9hcmRCYWNrZW5kJyktPnskRGFzaGJvYXJkQ29uZmlnS2V5fTsKICAgICAgICAkRGFzaGJvYXJkQ29uZmlnLT57RGVmYXVsdH0gPSAxOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICJEYXNoYm9hcmRCYWNrZW5kIyMjJERhc2hib2FyZENvbmZpZ0tleSIsCiAgICAgICAgICAgIFZhbHVlID0+ICREYXNoYm9hcmRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCBncm91cC4KICAgICAgICBteSAkR3JvdXBOYW1lID0gInRlc3QtY2FsZW5kYXItZ3JvdXAtJFJhbmRvbUlEIjsKICAgICAgICBteSAkR3JvdXBJRCAgID0gJEdyb3VwT2JqZWN0LT5Hcm91cEFkZCgKICAgICAgICAgICAgTmFtZSAgICA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkR3JvdXBJRCwKICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBncm91cCAtICRHcm91cElEIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIuCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFskR3JvdXBOYW1lXSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKICAgICAgICBteSAkVXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCggVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRVc2VySUQsCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgdXNlciAtICRVc2VySUQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGEgdGVzdCBjYWxlbmRhci4KICAgICAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyQ3JlYXRlKAogICAgICAgICAgICBDYWxlbmRhck5hbWUgPT4gIkNhbGVuZGFyICRSYW5kb21JRCIsCiAgICAgICAgICAgIENvbG9yICAgICAgICA9PiAnIzNBODdBRCcsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBjYWxlbmRhciAtICRDYWxlbmRhcntDYWxlbmRhcklEfSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgY3VycmVudCB0aW1lLgogICAgICAgIG15ICRTdGFydFRpbWUgICAgICA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+Q3VycmVudFN5c3RlbVRpbWUoKTsKICAgICAgICBteSAkU3RhcnRUaW1lc3RhbXAgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlRpbWVzdGFtcEdldCgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3RhcnRUaW1lLAogICAgICAgICk7CgogICAgICAgICMgSnVzdCBiZWZvcmUgbWlkbmlnaHQgdG9kYXkuCiAgICAgICAgbXkgJFRvZGF5ID0gc3Vic3RyKCAkU3RhcnRUaW1lc3RhbXAsIDAsIDEwICkgLiAnIDIzOjU5OjU5JzsKCiAgICAgICAgbXkgJFRvbW9ycm93ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArIDYwICogNjAgKiAyNCwgICAgIyArMjQgaG91cnMKICAgICAgICApOwogICAgICAgIG15ICREYXlBZnRlclRvbW9ycm93ID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN0YXJ0VGltZSArIDYwICogNjAgKiA0OCwgICAgIyArNDggaG91cnMKICAgICAgICApOwogICAgICAgIG15ICRUd29EYXlzQWZ0ZXJUb21vcnJvdyA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTdGFydFRpbWUgKyA2MCAqIDYwICogNzIsICAgICMgKzcyIGhvdXJzCiAgICAgICAgKTsKCiAgICAgICAgIyBTYW1wbGUgYXBwb2ludG1lbnRzLgogICAgICAgIG15IEBBcHBvaW50bWVudHMgPSAoCgogICAgICAgICAgICAjIFRvZGF5LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJFRvZGF5LAogICAgICAgICAgICAgICAgRW5kVGltZSAgICA9PiAkVG9kYXksCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgID0+ICJUb2RheSAkUmFuZG9tSUQiLAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRmlsdGVyICAgICA9PiAnVG9kYXknLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBUb21vcnJvdy4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgID0+ICRUb21vcnJvdywKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgPT4gJFRvbW9ycm93LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiVG9tb3Jyb3cgJFJhbmRvbUlEIiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEZpbHRlciAgICAgPT4gJ1RvbW9ycm93JywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgRGF5IGFmdGVyIHRvbW9ycm93LgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgPT4gJERheUFmdGVyVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICREYXlBZnRlclRvbW9ycm93LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICA9PiAiRGF5IGFmdGVyIHRvbW9ycm93ICRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgID0+ICdTb29uJywKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgVHdvIGRheXMgYWZ0ZXIgdG9tb3Jyb3cuCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFye0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICA9PiAkVHdvRGF5c0FmdGVyVG9tb3Jyb3csCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgID0+ICRUd29EYXlzQWZ0ZXJUb21vcnJvdywKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgPT4gIlR3byBkYXlzIGFmdGVyIHRvbW9ycm93ICRSYW5kb21JRCIsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBGaWx0ZXIgICAgID0+ICdTb29uJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSBhcHBvaW50bWVudHMuCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyRBcHBvaW50bWVudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAiQ3JlYXRlZCB0ZXN0IGFwcG9pbnRtZW50IC0gJEFwcG9pbnRtZW50SUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9ICRBcHBvaW50bWVudElEOwogICAgICAgIH0KCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IHdpZGdldCBpcyBwcmVzZW50LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0Rhc2hib2FyZCREYXNoYm9hcmRDb25maWdLZXkiLCAnY3NzJyApOwoKICAgICAgICAjIENoZWNrIGFwcG9pbnRtZW50cy4KICAgICAgICBteSAlRmlsdGVyQ291bnQ7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewoKICAgICAgICAgICAgIyBSZW1lbWJlciBmaWx0ZXIuCiAgICAgICAgICAgICRGaWx0ZXJDb3VudHsgJEFwcG9pbnRtZW50LT57RmlsdGVyfSB9ICs9IDE7CgogICAgICAgICAgICAjIFN3aXRjaCBmaWx0ZXIuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAiXCQoJy5BcHBvaW50bWVudEZpbHRlciAjRGFzaGJvYXJkJHtEYXNoYm9hcmRDb25maWdLZXl9JEFwcG9pbnRtZW50LT57RmlsdGVyfScpLnRyaWdnZXIoJ2NsaWNrJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBXYWl0IHVudGlsIGFsbCBBSkFYIGNhbGxzIGZpbmlzaGVkLgogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJC5hY3RpdmUgPT0gMCIgKTsKCiAgICAgICAgICAgICMgVmVyaWZ5IGFwcG9pbnRtZW50IGlzIHZpc2libGUuCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FwcG9pbnRtZW50SUQ9JEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH1cJyldIik7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGZpbHRlciBjb3VudC4KICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVyQ291bnQgKSB7CiAgICAgICAgICAgIG15ICRGaWx0ZXJMaW5rID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGFzaGJvYXJkJHtEYXNoYm9hcmRDb25maWdLZXl9JHtGaWx0ZXJ9IiwgJ2NzcycgKTsKCiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRGaWx0ZXJMaW5rLT5nZXRfdGV4dCgpLAogICAgICAgICAgICAgICAgIiRGaWx0ZXIgKCRGaWx0ZXJDb3VudHskRmlsdGVyfSkiLAogICAgICAgICAgICAgICAgIkZpbHRlciBjb3VudCAtICRGaWx0ZXIiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGVzdCBhcHBvaW50bWVudHMuCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAgICAgIkRlbGV0ZWQgdGVzdCBhcHBvaW50bWVudCAtICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgaWYgKCAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXIgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFye0NhbGVuZGFySUR9IF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGNhbGVuZGFyIC0gJENhbGVuZGFye0NhbGVuZGFySUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEFwcG9pbnRtZW50KSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgR2V0IFNlbGVuaXVtIG9iamVjdC4KbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKICAgICAgICBteSAkVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRUaWNrZXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgICAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICAgICAgbXkgJENhY2hlT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgU2V0IGxpbmsgb2JqZWN0IHZpZXcgbW9kZSB0byAnQ29tcGxleCcuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJywKICAgICAgICAgICAgVmFsdWUgPT4gJ0NvbXBsZXgnLAogICAgICAgICk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRHcm91cElELAogICAgICAgICAgICAiR3JvdXBJRCAkR3JvdXBJRCAtIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdXNlci4KICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAnYWRtaW4nLCAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgY2FsZW5kYXIuCiAgICAgICAgbXkgJUNhbGVuZGFyID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJNeSBDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICRDYWxlbmRhcklEID0gJENhbGVuZGFye0NhbGVuZGFySUR9OwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ2FsZW5kYXJJRCwKICAgICAgICAgICAgIkNhbGVuZGFySUQgJENhbGVuZGFySUQgLSBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkVGlja2V0VGl0bGUgID0gIlRpY2tldC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGVOdW1iZXIoKTsKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUTiAgICAgICAgICAgPT4gJFRpY2tldE51bWJlciwKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRUaWNrZXRUaXRsZSwKICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJzEyMzQ2NScsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAnY3VzdG9tZXJPbmVAZXhhbXBsZS5jb20nLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0SUQgJFRpY2tldElEIC0gY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBMb2dpbiBhcyB0ZXN0IHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldy4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICBteSAkQXBwb2ludG1lbnROYW1lID0gIkFwcG9pbnRtZW50LSRSYW5kb21JRCI7CgogICAgICAgICMgQWRkIGFwcG9pbnRtZW50cyBhbmQgbGluayB3aXRoIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0FwcG9pbnRtZW50Q3JlYXRlQnV0dG9uIiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGl0bGUiLCAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoIiRBcHBvaW50bWVudE5hbWUiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEZXNjcmlwdGlvbiIsICdjc3MnICktPnNlbmRfa2V5cygnVGVzdCByZXBlYXRpbmcgYXBwb2ludG1lbnQnKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDYWxlbmRhcklEJykudmFsKCRDYWxlbmRhcklEKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1JlY3VycmVuY2VUeXBlJykudmFsKCdEYWlseScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1JlY3VycmVuY2VMaW1pdCcpLmxlbmd0aCIgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNSZWN1cnJlbmNlTGltaXQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNSZWN1cnJlbmNlQ291bnQnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmVjdXJyZW5jZUNvdW50IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCczJyk7CgogICAgICAgIG15ICRBdXRvQ29tcGxldGVTdHJpbmcgPSAiJFRpY2tldE51bWJlciAkVGlja2V0VGl0bGUiOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiaW5wdXQuUGx1Z2luRmllbGQudWktYXV0b2NvbXBsZXRlLWlucHV0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRSYW5kb21JRCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoImxpLnVpLW1lbnUtaXRlbSIpLmxlbmd0aCA9PT0gMScgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRBdXRvQ29tcGxldGVTdHJpbmcpJykuY2xpY2soKSIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBHZXQgdGVzdCBhcHBvaW50bWVudHMuCiAgICAgICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICk7CgogICAgICAgICMgR2V0IHBhcmVudCBhbmQgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgIG15ICRQYXJlbnRBcHBvaW50bWVudDsKICAgICAgICBteSBAQ2hpbGRBcHBvaW50bWVudHM7CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRBcHBvaW50bWVudC0+e1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDaGlsZEFwcG9pbnRtZW50cywgJEFwcG9pbnRtZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmVudEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgbGFzdCBjaGlsZCBhcHBvaW50bWVudCBJRC4KICAgICAgICBteSAkTGFzdENoaWxkQXBwb2ludG1lbnRJRCA9ICRDaGlsZEFwcG9pbnRtZW50c1stMV0tPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIENoZWNrIGFwcG9pbnRtZW50IGxpbmtzIC0gYWxsIGFwcG9pbnRtZW50cyBzaG91bGQgYmUgaW4gdGhlIHRhYmxlLgogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNBcHBvaW50bWVudCB0Ym9keSBhW2hyZWYqPVwiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9IgogICAgICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIkFkZGVkIGFwcG9pbnRtZW50IC0gQXBwb2ludG1lbnRJRCAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSAtIGZvdW5kIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZWxldGUgdGhlIGxhc3QgcmVjdXJyaW5nIGFwcG9pbnRtZW50IGxpbmsuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSRMYXN0Q2hpbGRBcHBvaW50bWVudElEJyApXSIKICAgICAgICApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLlJlbW92ZUJ1dHRvbiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5QbHVnaW5Db250YWluZXI6dmlzaWJsZScpLmxlbmd0aCIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2cuTW9kYWwiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIENoZWNrIGFwcG9pbnRtZW50IGxpbmtzIC0gb25seSB0aGUgbGFzdCBhcHBvaW50bWVudCBzaG91bGQgbm90IGJlIGluIHRoZSB0YWJsZS4KICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgIG15ICRMZW5ndGggICAgICAgID0gJEFwcG9pbnRtZW50SUQgIT0gJExhc3RDaGlsZEFwcG9pbnRtZW50SUQgPyAxIDogMDsKICAgICAgICAgICAgbXkgJElzRm91bmQgICAgICAgPSAkTGVuZ3RoID8gJ2ZvdW5kJyA6ICdub3QgZm91bmQnOwoKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHkgYVtocmVmKj1cIkFjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSRBcHBvaW50bWVudElEXCJdJykubGVuZ3RoOyIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAkTGVuZ3RoLAogICAgICAgICAgICAgICAgIkFmdGVyIGRlbGV0ZSBjaGlsZCBhcHBvaW50bWVudCBsaW5rIC0gQXBwb2ludG1lbnRJRCAkQXBwb2ludG1lbnRJRCAtICRJc0ZvdW5kIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBFZGl0IHBhcmVudCBhcHBvaW50bWVudCBuYW1lIHRvIGNoZWNrIGlmIGFsbCBjaGlsZCBhcHBvaW50bWVudHMgd2lsbCBiZSByZWNyZWF0ZWQuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSIKICAgICAgICAgICAgICAgIC4gJFBhcmVudEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgIC4gIicpXSIKICAgICAgICApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RpdGxlIiwgICAgICAgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICAgICAgICAgICdjc3MnICktPnNlbmRfa2V5cygiJEFwcG9pbnRtZW50TmFtZS1FZGl0Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5jbGljaygpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZy5Nb2RhbCIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkUmVmcmVzaCgpOwoKICAgICAgICAjIENsZWFuIHRoZSBjYWNoZSBhbmQgZ2V0IHRoZSBzYW1lIHBhcmVudCBhcHBvaW50bWVudCB3aXRoIG5ldyBjaGlsZHJlbi4KICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJ0FwcG9pbnRtZW50TGlzdCcgLiAkQ2FsZW5kYXJJRCApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0Wm9vbS4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIik7CgogICAgICAgICMgV2FpdCB1bnRpbCBBcHBvaW50bWVudCB0YWJsZSBpcyBzaG93bi4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0FwcG9pbnRtZW50IHRib2R5IikubGVuZ3RoJyApOwoKICAgICAgICAjIFZlcmlmeSB0aGUgdGFibGUgZXhpc3RzIG9uIEFnZW50VGlja2V0Wm9vbS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjQXBwb2ludG1lbnQgdGJvZHknKS5sZW5ndGgiKSwKICAgICAgICAgICAgIlRhYmxlIHdpdGggYXBwb2ludG1lbnRzIG9uIEFnZW50VGlja2V0Wm9vbSAtIGZvdW5kIiwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHRoZXJlIGFyZSBubyBwcmV2aW91cyBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQENoaWxkQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0FwcG9pbnRtZW50IHRib2R5IGFbaHJlZio9XCJBY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgLiAiXCJdJykubGVuZ3RoOyIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAiQWZ0ZXIgY2hhbmdlIHBhcmVudCBhcHBvaW50bWVudCAtIE9sZCBjaGlsZCBhcHBvaW50bWVudElEICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IC0gbm90IGZvdW5kIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgbmV3IGNoaWxkIGFwcG9pbnRtZW50cyBhcmUgbGlua2VkIHRvIHRoZSB0aWNrZXQuCiAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50cykgewogICAgICAgICAgICBuZXh0IEFQUE9JTlRNRU5UIGlmICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9ID09ICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNBcHBvaW50bWVudCB0Ym9keSBhW2hyZWYqPVwiQWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9IgogICAgICAgICAgICAgICAgICAgICAgICAuICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgIC4gIlwiXScpLmxlbmd0aDsiCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgIkFmdGVyIGNoYW5nZSBwYXJlbnQgYXBwb2ludG1lbnQgLSBOZXcgY2hpbGQgYXBwb2ludG1lbnQgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gLSBmb3VuZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IHRpY2tldC4KICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0SUQgJFRpY2tldElEIC0gZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgcGFyZW50IHdpdGggYWxsIGNoaWxkIGFwcG9pbnRtZW50cy4KICAgICAgICAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmVudEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlBhcmVudCBBcHBvaW50bWVudElEICRQYXJlbnRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9IGFuZCBhbGwgaXRzIGNoaWxkcmVuIC0gZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBjYWxlbmRhci4KICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGNhbGVuZGFyIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENhbGVuZGFySUQgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkNhbGVuZGFySUQgJENhbGVuZGFySUQgLSBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBncm91cC11c2VyIHJlbGF0aW9uLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gZ3JvdXBfdXNlciBXSEVSRSBncm91cF9pZCA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRHcm91cElEIF0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJHcm91cC11c2VyIHJlbGF0aW9uIGZvciBncm91cCBJRCAkR3JvdXBJRCAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3QgZ3JvdXAuCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBncm91cHMgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkR3JvdXBJRCBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiR3JvdXBJRCAkR3JvdXBJRCAtIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgTWFrZSBzdXJlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCk7CgogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRHcm91cE9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgIG15ICRDYWxlbmRhck9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgICAgIG15ICRDYWxlbmRhckhlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6SGVscGVyJyk7CiAgICAgICAgbXkgJFVzZXJPYmplY3QgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgbXkgJFJhbmRvbUlEID0gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBncm91cAogICAgICAgIG15ICRHcm91cE5hbWUgPSAidGVzdC1jYWxlbmRhci1ncm91cC0kUmFuZG9tSUQiOwogICAgICAgIG15ICRHcm91cElEICAgPSAkR3JvdXBPYmplY3QtPkdyb3VwQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gdGltZQogICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5DdXJyZW50U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGFkZCAxIG1vbnRoCiAgICAgICAgJFN5c3RlbVRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPkFkZFBlcmlvZCgKICAgICAgICAgICAgVGltZSAgID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICBNb250aHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkYXRlIGluZm8gKFNlY29uZCwgTWludXRlLCBIb3VyLCBEYXksIE1vbnRoLCBZZWFyLCBEYXlPZldlZWspCiAgICAgICAgbXkgQERhdGVJbmZvID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5EYXRlR2V0KAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICk7CgogICAgICAgICMgY2hhbmdlIHJlc29sdXRpb24gKGRlc2t0b3AgbW9kZSkKICAgICAgICAkU2VsZW5pdW0tPnNldF93aW5kb3dfc2l6ZSggNzY4LCAxMDUwICk7CgogICAgICAgICMgY3JlYXRlIHRlc3QgdXNlcgogICAgICAgIG15ICRMYW5ndWFnZSAgICAgID0gJ2VuJzsKICAgICAgICBteSAkVGVzdFVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RVc2VyQ3JlYXRlKAogICAgICAgICAgICBHcm91cHMgICA9PiBbICd1c2VycycsICRHcm91cE5hbWUgXSwKICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExhbmd1YWdlLAogICAgICAgICkgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IHVzZXIiOwoKICAgICAgICAjIGdldCBVc2VySUQKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIHN0YXJ0IHRlc3QKICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBmZXcgdGVzdCBjYWxlbmRhcnMKICAgICAgICBteSAlQ2FsZW5kYXIxID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgICAgICAgICAgQ2FsZW5kYXJOYW1lID0+ICJNeSBDYWxlbmRhciAkUmFuZG9tSUQiLAogICAgICAgICAgICBDb2xvciAgICAgICAgPT4gJyMzQTg3QUQnLAogICAgICAgICAgICBHcm91cElEICAgICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICBWYWxpZElEICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdvIHRvIGNhbGVuZGFyIG92ZXJ2aWV3IHBhZ2UKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyIpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgbW9udGggdmlldwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLW1vbnRoLWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gbmV4dCBtb250aAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLW5leHQtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBnZXQgZGF0ZSBpbmZvIChTZWNvbmQsIE1pbnV0ZSwgSG91ciwgRGF5LCBNb250aCwgWWVhciwgRGF5T2ZXZWVrKQogICAgICAgIG15ICREYXRhRGF0ZSA9ICIkRGF0ZUluZm9bNV0tIjsKICAgICAgICBpZiAoICREYXRlSW5mb1s0XSA8IDEwICkgewogICAgICAgICAgICAkRGF0YURhdGUgLj0gIjAiOwogICAgICAgIH0KICAgICAgICAkRGF0YURhdGUgLj0gIiREYXRlSW5mb1s0XS0wMSI7CgogICAgICAgICMKICAgICAgICAjIFByZS1EZWZpbmVkIFRlbXBsYXRlcwogICAgICAgICMKCiAgICAgICAgIyBkZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIHByZS1kZWZpbmVkIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMKICAgICAgICBteSBAVGVtcGxhdGVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgbm8gYWN0aXZlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnTm8gbm90aWZpY2F0aW9uJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIHN0YXJ0IChhcHBvaW50bWVudCBzdGFydCB0aW1lKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnQXBwb2ludG1lbnQgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+ICdTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgNSBtaW51dGVzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnNSBtaW51dGVzIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDMwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZSAxNSBtaW51dGVzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMTUgbWludXRlcyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDkwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA5MDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDkwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMzAgbWludXRlcyBiZWZvcmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzMwIG1pbnV0ZXMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiAxODAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDE4MDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE4MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgaG91ciBiZWZvcmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzEgaG91ciBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDM2MDAsCiAgICAgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMiBob3VycyBiZWZvcmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzIgaG91cnMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA3MjAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDcyMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDcyMDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEyIGhvdXJzIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMTIgaG91cnMgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA0MzIwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA0MzIwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNDMyMDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIDEgZGF5IGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMSBkYXkgYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSA9PiA4NjQwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiA4NjQwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gODY0MDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlIDIgZGF5cyBiZWZvcmUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgPT4gJzIgZGF5cyBiZWZvcmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlID0+IDE3MjgwMCwKICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICA9PiAxNzI4MDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+IDE3MjgwMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBub3RpZmljYXRpb24gdGVtcGxhdGUgMSB3ZWVrIGJlZm9yZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICA9PiAnMSB3ZWVrIGJlZm9yZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgPT4gNjA0ODAwLAogICAgICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgID0+IDYwNDgwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gNjA0ODAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gcHJlLWRlZmluZWQgdGVtcGxhdGUgdGVzdCBleGVjdXRpb24KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUNyZWF0ZVRlc3RzKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhcHBvaW50bWVudAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi5mYy13aWRnZXQtY29udGVudCB0ZFtkYXRhLWRhdGU9XCIkRGF0YURhdGVcIl0iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICAgICAjIHdhaXQgdW50aWwgZm9ybSBhbmQgb3ZlcmxheSBoYXMgbG9hZGVkLCBpZiBuZWNjZXNzYXJ5CiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnVGl0bGUnLCAnbmFtZScgKS0+c2VuZF9rZXlzKCIkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259Iik7CiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjQ2FsZW5kYXJJRCcpLnZhbCgiCiAgICAgICAgICAgICAgICAgICAgLiAkQ2FsZW5kYXIxe0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAgICAgLiAiKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKCiAgICAgICAgICAgICAgICBteSAkU3RhcnRBcHBvaW50bWVudCAgICAgICA9ICIkRGF0YURhdGUgMDA6MDA6MDAiOwogICAgICAgICAgICAgICAgbXkgJFN0YXJ0QXBwb2ludG1lbnRTeXN0ZW0gPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTdGFydEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTm90aWZpY2F0aW9uRGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkU3RhcnRBcHBvaW50bWVudFN5c3RlbSAtICRUZXN0LT57RGF0YX0tPntPZmZzZXR9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgIlZlcmlmeSBub3RpZmljYXRpb24gZGF0ZSAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdmVyaWZ5IHJlc3VsdHMKICAgICAgICAgICAgZm9yIG15ICRSZXN1bHRLZXkgKCBzb3J0IGtleXMgJXsgJFRlc3QtPntSZXN1bHR9IH0gKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudExpc3RbMF0tPnskUmVzdWx0S2V5fSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAkVGVzdC0+e1Jlc3VsdH0tPnskUmVzdWx0S2V5fSwKICAgICAgICAgICAgICAgICAgICAnTm90aWZpY2F0aW9uIGFwcG9pbnRtZW50IHJlc3VsdDogJyAuICRSZXN1bHRLZXkgLiAnIC0gJyAuICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGVsZXRlID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50TGlzdFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIwogICAgICAgICMgQ3VzdG9tIFJlbGF0aXZlIFRlbXBsYXRlcwogICAgICAgICMKCiAgICAgICAgIyBkZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIGN1c3RvbSBub3RpZmljYXRpb24gdGVtcGxhdGVzCiAgICAgICAgbXkgQFRlbXBsYXRlQ3VzdG9tUmVsYXRpdmVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAtMiBtaW51dGVzIGJlZm9yZSBzdGFydAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gcmVsYXRpdmUgLTIgbWludXRlcyBiZWZvcmUgc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IC0yLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAyIG1pbnV0ZXMgYmVmb3JlIHN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDIsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgc3RhcnQKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIHJlbGF0aXZlIDAgbWludXRlcyBhZnRlciBzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBjdXN0b20gcmVsYXRpdmUgbm90aWZpY2F0aW9uIDAgbWludXRlcyBiZWZvcmUgZW5kCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYmVmb3JlIGVuZCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIHJlbGF0aXZlIG5vdGlmaWNhdGlvbiAwIG1pbnV0ZXMgYWZ0ZXIgZW5kCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSByZWxhdGl2ZSAwIG1pbnV0ZXMgYWZ0ZXIgZW5kJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyZW5kJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gcmVsYXRpdmUgdGVtcGxhdGUgdGVzdCBleGVjdXRpb24KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUN1c3RvbVJlbGF0aXZlQ3JlYXRlVGVzdHMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWN0aXZhdGUgdGhlIHJlbGF0aXZlIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgZmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IGNvdW50IGZpZWxkCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0nKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbGwgb3V0IHRoZSBjdXN0b20gdW5pdCBmaWVsZAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcpLnZhbCgnJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZmlsbCBvdXQgdGhlIGN1c3RvbSB1bml0IHBvaW50IG9mIHRpbWUgZmllbGQKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJykudmFsKCckVGVzdC0+e0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2xpY2sgb24gU2F2ZQogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNFZGl0Rm9ybVN1Ym1pdCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgIHNjYWxhciBAQXBwb2ludG1lbnRMaXN0LAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJBcHBvaW50bWVudCBsaXN0IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBuZWVkZWQgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fTsKCiAgICAgICAgICAgICMgdGhlIGJhY2tlbmQgdHJlYXRzIG5lZ2F0aXZlIHZhbHVlcyBhcyAwCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRDb3VudCA8IDAgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tVW5pdENvdW50ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXQgICAgICA9ICRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdFBvaW50ID0gJFRlc3QtPntEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWU7CgogICAgICAgICAgICAjIGNvbXB1dGUgZnJvbSBzdGFydCB0aW1lCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewoKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWUgPSAkQ2FsZW5kYXJIZWxwZXJPYmplY3QtPlN5c3RlbVRpbWVHZXQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudExpc3RbMF0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb21wdXRlIGZyb20gZW5kIHRpbWUKICAgICAgICAgICAgZWxzaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyZW5kJyApIHsKCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5TeXN0ZW1UaW1lR2V0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkRhdGUgPSAnJzsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgKSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSA9ICRDYWxlbmRhckhlbHBlck9iamVjdC0+VGltZXN0YW1wR2V0KAogICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gKCAkTm90aWZpY2F0aW9uTG9jYWxUaW1lIC0gJE9mZnNldCApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25EYXRlID0gJENhbGVuZGFySGVscGVyT2JqZWN0LT5UaW1lc3RhbXBHZXQoCiAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAoICROb3RpZmljYXRpb25Mb2NhbFRpbWUgKyAkT2Zmc2V0ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uRGF0ZSwKICAgICAgICAgICAgICAgICJWZXJpZnkgbm90aWZpY2F0aW9uIGRhdGUgLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkRGVsZXRlID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50TGlzdFswXS0+e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkRGVsZXRlLAogICAgICAgICAgICAgICAgIkRlbGV0ZSBhcHBvaW50bWVudCB2ZXJpZmljYXRpb24gLSAkVGVzdC0+e0RhdGF9LT57RGVzY3JpcHRpb259IC4iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIwogICAgICAgICMgQ3VzdG9tIERhdGVUaW1lIFRlbXBsYXRlcwogICAgICAgICMKCiAgICAgICAgIyBkZWZpbmUgYXBwb2ludG1lbnQgdGVzdCB3aXRoIGN1c3RvbSBub3RpZmljYXRpb24gdGVtcGxhdGVzCiAgICAgICAgbXkgQFRlbXBsYXRlQ3VzdG9tRGF0ZVRpbWVDcmVhdGVUZXN0cyA9ICgKCiAgICAgICAgICAgICMgY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDE2LTA5LTAxIDEwOjEwOjAwCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBkYXRldGltZSAyMDE2LTA5LTAxIDEwOjEwOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZURheSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgID0+ICc5JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVllYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUhvdXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxMCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDktMDEgMTA6MTA6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxNi0wOS0wMSAxMDoxMDowMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAjIGN1c3RvbSBkYXRldGltZSBub3RpZmljYXRpb24gMjAxNi0xMC0xOCAwMDowMzowMAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20gZGF0ZXRpbWUgMjAxNi0xMC0xOCAwMTowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0ICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTgnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzEwJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVllYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUhvdXIgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICczJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgUmVzdWx0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTEwLTE4IDAxOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ2RhdGV0aW1lJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMTAtMTggMDE6MDM6MDAnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgIyBjdXN0b20gZGF0ZXRpbWUgbm90aWZpY2F0aW9uIDIwMTctMTAtMTggMDA6MDM6MDAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tIGRhdGV0aW1lIDIwMTctMTAtMTggMDM6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dCAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lRGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzE4JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZU1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxMCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVZZWFyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVIb3VyICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNy0xMC0xOCAwMzowMzowMCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdkYXRldGltZScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE3LTEwLTE4IDAzOjAzOjAwJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICMgY3VzdG9tIGRhdGV0aW1lIG5vdGlmaWNhdGlvbiAyMDEyLTEwLTE4IDAwOjAzOjAwCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbSBkYXRldGltZSAyMDEyLTEwLTE4IDAyOjAzOjAwJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0ICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBEYXRlVGltZURheSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcxOCcsCiAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVNb250aCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMTAnLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lWWVhciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTInLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lSG91ciAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzInLAogICAgICAgICAgICAgICAgICAgIERhdGVUaW1lTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzMnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gewogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTItMTAtMTggMDI6MDM6MDAnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAnZGF0ZXRpbWUnLAogICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAnMjAxMi0xMC0xOCAwMjowMzowMCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBub3RpZmljYXRpb24gZGF0ZXRpbWUgdGVtcGxhdGUgdGVzdCBleGVjdXRpb24KICAgICAgICBmb3IgbXkgJFRlc3QgKEBUZW1wbGF0ZUN1c3RvbURhdGVUaW1lQ3JlYXRlVGVzdHMpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiLmZjLXdpZGdldC1jb250ZW50IHRkW2RhdGEtZGF0ZT1cIiREYXRhRGF0ZVwiXSIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI1RpdGxlJykubGVuZ3RoIiApOwoKICAgICAgICAgICAgIyBlbnRlciBzb21lIGRhdGEKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoIiRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0iKTsKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgICAgICAuICRDYWxlbmRhcjF7Q2FsZW5kYXJJRH0KICAgICAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTm90aWZpY2F0aW9uVGVtcGxhdGUnKS52YWwoJyRUZXN0LT57RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWN0aXZhdGUgdGhlIHJlbGF0aXZlIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgICAgICMgc2VsZWN0IGRheQogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5JykudmFsKCckVGVzdC0+e0RhdGF9LT57RGF0ZVRpbWVEYXl9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbGVjdCBtb250aAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZU1vbnRofScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZWxlY3QgeWVhcgogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lWWVhcn0nKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VsZWN0IGhvdXIKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXInKS52YWwoJyRUZXN0LT57RGF0YX0tPntEYXRlVGltZUhvdXJ9JykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbGVjdCBtaW51dGUKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZScpLnZhbCgnJFRlc3QtPntEYXRhfS0+e0RhdGVUaW1lTWludXRlfScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0VkaXRGb3JtU3VibWl0JywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAgICAgIyB3YWl0IGZvciBkaWFsb2cgdG8gY2xvc2UgYW5kIEFKQVggdG8gZmluaXNoCiAgICAgICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkRpYWxvZzp2aXNpYmxlIikubGVuZ3RoICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyMXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgc2NhbGFyIEBBcHBvaW50bWVudExpc3QsCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIkFwcG9pbnRtZW50IGxpc3QgdmVyaWZpY2F0aW9uIC0gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSAuIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB2ZXJpZnkgcmVzdWx0cwogICAgICAgICAgICBmb3IgbXkgJFJlc3VsdEtleSAoIHNvcnQga2V5cyAleyAkVGVzdC0+e1Jlc3VsdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50TGlzdFswXS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICRUZXN0LT57UmVzdWx0fS0+eyRSZXN1bHRLZXl9LAogICAgICAgICAgICAgICAgICAgICdOb3RpZmljYXRpb24gYXBwb2ludG1lbnQgcmVzdWx0OiAnIC4gJFJlc3VsdEtleSAuICcgLSAnIC4gJFRlc3QtPntEYXRhfS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZGVsZXRlIGFwcG9pbnRtZW50CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRMaXN0WzBdLT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICREZWxldGUsCiAgICAgICAgICAgICAgICAiRGVsZXRlIGFwcG9pbnRtZW50IHZlcmlmaWNhdGlvbiAtICRUZXN0LT57RGF0YX0tPntEZXNjcmlwdGlvbn0gLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfSwKKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICAgICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICMgdHVybiBvbiB1c2VyIHRpbWUgem9uZXMKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGltZVpvbmVVc2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGdyb3VwCiAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICJ0ZXN0LWNhbGVuZGFyLWdyb3VwLSRSYW5kb21JRCI7CiAgICAgICAgbXkgJEdyb3VwSUQgICA9ICRHcm91cE9iamVjdC0+R3JvdXBBZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2NyaXB0IGFsaWFzCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIGNoYW5nZSByZXNvbHV0aW9uIChkZXNrdG9wIG1vZGUpCiAgICAgICAgJFNlbGVuaXVtLT5zZXRfd2luZG93X3NpemUoIDc2OCwgMTA1MCApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIKICAgICAgICBteSAkTGFuZ3VhZ2UgICAgICA9ICdlbic7CiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzICAgPT4gWyAndXNlcnMnLCAkR3JvdXBOYW1lIF0sCiAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYW5ndWFnZSwKICAgICAgICApIHx8IGRpZSAnRGlkIG5vdCBnZXQgdGVzdCB1c2VyJzsKCiAgICAgICAgIyBnZXQgVXNlcklECiAgICAgICAgbXkgJFVzZXJJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdGFydCB0ZXN0CiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgdGVzdCBjYWxlbmRhcgogICAgICAgIG15ICVDYWxlbmRhciA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSA9PiAiQ2FsZW5kYXItJFJhbmRvbUlEIiwKICAgICAgICAgICAgQ29sb3IgICAgICAgID0+ICcjM0E4N0FEJywKICAgICAgICAgICAgR3JvdXBJRCAgICAgID0+ICRHcm91cElELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWRJRCAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBjYWxlbmRhciBvdmVydmlldyBwYWdlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXciKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgZ28gdG8gcHJldmlvdXMgd2VlawogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLmZjLXRvb2xiYXIgLmZjLXByZXYtYnV0dG9uJywgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIHdhaXQgZm9yIEFKQVggdG8gZmluaXNoCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQ2FsZW5kYXJXaWRnZXQuTG9hZGluZyIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjbGljayBvbiB0aGUgdGltZWxpbmUgdmlldyBmb3IgYW4gYXBwb2ludG1lbnQgZGlhbG9nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcuZmMtdGltZWxpbmVXZWVrLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50Om50aC1jaGlsZCg1KScsICdjc3MnICkKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCB1bnRpbCBmb3JtIGFuZCBvdmVybGF5IGhhcyBsb2FkZWQsIGlmIG5lY2Nlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjVGl0bGUnKS5sZW5ndGgiICk7CgogICAgICAgICMgZW50ZXIgc29tZSBkYXRhCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdUaXRsZScsICduYW1lJyApLT5zZW5kX2tleXMoJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcpOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJyNDYWxlbmRhcklEJykudmFsKCIKICAgICAgICAgICAgICAgIC4gJENhbGVuZGFye0NhbGVuZGFySUR9CiAgICAgICAgICAgICAgICAuICIpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdFbmRIb3VyJywgJ25hbWUnICktPnNlbmRfa2V5cygnMTgnKTsKCiAgICAgICAgIyBjbGljayBvbiBTYXZlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRWRpdEZvcm1TdWJtaXQnLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgd2FpdCBmb3IgZGlhbG9nIHRvIGNsb3NlIGFuZCBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5EaWFsb2c6dmlzaWJsZSIpLmxlbmd0aCAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJy5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUnKS50ZXh0KCk7IgogICAgICAgICAgICApLAogICAgICAgICAgICAnVGltZSBab25lIEFwcG9pbnRtZW50JywKICAgICAgICAgICAgJ0FwcG9pbnRtZW50IHZpc2libGUgKENhbGVuZGFyIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZQogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyB2ZXJpZnkgYXBwb2ludG1lbnQgaXMgdmlzaWJsZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJ1RpbWUgWm9uZSBBcHBvaW50bWVudCcgKSA+IC0xLAogICAgICAgICAgICAnQXBwb2ludG1lbnQgdmlzaWJsZSAoQWdlbmRhIE92ZXJ2aWV3KScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXBwb2ludG1lbnQgaWQKICAgICAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJyZXR1cm4gXCQoJy5NYXN0ZXJBY3Rpb25MaW5rJykuZGF0YSgnYXBwb2ludG1lbnRJZCcpOyIKICAgICAgICApOwoKICAgICAgICAjIGdldCBkaXNwbGF5ZWQgc3RhcnQgZGF0ZQogICAgICAgIG15ICRTdGFydERhdGUKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZQogICAgICAgICRTdGFydERhdGUgPX4gLyhcZHsyfTpcZHsyfTpcZHsyfSkkLzsKICAgICAgICBteSAkU3RhcnRUaW1lID0gJDE7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU3RhcnRUaW1lLAogICAgICAgICAgICAnMDg6MDA6MDAnLAogICAgICAgICAgICAnU3RhcnQgdGltZSBpbiBsb2NhbCB0aW1lJywKICAgICAgICApOwoKICAgICAgICAjIHR1cm4gb24gdXNlciB0aW1lIHpvbmVzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlcicsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB0dXJuIG9mZiBicm93c2VyIGF1dG8gb2Zmc2V0CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpbWVab25lVXNlckJyb3dzZXJBdXRvT2Zmc2V0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIHNldCB1c2VyJ3MgdGltZSB6b25lCiAgICAgICAgJFVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICA9PiAnKzInLCAgICAgICAgICAgICAjIEV1cm9wZS9CZXJsaW4KICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgKSB8fCBkaWUgJ0RpZCBub3Qgc2V0IHByZWZlcmVuY2UgVXNlclRpbWVab25lJzsKCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICcrMicsCiAgICAgICAgICAgICdQcmVmZXJlbmNlIFVzZXJUaW1lWm9uZSBjb3JyZWN0JywKICAgICAgICApOwoKICAgICAgICAjIG1ha2Ugc3VyZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoQ2FsZW5kYXIgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KCiAgICAgICAgIyBsb2cgaW4gYWdhaW4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnbyB0byBhZ2VuZGEgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldztGaWx0ZXI9V2VlaztKdW1wPVByZXYiKTsKCiAgICAgICAgc2xlZXAgMTsKCiAgICAgICAgIyBnZXQgZGlzcGxheWVkIHN0YXJ0IGRhdGUKICAgICAgICBteSAkU3RhcnREYXRlVFoKICAgICAgICAgICAgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIi8vKltcQGlkPSdBcHBvaW50bWVudElEXyRBcHBvaW50bWVudElEJ10vdGRbNF0iLCAneHBhdGgnICktPmdldF90ZXh0KCk7CgogICAgICAgICMgY2hlY2sgc3RhcnQgdGltZSBhZ2FpbgogICAgICAgICRTdGFydERhdGVUWiA9fiAvKFxkezJ9OlxkezJ9OlxkezJ9XHNcKFwrMlwpKSQvOwogICAgICAgIG15ICRTdGFydFRpbWVUWiA9ICQxOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFN0YXJ0VGltZVRaLAogICAgICAgICAgICAnMTA6MDA6MDAgKCsyKScsCiAgICAgICAgICAgICJTdGFydCB0aW1lIGluIHVzZXIncyB0aW1lIHpvbmUiLAogICAgICAgICk7CgogICAgICAgICMgZ28gdG8gY2FsZW5kYXIgb3ZlcnZpZXcgcGFnZSBhZ2FpbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3Iik7CgogICAgICAgICMgd2FpdCBmb3IgQUpBWCB0byBmaW5pc2gKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5DYWxlbmRhcldpZGdldC5Mb2FkaW5nIikubGVuZ3RoJyApOwoKICAgICAgICAjIGdvIHRvIHByZXZpb3VzIHdlZWsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10b29sYmFyIC5mYy1wcmV2LWJ1dHRvbicsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IGZvciBBSkFYIHRvIGZpbmlzaAogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkNhbGVuZGFyV2lkZ2V0LkxvYWRpbmciKS5sZW5ndGgnICk7CgogICAgICAgICMgY2xpY2sgb24gYW4gYXBwb2ludG1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5mYy10aW1lbGluZS1ldmVudCcsICdjc3MnICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIGZvcm0gYW5kIG92ZXJsYXkgaGFzIGxvYWRlZCwgaWYgbmVjY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNUaXRsZScpLmxlbmd0aCIgKTsKCiAgICAgICAgIyBjaGVjayBzdGFydCBob3VyCiAgICAgICAgbXkgJFN0YXJ0SG91clRaID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICdTdGFydEhvdXInLCAnbmFtZScgKS0+Z2V0X3ZhbHVlKCk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU3RhcnRIb3VyVFosCiAgICAgICAgICAgIDEwLAogICAgICAgICAgICAiU3RhcnQgaG91ciBpbiB1c2VyJ3MgdGltZSB6b25lIiwKICAgICAgICApOwoKICAgICAgICAjIGNsZWFudXAKCiAgICAgICAgIyBkZWxldGUgdGVzdCBhcHBvaW50bWVudAogICAgICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCB0ZXN0IGFwcG9pbnRtZW50IC0gJEFwcG9pbnRtZW50SUQiLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3QgY2FsZW5kYXIKICAgICAgICBpZiAoICRDYWxlbmRhcntDYWxlbmRhcklEfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhciBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0gXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIHRlc3QgY2FsZW5kYXIgLSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0iLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgY2FjaGUgaXMgY29ycmVjdAogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KENhbGVuZGFyIEFwcG9pbnRtZW50KSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CiAgICB9LAopOwoKMTsK
QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vTW96aWxsYS5vcmcvTk9OU0dNTCBNb3ppbGxhIENhbGVuZGFyIFYxLjEvL0VODQpWRVJTSU9OOjIuMA0KQkVHSU46VlRJTUVaT05FDQpUWklEOkV1cm9wZS9CZXJsaW4NCkJFR0lOOkRBWUxJR0hUDQpUWk9GRlNFVEZST006KzAxMDANClRaT0ZGU0VUVE86KzAyMDANClRaTkFNRTpDRVNUDQpEVFNUQVJUOjE5NzAwMzI5VDAyMDAwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9LTFTVTtCWU1PTlRIPTMNCkVORDpEQVlMSUdIVA0KQkVHSU46U1RBTkRBUkQNClRaT0ZGU0VURlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KVFpOQU1FOkNFVA0KRFRTVEFSVDoxOTcwMTAyNVQwMzAwMDANClJSVUxFOkZSRVE9WUVBUkxZO0JZREFZPS0xU1U7QllNT05USD0xMA0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYwODExWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjA4MzBaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MDgzMFoNClVJRDozMzM5NjA5Ni01Y2FmLWUyNGYtYWM1NC01MmZkMGJlMmJlOWUNClNVTU1BUlk6QWxsIGRheQ0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDA1DQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDA2DQpUUkFOU1A6VFJBTlNQQVJFTlQNCkRFU0NSSVBUSU9OOnRlc3QgYWxsIGRheSBldmVudA0KWC1PVFJTLVRFQU06VGVzdCBUZWFtDQpYLU9UUlMtUkVTT1VSQ0U6cm9vdEBsb2NhbGhvc3QNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQwODA2MjhaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEyVDA4MDc0NFoNCkRUU1RBTVA6MjAxNjA0MTJUMDgwNzQ0Wg0KVUlEOjAwNzJhMjE2LTIyOWUtMGM0MC1hODRmLTczOTNlMWJiNjg5Nw0KU1VNTUFSWTpPbmNlIHBlciB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDYwOVQwOTMwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMTMwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDQxMlQxMjAwMDANClRSQU5TUDpPUEFRVUUNCkxPQ0FUSU9OOkJlbGdyYWRlDQpERVNDUklQVElPTjpPbmx5IG9uY2UgcGVyIHdlZWsNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDA5MzcwNVoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMDkzNzU5Wg0KRFRTVEFNUDoyMDE2MDQxMlQwOTM3NTlaDQpVSUQ6Mjg5ZTA4M2YtZDQwZi04NDQ3LWFlODUtNmVhMDhjMDhkYjhmDQpTVU1NQVJZOk1vbnRobHkgbWVldGluZw0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMzAyVDEyMTUwMFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEzMTUwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE0MDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046R2VybWFueQ0KREVTQ1JJUFRJT046T25jZSBwZXIgbW9udGgNClNFUVVFTkNFOjENClgtTU9aLUdFTkVSQVRJT046MQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDEyVDEzMDMwNFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTJUMTMwMzU2Wg0KRFRTVEFNUDoyMDE2MDQxMlQxMzAzNTZaDQpVSUQ6ZmU2ODlhZGYtNjZmNi1lNDQ3LWE4MDctNzhlYTg5ZTc5ZGJhDQpTVU1NQVJZOkVuZCBvZiB0aGUgbW9udGgNClJSVUxFOkZSRVE9TU9OVEhMWTtVTlRJTD0yMDE3MDMxMlQwNzAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDMzMVQwOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxM1QxMzA1MzBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDEzVDEzMDkyNloNCkRUU1RBTVA6MjAxNjA0MTNUMTMwOTI2Wg0KVUlEOmNmZTU3ZDY4LTEyNjMtOTE0Ny1hMDRhLTY4MGNhOTJlMWYzNQ0KU1VNTUFSWTpFYWNoIDIgbW9udGhzDQpSUlVMRTpGUkVRPU1PTlRITFk7VU5USUw9MjAxNzAyMDJUMDkwMDAwWjtJTlRFUlZBTD0yO0JZTU9OVEhEQVk9MzENCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046VGVzdA0KREVTQ1JJUFRJT046dGVzdA0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTJUMDcxNTA2Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNFQwNzE1MzRaDQpEVFNUQU1QOjIwMTYwNDE0VDA3MTUzNFoNClVJRDoxZmFjOGVkYi1jYjRkLTc4NGEtOGQzNC0xYTc0M2MxMDc0MWENClNVTU1BUlk6TXkgZXZlbnQNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA2MDFUMDcwMDAwWjtJTlRFUlZBTD0yDQpDQVRFR09SSUVTOkNsaWVudHMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KTE9DQVRJT046U3RhcmEgUGF6b3ZhDQpERVNDUklQVElPTjpUZXN0IGRlc2NyaXB0aW9uDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNFQwNzE2MTBaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE0VDA3MTkyMloNCkRUU1RBTVA6MjAxNjA0MTRUMDcxOTIyWg0KVUlEOjM3MDhlNzRmLWI5MDEtYzY0My1hOWQwLWExNzgzOGFmZDQ4OQ0KU1VNTUFSWTpFYWNoIDIgeWVhcnMNClJSVUxFOkZSRVE9WUVBUkxZO1VOVElMPTIwMjAwNjAyVDA4MDAwMFo7SU5URVJWQUw9MjtCWU1PTlRIREFZPTE7QllNT05USD00DQoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDEwMDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDAxVDExMDAwMA0KVFJBTlNQOk9QQVFVRQ0KU0VRVUVOQ0U6MQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMDYzMjIwWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQwNjMzMDhaDQpEVFNUQU1QOjIwMTYwNDE1VDA2MzMwOFoNClVJRDo0OGY0ZjA5NC02Y2IzLWM5NDEtYjI2YS00MzRkNTIxMTU0N2YNClNVTU1BUlk6RWFjaCAzdGhkIGFsbCBkYXkNClJSVUxFOkZSRVE9REFJTFk7VU5USUw9MjAxNjA0MzA7SU5URVJWQUw9Mw0KRFRTVEFSVDtWQUxVRT1EQVRFOjIwMTYwNDAyDQpEVEVORDtWQUxVRT1EQVRFOjIwMTYwNDAzDQpUUkFOU1A6VFJBTlNQQVJFTlQNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxNVQxMzM5MDdaDQpMQVNULU1PRElGSUVEOjIwMTYwNDE1VDEzMzk1OVoNCkRUU1RBTVA6MjAxNjA0MTVUMTMzOTU5Wg0KVUlEOjFlN2IxZTY4LWIxMjgtNDE0Mi1iNDRhLTllZGY5ODcyZmJmOA0KU1VNTUFSWTpGaXJzdCAzIGRheXMNClJSVUxFOkZSRVE9REFJTFk7Q09VTlQ9Mw0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTYwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAzMDdUMTcwMDAwDQpUUkFOU1A6T1BBUVVFDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA0MTVUMTUxNTMzWg0KTEFTVC1NT0RJRklFRDoyMDE2MDQxNVQxNTE2MjJaDQpEVFNUQU1QOjIwMTYwNDE1VDE1MTYyMloNClVJRDo3YTc5NzRlMy1hYzEyLTFhNDEtYTM4My05YmE5MTFlY2Y1MTUNClNVTU1BUlk6T25jZSBwZXIgbmV4dCAyIG1vbnRoDQpSUlVMRTpGUkVRPU1PTlRITFk7Q09VTlQ9MjtCWU1PTlRIREFZPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE4MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMzAyVDE5MDAwMA0KVFJBTlNQOk9QQVFVRQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNDE1VDE1MTcxMFoNCkxBU1QtTU9ESUZJRUQ6MjAxNjA0MTVUMTUxODA5Wg0KRFRTVEFNUDoyMDE2MDQxNVQxNTE4MDlaDQpVSUQ6OTE1ZmQ2YmItNjhkYS02NjQ4LTkyZmMtZDBiZDRlMmE0NDk2DQpTVU1NQVJZOkphbnVhcnkgM3RoIG5leHQgMyB5ZWFycw0KUlJVTEU6RlJFUT1ZRUFSTFk7Q09VTlQ9MztCWU1PTlRIREFZPTM7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxODAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwM1QxOTAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQyOFQxNDAwMzVaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA0VDE0MzgzMloNCkRUU1RBTVA6MjAxNjA1MDRUMTQzODMyWg0KVUlEOkIwQzdBQzMyLUU5NjMtNDRCNy04QjdFLTc4MjM4MjE2QTcyNg0KUkRBVEU7VkFMVUU9REFURS1USU1FOjIwMTYwNTAyVDE0MDAwMFoNCkVYREFURToyMDE2MDUwMlQxNDAwMDBaDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDUwMlQxNjAwMDANClgtTU9aLUZBS0VELU1BU1RFUjoxDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDQxMlQxMzM5NDRaDQpMQVNULU1PRElGSUVEOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBTVA6MjAxNjA1MDlUMTQyNDI4Wg0KVUlEOmU1ZDA1YzNmLWUwODAtYTY0Zi1iZWQ4LTVjOTZhYjkyNDhkNA0KU1VNTUFSWTpFYWNoIDJuZCB3ZWVrDQpSUlVMRTpGUkVRPVdFRUtMWTtJTlRFUlZBTD0yO0JZREFZPVRVDQpYLU1PWi1MQVNUQUNLOjIwMTYwNTA5VDE0MjQyOFoNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwNDEyVDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046RGV2ZWxvcGVyIG1lZXRpbmcgZWFjaCAybmQgVHVlc2RheQ0KWC1NT1otR0VORVJBVElPTjo4DQpCRUdJTjpWQUxBUk0NCkFDVElPTjpESVNQTEFZDQpUUklHR0VSO1ZBTFVFPURVUkFUSU9OOi1QMUQNCkRFU0NSSVBUSU9OOkRlZmF1bHQgTW96aWxsYSBEZXNjcmlwdGlvbg0KRU5EOlZBTEFSTQ0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTExVDA2Mjk0NloNCkxBU1QtTU9ESUZJRUQ6MjAxNjA1MTFUMDYzMTMyWg0KRFRTVEFNUDoyMDE2MDUxMVQwNjMxMzJaDQpVSUQ6Y2I0YjUzMTQtYzg4Mi03MzQ1LWE0N2QtMDA2YzEwNmRjMmZmDQpTVU1NQVJZOkN1c3RvbSAxDQpSUlVMRTpGUkVRPVdFRUtMWTtVTlRJTD0yMDE2MDQwMVQwNzAwMDBaO0lOVEVSVkFMPTI7QllEQVk9V0UsU1UNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDA5MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTExVDEwMDAwMA0KVFJBTlNQOk9QQVFVRQ0KREVTQ1JJUFRJT046U3RhcnQgYXQgTW9uZGF5IGFuZCByZXBlYXQgZWFjaCAybmQgV2VkbmVzZGF5IGFuZCBTdW5kYXkuDQpTRVFVRU5DRToxDQpYLU1PWi1HRU5FUkFUSU9OOjENCkVORDpWRVZFTlQNCkJFR0lOOlZFVkVOVA0KQ1JFQVRFRDoyMDE2MDUxMVQwNjMxNTNaDQpMQVNULU1PRElGSUVEOjIwMTYwNTExVDA2MzM1NFoNCkRUU1RBTVA6MjAxNjA1MTFUMDYzMzU0Wg0KVUlEOjM1MTg0OWQ2LTRjMTUtNTM0ZS1iOTYxLTBiZjNmN2NhZWIxOA0KU1VNTUFSWTpDdXN0b20gMg0KUlJVTEU6RlJFUT1NT05USExZO1VOVElMPTIwMTcwMTAxVDA4MDAwMFo7QllNT05USERBWT0xNiwzMQ0KRFRTVEFSVDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMDkwMDAwDQpEVEVORDtUWklEPUV1cm9wZS9CZXJsaW46MjAxNjAxMTJUMTAwMDAwDQpUUkFOU1A6T1BBUVVFDQpERVNDUklQVElPTjpTdGFydCBvbiBqYW4gMTJcLCByZXBlYXQgZWFjaCBtb250aCBvbiAxNnRoIGFuZCAzMXRoLg0KRU5EOlZFVkVOVA0KQkVHSU46VkVWRU5UDQpDUkVBVEVEOjIwMTYwNTI1VDEwMDIyMFoNClVJRDo1REEwMjhEMS0yRTU4LTQ5MTUtODc4Qi03MTI0NEFGMjIzNDUNClJSVUxFOkZSRVE9WUVBUkxZO0lOVEVSVkFMPTI7QllNT05USD0xLDIsMTINCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEzMVQxMDAwMDANClRSQU5TUDpPUEFRVUUNClNVTU1BUlk6Q3VzdG9tIDMNCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTMxVDA5MDAwMA0KRFRTVEFNUDoyMDE2MDUyNVQxMDEwMzBaDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmENClNVTU1BUlk6Q3VzdG9tIDQNClJSVUxFOkZSRVE9WUVBUkxZO0JZTU9OVEhEQVk9NDtCWU1PTlRIPTINCkRUU1RBUlQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE2MDAwMA0KRFRFTkQ7VFpJRD1FdXJvcGUvQmVybGluOjIwMTYwMTA0VDE3MDAwMA0KVFJBTlNQOk9QQVFVRQ0KWC1NT1otR0VORVJBVElPTjoxDQpFTkQ6VkVWRU5UDQpCRUdJTjpWRVZFTlQNCkNSRUFURUQ6MjAxNjA1MjVUMTM1MTE5Wg0KTEFTVC1NT0RJRklFRDoyMDE2MDUyNVQxMzU0MDFaDQpEVFNUQU1QOjIwMTYwNTI1VDEzNTQwMVoNClVJRDoxZjlmOGQ3NS01NmJlLWRhNDAtOWUxMC1mYjVmNmM5OWI2YmINClNVTU1BUlk6WWVhcmx5DQpSUlVMRTpGUkVRPVlFQVJMWTtCWU1PTlRIREFZPTQ7QllNT05USD0xDQpEVFNUQVJUO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNjAwMDANCkRURU5EO1RaSUQ9RXVyb3BlL0JlcmxpbjoyMDE2MDEwNFQxNzAwMDANClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVORDpWQ0FMRU5EQVINCg==
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKCi5mYyB7CglkaXJlY3Rpb246IGx0cjsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KCi5mYy1ydGwgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCmJvZHkgLmZjIHsgLyogZXh0cmEgcHJlY2VkZW5jZSB0byBvdmVyY29tZSBqcXVpICovCglmb250LXNpemU6IDFlbTsKfQoKCi8qIENvbG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW50aGVtZWQgdGgsCi5mYy11bnRoZW1lZCB0ZCwKLmZjLXVudGhlbWVkIHRoZWFkLAouZmMtdW50aGVtZWQgdGJvZHksCi5mYy11bnRoZW1lZCAuZmMtZGl2aWRlciwKLmZjLXVudGhlbWVkIC5mYy1yb3csCi5mYy11bnRoZW1lZCAuZmMtY29udGVudCwgLyogZm9yIGd1dHRlciBib3JkZXIgKi8KLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyLAouZmMtdW50aGVtZWQgLmZjLWxpc3QtdmlldywKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYm9yZGVyLWNvbG9yOiAjZGRkOwp9CgouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgewoJYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQoKLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLAouZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciwKLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQgewoJYmFja2dyb3VuZDogI2VlZTsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWNvbG9yOiAjNjY2Owp9CgouZmMtdW50aGVtZWQgLmZjLXRvZGF5IHsKCWJhY2tncm91bmQ6ICNmY2Y4ZTM7Cn0KCi5mYy1oaWdobGlnaHQgeyAvKiB3aGVuIHVzZXIgaXMgc2VsZWN0aW5nIGNlbGxzICovCgliYWNrZ3JvdW5kOiAjYmNlOGYxOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1iZ2V2ZW50IHsgLyogZGVmYXVsdCBsb29rIGZvciBiYWNrZ3JvdW5kIGV2ZW50cyAqLwoJYmFja2dyb3VuZDogcmdiKDE0MywgMjIzLCAxMzApOwoJb3BhY2l0eTogLjM7Cn0KCi5mYy1ub25idXNpbmVzcyB7IC8qIGRlZmF1bHQgbG9vayBmb3Igbm9uLWJ1c2luZXNzLWhvdXJzIGFyZWFzICovCgkvKiB3aWxsIGluaGVyaXQgLmZjLWJnZXZlbnQncyBzdHlsZXMgKi8KCWJhY2tncm91bmQ6ICNkN2Q3ZDc7Cn0KCgovKiBJY29ucyAoaW5saW5lIGVsZW1lbnRzIHdpdGggc3R5bGVkIHRleHQgdGhhdCBtb2NrIGFycm93IGljb25zKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtaWNvbiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CgloZWlnaHQ6IDFlbTsKCWxpbmUtaGVpZ2h0OiAxZW07Cglmb250LXNpemU6IDFlbTsKCXRleHQtYWxpZ246IGNlbnRlcjsKCW92ZXJmbG93OiBoaWRkZW47Cglmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlOwoKCS8qIGRvbid0IGFsbG93IGJyb3dzZXIgdGV4dC1zZWxlY3Rpb24gKi8KCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cgkta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CgktbW96LXVzZXItc2VsZWN0OiBub25lOwoJLW1zLXVzZXItc2VsZWN0OiBub25lOwoJdXNlci1zZWxlY3Q6IG5vbmU7Cgl9CgovKgpBY2NlcHRhYmxlIGZvbnQtZmFtaWx5IG92ZXJyaWRlcyBmb3IgaW5kaXZpZHVhbCBpY29uczoKCSJBcmlhbCIsIHNhbnMtc2VyaWYKCSJUaW1lcyBOZXcgUm9tYW4iLCBzZXJpZgoKTk9URTogdXNlIHBlcmNlbnRhZ2UgZm9udCBzaXplcyBvciBlbHNlIG9sZCBJRSBjaG9rZXMKKi8KCi5mYy1pY29uOmFmdGVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzOSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMjAzQSI7Cglmb250LXdlaWdodDogYm9sZDsKCWZvbnQtc2l6ZTogMjAwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlciB7Cgljb250ZW50OiAiXDAwMEFCIjsKCWZvbnQtc2l6ZTogMTYwJTsKCXRvcDogLTclOwp9CgouZmMtaWNvbi1yaWdodC1kb3VibGUtYXJyb3c6YWZ0ZXIgewoJY29udGVudDogIlwwMDBCQiI7Cglmb250LXNpemU6IDE2MCU7Cgl0b3A6IC03JTsKfQoKLmZjLWljb24tbGVmdC10cmlhbmdsZTphZnRlciB7Cgljb250ZW50OiAiXDI1QzQiOwoJZm9udC1zaXplOiAxMjUlOwoJdG9wOiAzJTsKfQoKLmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJBIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMyU7Cn0KCi5mYy1pY29uLWRvd24tdHJpYW5nbGU6YWZ0ZXIgewoJY29udGVudDogIlwyNUJDIjsKCWZvbnQtc2l6ZTogMTI1JTsKCXRvcDogMiU7Cn0KCi5mYy1pY29uLXg6YWZ0ZXIgewoJY29udGVudDogIlwwMDBENyI7Cglmb250LXNpemU6IDIwMCU7Cgl0b3A6IDYlOwp9CgoKLyogQnV0dG9ucyAoc3R5bGVkIDxidXR0b24+IHRhZ3MsIG5vcm1hbGl6ZWQgdG8gd29yayBjcm9zcy1icm93c2VyKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgYnV0dG9uIHsKCS8qIGZvcmNlIGhlaWdodCB0byBpbmNsdWRlIHRoZSBib3JkZXIgYW5kIHBhZGRpbmcgKi8KCS1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKCS13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKCWJveC1zaXppbmc6IGJvcmRlci1ib3g7CgoJLyogZGltZW5zaW9ucyAqLwoJbWFyZ2luOiAwOwoJaGVpZ2h0OiAyLjFlbTsKCXBhZGRpbmc6IDAgLjZlbTsKCgkvKiB0ZXh0ICYgY3Vyc29yICovCglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplICovCgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJY3Vyc29yOiBwb2ludGVyOwp9CgovKiBGaXJlZm94IGhhcyBhbiBhbm5veWluZyBpbm5lciBib3JkZXIgKi8KLmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfQoJCi5mYy1zdGF0ZS1kZWZhdWx0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXI6IDFweCBzb2xpZDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnQgeyAvKiBub24tdGhlbWUgKi8KCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQoKLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0IHsgLyogbm9uLXRoZW1lICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OwoJYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKfQoKLyogaWNvbnMgaW4gYnV0dG9ucyAqLwoKLmZjIGJ1dHRvbiAuZmMtaWNvbiB7IC8qIG5vbi10aGVtZSAqLwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdG9wOiAtMC4wNWVtOyAvKiBzZWVtcyB0byBiZSBhIGdvb2QgYWRqdXN0bWVudCBhY3Jvc3MgYnJvd3NlcnMgKi8KCW1hcmdpbjogMCAuMmVtOwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoJCi8qCiAgYnV0dG9uIHN0YXRlcwogIGJvcnJvd2VkIGZyb20gdHdpdHRlciBib290c3RyYXAgKGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwLykKKi8KCi5mYy1zdGF0ZS1kZWZhdWx0IHsKCWJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CgliYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMCwgMCAxMDAlLCBmcm9tKCNmZmZmZmYpLCB0bygjZTZlNmU2KSk7CgliYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNlNmU2ZTYpOwoJYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmZmZmZiwgI2U2ZTZlNik7CgliYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmZmLCAjZTZlNmU2KTsKCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKCWJvcmRlci1jb2xvcjogI2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Cglib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKSByZ2JhKDAsIDAsIDAsIDAuMSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsKCWNvbG9yOiAjMzMzOwoJdGV4dC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwoJYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMiksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgouZmMtc3RhdGUtaG92ZXIsCi5mYy1zdGF0ZS1kb3duLAouZmMtc3RhdGUtYWN0aXZlLAouZmMtc3RhdGUtZGlzYWJsZWQgewoJY29sb3I6ICMzMzMzMzM7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZTZlNmU2Owp9CgouZmMtc3RhdGUtaG92ZXIgewoJY29sb3I6ICMzMzMzMzM7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNXB4OwoJLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwoJICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLXBvc2l0aW9uIDAuMXMgbGluZWFyOwp9CgouZmMtc3RhdGUtZG93biwKLmZjLXN0YXRlLWFjdGl2ZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKCWJveC1zaGFkb3c6IGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKfQoKLmZjLXN0YXRlLWRpc2FibGVkIHsKCWN1cnNvcjogZGVmYXVsdDsKCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7CglvcGFjaXR5OiAwLjY1OwoJYm94LXNoYWRvdzogbm9uZTsKfQoKCi8qIEJ1dHRvbnMgR3JvdXBzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1idXR0b24tZ3JvdXAgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKgpldmVyeSBidXR0b24gdGhhdCBpcyBub3QgZmlyc3QgaW4gYSBidXR0b24gZ3JvdXAgc2hvdWxkIHNjb290Y2ggb3ZlciBvbmUgcGl4ZWwgYW5kIGNvdmVyIHRoZQpwcmV2aW91cyBidXR0b24ncyBib3JkZXIuLi4KKi8KCi5mYyAuZmMtYnV0dG9uLWdyb3VwID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgYi9jIGJ1dHRvbnMgaGF2ZSBtYXJnaW4gc2V0IHRvIHplcm8gKi8KCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwIDAgMCAtMXB4Owp9CgouZmMgLmZjLWJ1dHRvbi1ncm91cCA+IDpmaXJzdC1jaGlsZCB7IC8qIHNhbWUgKi8KCW1hcmdpbi1sZWZ0OiAwOwp9CgoKLyogUG9wb3ZlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcG9wb3ZlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3gtc2hhZG93OiAwIDJweCA2cHggcmdiYSgwLDAsMCwuMTUpOwp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIHsgLyogVE9ETzogYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggZmMtaGVhZC9mYy1ib2R5ICovCglwYWRkaW5nOiAycHggNHB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSB7CgltYXJnaW46IDAgMnB4Owp9CgouZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IGxlZnQ7Cn0KCi5mYy1ydGwgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtdGl0bGUsCi5mYy1sdHIgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2UgewoJZmxvYXQ6IHJpZ2h0Owp9CgovKiB1bnRoZW1lZCAqLwoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIHsKCWJvcmRlci13aWR0aDogMXB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKfQoKLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3NlIHsKCWZvbnQtc2l6ZTogLjllbTsKCW1hcmdpbi10b3A6IDJweDsKfQoKLyoganF1aSB0aGVtZWQgKi8KCi5mYy1wb3BvdmVyID4gLnVpLXdpZGdldC1oZWFkZXIgKyAudWktd2lkZ2V0LWNvbnRlbnQgewoJYm9yZGVyLXRvcDogMDsgLyogd2hlcmUgdGhleSBtZWV0LCBsZXQgdGhlIGhlYWRlciBoYXZlIHRoZSBib3JkZXIgKi8KfQoKCi8qIE1pc2MgUmV1c2FibGUgQ29tcG9uZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtZGl2aWRlciB7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cn0KCmhyLmZjLWRpdmlkZXIgewoJaGVpZ2h0OiAwOwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMCAwIDJweDsgLyogaGVpZ2h0IGlzIHVucmVsaWFibGUgYWNyb3NzIGJyb3dzZXJzLCBzbyB1c2UgcGFkZGluZyAqLwoJYm9yZGVyLXdpZHRoOiAxcHggMDsKfQoKLmZjLWNsZWFyIHsKCWNsZWFyOiBib3RoOwp9CgouZmMtYmcsCi5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtaGlnaGxpZ2h0LXNrZWxldG9uLAouZmMtaGVscGVyLXNrZWxldG9uIHsKCS8qIHRoZXNlIGVsZW1lbnQgc2hvdWxkIGFsd2F5cyBjbGluZyB0byB0b3AtbGVmdC9yaWdodCBjb3JuZXJzICovCglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi5mYy1iZyB7Cglib3R0b206IDA7IC8qIHN0cmVjaCBiZyB0byBib3R0b20gZWRnZSAqLwp9CgouZmMtYmcgdGFibGUgewoJaGVpZ2h0OiAxMDAlOyAvKiBzdHJlY2ggYmcgdG8gYm90dG9tIGVkZ2UgKi8KfQoKCi8qIFRhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgdGFibGUgewoJd2lkdGg6IDEwMCU7Cglib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiBmaXggc2Nyb2xsYmFyIGlzc3VlIGluIGZpcmVmb3ggKi8KCXRhYmxlLWxheW91dDogZml4ZWQ7Cglib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJYm9yZGVyLXNwYWNpbmc6IDA7Cglmb250LXNpemU6IDFlbTsgLyogbm9ybWFsaXplIGNyb3NzLWJyb3dzZXIgKi8KfQoKLmZjIHRoIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmZjIHRoLAouZmMgdGQgewoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMXB4OwoJcGFkZGluZzogMDsKCXZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KCi5mYyB0ZC5mYy10b2RheSB7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgoKLyogSW50ZXJuYWwgTmF2IExpbmtzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmFbZGF0YS1nb3RvXSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KCmFbZGF0YS1nb3RvXTpob3ZlciB7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKCi8qIEZha2UgVGFibGUgUm93cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMgLmZjLXJvdyB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcmNvbWUgdGhlbWVzIHcvIC51aS13aWRnZXQtY29udGVudCBmb3JjaW5nIGEgMXB4IGJvcmRlciAqLwoJLyogbm8gdmlzaWJsZSBib3JkZXIgYnkgZGVmYXVsdC4gYnV0IG1ha2UgYXZhaWxhYmxlIGlmIG5lZWQgYmUgKHNjcm9sbGJhciB3aWR0aCBjb21wZW5zYXRpb24pICovCglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAwOwp9CgouZmMtcm93IHRhYmxlIHsKCS8qIGRvbid0IHB1dCBsZWZ0L3JpZ2h0IGJvcmRlciBvbiBhbnl0aGluZyB3aXRoaW4gYSBmYWtlIHJvdy4KCSAgIHRoZSBvdXRlciB0Ym9keSB3aWxsIHdvcnJ5IGFib3V0IHRoaXMgKi8KCWJvcmRlci1sZWZ0OiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodDogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7CgoJLyogbm8gYm90dG9tIGJvcmRlcnMgb24gcm93cyAqLwoJYm9yZGVyLWJvdHRvbTogMCBoaWRkZW4gdHJhbnNwYXJlbnQ7IAp9CgouZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxlIHsKCWJvcmRlci10b3A6IDAgaGlkZGVuIHRyYW5zcGFyZW50OyAvKiBubyB0b3AgYm9yZGVyIG9uIGZpcnN0IHJvdyAqLwp9CgoKLyogRGF5IFJvdyAodXNlZCB3aXRoaW4gdGhlIGhlYWRlciBhbmQgdGhlIERheUdyaWQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1yb3cgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtcm93IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgovKiBoaWdobGlnaHRpbmcgY2VsbHMgJiBiYWNrZ3JvdW5kIGV2ZW50IHNrZWxldG9uICovCgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uLAouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJYm90dG9tOiAwOyAvKiBzdHJldGNoIHNrZWxldG9uIHRvIGJvdHRvbSBvZiByb3cgKi8KfQoKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0YWJsZSwKLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxlIHsKCWhlaWdodDogMTAwJTsgLyogc3RyZXRjaCBza2VsZXRvbiB0byBib3R0b20gb2Ygcm93ICovCn0KCi5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbiB0ZCwKLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCB7Cglib3JkZXItY29sb3I6IHRyYW5zcGFyZW50Owp9CgouZmMtcm93IC5mYy1iZ2V2ZW50LXNrZWxldG9uIHsKCXotaW5kZXg6IDI7Cgp9CgouZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gewoJei1pbmRleDogMzsKfQoKLyoKcm93IGNvbnRlbnQgKHdoaWNoIGNvbnRhaW5zIGRheS93ZWVrIG51bWJlcnMgYW5kIGV2ZW50cykgYXMgd2VsbCBhcyAiaGVscGVyIiAod2hpY2ggY29udGFpbnMKdGVtcG9yYXJ5IHJlbmRlcmVkIGV2ZW50cykuCiovCgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDQ7CglwYWRkaW5nLWJvdHRvbTogMnB4OyAvKiBtYXRjaGVzIHRoZSBzcGFjZSBhYm92ZSB0aGUgZXZlbnRzICovCn0KCi5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB7Cgl6LWluZGV4OiA1Owp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRkLAouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGQgewoJLyogc2VlLXRocm91Z2ggdG8gdGhlIGJhY2tncm91bmQgYmVsb3cgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIGluIGNhc2UgPHRkPnMgYXJlIGdsb2JhbGx5IHN0eWxlZCAqLwoJYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKCgkvKiBkb24ndCBwdXQgYSBib3JkZXIgYmV0d2VlbiBldmVudHMgYW5kL29yIHRoZSBkYXkgbnVtYmVyICovCglib3JkZXItYm90dG9tOiAwOwp9CgouZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLCAvKiBjZWxscyB3aXRoIGV2ZW50cyBpbnNpZGUgKHNvIE5PVCB0aGUgZGF5IG51bWJlciBjZWxsKSAqLwouZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGJvZHkgdGQgewoJLyogZG9uJ3QgcHV0IGEgYm9yZGVyIGJldHdlZW4gZXZlbnQgY2VsbHMgKi8KCWJvcmRlci10b3A6IDA7Cn0KCgovKiBTY3JvbGxpbmcgQ29udGFpbmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1zY3JvbGxlciB7Cgktd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7Cn0KCi8qIFRPRE86IG1vdmUgdG8gYWdlbmRhL2Jhc2ljICovCi5mYy1zY3JvbGxlciA+IC5mYy1kYXktZ3JpZCwKLmZjLXNjcm9sbGVyID4gLmZjLXRpbWUtZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHJlLXNjb3BlIGFsbCBwb3NpdGlvbnMgKi8KCXdpZHRoOiAxMDAlOyAvKiBoYWNrIHRvIGZvcmNlIHJlLXNpemluZyB0aGlzIGlubmVyIGVsZW1lbnQgd2hlbiBzY3JvbGxiYXJzIGFwcGVhci9kaXNhcHBlYXIgKi8KfQoKCi8qIEdsb2JhbCBFdmVudCBTdHlsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogZm9yIHJlc2l6ZSBoYW5kbGUgYW5kIG90aGVyIGlubmVyIHBvc2l0aW9uaW5nICovCglkaXNwbGF5OiBibG9jazsgLyogbWFrZSB0aGUgPGE+IHRhZyBibG9jayAqLwoJZm9udC1zaXplOiAuODVlbTsKCWxpbmUtaGVpZ2h0OiAxLjM7Cglib3JkZXItcmFkaXVzOiAzcHg7Cglib3JkZXI6IDFweCBzb2xpZCAjM2E4N2FkOyAvKiBkZWZhdWx0IEJPUkRFUiBjb2xvciAqLwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsgLyogdW5kbyBqcXVpJ3MgdWktd2lkZ2V0LWhlYWRlciBib2xkICovCn0KCi5mYy1ldmVudCwKLmZjLWV2ZW50LWRvdCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjM2E4N2FkOyAvKiBkZWZhdWx0IEJBQ0tHUk9VTkQgY29sb3IgKi8KfQoKLyogb3ZlcnBvd2VyIHNvbWUgb2YgYm9vdHN0cmFwJ3MgYW5kIGpxdWkncyBzdHlsZXMgb24gPGE+IHRhZ3MgKi8KLmZjLWV2ZW50LAouZmMtZXZlbnQ6aG92ZXIsCi51aS13aWRnZXQgLmZjLWV2ZW50IHsKCWNvbG9yOiAjZmZmOyAvKiBkZWZhdWx0IFRFWFQgY29sb3IgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyogaWYgPGE+IGhhcyBhbiBocmVmICovCn0KCi5mYy1ldmVudFtocmVmXSwKLmZjLWV2ZW50LmZjLWRyYWdnYWJsZSB7CgljdXJzb3I6IHBvaW50ZXI7IC8qIGdpdmUgZXZlbnRzIHdpdGggbGlua3MgYW5kIGRyYWdnYWJsZSBldmVudHMgYSBoYW5kIG1vdXNlIHBvaW50ZXIgKi8KfQoKLmZjLW5vdC1hbGxvd2VkLCAvKiBjYXVzZXMgYSAid2FybmluZyIgY3Vyc29yLiBhcHBsaWVkIG9uIGJvZHkgKi8KLmZjLW5vdC1hbGxvd2VkIC5mYy1ldmVudCB7IC8qIHRvIG92ZXJyaWRlIGFuIGV2ZW50J3MgY3VzdG9tIGN1cnNvciAqLwoJY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLmZjLWV2ZW50IC5mYy1iZyB7IC8qIHRoZSBnZW5lcmljIC5mYy1iZyBhbHJlYWR5IGRvZXMgcG9zaXRpb24gKi8KCXotaW5kZXg6IDE7CgliYWNrZ3JvdW5kOiAjZmZmOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZXZlbnQgLmZjLWNvbnRlbnQgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsKfQoKLyogcmVzaXplciAoY3Vyc29yIEFORCB0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWV2ZW50IC5mYy1yZXNpemVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDQ7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZXMpICovCgouZmMtZXZlbnQgLmZjLXJlc2l6ZXIgewoJZGlzcGxheTogbm9uZTsKfQoKLmZjLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplciwKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1yZXNpemVyIHsKCS8qIG9ubHkgc2hvdyB3aGVuIGhvdmVyaW5nIG9yIHNlbGVjdGVkICh3aXRoIHRvdWNoKSAqLwoJZGlzcGxheTogYmxvY2s7Cn0KCi8qIGhpdCBhcmVhICovCgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXI6YmVmb3JlIHsKCS8qIDQweDQwIHRvdWNoIGFyZWEgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTsgLyogdXNlciBvZiB0aGlzIHV0aWwgY2FuIHNjb3BlIHdpdGhpbiBhIGxvd2VyIHotaW5kZXggKi8KCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJd2lkdGg6IDQwcHg7CgloZWlnaHQ6IDQwcHg7CgltYXJnaW4tbGVmdDogLTIwcHg7CgltYXJnaW4tdG9wOiAtMjBweDsKfQoKCi8qIEV2ZW50IFNlbGVjdGlvbiAob25seSBmb3IgdG91Y2ggZGV2aWNlcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWV2ZW50LmZjLXNlbGVjdGVkIHsKCXotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgLyogb3ZlcmNvbWVzIGlubGluZSB6LWluZGV4ICovCglib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgouZmMtZXZlbnQuZmMtc2VsZWN0ZWQuZmMtZHJhZ2dpbmcgewoJYm94LXNoYWRvdzogMCAycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKCi8qIEhvcml6b250YWwgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIGJpZ2dlciB0b3VjaCBhcmVhIHdoZW4gc2VsZWN0ZWQgKi8KLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQ6YmVmb3JlIHsKCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsgLyogYmVsb3cgcmVzaXplcnMgKi8KCXRvcDogLTEwcHg7Cglib3R0b206IC0xMHB4OwoJbGVmdDogMDsKCXJpZ2h0OiAwOwp9CgovKiBldmVudHMgdGhhdCBhcmUgY29udGludWluZyB0by9mcm9tIGFub3RoZXIgd2Vlay4ga2lsbCByb3VuZGVkIGNvcm5lcnMgYW5kIGJ1dHQgdXAgYWdhaW5zdCBlZGdlICovCgouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3QtZW5kIHsKCW1hcmdpbi1sZWZ0OiAwOwoJYm9yZGVyLWxlZnQtd2lkdGg6IDA7CglwYWRkaW5nLWxlZnQ6IDFweDsgLyogcmVwbGFjZSB0aGUgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cn0KCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1ub3Qtc3RhcnQgewoJbWFyZ2luLXJpZ2h0OiAwOwoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOwoJcGFkZGluZy1yaWdodDogMXB4OyAvKiByZXBsYWNlIHRoZSBib3JkZXIgd2l0aCBwYWRkaW5nICovCglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsKCWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOwp9CgovKiByZXNpemVyIChjdXJzb3IgQU5EIHRvdWNoIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyIHsKCWN1cnNvcjogdy1yZXNpemU7CglsZWZ0OiAtMXB4OyAvKiBvdmVyY29tZSBib3JkZXIgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciB7CgljdXJzb3I6IGUtcmVzaXplOwoJcmlnaHQ6IC0xcHg7IC8qIG92ZXJjb21lIGJvcmRlciAqLwp9CgovKiByZXNpemVyIChtb3VzZSBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyIHsKCXdpZHRoOiA3cHg7Cgl0b3A6IC0xcHg7IC8qIG92ZXJjb21lIHRvcCBib3JkZXIgKi8KCWJvdHRvbTogLTFweDsgLyogb3ZlcmNvbWUgYm90dG9tIGJvcmRlciAqLwp9CgovKiByZXNpemVyICh0b3VjaCBkZXZpY2VzKSAqLwoKLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogOHg4IGxpdHRsZSBkb3QgKi8KCWJvcmRlci1yYWRpdXM6IDRweDsKCWJvcmRlci13aWR0aDogMXB4OwoJd2lkdGg6IDZweDsKCWhlaWdodDogNnB4OwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci1jb2xvcjogaW5oZXJpdDsKCWJhY2tncm91bmQ6ICNmZmY7CgkvKiB2ZXJ0aWNhbGx5IGNlbnRlciAqLwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNHB4Owp9CgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyIHsKCW1hcmdpbi1sZWZ0OiAtNHB4OyAvKiBjZW50ZXJzIHRoZSA4eDggZG90IG9uIHRoZSBsZWZ0IGVkZ2UgKi8KfQoKLyogcmlnaHQgcmVzaXplciAqLwouZmMtbHRyIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplciwKLmZjLXJ0bCAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC00cHg7IC8qIGNlbnRlcnMgdGhlIDh4OCBkb3Qgb24gdGhlIHJpZ2h0IGVkZ2UgKi8KfQoKCi8qIERheUdyaWQgZXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2UgdXNlIHRoZSBmdWxsICJmYy1kYXktZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLWRheS1ncmlkLWV2ZW50IHsKCW1hcmdpbjogMXB4IDJweCAwOyAvKiBzcGFjaW5nIGJldHdlZW4gZXZlbnRzIGFuZCBlZGdlcyAqLwoJcGFkZGluZzogMCAxcHg7Cn0KCnRyOmZpcnN0LWNoaWxkID4gdGQgPiAuZmMtZGF5LWdyaWQtZXZlbnQgewoJbWFyZ2luLXRvcDogMnB4OyAvKiBhIGxpdHRsZSBiaXQgbW9yZSBzcGFjZSBiZWZvcmUgdGhlIGZpcnN0IGV2ZW50ICovCn0KCi5mYy1kYXktZ3JpZC1ldmVudC5mYy1zZWxlY3RlZDphZnRlciB7Cgljb250ZW50OiAiIjsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDE7IC8qIHNhbWUgei1pbmRleCBhcyBmYy1iZywgYmVoaW5kIHRleHQgKi8KCS8qIG92ZXJjb21lIHRoZSBib3JkZXJzICovCgl0b3A6IC0xcHg7CglyaWdodDogLTFweDsKCWJvdHRvbTogLTFweDsKCWxlZnQ6IC0xcHg7CgkvKiBkYXJrZW5pbmcgZWZmZWN0ICovCgliYWNrZ3JvdW5kOiAjMDAwOwoJb3BhY2l0eTogLjI1Owp9CgouZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnQgeyAvKiBmb3JjZSBldmVudHMgdG8gYmUgb25lLWxpbmUgdGFsbCAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYy1kYXktZ3JpZC1ldmVudCAuZmMtdGltZSB7Cglmb250LXdlaWdodDogYm9sZDsKfQoKLyogcmVzaXplciAoY3Vyc29yIGRldmljZXMpICovCgovKiBsZWZ0IHJlc2l6ZXIgICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwKLmZjLXJ0bCAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciB7CgltYXJnaW4tbGVmdDogLTJweDsgLyogdG8gdGhlIGRheSBjZWxsJ3MgZWRnZSAqLwp9CgovKiByaWdodCByZXNpemVyICovCi5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtZW5kLXJlc2l6ZXIsCi5mYy1ydGwgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciB7CgltYXJnaW4tcmlnaHQ6IC0ycHg7IC8qIHRvIHRoZSBkYXkgY2VsbCdzIGVkZ2UgKi8KfQoKCi8qIEV2ZW50IExpbWl0aW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qICJtb3JlIiBsaW5rIHRoYXQgcmVwcmVzZW50cyBoaWRkZW4gZXZlbnRzICovCgphLmZjLW1vcmUgewoJbWFyZ2luOiAxcHggM3B4OwoJZm9udC1zaXplOiAuODVlbTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKYS5mYy1tb3JlOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouZmMtbGltaXRlZCB7IC8qIHJvd3MgYW5kIGNlbGxzIHRoYXQgYXJlIGhpZGRlbiBiZWNhdXNlIG9mIGEgIm1vcmUiIGxpbmsgKi8KCWRpc3BsYXk6IG5vbmU7Cn0KCi8qIHBvcG92ZXIgdGhhdCBhcHBlYXJzIHdoZW4gIm1vcmUiIGxpbmsgaXMgY2xpY2tlZCAqLwoKLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJei1pbmRleDogMTsgLyogbWFrZSB0aGUgIm1vcmUiIHBvcG92ZXIgb25lIGhpZ2hlciB0aGFuIHRoaXMgKi8KfQoKLmZjLW1vcmUtcG9wb3ZlciB7Cgl6LWluZGV4OiAyOwoJd2lkdGg6IDIyMHB4Owp9CgouZmMtbW9yZS1wb3BvdmVyIC5mYy1ldmVudC1jb250YWluZXIgewoJcGFkZGluZzogMTBweDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLW5vdy1pbmRpY2F0b3IgewoJcG9zaXRpb246IGFic29sdXRlOwoJYm9yZGVyOiAwIHNvbGlkIHJlZDsKfQoKCi8qIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdW5zZWxlY3RhYmxlIHsKCS13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CgkgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwoJICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKCSAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CgkgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoJLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwoJLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwp9CgoKCi8qIFRvb2xiYXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRvb2xiYXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwoJbWFyZ2luLWJvdHRvbTogMWVtOwp9CgouZmMtdG9vbGJhciAuZmMtbGVmdCB7CglmbG9hdDogbGVmdDsKfQoKLmZjLXRvb2xiYXIgLmZjLXJpZ2h0IHsKCWZsb2F0OiByaWdodDsKfQoKLmZjLXRvb2xiYXIgLmZjLWNlbnRlciB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi8qIHRoZSB0aGluZ3Mgd2l0aGluIGVhY2ggbGVmdC9yaWdodC9jZW50ZXIgc2VjdGlvbiAqLwouZmMgLmZjLXRvb2xiYXIgPiAqID4gKiB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCglmbG9hdDogbGVmdDsKCW1hcmdpbi1sZWZ0OiAuNzVlbTsKfQoKLyogdGhlIGZpcnN0IHRoaW5nIHdpdGhpbiBlYWNoIGxlZnQvY2VudGVyL3JpZ2h0IHNlY3Rpb24gKi8KLmZjIC5mYy10b29sYmFyID4gKiA+IDpmaXJzdC1jaGlsZCB7IC8qIGV4dHJhIHByZWNlZGVuY2UgdG8gb3ZlcnJpZGUgYnV0dG9uIGJvcmRlciBtYXJnaW5zICovCgltYXJnaW4tbGVmdDogMDsKfQoJCi8qIHRpdGxlIHRleHQgKi8KCi5mYy10b29sYmFyIGgyIHsKCW1hcmdpbjogMDsKfQoKLyogYnV0dG9uIGxheWVyaW5nIChmb3IgYm9yZGVyIHByZWNlZGVuY2UpICovCgouZmMtdG9vbGJhciBidXR0b24gewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdG9vbGJhciAuZmMtc3RhdGUtaG92ZXIsCi5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3ZlciB7Cgl6LWluZGV4OiAyOwp9CgkKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd24gewoJei1pbmRleDogMzsKfQoKLmZjLXRvb2xiYXIgLmZjLXN0YXRlLWFjdGl2ZSwKLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZSB7Cgl6LWluZGV4OiA0Owp9CgouZmMtdG9vbGJhciBidXR0b246Zm9jdXMgewoJei1pbmRleDogNTsKfQoKCi8qIFZpZXcgU3RydWN0dXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHVuZG8gdHdpdHRlciBib290c3RyYXAncyBib3gtc2l6aW5nIHJ1bGVzLiBub3JtYWxpemVzIHBvc2l0aW9uaW5nIHRlY2huaXF1ZXMgKi8KLyogZG9uJ3QgZG8gdGhpcyBmb3IgdGhlIHRvb2xiYXIgYmVjYXVzZSB3ZSdsbCB3YW50IGJvb3RzdHJhcCB0byBzdHlsZSB0aG9zZSBidXR0b25zIGFzIHNvbWUgcHQgKi8KLmZjLXZpZXctY29udGFpbmVyICosCi5mYy12aWV3LWNvbnRhaW5lciAqOmJlZm9yZSwKLmZjLXZpZXctY29udGFpbmVyICo6YWZ0ZXIgewoJLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKCSAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CgkgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgouZmMtdmlldywgLyogc2NvcGUgcG9zaXRpb25pbmcgYW5kIHotaW5kZXgncyBmb3IgZXZlcnl0aGluZyB3aXRoaW4gdGhlIHZpZXcgKi8KLmZjLXZpZXcgPiB0YWJsZSB7IC8qIHNvIGRyYWdnZWQgZWxlbWVudHMgY2FuIGJlIGFib3ZlIHRoZSB2aWV3J3MgbWFpbiBlbGVtZW50ICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgoKCi8qIEJhc2ljVmlldwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBkYXkgcm93IHN0cnVjdHVyZSAqLwoKLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9uLAouZmMtYmFzaWNEYXktdmlldyAuZmMtY29udGVudC1za2VsZXRvbiB7CgkvKiB0aGVyZSBtYXkgYmUgd2VlayBudW1iZXJzIGluIHRoZXNlIHZpZXdzLCBzbyBubyBwYWRkaW5nLXRvcCAqLwoJcGFkZGluZy1ib3R0b206IDFlbTsgLyogZW5zdXJlIGEgc3BhY2UgYXQgYm90dG9tIG9mIGNlbGwgZm9yIHVzZXIgc2VsZWN0aW5nL2NsaWNraW5nICovCn0KCi5mYy1iYXNpYy12aWV3IC5mYy1ib2R5IC5mYy1yb3cgewoJbWluLWhlaWdodDogNGVtOyAvKiBlbnN1cmUgdGhhdCBhbGwgcm93cyBhcmUgYXQgbGVhc3QgdGhpcyB0YWxsICovCn0KCi8qIGEgInJpZ2lkIiByb3cgd2lsbCB0YWtlIHVwIGEgY29uc3RhbnQgYW1vdW50IG9mIGhlaWdodCBiZWNhdXNlIGNvbnRlbnQtc2tlbGV0b24gaXMgYWJzb2x1dGUgKi8KCi5mYy1yb3cuZmMtcmlnaWQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXJvdy5mYy1yaWdpZCAuZmMtY29udGVudC1za2VsZXRvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIHdlZWsgYW5kIGRheSBudW1iZXIgc3R5bGluZyAqLwoKLmZjLWRheS10b3AuZmMtb3RoZXItbW9udGggewoJb3BhY2l0eTogMC4zOwp9CgouZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IC5mYy1kYXktbnVtYmVyIHsKCXBhZGRpbmc6IDJweDsKfQoKLmZjLWJhc2ljLXZpZXcgdGguZmMtd2Vlay1udW1iZXIsCi5mYy1iYXNpYy12aWV3IHRoLmZjLWRheS1udW1iZXIgewoJcGFkZGluZzogMCAycHg7IC8qIGNvbHVtbiBoZWFkZXJzIGNhbid0IGhhdmUgYXMgbXVjaCB2IHNwYWNlICovCn0KCi5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlciB7IGZsb2F0OiBsZWZ0OyB9CgouZmMtbHRyIC5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlciB7IGZsb2F0OiBsZWZ0OyBib3JkZXItcmFkaXVzOiAwIDAgM3B4IDA7IH0KLmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtd2Vlay1udW1iZXIgeyBmbG9hdDogcmlnaHQ7IGJvcmRlci1yYWRpdXM6IDAgMCAwIDNweDsgfQoKLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVyIHsKCW1pbi13aWR0aDogMS41ZW07Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOwoJY29sb3I6ICM4MDgwODA7Cn0KCi8qIHdoZW4gd2Vlay9kYXkgbnVtYmVyIGhhdmUgb3duIGNvbHVtbiAqLwoKLmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXIgewoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciA+ICogewoJLyogd29yayBhcm91bmQgdGhlIHdheSB3ZSBkbyBjb2x1bW4gcmVzaXppbmcgYW5kIGVuc3VyZSBhIG1pbmltdW0gd2lkdGggKi8KCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCW1pbi13aWR0aDogMS4yNWVtOwp9CgoKLyogQWdlbmRhVmlldyBhbGwtZGF5IGFyZWEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOyAvKiBzbyB0aGUgIm1vcmUuLiIgcG9wb3ZlciB3aWxsIGJlIG92ZXIgdGhlIHRpbWUgZ3JpZCAqLwp9CgouZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgewoJbWluLWhlaWdodDogM2VtOyAvKiBhbGwtZGF5IHNlY3Rpb24gd2lsbCBuZXZlciBnZXQgc2hvcnRlciB0aGFuIHRoaXMgKi8KfQoKLmZjLWFnZW5kYS12aWV3IC5mYy1kYXktZ3JpZCAuZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBhZGRpbmctYm90dG9tOiAxZW07IC8qIGdpdmUgc3BhY2UgdW5kZXJuZWF0aCBldmVudHMgZm9yIGNsaWNraW5nL3NlbGVjdGluZyBkYXlzICovCn0KCgovKiBUaW1lR3JpZCBheGlzIHJ1bm5pbmcgZG93biB0aGUgc2lkZSAoZm9yIGJvdGggdGhlIGFsbC1kYXkgYXJlYSBhbmQgdGhlIHNsb3QgYXJlYSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjIC5mYy1heGlzIHsgLyogLmZjIHRvIG92ZXJjb21lIGRlZmF1bHQgY2VsbCBzdHlsZXMgKi8KCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CglwYWRkaW5nOiAwIDRweDsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5mYy1sdHIgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1ydGwgLmZjLWF4aXMgewoJdGV4dC1hbGlnbjogbGVmdDsKfQoKLnVpLXdpZGdldCB0ZC5mYy1heGlzIHsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7IC8qIG92ZXJjb21lIGpxdWkgdGhlbWUgbWFraW5nIGl0IGJvbGQgKi8KfQoKCi8qIFRpbWVHcmlkIFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1ncmlkLWNvbnRhaW5lciwgLyogc28gc2Nyb2xsIGNvbnRhaW5lcidzIHotaW5kZXggaXMgYmVsb3cgYWxsLWRheSAqLwouZmMtdGltZS1ncmlkIHsgLyogc28gc2xhdHMvYmcvY29udGVudC9ldGMgcG9zaXRpb25zIGdldCBzY29wZWQgd2l0aGluIGhlcmUgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDE7Cn0KCi5mYy10aW1lLWdyaWQgewoJbWluLWhlaWdodDogMTAwJTsgLyogc28gaWYgaGVpZ2h0IHNldHRpbmcgaXMgJ2F1dG8nLCAuZmMtYmcgc3RyZXRjaGVzIHRvIGZpbGwgaGVpZ2h0ICovCn0KCi5mYy10aW1lLWdyaWQgdGFibGUgeyAvKiBkb24ndCBwdXQgb3V0ZXIgYm9yZGVycyBvbiBzbGF0cy9iZy9jb250ZW50L2V0YyAqLwoJYm9yZGVyOiAwIGhpZGRlbiB0cmFuc3BhcmVudDsKfQoKLmZjLXRpbWUtZ3JpZCA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1zbGF0cywKLmZjLXRpbWUtZ3JpZCA+IGhyIHsgLyogdGhlIDxocj4gQWdlbmRhVmlldyBpbmplY3RzIHdoZW4gZ3JpZCBpcyBzaG9ydGVyIHRoYW4gc2Nyb2xsZXIgKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDI7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29sIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogYmVjYXVzZSBub3ctaW5kaWNhdG9yIGxpdmVzIGRpcmVjdGx5IGluc2lkZSAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1jb250ZW50LXNrZWxldG9uIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDM7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGRpdnMgd2l0aGluIGEgY2VsbCB3aXRoaW4gdGhlIGZjLWNvbnRlbnQtc2tlbGV0b24gKi8KCi5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAyOwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA0Owp9CgouZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWxpbmUgewoJei1pbmRleDogNTsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtaGVscGVyLWNvbnRhaW5lciB7IC8qIGFsc28gaXMgZmMtZXZlbnQtY29udGFpbmVyICovCglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiA2Owp9CgoKLyogVGltZUdyaWQgU2xhdHMgKGxpbmVzIHRoYXQgcnVuIGhvcml6b250YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgdGQgewoJaGVpZ2h0OiAxLjVlbTsKCWJvcmRlci1ib3R0b206IDA7IC8qIGVhY2ggY2VsbCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIHRvcCBib3JkZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLmZjLW1pbm9yIHRkIHsKCWJvcmRlci10b3Atc3R5bGU6IGRvdHRlZDsKfQoKLmZjLXRpbWUtZ3JpZCAuZmMtc2xhdHMgLnVpLXdpZGdldC1jb250ZW50IHsgLyogZm9yIGpxdWkgdGhlbWUgKi8KCWJhY2tncm91bmQ6IG5vbmU7IC8qIHNlZSB0aHJvdWdoIHRvIGZjLWJnICovCn0KCgovKiBUaW1lR3JpZCBIaWdobGlnaHRpbmcgU2xvdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7IC8qIGEgZGl2IHdpdGhpbiBhIGNlbGwgd2l0aGluIHRoZSBmYy1oaWdobGlnaHQtc2tlbGV0b24gKi8KCXBvc2l0aW9uOiByZWxhdGl2ZTsgLyogc2NvcGVzIHRoZSBsZWZ0L3JpZ2h0IG9mIHRoZSBmYy1oaWdobGlnaHQgdG8gYmUgaW4gdGhlIGNvbHVtbiAqLwp9CgouZmMtdGltZS1ncmlkIC5mYy1oaWdobGlnaHQgewoJcG9zaXRpb246IGFic29sdXRlOwoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJLyogdG9wIGFuZCBib3R0b20gd2lsbCBiZSBpbiBieSBKUyAqLwp9CgoKLyogVGltZUdyaWQgRXZlbnQgQ29udGFpbm1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBMVFIgKGRlZmF1bHQpICovCgltYXJnaW46IDAgMi41JSAwIDJweDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXIgeyAvKiBzcGFjZSBvbiB0aGUgc2lkZXMgb2YgZXZlbnRzIGZvciBSVEwgKi8KCW1hcmdpbjogMCAycHggMCAyLjUlOwp9CgouZmMtdGltZS1ncmlkIC5mYy1ldmVudCwKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiAxOyAvKiBzY29wZSBpbm5lciB6LWluZGV4J3MgKi8KfQoKLmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudCB7CgkvKiBiYWNrZ3JvdW5kIGV2ZW50cyBhbHdheXMgc3BhbiBmdWxsIHdpZHRoICovCglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCgovKiBHZW5lcmljIFZlcnRpY2FsIEV2ZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy12LWV2ZW50LmZjLW5vdC1zdGFydCB7IC8qIGV2ZW50cyB0aGF0IGFyZSBjb250aW51aW5nIGZyb20gYW5vdGhlciBkYXkgKi8KCS8qIHJlcGxhY2Ugc3BhY2UgbWFkZSBieSB0aGUgdG9wIGJvcmRlciB3aXRoIHBhZGRpbmcgKi8KCWJvcmRlci10b3Atd2lkdGg6IDA7CglwYWRkaW5nLXRvcDogMXB4OwoKCS8qIHJlbW92ZSB0b3Agcm91bmRlZCBjb3JuZXJzICovCglib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwOwoJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7Cn0KCi5mYy12LWV2ZW50LmZjLW5vdC1lbmQgewoJLyogcmVwbGFjZSBzcGFjZSBtYWRlIGJ5IHRoZSB0b3AgYm9yZGVyIHdpdGggcGFkZGluZyAqLwoJYm9yZGVyLWJvdHRvbS13aWR0aDogMDsKCXBhZGRpbmctYm90dG9tOiAxcHg7CgoJLyogcmVtb3ZlIGJvdHRvbSByb3VuZGVkIGNvcm5lcnMgKi8KCWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7Cglib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsKfQoKCi8qIFRpbWVHcmlkIEV2ZW50IFN0eWxpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZSB1c2UgdGhlIGZ1bGwgImZjLXRpbWUtZ3JpZC1ldmVudCIgY2xhc3MgaW5zdGVhZCBvZiB1c2luZyBkZXNjZW5kYW50cyBiZWNhdXNlIHRoZSBldmVudCB3b24ndApiZSBhIGRlc2NlbmRhbnQgb2YgdGhlIGdyaWQgd2hlbiBpdCBpcyBiZWluZyBkcmFnZ2VkLgoqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBkb24ndCBsZXQgdGhlIGJnIGZsb3cgb3ZlciByb3VuZGVkIGNvcm5lcnMgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCB7CgkvKiBuZWVkIHRvIGFsbG93IHRvdWNoIHJlc2l6ZXJzIHRvIGV4dGVuZCBvdXRzaWRlIGV2ZW50J3MgYm91bmRpbmcgYm94ICovCgkvKiBjb21tb24gZmMtc2VsZWN0ZWQgc3R5bGVzIGhpZGUgdGhlIGZjLWJnLCBzbyBkb24ndCBuZWVkIHRoaXMgYW55d2F5ICovCglvdmVyZmxvdzogdmlzaWJsZTsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmcgewoJZGlzcGxheTogbm9uZTsgLyogaGlkZSBzZW1pLXdoaXRlIGJhY2tncm91bmQsIHRvIGFwcGVhciBkYXJrZXIgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtY29udGVudCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3Igd2hlbiAuZmMtc2VsZWN0ZWQgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUgewoJZm9udC1zaXplOiAuODVlbTsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qIHNob3J0IG1vZGUsIHdoZXJlIHRpbWUgYW5kIHRpdGxlIGFyZSBvbiB0aGUgc2FtZSBsaW5lICovCgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy1jb250ZW50IHsKCS8qIGRvbid0IHdyYXAgdG8gc2Vjb25kIGxpbmUgKG5vdyB0aGF0IGNvbnRlbnRzIHdpbGwgYmUgaW5saW5lKSAqLwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJLyogcHV0IHRoZSB0aW1lIGFuZCB0aXRsZSBvbiB0aGUgc2FtZSBsaW5lICovCglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lIHNwYW4gewoJZGlzcGxheTogbm9uZTsgLyogZG9uJ3QgZGlzcGxheSB0aGUgZnVsbCB0aW1lIHRleHQuLi4gKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTpiZWZvcmUgewoJY29udGVudDogYXR0cihkYXRhLXN0YXJ0KTsgLyogLi4uaW5zdGVhZCwgZGlzcGxheSBvbmx5IHRoZSBzdGFydCB0aW1lICovCn0KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2hvcnQgLmZjLXRpbWU6YWZ0ZXIgewoJY29udGVudDogIlwwMDBBMC1cMDAwQTAiOyAvKiBzZXBlcmF0ZSB3aXRoIGEgZGFzaCwgd3JhcHBlZCBpbiBuYnNwJ3MgKi8KfQoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGl0bGUgewoJZm9udC1zaXplOiAuODVlbTsgLyogbWFrZSB0aGUgdGl0bGUgdGV4dCB0aGUgc2FtZSBzaXplIGFzIHRoZSB0aW1lICovCglwYWRkaW5nOiAwOyAvKiB1bmRvIHBhZGRpbmcgZnJvbSBhYm92ZSAqLwp9CgovKiByZXNpemVyIChjdXJzb3IgZGV2aWNlKSAqLwoKLmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXJlc2l6ZXIgewoJbGVmdDogMDsKCXJpZ2h0OiAwOwoJYm90dG9tOiAwOwoJaGVpZ2h0OiA4cHg7CglvdmVyZmxvdzogaGlkZGVuOwoJbGluZS1oZWlnaHQ6IDhweDsKCWZvbnQtc2l6ZTogMTFweDsKCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgljdXJzb3I6IHMtcmVzaXplOwp9CgouZmMtdGltZS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtcmVzaXplcjphZnRlciB7Cgljb250ZW50OiAiPSI7Cn0KCi8qIHJlc2l6ZXIgKHRvdWNoIGRldmljZSkgKi8KCi5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXIgewoJLyogMTB4MTAgZG90ICovCglib3JkZXItcmFkaXVzOiA1cHg7Cglib3JkZXItd2lkdGg6IDFweDsKCXdpZHRoOiA4cHg7CgloZWlnaHQ6IDhweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cglib3JkZXItY29sb3I6IGluaGVyaXQ7CgliYWNrZ3JvdW5kOiAjZmZmOwoJLyogaG9yaXpvbnRhbGx5IGNlbnRlciAqLwoJbGVmdDogNTAlOwoJbWFyZ2luLWxlZnQ6IC01cHg7CgkvKiBjZW50ZXIgb24gdGhlIGJvdHRvbSBlZGdlICovCglib3R0b206IC01cHg7Cn0KCgovKiBOb3cgSW5kaWNhdG9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7Cglib3JkZXItdG9wLXdpZHRoOiAxcHg7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cn0KCi8qIGFycm93IG9uIGF4aXMgKi8KCi5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luLXRvcDogLTVweDsgLyogdmVydGljYWxseSBjZW50ZXIgb24gdG9wIGNvb3JkaW5hdGUgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCWxlZnQ6IDA7CgkvKiB0cmlhbmdsZSBwb2ludGluZyByaWdodC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggMCA1cHggNnB4OwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKLmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ub3ctaW5kaWNhdG9yLWFycm93IHsKCXJpZ2h0OiAwOwoJLyogdHJpYW5nbGUgcG9pbnRpbmcgbGVmdC4uLiAqLwoJYm9yZGVyLXdpZHRoOiA1cHggNnB4IDVweCAwOwoJYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKCgovKiBMaXN0IFZpZXcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogcG9zc2libHkgcmV1c2FibGUgKi8KCi5mYy1ldmVudC1kb3QgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJd2lkdGg6IDEwcHg7CgloZWlnaHQ6IDEwcHg7Cglib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi8qIHZpZXcgd3JhcHBlciAqLwoKLmZjLXJ0bCAuZmMtbGlzdC12aWV3IHsKCWRpcmVjdGlvbjogcnRsOyAvKiB1bmxpa2UgY29yZSB2aWV3cywgbGV2ZXJhZ2UgYnJvd3NlciBSVEwgKi8KfQoKLmZjLWxpc3QtdmlldyB7Cglib3JkZXItd2lkdGg6IDFweDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cn0KCi8qIHRhYmxlIHJlc2V0cyAqLwoKLmZjIC5mYy1saXN0LXRhYmxlIHsKCXRhYmxlLWxheW91dDogYXV0bzsgLyogZm9yIHNocmlua3dyYXBwaW5nIGNlbGwgY29udGVudCAqLwp9CgouZmMtbGlzdC10YWJsZSB0ZCB7Cglib3JkZXItd2lkdGg6IDFweCAwIDA7CglwYWRkaW5nOiA4cHggMTRweDsKfQoKLmZjLWxpc3QtdGFibGUgdHI6Zmlyc3QtY2hpbGQgdGQgewoJYm9yZGVyLXRvcC13aWR0aDogMDsKfQoKLyogZGF5IGhlYWRpbmdzIHdpdGggdGhlIGxpc3QgKi8KCi5mYy1saXN0LWhlYWRpbmcgewoJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4Owp9CgouZmMtbGlzdC1oZWFkaW5nIHRkIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9CgouZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbiB7IGZsb2F0OiBsZWZ0OyB9Ci5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogcmlnaHQ7IH0KCi5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1tYWluIHsgZmxvYXQ6IHJpZ2h0OyB9Ci5mYy1ydGwgLmZjLWxpc3QtaGVhZGluZy1hbHQgeyBmbG9hdDogbGVmdDsgfQoKLyogZXZlbnQgbGlzdCBpdGVtcyAqLwoKLmZjLWxpc3QtaXRlbS5mYy1oYXMtdXJsIHsKCWN1cnNvcjogcG9pbnRlcjsgLyogd2hvbGUgcm93IHdpbGwgYmUgY2xpY2thYmxlICovCn0KCi5mYy1saXN0LWl0ZW06aG92ZXIgdGQgewoJYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKfQoKLmZjLWxpc3QtaXRlbS1tYXJrZXIsCi5mYy1saXN0LWl0ZW0tdGltZSB7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJd2lkdGg6IDFweDsKfQoKLyogbWFrZSB0aGUgZG90IGNsb3NlciB0byB0aGUgZXZlbnQgdGl0bGUgKi8KLmZjLWx0ciAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctcmlnaHQ6IDA7IH0KLmZjLXJ0bCAuZmMtbGlzdC1pdGVtLW1hcmtlciB7IHBhZGRpbmctbGVmdDogMDsgfQoKLmZjLWxpc3QtaXRlbS10aXRsZSBhIHsKCS8qIGV2ZXJ5IGV2ZW50IHRpdGxlIGNlbGwgaGFzIGFuIDxhPiB0YWcgKi8KCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9CgouZmMtbGlzdC1pdGVtLXRpdGxlIGFbaHJlZl06aG92ZXIgewoJLyogaG92ZXIgZWZmZWN0IG9ubHkgb24gdGl0bGVzIHdpdGggaHJlZnMgKi8KCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBtZXNzYWdlIHdoZW4gbm8gZXZlbnRzICovCgouZmMtbGlzdC1lbXB0eS13cmFwMiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcmlnaHQ6IDA7Cglib3R0b206IDA7Cn0KCi5mYy1saXN0LWVtcHR5LXdyYXAxIHsKCXdpZHRoOiAxMDAlOwoJaGVpZ2h0OiAxMDAlOwoJZGlzcGxheTogdGFibGU7Cn0KCi5mYy1saXN0LWVtcHR5IHsKCWRpc3BsYXk6IHRhYmxlLWNlbGw7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmMtdW50aGVtZWQgLmZjLWxpc3QtZW1wdHkgeyAvKiB0aGVtZSB3aWxsIHByb3ZpZGUgb3duIGJhY2tncm91bmQgKi8KCWJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0K
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEgU3R5bGVzaGVldAogKiBEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1pY29uLGJvZHkgLmZje2ZvbnQtc2l6ZToxZW19LmZjLWJ1dHRvbi1ncm91cCwuZmMtaWNvbntkaXNwbGF5OmlubGluZS1ibG9ja30uZmMtYmcsLmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b257Ym90dG9tOjB9LmZjLWljb24sLmZjLXVuc2VsZWN0YWJsZXsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZX0uZmN7ZGlyZWN0aW9uOmx0cjt0ZXh0LWFsaWduOmxlZnR9LmZjLXJ0bHt0ZXh0LWFsaWduOnJpZ2h0fS5mYyB0aCwuZmMtYmFzaWMtdmlldyB0ZC5mYy13ZWVrLW51bWJlciwuZmMtaWNvbiwuZmMtdG9vbGJhcnt0ZXh0LWFsaWduOmNlbnRlcn0uZmMtdW50aGVtZWQgLmZjLWNvbnRlbnQsLmZjLXVudGhlbWVkIC5mYy1kaXZpZGVyLC5mYy11bnRoZW1lZCAuZmMtbGlzdC1oZWFkaW5nIHRkLC5mYy11bnRoZW1lZCAuZmMtbGlzdC12aWV3LC5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciwuZmMtdW50aGVtZWQgLmZjLXJvdywuZmMtdW50aGVtZWQgdGJvZHksLmZjLXVudGhlbWVkIHRkLC5mYy11bnRoZW1lZCB0aCwuZmMtdW50aGVtZWQgdGhlYWR7Ym9yZGVyLWNvbG9yOiNkZGR9LmZjLXVudGhlbWVkIC5mYy1wb3BvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZn0uZmMtdW50aGVtZWQgLmZjLWRpdmlkZXIsLmZjLXVudGhlbWVkIC5mYy1saXN0LWhlYWRpbmcgdGQsLmZjLXVudGhlbWVkIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXJ7YmFja2dyb3VuZDojZWVlfS5mYy11bnRoZW1lZCAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZXtjb2xvcjojNjY2fS5mYy11bnRoZW1lZCAuZmMtdG9kYXl7YmFja2dyb3VuZDojZmNmOGUzfS5mYy1oaWdobGlnaHR7YmFja2dyb3VuZDojYmNlOGYxO29wYWNpdHk6LjN9LmZjLWJnZXZlbnR7YmFja2dyb3VuZDojOGZkZjgyO29wYWNpdHk6LjN9LmZjLW5vbmJ1c2luZXNze2JhY2tncm91bmQ6I2Q3ZDdkN30uZmMtaWNvbntoZWlnaHQ6MWVtO2xpbmUtaGVpZ2h0OjFlbTtvdmVyZmxvdzpoaWRkZW47Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IixDb3VyaWVyLG1vbm9zcGFjZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmZjLWljb246YWZ0ZXJ7cG9zaXRpb246cmVsYXRpdmV9LmZjLWljb24tbGVmdC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDM5Ijtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1yaWdodC1zaW5nbGUtYXJyb3c6YWZ0ZXJ7Y29udGVudDoiXDAyMDNBIjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjIwMCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LWRvdWJsZS1hcnJvdzphZnRlcntjb250ZW50OiJcMDAwQUIiO2ZvbnQtc2l6ZToxNjAlO3RvcDotNyV9LmZjLWljb24tcmlnaHQtZG91YmxlLWFycm93OmFmdGVye2NvbnRlbnQ6IlwwMDBCQiI7Zm9udC1zaXplOjE2MCU7dG9wOi03JX0uZmMtaWNvbi1sZWZ0LXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUM0Ijtmb250LXNpemU6MTI1JTt0b3A6MyV9LmZjLWljb24tcmlnaHQtdHJpYW5nbGU6YWZ0ZXJ7Y29udGVudDoiXDI1QkEiO2ZvbnQtc2l6ZToxMjUlO3RvcDozJX0uZmMtaWNvbi1kb3duLXRyaWFuZ2xlOmFmdGVye2NvbnRlbnQ6IlwyNUJDIjtmb250LXNpemU6MTI1JTt0b3A6MiV9LmZjLWljb24teDphZnRlcntjb250ZW50OiJcMDAwRDciO2ZvbnQtc2l6ZToyMDAlO3RvcDo2JX0uZmMgYnV0dG9uey1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW46MDtoZWlnaHQ6Mi4xZW07cGFkZGluZzowIC42ZW07Zm9udC1zaXplOjFlbTt3aGl0ZS1zcGFjZTpub3dyYXA7Y3Vyc29yOnBvaW50ZXJ9LmZjIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcnttYXJnaW46MDtwYWRkaW5nOjB9LmZjLXN0YXRlLWRlZmF1bHR7Ym9yZGVyOjFweCBzb2xpZDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjZmZmKSx0bygjZTZlNmU2KSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZmZiwjZTZlNmU2KTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtib3JkZXItY29sb3I6I2U2ZTZlNiAjZTZlNmU2ICNiZmJmYmY7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjI1KTtjb2xvcjojMzMzO3RleHQtc2hhZG93OjAgMXB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LC43NSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjIpLDAgMXB4IDJweCByZ2JhKDAsMCwwLC4wNSl9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLXJpZ2h0e2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LmZjIGJ1dHRvbiAuZmMtaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LS4wNWVtO21hcmdpbjowIC4yZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRpc2FibGVkLC5mYy1zdGF0ZS1kb3duLC5mYy1zdGF0ZS1ob3Zlcntjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNn0uZmMtc3RhdGUtaG92ZXJ7Y29sb3I6IzMzMzt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1cHg7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtcG9zaXRpb24gLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyO3RyYW5zaXRpb246YmFja2dyb3VuZC1wb3NpdGlvbiAuMXMgbGluZWFyfS5mYy1zdGF0ZS1hY3RpdmUsLmZjLXN0YXRlLWRvd257YmFja2dyb3VuZC1jb2xvcjojY2NjO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtib3gtc2hhZG93Omluc2V0IDAgMnB4IDRweCByZ2JhKDAsMCwwLC4xNSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA1KX0uZmMtc3RhdGUtZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1pbWFnZTpub25lO29wYWNpdHk6LjY1O2JveC1zaGFkb3c6bm9uZX0uZmMtZXZlbnQuZmMtZHJhZ2dhYmxlLC5mYy1ldmVudFtocmVmXSwuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSxhW2RhdGEtZ290b117Y3Vyc29yOnBvaW50ZXJ9LmZjIC5mYy1idXR0b24tZ3JvdXA+KntmbG9hdDpsZWZ0O21hcmdpbjowIDAgMCAtMXB4fS5mYyAuZmMtYnV0dG9uLWdyb3VwPjpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS5mYy1wb3BvdmVye3Bvc2l0aW9uOmFic29sdXRlO2JveC1zaGFkb3c6MCAycHggNnB4IHJnYmEoMCwwLDAsLjE1KX0uZmMtcG9wb3ZlciAuZmMtaGVhZGVye3BhZGRpbmc6MnB4IDRweH0uZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZXttYXJnaW46MCAycHh9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy10aXRsZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLWNsb3Nle2Zsb2F0OmxlZnR9LmZjLWx0ciAuZmMtcG9wb3ZlciAuZmMtaGVhZGVyIC5mYy1jbG9zZSwuZmMtcnRsIC5mYy1wb3BvdmVyIC5mYy1oZWFkZXIgLmZjLXRpdGxle2Zsb2F0OnJpZ2h0fS5mYy11bnRoZW1lZCAuZmMtcG9wb3Zlcntib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMtdW50aGVtZWQgLmZjLXBvcG92ZXIgLmZjLWhlYWRlciAuZmMtY2xvc2V7Zm9udC1zaXplOi45ZW07bWFyZ2luLXRvcDoycHh9LmZjLXBvcG92ZXI+LnVpLXdpZGdldC1oZWFkZXIrLnVpLXdpZGdldC1jb250ZW50e2JvcmRlci10b3A6MH0uZmMtZGl2aWRlcntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweH1oci5mYy1kaXZpZGVye2hlaWdodDowO21hcmdpbjowO3BhZGRpbmc6MCAwIDJweDtib3JkZXItd2lkdGg6MXB4IDB9LmZjLWJnIHRhYmxlLC5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b24gdGFibGUsLmZjLXJvdyAuZmMtaGlnaGxpZ2h0LXNrZWxldG9uIHRhYmxle2hlaWdodDoxMDAlfS5mYy1jbGVhcntjbGVhcjpib3RofS5mYy1iZywuZmMtYmdldmVudC1za2VsZXRvbiwuZmMtaGVscGVyLXNrZWxldG9uLC5mYy1oaWdobGlnaHQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjIHRhYmxle3dpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O3RhYmxlLWxheW91dDpmaXhlZDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtmb250LXNpemU6MWVtfS5mYyB0ZCwuZmMgdGh7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOnRvcH0uZmMgdGQuZmMtdG9kYXl7Ym9yZGVyLXN0eWxlOmRvdWJsZX1hW2RhdGEtZ290b106aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMgLmZjLXJvd3tib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LmZjLXJvdyB0YWJsZXtib3JkZXItbGVmdDowIGhpZGRlbiB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6MCBoaWRkZW4gdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTowIGhpZGRlbiB0cmFuc3BhcmVudH0uZmMtcm93OmZpcnN0LWNoaWxkIHRhYmxle2JvcmRlci10b3A6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXJvd3twb3NpdGlvbjpyZWxhdGl2ZX0uZmMtcm93IC5mYy1iZ3t6LWluZGV4OjF9LmZjLXJvdyAuZmMtYmdldmVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oaWdobGlnaHQtc2tlbGV0b24gdGR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1yb3cgLmZjLWJnZXZlbnQtc2tlbGV0b257ei1pbmRleDoyfS5mYy1yb3cgLmZjLWhpZ2hsaWdodC1za2VsZXRvbnt6LWluZGV4OjN9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjQ7cGFkZGluZy1ib3R0b206MnB4fS5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbnt6LWluZGV4OjV9LmZjLXJvdyAuZmMtY29udGVudC1za2VsZXRvbiB0ZCwuZmMtcm93IC5mYy1oZWxwZXItc2tlbGV0b24gdGR7YmFja2dyb3VuZDowIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MH0uZmMtcm93IC5mYy1jb250ZW50LXNrZWxldG9uIHRib2R5IHRkLC5mYy1yb3cgLmZjLWhlbHBlci1za2VsZXRvbiB0Ym9keSB0ZHtib3JkZXItdG9wOjB9LmZjLXNjcm9sbGVyey13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5mYy1yb3cuZmMtcmlnaWQsLmZjLXRpbWUtZ3JpZC1ldmVudHtvdmVyZmxvdzpoaWRkZW59LmZjLXNjcm9sbGVyPi5mYy1kYXktZ3JpZCwuZmMtc2Nyb2xsZXI+LmZjLXRpbWUtZ3JpZHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlfS5mYy1ldmVudHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTouODVlbTtsaW5lLWhlaWdodDoxLjM7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCAjM2E4N2FkO2ZvbnQtd2VpZ2h0OjQwMH0uZmMtZXZlbnQsLmZjLWV2ZW50LWRvdHtiYWNrZ3JvdW5kLWNvbG9yOiMzYTg3YWR9LmZjLWV2ZW50LC5mYy1ldmVudDpob3ZlciwudWktd2lkZ2V0IC5mYy1ldmVudHtjb2xvcjojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lfS5mYy1ub3QtYWxsb3dlZCwuZmMtbm90LWFsbG93ZWQgLmZjLWV2ZW50e2N1cnNvcjpub3QtYWxsb3dlZH0uZmMtZXZlbnQgLmZjLWJne3otaW5kZXg6MTtiYWNrZ3JvdW5kOiNmZmY7b3BhY2l0eTouMjV9LmZjLWV2ZW50IC5mYy1jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mn0uZmMtZXZlbnQgLmZjLXJlc2l6ZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo0O2Rpc3BsYXk6bm9uZX0uZmMtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyLC5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntkaXNwbGF5OmJsb2NrfS5mYy1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcjpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7dG9wOjUwJTtsZWZ0OjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O21hcmdpbi1sZWZ0Oi0yMHB4O21hcmdpbi10b3A6LTIwcHh9LmZjLWV2ZW50LmZjLXNlbGVjdGVke3otaW5kZXg6OTk5OSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDJweCA1cHggcmdiYSgwLDAsMCwuMil9LmZjLWV2ZW50LmZjLXNlbGVjdGVkLmZjLWRyYWdnaW5ne2JveC1zaGFkb3c6MCAycHggN3B4IHJnYmEoMCwwLDAsLjMpfS5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mzt0b3A6LTEwcHg7Ym90dG9tOi0xMHB4O2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LXN0YXJ0LC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtbm90LWVuZHttYXJnaW4tbGVmdDowO2JvcmRlci1sZWZ0LXdpZHRoOjA7cGFkZGluZy1sZWZ0OjFweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtbm90LWVuZCwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLW5vdC1zdGFydHttYXJnaW4tcmlnaHQ6MDtib3JkZXItcmlnaHQtd2lkdGg6MDtwYWRkaW5nLXJpZ2h0OjFweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LmZjLWx0ciAuZmMtaC1ldmVudCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50IC5mYy1lbmQtcmVzaXplcntjdXJzb3I6dy1yZXNpemU7bGVmdDotMXB4fS5mYy1sdHIgLmZjLWgtZXZlbnQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQgLmZjLXN0YXJ0LXJlc2l6ZXJ7Y3Vyc29yOmUtcmVzaXplO3JpZ2h0Oi0xcHh9LmZjLWgtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye3dpZHRoOjdweDt0b3A6LTFweDtib3R0b206LTFweH0uZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtcmVzaXplcntib3JkZXItcmFkaXVzOjRweDtib3JkZXItd2lkdGg6MXB4O3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOiNmZmY7dG9wOjUwJTttYXJnaW4tdG9wOi00cHh9LmZjLWx0ciAuZmMtaC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1oLWV2ZW50LmZjLXNlbGVjdGVkIC5mYy1lbmQtcmVzaXplcnttYXJnaW4tbGVmdDotNHB4fS5mYy1sdHIgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWVuZC1yZXNpemVyLC5mYy1ydGwgLmZjLWgtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi00cHh9LmZjLWRheS1ncmlkLWV2ZW50e21hcmdpbjoxcHggMnB4IDA7cGFkZGluZzowIDFweH10cjpmaXJzdC1jaGlsZD50ZD4uZmMtZGF5LWdyaWQtZXZlbnR7bWFyZ2luLXRvcDoycHh9LmZjLWRheS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVkOmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3RvcDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHg7bGVmdDotMXB4O2JhY2tncm91bmQ6IzAwMDtvcGFjaXR5Oi4yNX0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbn0uZmMtZGF5LWdyaWQtZXZlbnQgLmZjLXRpbWV7Zm9udC13ZWlnaHQ6NzAwfS5mYy1sdHIgLmZjLWRheS1ncmlkLWV2ZW50LmZjLWFsbG93LW1vdXNlLXJlc2l6ZSAuZmMtc3RhcnQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLWVuZC1yZXNpemVye21hcmdpbi1sZWZ0Oi0ycHh9LmZjLWx0ciAuZmMtZGF5LWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1lbmQtcmVzaXplciwuZmMtcnRsIC5mYy1kYXktZ3JpZC1ldmVudC5mYy1hbGxvdy1tb3VzZS1yZXNpemUgLmZjLXN0YXJ0LXJlc2l6ZXJ7bWFyZ2luLXJpZ2h0Oi0ycHh9YS5mYy1tb3Jle21hcmdpbjoxcHggM3B4O2ZvbnQtc2l6ZTouODVlbTtjdXJzb3I6cG9pbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZX1hLmZjLW1vcmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMtbGltaXRlZHtkaXNwbGF5Om5vbmV9LmZjLWRheS1ncmlkIC5mYy1yb3d7ei1pbmRleDoxfS5mYy1tb3JlLXBvcG92ZXJ7ei1pbmRleDoyO3dpZHRoOjIyMHB4fS5mYy1tb3JlLXBvcG92ZXIgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nOjEwcHh9LmZjLW5vdy1pbmRpY2F0b3J7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjAgc29saWQgcmVkfS5mYy11bnNlbGVjdGFibGV7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uZmMtdG9vbGJhcnttYXJnaW4tYm90dG9tOjFlbX0uZmMtdG9vbGJhciAuZmMtbGVmdHtmbG9hdDpsZWZ0fS5mYy10b29sYmFyIC5mYy1yaWdodHtmbG9hdDpyaWdodH0uZmMtdG9vbGJhciAuZmMtY2VudGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYyAuZmMtdG9vbGJhcj4qPip7ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDouNzVlbX0uZmMgLmZjLXRvb2xiYXI+Kj46Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0uZmMtdG9vbGJhciBoMnttYXJnaW46MH0uZmMtdG9vbGJhciBidXR0b257cG9zaXRpb246cmVsYXRpdmV9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWhvdmVyLC5mYy10b29sYmFyIC51aS1zdGF0ZS1ob3Zlcnt6LWluZGV4OjJ9LmZjLXRvb2xiYXIgLmZjLXN0YXRlLWRvd257ei1pbmRleDozfS5mYy10b29sYmFyIC5mYy1zdGF0ZS1hY3RpdmUsLmZjLXRvb2xiYXIgLnVpLXN0YXRlLWFjdGl2ZXt6LWluZGV4OjR9LmZjLXRvb2xiYXIgYnV0dG9uOmZvY3Vze3otaW5kZXg6NX0uZmMtdmlldy1jb250YWluZXIgKiwuZmMtdmlldy1jb250YWluZXIgOmFmdGVyLC5mYy12aWV3LWNvbnRhaW5lciA6YmVmb3Jley13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveH0uZmMtdmlldywuZmMtdmlldz50YWJsZXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLWJhc2ljRGF5LXZpZXcgLmZjLWNvbnRlbnQtc2tlbGV0b24sLmZjLWJhc2ljV2Vlay12aWV3IC5mYy1jb250ZW50LXNrZWxldG9ue3BhZGRpbmctYm90dG9tOjFlbX0uZmMtYmFzaWMtdmlldyAuZmMtYm9keSAuZmMtcm93e21pbi1oZWlnaHQ6NGVtfS5mYy1yb3cuZmMtcmlnaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3JpZ2h0OjB9LmZjLWRheS10b3AuZmMtb3RoZXItbW9udGh7b3BhY2l0eTouM30uZmMtYmFzaWMtdmlldyAuZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyAuZmMtd2Vlay1udW1iZXJ7cGFkZGluZzoycHh9LmZjLWJhc2ljLXZpZXcgdGguZmMtZGF5LW51bWJlciwuZmMtYmFzaWMtdmlldyB0aC5mYy13ZWVrLW51bWJlcntwYWRkaW5nOjAgMnB4fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLWRheS1udW1iZXJ7ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtYmFzaWMtdmlldyAuZmMtZGF5LXRvcCAuZmMtZGF5LW51bWJlcntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OmxlZnQ7Ym9yZGVyLXJhZGl1czowIDAgM3B4fS5mYy1ydGwgLmZjLWJhc2ljLXZpZXcgLmZjLWRheS10b3AgLmZjLXdlZWstbnVtYmVye2Zsb2F0OnJpZ2h0O2JvcmRlci1yYWRpdXM6MCAwIDAgM3B4fS5mYy1iYXNpYy12aWV3IC5mYy1kYXktdG9wIC5mYy13ZWVrLW51bWJlcnttaW4td2lkdGg6MS41ZW07dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyO2NvbG9yOmdyZXl9LmZjLWJhc2ljLXZpZXcgdGQuZmMtd2Vlay1udW1iZXI+KntkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6MS4yNWVtfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy1hZ2VuZGEtdmlldyAuZmMtZGF5LWdyaWQgLmZjLXJvd3ttaW4taGVpZ2h0OjNlbX0uZmMtYWdlbmRhLXZpZXcgLmZjLWRheS1ncmlkIC5mYy1yb3cgLmZjLWNvbnRlbnQtc2tlbGV0b257cGFkZGluZy1ib3R0b206MWVtfS5mYyAuZmMtYXhpc3t2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZzowIDRweDt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLWx0ciAuZmMtYXhpc3t0ZXh0LWFsaWduOnJpZ2h0fS5mYy1ydGwgLmZjLWF4aXN7dGV4dC1hbGlnbjpsZWZ0fS51aS13aWRnZXQgdGQuZmMtYXhpc3tmb250LXdlaWdodDo0MDB9LmZjLXRpbWUtZ3JpZCwuZmMtdGltZS1ncmlkLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZHttaW4taGVpZ2h0OjEwMCV9LmZjLXRpbWUtZ3JpZCB0YWJsZXtib3JkZXI6MCBoaWRkZW4gdHJhbnNwYXJlbnR9LmZjLXRpbWUtZ3JpZD4uZmMtYmd7ei1pbmRleDoxfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzLC5mYy10aW1lLWdyaWQ+aHJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtY29se3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWNvbnRlbnQtc2tlbGV0b257cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLWJ1c2luZXNzLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXRpbWUtZ3JpZCAuZmMtYmdldmVudC1jb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy10aW1lLWdyaWQgLmZjLWhpZ2hsaWdodC1jb250YWluZXJ7ei1pbmRleDozO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjR9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le3otaW5kZXg6NX0uZmMtdGltZS1ncmlkIC5mYy1oZWxwZXItY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Nn0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyB0ZHtoZWlnaHQ6MS41ZW07Ym9yZGVyLWJvdHRvbTowfS5mYy10aW1lLWdyaWQgLmZjLXNsYXRzIC5mYy1taW5vciB0ZHtib3JkZXItdG9wLXN0eWxlOmRvdHRlZH0uZmMtdGltZS1ncmlkIC5mYy1zbGF0cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtZ3JpZCAuZmMtaGlnaGxpZ2h0e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtyaWdodDowfS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtZXZlbnQtY29udGFpbmVye21hcmdpbjowIDIuNSUgMCAycHh9LmZjLXJ0bCAuZmMtdGltZS1ncmlkIC5mYy1ldmVudC1jb250YWluZXJ7bWFyZ2luOjAgMnB4IDAgMi41JX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50LC5mYy10aW1lLWdyaWQgLmZjLWV2ZW50e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MX0uZmMtdGltZS1ncmlkIC5mYy1iZ2V2ZW50e2xlZnQ6MDtyaWdodDowfS5mYy12LWV2ZW50LmZjLW5vdC1zdGFydHtib3JkZXItdG9wLXdpZHRoOjA7cGFkZGluZy10b3A6MXB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5mYy12LWV2ZW50LmZjLW5vdC1lbmR7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmctYm90dG9tOjFweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNlbGVjdGVke292ZXJmbG93OnZpc2libGV9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zZWxlY3RlZCAuZmMtYmd7ZGlzcGxheTpub25lfS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLWNvbnRlbnR7b3ZlcmZsb3c6aGlkZGVufS5mYy10aW1lLWdyaWQtZXZlbnQgLmZjLXRpbWUsLmZjLXRpbWUtZ3JpZC1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZS1ncmlkLWV2ZW50IC5mYy10aW1le2ZvbnQtc2l6ZTouODVlbTt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSwuZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZSBzcGFue2Rpc3BsYXk6bm9uZX0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aW1lOmJlZm9yZXtjb250ZW50OmF0dHIoZGF0YS1zdGFydCl9LmZjLXRpbWUtZ3JpZC1ldmVudC5mYy1zaG9ydCAuZmMtdGltZTphZnRlcntjb250ZW50OiJcMDAwQTAtXDAwMEEwIn0uZmMtdGltZS1ncmlkLWV2ZW50LmZjLXNob3J0IC5mYy10aXRsZXtmb250LXNpemU6Ljg1ZW07cGFkZGluZzowfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVye2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2hlaWdodDo4cHg7b3ZlcmZsb3c6aGlkZGVuO2xpbmUtaGVpZ2h0OjhweDtmb250LXNpemU6MTFweDtmb250LWZhbWlseTptb25vc3BhY2U7dGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnMtcmVzaXplfS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtYWxsb3ctbW91c2UtcmVzaXplIC5mYy1yZXNpemVyOmFmdGVye2NvbnRlbnQ6Ij0ifS5mYy10aW1lLWdyaWQtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLXJlc2l6ZXJ7Ym9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXdpZHRoOjFweDt3aWR0aDo4cHg7aGVpZ2h0OjhweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDojZmZmO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi01cHg7Ym90dG9tOi01cHh9LmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1saW5le2JvcmRlci10b3Atd2lkdGg6MXB4O2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWdyaWQgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3d7bWFyZ2luLXRvcDotNXB4fS5mYy1sdHIgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tsZWZ0OjA7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA2cHg7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50fS5mYy1ydGwgLmZjLXRpbWUtZ3JpZCAuZmMtbm93LWluZGljYXRvci1hcnJvd3tyaWdodDowO2JvcmRlci13aWR0aDo1cHggNnB4IDVweCAwO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudH0uZmMtZXZlbnQtZG90e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHg7Ym9yZGVyLXJhZGl1czo1cHh9LmZjLXJ0bCAuZmMtbGlzdC12aWV3e2RpcmVjdGlvbjpydGx9LmZjLWxpc3Qtdmlld3tib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZH0uZmMgLmZjLWxpc3QtdGFibGV7dGFibGUtbGF5b3V0OmF1dG99LmZjLWxpc3QtdGFibGUgdGR7Ym9yZGVyLXdpZHRoOjFweCAwIDA7cGFkZGluZzo4cHggMTRweH0uZmMtbGlzdC10YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wLXdpZHRoOjB9LmZjLWxpc3QtaGVhZGluZ3tib3JkZXItYm90dG9tLXdpZHRoOjFweH0uZmMtbGlzdC1oZWFkaW5nIHRke2ZvbnQtd2VpZ2h0OjcwMH0uZmMtbHRyIC5mYy1saXN0LWhlYWRpbmctbWFpbntmbG9hdDpsZWZ0fS5mYy1sdHIgLmZjLWxpc3QtaGVhZGluZy1hbHQsLmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLW1haW57ZmxvYXQ6cmlnaHR9LmZjLXJ0bCAuZmMtbGlzdC1oZWFkaW5nLWFsdHtmbG9hdDpsZWZ0fS5mYy1saXN0LWl0ZW0uZmMtaGFzLXVybHtjdXJzb3I6cG9pbnRlcn0uZmMtbGlzdC1pdGVtOmhvdmVyIHRke2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0uZmMtbGlzdC1pdGVtLW1hcmtlciwuZmMtbGlzdC1pdGVtLXRpbWV7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjFweH0uZmMtbHRyIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctcmlnaHQ6MH0uZmMtcnRsIC5mYy1saXN0LWl0ZW0tbWFya2Vye3BhZGRpbmctbGVmdDowfS5mYy1saXN0LWl0ZW0tdGl0bGUgYXt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjppbmhlcml0fS5mYy1saXN0LWl0ZW0tdGl0bGUgYVtocmVmXTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5mYy1saXN0LWVtcHR5LXdyYXAye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowfS5mYy1saXN0LWVtcHR5LXdyYXAxe3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTp0YWJsZX0uZmMtbGlzdC1lbXB0eXtkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyfS5mYy11bnRoZW1lZCAuZmMtbGlzdC1lbXB0eXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwoKLyogVE9ETzogYnJlYWsgdGhpcyBmaWxlIHVwICovCgovKiBTY3JvbGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtc2Nyb2xsZXItY2xpcCB7CglvdmVyZmxvdzogaGlkZGVuOyAvKiBmb3IgY2xpcHBpbmcgc2Nyb2xsYmFycyAqLwoJcG9zaXRpb246IHJlbGF0aXZlOyAvKiBzbyB0aGluZ3MgbGlrZSBzY3JvbGxmb2xsb3dlcnMgY2FuIGF0dGFjaCB0byB0aGlzICovCn0KCi8qIHN1cHJlc3NlcyByZW5kZXJpbmcgb2YgbmF0aXZlIHNjcm9sbGJhcnMgKi8KLyogb24gLmZjLXNjcm9sbGVyICovCi5mYy1uby1zY3JvbGxiYXJzIHsKCWJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMCk7IC8qIGhhY2sgZm9yIGR5bmFtaWMgRE9NIG5vZGVzIChpbiBDaHJvbWUgT1NYIGF0IGxlYXN0KSAqLwp9Ci5mYy1uby1zY3JvbGxiYXJzOjotd2Via2l0LXNjcm9sbGJhciB7Cgl3aWR0aDogMDsKCWhlaWdodDogMDsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgYmcgKi8KCWJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIHNvIHRoYXQgcGFkZGluZyAoZm9yIGd1dHRlcikgd2lsbCBiZSBwYXJ0IG9mIGhlaWdodCAqLwoJbWluLWhlaWdodDogMTAwJTsKfQoKLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1iZyB7Cgl6LWluZGV4OiAxOyAvKiBtYWtlIGRlZmF1bHQ/ICovCn0KCi5mYy1zY3JvbGxlci1jYW52YXMgPiAuZmMtY29udGVudCB7Cgl6LWluZGV4OiAyOyAvKiBtYWtlIGRlZmF1bHQ/ICovCglwb3NpdGlvbjogcmVsYXRpdmU7IC8qIG9yaWdpbiBmb3IgaW5uZXIgY29udGVudCAqLwoJYm9yZGVyLXN0eWxlOiBzb2xpZDsKCWJvcmRlci13aWR0aDogMDsKfQoKLyogZm9yIHRoZW1lZCwgaGFyZCB0byBnZXQgdGhlIGJvcmRlci1jb2xvciwgc28ganVzdCBmb3JnZXQgaXQgKFJFVklTSVQpICovCi51aS13aWRnZXQgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IC5mYy1jb250ZW50IHsKCWJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWxlZnQgPiAuZmMtY29udGVudCB7IGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7IG1hcmdpbi1sZWZ0OiAtMXB4IH0KLmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItcmlnaHQgPiAuZmMtY29udGVudCB7IGJvcmRlci1yaWdodC13aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHggfQouZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci10b3AgPiAuZmMtY29udGVudCB7IGJvcmRlci10b3Atd2lkdGg6IDFweDsgbWFyZ2luLXRvcDogLTFweCB9Ci5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLWJvdHRvbSA+IC5mYy1jb250ZW50IHsgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OyBtYXJnaW4tYm90dG9tOiAtMXB4IH0KCgovKiBWaWV3IFN0cnVjdHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcnRsIC5mYy10aW1lbGluZSB7CglkaXJlY3Rpb246IHJ0bDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVyIHsKCXdpZHRoOiAzcHg7Cglib3JkZXItc3R5bGU6IGRvdWJsZTsgLyogb3ZlcmNvbWUgbmVpZ2hib3JpbmcgYm9yZGVycyAqLwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgPiB0ciA+IC5mYy1kaXZpZGVyIHsKCWJvcmRlci1ib3R0b206IDA7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSA+IHRyID4gLmZjLWRpdmlkZXIgewoJYm9yZGVyLXRvcDogMDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQoKLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cgl6LWluZGV4OiAyOyAvKiBzbyBkcm9wIHNoYWRvdyB3aWxsIGdvIGFib3ZlIGJvZHkgcGFuZXMgKi8KfQoKLmZjLXRpbWVsaW5lLmZjLXNjcm9sbGVkIC5mYy1oZWFkIC5mYy1zY3JvbGxlciB7Cglib3gtc2hhZG93OiAwIDNweCA0cHggcmdiYSgwLDAsMCwwLjA3NSk7Cn0KCi5mYy10aW1lbGluZSAuZmMtYm9keSAuZmMtc2Nyb2xsZXIgewoJei1pbmRleDogMTsKfQoKLyoKb24gYWxsIHRhYmxlcyB0aGF0IGV4cGFuZCB0byB0aGUgZWRnZXMsIGtpbGwgdGhlIG91dGVyIGJvcmRlciwKYmVjYXVzZSB0aGUgY29udGFpbmVyIGVsZW1lbnRzIHRha2UgY2FyZSBvZiBpdAoqLwouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IHRhYmxlLAouZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcyA+IGRpdiA+IGRpdiA+IHRhYmxlIHsKCWJvcmRlci1zdHlsZTogaGlkZGVuOwp9CgoKLyogVGFibGUgQ2VsbCBDb21tb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIHRoLAouZmMtdGltZWxpbmUgdGQgewoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLWNvbnRlbnQgewoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi5mYy10aW1lbGluZSAuZmMtY29sLXJlc2l6ZXIgewoJY3Vyc29yOiBjb2wtcmVzaXplOwp9CgovKgpDZWxscyBhdCB0aGUgc3RhcnQgb2YgYSB3ZWVrClRPRE86IGZpZ3VyZSBvdXQgYmV0dGVyIHN0eWxpbmcKCi5mYy1sdHIgLmZjLXRpbWVsaW5lIC5mYy1lbS1jZWxsIGRpdiB7Cglib3JkZXItbGVmdDogM3B4IHNvbGlkICNlZWU7CgloZWlnaHQ6IDEwMCU7Cn0KLmZjLXJ0bCAuZmMtdGltZWxpbmUgLmZjLWVtLWNlbGwgewoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7Cn0KKi8KCi8qIGhlYWQgKi8KCi5mYy10aW1lbGluZSB0aCB7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgouZmMtdGltZWxpbmUgLmZjLWhlYWQgLmZjLWNlbGwtY29udGVudCB7CglwYWRkaW5nLXRvcDogM3B4OwoJcGFkZGluZy1ib3R0b206IDNweDsKfQoKLyogYm9keSAqLwoKLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudCB7CgliYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9CgoKLyogUmVzb3VyY2UgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtcmVzb3VyY2UtYXJlYSB7Cgl3aWR0aDogMzAlOwp9CgouZmMtcmVzb3VyY2UtYXJlYSBjb2wgewoJd2lkdGg6IDQwJTsKCW1pbi13aWR0aDogNzBweDsgLyogd2lsbCBiZSByZWFkIGJ5IEpTICovCn0KCi5mYy1yZXNvdXJjZS1hcmVhIGNvbC5mYy1tYWluLWNvbCB7Cgl3aWR0aDogNjAlOyAvKiBtYWtlIHRoZSBmaXJzdCBjb2x1bW4gaW4gYSBuZXN0ZWQgc2V0dXAgYmlnZ2VyICovCn0KCgouZmMtZmxhdCAuZmMtZXhwYW5kZXItc3BhY2UgeyAvKiBmYy1mbGF0IGlzIG9wcG9zaXRlIG9mIGZjLW5lc3RlZCAqLwoJZGlzcGxheTogbm9uZTsKfQoKCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdHIgPiAqIHsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0ciA+ICogewoJdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQgewoJcGFkZGluZy1sZWZ0OiA0cHg7CglwYWRkaW5nLXJpZ2h0OiA0cHg7Cn0KCi8qIGhlYWQgKi8KCi5mYy1yZXNvdXJjZS1hcmVhIC5mYy1zdXBlciB0aCB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5mYy1yZXNvdXJjZS1hcmVhIHRoID4gZGl2IHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwp9CgouZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMjsKCXRvcDogMDsKCWJvdHRvbTogMDsKCXdpZHRoOiA1cHg7Cn0KCi5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCXJpZ2h0OiAtM3B4Owp9Ci5mYy1ydGwgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyIHsKCWxlZnQ6IC0zcHg7Cn0KCi8qIGJvZHkgKi8KCnRyLmZjLWNvbGxhcHNlZCA+IHRkLCAvKiBiZWZvcmUgdGhlIHRyYW5zaXRpb24gKHByZXZlbnRzIGluaXRpYWwgZmxpY2tlcikgKi8KdHIuZmMtdHJhbnNpdGlvbmluZyA+IHRkIHsgLyogZHVyaW5nIHRoZSB0cmFuc2l0aW9uICovCglvdmVyZmxvdzogaGlkZGVuOyAvKiBwcmV2ZW50cyBhYnNvbHV0ZWx5LXBvc2l0aW9uZWQgZXZlbnRzIGZyb20gYmxlZWRpbmcgb3V0ICovCn0KCnRyLmZjLXRyYW5zaXRpb25pbmcgPiB0ZCA+IGRpdiB7Cgl0cmFuc2l0aW9uOiBtYXJnaW4tdG9wIDAuMnM7Cn0KCnRyLmZjLWNvbGxhcHNlZCA+IHRkID4gZGl2IHsKCW1hcmdpbi10b3A6IC0xMHB4Owp9CgoKLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogOHB4OwoJcGFkZGluZy1ib3R0b206IDhweDsKfQoKLmZjLW5vLW92ZXJsYXAgLmZjLWJvZHkgLmZjLXJlc291cmNlLWFyZWEgLmZjLWNlbGwtY29udGVudCB7IC8qIG1pZ2h0IEJFIHRoZSBjZWxsICovCglwYWRkaW5nLXRvcDogNXB4OwoJcGFkZGluZy1ib3R0b206IDVweDsKfQoKLmZjLXJlc291cmNlLWFyZWEgLmZjLWljb24geyAvKiB0aGUgZXhwYW5kZXIgYW5kIHNwYWNlcnMgYmVmb3JlIHRoZSBleHBhbmRlciAqLwoJd2lkdGg6IDFlbTsgLyogZW5zdXJlIGNvbnN0YW50IHdpZHRoLCBlc3AgZm9yIGVtcHR5IGljb25zICovCglmb250LXNpemU6IC45ZW07Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJbWFyZ2luLXRvcDogLTElOwp9CgouZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXIgewoJY3Vyc29yOiBwb2ludGVyOwoJY29sb3I6ICM2NjY7IC8qIGZvciB0aGUgaWNvbiB3aXRoaW4gKi8KfQoKCi8qIFRpbWUgQXJlYQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouZmMtdGltZS1hcmVhIGNvbCB7CgltaW4td2lkdGg6IDIuMmVtOyAvKiBkZXRlY3RlZCBieSBKUyAqLwp9CgovKiBoZWFkICovCgouZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLWNocm9ubyB0aCB7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoIHsKCXRleHQtYWxpZ246IHJpZ2h0Owp9CgovKiBib2R5IHNsYXRzICh2ZXJ0aWNhbCBsaW5lcykgKi8KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHsgLyogZmMtYmcgaXMgcmVzcG9uc2libGUgZm9yIGEgbG90IG9mIHRoaXMgbm93ISAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMTsKCXRvcDogMDsKCWxlZnQ6IDA7CglyaWdodDogMDsKCWJvdHRvbTogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGFibGUgewoJaGVpZ2h0OiAxMDAlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1zbGF0cyAuZmMtbWlub3IgewoJYm9yZGVyLXN0eWxlOiBkb3R0ZWQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRkIHsKCWJvcmRlci13aWR0aDogMCAxcHg7IC8qIG5lZWQgdG8gZG8gdGhpcy4gc29tZXRpbWVzIC0xIG1hcmdpbiB3b3VsZG4ndCBoaWRlIHRoZSBkb3R0ZWQgKi8KfQoKLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItcmlnaHQtd2lkdGg6IDA7Cn0KLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1zbGF0cyB0ZCB7Cglib3JkZXItbGVmdC13aWR0aDogMDsKfQoKLyogYm9keSBjb250ZW50IGNvbnRhaW5lcnMKICAgY2FuIGJlIHdpdGhpbiByb3dzIG9yIGRpcmVjdGx5IHdpdGhpbiB0aGUgcGFuZSdzIGNvbnRlbnQKKi8KCi5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQtY29udGFpbmVyLAouZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVyIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDI7IC8qIG9ubHkgZm9yIGRpcmVjdGx5IHdpdGhpbiBwYW5lLiBub3QgZm9yIHJvdy4gb3ZlcnJpZGRlbiBsYXRlciAqLwoJdG9wOiAwOwoJYm90dG9tOiAwOwoJd2lkdGg6IDA7Cn0KCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglsZWZ0OiAwOwp9Ci5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGVscGVyLWNvbnRhaW5lciwgLyogb25seSB3aXRoaW4gcm93ICovCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsCi5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7CglyaWdodDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudCwKLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWJvdHRvbTogMDsKfQoKLyogYm9keSByZXNvdXJjZSByb3dzICovCgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXotaW5kZXg6IDM7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgLnVpLXdpZGdldC1jb250ZW50IHsKCWJhY2tncm91bmQ6IG5vbmU7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLXJvd3MgdGQgPiBkaXYgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZmMtdGltZS1hcmVhIC5mYy1yb3dzIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwKLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciB7Cgl6LWluZGV4OiAxOwp9CgouZmMtdGltZS1hcmVhIC5mYy1ldmVudC1jb250YWluZXIgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMjsgLyogYWJvdmUgYmdldmVudCBhbmQgaGlnaGxpZ2h0ICovCgl3aWR0aDogMDsgLyogZm9yIGV2ZW50IHBvc2l0aW9uaW5nLiB3aWxsIGVuZCB1cCBvbiBjb3JyZWN0IHNpZGUgYmFzZWQgb24gZGlyICovCn0KCi5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIgeyAvKiBhbHNvIGFuIGZjLWV2ZW50LWNvbnRhaW5lciAqLwoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogMzsKCXRvcDogMDsKfQoKLmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVyIHsKCXBhZGRpbmctYm90dG9tOiA4cHg7Cgl0b3A6IC0xcHg7Cn0KCi5mYy10aW1lLWFyZWEgdHI6Zmlyc3QtY2hpbGQgLmZjLWV2ZW50LWNvbnRhaW5lciB7Cgl0b3A6IDA7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lciB7CglwYWRkaW5nLWJvdHRvbTogMDsKCXRvcDogMDsKfQoKCi8qIE5vdyBJbmRpY2F0b3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLmZjLXRpbWVsaW5lIC5mYy1ub3ctaW5kaWNhdG9yIHsgLyogYm90aCB0aGUgYXJyb3cgYW5kIHRoZSBsaW5lICovCgl6LWluZGV4OiAzOyAvKiBvbmUgYWJvdmUgc2Nyb2xsZXIncyBmYy1jb250ZW50ICovCgl0b3A6IDA7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItYXJyb3cgewoJbWFyZ2luOiAwIC02cHg7IC8qIDUsIHRoZW4gb25lIG1vcmUgdG8gY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCS8qIHRyaWFuZ2xlIHBvaW50aW5nIGRvd24uLi4gKi8KCWJvcmRlci13aWR0aDogNnB4IDVweCAwIDVweDsKCWJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCWJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZSB7CgltYXJnaW46IDAgLTFweDsgLyogY291bnRlcmFjdCBzY3JvbGxlcidzIG5lZ2F0aXZlIG1hcmdpbnMgKi8KCWJvdHRvbTogMDsKCWJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7Cn0KCgovKiBUaW1lIEdyaWQgRXZlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy10aW1lbGluZS1ldmVudCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3JkZXItcmFkaXVzOiAwOwoJcGFkZGluZzogMnB4IDA7CgltYXJnaW4tYm90dG9tOiAxcHg7Cn0KCi5mYy1uby1vdmVybGFwIC5mYy10aW1lbGluZS1ldmVudCB7CglwYWRkaW5nOiA1cHggMDsKCW1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIGRvbid0IG92ZXJsYXAgZ3JpZCBsaW5lcyBhdCB0aGUgZXZlbnQncyBlbmQgKi8KLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQgeyBtYXJnaW4tcmlnaHQ6IDFweCB9Ci5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IHsgbWFyZ2luLWxlZnQ6IDFweCB9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLWNvbnRlbnQgewoJcGFkZGluZzogMCAxcHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJcGFkZGluZzogMCAxcHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1lIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsgLyogd2lsbCBmb3JjZSBpdCBvbiB0aGUgb3RoZXIgc2lkZSAqLwp9CgouZmMtdGltZWxpbmUtZXZlbnQgLmZjLXRpdGxlIHsKCXBhZGRpbmc6IDAgMXB4Owp9CgouZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJnIHsKCWRpc3BsYXk6IG5vbmU7IC8qIGhpZGUgc2VtaS13aGl0ZSBiYWNrZ3JvdW5kLCB0byBhcHBlYXIgZGFya2VyICovCn0KCgovKiBmb2xsb3dlciBsb2dpYyAqLwoKCi5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aXRsZSB7CglwYWRkaW5nLWxlZnQ6IDEwcHg7CgltYXJnaW4tbGVmdDogLThweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGUgewoJcGFkZGluZy1yaWdodDogMTBweDsKCW1hcmdpbi1yaWdodDogLThweDsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZSB7CgltYXJnaW4tbGVmdDogLTJweDsKfQouZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlIHsKCW1hcmdpbi1yaWdodDogLTJweDsKfQoKLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGUsCi5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZyB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZSwKLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIGdlbmVyaWMgYXJyb3cgKi8KCWNvbnRlbnQ6ICIiOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtNXB4OwoJYm9yZGVyOiA1cHggc29saWQgIzAwMDsKCWJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwoJYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CglvcGFjaXR5OiAuNTsKfQoKLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmUsCi5mYy1sdHIgLmZjLWJvZHkgLmZjLXRpbWUtYXJlYSAuZmMtZm9sbG93aW5nOmJlZm9yZSB7IC8qIExUUi4gbGVmdCBwb2ludGluZyBhcnJvdyAqLwoJYm9yZGVyLWxlZnQ6IDA7CglsZWZ0OiAycHg7Cn0KCi5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGU6YmVmb3JlLAouZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUgeyAvKiBSVEwuIHJpZ2h0IHBvaW50aW5nIGFycm93ICovCglib3JkZXItcmlnaHQ6IDA7CglyaWdodDogMnB4Owp9CgoKLyogTGljZW5zZSBNZXNzYWdlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi5mYy1saWNlbnNlLW1lc3NhZ2UgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTk7Cglib3R0b206IDFweDsKCWxlZnQ6IDFweDsKCWJhY2tncm91bmQ6ICNlZWU7Cglib3JkZXItY29sb3I6ICNkZGQ7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsKCXBhZGRpbmc6IDJweCA0cHg7Cglmb250LXNpemU6IDEycHg7Cglib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogM3B4Owp9Cg==
LyohCiAqIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCiAqIERvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KICogKGMpIDIwMTYgQWRhbSBTaGF3CiAqLy5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnQsLmZjLXRpbWVsaW5lIC5mYy1jZWxsLXRleHR7cGFkZGluZy1sZWZ0OjRweDtwYWRkaW5nLXJpZ2h0OjRweH0uZmMtcmVzb3VyY2UtYXJlYSB0aD5kaXYsLmZjLXNjcm9sbGVyLWNhbnZhcywuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50LC5mYy1zY3JvbGxlci1jbGlwe3Bvc2l0aW9uOnJlbGF0aXZlfS5mYy1zY3JvbGxlci1jbGlwLC5mYy10aW1lbGluZSAuZmMtY2VsbC1jb250ZW50LHRyLmZjLWNvbGxhcHNlZD50ZCx0ci5mYy10cmFuc2l0aW9uaW5nPnRke292ZXJmbG93OmhpZGRlbn0uZmMtbm8tc2Nyb2xsYmFyc3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMCl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1kaXZpZGVyLnVpLXdpZGdldC1oZWFkZXIsLmZjLXRpbWVsaW5lIC5mYy1ib2R5IC51aS13aWRnZXQtY29udGVudHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmZjLW5vLXNjcm9sbGJhcnM6Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjA7aGVpZ2h0OjB9LmZjLXNjcm9sbGVyLWNhbnZhc3tib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLWhlaWdodDoxMDAlfS5mYy1zY3JvbGxlci1jYW52YXM+LmZjLWJne3otaW5kZXg6MX0uZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e3otaW5kZXg6Mjtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjB9LnVpLXdpZGdldCAuZmMtc2Nyb2xsZXItY2FudmFzPi5mYy1jb250ZW50e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1sZWZ0Pi5mYy1jb250ZW50e2JvcmRlci1sZWZ0LXdpZHRoOjFweDttYXJnaW4tbGVmdDotMXB4fS5mYy1zY3JvbGxlci1jYW52YXMuZmMtZ3V0dGVyLXJpZ2h0Pi5mYy1jb250ZW50e2JvcmRlci1yaWdodC13aWR0aDoxcHg7bWFyZ2luLXJpZ2h0Oi0xcHh9LmZjLXNjcm9sbGVyLWNhbnZhcy5mYy1ndXR0ZXItdG9wPi5mYy1jb250ZW50e2JvcmRlci10b3Atd2lkdGg6MXB4O21hcmdpbi10b3A6LTFweH0uZmMtc2Nyb2xsZXItY2FudmFzLmZjLWd1dHRlci1ib3R0b20+LmZjLWNvbnRlbnR7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7bWFyZ2luLWJvdHRvbTotMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5le2RpcmVjdGlvbjpydGx9LmZjLXRpbWVsaW5lIC5mYy1kaXZpZGVye3dpZHRoOjNweDtib3JkZXItc3R5bGU6ZG91YmxlfS5mYy10aW1lbGluZSAuZmMtaGVhZD50cj4uZmMtZGl2aWRlcntib3JkZXItYm90dG9tOjB9LmZjLXRpbWVsaW5lIC5mYy1ib2R5PnRyPi5mYy1kaXZpZGVye2JvcmRlci10b3A6MH0uZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye3otaW5kZXg6Mn0uZmMtdGltZWxpbmUuZmMtc2Nyb2xsZWQgLmZjLWhlYWQgLmZjLXNjcm9sbGVye2JveC1zaGFkb3c6MCAzcHggNHB4IHJnYmEoMCwwLDAsLjA3NSl9LmZjLXRpbWVsaW5lIC5mYy1ib2R5IC5mYy1zY3JvbGxlcnt6LWluZGV4OjF9LmZjLXRpbWVsaW5lIC5mYy1zY3JvbGxlci1jYW52YXM+ZGl2PmRpdj50YWJsZSwuZmMtdGltZWxpbmUgLmZjLXNjcm9sbGVyLWNhbnZhcz5kaXY+dGFibGV7Ym9yZGVyLXN0eWxlOmhpZGRlbn0uZmMtdGltZWxpbmUgdGQsLmZjLXRpbWVsaW5lIHRoe3doaXRlLXNwYWNlOm5vd3JhcH0uZmMtdGltZWxpbmUgLmZjLWNvbC1yZXNpemVye2N1cnNvcjpjb2wtcmVzaXplfS5mYy10aW1lbGluZSB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZjLXRpbWVsaW5lIC5mYy1oZWFkIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6M3B4O3BhZGRpbmctYm90dG9tOjNweH0uZmMtcmVzb3VyY2UtYXJlYXt3aWR0aDozMCV9LmZjLXJlc291cmNlLWFyZWEgY29se3dpZHRoOjQwJTttaW4td2lkdGg6NzBweH0uZmMtcmVzb3VyY2UtYXJlYSBjb2wuZmMtbWFpbi1jb2x7d2lkdGg6NjAlfS5mYy1mbGF0IC5mYy1leHBhbmRlci1zcGFjZXtkaXNwbGF5Om5vbmV9LmZjLWx0ciAuZmMtcmVzb3VyY2UtYXJlYSB0cj4qe3RleHQtYWxpZ246bGVmdH0uZmMtcnRsIC5mYy1yZXNvdXJjZS1hcmVhIHRyPip7dGV4dC1hbGlnbjpyaWdodH0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtc3VwZXIgdGh7dGV4dC1hbGlnbjpjZW50ZXJ9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNlbGwtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9LmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVyLC5mYy10aW1lLWFyZWEgLmZjLWJnZXZlbnQsLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LC5mYy10aW1lLWFyZWEgLmZjLXNsYXRze3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowfS5mYy1yZXNvdXJjZS1hcmVhIHRoIC5mYy1jb2wtcmVzaXplcnt6LWluZGV4OjI7d2lkdGg6NXB4fS5mYy1sdHIgLmZjLXJlc291cmNlLWFyZWEgdGggLmZjLWNvbC1yZXNpemVye3JpZ2h0Oi0zcHh9LmZjLXJ0bCAuZmMtcmVzb3VyY2UtYXJlYSB0aCAuZmMtY29sLXJlc2l6ZXJ7bGVmdDotM3B4fXRyLmZjLXRyYW5zaXRpb25pbmc+dGQ+ZGl2e3RyYW5zaXRpb246bWFyZ2luLXRvcCAuMnN9dHIuZmMtY29sbGFwc2VkPnRkPmRpdnttYXJnaW4tdG9wOi0xMHB4fS5mYy1ib2R5IC5mYy1yZXNvdXJjZS1hcmVhIC5mYy1jZWxsLWNvbnRlbnR7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0uZmMtbm8tb3ZlcmxhcCAuZmMtYm9keSAuZmMtcmVzb3VyY2UtYXJlYSAuZmMtY2VsbC1jb250ZW50e3BhZGRpbmctdG9wOjVweDtwYWRkaW5nLWJvdHRvbTo1cHh9LmZjLXJlc291cmNlLWFyZWEgLmZjLWljb257d2lkdGg6MWVtO2ZvbnQtc2l6ZTouOWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tdG9wOi0xJX0uZmMtcmVzb3VyY2UtYXJlYSAuZmMtZXhwYW5kZXJ7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzY2Nn0uZmMtdGltZS1hcmVhIGNvbHttaW4td2lkdGg6Mi4yZW19LmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1jaHJvbm8gdGh7dGV4dC1hbGlnbjpsZWZ0fS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtY2hyb25vIHRoe3RleHQtYWxpZ246cmlnaHR9LmZjLXRpbWUtYXJlYSAuZmMtc2xhdHN7ei1pbmRleDoxO2xlZnQ6MDtyaWdodDowfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRhYmxle2hlaWdodDoxMDAlfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIC5mYy1taW5vcntib3JkZXItc3R5bGU6ZG90dGVkfS5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci13aWR0aDowIDFweH0uZmMtbHRyIC5mYy10aW1lLWFyZWEgLmZjLXNsYXRzIHRke2JvcmRlci1yaWdodC13aWR0aDowfS5mYy1ydGwgLmZjLXRpbWUtYXJlYSAuZmMtc2xhdHMgdGR7Ym9yZGVyLWxlZnQtd2lkdGg6MH0uZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6MDtib3R0b206MDt3aWR0aDowfS5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLWx0ciAuZmMtdGltZS1hcmVhIC5mYy1oZWxwZXItY29udGFpbmVyLC5mYy1sdHIgLmZjLXRpbWUtYXJlYSAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcntsZWZ0OjB9LmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1iZ2V2ZW50LWNvbnRhaW5lciwuZmMtcnRsIC5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXIsLmZjLXJ0bCAuZmMtdGltZS1hcmVhIC5mYy1oaWdobGlnaHQtY29udGFpbmVye3JpZ2h0OjB9LmZjLXRpbWUtYXJlYSAuZmMtcm93c3twb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjN9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAudWktd2lkZ2V0LWNvbnRlbnR7YmFja2dyb3VuZDowIDB9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyB0ZD5kaXZ7cG9zaXRpb246cmVsYXRpdmV9LmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtYmdldmVudC1jb250YWluZXIsLmZjLXRpbWUtYXJlYSAuZmMtcm93cyAuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcnt6LWluZGV4OjF9LmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mjt3aWR0aDowfS5mYy10aW1lLWFyZWEgLmZjLWhlbHBlci1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDozO3RvcDowfS5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTo4cHg7dG9wOi0xcHh9LmZjLXRpbWUtYXJlYSB0cjpmaXJzdC1jaGlsZCAuZmMtZXZlbnQtY29udGFpbmVye3RvcDowfS5mYy1uby1vdmVybGFwIC5mYy10aW1lLWFyZWEgLmZjLWV2ZW50LWNvbnRhaW5lcntwYWRkaW5nLWJvdHRvbTowO3RvcDowfS5mYy10aW1lbGluZSAuZmMtbm93LWluZGljYXRvcnt6LWluZGV4OjM7dG9wOjB9LmZjLXRpbWUtYXJlYSAuZmMtbm93LWluZGljYXRvci1hcnJvd3ttYXJnaW46MCAtNnB4O2JvcmRlci13aWR0aDo2cHggNXB4IDA7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5mYy10aW1lLWFyZWEgLmZjLW5vdy1pbmRpY2F0b3ItbGluZXttYXJnaW46MCAtMXB4O2JvdHRvbTowO2JvcmRlci1sZWZ0LXdpZHRoOjFweH0uZmMtdGltZWxpbmUtZXZlbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MnB4IDA7bWFyZ2luLWJvdHRvbToxcHh9LmZjLW5vLW92ZXJsYXAgLmZjLXRpbWVsaW5lLWV2ZW50e3BhZGRpbmc6NXB4IDA7bWFyZ2luLWJvdHRvbTowfS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50e21hcmdpbi1yaWdodDoxcHh9LmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnR7bWFyZ2luLWxlZnQ6MXB4fS5mYy10aW1lbGluZS1ldmVudCAuZmMtY29udGVudHtwYWRkaW5nOjAgMXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW59LmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nOjAgMXB4fS5mYy1ydGwgLmZjLXRpbWVsaW5lLWV2ZW50IC5mYy10aW1le2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZzowIDFweH0uZmMtdGltZWxpbmUtZXZlbnQuZmMtc2VsZWN0ZWQgLmZjLWJne2Rpc3BsYXk6bm9uZX0uZmMtbHRyIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1sZWZ0OjEwcHg7bWFyZ2luLWxlZnQ6LThweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudCAuZmMtdGl0bGV7cGFkZGluZy1yaWdodDoxMHB4O21hcmdpbi1yaWdodDotOHB4fS5mYy1sdHIgLmZjLXRpbWVsaW5lLWV2ZW50LmZjLW5vdC1zdGFydCAuZmMtdGl0bGV7bWFyZ2luLWxlZnQ6LTJweH0uZmMtcnRsIC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxle21hcmdpbi1yaWdodDotMnB4fS5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZywuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMtYm9keSAuZmMtdGltZS1hcmVhIC5mYy1mb2xsb3dpbmc6YmVmb3JlLC5mYy10aW1lbGluZS1ldmVudC5mYy1ub3Qtc3RhcnQgLmZjLXRpdGxlOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bWFyZ2luLXRvcDotNXB4O2JvcmRlcjo1cHggc29saWQgIzAwMDtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7b3BhY2l0eTouNX0uZmMtbHRyIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLWx0ciAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLWxlZnQ6MDtsZWZ0OjJweH0uZmMtcnRsIC5mYy1ib2R5IC5mYy10aW1lLWFyZWEgLmZjLWZvbGxvd2luZzpiZWZvcmUsLmZjLXJ0bCAuZmMtdGltZWxpbmUtZXZlbnQuZmMtbm90LXN0YXJ0IC5mYy10aXRsZTpiZWZvcmV7Ym9yZGVyLXJpZ2h0OjA7cmlnaHQ6MnB4fS5mYy1saWNlbnNlLW1lc3NhZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5OTtib3R0b206MXB4O2xlZnQ6MXB4O2JhY2tncm91bmQ6I2VlZTtib3JkZXItY29sb3I6I2RkZDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweCAxcHggMCAwO3BhZGRpbmc6MnB4IDRweDtmb250LXNpemU6MTJweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHh9
LyoqKgpTcGVjdHJ1bSBDb2xvcnBpY2tlciB2MS44LjAKaHR0cHM6Ly9naXRodWIuY29tL2Jncmlucy9zcGVjdHJ1bQpBdXRob3I6IEJyaWFuIEdyaW5zdGVhZApMaWNlbnNlOiBNSVQKKioqLwoKLnNwLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowOwogICAgbGVmdDowOwogICAgZGlzcGxheTppbmxpbmUtYmxvY2s7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgKnpvb206IDE7CiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vYmdyaW5zL3NwZWN0cnVtL2lzc3Vlcy80MCAqLwogICAgei1pbmRleDogOTk5OTk5NDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KLnNwLWNvbnRhaW5lci5zcC1mbGF0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogRml4IGZvciAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfSAqLwouc3AtY29udGFpbmVyLAouc3AtY29udGFpbmVyICogewogICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgICAgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgovKiBodHRwOi8vYW5zY2lhdGgudHVtYmxyLmNvbS9wb3N0LzczNDc0OTU4NjkvY3NzLWFzcGVjdC1yYXRpbyAqLwouc3AtdG9wIHsKICBwb3NpdGlvbjpyZWxhdGl2ZTsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OmlubGluZS1ibG9jazsKfQouc3AtdG9wLWlubmVyIHsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OjA7CiAgIGJvdHRvbTowOwogICByaWdodDowOwp9Ci5zcC1jb2xvciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIGJvdHRvbTowOwogICAgcmlnaHQ6MjAlOwp9Ci5zcC1odWUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMTAwJTsKfQoKLnNwLWNsZWFyLWVuYWJsZWQgLnNwLWh1ZSB7CiAgICB0b3A6MzNweDsKICAgIGhlaWdodDogNzcuNSU7Cn0KCi5zcC1maWxsIHsKICAgIHBhZGRpbmctdG9wOiA4MCU7Cn0KLnNwLXNhdCwgLnNwLXZhbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6MDsKICAgIGxlZnQ6MDsKICAgIHJpZ2h0OjA7CiAgICBib3R0b206MDsKfQoKLnNwLWFscGhhLWVuYWJsZWQgLnNwLXRvcCB7CiAgICBtYXJnaW4tYm90dG9tOiAxOHB4Owp9Ci5zcC1hbHBoYS1lbmFibGVkIC5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQouc3AtYWxwaGEtaGFuZGxlIHsKICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgdG9wOi00cHg7CiAgICBib3R0b206IC00cHg7CiAgICB3aWR0aDogNnB4OwogICAgbGVmdDogNTAlOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG9wYWNpdHk6IC44Owp9Ci5zcC1hbHBoYSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAtMTRweDsKICAgIHJpZ2h0OiAwOwogICAgbGVmdDogMDsKICAgIGhlaWdodDogOHB4Owp9Ci5zcC1hbHBoYS1pbm5lciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMzMzOwp9Cgouc3AtY2xlYXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWNsZWFyLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9Cgouc3AtY2xlYXItZW5hYmxlZCAuc3AtY2xlYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowcHg7CiAgICByaWdodDowOwogICAgYm90dG9tOjA7CiAgICBsZWZ0Ojg0JTsKICAgIGhlaWdodDogMjhweDsKfQoKLyogRG9uJ3QgYWxsb3cgdGV4dCBzZWxlY3Rpb24gKi8KLnNwLWNvbnRhaW5lciwgLnNwLXJlcGxhY2VyLCAuc3AtcHJldmlldywgLnNwLWRyYWdnZXIsIC5zcC1zbGlkZXIsIC5zcC1hbHBoYSwgLnNwLWNsZWFyLCAuc3AtYWxwaGEtaGFuZGxlLCAuc3AtY29udGFpbmVyLnNwLWRyYWdnaW5nIC5zcC1pbnB1dCwgLnNwLWNvbnRhaW5lciBidXR0b24gIHsKICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsKICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTsKICAgIC1vLXVzZXItc2VsZWN0Om5vbmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnNwLWNvbnRhaW5lci5zcC1pbnB1dC1kaXNhYmxlZCAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1idXR0b25zLWRpc2FibGVkIC5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLnNwLWNvbnRhaW5lci5zcC1wYWxldHRlLWJ1dHRvbnMtZGlzYWJsZWQgLnNwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5zcC1wYWxldHRlLW9ubHkgLnNwLXBpY2tlci1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQouc3AtcGFsZXR0ZS1kaXNhYmxlZCAuc3AtcGFsZXR0ZS1jb250YWluZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLnNwLWluaXRpYWwtZGlzYWJsZWQgLnNwLWluaXRpYWwgewogICAgZGlzcGxheTogbm9uZTsKfQoKCi8qIEdyYWRpZW50cyBmb3IgaHVlLCBzYXR1cmF0aW9uIGFuZCB2YWx1ZSBpbnN0ZWFkIG9mIGltYWdlcy4gIE5vdCBwcmV0dHkuLi4gYnV0IGl0IHdvcmtzICovCi5zcC1zYXQgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsICAwIDAsIDEwMCUgMCwgZnJvbSgjRkZGKSwgdG8ocmdiYSgyMDQsIDE1NCwgMTI5LCAwKSkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgI0ZGRiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCAjZmZmLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgI2ZmZiwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICNmZmYsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGUgPSAxLCBzdGFydENvbG9yc3RyPSNGRkZGRkZGRiwgZW5kQ29sb3JzdHI9IzAwQ0M5QTgxKSI7CiAgICBmaWx0ZXIgOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoR3JhZGllbnRUeXBlID0gMSwgc3RhcnRDb2xvcnN0cj0nI0ZGRkZGRkZGJywgZW5kQ29sb3JzdHI9JyMwMENDOUE4MScpOwp9Ci5zcC12YWwgewogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAgMTAwJSwgMCAwLCBmcm9tKCMwMDAwMDApLCB0byhyZ2JhKDIwNCwgMTU0LCAxMjksIDApKSk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoYm90dG9tLCAjMDAwLCByZ2JhKDIwNCwgMTU0LCAxMjksIDApKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudChib3R0b20sICMwMDAsIHJnYmEoMjA0LCAxNTQsIDEyOSwgMCkpOwogICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgIzAwMCwgcmdiYSgyMDQsIDE1NCwgMTI5LCAwKSk7CiAgICAtbXMtZmlsdGVyOiAicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9IzAwQ0M5QTgxLCBlbmRDb2xvcnN0cj0jRkYwMDAwMDApIjsKICAgIGZpbHRlciA6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBDQzlBODEnLCBlbmRDb2xvcnN0cj0nI0ZGMDAwMDAwJyk7Cn0KCi5zcC1odWUgewogICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZmYwMDAwIDAlLCAjZmZmZjAwIDE3JSwgIzAwZmYwMCAzMyUsICMwMGZmZmYgNTAlLCAjMDAwMGZmIDY3JSwgI2ZmMDBmZiA4MyUsICNmZjAwMDAgMTAwJSk7CiAgICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2ZmMDAwMCAwJSwgI2ZmZmYwMCAxNyUsICMwMGZmMDAgMzMlLCAjMDBmZmZmIDUwJSwgIzAwMDBmZiA2NyUsICNmZjAwZmYgODMlLCAjZmYwMDAwIDEwMCUpOwogICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbSgjZmYwMDAwKSwgY29sb3Itc3RvcCgwLjE3LCAjZmZmZjAwKSwgY29sb3Itc3RvcCgwLjMzLCAjMDBmZjAwKSwgY29sb3Itc3RvcCgwLjUsICMwMGZmZmYpLCBjb2xvci1zdG9wKDAuNjcsICMwMDAwZmYpLCBjb2xvci1zdG9wKDAuODMsICNmZjAwZmYpLCB0bygjZmYwMDAwKSk7CiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNmZjAwMDAgMCUsICNmZmZmMDAgMTclLCAjMDBmZjAwIDMzJSwgIzAwZmZmZiA1MCUsICMwMDAwZmYgNjclLCAjZmYwMGZmIDgzJSwgI2ZmMDAwMCAxMDAlKTsKfQoKLyogSUUgZmlsdGVycyBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb2xvciBzdG9wcy4KICAgR2VuZXJhdGUgNiBkaXZzLCBsaW5lIHRoZW0gdXAsIGFuZCBkbyB0d28gY29sb3IgZ3JhZGllbnRzIGZvciBlYWNoLgogICBZZXMsIHJlYWxseS4KICovCi5zcC0xIHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjZmYwMDAwJywgZW5kQ29sb3JzdHI9JyNmZmZmMDAnKTsKfQouc3AtMiB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nI2ZmZmYwMCcsIGVuZENvbG9yc3RyPScjMDBmZjAwJyk7Cn0KLnNwLTMgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyMwMGZmMDAnLCBlbmRDb2xvcnN0cj0nIzAwZmZmZicpOwp9Ci5zcC00IHsKICAgIGhlaWdodDoxNyU7CiAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPScjMDBmZmZmJywgZW5kQ29sb3JzdHI9JyMwMDAwZmYnKTsKfQouc3AtNSB7CiAgICBoZWlnaHQ6MTYlOwogICAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nIzAwMDBmZicsIGVuZENvbG9yc3RyPScjZmYwMGZmJyk7Cn0KLnNwLTYgewogICAgaGVpZ2h0OjE3JTsKICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyNmZjAwZmYnLCBlbmRDb2xvcnN0cj0nI2ZmMDAwMCcpOwp9Cgouc3AtaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogQ2xlYXJmaXggaGFjayAqLwouc3AtY2Y6YmVmb3JlLCAuc3AtY2Y6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KLnNwLWNmOmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KLnNwLWNmIHsgKnpvb206IDE7IH0KCi8qIE1vYmlsZSBkZXZpY2VzLCBtYWtlIGh1ZSBzbGlkZXIgYmlnZ2VyIHNvIGl0IGlzIGVhc2llciB0byBzbGlkZSAqLwpAbWVkaWEgKG1heC1kZXZpY2Utd2lkdGg6IDQ4MHB4KSB7CiAgICAuc3AtY29sb3IgeyByaWdodDogNDAlOyB9CiAgICAuc3AtaHVlIHsgbGVmdDogNjMlOyB9CiAgICAuc3AtZmlsbCB7IHBhZGRpbmctdG9wOiA2MCU7IH0KfQouc3AtZHJhZ2dlciB7CiAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgaGVpZ2h0OiA1cHg7CiAgIHdpZHRoOiA1cHg7CiAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7CiAgIGJhY2tncm91bmQ6ICMwMDA7CiAgIGN1cnNvcjogcG9pbnRlcjsKICAgcG9zaXRpb246YWJzb2x1dGU7CiAgIHRvcDowOwogICBsZWZ0OiAwOwp9Ci5zcC1zbGlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOjA7CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIGhlaWdodDogM3B4OwogICAgbGVmdDogLTFweDsKICAgIHJpZ2h0OiAtMXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgb3BhY2l0eTogLjg7Cn0KCi8qClRoZW1lIGF1dGhvcnM6CkhlcmUgYXJlIHRoZSBiYXNpYyB0aGVtZWFibGUgZGlzcGxheSBvcHRpb25zIChjb2xvcnMsIGZvbnRzLCBnbG9iYWwgd2lkdGhzKS4KU2VlIGh0dHA6Ly9iZ3JpbnMuZ2l0aHViLmlvL3NwZWN0cnVtL3RoZW1lcy8gZm9yIGluc3RydWN0aW9ucy4KKi8KCi5zcC1jb250YWluZXIgewogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNFQ0VDRUM7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjZjBjNDlCOwogICAgcGFkZGluZzogMDsKfQouc3AtY29udGFpbmVyLCAuc3AtY29udGFpbmVyIGJ1dHRvbiwgLnNwLWNvbnRhaW5lciBpbnB1dCwgLnNwLWNvbG9yLCAuc3AtaHVlLCAuc3AtY2xlYXIgewogICAgZm9udDogbm9ybWFsIDEycHggIkx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgU2FucyIsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIC1tcy1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQouc3AtdG9wIHsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQouc3AtY29sb3IsIC5zcC1odWUsIC5zcC1jbGVhciB7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjNjY2Owp9CgovKiBJbnB1dCAqLwouc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIGZsb2F0OnJpZ2h0OwogICAgd2lkdGg6IDEwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9Ci5zcC1pbml0aWFsLWRpc2FibGVkICAuc3AtaW5wdXQtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5zcC1pbnB1dCB7CiAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICBib3JkZXI6IDFweCBpbnNldDsKICAgcGFkZGluZzogNHB4IDVweDsKICAgbWFyZ2luOiAwOwogICB3aWR0aDogMTAwJTsKICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudDsKICAgYm9yZGVyLXJhZGl1czogM3B4OwogICBjb2xvcjogIzIyMjsKfQouc3AtaW5wdXQ6Zm9jdXMgIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIG9yYW5nZTsKfQouc3AtaW5wdXQuc3AtdmFsaWRhdGlvbi1lcnJvciB7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7CiAgICBiYWNrZ3JvdW5kOiAjZmRkOwp9Ci5zcC1waWNrZXItY29udGFpbmVyICwgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGZsb2F0OmxlZnQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgcGFkZGluZy1ib3R0b206IDMwMHB4OwogICAgbWFyZ2luLWJvdHRvbTogLTI5MHB4Owp9Ci5zcC1waWNrZXItY29udGFpbmVyIHsKICAgIHdpZHRoOiAxNzJweDsKICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2ZmZjsKfQoKLyogUGFsZXR0ZXMgKi8KLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICNjY2M7Cn0KCi5zcC1wYWxldHRlLW9ubHkgLnNwLXBhbGV0dGUtY29udGFpbmVyIHsKICAgIGJvcmRlcjogMDsKfQoKLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICBmbG9hdDpsZWZ0OwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDE1cHg7CiAgICBtYXJnaW46IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjpzb2xpZCAycHggdHJhbnNwYXJlbnQ7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsOmhvdmVyLCAuc3AtcGFsZXR0ZSAuc3AtdGh1bWItZWwuc3AtdGh1bWItYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogb3JhbmdlOwp9Ci5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKfQoKLyogSW5pdGlhbCAqLwouc3AtaW5pdGlhbCB7CiAgICBmbG9hdDogbGVmdDsKICAgIGJvcmRlcjogc29saWQgMXB4ICMzMzM7Cn0KLnNwLWluaXRpYWwgc3BhbiB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMjVweDsKICAgIGJvcmRlcjpub25lOwogICAgZGlzcGxheTpibG9jazsKICAgIGZsb2F0OmxlZnQ7CiAgICBtYXJnaW46MDsKfQoKLnNwLWluaXRpYWwgLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwp9CgovKiBCdXR0b25zICovCi5zcC1wYWxldHRlLWJ1dHRvbi1jb250YWluZXIsCi5zcC1idXR0b24tY29udGFpbmVyIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLyogUmVwbGFjZXIgKHRoZSBsaXR0bGUgcHJldmlldyBkaXYgdGhhdCBzaG93cyB1cCBpbnN0ZWFkIG9mIHRoZSA8aW5wdXQ+KSAqLwouc3AtcmVwbGFjZXIgewogICAgbWFyZ2luOjA7CiAgICBvdmVyZmxvdzpoaWRkZW47CiAgICBjdXJzb3I6cG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweDsKICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOwogICAgKnpvb206IDE7CiAgICAqZGlzcGxheTogaW5saW5lOwogICAgYm9yZGVyOiBzb2xpZCAxcHggIzkxNzY1ZDsKICAgIGJhY2tncm91bmQ6ICNlZWU7CiAgICBjb2xvcjogIzMzMzsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnNwLXJlcGxhY2VyOmhvdmVyLCAuc3AtcmVwbGFjZXIuc3AtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogI0YwQzQ5QjsKICAgIGNvbG9yOiAjMTExOwp9Ci5zcC1yZXBsYWNlci5zcC1kaXNhYmxlZCB7CiAgICBjdXJzb3I6ZGVmYXVsdDsKICAgIGJvcmRlci1jb2xvcjogc2lsdmVyOwogICAgY29sb3I6IHNpbHZlcjsKfQouc3AtZGQgewogICAgcGFkZGluZzogMnB4IDA7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZsb2F0OmxlZnQ7CiAgICBmb250LXNpemU6MTBweDsKfQouc3AtcHJldmlldyB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIHdpZHRoOjI1cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBib3JkZXI6IHNvbGlkIDFweCAjMjIyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICBmbG9hdDpsZWZ0OwogICAgei1pbmRleDogMDsKfQoKLnNwLXBhbGV0dGUgewogICAgKndpZHRoOiAyMjBweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KLnNwLXBhbGV0dGUgLnNwLXRodW1iLWVsIHsKICAgIHdpZHRoOjE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW46MnB4IDFweDsKICAgIGJvcmRlcjogc29saWQgMXB4ICNkMGQwZDA7Cn0KCi5zcC1jb250YWluZXIgewogICAgcGFkZGluZy1ib3R0b206MDsKfQoKCi8qIEJ1dHRvbnM6IGh0dHA6Ly9oZWxsb2hhcHB5Lm9yZy9jc3MzLWJ1dHRvbnMvICovCi5zcC1jb250YWluZXIgYnV0dG9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOwogIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZWVlZWVlLCAjY2NjY2NjKTsKICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2VlZWVlZSwgI2NjY2NjYyk7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgY29sb3I6ICMzMzM7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxOwogIHBhZGRpbmc6IDVweCA0cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtc2hhZG93OiAwIDFweCAwICNlZWU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOwogICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgI2RkZGRkZCwgI2JiYmJiYik7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZGRkZGRkLCAjYmJiYmJiKTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNkZGRkZGQsICNiYmJiYmIpOwogICAgYm9yZGVyOiAxcHggc29saWQgI2JiYjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2RkZDsKfQouc3AtY29udGFpbmVyIGJ1dHRvbjphY3RpdmUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjODg4OwogICAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtbXMtYm94LXNoYWRvdzogaW5zZXQgMCAwIDVweCAycHggI2FhYWFhYSwgMCAxcHggMCAwICNlZWVlZWU7CiAgICAtby1ib3gtc2hhZG93OiBpbnNldCAwIDAgNXB4IDJweCAjYWFhYWFhLCAwIDFweCAwIDAgI2VlZWVlZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCA1cHggMnB4ICNhYWFhYWEsIDAgMXB4IDAgMCAjZWVlZWVlOwp9Ci5zcC1jYW5jZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6ICNkOTNmM2YgIWltcG9ydGFudDsKICAgIG1hcmdpbjowOwogICAgcGFkZGluZzoycHg7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKCn0KLnNwLWNhbmNlbDpob3ZlciB7CiAgICBjb2xvcjogI2Q5M2YzZiAhaW1wb3J0YW50OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCgouc3AtcGFsZXR0ZSBzcGFuOmhvdmVyLCAuc3AtcGFsZXR0ZSBzcGFuLnNwLXRodW1iLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6ICMwMDA7Cn0KCi5zcC1wcmV2aWV3LCAuc3AtYWxwaGEsIC5zcC10aHVtYi1lbCB7CiAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQU1DQUlBQUFEWkY4dXdBQUFBR1VsRVFWUVlWMk00Z3dIK1l3Q0dJYXNJVXdoVDI1QlZCQUR0ellOWXJIdnY0Z0FBQUFCSlJVNUVya0pnZ2c9PSk7Cn0KLnNwLXByZXZpZXctaW5uZXIsIC5zcC1hbHBoYS1pbm5lciwgLnNwLXRodW1iLWlubmVyIHsKICAgIGRpc3BsYXk6YmxvY2s7CiAgICBwb3NpdGlvbjphYnNvbHV0ZTsKICAgIHRvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowOwp9Cgouc3AtcGFsZXR0ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogNTAlIDUwJTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1saWdodC5zcC10aHVtYi1hY3RpdmUgLnNwLXRodW1iLWlubmVyIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJJQUFBQVNDQVlBQUFCV3pvNVhBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUlWSlJFRlVlTnBpWUJoc2dKRk1mZnhBWEFCbE41SnJ1VDRRM3dmaS8wRHNUNjRoOFVEOEhtcElQQ1dHL0tlbUlmT0pDVUIrQW9hY3g2RUdCWnlIQnFJK1dzREN3dVE5bWh4ZWcyQTIxME50Zm84a2xrOXNPTWlqYVVSbTd5YzFVUDJSTkNNYktFOU9ESzFITTZpZWdZTGtmeDhwbGlnQzlsQ0Q3S21Sb2YwWmhqUUFDREFBY2VvdnJ0cFZCUmtBQUFBQVNVVk9SSzVDWUlJPSk7Cn0KCi5zcC1wYWxldHRlIC5zcC10aHVtYi1kYXJrLnNwLXRodW1iLWFjdGl2ZSAuc3AtdGh1bWItaW5uZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQklBQUFBU0NBWUFBQUJXem81WEFBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFBYWRFVllkRk52Wm5SM1lYSmxBRkJoYVc1MExrNUZWQ0IyTXk0MUxqRXdNUFJ5b1FBQUFNZEpSRUZVT0UrdGtnc053ekFNUk11Z0VBYWhFQWFoRUFaaEVBcWxFQVpoRUFvaEVBWWg4MVgyZEltOGZLcEVzcExHdnVkUE9zVVlweEUyQklKQ3JvSm1FVzlxSitNS2FCRmhFTU5hYlN5OW9JY0lQd3JCK2FmdkFVRm9LNEgwdE1hUTNYdGxyZ2dEaE9WVk11VDRFNU1NRzBGQmJDRVl6allUN094TEV2SUhRTFkyeld3UTNEKzlsdXlPUVRmS0RpRkQzaVVJZlBrOFZxcktqZ0FpU2ZHRlBlY3JnNkhONm0vaUJjd2lEQW83V2lCZWF3YStLd2g3dFpvU0NHTE1xd2xTQXpWRGhvSys2dkg0RzBQNXdka0FBQUFBU1VWT1JLNUNZSUk9KTsKfQoKLnNwLWNsZWFyLWRpc3BsYXkgewogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEZBQVVBUGNBQUFBQUFKbVptWjJkblo2ZW5xS2lvcU9qbzZTa3BLV2xwYWFtcHFlbnA2aW9xS21wcWFxcXFxdXJxL0h4OGZMeTh2VDA5UFgxOWZmMzkvajQrUG41K2ZyNit2djcrd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSDVCQUVBQVA4QUxBQUFBQUFVQUJRQUFBaWhBUDlGb1BDdm9NR0RCeTA4K0VkaFFBSUpDQ015YkNEQUFZVUVBUkJBbEZpUVFvTUFCUWhLVUpCeFkwU1BJQ0VZSEJuZ2dFbURLQXVvUE1qUzVjR1lNeEhXM0lpVDQ3OEpKQThNL0NqVFowR2dMUmVrTkdwd0FzWUFCSEl5cGNBZ1FNc0lURHRXSllCUjZOU3FNaWNvOWNxUjZ0S2ZZN0dlQkN1VndsaXBETm1lZkF0VHJrU3pCMVJhSUFvWG9kc0FCaVpBRUZCMDZnSUJXQzFtTFZnQmEwQUFPdz09KTsKfQo=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIKICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKICAgICNFZGl0QXBwb2ludG1lbnRGb3JtIHsKICAgICAgICB3aWR0aDogNTYwcHg7CiAgICB9CgogICAgLklubGluZUJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgfQoKICAgIC5GaWx0ZXJNZXNzYWdlIHRkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkNhbGVuZGFyQ29sb3IgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC5mYy1jb250ZW50IC5JY29ucywKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiAuSWNvbnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgIH0KCiAgICAuZmMtY29udGVudCBpIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDAuOWVtOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIH0KCiAgICB0cjpob3ZlciB0ZCAuZmMtY29udGVudCBpIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgIH0KCiAgICAuZmMgYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjRUVFOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRyYW5zaXRpb246IGFsbCBlYXNlLWluIDAuMnM7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDNweCA3cHggNnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgY29sb3I6ICMzMzM7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNGRkY7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgICNEYXRlcGlja2VyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMTAwOwogICAgfQoKICAgICNEYXRlcGlja2VyT3ZlcmxheSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDUwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgd2lkdGg6IDM3NXB4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgIH0KCiAgICAuQXBwb2ludG1lbnRUb29sdGlwID4gLkljb25zIGkgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMC45ZW07CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gbGFiZWwgewogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKICAgICAgICBjb2xvcjogIzkyOTI5MjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtaW4taGVpZ2h0OiAxN3B4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDAuM2VtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHdpZHRoOiAzMCU7CiAgICB9CgogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gLlZhbHVlIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDUuNmVtOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSwKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgPiBmaWVsZHNldCA+IC5WYWx1ZTplbXB0eSArIGxhYmVsLAogICAgLkFwcG9pbnRtZW50VG9vbHRpcCA+IGZpZWxkc2V0ID4gLlZhbHVlOmVtcHR5IH4gZGl2LkNsZWFyIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5BcHBvaW50bWVudFRvb2x0aXAgLkZsYWcgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIH0KCiAgICAuQ2FsZW5kYXJXaWRnZXQgLnVpLWRhdGVwaWNrZXItdHJpZ2dlciB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgIH0KCiAgICAuUmVhZE9ubHlWYWx1ZSB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgfQoKICAgIC5SZWFkT25seVZhbHVlI0xvY2F0aW9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB9CgogICAgI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC5GaWVsZEV4cGxhbmF0aW9uOm50aC1jaGlsZCgyKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgIH0KCiAgICAjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAuRmllbGRFeHBsYW5hdGlvbiwKICAgICNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiAuRmllbGRFeHBsYW5hdGlvbiwKICAgICNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC5GaWVsZEV4cGxhbmF0aW9uIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGMkYyRjI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0NDQzsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggI0NDQyBpbnNldDsKICAgICAgICBwYWRkaW5nOiAycHggOHB4IDRweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXI6ZW1wdHkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLlBsdWdpbkNvbnRhaW5lciBhIHsKICAgICAgICBsaW5lLWhlaWdodDogMWVtOwogICAgfQoKICAgIC5QbHVnaW5Db250YWluZXIgYTpmaXJzdC1jaGlsZCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDk2JTsKICAgIH0KCiAgICAuZmMtYWdlbmRhLXZpZXcgdGguZmMtcmVzb3VyY2UtY2VsbCB7CiAgICAgICAgY29sb3I6ICM0QjRCNEI7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgLmZjLXN0YXRlLWRlZmF1bHQuZmMtY29ybmVyLWxlZnQgewogICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDsKICAgIH0KCiAgICAuZmMtc3RhdGUtZGVmYXVsdC5mYy1jb3JuZXItcmlnaHQgewogICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOwogICAgfQoKICAgIC5mYy1zdGF0ZS1ob3ZlciwKICAgIC5mYy1zdGF0ZS1kb3duLAogICAgLmZjLXN0YXRlLWFjdGl2ZSwKICAgIC5mYy1zdGF0ZS1kaXNhYmxlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0U1RTVFNSAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlci1jb2xvcjogIzk5OSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYy1zdGF0ZS1kb3duLAogICAgLmZjLXN0YXRlLWFjdGl2ZSB7CiAgICAgICAgYm94LXNoYWRvdzogMXB4IDFweCAzcHggI0IwQjBCMCBpbnNldCwgLTFweCAtMXB4IDNweCAjQjBCMEIwIGluc2V0OwogICAgfQoKICAgIC5mYy10b29sYmFyIGgyIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW4tdG9wOiA2cHg7CiAgICB9CgogICAgLmZjLXZpZXcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGREZERkQ7CiAgICB9CgogICAgLmZjLXZpZXcgdGFibGUgdGhlYWQuZmMtaGVhZCB7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRUVFRTsKICAgIH0KCiAgICAuZmMtdmlldyB0YWJsZSB0aGVhZC5mYy1oZWFkIHRoLmZjLXdpZGdldC1oZWFkZXIgewogICAgICAgIGNvbG9yOiAjNEI0QjRCOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKICAgIH0KCiAgICAuZmMtZm9sbG93aW5nIHsKICAgICAgICBwYWRkaW5nLXRvcDogMnB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLXdpZGdldC1oZWFkZXIgLmZjLWZvbGxvd2luZyB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICBwYWRkaW5nLXRvcDogMXB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLldlZWtOdW1iZXIsCiAgICAuZmMtd2Vlay1udW1iZXIgewogICAgICAgIGNvbG9yOiAjQjBCMEIwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZjLXJlc291cmNlLWFyZWEgfiAuZmMtdGltZS1hcmVhIC5mYy1mb2xsb3dpbmcgewogICAgICAgIHBhZGRpbmctdG9wOiAxcHggIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmMtbW9udGgtdmlldyB0aC5mYy13aWRnZXQtaGVhZGVyLAogICAgLmZjLWFnZW5kYS12aWV3IHRoLmZjLXdpZGdldC1oZWFkZXIgewogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDNweDsKICAgIH0KCiAgICAuZmMtbHRyIC5mYy10aW1lLWdyaWQgLmZjLWV2ZW50LWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICB9CgogICAgLmZjLXRpbWUtYXJlYSAuZmMtZXZlbnQtY29udGFpbmVyIHsKICAgICAgICB0b3A6IDJweDsKICAgIH0KCiAgICAuZmMgLmZjLXRvZGF5IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGMUFCOwogICAgfQoKICAgIC51aS1hdXRvY29tcGxldGUgewogICAgICAgIHotaW5kZXg6IDQwMDAgIWltcG9ydGFudDsKICAgIH0KCiAgICAuQnV0dG9uVGFibGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgfQoKICAgIC5CdXR0b25UYWJsZSBidXR0b24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5CdXR0b25UYWJsZSAuZmMgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICB9CgogICAgLkZpZWxkSW5saW5lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgY29sb3I6ICMwMDA7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgIH0KCiAgICAjQ29udGV4dFNldHRpbmdzRGlhbG9nUmVzb3VyY2VPdmVydmlldyB7CiAgICAgICAgbWF4LWhlaWdodDogNjAwcHg7CiAgICAgICAgd2lkdGg6IDk1MHB4OwogICAgfQoKICAgICNSZXN0b3JlRGVmYXVsdFNldHRpbmdzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICB9CgogICAgdHI6aG92ZXIgdGQgYSNSZXN0b3JlRGVmYXVsdFNldHRpbmdzIGkgewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgfQoKICAgIHRyIHRkIGEjUmVzdG9yZURlZmF1bHRTZXR0aW5nczpob3ZlciBpIHsKICAgICAgICBjb2xvcjogIzAwMDsKICAgIH0KCiAgICAuRmllbGQuSW5mbyBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgIH0KCiAgICAuRmllbGQgYS5CdXR0b246YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgfQoKICAgIC5GaWVsZCBhLkJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICAgIHBhZGRpbmc6IDNweCA3cHg7CiAgICB9CgogICAgLkZpZWxkIGEuQnV0dG9uOmhvdmVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMzRTZDN0M7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b246aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0QjdDOEU7CiAgICB9CgogICAgLkZpZWxkLkluZm8gYS5CdXR0b24gaSB7CiAgICAgICAgY29sb3I6ICM4OUM2RDE7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb250LUF3ZXNvbWUgY2hhcmFjdGVyIGNsYXNzZXMKICAgICAqLwogICAgLmZhLWNoYXItYTpiZWZvcmUsIC5mYS1jaGFyLWI6YmVmb3JlLCAuZmEtY2hhci1jOmJlZm9yZSwgLmZhLWNoYXItZDpiZWZvcmUsIC5mYS1jaGFyLWU6YmVmb3JlLAogICAgLmZhLWNoYXItZjpiZWZvcmUsIC5mYS1jaGFyLWc6YmVmb3JlLCAuZmEtY2hhci1oOmJlZm9yZSwgLmZhLWNoYXItaTpiZWZvcmUsIC5mYS1jaGFyLWo6YmVmb3JlLAogICAgLmZhLWNoYXItazpiZWZvcmUsIC5mYS1jaGFyLWw6YmVmb3JlLCAuZmEtY2hhci1tOmJlZm9yZSwgLmZhLWNoYXItbjpiZWZvcmUsIC5mYS1jaGFyLW86YmVmb3JlLAogICAgLmZhLWNoYXItcDpiZWZvcmUsIC5mYS1jaGFyLXE6YmVmb3JlLCAuZmEtY2hhci1yOmJlZm9yZSwgLmZhLWNoYXItczpiZWZvcmUsIC5mYS1jaGFyLXQ6YmVmb3JlLAogICAgLmZhLWNoYXItdTpiZWZvcmUsIC5mYS1jaGFyLXY6YmVmb3JlLCAuZmEtY2hhci13OmJlZm9yZSwgLmZhLWNoYXIteDpiZWZvcmUsIC5mYS1jaGFyLXk6YmVmb3JlLAogICAgLmZhLWNoYXItejpiZWZvcmUsIC5mYS1jaGFyLTA6YmVmb3JlLCAuZmEtY2hhci0xOmJlZm9yZSwgLmZhLWNoYXItMjpiZWZvcmUsIC5mYS1jaGFyLTM6YmVmb3JlLAogICAgLmZhLWNoYXItNDpiZWZvcmUsIC5mYS1jaGFyLTU6YmVmb3JlLCAuZmEtY2hhci02OmJlZm9yZSwgLmZhLWNoYXItNzpiZWZvcmUsIC5mYS1jaGFyLTg6YmVmb3JlLAogICAgLmZhLWNoYXItOTpiZWZvcmUgewogICAgICAgIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfQogICAgLmZhLWNoYXItYTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJBIjsKICAgIH0KICAgIC5mYS1jaGFyLWI6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiQiI7CiAgICB9CiAgICAuZmEtY2hhci1jOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkMiOwogICAgfQogICAgLmZhLWNoYXItZDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJEIjsKICAgIH0KICAgIC5mYS1jaGFyLWU6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiRSI7CiAgICB9CiAgICAuZmEtY2hhci1mOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkYiOwogICAgfQogICAgLmZhLWNoYXItZzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJHIjsKICAgIH0KICAgIC5mYS1jaGFyLWg6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSCI7CiAgICB9CiAgICAuZmEtY2hhci1pOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkkiOwogICAgfQogICAgLmZhLWNoYXItajpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJKIjsKICAgIH0KICAgIC5mYS1jaGFyLWs6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiSyI7CiAgICB9CiAgICAuZmEtY2hhci1sOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIkwiOwogICAgfQogICAgLmZhLWNoYXItbTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJNIjsKICAgIH0KICAgIC5mYS1jaGFyLW46YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiTiI7CiAgICB9CiAgICAuZmEtY2hhci1vOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIk8iOwogICAgfQogICAgLmZhLWNoYXItcDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJQIjsKICAgIH0KICAgIC5mYS1jaGFyLXE6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiUSI7CiAgICB9CiAgICAuZmEtY2hhci1yOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlIiOwogICAgfQogICAgLmZhLWNoYXItczpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJTIjsKICAgIH0KICAgIC5mYS1jaGFyLXQ6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiVCI7CiAgICB9CiAgICAuZmEtY2hhci11OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlUiOwogICAgfQogICAgLmZhLWNoYXItdjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJWIjsKICAgIH0KICAgIC5mYS1jaGFyLXc6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiVyI7CiAgICB9CiAgICAuZmEtY2hhci14OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIlgiOwogICAgfQogICAgLmZhLWNoYXIteTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICJZIjsKICAgIH0KICAgIC5mYS1jaGFyLXo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiWiI7CiAgICB9CiAgICAuZmEtY2hhci0wOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjAiOwogICAgfQogICAgLmZhLWNoYXItMTpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIxIjsKICAgIH0KICAgIC5mYS1jaGFyLTI6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiMiI7CiAgICB9CiAgICAuZmEtY2hhci0zOmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjMiOwogICAgfQogICAgLmZhLWNoYXItNDpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI0IjsKICAgIH0KICAgIC5mYS1jaGFyLTU6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiNSI7CiAgICB9CiAgICAuZmEtY2hhci02OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjYiOwogICAgfQogICAgLmZhLWNoYXItNzpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICI3IjsKICAgIH0KICAgIC5mYS1jaGFyLTg6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiOCI7CiAgICB9CiAgICAuZmEtY2hhci05OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIjkiOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDBweCkgYW5kIChtYXgtd2lkdGg6IDEwMjRweCkgewoKICAgICNDb250ZXh0U2V0dGluZ3NEaWFsb2dSZXNvdXJjZU92ZXJ2aWV3LAogICAgI0VkaXRBcHBvaW50bWVudEZvcm0gewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIgQWdlbmRhIE92ZXJ2aWV3CiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAuQ29sb3IgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0JCQjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgfQoKICAgIC5CdXR0b25zIHsKICAgICAgICBtYXJnaW46IDRweCAzcHggMnB4OwogICAgfQoKICAgIC5IZWFkZXJMZWZ0LAogICAgLlJUTCAuSGVhZGVyUmlnaHQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgfQoKICAgIC5IZWFkZXJMZWZ0LkJ1dHRvbnMgYSwKICAgIC5SVEwgLkhlYWRlclJpZ2h0LkJ1dHRvbnMgYSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAzcHg7CiAgICB9CgogICAgLkhlYWRlckNlbnRlciB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbi10b3A6IDlweDsKICAgIH0KCiAgICAuSGVhZGVyQ2VudGVyIGgyIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgIH0KCiAgICAuSGVhZGVyUmlnaHQsCiAgICAuUlRMIC5IZWFkZXJMZWZ0IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICB9CgogICAgLkhlYWRlclJpZ2h0LkJ1dHRvbnMgYSwKICAgIC5SVEwgLkhlYWRlckxlZnQuQnV0dG9ucyBhIHsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgfQoKICAgIC5EYXRlRGl2aWRlciB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkRhdGVEaXZpZGVyIHRkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFOwogICAgICAgIGJvcmRlci10b3A6IDFweCBkb3R0ZWQgI0NDQzsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICNDQ0M7CiAgICAgICAgbGluZS1oZWlnaHQ6IDJlbTsKICAgIH0KCiAgICAuRGF0ZURpdmlkZXIuRmlyc3QgPiB0ZCB7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgIH0KCiAgICAuVGFibGVTbWFsbCB0Ym9keSB0ci5EYXRlRGl2aWRlcjpob3ZlciB0ZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKICAgIH0KCiAgICAuT3ZlcnZpZXdDb250cm9sLkxvYWRpbmcgLkNvbnRyb2xSb3cgewogICAgICAgIGJhY2tncm91bmQ6ICNEREQgdXJsKCIuLi9pbWcvbG9hZGVyLmdpZiIpIG5vLXJlcGVhdCByaWdodCA1cHggY2VudGVyOwogICAgfQoKICAgIC5SVEwgLk92ZXJ2aWV3Q29udHJvbC5Mb2FkaW5nIC5Db250cm9sUm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjREREIHVybCgiLi4vaW1nL2xvYWRlci5naWYiKSBuby1yZXBlYXQgbGVmdCA1cHggY2VudGVyOwogICAgfQoKfSAvKiBlbmQgQG1lZGlhICovCg==
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgQXBwb2ludG1lbnQgQ2FsZW5kYXIgTWFuYWdlCiAqLwoKQG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uLHR2LGhhbmRoZWxkIHsKCiAgICAuV2lkZ2V0U2ltcGxlIGZpZWxkc2V0LlNlcGFyYXRlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOwogICAgICAgIG1hcmdpbjogOXB4IDA7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgfQoKICAgIC5JbmxpbmVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICB0ci5JbnZhbGlkIC5Eb3dubG9hZExpbmssCiAgICB0ci5JbnZhbGlkIC5JbmxpbmVCdXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLkNhbGVuZGFyQ29sb3IgewogICAgICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgfQoKICAgIC5JbnZhbGlkIC5DYWxlbmRhckNvbG9yIHsKICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICB9CgogICAgLyoqCiAgICAgKiBTcGVjdHJ1bSBDb2xvciBwaWNrZXIKICAgICAqLwogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgICAgICBib3gtc2hhZG93OiAxcHggMXB4IDNweCAjRUVFIGluc2V0LCAtMXB4IC0xcHggM3B4ICNFRUUgaW5zZXQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzBDMEMwICNDOUM5QzkgI0M5QzlDOTsKICAgICAgICBwYWRkaW5nOiAzcHggNHB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlcjpob3ZlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzBDMEMwICNDOUM5QzkgI0M5QzlDOTsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uLnNwLXJlcGxhY2VyOmZvY3VzLAogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbi5zcC1yZXBsYWNlci5zcC1hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogI0Y5MjsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQnV0dG9uIC5zcC1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMTZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVCdXR0b24gLnNwLXByZXZpZXctaW5uZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC10aHVtYi1pbm5lciB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0JCQjsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXRodW1iLWlubmVyOmhvdmVyIHsKICAgICAgICBib3JkZXItY29sb3I6ICNGOTI7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUJ1dHRvbiAuc3AtZGQgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiA4cHg7CiAgICAgICAgcGFkZGluZzogNHB4IDA7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBidXR0b24sCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBpbnB1dCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI0MwQzBDMCAjQzlDOUM5ICNDOUM5Qzk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyLnNwLWNvbnRhaW5lciBidXR0b24gewogICAgICAgIGNvbG9yOiAjMzMzOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICAgICAgbWluLWhlaWdodDogMTJweDsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgYmFja2dyb3VuZDogI0VFRTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCQkI7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbiAwLjJzOwogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNFRUU7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgYnV0dG9uOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNFNUU1RTU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiAjOTk5OwogICAgICAgIGNvbG9yOiAjMDAwOwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIuc3AtY29udGFpbmVyIGlucHV0IHsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgfQogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWlucHV0LnNwLXZhbGlkYXRpb24tZXJyb3IgewogICAgICAgIGJhY2tncm91bmQ6ICNGRkY7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWNhbmNlbCB7CiAgICAgICAgY29sb3I6ICNGOTIgIWltcG9ydGFudDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lci5zcC1jb250YWluZXIgLnNwLWNhbmNlbDpob3ZlciB7CiAgICAgICAgY29sb3I6ICNGNzIgIWltcG9ydGFudDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZS1jb250YWluZXIsCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1waWNrZXItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nOiA1cHggNXB4IDI5NXB4OwogICAgfQoKICAgIC5Db2xvclBhbGV0dGVDb250YWluZXIgLnNwLXBhbGV0dGUtdG9nZ2xlIHsKICAgICAgICBtYXJnaW4tdG9wOiAzcHg7CiAgICB9CgogICAgLkNvbG9yUGFsZXR0ZUNvbnRhaW5lciAuc3AtcGFsZXR0ZSB7CiAgICAgICAgbWF4LXdpZHRoOiAyNDBweDsKICAgIH0KCiAgICAuQ29sb3JQYWxldHRlQ29udGFpbmVyIC5zcC1wYWxldHRlIC5zcC10aHVtYi1lbCB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIG1hcmdpbjogMnB4OwogICAgfQoKICAgIGlucHV0W3JlYWRvbmx5XSArIC5Db2xvclBhbGV0dGVCdXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNEREQ7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9Cgp9IC8qIGVuZCBAbWVkaWEgKi8K
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KCihmdW5jdGlvbihmYWN0b3J5KSB7CglpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CgkJZGVmaW5lKFsgJ2pxdWVyeScsICdtb21lbnQnIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JyksIHJlcXVpcmUoJ21vbWVudCcpKTsKCX0KCWVsc2UgewoJCWZhY3RvcnkoalF1ZXJ5LCBtb21lbnQpOwoJfQp9KShmdW5jdGlvbigkLCBtb21lbnQpIHsKCjs7Cgp2YXIgRkMgPSAkLmZ1bGxDYWxlbmRhciA9IHsKCXZlcnNpb246ICIzLjAuMSIsCglpbnRlcm5hbEFwaVZlcnNpb246IDYKfTsKdmFyIGZjVmlld3MgPSBGQy52aWV3cyA9IHt9OwoKCiQuZm4uZnVsbENhbGVuZGFyID0gZnVuY3Rpb24ob3B0aW9ucykgewoJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBmb3IgYSBwb3NzaWJsZSBtZXRob2QgY2FsbAoJdmFyIHJlcyA9IHRoaXM7IC8vIHdoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAodGhpcyBqUXVlcnkgb2JqZWN0IGJ5IGRlZmF1bHQpCgoJdGhpcy5lYWNoKGZ1bmN0aW9uKGksIF9lbGVtZW50KSB7IC8vIGxvb3AgZWFjaCBET00gZWxlbWVudCBpbnZvbHZlZAoJCXZhciBlbGVtZW50ID0gJChfZWxlbWVudCk7CgkJdmFyIGNhbGVuZGFyID0gZWxlbWVudC5kYXRhKCdmdWxsQ2FsZW5kYXInKTsgLy8gZ2V0IHRoZSBleGlzdGluZyBjYWxlbmRhciBvYmplY3QgKGlmIGFueSkKCQl2YXIgc2luZ2xlUmVzOyAvLyB0aGUgcmV0dXJuZWQgdmFsdWUgb2YgdGhpcyBzaW5nbGUgbWV0aG9kIGNhbGwKCgkJLy8gYSBtZXRob2QgY2FsbAoJCWlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHsKCQkJaWYgKGNhbGVuZGFyICYmICQuaXNGdW5jdGlvbihjYWxlbmRhcltvcHRpb25zXSkpIHsKCQkJCXNpbmdsZVJlcyA9IGNhbGVuZGFyW29wdGlvbnNdLmFwcGx5KGNhbGVuZGFyLCBhcmdzKTsKCQkJCWlmICghaSkgewoJCQkJCXJlcyA9IHNpbmdsZVJlczsgLy8gcmVjb3JkIHRoZSBmaXJzdCBtZXRob2QgY2FsbCByZXN1bHQKCQkJCX0KCQkJCWlmIChvcHRpb25zID09PSAnZGVzdHJveScpIHsgLy8gZm9yIHRoZSBkZXN0cm95IG1ldGhvZCwgbXVzdCByZW1vdmUgQ2FsZW5kYXIgb2JqZWN0IGRhdGEKCQkJCQllbGVtZW50LnJlbW92ZURhdGEoJ2Z1bGxDYWxlbmRhcicpOwoJCQkJfQoJCQl9CgkJfQoJCS8vIGEgbmV3IGNhbGVuZGFyIGluaXRpYWxpemF0aW9uCgkJZWxzZSBpZiAoIWNhbGVuZGFyKSB7IC8vIGRvbid0IGluaXRpYWxpemUgdHdpY2UKCQkJY2FsZW5kYXIgPSBuZXcgQ2FsZW5kYXIoZWxlbWVudCwgb3B0aW9ucyk7CgkJCWVsZW1lbnQuZGF0YSgnZnVsbENhbGVuZGFyJywgY2FsZW5kYXIpOwoJCQljYWxlbmRhci5yZW5kZXIoKTsKCQl9Cgl9KTsKCQoJcmV0dXJuIHJlczsKfTsKCgp2YXIgY29tcGxleE9wdGlvbnMgPSBbIC8vIG5hbWVzIG9mIG9wdGlvbnMgdGhhdCBhcmUgb2JqZWN0cyB3aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb21iaW5lZAoJJ2hlYWRlcicsCgknYnV0dG9uVGV4dCcsCgknYnV0dG9uSWNvbnMnLAoJJ3RoZW1lQnV0dG9uSWNvbnMnCl07CgoKLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9wdGlvbiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0CmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhvcHRpb25PYmpzKSB7CglyZXR1cm4gbWVyZ2VQcm9wcyhvcHRpb25PYmpzLCBjb21wbGV4T3B0aW9ucyk7Cn0KCjs7CgovLyBleHBvcnRzCkZDLmludGVyc2VjdFJhbmdlcyA9IGludGVyc2VjdFJhbmdlczsKRkMuYXBwbHlBbGwgPSBhcHBseUFsbDsKRkMuZGVib3VuY2UgPSBkZWJvdW5jZTsKRkMuaXNJbnQgPSBpc0ludDsKRkMuaHRtbEVzY2FwZSA9IGh0bWxFc2NhcGU7CkZDLmNzc1RvU3RyID0gY3NzVG9TdHI7CkZDLnByb3h5ID0gcHJveHk7CkZDLmNhcGl0YWxpc2VGaXJzdExldHRlciA9IGNhcGl0YWxpc2VGaXJzdExldHRlcjsKCgovKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBHaXZlbiB0aGUgc2Nyb2xsYmFyIHdpZHRocyBvZiBzb21lIG90aGVyIGNvbnRhaW5lciwgY3JlYXRlIGJvcmRlcnMvbWFyZ2lucyBvbiByb3dFbHMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGxlZnQKLy8gYW5kIHJpZ2h0IHNwYWNlIHRoYXQgd2FzIG9mZnNldCBieSB0aGUgc2Nyb2xsYmFycy4gQSAxLXBpeGVsIGJvcmRlciBmaXJzdCwgdGhlbiBtYXJnaW4gYmV5b25kIHRoYXQuCmZ1bmN0aW9uIGNvbXBlbnNhdGVTY3JvbGwocm93RWxzLCBzY3JvbGxiYXJXaWR0aHMpIHsKCWlmIChzY3JvbGxiYXJXaWR0aHMubGVmdCkgewoJCXJvd0Vscy5jc3MoewoJCQknYm9yZGVyLWxlZnQtd2lkdGgnOiAxLAoJCQknbWFyZ2luLWxlZnQnOiBzY3JvbGxiYXJXaWR0aHMubGVmdCAtIDEKCQl9KTsKCX0KCWlmIChzY3JvbGxiYXJXaWR0aHMucmlnaHQpIHsKCQlyb3dFbHMuY3NzKHsKCQkJJ2JvcmRlci1yaWdodC13aWR0aCc6IDEsCgkJCSdtYXJnaW4tcmlnaHQnOiBzY3JvbGxiYXJXaWR0aHMucmlnaHQgLSAxCgkJfSk7Cgl9Cn0KCgovLyBVbmRvZXMgY29tcGVuc2F0ZVNjcm9sbCBhbmQgcmVzdG9yZXMgYWxsIGJvcmRlcnMvbWFyZ2lucwpmdW5jdGlvbiB1bmNvbXBlbnNhdGVTY3JvbGwocm93RWxzKSB7Cglyb3dFbHMuY3NzKHsKCQknbWFyZ2luLWxlZnQnOiAnJywKCQknbWFyZ2luLXJpZ2h0JzogJycsCgkJJ2JvcmRlci1sZWZ0LXdpZHRoJzogJycsCgkJJ2JvcmRlci1yaWdodC13aWR0aCc6ICcnCgl9KTsKfQoKCi8vIE1ha2UgdGhlIG1vdXNlIGN1cnNvciBleHByZXNzIHRoYXQgYW4gZXZlbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQgYXJlYQpmdW5jdGlvbiBkaXNhYmxlQ3Vyc29yKCkgewoJJCgnYm9keScpLmFkZENsYXNzKCdmYy1ub3QtYWxsb3dlZCcpOwp9CgoKLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rCmZ1bmN0aW9uIGVuYWJsZUN1cnNvcigpIHsKCSQoJ2JvZHknKS5yZW1vdmVDbGFzcygnZmMtbm90LWFsbG93ZWQnKTsKfQoKCi8vIEdpdmVuIGEgdG90YWwgYXZhaWxhYmxlIGhlaWdodCB0byBmaWxsLCBoYXZlIGBlbHNgIChlc3NlbnRpYWxseSBjaGlsZCByb3dzKSBleHBhbmQgdG8gYWNjb21vZGF0ZS4KLy8gQnkgZGVmYXVsdCwgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHNob3J0ZXIgdGhhbiB0aGUgcmVjb21tZW5kZWQgaGVpZ2h0IGFyZSBleHBhbmRlZCB1bmlmb3JtbHksIG5vdCBjb25zaWRlcmluZwovLyBhbnkgb3RoZXIgZWxzIHRoYXQgYXJlIGFscmVhZHkgdG9vIHRhbGwuIGlmIGBzaG91bGRSZWRpc3RyaWJ1dGVgIGlzIG9uLCBpdCBjb25zaWRlcnMgdGhlc2UgdGFsbCByb3dzIGFuZCAKLy8gcmVkdWNlcyB0aGUgYXZhaWxhYmxlIGhlaWdodC4KZnVuY3Rpb24gZGlzdHJpYnV0ZUhlaWdodChlbHMsIGF2YWlsYWJsZUhlaWdodCwgc2hvdWxkUmVkaXN0cmlidXRlKSB7CgoJLy8gKkZMT09SSU5HIE5PVEUqOiB3ZSBmbG9vciBpbiBjZXJ0YWluIHBsYWNlcyBiZWNhdXNlIHpvb20gY2FuIGdpdmUgaW5hY2N1cmF0ZSBmbG9hdGluZy1wb2ludCBkaW1lbnNpb25zLAoJLy8gYW5kIGl0IGlzIGJldHRlciB0byBiZSBzaG9ydGVyIHRoYW4gdGFsbGVyLCB0byBhdm9pZCBjcmVhdGluZyB1bm5lY2Vzc2FyeSBzY3JvbGxiYXJzLgoKCXZhciBtaW5PZmZzZXQxID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBlbHMubGVuZ3RoKTsgLy8gZm9yIG5vbi1sYXN0IGVsZW1lbnQKCXZhciBtaW5PZmZzZXQyID0gTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLSBtaW5PZmZzZXQxICogKGVscy5sZW5ndGggLSAxKSk7IC8vIGZvciBsYXN0IGVsZW1lbnQgKkZMT09SSU5HIE5PVEUqCgl2YXIgZmxleEVscyA9IFtdOyAvLyBlbGVtZW50cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4cGFuZC4gYXJyYXkgb2YgRE9NIG5vZGVzCgl2YXIgZmxleE9mZnNldHMgPSBbXTsgLy8gYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGl0IHRha2VzIHVwCgl2YXIgZmxleEhlaWdodHMgPSBbXTsgLy8gYWN0dWFsIGNzcyBoZWlnaHQKCXZhciB1c2VkSGVpZ2h0ID0gMDsKCgl1bmRpc3RyaWJ1dGVIZWlnaHQoZWxzKTsgLy8gZ2l2ZSBhbGwgZWxlbWVudHMgdGhlaXIgbmF0dXJhbCBoZWlnaHQKCgkvLyBmaW5kIGVsZW1lbnRzIHRoYXQgYXJlIGJlbG93IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgKGV4cGFuZGFibGUpLgoJLy8gaW1wb3J0YW50IHRvIHF1ZXJ5IGZvciBoZWlnaHRzIGluIGEgc2luZ2xlIGZpcnN0IHBhc3MgKHRvIGF2b2lkIHJlZmxvdyBvc2NpbGxhdGlvbikuCgllbHMuZWFjaChmdW5jdGlvbihpLCBlbCkgewoJCXZhciBtaW5PZmZzZXQgPSBpID09PSBlbHMubGVuZ3RoIC0gMSA/IG1pbk9mZnNldDIgOiBtaW5PZmZzZXQxOwoJCXZhciBuYXR1cmFsT2Zmc2V0ID0gJChlbCkub3V0ZXJIZWlnaHQodHJ1ZSk7CgoJCWlmIChuYXR1cmFsT2Zmc2V0IDwgbWluT2Zmc2V0KSB7CgkJCWZsZXhFbHMucHVzaChlbCk7CgkJCWZsZXhPZmZzZXRzLnB1c2gobmF0dXJhbE9mZnNldCk7CgkJCWZsZXhIZWlnaHRzLnB1c2goJChlbCkuaGVpZ2h0KCkpOwoJCX0KCQllbHNlIHsKCQkJLy8gdGhpcyBlbGVtZW50IHN0cmV0Y2hlcyBwYXN0IHJlY29tbWVuZGVkIGhlaWdodCAobm9uLWV4cGFuZGFibGUpLiBtYXJrIHRoZSBzcGFjZSBhcyBvY2N1cGllZC4KCQkJdXNlZEhlaWdodCArPSBuYXR1cmFsT2Zmc2V0OwoJCX0KCX0pOwoKCS8vIHJlYWRqdXN0IHRoZSByZWNvbW1lbmRlZCBoZWlnaHQgdG8gb25seSBjb25zaWRlciB0aGUgaGVpZ2h0IGF2YWlsYWJsZSB0byBub24tbWF4ZWQtb3V0IHJvd3MuCglpZiAoc2hvdWxkUmVkaXN0cmlidXRlKSB7CgkJYXZhaWxhYmxlSGVpZ2h0IC09IHVzZWRIZWlnaHQ7CgkJbWluT2Zmc2V0MSA9IE1hdGguZmxvb3IoYXZhaWxhYmxlSGVpZ2h0IC8gZmxleEVscy5sZW5ndGgpOwoJCW1pbk9mZnNldDIgPSBNYXRoLmZsb29yKGF2YWlsYWJsZUhlaWdodCAtIG1pbk9mZnNldDEgKiAoZmxleEVscy5sZW5ndGggLSAxKSk7IC8vICpGTE9PUklORyBOT1RFKgoJfQoKCS8vIGFzc2lnbiBoZWlnaHRzIHRvIGFsbCBleHBhbmRhYmxlIGVsZW1lbnRzCgkkKGZsZXhFbHMpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHsKCQl2YXIgbWluT2Zmc2V0ID0gaSA9PT0gZmxleEVscy5sZW5ndGggLSAxID8gbWluT2Zmc2V0MiA6IG1pbk9mZnNldDE7CgkJdmFyIG5hdHVyYWxPZmZzZXQgPSBmbGV4T2Zmc2V0c1tpXTsKCQl2YXIgbmF0dXJhbEhlaWdodCA9IGZsZXhIZWlnaHRzW2ldOwoJCXZhciBuZXdIZWlnaHQgPSBtaW5PZmZzZXQgLSAobmF0dXJhbE9mZnNldCAtIG5hdHVyYWxIZWlnaHQpOyAvLyBzdWJ0cmFjdCB0aGUgbWFyZ2luL3BhZGRpbmcKCgkJaWYgKG5hdHVyYWxPZmZzZXQgPCBtaW5PZmZzZXQpIHsgLy8gd2UgY2hlY2sgdGhpcyBhZ2FpbiBiZWNhdXNlIHJlZGlzdHJpYnV0aW9uIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGluZ3MKCQkJJChlbCkuaGVpZ2h0KG5ld0hlaWdodCk7CgkJfQoJfSk7Cn0KCgovLyBVbmRvZXMgZGlzdHJ1YnV0ZUhlaWdodCwgcmVzdG9yaW5nIGFsbCBlbHMgdG8gdGhlaXIgbmF0dXJhbCBoZWlnaHQKZnVuY3Rpb24gdW5kaXN0cmlidXRlSGVpZ2h0KGVscykgewoJZWxzLmhlaWdodCgnJyk7Cn0KCgovLyBHaXZlbiBgZWxzYCwgYSBqUXVlcnkgc2V0IG9mIDx0ZD4gY2VsbHMsIGZpbmQgdGhlIGNlbGwgd2l0aCB0aGUgbGFyZ2VzdCBuYXR1cmFsIHdpZHRoIGFuZCBzZXQgdGhlIHdpZHRocyBvZiBhbGwgdGhlCi8vIGNlbGxzIHRvIGJlIHRoYXQgd2lkdGguCi8vIFBSRVJFUVVJU0lURTogaWYgeW91IHdhbnQgYSBjZWxsIHRvIHRha2UgdXAgd2lkdGgsIGl0IG5lZWRzIHRvIGhhdmUgYSBzaW5nbGUgaW5uZXIgZWxlbWVudCB3LyBkaXNwbGF5OmlubGluZQpmdW5jdGlvbiBtYXRjaENlbGxXaWR0aHMoZWxzKSB7Cgl2YXIgbWF4SW5uZXJXaWR0aCA9IDA7CgoJZWxzLmZpbmQoJz4gKicpLmVhY2goZnVuY3Rpb24oaSwgaW5uZXJFbCkgewoJCXZhciBpbm5lcldpZHRoID0gJChpbm5lckVsKS5vdXRlcldpZHRoKCk7CgkJaWYgKGlubmVyV2lkdGggPiBtYXhJbm5lcldpZHRoKSB7CgkJCW1heElubmVyV2lkdGggPSBpbm5lcldpZHRoOwoJCX0KCX0pOwoKCW1heElubmVyV2lkdGgrKzsgLy8gc29tZXRpbWVzIG5vdCBhY2N1cmF0ZSBvZiB3aWR0aCB0aGUgdGV4dCBuZWVkcyB0byBzdGF5IG9uIG9uZSBsaW5lLiBpbnN1cmFuY2UKCgllbHMud2lkdGgobWF4SW5uZXJXaWR0aCk7CgoJcmV0dXJuIG1heElubmVyV2lkdGg7Cn0KCgovLyBHaXZlbiBvbmUgZWxlbWVudCB0aGF0IHJlc2lkZXMgaW5zaWRlIGFub3RoZXIsCi8vIFN1YnRyYWN0cyB0aGUgaGVpZ2h0IG9mIHRoZSBpbm5lciBlbGVtZW50IGZyb20gdGhlIG91dGVyIGVsZW1lbnQuCmZ1bmN0aW9uIHN1YnRyYWN0SW5uZXJFbEhlaWdodChvdXRlckVsLCBpbm5lckVsKSB7Cgl2YXIgYm90aCA9IG91dGVyRWwuYWRkKGlubmVyRWwpOwoJdmFyIGRpZmY7CgoJLy8gZWZmaW4nIElFOC85LzEwLzExIHNvbWV0aW1lcyByZXR1cm5zIDAgZm9yIGRpbWVuc2lvbnMuIHRoaXMgd2VpcmQgaGFjayB3YXMgdGhlIG9ubHkgdGhpbmcgdGhhdCB3b3JrZWQKCWJvdGguY3NzKHsKCQlwb3NpdGlvbjogJ3JlbGF0aXZlJywgLy8gY2F1c2UgYSByZWZsb3csIHdoaWNoIHdpbGwgZm9yY2UgZnJlc2ggZGltZW5zaW9uIHJlY2FsY3VsYXRpb24KCQlsZWZ0OiAtMSAvLyBlbnN1cmUgcmVmbG93IGluIGNhc2UgdGhlIGVsIHdhcyBhbHJlYWR5IHJlbGF0aXZlLiBuZWdhdGl2ZSBpcyBsZXNzIGxpa2VseSB0byBjYXVzZSBuZXcgc2Nyb2xsCgl9KTsKCWRpZmYgPSBvdXRlckVsLm91dGVySGVpZ2h0KCkgLSBpbm5lckVsLm91dGVySGVpZ2h0KCk7IC8vIGdyYWIgdGhlIGRpbWVuc2lvbnMKCWJvdGguY3NzKHsgcG9zaXRpb246ICcnLCBsZWZ0OiAnJyB9KTsgLy8gdW5kbyBoYWNrCgoJcmV0dXJuIGRpZmY7Cn0KCgovKiBFbGVtZW50IEdlb20gVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuZ2V0T3V0ZXJSZWN0ID0gZ2V0T3V0ZXJSZWN0OwpGQy5nZXRDbGllbnRSZWN0ID0gZ2V0Q2xpZW50UmVjdDsKRkMuZ2V0Q29udGVudFJlY3QgPSBnZXRDb250ZW50UmVjdDsKRkMuZ2V0U2Nyb2xsYmFyV2lkdGhzID0gZ2V0U2Nyb2xsYmFyV2lkdGhzOwoKCi8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi8xLjExLjAvdWkvY29yZS5qcyNMNTEKZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KGVsKSB7Cgl2YXIgcG9zaXRpb24gPSBlbC5jc3MoJ3Bvc2l0aW9uJyksCgkJc2Nyb2xsUGFyZW50ID0gZWwucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJdmFyIHBhcmVudCA9ICQodGhpcyk7CgkJCXJldHVybiAoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KAoJCQkJcGFyZW50LmNzcygnb3ZlcmZsb3cnKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXknKSArIHBhcmVudC5jc3MoJ292ZXJmbG93LXgnKQoJCQkpOwoJCX0pLmVxKDApOwoKCXJldHVybiBwb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCAhc2Nyb2xsUGFyZW50Lmxlbmd0aCA/ICQoZWxbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgOiBzY3JvbGxQYXJlbnQ7Cn0KCgovLyBRdWVyaWVzIHRoZSBvdXRlciBib3VuZGluZyBhcmVhIG9mIGEgalF1ZXJ5IGVsZW1lbnQuCi8vIFJldHVybnMgYSByZWN0YW5nbGUgd2l0aCBhYnNvbHV0ZSBjb29yZGluYXRlczogbGVmdCwgcmlnaHQgKGV4Y2x1c2l2ZSksIHRvcCwgYm90dG9tIChleGNsdXNpdmUpLgovLyBPcmlnaW4gaXMgb3B0aW9uYWwuCmZ1bmN0aW9uIGdldE91dGVyUmVjdChlbCwgb3JpZ2luKSB7Cgl2YXIgb2Zmc2V0ID0gZWwub2Zmc2V0KCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0IC0gKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCAtIChvcmlnaW4gPyBvcmlnaW4udG9wIDogMCk7CgoJcmV0dXJuIHsKCQlsZWZ0OiBsZWZ0LAoJCXJpZ2h0OiBsZWZ0ICsgZWwub3V0ZXJXaWR0aCgpLAoJCXRvcDogdG9wLAoJCWJvdHRvbTogdG9wICsgZWwub3V0ZXJIZWlnaHQoKQoJfTsKfQoKCi8vIFF1ZXJpZXMgdGhlIGFyZWEgd2l0aGluIHRoZSBtYXJnaW4vYm9yZGVyL3Njcm9sbGJhcnMgb2YgYSBqUXVlcnkgZWxlbWVudC4gRG9lcyBub3QgZ28gd2l0aGluIHRoZSBwYWRkaW5nLgovLyBSZXR1cm5zIGEgcmVjdGFuZ2xlIHdpdGggYWJzb2x1dGUgY29vcmRpbmF0ZXM6IGxlZnQsIHJpZ2h0IChleGNsdXNpdmUpLCB0b3AsIGJvdHRvbSAoZXhjbHVzaXZlKS4KLy8gT3JpZ2luIGlzIG9wdGlvbmFsLgovLyBOT1RFOiBzaG91bGQgdXNlIGNsaWVudExlZnQvY2xpZW50VG9wLCBidXQgdmVyeSB1bnJlbGlhYmxlIGNyb3NzLWJyb3dzZXIuCmZ1bmN0aW9uIGdldENsaWVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOwoJdmFyIHNjcm9sbGJhcldpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyhlbCk7Cgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgLSAob3JpZ2luID8gb3JpZ2luLmxlZnQgOiAwKTsKCXZhciB0b3AgPSBvZmZzZXQudG9wICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItdG9wLXdpZHRoJykgKyBzY3JvbGxiYXJXaWR0aHMudG9wIC0gKG9yaWdpbiA/IG9yaWdpbi50b3AgOiAwKTsKCglyZXR1cm4gewoJCWxlZnQ6IGxlZnQsCgkJcmlnaHQ6IGxlZnQgKyBlbFswXS5jbGllbnRXaWR0aCwgLy8gY2xpZW50V2lkdGggaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCQl0b3A6IHRvcCwKCQlib3R0b206IHRvcCArIGVsWzBdLmNsaWVudEhlaWdodCAvLyBjbGllbnRIZWlnaHQgaW5jbHVkZXMgcGFkZGluZyBidXQgTk9UIHNjcm9sbGJhcnMKCX07Cn0KCgovLyBRdWVyaWVzIHRoZSBhcmVhIHdpdGhpbiB0aGUgbWFyZ2luL2JvcmRlci9wYWRkaW5nIG9mIGEgalF1ZXJ5IGVsZW1lbnQuIEFzc3VtZWQgbm90IHRvIGhhdmUgc2Nyb2xsYmFycy4KLy8gUmV0dXJucyBhIHJlY3RhbmdsZSB3aXRoIGFic29sdXRlIGNvb3JkaW5hdGVzOiBsZWZ0LCByaWdodCAoZXhjbHVzaXZlKSwgdG9wLCBib3R0b20gKGV4Y2x1c2l2ZSkuCi8vIE9yaWdpbiBpcyBvcHRpb25hbC4KZnVuY3Rpb24gZ2V0Q29udGVudFJlY3QoZWwsIG9yaWdpbikgewoJdmFyIG9mZnNldCA9IGVsLm9mZnNldCgpOyAvLyBqdXN0IG91dHNpZGUgb2YgYm9yZGVyLCBtYXJnaW4gbm90IGluY2x1ZGVkCgl2YXIgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZ2V0Q3NzRmxvYXQoZWwsICdib3JkZXItbGVmdC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLWxlZnQnKSAtCgkJKG9yaWdpbiA/IG9yaWdpbi5sZWZ0IDogMCk7Cgl2YXIgdG9wID0gb2Zmc2V0LnRvcCArIGdldENzc0Zsb2F0KGVsLCAnYm9yZGVyLXRvcC13aWR0aCcpICsgZ2V0Q3NzRmxvYXQoZWwsICdwYWRkaW5nLXRvcCcpIC0KCQkob3JpZ2luID8gb3JpZ2luLnRvcCA6IDApOwoKCXJldHVybiB7CgkJbGVmdDogbGVmdCwKCQlyaWdodDogbGVmdCArIGVsLndpZHRoKCksCgkJdG9wOiB0b3AsCgkJYm90dG9tOiB0b3AgKyBlbC5oZWlnaHQoKQoJfTsKfQoKCi8vIFJldHVybnMgdGhlIGNvbXB1dGVkIGxlZnQvcmlnaHQvdG9wL2JvdHRvbSBzY3JvbGxiYXIgd2lkdGhzIGZvciB0aGUgZ2l2ZW4galF1ZXJ5IGVsZW1lbnQuCi8vIE5PVEU6IHNob3VsZCB1c2UgY2xpZW50TGVmdC9jbGllbnRUb3AsIGJ1dCB2ZXJ5IHVucmVsaWFibGUgY3Jvc3MtYnJvd3Nlci4KZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGhzKGVsKSB7Cgl2YXIgbGVmdFJpZ2h0V2lkdGggPSBlbC5pbm5lcldpZHRoKCkgLSBlbFswXS5jbGllbnRXaWR0aDsgLy8gdGhlIHBhZGRpbmdzIGNhbmNlbCBvdXQsIGxlYXZpbmcgdGhlIHNjcm9sbGJhcnMKCXZhciB3aWR0aHMgPSB7CgkJbGVmdDogMCwKCQlyaWdodDogMCwKCQl0b3A6IDAsCgkJYm90dG9tOiBlbC5pbm5lckhlaWdodCgpIC0gZWxbMF0uY2xpZW50SGVpZ2h0IC8vIHRoZSBwYWRkaW5ncyBjYW5jZWwgb3V0LCBsZWF2aW5nIHRoZSBib3R0b20gc2Nyb2xsYmFyCgl9OwoKCWlmIChnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgJiYgZWwuY3NzKCdkaXJlY3Rpb24nKSA9PSAncnRsJykgeyAvLyBpcyB0aGUgc2Nyb2xsYmFyIG9uIHRoZSBsZWZ0IHNpZGU/CgkJd2lkdGhzLmxlZnQgPSBsZWZ0UmlnaHRXaWR0aDsKCX0KCWVsc2UgewoJCXdpZHRocy5yaWdodCA9IGxlZnRSaWdodFdpZHRoOwoJfQoKCXJldHVybiB3aWR0aHM7Cn0KCgovLyBMb2dpYyBmb3IgZGV0ZXJtaW5pbmcgaWYsIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmlnaHQtdG8tbGVmdCwgdGhlIHNjcm9sbGJhciBhcHBlYXJzIG9uIHRoZSBsZWZ0IHNpZGUKCnZhciBfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9IG51bGw7CgpmdW5jdGlvbiBnZXRJc0xlZnRSdGxTY3JvbGxiYXJzKCkgeyAvLyByZXNwb25zaWJsZSBmb3IgY2FjaGluZyB0aGUgY29tcHV0YXRpb24KCWlmIChfaXNMZWZ0UnRsU2Nyb2xsYmFycyA9PT0gbnVsbCkgewoJCV9pc0xlZnRSdGxTY3JvbGxiYXJzID0gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKTsKCX0KCXJldHVybiBfaXNMZWZ0UnRsU2Nyb2xsYmFyczsKfQoKZnVuY3Rpb24gY29tcHV0ZUlzTGVmdFJ0bFNjcm9sbGJhcnMoKSB7IC8vIGNyZWF0ZXMgYW4gb2Zmc2NyZWVuIHRlc3QgZWxlbWVudCwgdGhlbiByZW1vdmVzIGl0Cgl2YXIgZWwgPSAkKCc8ZGl2PjxkaXYvPjwvZGl2PicpCgkJLmNzcyh7CgkJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCQl0b3A6IC0xMDAwLAoJCQlsZWZ0OiAwLAoJCQlib3JkZXI6IDAsCgkJCXBhZGRpbmc6IDAsCgkJCW92ZXJmbG93OiAnc2Nyb2xsJywKCQkJZGlyZWN0aW9uOiAncnRsJwoJCX0pCgkJLmFwcGVuZFRvKCdib2R5Jyk7Cgl2YXIgaW5uZXJFbCA9IGVsLmNoaWxkcmVuKCk7Cgl2YXIgcmVzID0gaW5uZXJFbC5vZmZzZXQoKS5sZWZ0ID4gZWwub2Zmc2V0KCkubGVmdDsgLy8gaXMgdGhlIGlubmVyIGRpdiBzaGlmdGVkIHRvIGFjY29tbW9kYXRlIGEgbGVmdCBzY3JvbGxiYXI/CgllbC5yZW1vdmUoKTsKCXJldHVybiByZXM7Cn0KCgovLyBSZXRyaWV2ZXMgYSBqUXVlcnkgZWxlbWVudCdzIGNvbXB1dGVkIENTUyB2YWx1ZSBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KLy8gSWYgdGhlIHF1ZXJpZWQgdmFsdWUgaXMgbm9uLW51bWVyaWMgKGV4OiBJRSBjYW4gcmV0dXJuICJtZWRpdW0iIGZvciBib3JkZXIgd2lkdGgpLCB3aWxsIGp1c3QgcmV0dXJuIHplcm8uCmZ1bmN0aW9uIGdldENzc0Zsb2F0KGVsLCBwcm9wKSB7CglyZXR1cm4gcGFyc2VGbG9hdChlbC5jc3MocHJvcCkpIHx8IDA7Cn0KCgovKiBNb3VzZSAvIFRvdWNoIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZDLnByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQ7CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gd2hldGhlciB0aGlzIHdhcyBhIGxlZnQgbW91c2UgY2xpY2sgYW5kIG5vIGN0cmwga2V5ICh3aGljaCBtZWFucyByaWdodCBjbGljayBvbiBNYWMpCmZ1bmN0aW9uIGlzUHJpbWFyeU1vdXNlQnV0dG9uKGV2KSB7CglyZXR1cm4gZXYud2hpY2ggPT0gMSAmJiAhZXYuY3RybEtleTsKfQoKCmZ1bmN0aW9uIGdldEV2WChldikgewoJaWYgKGV2LnBhZ2VYICE9PSB1bmRlZmluZWQpIHsKCQlyZXR1cm4gZXYucGFnZVg7Cgl9Cgl2YXIgdG91Y2hlcyA9IGV2Lm9yaWdpbmFsRXZlbnQudG91Y2hlczsKCWlmICh0b3VjaGVzKSB7CgkJcmV0dXJuIHRvdWNoZXNbMF0ucGFnZVg7Cgl9Cn0KCgpmdW5jdGlvbiBnZXRFdlkoZXYpIHsKCWlmIChldi5wYWdlWSAhPT0gdW5kZWZpbmVkKSB7CgkJcmV0dXJuIGV2LnBhZ2VZOwoJfQoJdmFyIHRvdWNoZXMgPSBldi5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7CglpZiAodG91Y2hlcykgewoJCXJldHVybiB0b3VjaGVzWzBdLnBhZ2VZOwoJfQp9CgoKZnVuY3Rpb24gZ2V0RXZJc1RvdWNoKGV2KSB7CglyZXR1cm4gL150b3VjaC8udGVzdChldi50eXBlKTsKfQoKCmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHsKCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKQoJCS5vbignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7Cn0KCgovLyBTdG9wcyBhIG1vdXNlL3RvdWNoIGV2ZW50IGZyb20gZG9pbmcgaXQncyBuYXRpdmUgYnJvd3NlciBhY3Rpb24KZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZXYpIHsKCWV2LnByZXZlbnREZWZhdWx0KCk7Cn0KCgovLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLgovLyB0aGlzIHdhcyBpbXBvc3NpYmxlIHRvIGRvIHdpdGggbm9ybWFsIG9uL29mZiBiZWNhdXNlICdzY3JvbGwnIGRvZXNuJ3QgYnViYmxlLgovLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMjk1NDU2NS85NjM0MgovLyByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLgpmdW5jdGlvbiBiaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovLyB1bmRvZXMgYmluZEFueVNjcm9sbC4gbXVzdCBwYXNzIGluIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4KLy8gcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4KZnVuY3Rpb24gdW5iaW5kQW55U2Nyb2xsKGhhbmRsZXIpIHsKCWlmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikgewoJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlCgkJcmV0dXJuIHRydWU7Cgl9CglyZXR1cm4gZmFsc2U7Cn0KCgovKiBHZW5lcmFsIEdlb21ldHJ5IFV0aWxzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMuaW50ZXJzZWN0UmVjdHMgPSBpbnRlcnNlY3RSZWN0czsKCi8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuIElmIHRoZXkgZG9uJ3QgaW50ZXJzZWN0LCByZXR1cm5zIGZhbHNlCmZ1bmN0aW9uIGludGVyc2VjdFJlY3RzKHJlY3QxLCByZWN0MikgewoJdmFyIHJlcyA9IHsKCQlsZWZ0OiBNYXRoLm1heChyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKCQlyaWdodDogTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KSwKCQl0b3A6IE1hdGgubWF4KHJlY3QxLnRvcCwgcmVjdDIudG9wKSwKCQlib3R0b206IE1hdGgubWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQoJfTsKCglpZiAocmVzLmxlZnQgPCByZXMucmlnaHQgJiYgcmVzLnRvcCA8IHJlcy5ib3R0b20pIHsKCQlyZXR1cm4gcmVzOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyBhIG5ldyBwb2ludCB0aGF0IHdpbGwgaGF2ZSBiZWVuIG1vdmVkIHRvIHJlc2lkZSB3aXRoaW4gdGhlIGdpdmVuIHJlY3RhbmdsZQpmdW5jdGlvbiBjb25zdHJhaW5Qb2ludChwb2ludCwgcmVjdCkgewoJcmV0dXJuIHsKCQlsZWZ0OiBNYXRoLm1pbihNYXRoLm1heChwb2ludC5sZWZ0LCByZWN0LmxlZnQpLCByZWN0LnJpZ2h0KSwKCQl0b3A6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnRvcCwgcmVjdC50b3ApLCByZWN0LmJvdHRvbSkKCX07Cn0KCgovLyBSZXR1cm5zIGEgcG9pbnQgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbiByZWN0YW5nbGUKZnVuY3Rpb24gZ2V0UmVjdENlbnRlcihyZWN0KSB7CglyZXR1cm4gewoJCWxlZnQ6IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsCgkJdG9wOiAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyCgl9Owp9CgoKLy8gU3VidHJhY3RzIHBvaW50MidzIGNvb3JkaW5hdGVzIGZyb20gcG9pbnQxJ3MgY29vcmRpbmF0ZXMsIHJldHVybmluZyBhIGRlbHRhCmZ1bmN0aW9uIGRpZmZQb2ludHMocG9pbnQxLCBwb2ludDIpIHsKCXJldHVybiB7CgkJbGVmdDogcG9pbnQxLmxlZnQgLSBwb2ludDIubGVmdCwKCQl0b3A6IHBvaW50MS50b3AgLSBwb2ludDIudG9wCgl9Owp9CgoKLyogT2JqZWN0IE9yZGVyaW5nIGJ5IEZpZWxkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMucGFyc2VGaWVsZFNwZWNzID0gcGFyc2VGaWVsZFNwZWNzOwpGQy5jb21wYXJlQnlGaWVsZFNwZWNzID0gY29tcGFyZUJ5RmllbGRTcGVjczsKRkMuY29tcGFyZUJ5RmllbGRTcGVjID0gY29tcGFyZUJ5RmllbGRTcGVjOwpGQy5mbGV4aWJsZUNvbXBhcmUgPSBmbGV4aWJsZUNvbXBhcmU7CgoKZnVuY3Rpb24gcGFyc2VGaWVsZFNwZWNzKGlucHV0KSB7Cgl2YXIgc3BlY3MgPSBbXTsKCXZhciB0b2tlbnMgPSBbXTsKCXZhciBpLCB0b2tlbjsKCglpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgewoJCXRva2VucyA9IGlucHV0LnNwbGl0KC9ccyosXHMqLyk7Cgl9CgllbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHsKCQl0b2tlbnMgPSBbIGlucHV0IF07Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJdG9rZW5zID0gaW5wdXQ7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewoJCXRva2VuID0gdG9rZW5zW2ldOwoKCQlpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykgewoJCQlzcGVjcy5wdXNoKAoJCQkJdG9rZW4uY2hhckF0KDApID09ICctJyA/CgkJCQkJeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6CgkJCQkJeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0KCQkJKTsKCQl9CgkJZWxzZSBpZiAodHlwZW9mIHRva2VuID09PSAnZnVuY3Rpb24nKSB7CgkJCXNwZWNzLnB1c2goeyBmdW5jOiB0b2tlbiB9KTsKCQl9Cgl9CgoJcmV0dXJuIHNwZWNzOwp9CgoKZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmoxLCBvYmoyLCBmaWVsZFNwZWNzKSB7Cgl2YXIgaTsKCXZhciBjbXA7CgoJZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpKyspIHsKCQljbXAgPSBjb21wYXJlQnlGaWVsZFNwZWMob2JqMSwgb2JqMiwgZmllbGRTcGVjc1tpXSk7CgkJaWYgKGNtcCkgewoJCQlyZXR1cm4gY21wOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlYyhvYmoxLCBvYmoyLCBmaWVsZFNwZWMpIHsKCWlmIChmaWVsZFNwZWMuZnVuYykgewoJCXJldHVybiBmaWVsZFNwZWMuZnVuYyhvYmoxLCBvYmoyKTsKCX0KCXJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMVtmaWVsZFNwZWMuZmllbGRdLCBvYmoyW2ZpZWxkU3BlYy5maWVsZF0pICoKCQkoZmllbGRTcGVjLm9yZGVyIHx8IDEpOwp9CgoKZnVuY3Rpb24gZmxleGlibGVDb21wYXJlKGEsIGIpIHsKCWlmICghYSAmJiAhYikgewoJCXJldHVybiAwOwoJfQoJaWYgKGIgPT0gbnVsbCkgewoJCXJldHVybiAtMTsKCX0KCWlmIChhID09IG51bGwpIHsKCQlyZXR1cm4gMTsKCX0KCWlmICgkLnR5cGUoYSkgPT09ICdzdHJpbmcnIHx8ICQudHlwZShiKSA9PT0gJ3N0cmluZycpIHsKCQlyZXR1cm4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKTsKCX0KCXJldHVybiBhIC0gYjsKfQoKCi8qIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyBNaXNjIFV0aWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgovLyBDb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmFuZ2VzLiBXaWxsIHJldHVybiBmcmVzaCBkYXRlIGNsb25lcyBpbiBhIHJhbmdlLgovLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb24uCi8vIEV4cGVjdHMgYWxsIGRhdGVzIHRvIGJlIG5vcm1hbGl6ZWQgdG8gdGhlIHNhbWUgdGltZXpvbmUgYmVmb3JlaGFuZC4KLy8gVE9ETzogbW92ZSB0byBkYXRlIHNlY3Rpb24/CmZ1bmN0aW9uIGludGVyc2VjdFJhbmdlcyhzdWJqZWN0UmFuZ2UsIGNvbnN0cmFpbnRSYW5nZSkgewoJdmFyIHN1YmplY3RTdGFydCA9IHN1YmplY3RSYW5nZS5zdGFydDsKCXZhciBzdWJqZWN0RW5kID0gc3ViamVjdFJhbmdlLmVuZDsKCXZhciBjb25zdHJhaW50U3RhcnQgPSBjb25zdHJhaW50UmFuZ2Uuc3RhcnQ7Cgl2YXIgY29uc3RyYWludEVuZCA9IGNvbnN0cmFpbnRSYW5nZS5lbmQ7Cgl2YXIgc2VnU3RhcnQsIHNlZ0VuZDsKCXZhciBpc1N0YXJ0LCBpc0VuZDsKCglpZiAoc3ViamVjdEVuZCA+IGNvbnN0cmFpbnRTdGFydCAmJiBzdWJqZWN0U3RhcnQgPCBjb25zdHJhaW50RW5kKSB7IC8vIGluIGJvdW5kcyBhdCBhbGw/CgoJCWlmIChzdWJqZWN0U3RhcnQgPj0gY29uc3RyYWludFN0YXJ0KSB7CgkJCXNlZ1N0YXJ0ID0gc3ViamVjdFN0YXJ0LmNsb25lKCk7CgkJCWlzU3RhcnQgPSB0cnVlOwoJCX0KCQllbHNlIHsKCQkJc2VnU3RhcnQgPSBjb25zdHJhaW50U3RhcnQuY2xvbmUoKTsKCQkJaXNTdGFydCA9ICBmYWxzZTsKCQl9CgoJCWlmIChzdWJqZWN0RW5kIDw9IGNvbnN0cmFpbnRFbmQpIHsKCQkJc2VnRW5kID0gc3ViamVjdEVuZC5jbG9uZSgpOwoJCQlpc0VuZCA9IHRydWU7CgkJfQoJCWVsc2UgewoJCQlzZWdFbmQgPSBjb25zdHJhaW50RW5kLmNsb25lKCk7CgkJCWlzRW5kID0gZmFsc2U7CgkJfQoKCQlyZXR1cm4gewoJCQlzdGFydDogc2VnU3RhcnQsCgkJCWVuZDogc2VnRW5kLAoJCQlpc1N0YXJ0OiBpc1N0YXJ0LAoJCQlpc0VuZDogaXNFbmQKCQl9OwoJfQp9CgoKLyogRGF0ZSBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpGQy5jb21wdXRlSW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdDsKRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwpGQy5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24gPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb247CkZDLm11bHRpcGx5RHVyYXRpb24gPSBtdWx0aXBseUR1cmF0aW9uOwpGQy5kdXJhdGlvbkhhc1RpbWUgPSBkdXJhdGlvbkhhc1RpbWU7Cgp2YXIgZGF5SURzID0gWyAnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0JyBdOwp2YXIgaW50ZXJ2YWxVbml0cyA9IFsgJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJyBdOwoKCi8vIERpZmZzIHRoZSB0d28gbW9tZW50cyBpbnRvIGEgRHVyYXRpb24gd2hlcmUgZnVsbC1kYXlzIGFyZSByZWNvcmRlZCBmaXJzdCwgdGhlbiB0aGUgcmVtYWluaW5nIHRpbWUuCi8vIE1vbWVudHMgd2lsbCBoYXZlIHRoZWlyIHRpbWV6b25lcyBub3JtYWxpemVkLgpmdW5jdGlvbiBkaWZmRGF5VGltZShhLCBiKSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsKCQlkYXlzOiBhLmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihiLmNsb25lKCkuc3RyaXBUaW1lKCksICdkYXlzJyksCgkJbXM6IGEudGltZSgpIC0gYi50aW1lKCkgLy8gdGltZS1vZi1kYXkgZnJvbSBkYXkgc3RhcnQuIGRpc3JlZ2FyZHMgdGltZXpvbmUKCX0pOwp9CgoKLy8gRGlmZnMgdGhlIHR3byBtb21lbnRzIHZpYSB0aGVpciBzdGFydC1vZi1kYXkgKHJlZ2FyZGxlc3Mgb2YgdGltZXpvbmUpLiBQcm9kdWNlcyB3aG9sZS1kYXkgZHVyYXRpb25zLgpmdW5jdGlvbiBkaWZmRGF5KGEsIGIpIHsKCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCWRheXM6IGEuY2xvbmUoKS5zdHJpcFRpbWUoKS5kaWZmKGIuY2xvbmUoKS5zdHJpcFRpbWUoKSwgJ2RheXMnKQoJfSk7Cn0KCgovLyBEaWZmcyB0d28gbW9tZW50cywgcHJvZHVjaW5nIGEgZHVyYXRpb24sIG1hZGUgb2YgYSB3aG9sZS11bml0LWluY3JlbWVudCBvZiB0aGUgZ2l2ZW4gdW5pdC4gVXNlcyByb3VuZGluZy4KZnVuY3Rpb24gZGlmZkJ5VW5pdChhLCBiLCB1bml0KSB7CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKAoJCU1hdGgucm91bmQoYS5kaWZmKGIsIHVuaXQsIHRydWUpKSwgLy8gcmV0dXJuRmxvYXQ9dHJ1ZQoJCXVuaXQKCSk7Cn0KCgovLyBDb21wdXRlcyB0aGUgdW5pdCBuYW1lIG9mIHRoZSBsYXJnZXN0IHdob2xlLXVuaXQgcGVyaW9kIG9mIHRpbWUuCi8vIEZvciBleGFtcGxlLCA0OCBob3VycyB3aWxsIGJlICJkYXlzIiB3aGVyZWFzIDQ5IGhvdXJzIHdpbGwgYmUgImhvdXJzIi4KLy8gQWNjZXB0cyBzdGFydC9lbmQsIGEgcmFuZ2Ugb2JqZWN0LCBvciBhbiBvcmlnaW5hbCBkdXJhdGlvbiBvYmplY3QuCmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbFVuaXQoc3RhcnQsIGVuZCkgewoJdmFyIGksIHVuaXQ7Cgl2YXIgdmFsOwoKCWZvciAoaSA9IDA7IGkgPCBpbnRlcnZhbFVuaXRzLmxlbmd0aDsgaSsrKSB7CgkJdW5pdCA9IGludGVydmFsVW5pdHNbaV07CgkJdmFsID0gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCk7CgoJCWlmICh2YWwgPj0gMSAmJiBpc0ludCh2YWwpKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gdW5pdDsgLy8gd2lsbCBiZSAibWlsbGlzZWNvbmRzIiBpZiBub3RoaW5nIGVsc2UgbWF0Y2hlcwp9CgoKLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiB1bml0cyAobGlrZSAiaG91cnMiKSBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCi8vIFJhbmdlIGNhbiBiZSBhIHtzdGFydCxlbmR9IG9iamVjdCwgc2VwYXJhdGUgc3RhcnQvZW5kIGFyZ3MsIG9yIGEgRHVyYXRpb24uCi8vIFJlc3VsdHMgYXJlIGJhc2VkIG9uIE1vbWVudCdzIC5hcygpIGFuZCAuZGlmZigpIG1ldGhvZHMsIHNvIHJlc3VsdHMgY2FuIGRlcGVuZCBvbiBpbnRlcm5hbCBoYW5kbGluZwovLyBvZiBtb250aC1kaWZmaW5nIGxvZ2ljICh3aGljaCB0ZW5kcyB0byB2YXJ5IGZyb20gdmVyc2lvbiB0byB2ZXJzaW9uKS4KZnVuY3Rpb24gY29tcHV0ZVJhbmdlQXModW5pdCwgc3RhcnQsIGVuZCkgewoKCWlmIChlbmQgIT0gbnVsbCkgeyAvLyBnaXZlbiBzdGFydCwgZW5kCgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0LCB0cnVlKTsKCX0KCWVsc2UgaWYgKG1vbWVudC5pc0R1cmF0aW9uKHN0YXJ0KSkgeyAvLyBnaXZlbiBkdXJhdGlvbgoJCXJldHVybiBzdGFydC5hcyh1bml0KTsKCX0KCWVsc2UgeyAvLyBnaXZlbiB7IHN0YXJ0LCBlbmQgfSByYW5nZSBvYmplY3QKCQlyZXR1cm4gc3RhcnQuZW5kLmRpZmYoc3RhcnQuc3RhcnQsIHVuaXQsIHRydWUpOwoJfQp9CgoKLy8gSW50ZWxsaWdlbnRseSBkaXZpZGVzIGEgcmFuZ2UgKHNwZWNpZmllZCBieSBhIHN0YXJ0L2VuZCBwYXJhbXMpIGJ5IGEgZHVyYXRpb24KZnVuY3Rpb24gZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHN0YXJ0LCBlbmQsIGR1cikgewoJdmFyIG1vbnRoczsKCglpZiAoZHVyYXRpb25IYXNUaW1lKGR1cikpIHsKCQlyZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cjsKCX0KCW1vbnRocyA9IGR1ci5hc01vbnRocygpOwoJaWYgKE1hdGguYWJzKG1vbnRocykgPj0gMSAmJiBpc0ludChtb250aHMpKSB7CgkJcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCAnbW9udGhzJywgdHJ1ZSkgLyBtb250aHM7Cgl9CglyZXR1cm4gZW5kLmRpZmYoc3RhcnQsICdkYXlzJywgdHJ1ZSkgLyBkdXIuYXNEYXlzKCk7Cn0KCgovLyBJbnRlbGxpZ2VudGx5IGRpdmlkZXMgb25lIGR1cmF0aW9uIGJ5IGFub3RoZXIKZnVuY3Rpb24gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKGR1cjEsIGR1cjIpIHsKCXZhciBtb250aHMxLCBtb250aHMyOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyMSkgfHwgZHVyYXRpb25IYXNUaW1lKGR1cjIpKSB7CgkJcmV0dXJuIGR1cjEgLyBkdXIyOwoJfQoJbW9udGhzMSA9IGR1cjEuYXNNb250aHMoKTsKCW1vbnRoczIgPSBkdXIyLmFzTW9udGhzKCk7CglpZiAoCgkJTWF0aC5hYnMobW9udGhzMSkgPj0gMSAmJiBpc0ludChtb250aHMxKSAmJgoJCU1hdGguYWJzKG1vbnRoczIpID49IDEgJiYgaXNJbnQobW9udGhzMikKCSkgewoJCXJldHVybiBtb250aHMxIC8gbW9udGhzMjsKCX0KCXJldHVybiBkdXIxLmFzRGF5cygpIC8gZHVyMi5hc0RheXMoKTsKfQoKCi8vIEludGVsbGlnZW50bHkgbXVsdGlwbGllcyBhIGR1cmF0aW9uIGJ5IGEgbnVtYmVyCmZ1bmN0aW9uIG11bHRpcGx5RHVyYXRpb24oZHVyLCBuKSB7Cgl2YXIgbW9udGhzOwoKCWlmIChkdXJhdGlvbkhhc1RpbWUoZHVyKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyICogbik7Cgl9Cgltb250aHMgPSBkdXIuYXNNb250aHMoKTsKCWlmIChNYXRoLmFicyhtb250aHMpID49IDEgJiYgaXNJbnQobW9udGhzKSkgewoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oeyBtb250aHM6IG1vbnRocyAqIG4gfSk7Cgl9CglyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHsgZGF5czogZHVyLmFzRGF5cygpICogbiB9KTsKfQoKCi8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIGdpdmVuIGR1cmF0aW9uIGhhcyBhbnkgdGltZSBwYXJ0cyAoaG91cnMvbWludXRlcy9zZWNvbmRzL21zKQpmdW5jdGlvbiBkdXJhdGlvbkhhc1RpbWUoZHVyKSB7CglyZXR1cm4gQm9vbGVhbihkdXIuaG91cnMoKSB8fCBkdXIubWludXRlcygpIHx8IGR1ci5zZWNvbmRzKCkgfHwgZHVyLm1pbGxpc2Vjb25kcygpKTsKfQoKCmZ1bmN0aW9uIGlzTmF0aXZlRGF0ZShpbnB1dCkgewoJcmV0dXJuICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXScgfHwgaW5wdXQgaW5zdGFuY2VvZiBEYXRlOwp9CgoKLy8gUmV0dXJucyBhIGJvb2xlYW4gYWJvdXQgd2hldGhlciB0aGUgZ2l2ZW4gaW5wdXQgaXMgYSB0aW1lIHN0cmluZywgbGlrZSAiMDY6NDA6MDAiIG9yICIwNjowMCIKZnVuY3Rpb24gaXNUaW1lU3RyaW5nKHN0cikgewoJcmV0dXJuIC9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3Qoc3RyKTsKfQoKCi8qIExvZ2dpbmcgYW5kIERlYnVnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKRkMubG9nID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUubG9nKSB7CgkJcmV0dXJuIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7Cgl9Cn07CgpGQy53YXJuID0gZnVuY3Rpb24oKSB7Cgl2YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlOwoKCWlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgewoJCXJldHVybiBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTsKCX0KCWVsc2UgewoJCXJldHVybiBGQy5sb2cuYXBwbHkoRkMsIGFyZ3VtZW50cyk7Cgl9Cn07CgoKLyogR2VuZXJhbCBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgaGFzT3duUHJvcE1ldGhvZCA9IHt9Lmhhc093blByb3BlcnR5OwoKCi8vIE1lcmdlcyBhbiBhcnJheSBvZiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0LgovLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci4KZnVuY3Rpb24gbWVyZ2VQcm9wcyhwcm9wT2JqcywgY29tcGxleFByb3BzKSB7Cgl2YXIgZGVzdCA9IHt9OwoJdmFyIGksIG5hbWU7Cgl2YXIgY29tcGxleE9ianM7Cgl2YXIgaiwgdmFsOwoJdmFyIHByb3BzOwoKCWlmIChjb21wbGV4UHJvcHMpIHsKCQlmb3IgKGkgPSAwOyBpIDwgY29tcGxleFByb3BzLmxlbmd0aDsgaSsrKSB7CgkJCW5hbWUgPSBjb21wbGV4UHJvcHNbaV07CgkJCWNvbXBsZXhPYmpzID0gW107CgoJCQkvLyBjb2xsZWN0IHRoZSB0cmFpbGluZyBvYmplY3QgdmFsdWVzLCBzdG9wcGluZyB3aGVuIGEgbm9uLW9iamVjdCBpcyBkaXNjb3ZlcmVkCgkJCWZvciAoaiA9IHByb3BPYmpzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CgkJCQl2YWwgPSBwcm9wT2Jqc1tqXVtuYW1lXTsKCgkJCQlpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHsKCQkJCQljb21wbGV4T2Jqcy51bnNoaWZ0KHZhbCk7CgkJCQl9CgkJCQllbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCWRlc3RbbmFtZV0gPSB2YWw7IC8vIGlmIHRoZXJlIHdlcmUgbm8gb2JqZWN0cywgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJLy8gaWYgdGhlIHRyYWlsaW5nIHZhbHVlcyB3ZXJlIG9iamVjdHMsIHVzZSB0aGUgbWVyZ2VkIHZhbHVlCgkJCWlmIChjb21wbGV4T2Jqcy5sZW5ndGgpIHsKCQkJCWRlc3RbbmFtZV0gPSBtZXJnZVByb3BzKGNvbXBsZXhPYmpzKTsKCQkJfQoJCX0KCX0KCgkvLyBjb3B5IHZhbHVlcyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwgZ29pbmcgZnJvbSBsYXN0IHRvIGZpcnN0Cglmb3IgKGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCXByb3BzID0gcHJvcE9ianNbaV07CgoJCWZvciAobmFtZSBpbiBwcm9wcykgewoJCQlpZiAoIShuYW1lIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ24KCQkJCWRlc3RbbmFtZV0gPSBwcm9wc1tuYW1lXTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gZGVzdDsKfQoKCi8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIHByb3RvdHlwZS4gSnVzdCBsaWtlIE9iamVjdC5jcmVhdGUKZnVuY3Rpb24gY3JlYXRlT2JqZWN0KHByb3RvKSB7Cgl2YXIgZiA9IGZ1bmN0aW9uKCkge307CglmLnByb3RvdHlwZSA9IHByb3RvOwoJcmV0dXJuIG5ldyBmKCk7Cn0KCgpmdW5jdGlvbiBjb3B5T3duUHJvcHMoc3JjLCBkZXN0KSB7Cglmb3IgKHZhciBuYW1lIGluIHNyYykgewoJCWlmIChoYXNPd25Qcm9wKHNyYywgbmFtZSkpIHsKCQkJZGVzdFtuYW1lXSA9IHNyY1tuYW1lXTsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiBoYXNPd25Qcm9wKG9iaiwgbmFtZSkgewoJcmV0dXJuIGhhc093blByb3BNZXRob2QuY2FsbChvYmosIG5hbWUpOwp9CgoKLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGEgbm9uLW9iamVjdCBub24tZnVuY3Rpb24gdmFsdWU/CmZ1bmN0aW9uIGlzQXRvbWljKHZhbCkgewoJcmV0dXJuIC91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QoJC50eXBlKHZhbCkpOwp9CgoKZnVuY3Rpb24gYXBwbHlBbGwoZnVuY3Rpb25zLCB0aGlzT2JqLCBhcmdzKSB7CglpZiAoJC5pc0Z1bmN0aW9uKGZ1bmN0aW9ucykpIHsKCQlmdW5jdGlvbnMgPSBbIGZ1bmN0aW9ucyBdOwoJfQoJaWYgKGZ1bmN0aW9ucykgewoJCXZhciBpOwoJCXZhciByZXQ7CgkJZm9yIChpPTA7IGk8ZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7CgkJCXJldCA9IGZ1bmN0aW9uc1tpXS5hcHBseSh0aGlzT2JqLCBhcmdzKSB8fCByZXQ7CgkJfQoJCXJldHVybiByZXQ7Cgl9Cn0KCgpmdW5jdGlvbiBmaXJzdERlZmluZWQoKSB7Cglmb3IgKHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CgkJaWYgKGFyZ3VtZW50c1tpXSAhPT0gdW5kZWZpbmVkKSB7CgkJCXJldHVybiBhcmd1bWVudHNbaV07CgkJfQoJfQp9CgoKZnVuY3Rpb24gaHRtbEVzY2FwZShzKSB7CglyZXR1cm4gKHMgKyAnJykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQoJCS5yZXBsYWNlKC88L2csICcmbHQ7JykKCQkucmVwbGFjZSgvPi9nLCAnJmd0OycpCgkJLnJlcGxhY2UoLycvZywgJyYjMDM5OycpCgkJLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCgkJLnJlcGxhY2UoL1xuL2csICc8YnIgLz4nKTsKfQoKCmZ1bmN0aW9uIHN0cmlwSHRtbEVudGl0aWVzKHRleHQpIHsKCXJldHVybiB0ZXh0LnJlcGxhY2UoLyYuKj87L2csICcnKTsKfQoKCi8vIEdpdmVuIGEgaGFzaCBvZiBDU1MgcHJvcGVydGllcywgcmV0dXJucyBhIHN0cmluZyBvZiBDU1MuCi8vIFVzZXMgcHJvcGVydHkgbmFtZXMgYXMtaXMgKG5vIGNhbWVsLWNhc2UgY29udmVyc2lvbikuIFdpbGwgbm90IG1ha2Ugc3RhdGVtZW50cyBmb3IgbnVsbC91bmRlZmluZWQgdmFsdWVzLgpmdW5jdGlvbiBjc3NUb1N0cihjc3NQcm9wcykgewoJdmFyIHN0YXRlbWVudHMgPSBbXTsKCgkkLmVhY2goY3NzUHJvcHMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlzdGF0ZW1lbnRzLnB1c2gobmFtZSArICc6JyArIHZhbCk7CgkJfQoJfSk7CgoJcmV0dXJuIHN0YXRlbWVudHMuam9pbignOycpOwp9CgoKLy8gR2l2ZW4gYW4gb2JqZWN0IGhhc2ggb2YgSFRNTCBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLAovLyBnZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgYmV0d2VlbiA8ID4gaW4gSFRNTApmdW5jdGlvbiBhdHRyc1RvU3RyKGF0dHJzKSB7Cgl2YXIgcGFydHMgPSBbXTsKCgkkLmVhY2goYXR0cnMsIGZ1bmN0aW9uKG5hbWUsIHZhbCkgewoJCWlmICh2YWwgIT0gbnVsbCkgewoJCQlwYXJ0cy5wdXNoKG5hbWUgKyAnPSInICsgaHRtbEVzY2FwZSh2YWwpICsgJyInKTsKCQl9Cgl9KTsKCglyZXR1cm4gcGFydHMuam9pbignICcpOwp9CgoKZnVuY3Rpb24gY2FwaXRhbGlzZUZpcnN0TGV0dGVyKHN0cikgewoJcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTsKfQoKCmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHsgLy8gZm9yIC5zb3J0KCkKCXJldHVybiBhIC0gYjsKfQoKCmZ1bmN0aW9uIGlzSW50KG4pIHsKCXJldHVybiBuICUgMSA9PT0gMDsKfQoKCi8vIFJldHVybnMgYSBtZXRob2QgYm91bmQgdG8gdGhlIGdpdmVuIG9iamVjdCBjb250ZXh0LgovLyBKdXN0IGxpa2Ugb25lIG9mIHRoZSBqUXVlcnkucHJveHkgc2lnbmF0dXJlcywgYnV0IHdpdGhvdXQgdGhlIHVuZGVzaXJlZCBiZWhhdmlvciBvZiB0cmVhdGluZyB0aGUgc2FtZSBtZXRob2Qgd2l0aAovLyBkaWZmZXJlbnQgY29udGV4dHMgYXMgaWRlbnRpY2FsIHdoZW4gYmluZGluZy91bmJpbmRpbmcgZXZlbnRzLgpmdW5jdGlvbiBwcm94eShvYmosIG1ldGhvZE5hbWUpIHsKCXZhciBtZXRob2QgPSBvYmpbbWV0aG9kTmFtZV07CgoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCXJldHVybiBtZXRob2QuYXBwbHkob2JqLCBhcmd1bWVudHMpOwoJfTsKfQoKCi8vIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3QKLy8gYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvcgovLyBOIG1pbGxpc2Vjb25kcy4gSWYgYGltbWVkaWF0ZWAgaXMgcGFzc2VkLCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUKLy8gbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy4KLy8gaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvMS42LjAvdW5kZXJzY29yZS5qcyNMNzE0CmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkgewoJdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0OwoKCXZhciBsYXRlciA9IGZ1bmN0aW9uKCkgewoJCXZhciBsYXN0ID0gK25ldyBEYXRlKCkgLSB0aW1lc3RhbXA7CgkJaWYgKGxhc3QgPCB3YWl0KSB7CgkJCXRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7CgkJfQoJCWVsc2UgewoJCQl0aW1lb3V0ID0gbnVsbDsKCQkJaWYgKCFpbW1lZGlhdGUpIHsKCQkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCQljb250ZXh0ID0gYXJncyA9IG51bGw7CgkJCX0KCQl9Cgl9OwoKCXJldHVybiBmdW5jdGlvbigpIHsKCQljb250ZXh0ID0gdGhpczsKCQlhcmdzID0gYXJndW1lbnRzOwoJCXRpbWVzdGFtcCA9ICtuZXcgRGF0ZSgpOwoJCXZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0OwoJCWlmICghdGltZW91dCkgewoJCQl0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7CgkJfQoJCWlmIChjYWxsTm93KSB7CgkJCXJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7CgkJCWNvbnRleHQgPSBhcmdzID0gbnVsbDsKCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX07Cn0KCgovLyBIQUNLIGFyb3VuZCBqUXVlcnkncyBub3cgQSsgcHJvbWlzZXM6IGV4ZWN1dGUgY2FsbGJhY2sgc3luY2hyb25vdXNseSBpZiBhbHJlYWR5IHJlc29sdmVkLgovLyB0aGVuRnVuYyBzaG91bGRuJ3QgYWNjZXB0IGFyZ3MuCi8vIHNpbWlsYXIgdG8gd2hlblJlc291cmNlcyBpbiBTY2hlZHVsZXIgcGx1Z2luLgpmdW5jdGlvbiBzeW5jVGhlbihwcm9taXNlLCB0aGVuRnVuYykgewoJLy8gbm90IGEgcHJvbWlzZSwgb3IgYW4gYWxyZWFkeS1yZXNvbHZlZCBwcm9taXNlPwoJaWYgKCFwcm9taXNlIHx8ICFwcm9taXNlLnRoZW4gfHwgcHJvbWlzZS5zdGF0ZSgpID09PSAncmVzb2x2ZWQnKSB7CgkJcmV0dXJuICQud2hlbih0aGVuRnVuYygpKTsgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseQoJfQoJZWxzZSBpZiAodGhlbkZ1bmMpIHsKCQlyZXR1cm4gcHJvbWlzZS50aGVuKHRoZW5GdW5jKTsKCX0KfQoKOzsKCi8qCkdFTkVSQUwgTk9URSBvbiBtb21lbnRzIHRocm91Z2hvdXQgdGhlICplbnRpcmUgcmVzdCogb2YgdGhlIGNvZGViYXNlOgpBbGwgbW9tZW50cyBhcmUgYXNzdW1lZCB0byBiZSBhbWJpZ3VvdXNseS16b25lZCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLAp3aXRoIHRoZSBOT1RBQkxFIEVYQ0VPUFRJT04gb2Ygc3RhcnQvZW5kIGRhdGVzIHRoYXQgbGl2ZSBvbiAqRXZlbnQgT2JqZWN0cyouCkFtYmlndW91c2x5LVRJTUVEIG1vbWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgYW1iaWd1b3VzbHktem9uZWQgYnkgbmF0dXJlLgoqLwoKdmFyIGFtYmlnRGF0ZU9mTW9udGhSZWdleCA9IC9eXHMqXGR7NH0tXGRcZCQvOwp2YXIgYW1iaWdUaW1lT3Jab25lUmVnZXggPQoJL15ccypcZHs0fS0oPzooXGRcZC1cZFxkKXwoV1xkXGQkKXwoV1xkXGQtXGQpfChcZFxkXGQpKSgoVHwgKShcZFxkKDpcZFxkKDpcZFxkKFwuXGQrKT8pPyk/KT8pPyQvOwp2YXIgbmV3TW9tZW50UHJvdG8gPSBtb21lbnQuZm47IC8vIHdoZXJlIHdlIHdpbGwgYXR0YWNoIG91ciBuZXcgbWV0aG9kcwp2YXIgb2xkTW9tZW50UHJvdG8gPSAkLmV4dGVuZCh7fSwgbmV3TW9tZW50UHJvdG8pOyAvLyBjb3B5IG9mIG9yaWdpbmFsIG1vbWVudCBtZXRob2RzCgovLyB0ZWxsIG1vbWVudGpzIHRvIHRyYW5zZmVyIHRoZXNlIHByb3BlcnRpZXMgdXBvbiBjbG9uZQp2YXIgbW9tZW50UHJvcGVydGllcyA9IG1vbWVudC5tb21lbnRQcm9wZXJ0aWVzOwptb21lbnRQcm9wZXJ0aWVzLnB1c2goJ19mdWxsQ2FsZW5kYXInKTsKbW9tZW50UHJvcGVydGllcy5wdXNoKCdfYW1iaWdUaW1lJyk7Cm1vbWVudFByb3BlcnRpZXMucHVzaCgnX2FtYmlnWm9uZScpOwoKCi8vIENyZWF0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENyZWF0ZXMgYSBuZXcgbW9tZW50LCBzaW1pbGFyIHRvIHRoZSB2YW5pbGxhIG1vbWVudCguLi4pIGNvbnN0cnVjdG9yLCBidXQgd2l0aAovLyBleHRyYSBmZWF0dXJlcyAoYW1iaWd1b3VzIHRpbWUsIGVuaGFuY2VkIGZvcm1hdHRpbmcpLiBXaGVuIGdpdmVuIGFuIGV4aXN0aW5nIG1vbWVudCwKLy8gaXQgd2lsbCBmdW5jdGlvbiBhcyBhIGNsb25lIChhbmQgcmV0YWluIHRoZSB6b25lIG9mIHRoZSBtb21lbnQpLiBBbnl0aGluZyBlbHNlIHdpbGwKLy8gcmVzdWx0IGluIGEgbW9tZW50IGluIHRoZSBsb2NhbCB6b25lLgpGQy5tb21lbnQgPSBmdW5jdGlvbigpIHsKCXJldHVybiBtYWtlTW9tZW50KGFyZ3VtZW50cyk7Cn07CgovLyBTYW1lcyBhcyBGQy5tb21lbnQsIGJ1dCBmb3JjZXMgdGhlIHJlc3VsdGluZyBtb21lbnQgdG8gYmUgaW4gdGhlIFVUQyB0aW1lem9uZS4KRkMubW9tZW50LnV0YyA9IGZ1bmN0aW9uKCkgewoJdmFyIG1vbSA9IG1ha2VNb21lbnQoYXJndW1lbnRzLCB0cnVlKTsKCgkvLyBGb3JjZSBpdCBpbnRvIFVUQyBiZWNhdXNlIG1ha2VNb21lbnQgZG9lc24ndCBndWFyYW50ZWUgaXQKCS8vIChpZiBnaXZlbiBhIHByZS1leGlzdGluZyBtb21lbnQgZm9yIGV4YW1wbGUpCglpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBVVEMgem9uZQoJCW1vbS51dGMoKTsKCX0KCglyZXR1cm4gbW9tOwp9OwoKLy8gU2FtZSBhcyBGQy5tb21lbnQsIGJ1dCB3aGVuIGdpdmVuIGFuIElTTzg2MDEgc3RyaW5nLCB0aGUgdGltZXpvbmUgb2Zmc2V0IGlzIHByZXNlcnZlZC4KLy8gSVNPODYwMSBzdHJpbmdzIHdpdGggbm8gdGltZXpvbmUgb2Zmc2V0IHdpbGwgYmVjb21lIGFtYmlndW91c2x5IHpvbmVkLgpGQy5tb21lbnQucGFyc2Vab25lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gbWFrZU1vbWVudChhcmd1bWVudHMsIHRydWUsIHRydWUpOwp9OwoKLy8gQnVpbGRzIGFuIGVuaGFuY2VkIG1vbWVudCBmcm9tIGFyZ3MuIFdoZW4gZ2l2ZW4gYW4gZXhpc3RpbmcgbW9tZW50LCBpdCBjbG9uZXMuIFdoZW4gZ2l2ZW4gYQovLyBuYXRpdmUgRGF0ZSwgb3IgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzICh0aGUgY3VycmVudCB0aW1lKSwgdGhlIHJlc3VsdGluZyBtb21lbnQgd2lsbCBiZSBsb2NhbC4KLy8gQW55dGhpbmcgZWxzZSBuZWVkcyB0byBiZSAicGFyc2VkIiAoYSBzdHJpbmcgb3IgYW4gYXJyYXkpLCBhbmQgd2lsbCBiZSBhZmZlY3RlZCBieToKLy8gICAgcGFyc2VBc1VUQyAtIGlmIHRoZXJlIGlzIG5vIHpvbmUgaW5mb3JtYXRpb24sIHNob3VsZCB3ZSBwYXJzZSB0aGUgaW5wdXQgaW4gVVRDPwovLyAgICBwYXJzZVpvbmUgLSBpZiB0aGVyZSBpcyB6b25lIGluZm9ybWF0aW9uLCBzaG91bGQgd2UgZm9yY2UgdGhlIHpvbmUgb2YgdGhlIG1vbWVudD8KZnVuY3Rpb24gbWFrZU1vbWVudChhcmdzLCBwYXJzZUFzVVRDLCBwYXJzZVpvbmUpIHsKCXZhciBpbnB1dCA9IGFyZ3NbMF07Cgl2YXIgaXNTaW5nbGVTdHJpbmcgPSBhcmdzLmxlbmd0aCA9PSAxICYmIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7Cgl2YXIgaXNBbWJpZ1RpbWU7Cgl2YXIgaXNBbWJpZ1pvbmU7Cgl2YXIgYW1iaWdNYXRjaDsKCXZhciBtb207CgoJaWYgKG1vbWVudC5pc01vbWVudChpbnB1dCkgfHwgaXNOYXRpdmVEYXRlKGlucHV0KSB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7CgkJbW9tID0gbW9tZW50LmFwcGx5KG51bGwsIGFyZ3MpOwoJfQoJZWxzZSB7IC8vICJwYXJzaW5nIiBpcyByZXF1aXJlZAoJCWlzQW1iaWdUaW1lID0gZmFsc2U7CgkJaXNBbWJpZ1pvbmUgPSBmYWxzZTsKCgkJaWYgKGlzU2luZ2xlU3RyaW5nKSB7CgkJCWlmIChhbWJpZ0RhdGVPZk1vbnRoUmVnZXgudGVzdChpbnB1dCkpIHsKCQkJCS8vIGFjY2VwdCBzdHJpbmdzIGxpa2UgJzIwMTQtMDUnLCBidXQgY29udmVydCB0byB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoCgkJCQlpbnB1dCArPSAnLTAxJzsKCQkJCWFyZ3MgPSBbIGlucHV0IF07IC8vIGZvciB3aGVuIHdlIHBhc3MgaXQgb24gdG8gbW9tZW50J3MgY29uc3RydWN0b3IKCQkJCWlzQW1iaWdUaW1lID0gdHJ1ZTsKCQkJCWlzQW1iaWdab25lID0gdHJ1ZTsKCQkJfQoJCQllbHNlIGlmICgoYW1iaWdNYXRjaCA9IGFtYmlnVGltZU9yWm9uZVJlZ2V4LmV4ZWMoaW5wdXQpKSkgewoJCQkJaXNBbWJpZ1RpbWUgPSAhYW1iaWdNYXRjaFs1XTsgLy8gbm8gdGltZSBwYXJ0PwoJCQkJaXNBbWJpZ1pvbmUgPSB0cnVlOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJLy8gYXJyYXlzIGhhdmUgbm8gdGltZXpvbmUgaW5mb3JtYXRpb24sIHNvIGFzc3VtZSBhbWJpZ3VvdXMgem9uZQoJCQlpc0FtYmlnWm9uZSA9IHRydWU7CgkJfQoJCS8vIG90aGVyd2lzZSwgcHJvYmFibHkgYSBzdHJpbmcgd2l0aCBhIGZvcm1hdAoKCQlpZiAocGFyc2VBc1VUQyB8fCBpc0FtYmlnVGltZSkgewoJCQltb20gPSBtb21lbnQudXRjLmFwcGx5KG1vbWVudCwgYXJncyk7CgkJfQoJCWVsc2UgewoJCQltb20gPSBtb21lbnQuYXBwbHkobnVsbCwgYXJncyk7CgkJfQoKCQlpZiAoaXNBbWJpZ1RpbWUpIHsKCQkJbW9tLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7IC8vIGFtYmlndW91cyB0aW1lIGFsd2F5cyBtZWFucyBhbWJpZ3VvdXMgem9uZQoJCX0KCQllbHNlIGlmIChwYXJzZVpvbmUpIHsgLy8gbGV0J3MgcmVjb3JkIHRoZSBpbnB1dHRlZCB6b25lIHNvbWVob3cKCQkJaWYgKGlzQW1iaWdab25lKSB7CgkJCQltb20uX2FtYmlnWm9uZSA9IHRydWU7CgkJCX0KCQkJZWxzZSBpZiAoaXNTaW5nbGVTdHJpbmcpIHsKCQkJCW1vbS51dGNPZmZzZXQoaW5wdXQpOyAvLyBpZiBub3QgYSB2YWxpZCB6b25lLCB3aWxsIGFzc2lnbiBVVEMKCQkJfQoJCX0KCX0KCgltb20uX2Z1bGxDYWxlbmRhciA9IHRydWU7IC8vIGZsYWcgZm9yIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkKCglyZXR1cm4gbW9tOwp9CgoKLy8gV2VlayBOdW1iZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIFJldHVybnMgdGhlIHdlZWsgbnVtYmVyLCBjb25zaWRlcmluZyB0aGUgbG9jYWxlJ3MgY3VzdG9tIHdlZWsgbnVtYmVyIGNhbGN1YXRpb24KLy8gYHdlZWtzYCBpcyBhbiBhbGlhcyBmb3IgYHdlZWtgCm5ld01vbWVudFByb3RvLndlZWsgPSBuZXdNb21lbnRQcm90by53ZWVrcyA9IGZ1bmN0aW9uKGlucHV0KSB7Cgl2YXIgd2Vla0NhbGMgPSB0aGlzLl9sb2NhbGUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYzsKCglpZiAoaW5wdXQgPT0gbnVsbCAmJiB0eXBlb2Ygd2Vla0NhbGMgPT09ICdmdW5jdGlvbicpIHsgLy8gY3VzdG9tIGZ1bmN0aW9uIG9ubHkgd29ya3MgZm9yIGdldHRlcgoJCXJldHVybiB3ZWVrQ2FsYyh0aGlzKTsKCX0KCWVsc2UgaWYgKHdlZWtDYWxjID09PSAnSVNPJykgewoJCXJldHVybiBvbGRNb21lbnRQcm90by5pc29XZWVrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIElTTyBnZXR0ZXIvc2V0dGVyCgl9CgoJcmV0dXJuIG9sZE1vbWVudFByb3RvLndlZWsuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gbG9jYWwgZ2V0dGVyL3NldHRlcgp9OwoKCi8vIFRpbWUtb2YtZGF5Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEdFVFRFUgovLyBSZXR1cm5zIGEgRHVyYXRpb24gd2l0aCB0aGUgaG91cnMvbWludXRlcy9zZWNvbmRzL21zIHZhbHVlcyBvZiB0aGUgbW9tZW50LgovLyBJZiB0aGUgbW9tZW50IGhhcyBhbiBhbWJpZ3VvdXMgdGltZSwgYSBkdXJhdGlvbiBvZiAwMDowMCB3aWxsIGJlIHJldHVybmVkLgovLwovLyBTRVRURVIKLy8gWW91IGNhbiBzdXBwbHkgYSBEdXJhdGlvbiwgYSBNb21lbnQsIG9yIGEgRHVyYXRpb24tbGlrZSBhcmd1bWVudC4KLy8gV2hlbiBzZXR0aW5nIHRoZSB0aW1lLCBhbmQgdGhlIG1vbWVudCBoYXMgYW4gYW1iaWd1b3VzIHRpbWUsIGl0IHRoZW4gYmVjb21lcyB1bmFtYmlndW91cy4KbmV3TW9tZW50UHJvdG8udGltZSA9IGZ1bmN0aW9uKHRpbWUpIHsKCgkvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbWV0aG9kIChpZiB0aGVyZSBpcyBvbmUpIGlmIHRoaXMgbW9tZW50IHdhc24ndCBjcmVhdGVkIHZpYSBGdWxsQ2FsZW5kYXIuCgkvLyBgdGltZWAgaXMgYSBnZW5lcmljIGVub3VnaCBtZXRob2QgbmFtZSB3aGVyZSB0aGlzIHByZWNhdXRpb24gaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbGxpc2lvbnMgdy8gb3RoZXIgcGx1Z2lucy4KCWlmICghdGhpcy5fZnVsbENhbGVuZGFyKSB7CgkJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRpbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCX0KCglpZiAodGltZSA9PSBudWxsKSB7IC8vIGdldHRlcgoJCXJldHVybiBtb21lbnQuZHVyYXRpb24oewoJCQlob3VyczogdGhpcy5ob3VycygpLAoJCQltaW51dGVzOiB0aGlzLm1pbnV0ZXMoKSwKCQkJc2Vjb25kczogdGhpcy5zZWNvbmRzKCksCgkJCW1pbGxpc2Vjb25kczogdGhpcy5taWxsaXNlY29uZHMoKQoJCX0pOwoJfQoJZWxzZSB7IC8vIHNldHRlcgoKCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsgLy8gbWFyayB0aGF0IHRoZSBtb21lbnQgbm93IGhhcyBhIHRpbWUKCgkJaWYgKCFtb21lbnQuaXNEdXJhdGlvbih0aW1lKSAmJiAhbW9tZW50LmlzTW9tZW50KHRpbWUpKSB7CgkJCXRpbWUgPSBtb21lbnQuZHVyYXRpb24odGltZSk7CgkJfQoKCQkvLyBUaGUgZGF5IHZhbHVlIHNob3VsZCBjYXVzZSBvdmVyZmxvdyAoc28gMjQgaG91cnMgYmVjb21lcyAwMDowMDowMCBvZiBuZXh0IGRheSkuCgkJLy8gT25seSBmb3IgRHVyYXRpb24gdGltZXMsIG5vdCBNb21lbnQgdGltZXMuCgkJdmFyIGRheUhvdXJzID0gMDsKCQlpZiAobW9tZW50LmlzRHVyYXRpb24odGltZSkpIHsKCQkJZGF5SG91cnMgPSBNYXRoLmZsb29yKHRpbWUuYXNEYXlzKCkpICogMjQ7CgkJfQoKCQkvLyBXZSBuZWVkIHRvIHNldCB0aGUgaW5kaXZpZHVhbCBmaWVsZHMuCgkJLy8gQ2FuJ3QgdXNlIHN0YXJ0T2YoJ2RheScpIHRoZW4gYWRkIGR1cmF0aW9uLiBJbiBjYXNlIG9mIERTVCBhdCBzdGFydCBvZiBkYXkuCgkJcmV0dXJuIHRoaXMuaG91cnMoZGF5SG91cnMgKyB0aW1lLmhvdXJzKCkpCgkJCS5taW51dGVzKHRpbWUubWludXRlcygpKQoJCQkuc2Vjb25kcyh0aW1lLnNlY29uZHMoKSkKCQkJLm1pbGxpc2Vjb25kcyh0aW1lLm1pbGxpc2Vjb25kcygpKTsKCX0KfTsKCi8vIENvbnZlcnRzIHRoZSBtb21lbnQgdG8gVVRDLCBzdHJpcHBpbmcgb3V0IGl0cyB0aW1lLW9mLWRheSBhbmQgdGltZXpvbmUgb2Zmc2V0LAovLyBidXQgcHJlc2VydmluZyBpdHMgWU1ELiBBIG1vbWVudCB3aXRoIGEgc3RyaXBwZWQgdGltZSB3aWxsIGRpc3BsYXkgbm8gdGltZQovLyBub3IgdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBUaW1lID0gZnVuY3Rpb24oKSB7CgoJaWYgKCF0aGlzLl9hbWJpZ1RpbWUpIHsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgKmRhdGUqIHZhbHVlKQoKCQkvLyBzZXQgdGltZSB0byB6ZXJvCgkJdGhpcy5zZXQoewoJCQlob3VyczogMCwKCQkJbWludXRlczogMCwKCQkJc2Vjb25kczogMCwKCQkJbXM6IDAKCQl9KTsKCgkJLy8gTWFyayB0aGUgdGltZSBhcyBhbWJpZ3VvdXMuIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSAudXRjKCkgY2FsbCwgd2hpY2ggbWlnaHQgY2FsbCAudXRjT2Zmc2V0KCksCgkJLy8gd2hpY2ggY2xlYXJzIGFsbCBhbWJpZyBmbGFncy4KCQl0aGlzLl9hbWJpZ1RpbWUgPSB0cnVlOwoJCXRoaXMuX2FtYmlnWm9uZSA9IHRydWU7IC8vIGlmIGFtYmlndW91cyB0aW1lLCBhbHNvIGFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIGlmIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lIChib29sZWFuKQpuZXdNb21lbnRQcm90by5oYXNUaW1lID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gIXRoaXMuX2FtYmlnVGltZTsKfTsKCgovLyBUaW1lem9uZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDb252ZXJ0cyB0aGUgbW9tZW50IHRvIFVUQywgc3RyaXBwaW5nIG91dCBpdHMgdGltZXpvbmUgb2Zmc2V0LCBidXQgcHJlc2VydmluZyBpdHMKLy8gWU1EIGFuZCB0aW1lLW9mLWRheS4gQSBtb21lbnQgd2l0aCBhIHN0cmlwcGVkIHRpbWV6b25lIG9mZnNldCB3aWxsIGRpc3BsYXkgbm8KLy8gdGltZXpvbmUgb2Zmc2V0IHdoZW4gLmZvcm1hdCgpIGlzIGNhbGxlZC4KbmV3TW9tZW50UHJvdG8uc3RyaXBab25lID0gZnVuY3Rpb24oKSB7Cgl2YXIgd2FzQW1iaWdUaW1lOwoKCWlmICghdGhpcy5fYW1iaWdab25lKSB7CgoJCXdhc0FtYmlnVGltZSA9IHRoaXMuX2FtYmlnVGltZTsKCgkJdGhpcy51dGModHJ1ZSk7IC8vIGtlZXBMb2NhbFRpbWU9dHJ1ZSAoZm9yIGtlZXBpbmcgZGF0ZSBhbmQgdGltZSB2YWx1ZXMpCgoJCS8vIHRoZSBhYm92ZSBjYWxsIHRvIC51dGMoKS8udXRjT2Zmc2V0KCkgdW5mb3J0dW5hdGVseSBtaWdodCBjbGVhciB0aGUgYW1iaWcgZmxhZ3MsIHNvIHJlc3RvcmUKCQl0aGlzLl9hbWJpZ1RpbWUgPSB3YXNBbWJpZ1RpbWUgfHwgZmFsc2U7CgoJCS8vIE1hcmsgdGhlIHpvbmUgYXMgYW1iaWd1b3VzLiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgLnV0YygpIGNhbGwsIHdoaWNoIG1pZ2h0IGNhbGwgLnV0Y09mZnNldCgpLAoJCS8vIHdoaWNoIGNsZWFycyB0aGUgYW1iaWcgZmxhZ3MuCgkJdGhpcy5fYW1iaWdab25lID0gdHJ1ZTsKCX0KCglyZXR1cm4gdGhpczsgLy8gZm9yIGNoYWluaW5nCn07CgovLyBSZXR1cm5zIG9mIHRoZSBtb21lbnQgaGFzIGEgbm9uLWFtYmlndW91cyB0aW1lem9uZSBvZmZzZXQgKGJvb2xlYW4pCm5ld01vbWVudFByb3RvLmhhc1pvbmUgPSBmdW5jdGlvbigpIHsKCXJldHVybiAhdGhpcy5fYW1iaWdab25lOwp9OwoKCi8vIGltcGxpY2l0bHkgbWFya3MgYSB6b25lCm5ld01vbWVudFByb3RvLmxvY2FsID0gZnVuY3Rpb24oa2VlcExvY2FsVGltZSkgewoKCS8vIGZvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBhbWJpZ3VvdXNseS16b25lZCB0byBsb2NhbCwKCS8vIGtlZXAgdGhlIHRpbWUgdmFsdWVzIHdoZW4gY29udmVydGluZyBmcm9tIFVUQyAtPiBsb2NhbAoJb2xkTW9tZW50UHJvdG8ubG9jYWwuY2FsbCh0aGlzLCB0aGlzLl9hbWJpZ1pvbmUgfHwga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgbG9jYWwoKSAtPiB1dGNPZmZzZXQoKSwgYnV0IGRvbid0IHJlbHkgb24gTW9tZW50J3MgaW50ZXJuYWxzCgl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCXRoaXMuX2FtYmlnWm9uZSA9IGZhbHNlOwoKCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZQpuZXdNb21lbnRQcm90by51dGMgPSBmdW5jdGlvbihrZWVwTG9jYWxUaW1lKSB7CgoJb2xkTW9tZW50UHJvdG8udXRjLmNhbGwodGhpcywga2VlcExvY2FsVGltZSk7CgoJLy8gZW5zdXJlIG5vbi1hbWJpZ3VvdXMKCS8vIHRoaXMgcHJvYmFibHkgYWxyZWFkeSBoYXBwZW5lZCB2aWEgdXRjKCkgLT4gdXRjT2Zmc2V0KCksIGJ1dCBkb24ndCByZWx5IG9uIE1vbWVudCdzIGludGVybmFscwoJdGhpcy5fYW1iaWdUaW1lID0gZmFsc2U7Cgl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCglyZXR1cm4gdGhpczsKfTsKCgovLyBpbXBsaWNpdGx5IG1hcmtzIGEgem9uZSAod2lsbCBwcm9iYWJseSBnZXQgY2FsbGVkIHVwb24gLnV0YygpIGFuZCAubG9jYWwoKSkKbmV3TW9tZW50UHJvdG8udXRjT2Zmc2V0ID0gZnVuY3Rpb24odHpvKSB7CgoJaWYgKHR6byAhPSBudWxsKSB7IC8vIHNldHRlcgoJCS8vIHRoZXNlIGFzc2lnbm1lbnRzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgdGhlIG9yaWdpbmFsIHpvbmUgbWV0aG9kIGlzIGNhbGxlZC4KCQkvLyBJIGZvcmdldCB3aHksIHNvbWV0aGluZyB0byBkbyB3aXRoIGEgYnJvd3NlciBjcmFzaC4KCQl0aGlzLl9hbWJpZ1RpbWUgPSBmYWxzZTsKCQl0aGlzLl9hbWJpZ1pvbmUgPSBmYWxzZTsKCX0KCglyZXR1cm4gb2xkTW9tZW50UHJvdG8udXRjT2Zmc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgoKLy8gRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpuZXdNb21lbnRQcm90by5mb3JtYXQgPSBmdW5jdGlvbigpIHsKCWlmICh0aGlzLl9mdWxsQ2FsZW5kYXIgJiYgYXJndW1lbnRzWzBdKSB7IC8vIGFuIGVuaGFuY2VkIG1vbWVudD8gYW5kIGEgZm9ybWF0IHN0cmluZyBwcm92aWRlZD8KCQlyZXR1cm4gZm9ybWF0RGF0ZSh0aGlzLCBhcmd1bWVudHNbMF0pOyAvLyBvdXIgZXh0ZW5kZWQgZm9ybWF0dGluZwoJfQoJaWYgKHRoaXMuX2FtYmlnVGltZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tREQnKTsKCX0KCWlmICh0aGlzLl9hbWJpZ1pvbmUpIHsKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KHRoaXMsICdZWVlZLU1NLUREW1RdSEg6bW06c3MnKTsKCX0KCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCm5ld01vbWVudFByb3RvLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24oKSB7CglpZiAodGhpcy5fYW1iaWdUaW1lKSB7CgkJcmV0dXJuIG9sZE1vbWVudEZvcm1hdCh0aGlzLCAnWVlZWS1NTS1ERCcpOwoJfQoJaWYgKHRoaXMuX2FtYmlnWm9uZSkgewoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQodGhpcywgJ1lZWVktTU0tRERbVF1ISDptbTpzcycpOwoJfQoJcmV0dXJuIG9sZE1vbWVudFByb3RvLnRvSVNPU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07Cgo7OwoKLy8gU2luZ2xlIERhdGUgRm9ybWF0dGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKLy8gY2FsbCB0aGlzIGlmIHlvdSB3YW50IE1vbWVudCdzIG9yaWdpbmFsIGZvcm1hdCBtZXRob2QgdG8gYmUgdXNlZApmdW5jdGlvbiBvbGRNb21lbnRGb3JtYXQobW9tLCBmb3JtYXRTdHIpIHsKCXJldHVybiBvbGRNb21lbnRQcm90by5mb3JtYXQuY2FsbChtb20sIGZvcm1hdFN0cik7IC8vIG9sZE1vbWVudFByb3RvIGRlZmluZWQgaW4gbW9tZW50LWV4dC5qcwp9CgoKLy8gRm9ybWF0cyBgZGF0ZWAgd2l0aCBhIE1vbWVudCBmb3JtYXR0aW5nIHN0cmluZywgYnV0IGFsbG93IG91ciBub24temVybyBhcmVhcyBhbmQKLy8gYWRkaXRpb25hbCB0b2tlbi4KZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXRTdHIpIHsKCXJldHVybiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBnZXRGb3JtYXRTdHJpbmdDaHVua3MoZm9ybWF0U3RyKSk7Cn0KCgpmdW5jdGlvbiBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVua3MpIHsKCXZhciBzID0gJyc7Cgl2YXIgaTsKCglmb3IgKGk9MDsgaTxjaHVua3MubGVuZ3RoOyBpKyspIHsKCQlzICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZSwgY2h1bmtzW2ldKTsKCX0KCglyZXR1cm4gczsKfQoKCi8vIGFkZGl0aW9uIGZvcm1hdHRpbmcgdG9rZW5zIHdlIHdhbnQgcmVjb2duaXplZAp2YXIgdG9rZW5PdmVycmlkZXMgPSB7Cgl0OiBmdW5jdGlvbihkYXRlKSB7IC8vICJhIiBvciAicCIKCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUsICdhJykuY2hhckF0KDApOwoJfSwKCVQ6IGZ1bmN0aW9uKGRhdGUpIHsgLy8gIkEiIG9yICJQIgoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgJ0EnKS5jaGFyQXQoMCk7Cgl9Cn07CgoKZnVuY3Rpb24gZm9ybWF0RGF0ZVdpdGhDaHVuayhkYXRlLCBjaHVuaykgewoJdmFyIHRva2VuOwoJdmFyIG1heWJlU3RyOwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsgLy8gYSB0b2tlbiwgbGlrZSAiWVlZWSIKCQlpZiAodG9rZW5PdmVycmlkZXNbdG9rZW5dKSB7CgkJCXJldHVybiB0b2tlbk92ZXJyaWRlc1t0b2tlbl0oZGF0ZSk7IC8vIHVzZSBvdXIgY3VzdG9tIHRva2VuCgkJfQoJCXJldHVybiBvbGRNb21lbnRGb3JtYXQoZGF0ZSwgdG9rZW4pOwoJfQoJZWxzZSBpZiAoY2h1bmsubWF5YmUpIHsgLy8gYSBncm91cGluZyBvZiBvdGhlciBjaHVua3MgdGhhdCBtdXN0IGJlIG5vbi16ZXJvCgkJbWF5YmVTdHIgPSBmb3JtYXREYXRlV2l0aENodW5rcyhkYXRlLCBjaHVuay5tYXliZSk7CgkJaWYgKG1heWJlU3RyLm1hdGNoKC9bMS05XS8pKSB7CgkJCXJldHVybiBtYXliZVN0cjsKCQl9Cgl9CgoJcmV0dXJuICcnOwp9CgoKLy8gRGF0ZSBSYW5nZSBGb3JtYXR0aW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVE9ETzogbWFrZSBpdCB3b3JrIHdpdGggdGltZXpvbmUgb2Zmc2V0CgovLyBVc2luZyBhIGZvcm1hdHRpbmcgc3RyaW5nIG1lYW50IGZvciBhIHNpbmdsZSBkYXRlLCBnZW5lcmF0ZSBhIHJhbmdlIHN0cmluZywgbGlrZQovLyAiU2VwIDIgLSA5IDIwMTMiLCB0aGF0IGludGVsbGlnZW50bHkgaW5zZXJ0cyBhIHNlcGFyYXRvciB3aGVyZSB0aGUgZGF0ZXMgZGlmZmVyLgovLyBJZiB0aGUgZGF0ZXMgYXJlIHRoZSBzYW1lIGFzIGZhciBhcyB0aGUgZm9ybWF0IHN0cmluZyBpcyBjb25jZXJuZWQsIGp1c3QgcmV0dXJuIGEgc2luZ2xlCi8vIHJlbmRlcmluZyBvZiBvbmUgZGF0ZSwgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgpmdW5jdGlvbiBmb3JtYXRSYW5nZShkYXRlMSwgZGF0ZTIsIGZvcm1hdFN0ciwgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIGxvY2FsZURhdGE7CgoJZGF0ZTEgPSBGQy5tb21lbnQucGFyc2Vab25lKGRhdGUxKTsKCWRhdGUyID0gRkMubW9tZW50LnBhcnNlWm9uZShkYXRlMik7CgoJbG9jYWxlRGF0YSA9IGRhdGUxLmxvY2FsZURhdGEoKTsKCgkvLyBFeHBhbmQgbG9jYWxpemVkIGZvcm1hdCBzdHJpbmdzLCBsaWtlICJMTCIgLT4gIk1NTU0gRCBZWVlZIgoJZm9ybWF0U3RyID0gbG9jYWxlRGF0YS5sb25nRGF0ZUZvcm1hdChmb3JtYXRTdHIpIHx8IGZvcm1hdFN0cjsKCS8vIEJUVywgdGhpcyBpcyBub3QgaW1wb3J0YW50IGZvciBgZm9ybWF0RGF0ZWAgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlIHRvIHB1dCBjdXN0b20gdG9rZW5zCgkvLyBvciBub24temVybyBhcmVhcyBpbiBNb21lbnQncyBsb2NhbGl6ZWQgZm9ybWF0IHN0cmluZ3MuCgoJc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICcgLSAnOwoKCXJldHVybiBmb3JtYXRSYW5nZVdpdGhDaHVua3MoCgkJZGF0ZTEsCgkJZGF0ZTIsCgkJZ2V0Rm9ybWF0U3RyaW5nQ2h1bmtzKGZvcm1hdFN0ciksCgkJc2VwYXJhdG9yLAoJCWlzUlRMCgkpOwp9CkZDLmZvcm1hdFJhbmdlID0gZm9ybWF0UmFuZ2U7IC8vIGV4cG9zZQoKCmZ1bmN0aW9uIGZvcm1hdFJhbmdlV2l0aENodW5rcyhkYXRlMSwgZGF0ZTIsIGNodW5rcywgc2VwYXJhdG9yLCBpc1JUTCkgewoJdmFyIHVuem9uZWREYXRlMSA9IGRhdGUxLmNsb25lKCkuc3RyaXBab25lKCk7IC8vIGZvciBmb3JtYXRTaW1pbGFyQ2h1bmsKCXZhciB1bnpvbmVkRGF0ZTIgPSBkYXRlMi5jbG9uZSgpLnN0cmlwWm9uZSgpOyAvLyAiCgl2YXIgY2h1bmtTdHI7IC8vIHRoZSByZW5kZXJpbmcgb2YgdGhlIGNodW5rCgl2YXIgbGVmdEk7Cgl2YXIgbGVmdFN0ciA9ICcnOwoJdmFyIHJpZ2h0STsKCXZhciByaWdodFN0ciA9ICcnOwoJdmFyIG1pZGRsZUk7Cgl2YXIgbWlkZGxlU3RyMSA9ICcnOwoJdmFyIG1pZGRsZVN0cjIgPSAnJzsKCXZhciBtaWRkbGVTdHIgPSAnJzsKCgkvLyBTdGFydCBhdCB0aGUgbGVmdG1vc3Qgc2lkZSBvZiB0aGUgZm9ybWF0dGluZyBzdHJpbmcgYW5kIGNvbnRpbnVlIHVudGlsIHlvdSBoaXQgYSB0b2tlbgoJLy8gdGhhdCBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiBkYXRlcy4KCWZvciAobGVmdEk9MDsgbGVmdEk8Y2h1bmtzLmxlbmd0aDsgbGVmdEkrKykgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsIGNodW5rc1tsZWZ0SV0pOwoJCWlmIChjaHVua1N0ciA9PT0gZmFsc2UpIHsKCQkJYnJlYWs7CgkJfQoJCWxlZnRTdHIgKz0gY2h1bmtTdHI7Cgl9CgoJLy8gU2ltaWxhcmx5LCBzdGFydCBhdCB0aGUgcmlnaHRtb3N0IHNpZGUgb2YgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGFuZCBtb3ZlIGxlZnQKCWZvciAocmlnaHRJPWNodW5rcy5sZW5ndGgtMTsgcmlnaHRJPmxlZnRJOyByaWdodEktLSkgewoJCWNodW5rU3RyID0gZm9ybWF0U2ltaWxhckNodW5rKGRhdGUxLCBkYXRlMiwgdW56b25lZERhdGUxLCB1bnpvbmVkRGF0ZTIsICBjaHVua3NbcmlnaHRJXSk7CgkJaWYgKGNodW5rU3RyID09PSBmYWxzZSkgewoJCQlicmVhazsKCQl9CgkJcmlnaHRTdHIgPSBjaHVua1N0ciArIHJpZ2h0U3RyOwoJfQoKCS8vIFRoZSBhcmVhIGluIHRoZSBtaWRkbGUgaXMgZGlmZmVyZW50IGZvciBib3RoIG9mIHRoZSBkYXRlcy4KCS8vIENvbGxlY3QgdGhlbSBkaXN0aW5jdGx5IHNvIHdlIGNhbiBqYW0gdGhlbSB0b2dldGhlciBsYXRlci4KCWZvciAobWlkZGxlST1sZWZ0STsgbWlkZGxlSTw9cmlnaHRJOyBtaWRkbGVJKyspIHsKCQltaWRkbGVTdHIxICs9IGZvcm1hdERhdGVXaXRoQ2h1bmsoZGF0ZTEsIGNodW5rc1ttaWRkbGVJXSk7CgkJbWlkZGxlU3RyMiArPSBmb3JtYXREYXRlV2l0aENodW5rKGRhdGUyLCBjaHVua3NbbWlkZGxlSV0pOwoJfQoKCWlmIChtaWRkbGVTdHIxIHx8IG1pZGRsZVN0cjIpIHsKCQlpZiAoaXNSVEwpIHsKCQkJbWlkZGxlU3RyID0gbWlkZGxlU3RyMiArIHNlcGFyYXRvciArIG1pZGRsZVN0cjE7CgkJfQoJCWVsc2UgewoJCQltaWRkbGVTdHIgPSBtaWRkbGVTdHIxICsgc2VwYXJhdG9yICsgbWlkZGxlU3RyMjsKCQl9Cgl9CgoJcmV0dXJuIGxlZnRTdHIgKyBtaWRkbGVTdHIgKyByaWdodFN0cjsKfQoKCnZhciBzaW1pbGFyVW5pdE1hcCA9IHsKCVk6ICd5ZWFyJywKCU06ICdtb250aCcsCglEOiAnZGF5JywgLy8gZGF5IG9mIG1vbnRoCglkOiAnZGF5JywgLy8gZGF5IG9mIHdlZWsKCS8vIHByZXZlbnRzIGEgc2VwYXJhdG9yIGJldHdlZW4gYW55dGhpbmcgdGltZS1yZWxhdGVkLi4uCglBOiAnc2Vjb25kJywgLy8gQU0vUE0KCWE6ICdzZWNvbmQnLCAvLyBhbS9wbQoJVDogJ3NlY29uZCcsIC8vIEEvUAoJdDogJ3NlY29uZCcsIC8vIGEvcAoJSDogJ3NlY29uZCcsIC8vIGhvdXIgKDI0KQoJaDogJ3NlY29uZCcsIC8vIGhvdXIgKDEyKQoJbTogJ3NlY29uZCcsIC8vIG1pbnV0ZQoJczogJ3NlY29uZCcgLy8gc2Vjb25kCn07Ci8vIFRPRE86IHdlZWsgbWF5YmU/CgoKLy8gR2l2ZW4gYSBmb3JtYXR0aW5nIGNodW5rLCBhbmQgZ2l2ZW4gdGhhdCBib3RoIGRhdGVzIGFyZSBzaW1pbGFyIGluIHRoZSByZWdhcmQgdGhlCi8vIGZvcm1hdHRpbmcgY2h1bmsgaXMgY29uY2VybmVkLCBmb3JtYXQgZGF0ZTEgYWdhaW5zdCBgY2h1bmtgLiBPdGhlcndpc2UsIHJldHVybiBgZmFsc2VgLgpmdW5jdGlvbiBmb3JtYXRTaW1pbGFyQ2h1bmsoZGF0ZTEsIGRhdGUyLCB1bnpvbmVkRGF0ZTEsIHVuem9uZWREYXRlMiwgY2h1bmspIHsKCXZhciB0b2tlbjsKCXZhciB1bml0OwoKCWlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcKCQlyZXR1cm4gY2h1bms7Cgl9CgllbHNlIGlmICgodG9rZW4gPSBjaHVuay50b2tlbikpIHsKCQl1bml0ID0gc2ltaWxhclVuaXRNYXBbdG9rZW4uY2hhckF0KDApXTsKCgkJLy8gYXJlIHRoZSBkYXRlcyB0aGUgc2FtZSBmb3IgdGhpcyB1bml0IG9mIG1lYXN1cmVtZW50PwoJCS8vIHVzZSB0aGUgdW56b25lZCBkYXRlcyBmb3IgdGhpcyBjYWxjdWxhdGlvbiBiZWNhdXNlIHVucmVsaWFibGUgd2hlbiBuZWFyIERTVCAoYnVnICMyMzk2KQoJCWlmICh1bml0ICYmIHVuem9uZWREYXRlMS5pc1NhbWUodW56b25lZERhdGUyLCB1bml0KSkgewoJCQlyZXR1cm4gb2xkTW9tZW50Rm9ybWF0KGRhdGUxLCB0b2tlbik7IC8vIHdvdWxkIGJlIHRoZSBzYW1lIGlmIHdlIHVzZWQgYGRhdGUyYAoJCQkvLyBCVFcsIGRvbid0IHN1cHBvcnQgY3VzdG9tIHRva2VucwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7IC8vIHRoZSBjaHVuayBpcyBOT1QgdGhlIHNhbWUgZm9yIHRoZSB0d28gZGF0ZXMKCS8vIEJUVywgZG9uJ3Qgc3VwcG9ydCBzcGxpdHRpbmcgb24gbm9uLXplcm8gYXJlYXMKfQoKCi8vIENodW5raW5nIFV0aWxzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgp2YXIgZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSA9IHt9OwoKCmZ1bmN0aW9uIGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpIHsKCWlmIChmb3JtYXRTdHIgaW4gZm9ybWF0U3RyaW5nQ2h1bmtDYWNoZSkgewoJCXJldHVybiBmb3JtYXRTdHJpbmdDaHVua0NhY2hlW2Zvcm1hdFN0cl07Cgl9CglyZXR1cm4gKGZvcm1hdFN0cmluZ0NodW5rQ2FjaGVbZm9ybWF0U3RyXSA9IGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikpOwp9CgoKLy8gQnJlYWsgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIGludG8gYW4gYXJyYXkgb2YgY2h1bmtzCmZ1bmN0aW9uIGNodW5rRm9ybWF0U3RyaW5nKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IFtdOwoJdmFyIGNodW5rZXIgPSAvXFsoW15cXV0qKVxdfFwoKFteXCldKilcKXwoTFRTfExUfChcdylcNCpvPyl8KFteXHdcW1woXSspL2c7IC8vIFRPRE86IG1vcmUgZGVzY3JpbWluYXRpb24KCXZhciBtYXRjaDsKCgl3aGlsZSAoKG1hdGNoID0gY2h1bmtlci5leGVjKGZvcm1hdFN0cikpKSB7CgkJaWYgKG1hdGNoWzFdKSB7IC8vIGEgbGl0ZXJhbCBzdHJpbmcgaW5zaWRlIFsgLi4uIF0KCQkJY2h1bmtzLnB1c2gobWF0Y2hbMV0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFsyXSkgeyAvLyBub24temVybyBmb3JtYXR0aW5nIGluc2lkZSAoIC4uLiApCgkJCWNodW5rcy5wdXNoKHsgbWF5YmU6IGNodW5rRm9ybWF0U3RyaW5nKG1hdGNoWzJdKSB9KTsKCQl9CgkJZWxzZSBpZiAobWF0Y2hbM10pIHsgLy8gYSBmb3JtYXR0aW5nIHRva2VuCgkJCWNodW5rcy5wdXNoKHsgdG9rZW46IG1hdGNoWzNdIH0pOwoJCX0KCQllbHNlIGlmIChtYXRjaFs1XSkgeyAvLyBhbiB1bmVuY2xvc2VkIGxpdGVyYWwgc3RyaW5nCgkJCWNodW5rcy5wdXNoKG1hdGNoWzVdKTsKCQl9Cgl9CgoJcmV0dXJuIGNodW5rczsKfQoKCi8vIE1pc2MgVXRpbHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIGdyYW51bGFyaXR5IG9ubHkgZ29lcyB1cCB1bnRpbCBkYXkKLy8gVE9ETzogdW5pZnkgd2l0aCBzaW1pbGFyVW5pdE1hcAp2YXIgdG9rZW5HcmFudWxhcml0aWVzID0gewoJWTogeyB2YWx1ZTogMSwgdW5pdDogJ3llYXInIH0sCglNOiB7IHZhbHVlOiAyLCB1bml0OiAnbW9udGgnIH0sCglXOiB7IHZhbHVlOiAzLCB1bml0OiAnd2VlaycgfSwKCXc6IHsgdmFsdWU6IDMsIHVuaXQ6ICd3ZWVrJyB9LAoJRDogeyB2YWx1ZTogNCwgdW5pdDogJ2RheScgfSwgLy8gZGF5IG9mIG1vbnRoCglkOiB7IHZhbHVlOiA0LCB1bml0OiAnZGF5JyB9IC8vIGRheSBvZiB3ZWVrCn07CgovLyByZXR1cm5zIGEgdW5pdCBzdHJpbmcsIGVpdGhlciAneWVhcicsICdtb250aCcsICdkYXknLCBvciBudWxsCi8vIGZvciB0aGUgbW9zdCBncmFudWxhciBmb3JtYXR0aW5nIHRva2VuIGluIHRoZSBzdHJpbmcuCkZDLnF1ZXJ5TW9zdEdyYW51bGFyRm9ybWF0VW5pdCA9IGZ1bmN0aW9uKGZvcm1hdFN0cikgewoJdmFyIGNodW5rcyA9IGdldEZvcm1hdFN0cmluZ0NodW5rcyhmb3JtYXRTdHIpOwoJdmFyIGksIGNodW5rOwoJdmFyIGNhbmRpZGF0ZTsKCXZhciBiZXN0OwoKCWZvciAoaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHsKCQljaHVuayA9IGNodW5rc1tpXTsKCQlpZiAoY2h1bmsudG9rZW4pIHsKCQkJY2FuZGlkYXRlID0gdG9rZW5HcmFudWxhcml0aWVzW2NodW5rLnRva2VuLmNoYXJBdCgwKV07CgkJCWlmIChjYW5kaWRhdGUpIHsKCQkJCWlmICghYmVzdCB8fCBjYW5kaWRhdGUudmFsdWUgPiBiZXN0LnZhbHVlKSB7CgkJCQkJYmVzdCA9IGNhbmRpZGF0ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoYmVzdCkgewoJCXJldHVybiBiZXN0LnVuaXQ7Cgl9CgoJcmV0dXJuIG51bGw7Cn07Cgo7OwoKRkMuQ2xhc3MgPSBDbGFzczsgLy8gZXhwb3J0CgovLyBDbGFzcyB0aGF0IGFsbCBvdGhlciBjbGFzc2VzIHdpbGwgaW5oZXJpdCBmcm9tCmZ1bmN0aW9uIENsYXNzKCkgeyB9CgoKLy8gQ2FsbGVkIG9uIGEgY2xhc3MgdG8gY3JlYXRlIGEgc3ViY2xhc3MuCi8vIExhc3QgYXJndW1lbnQgY29udGFpbnMgaW5zdGFuY2UgbWV0aG9kcy4gQW55IGFyZ3VtZW50IGJlZm9yZSB0aGUgbGFzdCBhcmUgY29uc2lkZXJlZCBtaXhpbnMuCkNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7Cgl2YXIgaTsKCXZhciBtZW1iZXJzOwoKCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCW1lbWJlcnMgPSBhcmd1bWVudHNbaV07CgkJaWYgKGkgPCBsZW4gLSAxKSB7IC8vIG5vdCB0aGUgbGFzdCBhcmd1bWVudD8KCQkJbWl4SW50b0NsYXNzKHRoaXMsIG1lbWJlcnMpOwoJCX0KCX0KCglyZXR1cm4gZXh0ZW5kQ2xhc3ModGhpcywgbWVtYmVycyB8fCB7fSk7IC8vIG1lbWJlcnMgd2lsbCBiZSB1bmRlZmluZWQgaWYgbm8gYXJndW1lbnRzCn07CgoKLy8gQWRkcyBuZXcgbWVtYmVyIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBjbGFzcydzIHByb3RvdHlwZS4KLy8gQ2FuIGJlIGNhbGxlZCB3aXRoIGFub3RoZXIgY2xhc3MsIG9yIGEgcGxhaW4gb2JqZWN0IGhhc2ggY29udGFpbmluZyBuZXcgbWVtYmVycy4KQ2xhc3MubWl4aW4gPSBmdW5jdGlvbihtZW1iZXJzKSB7CgltaXhJbnRvQ2xhc3ModGhpcywgbWVtYmVycyk7Cn07CgoKZnVuY3Rpb24gZXh0ZW5kQ2xhc3Moc3VwZXJDbGFzcywgbWVtYmVycykgewoJdmFyIHN1YkNsYXNzOwoKCS8vIGVuc3VyZSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgc3ViY2xhc3MsIGZvcndhcmRpbmcgYWxsIGFyZ3VtZW50cyB0byB0aGUgc3VwZXItY29uc3RydWN0b3IgaWYgaXQgZG9lc24ndCBleGlzdAoJaWYgKGhhc093blByb3AobWVtYmVycywgJ2NvbnN0cnVjdG9yJykpIHsKCQlzdWJDbGFzcyA9IG1lbWJlcnMuY29uc3RydWN0b3I7Cgl9CglpZiAodHlwZW9mIHN1YkNsYXNzICE9PSAnZnVuY3Rpb24nKSB7CgkJc3ViQ2xhc3MgPSBtZW1iZXJzLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CgkJCXN1cGVyQ2xhc3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCQl9OwoJfQoKCS8vIGJ1aWxkIHRoZSBiYXNlIHByb3RvdHlwZSBmb3IgdGhlIHN1YmNsYXNzLCB3aGljaCBpcyBhbiBuZXcgb2JqZWN0IGNoYWluZWQgdG8gdGhlIHN1cGVyY2xhc3MncyBwcm90b3R5cGUKCXN1YkNsYXNzLnByb3RvdHlwZSA9IGNyZWF0ZU9iamVjdChzdXBlckNsYXNzLnByb3RvdHlwZSk7CgoJLy8gY29weSBlYWNoIG1lbWJlciB2YXJpYWJsZS9tZXRob2Qgb250byB0aGUgdGhlIHN1YmNsYXNzJ3MgcHJvdG90eXBlCgljb3B5T3duUHJvcHMobWVtYmVycywgc3ViQ2xhc3MucHJvdG90eXBlKTsKCgkvLyBjb3B5IG92ZXIgYWxsIGNsYXNzIHZhcmlhYmxlcy9tZXRob2RzIHRvIHRoZSBzdWJjbGFzcywgc3VjaCBhcyBgZXh0ZW5kYCBhbmQgYG1peGluYAoJY29weU93blByb3BzKHN1cGVyQ2xhc3MsIHN1YkNsYXNzKTsKCglyZXR1cm4gc3ViQ2xhc3M7Cn0KCgpmdW5jdGlvbiBtaXhJbnRvQ2xhc3ModGhlQ2xhc3MsIG1lbWJlcnMpIHsKCWNvcHlPd25Qcm9wcyhtZW1iZXJzLCB0aGVDbGFzcy5wcm90b3R5cGUpOwp9Cjs7Cgp2YXIgRW1pdHRlck1peGluID0gRkMuRW1pdHRlck1peGluID0gewoKCS8vIGpRdWVyeS1pZmljYXRpb24gdmlhICQodGhpcykgYWxsb3dzIGEgbm9uLURPTSBvYmplY3QgdG8gaGF2ZQoJLy8gdGhlIHNhbWUgZXZlbnQgaGFuZGxpbmcgY2FwYWJpbGl0aWVzIChpbmNsdWRpbmcgbmFtZXNwYWNlcykuCgoKCW9uOiBmdW5jdGlvbih0eXBlcywgaGFuZGxlcikgewoKCQkvLyBoYW5kbGVycyBhcmUgYWx3YXlzIGNhbGxlZCB3aXRoIGFuICJldmVudCIgb2JqZWN0IGFzIHRoZWlyIGZpcnN0IHBhcmFtLgoJCS8vIHNuZWFrIHRoZSBgdGhpc2AgY29udGV4dCBhbmQgYXJndW1lbnRzIGludG8gdGhlIGV4dHJhIHBhcmFtZXRlciBvYmplY3QKCQkvLyBhbmQgZm9yd2FyZCB0aGVtIG9uIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGVyLgoJCXZhciBpbnRlcmNlcHQgPSBmdW5jdGlvbihldiwgZXh0cmEpIHsKCQkJcmV0dXJuIGhhbmRsZXIuYXBwbHkoCgkJCQlleHRyYS5jb250ZXh0IHx8IHRoaXMsCgkJCQlleHRyYS5hcmdzIHx8IFtdCgkJCSk7CgkJfTsKCgkJLy8gbWltaWNrIGpRdWVyeSdzIGludGVybmFsICJwcm94eSIgc3lzdGVtIChyaXNreSwgSSBrbm93KQoJCS8vIGNhdXNpbmcgYWxsIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIC5ndWlkIHRvIGFwcGVhciB0byBiZSB0aGUgc2FtZS4KCQkvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iLzIuMi40L3NyYy9jb3JlLmpzI0w0NDgKCQkvLyB0aGlzIGlzIG5lZWRlZCBmb3IgY2FsbGluZyAub2ZmIHdpdGggdGhlIG9yaWdpbmFsIG5vbi1pbnRlcmNlcHQgaGFuZGxlci4KCQlpZiAoIWhhbmRsZXIuZ3VpZCkgewoJCQloYW5kbGVyLmd1aWQgPSAkLmd1aWQrKzsKCQl9CgkJaW50ZXJjZXB0Lmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgoJCSQodGhpcykub24odHlwZXMsIGludGVyY2VwdCk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCW9mZjogZnVuY3Rpb24odHlwZXMsIGhhbmRsZXIpIHsKCQkkKHRoaXMpLm9mZih0eXBlcywgaGFuZGxlcik7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXI6IGZ1bmN0aW9uKHR5cGVzKSB7CgkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZpcnN0CgoJCS8vIHBhc3MgaW4gImV4dHJhIiBpbmZvIHRvIHRoZSBpbnRlcmNlcHQKCQkkKHRoaXMpLnRyaWdnZXJIYW5kbGVyKHR5cGVzLCB7IGFyZ3M6IGFyZ3MgfSk7CgoJCXJldHVybiB0aGlzOyAvLyBmb3IgY2hhaW5pbmcKCX0sCgoKCXRyaWdnZXJXaXRoOiBmdW5jdGlvbih0eXBlcywgY29udGV4dCwgYXJncykgewoKCQkvLyBgdHJpZ2dlckhhbmRsZXJgIGlzIGxlc3MgcmVsaWFudCBvbiB0aGUgRE9NIGNvbXBhcmVkIHRvIGB0cmlnZ2VyYC4KCQkvLyBwYXNzIGluICJleHRyYSIgaW5mbyB0byB0aGUgaW50ZXJjZXB0LgoJCSQodGhpcykudHJpZ2dlckhhbmRsZXIodHlwZXMsIHsgY29udGV4dDogY29udGV4dCwgYXJnczogYXJncyB9KTsKCgkJcmV0dXJuIHRoaXM7IC8vIGZvciBjaGFpbmluZwoJfQoKfTsKCjs7CgovKgpVdGlsaXR5IG1ldGhvZHMgZm9yIGVhc2lseSBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIGFub3RoZXIgb2JqZWN0LAphbmQgbW9yZSBpbXBvcnRhbnRseSwgZWFzaWx5IHVubGlzdGVuaW5nIGZyb20gdGhlbS4KKi8KdmFyIExpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluID0gKGZ1bmN0aW9uKCkgewoJdmFyIGd1aWQgPSAwOwoJdmFyIExpc3RlbmVyTWl4aW4gPSB7CgoJCWxpc3RlbmVySWQ6IG51bGwsCgoJCS8qCgkJR2l2ZW4gYW4gYG90aGVyYCBvYmplY3QgdGhhdCBoYXMgb24vb2ZmIG1ldGhvZHMsIGJpbmQgdGhlIGdpdmVuIGBjYWxsYmFja2AgdG8gYW4gZXZlbnQgYnkgdGhlIGdpdmVuIG5hbWUuCgkJVGhlIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIG9iamVjdCB0aGF0IC5saXN0ZW5UbyBpcyBiZWluZyBjYWxsZWQgb24uCgkJQ2FuIGJlIGNhbGxlZDoKCQkJLmxpc3RlblRvKG90aGVyLCBldmVudE5hbWUsIGNhbGxiYWNrKQoJCU9SCgkJCS5saXN0ZW5UbyhvdGhlciwgewoJCQkJZXZlbnROYW1lMTogY2FsbGJhY2sxLAoJCQkJZXZlbnROYW1lMjogY2FsbGJhY2syCgkJCX0pCgkJKi8KCQlsaXN0ZW5UbzogZnVuY3Rpb24ob3RoZXIsIGFyZywgY2FsbGJhY2spIHsKCQkJaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnKSB7IC8vIGdpdmVuIGRpY3Rpb25hcnkgb2YgY2FsbGJhY2tzCgkJCQlmb3IgKHZhciBldmVudE5hbWUgaW4gYXJnKSB7CgkJCQkJaWYgKGFyZy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CgkJCQkJCXRoaXMubGlzdGVuVG8ob3RoZXIsIGV2ZW50TmFtZSwgYXJnW2V2ZW50TmFtZV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgewoJCQkJb3RoZXIub24oCgkJCQkJYXJnICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLCAvLyB1c2UgZXZlbnQgbmFtZXNwYWNpbmcgdG8gaWRlbnRpZnkgdGhpcyBvYmplY3QKCQkJCQkkLnByb3h5KGNhbGxiYWNrLCB0aGlzKSAvLyBhbHdheXMgdXNlIGB0aGlzYCBjb250ZXh0CgkJCQkJCS8vIHRoZSB1c3VhbGx5LXVuZGVzaXJlZCBqUXVlcnkgZ3VpZCBiZWhhdmlvciBkb2Vzbid0IG1hdHRlciwKCQkJCQkJLy8gYmVjYXVzZSB3ZSBhbHdheXMgdW5iaW5kIHZpYSBuYW1lc3BhY2UKCQkJCSk7CgkJCX0KCQl9LAoKCQkvKgoJCUNhdXNlcyB0aGUgY3VycmVudCBvYmplY3QgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9uIHRoZSBgb3RoZXJgIG9iamVjdC4KCQlgZXZlbnROYW1lYCBpcyBvcHRpb25hbC4gSWYgb21pdHRlZCwgd2lsbCBzdG9wIGxpc3RlbmluZyB0byBBTEwgZXZlbnRzIG9uIGBvdGhlcmAuCgkJKi8KCQlzdG9wTGlzdGVuaW5nVG86IGZ1bmN0aW9uKG90aGVyLCBldmVudE5hbWUpIHsKCQkJb3RoZXIub2ZmKChldmVudE5hbWUgfHwgJycpICsgJy4nICsgdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpKTsKCQl9LAoKCQkvKgoJCVJldHVybnMgYSBzdHJpbmcsIHVuaXF1ZSB0byB0aGlzIG9iamVjdCwgdG8gYmUgdXNlZCBmb3IgZXZlbnQgbmFtZXNwYWNpbmcKCQkqLwoJCWdldExpc3RlbmVyTmFtZXNwYWNlOiBmdW5jdGlvbigpIHsKCQkJaWYgKHRoaXMubGlzdGVuZXJJZCA9PSBudWxsKSB7CgkJCQl0aGlzLmxpc3RlbmVySWQgPSBndWlkKys7CgkJCX0KCQkJcmV0dXJuICdfbGlzdGVuZXInICsgdGhpcy5saXN0ZW5lcklkOwoJCX0KCgl9OwoJcmV0dXJuIExpc3RlbmVyTWl4aW47Cn0pKCk7Cjs7CgovLyBzaW1wbGUgY2xhc3MgZm9yIHRvZ2dsZSBhIGBpc0lnbm9yaW5nTW91c2VgIGZsYWcgb24gZGVsYXkKLy8gaW5pdE1vdXNlSWdub3JpbmcgbXVzdCBmaXJzdCBiZSBjYWxsZWQsIHdpdGggYSBtaWxsaXNlY29uZCBkZWxheSBzZXR0aW5nLgp2YXIgTW91c2VJZ25vcmVyTWl4aW4gPSB7CgoJaXNJZ25vcmluZ01vdXNlOiBmYWxzZSwgLy8gYm9vbAoJZGVsYXlVbmlnbm9yZU1vdXNlOiBudWxsLCAvLyBtZXRob2QKCgoJaW5pdE1vdXNlSWdub3Jpbmc6IGZ1bmN0aW9uKGRlbGF5KSB7CgkJdGhpcy5kZWxheVVuaWdub3JlTW91c2UgPSBkZWJvdW5jZShwcm94eSh0aGlzLCAndW5pZ25vcmVNb3VzZScpLCBkZWxheSB8fCAxMDAwKTsKCX0sCgoKCS8vIHRlbXBvcmFyaWx5IGlnbm9yZSBtb3VzZSBhY3Rpb25zIG9uIHNlZ21lbnRzCgl0ZW1wSWdub3JlTW91c2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNJZ25vcmluZ01vdXNlID0gdHJ1ZTsKCQl0aGlzLmRlbGF5VW5pZ25vcmVNb3VzZSgpOwoJfSwKCgoJLy8gZGVsYXlVbmlnbm9yZU1vdXNlIGV2ZW50dWFsbHkgY2FsbHMgdGhpcwoJdW5pZ25vcmVNb3VzZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0lnbm9yaW5nTW91c2UgPSBmYWxzZTsKCX0KCn07Cgo7OwoKLyogQSByZWN0YW5ndWxhciBwYW5lbCB0aGF0IGlzIGFic29sdXRlbHkgcG9zaXRpb25lZCBvdmVyIG90aGVyIGNvbnRlbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9wdGlvbnM6CgktIGNsYXNzTmFtZSAoc3RyaW5nKQoJLSBjb250ZW50IChIVE1MIHN0cmluZyBvciBqUXVlcnkgZWxlbWVudCBzZXQpCgktIHBhcmVudEVsCgktIHRvcAoJLSBsZWZ0CgktIHJpZ2h0ICh0aGUgeCBjb29yZCBvZiB3aGVyZSB0aGUgcmlnaHQgZWRnZSBzaG91bGQgYmUuIG5vdCBhICJDU1MiIHJpZ2h0KQoJLSBhdXRvSGlkZSAoYm9vbGVhbikKCS0gc2hvdyAoY2FsbGJhY2spCgktIGhpZGUgKGNhbGxiYWNrKQoqLwoKdmFyIFBvcG92ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCWlzSGlkZGVuOiB0cnVlLAoJb3B0aW9uczogbnVsbCwKCWVsOiBudWxsLCAvLyB0aGUgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBwb3BvdmVyLiBnZW5lcmF0ZWQgYnkgdGhpcyBvYmplY3QKCW1hcmdpbjogMTAsIC8vIHRoZSBzcGFjZSByZXF1aXJlZCBiZXR3ZWVuIHRoZSBwb3BvdmVyIGFuZCB0aGUgZWRnZXMgb2YgdGhlIHNjcm9sbCBjb250YWluZXIKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJfSwKCgoJLy8gU2hvd3MgdGhlIHBvcG92ZXIgb24gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gUmVuZGVycyBpdCBpZiBub3QgYWxyZWFkeQoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJaWYgKCF0aGlzLmVsKSB7CgkJCQl0aGlzLnJlbmRlcigpOwoJCQl9CgkJCXRoaXMuZWwuc2hvdygpOwoJCQl0aGlzLnBvc2l0aW9uKCk7CgkJCXRoaXMuaXNIaWRkZW4gPSBmYWxzZTsKCQkJdGhpcy50cmlnZ2VyKCdzaG93Jyk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgdGhlIHBvcG92ZXIsIHRocm91Z2ggQ1NTLCBidXQgZG9lcyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlIERPTQoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuZWwuaGlkZSgpOwoJCQl0aGlzLmlzSGlkZGVuID0gdHJ1ZTsKCQkJdGhpcy50cmlnZ2VyKCdoaWRlJyk7CgkJfQoJfSwKCgoJLy8gQ3JlYXRlcyBgdGhpcy5lbGAgYW5kIHJlbmRlcnMgY29udGVudCBpbnNpZGUgb2YgaXQKCXJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5lbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXBvcG92ZXIiLz4nKQoJCQkuYWRkQ2xhc3Mob3B0aW9ucy5jbGFzc05hbWUgfHwgJycpCgkJCS5jc3MoewoJCQkJLy8gcG9zaXRpb24gaW5pdGlhbGx5IHRvIHRoZSB0b3AgbGVmdCB0byBhdm9pZCBjcmVhdGluZyBzY3JvbGxiYXJzCgkJCQl0b3A6IDAsCgkJCQlsZWZ0OiAwCgkJCX0pCgkJCS5hcHBlbmQob3B0aW9ucy5jb250ZW50KQoJCQkuYXBwZW5kVG8ob3B0aW9ucy5wYXJlbnRFbCk7CgoJCS8vIHdoZW4gYSBjbGljayBoYXBwZW5zIG9uIGFueXRoaW5nIGluc2lkZSB3aXRoIGEgJ2ZjLWNsb3NlJyBjbGFzc05hbWUsIGhpZGUgdGhlIHBvcG92ZXIKCQl0aGlzLmVsLm9uKCdjbGljaycsICcuZmMtY2xvc2UnLCBmdW5jdGlvbigpIHsKCQkJX3RoaXMuaGlkZSgpOwoJCX0pOwoKCQlpZiAob3B0aW9ucy5hdXRvSGlkZSkgewoJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudE1vdXNlZG93bik7CgkJfQoJfSwKCgoJLy8gVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzICphbnl3aGVyZSogaW4gdGhlIGRvY3VtZW50LCBmb3IgdGhlIGF1dG9IaWRlIGZlYXR1cmUKCWRvY3VtZW50TW91c2Vkb3duOiBmdW5jdGlvbihldikgewoJCS8vIG9ubHkgaGlkZSB0aGUgcG9wb3ZlciBpZiB0aGUgY2xpY2sgaGFwcGVuZWQgb3V0c2lkZSB0aGUgcG9wb3ZlcgoJCWlmICh0aGlzLmVsICYmICEkKGV2LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsKS5sZW5ndGgpIHsKCQkJdGhpcy5oaWRlKCk7CgkJfQoJfSwKCgoJLy8gSGlkZXMgYW5kIHVucmVnaXN0ZXJzIGFueSBoYW5kbGVycwoJcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oaWRlKCk7CgoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCgkJdGhpcy5zdG9wTGlzdGVuaW5nVG8oJChkb2N1bWVudCksICdtb3VzZWRvd24nKTsKCX0sCgoKCS8vIFBvc2l0aW9ucyB0aGUgcG9wb3ZlciBvcHRpbWFsbHksIHVzaW5nIHRoZSB0b3AvbGVmdC9yaWdodCBvcHRpb25zCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdmFyIG9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJdmFyIHdpZHRoID0gdGhpcy5lbC5vdXRlcldpZHRoKCk7CgkJdmFyIGhlaWdodCA9IHRoaXMuZWwub3V0ZXJIZWlnaHQoKTsKCQl2YXIgd2luZG93RWwgPSAkKHdpbmRvdyk7CgkJdmFyIHZpZXdwb3J0RWwgPSBnZXRTY3JvbGxQYXJlbnQodGhpcy5lbCk7CgkJdmFyIHZpZXdwb3J0VG9wOwoJCXZhciB2aWV3cG9ydExlZnQ7CgkJdmFyIHZpZXdwb3J0T2Zmc2V0OwoJCXZhciB0b3A7IC8vIHRoZSAicG9zaXRpb24iIChub3QgIm9mZnNldCIpIHZhbHVlcyBmb3IgdGhlIHBvcG92ZXIKCQl2YXIgbGVmdDsgLy8KCgkJLy8gY29tcHV0ZSB0b3AgYW5kIGxlZnQKCQl0b3AgPSBvcHRpb25zLnRvcCB8fCAwOwoJCWlmIChvcHRpb25zLmxlZnQgIT09IHVuZGVmaW5lZCkgewoJCQlsZWZ0ID0gb3B0aW9ucy5sZWZ0OwoJCX0KCQllbHNlIGlmIChvcHRpb25zLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHsKCQkJbGVmdCA9IG9wdGlvbnMucmlnaHQgLSB3aWR0aDsgLy8gZGVyaXZlIHRoZSBsZWZ0IHZhbHVlIGZyb20gdGhlIHJpZ2h0IHZhbHVlCgkJfQoJCWVsc2UgewoJCQlsZWZ0ID0gMDsKCQl9CgoJCWlmICh2aWV3cG9ydEVsLmlzKHdpbmRvdykgfHwgdmlld3BvcnRFbC5pcyhkb2N1bWVudCkpIHsgLy8gbm9ybWFsaXplIGdldFNjcm9sbFBhcmVudCdzIHJlc3VsdAoJCQl2aWV3cG9ydEVsID0gd2luZG93RWw7CgkJCXZpZXdwb3J0VG9wID0gMDsgLy8gdGhlIHdpbmRvdyBpcyBhbHdheXMgYXQgdGhlIHRvcCBsZWZ0CgkJCXZpZXdwb3J0TGVmdCA9IDA7IC8vIChhbmQgLm9mZnNldCgpIHdvbid0IHdvcmsgaWYgY2FsbGVkIGhlcmUpCgkJfQoJCWVsc2UgewoJCQl2aWV3cG9ydE9mZnNldCA9IHZpZXdwb3J0RWwub2Zmc2V0KCk7CgkJCXZpZXdwb3J0VG9wID0gdmlld3BvcnRPZmZzZXQudG9wOwoJCQl2aWV3cG9ydExlZnQgPSB2aWV3cG9ydE9mZnNldC5sZWZ0OwoJCX0KCgkJLy8gaWYgdGhlIHdpbmRvdyBpcyBzY3JvbGxlZCwgaXQgY2F1c2VzIHRoZSB2aXNpYmxlIGFyZWEgdG8gYmUgZnVydGhlciBkb3duCgkJdmlld3BvcnRUb3AgKz0gd2luZG93RWwuc2Nyb2xsVG9wKCk7CgkJdmlld3BvcnRMZWZ0ICs9IHdpbmRvd0VsLnNjcm9sbExlZnQoKTsKCgkJLy8gY29uc3RyYWluIHRvIHRoZSB2aWV3IHBvcnQuIGlmIGNvbnN0cmFpbmVkIGJ5IHR3byBlZGdlcywgZ2l2ZSBwcmVjZWRlbmNlIHRvIHRvcC9sZWZ0CgkJaWYgKG9wdGlvbnMudmlld3BvcnRDb25zdHJhaW4gIT09IGZhbHNlKSB7CgkJCXRvcCA9IE1hdGgubWluKHRvcCwgdmlld3BvcnRUb3AgKyB2aWV3cG9ydEVsLm91dGVySGVpZ2h0KCkgLSBoZWlnaHQgLSB0aGlzLm1hcmdpbik7CgkJCXRvcCA9IE1hdGgubWF4KHRvcCwgdmlld3BvcnRUb3AgKyB0aGlzLm1hcmdpbik7CgkJCWxlZnQgPSBNYXRoLm1pbihsZWZ0LCB2aWV3cG9ydExlZnQgKyB2aWV3cG9ydEVsLm91dGVyV2lkdGgoKSAtIHdpZHRoIC0gdGhpcy5tYXJnaW4pOwoJCQlsZWZ0ID0gTWF0aC5tYXgobGVmdCwgdmlld3BvcnRMZWZ0ICsgdGhpcy5tYXJnaW4pOwoJCX0KCgkJdGhpcy5lbC5jc3MoewoJCQl0b3A6IHRvcCAtIG9yaWdpbi50b3AsCgkJCWxlZnQ6IGxlZnQgLSBvcmlnaW4ubGVmdAoJCX0pOwoJfSwKCgoJLy8gVHJpZ2dlcnMgYSBjYWxsYmFjay4gQ2FsbHMgYSBmdW5jdGlvbiBpbiB0aGUgb3B0aW9uIGhhc2ggb2YgdGhlIHNhbWUgbmFtZS4KCS8vIEFyZ3VtZW50cyBiZXlvbmQgdGhlIGZpcnN0IGBuYW1lYCBhcmUgZm9yd2FyZGVkIG9uLgoJLy8gVE9ETzogYmV0dGVyIGNvZGUgcmV1c2UgZm9yIHRoaXMuIFJlcGVhdCBjb2RlCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKfSk7Cgo7OwoKLyoKQSBjYWNoZSBmb3IgdGhlIGxlZnQvcmlnaHQvdG9wL2JvdHRvbS93aWR0aC9oZWlnaHQgdmFsdWVzIGZvciBvbmUgb3IgbW9yZSBlbGVtZW50cy4KV29ya3Mgd2l0aCBib3RoIG9mZnNldCAoZnJvbSB0b3BsZWZ0IGRvY3VtZW50KSBhbmQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50KS4KCm9wdGlvbnM6Ci0gZWxzCi0gaXNIb3Jpem9udGFsCi0gaXNWZXJ0aWNhbAoqLwp2YXIgQ29vcmRDYWNoZSA9IEZDLkNvb3JkQ2FjaGUgPSBDbGFzcy5leHRlbmQoewoKCWVsczogbnVsbCwgLy8galF1ZXJ5IHNldCAoYXNzdW1lZCB0byBiZSBzaWJsaW5ncykKCWZvcmNlZE9mZnNldFBhcmVudEVsOiBudWxsLCAvLyBvcHRpb25zIGNhbiBvdmVycmlkZSB0aGUgbmF0dXJhbCBvZmZzZXRQYXJlbnQKCW9yaWdpbjogbnVsbCwgLy8ge2xlZnQsdG9wfSBwb3NpdGlvbiBvZiBvZmZzZXRQYXJlbnQgb2YgZWxzCglib3VuZGluZ1JlY3Q6IG51bGwsIC8vIGNvbnN0cmFpbiBjb3JkaW5hdGVzIHRvIHRoaXMgcmVjdGFuZ2xlLiB7bGVmdCxyaWdodCx0b3AsYm90dG9tfSBvciBudWxsCglpc0hvcml6b250YWw6IGZhbHNlLCAvLyB3aGV0aGVyIHRvIHF1ZXJ5IGZvciBsZWZ0L3JpZ2h0L3dpZHRoCglpc1ZlcnRpY2FsOiBmYWxzZSwgLy8gd2hldGhlciB0byBxdWVyeSBmb3IgdG9wL2JvdHRvbS9oZWlnaHQKCgkvLyBhcnJheXMgb2YgY29vcmRpbmF0ZXMgKG9mZnNldHMgZnJvbSB0b3BsZWZ0IG9mIGRvY3VtZW50KQoJbGVmdHM6IG51bGwsCglyaWdodHM6IG51bGwsCgl0b3BzOiBudWxsLAoJYm90dG9tczogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQl0aGlzLmVscyA9ICQob3B0aW9ucy5lbHMpOwoJCXRoaXMuaXNIb3Jpem9udGFsID0gb3B0aW9ucy5pc0hvcml6b250YWw7CgkJdGhpcy5pc1ZlcnRpY2FsID0gb3B0aW9ucy5pc1ZlcnRpY2FsOwoJCXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWwgPSBvcHRpb25zLm9mZnNldFBhcmVudCA/ICQob3B0aW9ucy5vZmZzZXRQYXJlbnQpIDogbnVsbDsKCX0sCgoKCS8vIFF1ZXJpZXMgdGhlIGVscyBmb3IgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGVtLgoJLy8gQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdXNpbmcgYW5kIG9mIHRoZSBnZXQqIG1ldGhvZHMgYmVsb3cuCglidWlsZDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudEVsID0gdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbCB8fCB0aGlzLmVscy5lcSgwKS5vZmZzZXRQYXJlbnQoKTsKCgkJdGhpcy5vcmlnaW4gPSBvZmZzZXRQYXJlbnRFbC5vZmZzZXQoKTsKCQl0aGlzLmJvdW5kaW5nUmVjdCA9IHRoaXMucXVlcnlCb3VuZGluZ1JlY3QoKTsKCgkJaWYgKHRoaXMuaXNIb3Jpem9udGFsKSB7CgkJCXRoaXMuYnVpbGRFbEhvcml6b250YWxzKCk7CgkJfQoJCWlmICh0aGlzLmlzVmVydGljYWwpIHsKCQkJdGhpcy5idWlsZEVsVmVydGljYWxzKCk7CgkJfQoJfSwKCgoJLy8gRGVzdHJveXMgYWxsIGludGVybmFsIGRhdGEgYWJvdXQgY29vcmRpbmF0ZXMsIGZyZWVpbmcgbWVtb3J5CgljbGVhcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmlnaW4gPSBudWxsOwoJCXRoaXMuYm91bmRpbmdSZWN0ID0gbnVsbDsKCQl0aGlzLmxlZnRzID0gbnVsbDsKCQl0aGlzLnJpZ2h0cyA9IG51bGw7CgkJdGhpcy50b3BzID0gbnVsbDsKCQl0aGlzLmJvdHRvbXMgPSBudWxsOwoJfSwKCgoJLy8gV2hlbiBjYWxsZWQsIGlmIGNvb3JkIGNhY2hlcyBhcmVuJ3QgYnVpbHQsIGJ1aWxkcyB0aGVtCgllbnN1cmVCdWlsdDogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLm9yaWdpbikgewoJCQl0aGlzLmJ1aWxkKCk7CgkJfQoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSBsZWZ0L3JpZ2h0IGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKCkgewoJCXZhciBsZWZ0cyA9IFtdOwoJCXZhciByaWdodHMgPSBbXTsKCgkJdGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLCBub2RlKSB7CgkJCXZhciBlbCA9ICQobm9kZSk7CgkJCXZhciBsZWZ0ID0gZWwub2Zmc2V0KCkubGVmdDsKCQkJdmFyIHdpZHRoID0gZWwub3V0ZXJXaWR0aCgpOwoKCQkJbGVmdHMucHVzaChsZWZ0KTsKCQkJcmlnaHRzLnB1c2gobGVmdCArIHdpZHRoKTsKCQl9KTsKCgkJdGhpcy5sZWZ0cyA9IGxlZnRzOwoJCXRoaXMucmlnaHRzID0gcmlnaHRzOwoJfSwKCgoJLy8gUG9wdWxhdGVzIHRoZSB0b3AvYm90dG9tIGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzCglidWlsZEVsVmVydGljYWxzOiBmdW5jdGlvbigpIHsKCQl2YXIgdG9wcyA9IFtdOwoJCXZhciBib3R0b21zID0gW107CgoJCXRoaXMuZWxzLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQl2YXIgZWwgPSAkKG5vZGUpOwoJCQl2YXIgdG9wID0gZWwub2Zmc2V0KCkudG9wOwoJCQl2YXIgaGVpZ2h0ID0gZWwub3V0ZXJIZWlnaHQoKTsKCgkJCXRvcHMucHVzaCh0b3ApOwoJCQlib3R0b21zLnB1c2godG9wICsgaGVpZ2h0KTsKCQl9KTsKCgkJdGhpcy50b3BzID0gdG9wczsKCQl0aGlzLmJvdHRvbXMgPSBib3R0b21zOwoJfSwKCgoJLy8gR2l2ZW4gYSBsZWZ0IG9mZnNldCAoZnJvbSBkb2N1bWVudCBsZWZ0KSwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsIHRoYXQgaXQgaG9yaXpvbnRhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRIb3Jpem9udGFsSW5kZXg6IGZ1bmN0aW9uKGxlZnRPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciBsZWZ0cyA9IHRoaXMubGVmdHM7CgkJdmFyIHJpZ2h0cyA9IHRoaXMucmlnaHRzOwoJCXZhciBsZW4gPSBsZWZ0cy5sZW5ndGg7CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCQlpZiAobGVmdE9mZnNldCA+PSBsZWZ0c1tpXSAmJiBsZWZ0T2Zmc2V0IDwgcmlnaHRzW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgdG9wIG9mZnNldCAoZnJvbSBkb2N1bWVudCB0b3ApLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCB2ZXJ0aWNhbGx5IGludGVyc2VjdHMuCgkvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuCglnZXRWZXJ0aWNhbEluZGV4OiBmdW5jdGlvbih0b3BPZmZzZXQpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgoJCXZhciB0b3BzID0gdGhpcy50b3BzOwoJCXZhciBib3R0b21zID0gdGhpcy5ib3R0b21zOwoJCXZhciBsZW4gPSB0b3BzLmxlbmd0aDsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkJCWlmICh0b3BPZmZzZXQgPj0gdG9wc1tpXSAmJiB0b3BPZmZzZXQgPCBib3R0b21zW2ldKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCX0sCgoKCS8vIEdldHMgdGhlIGxlZnQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0TGVmdE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIChmcm9tIG9mZnNldFBhcmVudCBsZWZ0KSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldExlZnRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmxlZnRzW2xlZnRJbmRleF0gLSB0aGlzLm9yaWdpbi5sZWZ0OwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCdzIHJpZ2h0IGVkZ2UsIGxpa2UgdGhlIENTUyBjb25jZXB0IG9mICJyaWdodCIgd291bGQgYmUuCglnZXRSaWdodE9mZnNldDogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdOwoJfSwKCgoJLy8gR2V0cyB0aGUgcmlnaHQgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IGxlZnQpIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyByaWdodCBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAicmlnaHQiIHdvdWxkIGJlLgoJZ2V0UmlnaHRQb3NpdGlvbjogZnVuY3Rpb24obGVmdEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdIC0gdGhpcy5vcmlnaW4ubGVmdDsKCX0sCgoKCS8vIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAoJZ2V0V2lkdGg6IGZ1bmN0aW9uKGxlZnRJbmRleCkgewoJCXRoaXMuZW5zdXJlQnVpbHQoKTsKCQlyZXR1cm4gdGhpcy5yaWdodHNbbGVmdEluZGV4XSAtIHRoaXMubGVmdHNbbGVmdEluZGV4XTsKCX0sCgoKCS8vIEdldHMgdGhlIHRvcCBvZmZzZXQgKGZyb20gZG9jdW1lbnQgdG9wKSBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXgKCWdldFRvcE9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSB0b3AgcG9zaXRpb24gKGZyb20gb2Zmc2V0UGFyZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uCglnZXRUb3BQb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMudG9wc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCS8vIEdldHMgdGhlIGJvdHRvbSBvZmZzZXQgKGZyb20gdGhlIGRvY3VtZW50IHRvcCkgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4LgoJLy8gVGhpcyB2YWx1ZSBpcyBOT1QgcmVsYXRpdmUgdG8gdGhlIG9mZnNldFBhcmVudCdzIGJvdHRvbSBlZGdlLCBsaWtlIHRoZSBDU1MgY29uY2VwdCBvZiAiYm90dG9tIiB3b3VsZCBiZS4KCWdldEJvdHRvbU9mZnNldDogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF07Cgl9LAoKCgkvLyBHZXRzIHRoZSBib3R0b20gcG9zaXRpb24gKGZyb20gdGhlIG9mZnNldFBhcmVudCB0b3ApIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4KCS8vIFRoaXMgdmFsdWUgaXMgTk9UIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXRQYXJlbnQncyBib3R0b20gZWRnZSwgbGlrZSB0aGUgQ1NTIGNvbmNlcHQgb2YgImJvdHRvbSIgd291bGQgYmUuCglnZXRCb3R0b21Qb3NpdGlvbjogZnVuY3Rpb24odG9wSW5kZXgpIHsKCQl0aGlzLmVuc3VyZUJ1aWx0KCk7CgkJcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF0gLSB0aGlzLm9yaWdpbi50b3A7Cgl9LAoKCgkvLyBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4CglnZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvcEluZGV4KSB7CgkJdGhpcy5lbnN1cmVCdWlsdCgpOwoJCXJldHVybiB0aGlzLmJvdHRvbXNbdG9wSW5kZXhdIC0gdGhpcy50b3BzW3RvcEluZGV4XTsKCX0sCgoKCS8vIEJvdW5kaW5nIFJlY3QKCS8vIFRPRE86IGRlY291cGxlIHRoaXMgZnJvbSBDb29yZENhY2hlCgoJLy8gQ29tcHV0ZSBhbmQgcmV0dXJuIHdoYXQgdGhlIGVsZW1lbnRzJyBib3VuZGluZyByZWN0YW5nbGUgaXMsIGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZS4KCS8vIFJpZ2h0IG5vdywgb25seSByZXR1cm5zIGEgcmVjdGFuZ2xlIGlmIGNvbnN0cmFpbmVkIGJ5IGFuIG92ZXJmbG93OnNjcm9sbCBlbGVtZW50LgoJcXVlcnlCb3VuZGluZ1JlY3Q6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxQYXJlbnRFbCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLmVscy5lcSgwKSk7CgoJCWlmICghc2Nyb2xsUGFyZW50RWwuaXMoZG9jdW1lbnQpKSB7CgkJCXJldHVybiBnZXRDbGllbnRSZWN0KHNjcm9sbFBhcmVudEVsKTsKCQl9Cgl9LAoKCWlzUG9pbnRJbkJvdW5kczogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJcmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5pc1RvcEluQm91bmRzKHRvcE9mZnNldCk7Cgl9LAoKCWlzTGVmdEluQm91bmRzOiBmdW5jdGlvbihsZWZ0T2Zmc2V0KSB7CgkJcmV0dXJuICF0aGlzLmJvdW5kaW5nUmVjdCB8fCAobGVmdE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC5sZWZ0ICYmIGxlZnRPZmZzZXQgPCB0aGlzLmJvdW5kaW5nUmVjdC5yaWdodCk7Cgl9LAoKCWlzVG9wSW5Cb3VuZHM6IGZ1bmN0aW9uKHRvcE9mZnNldCkgewoJCXJldHVybiAhdGhpcy5ib3VuZGluZ1JlY3QgfHwgKHRvcE9mZnNldCA+PSB0aGlzLmJvdW5kaW5nUmVjdC50b3AgJiYgdG9wT2Zmc2V0IDwgdGhpcy5ib3VuZGluZ1JlY3QuYm90dG9tKTsKCX0KCn0pOwoKOzsKCi8qIFRyYWNrcyBhIGRyYWcncyBtb3VzZSBtb3ZlbWVudCwgZmlyaW5nIHZhcmlvdXMgaGFuZGxlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHVzZSBFbWl0dGVyCgp2YXIgRHJhZ0xpc3RlbmVyID0gRkMuRHJhZ0xpc3RlbmVyID0gQ2xhc3MuZXh0ZW5kKExpc3RlbmVyTWl4aW4sIE1vdXNlSWdub3Jlck1peGluLCB7CgoJb3B0aW9uczogbnVsbCwKCXN1YmplY3RFbDogbnVsbCwKCgkvLyBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhbCBtb3VzZWRvd24KCW9yaWdpblg6IG51bGwsCglvcmlnaW5ZOiBudWxsLAoKCS8vIHRoZSB3cmFwcGluZyBlbGVtZW50IHRoYXQgc2Nyb2xscywgb3IgTUlHSFQgc2Nyb2xsIGlmIHRoZXJlJ3Mgb3ZlcmZsb3cuCgkvLyBUT0RPOiBkbyB0aGlzIGZvciB3cmFwcGVycyB0aGF0IGhhdmUgb3ZlcmZsb3c6aGlkZGVuIGFzIHdlbGwuCglzY3JvbGxFbDogbnVsbCwKCglpc0ludGVyYWN0aW5nOiBmYWxzZSwKCWlzRGlzdGFuY2VTdXJwYXNzZWQ6IGZhbHNlLAoJaXNEZWxheUVuZGVkOiBmYWxzZSwKCWlzRHJhZ2dpbmc6IGZhbHNlLAoJaXNUb3VjaDogZmFsc2UsCgoJZGVsYXk6IG51bGwsCglkZWxheVRpbWVvdXRJZDogbnVsbCwKCW1pbkRpc3RhbmNlOiBudWxsLAoKCWhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6IG51bGwsIC8vIGNhbGxzIGhhbmRsZVRvdWNoU2Nyb2xsLCBhbHdheXMgYm91bmQgdG8gYHRoaXNgCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihvcHRpb25zKSB7CgkJdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkgPSBwcm94eSh0aGlzLCAnaGFuZGxlVG91Y2hTY3JvbGwnKTsKCQl0aGlzLmluaXRNb3VzZUlnbm9yaW5nKDUwMCk7Cgl9LAoKCgkvLyBJbnRlcmFjdGlvbiAoaGlnaC1sZXZlbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0SW50ZXJhY3Rpb246IGZ1bmN0aW9uKGV2LCBleHRyYU9wdGlvbnMpIHsKCQl2YXIgaXNUb3VjaCA9IGdldEV2SXNUb3VjaChldik7CgoJCWlmIChldi50eXBlID09PSAnbW91c2Vkb3duJykgewoJCQlpZiAodGhpcy5pc0lnbm9yaW5nTW91c2UpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllbHNlIGlmICghaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSB7CgkJCQlldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50cyBuYXRpdmUgc2VsZWN0aW9uIGluIG1vc3QgYnJvd3NlcnMKCQkJfQoJCX0KCgkJaWYgKCF0aGlzLmlzSW50ZXJhY3RpbmcpIHsKCgkJCS8vIHByb2Nlc3Mgb3B0aW9ucwoJCQlleHRyYU9wdGlvbnMgPSBleHRyYU9wdGlvbnMgfHwge307CgkJCXRoaXMuZGVsYXkgPSBmaXJzdERlZmluZWQoZXh0cmFPcHRpb25zLmRlbGF5LCB0aGlzLm9wdGlvbnMuZGVsYXksIDApOwoJCQl0aGlzLm1pbkRpc3RhbmNlID0gZmlyc3REZWZpbmVkKGV4dHJhT3B0aW9ucy5kaXN0YW5jZSwgdGhpcy5vcHRpb25zLmRpc3RhbmNlLCAwKTsKCQkJdGhpcy5zdWJqZWN0RWwgPSB0aGlzLm9wdGlvbnMuc3ViamVjdEVsOwoKCQkJdGhpcy5pc0ludGVyYWN0aW5nID0gdHJ1ZTsKCQkJdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKCQkJdGhpcy5pc0RlbGF5RW5kZWQgPSBmYWxzZTsKCQkJdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gZmFsc2U7CgoJCQl0aGlzLm9yaWdpblggPSBnZXRFdlgoZXYpOwoJCQl0aGlzLm9yaWdpblkgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLnNjcm9sbEVsID0gZ2V0U2Nyb2xsUGFyZW50KCQoZXYudGFyZ2V0KSk7CgoJCQl0aGlzLmJpbmRIYW5kbGVycygpOwoJCQl0aGlzLmluaXRBdXRvU2Nyb2xsKCk7CgkJCXRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChldik7CgkJCXRoaXMuc3RhcnREZWxheShldik7CgoJCQlpZiAoIXRoaXMubWluRGlzdGFuY2UpIHsKCQkJCXRoaXMuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQoZXYpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2ludGVyYWN0aW9uU3RhcnQnLCBldik7Cgl9LAoKCgllbmRJbnRlcmFjdGlvbjogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJaWYgKHRoaXMuaXNJbnRlcmFjdGluZykgewoJCQl0aGlzLmVuZERyYWcoZXYpOwoKCQkJaWYgKHRoaXMuZGVsYXlUaW1lb3V0SWQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKTsKCQkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsOwoJCQl9CgoJCQl0aGlzLmRlc3Ryb3lBdXRvU2Nyb2xsKCk7CgkJCXRoaXMudW5iaW5kSGFuZGxlcnMoKTsKCgkJCXRoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZUludGVyYWN0aW9uRW5kKGV2LCBpc0NhbmNlbGxlZCk7CgoJCQkvLyBhIHRvdWNoc3RhcnQrdG91Y2hlbmQgb24gdGhlIHNhbWUgZWxlbWVudCB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGFkZGl0aW9uIHNpbXVsYXRlZCBldmVudHM6CgkJCS8vIG1vdXNlb3ZlciArIG1vdXNlb3V0ICsgY2xpY2sKCQkJLy8gbGV0J3MgaWdub3JlIHRoZXNlIGJvZ3VzIGV2ZW50cwoJCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCQl0aGlzLnRlbXBJZ25vcmVNb3VzZSgpOwoJCQl9CgkJfQoJfSwKCgoJaGFuZGxlSW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2LCBpc0NhbmNlbGxlZCkgewoJCXRoaXMudHJpZ2dlcignaW50ZXJhY3Rpb25FbmQnLCBldiwgaXNDYW5jZWxsZWQgfHwgZmFsc2UpOwoJfSwKCgoJLy8gQmluZGluZyBUbyBET00KCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWJpbmRIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdG91Y2hTdGFydElnbm9yZXMgPSAxOwoKCQlpZiAodGhpcy5pc1RvdWNoKSB7CgkJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJCXRvdWNobW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsCgkJCQl0b3VjaGVuZDogdGhpcy5lbmRJbnRlcmFjdGlvbiwKCQkJCXRvdWNoY2FuY2VsOiB0aGlzLmVuZEludGVyYWN0aW9uLAoKCQkJCS8vIFNvbWV0aW1lcyB0b3VjaGVuZCBkb2Vzbid0IGZpcmUKCQkJCS8vIChjYW4ndCBmaWd1cmUgb3V0IHdoeS4gdG91Y2hjYW5jZWwgZG9lc24ndCBmaXJlIGVpdGhlci4gaGFzIHRvIGRvIHdpdGggc2Nyb2xsaW5nPykKCQkJCS8vIElmIGFub3RoZXIgdG91Y2hzdGFydCBoYXBwZW5zLCB3ZSBrbm93IGl0J3MgYm9ndXMsIHNvIGNhbmNlbCB0aGUgZHJhZy4KCQkJCS8vIHRvdWNoZW5kIHdpbGwgY29udGludWUgdG8gYmUgYnJva2VuIHVudGlsIHVzZXIgZG9lcyBhIHNob3J0dGFwL3Njcm9sbCwgYnV0IHRoaXMgaXMgYmVzdCB3ZSBjYW4gZG8uCgkJCQl0b3VjaHN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJCWlmICh0b3VjaFN0YXJ0SWdub3JlcykgeyAvLyBiaW5kSGFuZGxlcnMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgdG91Y2hzdGFydCwKCQkJCQkJdG91Y2hTdGFydElnbm9yZXMtLTsgLy8gYW5kIHdlIGRvbid0IHdhbnQgdGhpcyB0byBmaXJlIGltbWVkaWF0ZWx5LCBzbyBpZ25vcmUuCgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlfdGhpcy5lbmRJbnRlcmFjdGlvbihldiwgdHJ1ZSk7IC8vIGlzQ2FuY2VsbGVkPXRydWUKCQkJCQl9CgkJCQl9CgkJCX0pOwoKCQkJLy8gbGlzdGVuIHRvIEFMTCBzY3JvbGwgYWN0aW9ucyBvbiB0aGUgcGFnZQoJCQlpZiAoCgkJCQkhYmluZEFueVNjcm9sbCh0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsUHJveHkpICYmIC8vIGhvcGVmdWxseSB0aGlzIHdvcmtzIGFuZCBzaG9ydC1jaXJjdWl0cyB0aGUgcmVzdAoJCQkJdGhpcy5zY3JvbGxFbCAvLyBvdGhlcndpc2UsIGF0dGFjaCBhIHNpbmdsZSBoYW5kbGVyIHRvIHRoaXMKCQkJKSB7CgkJCQl0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsICdzY3JvbGwnLCB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgewoJCQkJbW91c2Vtb3ZlOiB0aGlzLmhhbmRsZU1vdXNlTW92ZSwKCQkJCW1vdXNldXA6IHRoaXMuZW5kSW50ZXJhY3Rpb24KCQkJfSk7CgkJfQoKCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCB7CgkJCXNlbGVjdHN0YXJ0OiBwcmV2ZW50RGVmYXVsdCwgLy8gZG9uJ3QgYWxsb3cgc2VsZWN0aW9uIHdoaWxlIGRyYWdnaW5nCgkJCWNvbnRleHRtZW51OiBwcmV2ZW50RGVmYXVsdCAvLyBsb25nIHRhcHMgd291bGQgb3BlbiBtZW51IG9uIENocm9tZSBkZXYgdG9vbHMKCQl9KTsKCX0sCgoKCXVuYmluZEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7CgoJCS8vIHVuYmluZCBzY3JvbGwgbGlzdGVuaW5nCgkJdW5iaW5kQW55U2Nyb2xsKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSk7CgkJaWYgKHRoaXMuc2Nyb2xsRWwpIHsKCQkJdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwgJ3Njcm9sbCcpOwoJCX0KCX0sCgoKCS8vIERyYWcgKGhpZ2gtbGV2ZWwpCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBleHRyYU9wdGlvbnMgaWdub3JlZCBpZiBkcmFnIGFscmVhZHkgc3RhcnRlZAoJc3RhcnREcmFnOiBmdW5jdGlvbihldiwgZXh0cmFPcHRpb25zKSB7CgkJdGhpcy5zdGFydEludGVyYWN0aW9uKGV2LCBleHRyYU9wdGlvbnMpOyAvLyBlbnN1cmUgaW50ZXJhY3Rpb24gYmVnYW4KCgkJaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsKCQkJdGhpcy5oYW5kbGVEcmFnU3RhcnQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWdTdGFydCcsIGV2KTsKCX0sCgoKCWhhbmRsZU1vdmU6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGR4ID0gZ2V0RXZYKGV2KSAtIHRoaXMub3JpZ2luWDsKCQl2YXIgZHkgPSBnZXRFdlkoZXYpIC0gdGhpcy5vcmlnaW5ZOwoJCXZhciBtaW5EaXN0YW5jZSA9IHRoaXMubWluRGlzdGFuY2U7CgkJdmFyIGRpc3RhbmNlU3E7IC8vIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLCBzcXVhcmVkCgoJCWlmICghdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkKSB7CgkJCWRpc3RhbmNlU3EgPSBkeCAqIGR4ICsgZHkgKiBkeTsKCQkJaWYgKGRpc3RhbmNlU3EgPj0gbWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSkgeyAvLyB1c2UgcHl0aGFnb3JlYW4gdGhlb3JlbQoJCQkJdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRHJhZ2dpbmcpIHsKCQkJdGhpcy5oYW5kbGVEcmFnKGR4LCBkeSwgZXYpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGlsZSB0aGUgbW91c2UgaXMgYmVpbmcgbW92ZWQgYW5kIHdoZW4gd2Uga25vdyBhIGxlZ2l0aW1hdGUgZHJhZyBpcyB0YWtpbmcgcGxhY2UKCWhhbmRsZURyYWc6IGZ1bmN0aW9uKGR4LCBkeSwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2RyYWcnLCBkeCwgZHksIGV2KTsKCQl0aGlzLnVwZGF0ZUF1dG9TY3JvbGwoZXYpOyAvLyB3aWxsIHBvc3NpYmx5IGNhdXNlIHNjcm9sbGluZwoJfSwKCgoJZW5kRHJhZzogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCXRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQl0aGlzLmhhbmRsZURyYWdFbmQoZXYpOwoJCX0KCX0sCgoKCWhhbmRsZURyYWdFbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy50cmlnZ2VyKCdkcmFnRW5kJywgZXYpOwoJfSwKCgoJLy8gRGVsYXkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXN0YXJ0RGVsYXk6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCWlmICh0aGlzLmRlbGF5KSB7CgkJCXRoaXMuZGVsYXlUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJX3RoaXMuaGFuZGxlRGVsYXlFbmQoaW5pdGlhbEV2KTsKCQkJfSwgdGhpcy5kZWxheSk7CgkJfQoJCWVsc2UgewoJCQl0aGlzLmhhbmRsZURlbGF5RW5kKGluaXRpYWxFdik7CgkJfQoJfSwKCgoJaGFuZGxlRGVsYXlFbmQ6IGZ1bmN0aW9uKGluaXRpYWxFdikgewoJCXRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTsKCgkJaWYgKHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZCkgewoJCQl0aGlzLnN0YXJ0RHJhZyhpbml0aWFsRXYpOwoJCX0KCX0sCgoKCS8vIERpc3RhbmNlCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgloYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDogZnVuY3Rpb24oZXYpIHsKCQl0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSB0cnVlOwoKCQlpZiAodGhpcy5pc0RlbGF5RW5kZWQpIHsKCQkJdGhpcy5zdGFydERyYWcoZXYpOwoJCX0KCX0sCgoKCS8vIE1vdXNlIC8gVG91Y2gKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoTW92ZTogZnVuY3Rpb24oZXYpIHsKCQkvLyBwcmV2ZW50IGluZXJ0aWEgYW5kIHRvdWNobW92ZS1zY3JvbGxpbmcgd2hpbGUgZHJhZ2dpbmcKCQlpZiAodGhpcy5pc0RyYWdnaW5nKSB7CgkJCWV2LnByZXZlbnREZWZhdWx0KCk7CgkJfQoKCQl0aGlzLmhhbmRsZU1vdmUoZXYpOwoJfSwKCgoJaGFuZGxlTW91c2VNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMuaGFuZGxlTW92ZShldik7Cgl9LAoKCgkvLyBTY3JvbGxpbmcgKHVucmVsYXRlZCB0byBhdXRvLXNjcm9sbCkKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCWhhbmRsZVRvdWNoU2Nyb2xsOiBmdW5jdGlvbihldikgewoJCS8vIGlmIHRoZSBkcmFnIGlzIGJlaW5nIGluaXRpYXRlZCBieSB0b3VjaCwgYnV0IGEgc2Nyb2xsIGhhcHBlbnMgYmVmb3JlCgkJLy8gdGhlIGRyYWctaW5pdGlhdGluZyBkZWxheSBpcyBvdmVyLCBjYW5jZWwgdGhlIGRyYWcKCQlpZiAoIXRoaXMuaXNEcmFnZ2luZykgewoJCQl0aGlzLmVuZEludGVyYWN0aW9uKGV2LCB0cnVlKTsgLy8gaXNDYW5jZWxsZWQ9dHJ1ZQoJCX0KCX0sCgoKCS8vIFV0aWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBUcmlnZ2VycyBhIGNhbGxiYWNrLiBDYWxscyBhIGZ1bmN0aW9uIGluIHRoZSBvcHRpb24gaGFzaCBvZiB0aGUgc2FtZSBuYW1lLgoJLy8gQXJndW1lbnRzIGJleW9uZCB0aGUgZmlyc3QgYG5hbWVgIGFyZSBmb3J3YXJkZWQgb24uCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7CgkJaWYgKHRoaXMub3B0aW9uc1tuYW1lXSkgewoJCQl0aGlzLm9wdGlvbnNbbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJCS8vIG1ha2VzIF9tZXRob2RzIGNhbGxhYmxlIGJ5IGV2ZW50IG5hbWUuIFRPRE86IGtpbGwgdGhpcwoJCWlmICh0aGlzWydfJyArIG5hbWVdKSB7CgkJCXRoaXNbJ18nICsgbmFtZV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJfQoJfQoKCn0pOwoKOzsKLyoKdGhpcy5zY3JvbGxFbCBpcyBzZXQgaW4gRHJhZ0xpc3RlbmVyCiovCkRyYWdMaXN0ZW5lci5taXhpbih7CgoJaXNBdXRvU2Nyb2xsOiBmYWxzZSwKCglzY3JvbGxCb3VuZHM6IG51bGwsIC8vIHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0KCXNjcm9sbFRvcFZlbDogbnVsbCwgLy8gcGl4ZWxzIHBlciBzZWNvbmQKCXNjcm9sbExlZnRWZWw6IG51bGwsIC8vIHBpeGVscyBwZXIgc2Vjb25kCglzY3JvbGxJbnRlcnZhbElkOiBudWxsLCAvLyBJRCBvZiBzZXRUaW1lb3V0IGZvciBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCgkvLyBkZWZhdWx0cwoJc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLCAvLyBwaXhlbHMgZnJvbSBlZGdlIGZvciBzY3JvbGxpbmcgdG8gc3RhcnQKCXNjcm9sbFNwZWVkOiAyMDAsIC8vIHBpeGVscyBwZXIgc2Vjb25kLCBhdCBtYXhpbXVtIHNwZWVkCglzY3JvbGxJbnRlcnZhbE1zOiA1MCwgLy8gbWlsbGlzZWNvbmQgd2FpdCBiZXR3ZWVuIHNjcm9sbCBpbmNyZW1lbnQKCgoJaW5pdEF1dG9TY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXZhciBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CgoJCXRoaXMuaXNBdXRvU2Nyb2xsID0KCQkJdGhpcy5vcHRpb25zLnNjcm9sbCAmJgoJCQlzY3JvbGxFbCAmJgoJCQkhc2Nyb2xsRWwuaXMod2luZG93KSAmJgoJCQkhc2Nyb2xsRWwuaXMoZG9jdW1lbnQpOwoKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJLy8gZGVib3VuY2UgbWFrZXMgc3VyZSByYXBpZCBjYWxscyBkb24ndCBoYXBwZW4KCQkJdGhpcy5saXN0ZW5UbyhzY3JvbGxFbCwgJ3Njcm9sbCcsIGRlYm91bmNlKHRoaXMuaGFuZGxlRGVib3VuY2VkU2Nyb2xsLCAxMDApKTsKCQl9Cgl9LAoKCglkZXN0cm95QXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7IC8vIGtpbGwgYW55IGFuaW1hdGlvbiBsb29wCgoJCS8vIHJlbW92ZSB0aGUgc2Nyb2xsIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBzY3JvbGxFbAoJCWlmICh0aGlzLmlzQXV0b1Njcm9sbCkgewoJCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsLCAnc2Nyb2xsJyk7IC8vIHdpbGwgcHJvYmFibHkgZ2V0IHJlbW92ZWQgYnkgdW5iaW5kSGFuZGxlcnMgdG9vIDooCgkJfQoJfSwKCgoJLy8gQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHNjcm9sbEVsCgljb21wdXRlU2Nyb2xsQm91bmRzOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pc0F1dG9TY3JvbGwpIHsKCQkJdGhpcy5zY3JvbGxCb3VuZHMgPSBnZXRPdXRlclJlY3QodGhpcy5zY3JvbGxFbCk7CgkJCS8vIFRPRE86IHVzZSBnZXRDbGllbnRSZWN0IGluIGZ1dHVyZS4gYnV0IHByZXZlbnRzIGF1dG8gc2Nyb2xsaW5nIHdoZW4gb24gdG9wIG9mIHNjcm9sbGJhcnMKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgZHJhZ2dpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kIHNjcm9sbGluZyBzaG91bGQgYmUgdXBkYXRlZAoJdXBkYXRlQXV0b1Njcm9sbDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgc2Vuc2l0aXZpdHkgPSB0aGlzLnNjcm9sbFNlbnNpdGl2aXR5OwoJCXZhciBib3VuZHMgPSB0aGlzLnNjcm9sbEJvdW5kczsKCQl2YXIgdG9wQ2xvc2VuZXNzLCBib3R0b21DbG9zZW5lc3M7CgkJdmFyIGxlZnRDbG9zZW5lc3MsIHJpZ2h0Q2xvc2VuZXNzOwoJCXZhciB0b3BWZWwgPSAwOwoJCXZhciBsZWZ0VmVsID0gMDsKCgkJaWYgKGJvdW5kcykgeyAvLyBvbmx5IHNjcm9sbCBpZiBzY3JvbGxFbCBleGlzdHMKCgkJCS8vIGNvbXB1dGUgY2xvc2VuZXNzIHRvIGVkZ2VzLiB2YWxpZCByYW5nZSBpcyBmcm9tIDAuMCAtIDEuMAoJCQl0b3BDbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoZ2V0RXZZKGV2KSAtIGJvdW5kcy50b3ApKSAvIHNlbnNpdGl2aXR5OwoJCQlib3R0b21DbG9zZW5lc3MgPSAoc2Vuc2l0aXZpdHkgLSAoYm91bmRzLmJvdHRvbSAtIGdldEV2WShldikpKSAvIHNlbnNpdGl2aXR5OwoJCQlsZWZ0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGdldEV2WChldikgLSBib3VuZHMubGVmdCkpIC8gc2Vuc2l0aXZpdHk7CgkJCXJpZ2h0Q2xvc2VuZXNzID0gKHNlbnNpdGl2aXR5IC0gKGJvdW5kcy5yaWdodCAtIGdldEV2WChldikpKSAvIHNlbnNpdGl2aXR5OwoKCQkJLy8gdHJhbnNsYXRlIHZlcnRpY2FsIGNsb3NlbmVzcyBpbnRvIHZlbG9jaXR5LgoJCQkvLyBtb3VzZSBtdXN0IGJlIGNvbXBsZXRlbHkgaW4gYm91bmRzIGZvciB2ZWxvY2l0eSB0byBoYXBwZW4uCgkJCWlmICh0b3BDbG9zZW5lc3MgPj0gMCAmJiB0b3BDbG9zZW5lc3MgPD0gMSkgewoJCQkJdG9wVmVsID0gdG9wQ2xvc2VuZXNzICogdGhpcy5zY3JvbGxTcGVlZCAqIC0xOyAvLyBuZWdhdGl2ZS4gZm9yIHNjcm9sbGluZyB1cAoJCQl9CgkJCWVsc2UgaWYgKGJvdHRvbUNsb3NlbmVzcyA+PSAwICYmIGJvdHRvbUNsb3NlbmVzcyA8PSAxKSB7CgkJCQl0b3BWZWwgPSBib3R0b21DbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkOwoJCQl9CgoJCQkvLyB0cmFuc2xhdGUgaG9yaXpvbnRhbCBjbG9zZW5lc3MgaW50byB2ZWxvY2l0eQoJCQlpZiAobGVmdENsb3NlbmVzcyA+PSAwICYmIGxlZnRDbG9zZW5lc3MgPD0gMSkgewoJCQkJbGVmdFZlbCA9IGxlZnRDbG9zZW5lc3MgKiB0aGlzLnNjcm9sbFNwZWVkICogLTE7IC8vIG5lZ2F0aXZlLiBmb3Igc2Nyb2xsaW5nIGxlZnQKCQkJfQoJCQllbHNlIGlmIChyaWdodENsb3NlbmVzcyA+PSAwICYmIHJpZ2h0Q2xvc2VuZXNzIDw9IDEpIHsKCQkJCWxlZnRWZWwgPSByaWdodENsb3NlbmVzcyAqIHRoaXMuc2Nyb2xsU3BlZWQ7CgkJCX0KCQl9CgoJCXRoaXMuc2V0U2Nyb2xsVmVsKHRvcFZlbCwgbGVmdFZlbCk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBzcGVlZC1vZi1zY3JvbGxpbmcgZm9yIHRoZSBzY3JvbGxFbAoJc2V0U2Nyb2xsVmVsOiBmdW5jdGlvbih0b3BWZWwsIGxlZnRWZWwpIHsKCgkJdGhpcy5zY3JvbGxUb3BWZWwgPSB0b3BWZWw7CgkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gbGVmdFZlbDsKCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gbWFzc2FnZXMgaW50byByZWFsaXN0aWMgdmFsdWVzCgoJCS8vIGlmIHRoZXJlIGlzIG5vbi16ZXJvIHZlbG9jaXR5LCBhbmQgYW4gYW5pbWF0aW9uIGxvb3AgaGFzbid0IGFscmVhZHkgc3RhcnRlZCwgdGhlbiBTVEFSVAoJCWlmICgodGhpcy5zY3JvbGxUb3BWZWwgfHwgdGhpcy5zY3JvbGxMZWZ0VmVsKSAmJiAhdGhpcy5zY3JvbGxJbnRlcnZhbElkKSB7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKAoJCQkJcHJveHkodGhpcywgJ3Njcm9sbEludGVydmFsRnVuYycpLCAvLyBzY29wZSB0byBgdGhpc2AKCQkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxNcwoJCQkpOwoJCX0KCX0sCgoKCS8vIEZvcmNlcyBzY3JvbGxUb3BWZWwgYW5kIHNjcm9sbExlZnRWZWwgdG8gYmUgemVybyBpZiBzY3JvbGxpbmcgaGFzIGFscmVhZHkgZ29uZSBhbGwgdGhlIHdheQoJY29uc3RyYWluU2Nyb2xsVmVsOiBmdW5jdGlvbigpIHsKCQl2YXIgZWwgPSB0aGlzLnNjcm9sbEVsOwoKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwgPCAwKSB7IC8vIHNjcm9sbGluZyB1cD8KCQkJaWYgKGVsLnNjcm9sbFRvcCgpIDw9IDApIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSB1cD8KCQkJCXRoaXMuc2Nyb2xsVG9wVmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbFRvcFZlbCA+IDApIHsgLy8gc2Nyb2xsaW5nIGRvd24/CgkJCWlmIChlbC5zY3JvbGxUb3AoKSArIGVsWzBdLmNsaWVudEhlaWdodCA+PSBlbFswXS5zY3JvbGxIZWlnaHQpIHsgLy8gYWxyZWFkeSBzY3JvbGxlZCBhbGwgdGhlIHdheSBkb3duPwoJCQkJdGhpcy5zY3JvbGxUb3BWZWwgPSAwOwoJCQl9CgkJfQoKCQlpZiAodGhpcy5zY3JvbGxMZWZ0VmVsIDwgMCkgeyAvLyBzY3JvbGxpbmcgbGVmdD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSA8PSAwKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSBsZWZ0PwoJCQkJdGhpcy5zY3JvbGxMZWZ0VmVsID0gMDsKCQkJfQoJCX0KCQllbHNlIGlmICh0aGlzLnNjcm9sbExlZnRWZWwgPiAwKSB7IC8vIHNjcm9sbGluZyByaWdodD8KCQkJaWYgKGVsLnNjcm9sbExlZnQoKSArIGVsWzBdLmNsaWVudFdpZHRoID49IGVsWzBdLnNjcm9sbFdpZHRoKSB7IC8vIGFscmVhZHkgc2Nyb2xsZWQgYWxsIHRoZSB3YXkgcmlnaHQ/CgkJCQl0aGlzLnNjcm9sbExlZnRWZWwgPSAwOwoJCQl9CgkJfQoJfSwKCgoJLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBzY3JvbGxpbmcgYW5pbWF0aW9uIGxvb3AKCXNjcm9sbEludGVydmFsRnVuYzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5zY3JvbGxFbDsKCQl2YXIgZnJhYyA9IHRoaXMuc2Nyb2xsSW50ZXJ2YWxNcyAvIDEwMDA7IC8vIGNvbnNpZGVyaW5nIGFuaW1hdGlvbiBmcmVxdWVuY3ksIHdoYXQgdGhlIHZlbCBzaG91bGQgYmUgbXVsdCdkIGJ5CgoJCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygc2Nyb2xsRWwncyBzY3JvbGwKCQlpZiAodGhpcy5zY3JvbGxUb3BWZWwpIHsKCQkJZWwuc2Nyb2xsVG9wKGVsLnNjcm9sbFRvcCgpICsgdGhpcy5zY3JvbGxUb3BWZWwgKiBmcmFjKTsKCQl9CgkJaWYgKHRoaXMuc2Nyb2xsTGVmdFZlbCkgewoJCQllbC5zY3JvbGxMZWZ0KGVsLnNjcm9sbExlZnQoKSArIHRoaXMuc2Nyb2xsTGVmdFZlbCAqIGZyYWMpOwoJCX0KCgkJdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKTsgLy8gc2luY2UgdGhlIHNjcm9sbCB2YWx1ZXMgY2hhbmdlZCwgcmVjb21wdXRlIHRoZSB2ZWxvY2l0aWVzCgoJCS8vIGlmIHNjcm9sbGVkIGFsbCB0aGUgd2F5LCB3aGljaCBjYXVzZXMgdGhlIHZlbHMgdG8gYmUgemVybywgc3RvcCB0aGUgYW5pbWF0aW9uIGxvb3AKCQlpZiAoIXRoaXMuc2Nyb2xsVG9wVmVsICYmICF0aGlzLnNjcm9sbExlZnRWZWwpIHsKCQkJdGhpcy5lbmRBdXRvU2Nyb2xsKCk7CgkJfQoJfSwKCgoJLy8gS2lsbHMgYW55IGV4aXN0aW5nIHNjcm9sbGluZyBhbmltYXRpb24gbG9vcAoJZW5kQXV0b1Njcm9sbDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCkgewoJCQljbGVhckludGVydmFsKHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCk7CgkJCXRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IG51bGw7CgoJCQl0aGlzLmhhbmRsZVNjcm9sbEVuZCgpOwoJCX0KCX0sCgoKCS8vIEdldCBjYWxsZWQgd2hlbiB0aGUgc2Nyb2xsRWwgaXMgc2Nyb2xsZWQgKE5PVEU6IHRoaXMgaXMgZGVsYXllZCB2aWEgZGVib3VuY2UpCgloYW5kbGVEZWJvdW5jZWRTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHJlY29tcHV0ZSBhbGwgY29vcmRpbmF0ZXMsIGJ1dCAqb25seSogaWYgdGhpcyBpcyAqbm90KiBwYXJ0IG9mIG91ciBzY3JvbGxpbmcgYW5pbWF0aW9uCgkJaWYgKCF0aGlzLnNjcm9sbEludGVydmFsSWQpIHsKCQkJdGhpcy5oYW5kbGVTY3JvbGxFbmQoKTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJfQoKfSk7Cjs7CgovKiBUcmFja3MgbW91c2UgbW92ZW1lbnRzIG92ZXIgYSBjb21wb25lbnQgYW5kIHJhaXNlcyBldmVudHMgYWJvdXQgd2hpY2ggaGl0IHRoZSBtb3VzZSBpcyBvdmVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kb3B0aW9uczoKLSBzdWJqZWN0RWwKLSBzdWJqZWN0Q2VudGVyCiovCgp2YXIgSGl0RHJhZ0xpc3RlbmVyID0gRHJhZ0xpc3RlbmVyLmV4dGVuZCh7CgoJY29tcG9uZW50OiBudWxsLCAvLyBjb252ZXJ0cyBjb29yZGluYXRlcyB0byBoaXRzCgkJLy8gbWV0aG9kczogcHJlcGFyZUhpdHMsIHJlbGVhc2VIaXRzLCBxdWVyeUhpdAoKCW9yaWdIaXQ6IG51bGwsIC8vIHRoZSBoaXQgdGhlIG1vdXNlIHdhcyBvdmVyIHdoZW4gbGlzdGVuaW5nIHN0YXJ0ZWQKCWhpdDogbnVsbCwgLy8gdGhlIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJY29vcmRBZGp1c3Q6IG51bGwsIC8vIGRlbHRhIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbW91c2UgY29vcmRpbmF0ZXMgd2hlbiBjb21wdXRpbmcgY29sbGlzaW9ucwoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24oY29tcG9uZW50LCBvcHRpb25zKSB7CgkJRHJhZ0xpc3RlbmVyLmNhbGwodGhpcywgb3B0aW9ucyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZyBsaXN0ZW5pbmcgc3RhcnRzIChidXQgYSByZWFsIGRyYWcgaGFzIG5vdCBuZWNlc3NhcmlseSBiZWdhbikuCgkvLyBldiBtaWdodCBiZSB1bmRlZmluZWQgaWYgZHJhZ2dpbmcgd2FzIHN0YXJ0ZWQgbWFudWFsbHkuCgloYW5kbGVJbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciBzdWJqZWN0RWwgPSB0aGlzLnN1YmplY3RFbDsKCQl2YXIgc3ViamVjdFJlY3Q7CgkJdmFyIG9yaWdQb2ludDsKCQl2YXIgcG9pbnQ7CgoJCXRoaXMuY29tcHV0ZUNvb3JkcygpOwoKCQlpZiAoZXYpIHsKCQkJb3JpZ1BvaW50ID0geyBsZWZ0OiBnZXRFdlgoZXYpLCB0b3A6IGdldEV2WShldikgfTsKCQkJcG9pbnQgPSBvcmlnUG9pbnQ7CgoJCQkvLyBjb25zdHJhaW4gdGhlIHBvaW50IHRvIGJvdW5kcyBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkCgkJCWlmIChzdWJqZWN0RWwpIHsKCQkJCXN1YmplY3RSZWN0ID0gZ2V0T3V0ZXJSZWN0KHN1YmplY3RFbCk7IC8vIHVzZWQgZm9yIGNlbnRlcmluZyBhcyB3ZWxsCgkJCQlwb2ludCA9IGNvbnN0cmFpblBvaW50KHBvaW50LCBzdWJqZWN0UmVjdCk7CgkJCX0KCgkJCXRoaXMub3JpZ0hpdCA9IHRoaXMucXVlcnlIaXQocG9pbnQubGVmdCwgcG9pbnQudG9wKTsKCgkJCS8vIHRyZWF0IHRoZSBjZW50ZXIgb2YgdGhlIHN1YmplY3QgYXMgdGhlIGNvbGxpc2lvbiBwb2ludD8KCQkJaWYgKHN1YmplY3RFbCAmJiB0aGlzLm9wdGlvbnMuc3ViamVjdENlbnRlcikgewoKCQkJCS8vIG9ubHkgY29uc2lkZXIgdGhlIGFyZWEgdGhlIHN1YmplY3Qgb3ZlcmxhcHMgdGhlIGhpdC4gYmVzdCBmb3IgbGFyZ2Ugc3ViamVjdHMuCgkJCQkvLyBUT0RPOiBza2lwIHRoaXMgaWYgaGl0IGRpZG4ndCBzdXBwbHkgbGVmdC9yaWdodC90b3AvYm90dG9tCgkJCQlpZiAodGhpcy5vcmlnSGl0KSB7CgkJCQkJc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyh0aGlzLm9yaWdIaXQsIHN1YmplY3RSZWN0KSB8fAoJCQkJCQlzdWJqZWN0UmVjdDsgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24KCQkJCX0KCgkJCQlwb2ludCA9IGdldFJlY3RDZW50ZXIoc3ViamVjdFJlY3QpOwoJCQl9CgoJCQl0aGlzLmNvb3JkQWRqdXN0ID0gZGlmZlBvaW50cyhwb2ludCwgb3JpZ1BvaW50KTsgLy8gcG9pbnQgLSBvcmlnUG9pbnQKCQl9CgkJZWxzZSB7CgkJCXRoaXMub3JpZ0hpdCA9IG51bGw7CgkJCXRoaXMuY29vcmRBZGp1c3QgPSBudWxsOwoJCX0KCgkJLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kLiBkbyBpdCBhZnRlciBvcmlnSGl0IGhhcyBiZWVuIGNvbXB1dGVkCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvblN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9LAoKCgkvLyBSZWNvbXB1dGVzIHRoZSBkcmFnLWNyaXRpY2FsIHBvc2l0aW9ucyBvZiBlbGVtZW50cwoJY29tcHV0ZUNvb3JkczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTsKCQl0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKTsgLy8gd2h5IGlzIHRoaXMgaGVyZT8/Pz8/PwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBkcmFnIGhhcyBzdGFydGVkCgloYW5kbGVEcmFnU3RhcnQ6IGZ1bmN0aW9uKGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCS8vIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHRoaXMub3JpZ0hpdCBpZiB0aGUgbWluLWRpc3RhbmNlIGlzIGxhcmdlCgkJaGl0ID0gdGhpcy5xdWVyeUhpdChnZXRFdlgoZXYpLCBnZXRFdlkoZXYpKTsKCgkJLy8gcmVwb3J0IHRoZSBpbml0aWFsIGhpdCB0aGUgbW91c2UgaXMgb3ZlcgoJCS8vIGVzcGVjaWFsbHkgaW1wb3J0YW50IGlmIG5vIG1pbi1kaXN0YW5jZSBhbmQgZHJhZyBzdGFydHMgaW1tZWRpYXRlbHkKCQlpZiAoaGl0KSB7CgkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIHRoZSBkcmFnIG1vdmVzCgloYW5kbGVEcmFnOiBmdW5jdGlvbihkeCwgZHksIGV2KSB7CgkJdmFyIGhpdDsKCgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQloaXQgPSB0aGlzLnF1ZXJ5SGl0KGdldEV2WChldiksIGdldEV2WShldikpOwoKCQlpZiAoIWlzSGl0c0VxdWFsKGhpdCwgdGhpcy5oaXQpKSB7IC8vIGEgZGlmZmVyZW50IGhpdCB0aGFuIGJlZm9yZT8KCQkJaWYgKHRoaXMuaGl0KSB7CgkJCQl0aGlzLmhhbmRsZUhpdE91dCgpOwoJCQl9CgkJCWlmIChoaXQpIHsKCQkJCXRoaXMuaGFuZGxlSGl0T3ZlcihoaXQpOwoJCQl9CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgaGFzIGJlZW4gc3RvcHBlZAoJaGFuZGxlRHJhZ0VuZDogZnVuY3Rpb24oKSB7CgkJdGhpcy5oYW5kbGVIaXREb25lKCk7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gYSB0aGUgbW91c2UgaGFzIGp1c3QgbW92ZWQgb3ZlciBhIG5ldyBoaXQKCWhhbmRsZUhpdE92ZXI6IGZ1bmN0aW9uKGhpdCkgewoJCXZhciBpc09yaWcgPSBpc0hpdHNFcXVhbChoaXQsIHRoaXMub3JpZ0hpdCk7CgoJCXRoaXMuaGl0ID0gaGl0OwoKCQl0aGlzLnRyaWdnZXIoJ2hpdE92ZXInLCB0aGlzLmhpdCwgaXNPcmlnLCB0aGlzLm9yaWdIaXQpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gdGhlIG1vdXNlIGhhcyBqdXN0IG1vdmVkIG91dCBvZiBhIGhpdAoJaGFuZGxlSGl0T3V0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5oaXQpIHsKCQkJdGhpcy50cmlnZ2VyKCdoaXRPdXQnLCB0aGlzLmhpdCk7CgkJCXRoaXMuaGFuZGxlSGl0RG9uZSgpOwoJCQl0aGlzLmhpdCA9IG51bGw7CgkJfQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGEgaGl0T3V0LiBBbHNvIGNhbGxlZCBiZWZvcmUgYSBkcmFnU3RvcAoJaGFuZGxlSGl0RG9uZTogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaGl0KSB7CgkJCXRoaXMudHJpZ2dlcignaGl0RG9uZScsIHRoaXMuaGl0KTsKCQl9Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gZW5kcywgd2hldGhlciB0aGVyZSB3YXMgYSByZWFsIGRyYWcgb3Igbm90CgloYW5kbGVJbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oKSB7CgkJRHJhZ0xpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCgkJdGhpcy5vcmlnSGl0ID0gbnVsbDsKCQl0aGlzLmhpdCA9IG51bGw7CgoJCXRoaXMuY29tcG9uZW50LnJlbGVhc2VIaXRzKCk7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBzY3JvbGxpbmcgaGFzIHN0b3BwZWQsIHdoZXRoZXIgdGhyb3VnaCBhdXRvIHNjcm9sbCwgb3IgdGhlIHVzZXIgc2Nyb2xsaW5nCgloYW5kbGVTY3JvbGxFbmQ6IGZ1bmN0aW9uKCkgewoJCURyYWdMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLmNvbXB1dGVDb29yZHMoKTsgLy8gaGl0cycgYWJzb2x1dGUgcG9zaXRpb25zIHdpbGwgYmUgaW4gbmV3IHBsYWNlcy4gcmVjb21wdXRlCgl9LAoKCgkvLyBHZXRzIHRoZSBoaXQgdW5kZXJuZWF0aCB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBtb3VzZSBldmVudAoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoKCQlpZiAodGhpcy5jb29yZEFkanVzdCkgewoJCQlsZWZ0ICs9IHRoaXMuY29vcmRBZGp1c3QubGVmdDsKCQkJdG9wICs9IHRoaXMuY29vcmRBZGp1c3QudG9wOwoJCX0KCgkJcmV0dXJuIHRoaXMuY29tcG9uZW50LnF1ZXJ5SGl0KGxlZnQsIHRvcCk7Cgl9Cgp9KTsKCgovLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaGl0cyBhcmUgaWRlbnRpY2FsbHkgZXF1YWwuIGBmYWxzZWAgb3RoZXJ3aXNlLiBNdXN0IGJlIGZyb20gdGhlIHNhbWUgY29tcG9uZW50LgovLyBUd28gbnVsbCB2YWx1ZXMgd2lsbCBiZSBjb25zaWRlcmVkIGVxdWFsLCBhcyB0d28gIm91dCBvZiB0aGUgY29tcG9uZW50IiBzdGF0ZXMgYXJlIHRoZSBzYW1lLgpmdW5jdGlvbiBpc0hpdHNFcXVhbChoaXQwLCBoaXQxKSB7CgoJaWYgKCFoaXQwICYmICFoaXQxKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJaWYgKGhpdDAgJiYgaGl0MSkgewoJCXJldHVybiBoaXQwLmNvbXBvbmVudCA9PT0gaGl0MS5jb21wb25lbnQgJiYKCQkJaXNIaXRQcm9wc1dpdGhpbihoaXQwLCBoaXQxKSAmJgoJCQlpc0hpdFByb3BzV2l0aGluKGhpdDEsIGhpdDApOyAvLyBlbnN1cmVzIGFsbCBwcm9wcyBhcmUgaWRlbnRpY2FsCgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiBzdWJIaXQncyBub24tc3RhbmRhcmQgcHJvcGVydGllcyBhcmUgd2l0aGluIHN1cGVySGl0CmZ1bmN0aW9uIGlzSGl0UHJvcHNXaXRoaW4oc3ViSGl0LCBzdXBlckhpdCkgewoJZm9yICh2YXIgcHJvcE5hbWUgaW4gc3ViSGl0KSB7CgkJaWYgKCEvXihjb21wb25lbnR8bGVmdHxyaWdodHx0b3B8Ym90dG9tKSQvLnRlc3QocHJvcE5hbWUpKSB7CgkJCWlmIChzdWJIaXRbcHJvcE5hbWVdICE9PSBzdXBlckhpdFtwcm9wTmFtZV0pIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCX0KCXJldHVybiB0cnVlOwp9Cgo7OwoKLyogQ3JlYXRlcyBhIGNsb25lIG9mIGFuIGVsZW1lbnQgYW5kIGxldHMgaXQgdHJhY2sgdGhlIG1vdXNlIGFzIGl0IG1vdmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIE1vdXNlRm9sbG93ZXIgPSBDbGFzcy5leHRlbmQoTGlzdGVuZXJNaXhpbiwgewoKCW9wdGlvbnM6IG51bGwsCgoJc291cmNlRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBjbG9uZWQgYW5kIG1hZGUgdG8gbG9vayBsaWtlIGl0IGlzIGRyYWdnaW5nCgllbDogbnVsbCwgLy8gdGhlIGNsb25lIG9mIGBzb3VyY2VFbGAgdGhhdCB3aWxsIHRyYWNrIHRoZSBtb3VzZQoJcGFyZW50RWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHRoYXQgYGVsYCAodGhlIGNsb25lKSB3aWxsIGJlIGF0dGFjaGVkIHRvCgoJLy8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgZWwsIHJlbGF0aXZlIHRvIHRoZSBvZmZzZXQgcGFyZW50LiBtYWRlIHRvIG1hdGNoIHRoZSBpbml0aWFsIG9mZnNldCBvZiBzb3VyY2VFbAoJdG9wMDogbnVsbCwKCWxlZnQwOiBudWxsLAoKCS8vIHRoZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBvZiB0aGUgaW5pdGlhdGluZyB0b3VjaC9tb3VzZSBhY3Rpb24KCXkwOiBudWxsLAoJeDA6IG51bGwsCgoJLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tIGl0cyBpbml0aWFsIHBvc2l0aW9uCgl0b3BEZWx0YTogbnVsbCwKCWxlZnREZWx0YTogbnVsbCwKCglpc0ZvbGxvd2luZzogZmFsc2UsCglpc0hpZGRlbjogZmFsc2UsCglpc0FuaW1hdGluZzogZmFsc2UsIC8vIGRvaW5nIHRoZSByZXZlcnQgYW5pbWF0aW9uPwoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihzb3VyY2VFbCwgb3B0aW9ucykgewoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCXRoaXMuc291cmNlRWwgPSBzb3VyY2VFbDsKCQl0aGlzLnBhcmVudEVsID0gb3B0aW9ucy5wYXJlbnRFbCA/ICQob3B0aW9ucy5wYXJlbnRFbCkgOiBzb3VyY2VFbC5wYXJlbnQoKTsgLy8gZGVmYXVsdCB0byBzb3VyY2VFbCdzIHBhcmVudAoJfSwKCgoJLy8gQ2F1c2VzIHRoZSBlbGVtZW50IHRvIHN0YXJ0IGZvbGxvd2luZyB0aGUgbW91c2UKCXN0YXJ0OiBmdW5jdGlvbihldikgewoJCWlmICghdGhpcy5pc0ZvbGxvd2luZykgewoJCQl0aGlzLmlzRm9sbG93aW5nID0gdHJ1ZTsKCgkJCXRoaXMueTAgPSBnZXRFdlkoZXYpOwoJCQl0aGlzLngwID0gZ2V0RXZYKGV2KTsKCQkJdGhpcy50b3BEZWx0YSA9IDA7CgkJCXRoaXMubGVmdERlbHRhID0gMDsKCgkJCWlmICghdGhpcy5pc0hpZGRlbikgewoJCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCQl9CgoJCQlpZiAoZ2V0RXZJc1RvdWNoKGV2KSkgewoJCQkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW92ZSk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0aGlzLmxpc3RlblRvKCQoZG9jdW1lbnQpLCAnbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3ZlKTsKCQkJfQoJCX0KCX0sCgoKCS8vIENhdXNlcyB0aGUgZWxlbWVudCB0byBzdG9wIGZvbGxvd2luZyB0aGUgbW91c2UuIElmIHNob3VsZFJldmVydCBpcyB0cnVlLCB3aWxsIGFuaW1hdGUgYmFjayB0byBvcmlnaW5hbCBwb3NpdGlvbi4KCS8vIGBjYWxsYmFja2AgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gSWYgbm8gYW5pbWF0aW9uLCBpdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5LgoJc3RvcDogZnVuY3Rpb24oc2hvdWxkUmV2ZXJ0LCBjYWxsYmFjaykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHJldmVydER1cmF0aW9uID0gdGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsgLy8gbWlnaHQgYmUgY2FsbGVkIGJ5IC5hbmltYXRlKCksIHdoaWNoIG1pZ2h0IGNoYW5nZSBgdGhpc2AgY29udGV4dAoJCQlfdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlOwoJCQlfdGhpcy5yZW1vdmVFbGVtZW50KCk7CgoJCQlfdGhpcy50b3AwID0gX3RoaXMubGVmdDAgPSBudWxsOyAvLyByZXNldCBzdGF0ZSBmb3IgZnV0dXJlIHVwZGF0ZVBvc2l0aW9uIGNhbGxzCgoJCQlpZiAoY2FsbGJhY2spIHsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9CgoJCWlmICh0aGlzLmlzRm9sbG93aW5nICYmICF0aGlzLmlzQW5pbWF0aW5nKSB7IC8vIGRpc2FsbG93IG1vcmUgdGhhbiBvbmUgc3RvcCBhbmltYXRpb24gYXQgYSB0aW1lCgkJCXRoaXMuaXNGb2xsb3dpbmcgPSBmYWxzZTsKCgkJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCgkJCWlmIChzaG91bGRSZXZlcnQgJiYgcmV2ZXJ0RHVyYXRpb24gJiYgIXRoaXMuaXNIaWRkZW4pIHsgLy8gZG8gYSByZXZlcnQgYW5pbWF0aW9uPwoJCQkJdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7CgkJCQl0aGlzLmVsLmFuaW1hdGUoewoJCQkJCXRvcDogdGhpcy50b3AwLAoJCQkJCWxlZnQ6IHRoaXMubGVmdDAKCQkJCX0sIHsKCQkJCQlkdXJhdGlvbjogcmV2ZXJ0RHVyYXRpb24sCgkJCQkJY29tcGxldGU6IGNvbXBsZXRlCgkJCQl9KTsKCQkJfQoJCQllbHNlIHsKCQkJCWNvbXBsZXRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZXRzIHRoZSB0cmFja2luZyBlbGVtZW50LiBDcmVhdGUgaXQgaWYgbmVjZXNzYXJ5CglnZXRFbDogZnVuY3Rpb24oKSB7CgkJdmFyIGVsID0gdGhpcy5lbDsKCgkJaWYgKCFlbCkgewoJCQllbCA9IHRoaXMuZWwgPSB0aGlzLnNvdXJjZUVsLmNsb25lKCkKCQkJCS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzIHx8ICcnKQoJCQkJLmNzcyh7CgkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsCgkJCQkJdmlzaWJpbGl0eTogJycsIC8vIGluIGNhc2Ugb3JpZ2luYWwgZWxlbWVudCB3YXMgaGlkZGVuIChjb21tb25seSB0aHJvdWdoIGhpZGVFdmVudHMoKSkKCQkJCQlkaXNwbGF5OiB0aGlzLmlzSGlkZGVuID8gJ25vbmUnIDogJycsIC8vIGZvciB3aGVuIGluaXRpYWxseSBoaWRkZW4KCQkJCQltYXJnaW46IDAsCgkJCQkJcmlnaHQ6ICdhdXRvJywgLy8gZXJhc2UgYW5kIHNldCB3aWR0aCBpbnN0ZWFkCgkJCQkJYm90dG9tOiAnYXV0bycsIC8vIGVyYXNlIGFuZCBzZXQgaGVpZ2h0IGluc3RlYWQKCQkJCQl3aWR0aDogdGhpcy5zb3VyY2VFbC53aWR0aCgpLCAvLyBleHBsaWNpdCBoZWlnaHQgaW4gY2FzZSB0aGVyZSB3YXMgYSAncmlnaHQnIHZhbHVlCgkJCQkJaGVpZ2h0OiB0aGlzLnNvdXJjZUVsLmhlaWdodCgpLCAvLyBleHBsaWNpdCB3aWR0aCBpbiBjYXNlIHRoZXJlIHdhcyBhICdib3R0b20nIHZhbHVlCgkJCQkJb3BhY2l0eTogdGhpcy5vcHRpb25zLm9wYWNpdHkgfHwgJycsCgkJCQkJekluZGV4OiB0aGlzLm9wdGlvbnMuekluZGV4CgkJCQl9KTsKCgkJCS8vIHdlIGRvbid0IHdhbnQgbG9uZyB0YXBzIG9yIGFueSBtb3VzZSBpbnRlcmFjdGlvbiBjYXVzaW5nIHNlbGVjdGlvbi9tZW51cy4KCQkJLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuCgkJCWVsLmFkZENsYXNzKCdmYy11bnNlbGVjdGFibGUnKTsKCgkJCWVsLmFwcGVuZFRvKHRoaXMucGFyZW50RWwpOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gUmVtb3ZlcyB0aGUgdHJhY2tpbmcgZWxlbWVudCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmVsKSB7CgkJCXRoaXMuZWwucmVtb3ZlKCk7CgkJCXRoaXMuZWwgPSBudWxsOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZSB0aGUgQ1NTIHBvc2l0aW9uIG9mIHRoZSB0cmFja2luZyBlbGVtZW50Cgl1cGRhdGVQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIHNvdXJjZU9mZnNldDsKCQl2YXIgb3JpZ2luOwoKCQl0aGlzLmdldEVsKCk7IC8vIGVuc3VyZSB0aGlzLmVsCgoJCS8vIG1ha2Ugc3VyZSBvcmlnaW4gaW5mbyB3YXMgY29tcHV0ZWQKCQlpZiAodGhpcy50b3AwID09PSBudWxsKSB7CgkJCXNvdXJjZU9mZnNldCA9IHRoaXMuc291cmNlRWwub2Zmc2V0KCk7CgkJCW9yaWdpbiA9IHRoaXMuZWwub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCk7CgkJCXRoaXMudG9wMCA9IHNvdXJjZU9mZnNldC50b3AgLSBvcmlnaW4udG9wOwoJCQl0aGlzLmxlZnQwID0gc291cmNlT2Zmc2V0LmxlZnQgLSBvcmlnaW4ubGVmdDsKCQl9CgoJCXRoaXMuZWwuY3NzKHsKCQkJdG9wOiB0aGlzLnRvcDAgKyB0aGlzLnRvcERlbHRhLAoJCQlsZWZ0OiB0aGlzLmxlZnQwICsgdGhpcy5sZWZ0RGVsdGEKCQl9KTsKCX0sCgoKCS8vIEdldHMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlCgloYW5kbGVNb3ZlOiBmdW5jdGlvbihldikgewoJCXRoaXMudG9wRGVsdGEgPSBnZXRFdlkoZXYpIC0gdGhpcy55MDsKCQl0aGlzLmxlZnREZWx0YSA9IGdldEV2WChldikgLSB0aGlzLngwOwoKCQlpZiAoIXRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy51cGRhdGVQb3NpdGlvbigpOwoJCX0KCX0sCgoKCS8vIFRlbXBvcmFyaWx5IG1ha2VzIHRoZSB0cmFja2luZyBlbGVtZW50IGludmlzaWJsZS4gQ2FuIGJlIGNhbGxlZCBiZWZvcmUgZm9sbG93aW5nIHN0YXJ0cwoJaGlkZTogZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLmlzSGlkZGVuKSB7CgkJCXRoaXMuaXNIaWRkZW4gPSB0cnVlOwoJCQlpZiAodGhpcy5lbCkgewoJCQkJdGhpcy5lbC5oaWRlKCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBTaG93IHRoZSB0cmFja2luZyBlbGVtZW50IGFmdGVyIGl0IGhhcyBiZWVuIHRlbXBvcmFyaWx5IGhpZGRlbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNIaWRkZW4pIHsKCQkJdGhpcy5pc0hpZGRlbiA9IGZhbHNlOwoJCQl0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CgkJCXRoaXMuZ2V0RWwoKS5zaG93KCk7CgkJfQoJfQoKfSk7Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgY29tcHJpc2VkIG9mIGEgImdyaWQiIG9mIGFyZWFzIHRoYXQgZWFjaCByZXByZXNlbnQgYSBzcGVjaWZpYyBkYXRldGltZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnZhciBHcmlkID0gRkMuR3JpZCA9IENsYXNzLmV4dGVuZChMaXN0ZW5lck1peGluLCBNb3VzZUlnbm9yZXJNaXhpbiwgewoKCS8vIHNlbGYtY29uZmlnLCBvdmVycmlkYWJsZSBieSBzdWJjbGFzc2VzCgloYXNEYXlJbnRlcmFjdGlvbnM6IHRydWUsIC8vIGNhbiB1c2VyIGNsaWNrL3NlbGVjdCByYW5nZXMgb2YgdGltZT8KCgl2aWV3OiBudWxsLCAvLyBhIFZpZXcgb2JqZWN0Cglpc1JUTDogbnVsbCwgLy8gc2hvcnRjdXQgdG8gdGhlIHZpZXcncyBpc1JUTCBvcHRpb24KCglzdGFydDogbnVsbCwKCWVuZDogbnVsbCwKCgllbDogbnVsbCwgLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudAoJZWxzQnlGaWxsOiBudWxsLCAvLyBhIGhhc2ggb2YgalF1ZXJ5IGVsZW1lbnQgc2V0cyB1c2VkIGZvciByZW5kZXJpbmcgZWFjaCBmaWxsLiBLZXllZCBieSBmaWxsIG5hbWUuCgoJLy8gZGVyaXZlZCBmcm9tIG9wdGlvbnMKCWV2ZW50VGltZUZvcm1hdDogbnVsbCwKCWRpc3BsYXlFdmVudFRpbWU6IG51bGwsCglkaXNwbGF5RXZlbnRFbmQ6IG51bGwsCgoJbWluUmVzaXplRHVyYXRpb246IG51bGwsIC8vIFRPRE86IGhhY2suIHNldCBieSBzdWJjbGFzc2VzLiBtaW51bXVtIGV2ZW50IHJlc2l6ZSBkdXJhdGlvbgoKCS8vIGlmIGRlZmluZWQsIGhvbGRzIHRoZSB1bml0IGlkZW50aWZpZWQgKGV4OiAieWVhciIgb3IgIm1vbnRoIikgdGhhdCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiBncmFudWxhcml0eQoJLy8gb2YgdGhlIGRhdGUgYXJlYXMuIGlmIG5vdCBkZWZpbmVkLCBhc3N1bWVzIHRvIGJlIGRheSBhbmQgdGltZSBncmFudWxhcml0eS4KCS8vIFRPRE86IHBvcnQgaXNUaW1lU2NhbGUgaW50byBzYW1lIHN5c3RlbT8KCWxhcmdlVW5pdDogbnVsbCwKCglkYXlEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdEcmFnTGlzdGVuZXI6IG51bGwsCglzZWdSZXNpemVMaXN0ZW5lcjogbnVsbCwKCWV4dGVybmFsRHJhZ0xpc3RlbmVyOiBudWxsLAoKCgljb25zdHJ1Y3RvcjogZnVuY3Rpb24odmlldykgewoJCXRoaXMudmlldyA9IHZpZXc7CgkJdGhpcy5pc1JUTCA9IHZpZXcub3B0KCdpc1JUTCcpOwoJCXRoaXMuZWxzQnlGaWxsID0ge307CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyID0gdGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpOwoJCXRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKTsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZm9ybWF0IHN0cmluZyB1c2VkIGZvciBldmVudCB0aW1lIHRleHQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ3RpbWVGb3JtYXQnCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZXZlbnRzIHNob3VsZCBoYXZlIHRoZWlyIGVuZCB0aW1lcyBkaXNwbGF5ZWQsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgJ2Rpc3BsYXlFdmVudFRpbWUnLgoJLy8gT25seSBhcHBsaWVzIHRvIG5vbi1hbGwtZGF5IGV2ZW50cy4KCWNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoKCS8vIERldGVybWluZXMgd2hldGhlciBldmVudHMgc2hvdWxkIGhhdmUgdGhlaXIgZW5kIHRpbWVzIGRpc3BsYXllZCwgaWYgbm90IGV4cGxpY2l0bHkgZGVmaW5lZCBieSAnZGlzcGxheUV2ZW50RW5kJwoJY29tcHV0ZURpc3BsYXlFdmVudEVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVGVsbHMgdGhlIGdyaWQgYWJvdXQgd2hhdCBwZXJpb2Qgb2YgdGltZSB0byBkaXNwbGF5LgoJLy8gQW55IGRhdGUtcmVsYXRlZCBpbnRlcm5hbCBkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQuCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl0aGlzLnN0YXJ0ID0gcmFuZ2Uuc3RhcnQuY2xvbmUoKTsKCQl0aGlzLmVuZCA9IHJhbmdlLmVuZC5jbG9uZSgpOwoKCQl0aGlzLnJhbmdlVXBkYXRlZCgpOwoJCXRoaXMucHJvY2Vzc1JhbmdlT3B0aW9ucygpOwoJfSwKCgoJLy8gQ2FsbGVkIHdoZW4gaW50ZXJuYWwgdmFyaWFibGVzIHRoYXQgcmVseSBvbiB0aGUgcmFuZ2Ugc2hvdWxkIGJlIHVwZGF0ZWQKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBVcGRhdGVzIHZhbHVlcyB0aGF0IHJlbHkgb24gb3B0aW9ucyBhbmQgYWxzbyByZWxhdGUgdG8gcmFuZ2UKCXByb2Nlc3NSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBkaXNwbGF5RXZlbnRUaW1lOwoJCXZhciBkaXNwbGF5RXZlbnRFbmQ7CgoJCXRoaXMuZXZlbnRUaW1lRm9ybWF0ID0KCQkJdmlldy5vcHQoJ2V2ZW50VGltZUZvcm1hdCcpIHx8CgkJCXZpZXcub3B0KCd0aW1lRm9ybWF0JykgfHwgLy8gZGVwcmVjYXRlZAoJCQl0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKTsKCgkJZGlzcGxheUV2ZW50VGltZSA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRUaW1lJyk7CgkJaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkgewoJCQlkaXNwbGF5RXZlbnRUaW1lID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpOyAvLyBtaWdodCBiZSBiYXNlZCBvZmYgb2YgcmFuZ2UKCQl9CgoJCWRpc3BsYXlFdmVudEVuZCA9IHZpZXcub3B0KCdkaXNwbGF5RXZlbnRFbmQnKTsKCQlpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHsKCQkJZGlzcGxheUV2ZW50RW5kID0gdGhpcy5jb21wdXRlRGlzcGxheUV2ZW50RW5kKCk7IC8vIG1pZ2h0IGJlIGJhc2VkIG9mZiBvZiByYW5nZQoJCX0KCgkJdGhpcy5kaXNwbGF5RXZlbnRUaW1lID0gZGlzcGxheUV2ZW50VGltZTsKCQl0aGlzLmRpc3BsYXlFdmVudEVuZCA9IGRpc3BsYXlFdmVudEVuZDsKCX0sCgoKCS8vIENvbnZlcnRzIGEgc3BhbiAoaGFzIHVuem9uZWQgc3RhcnQvZW5kIGFuZCBhbnkgb3RoZXIgZ3JpZC1zcGVjaWZpYyBsb2NhdGlvbiBpbmZvcm1hdGlvbikKCS8vIGludG8gYW4gYXJyYXkgb2Ygc2VnbWVudHMgKHBpZWNlcyBvZiBldmVudHMgd2hvc2UgZm9ybWF0IGlzIGRlY2lkZWQgYnkgdGhlIGdyaWQpLgoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIERpZmZzIHRoZSB0d28gZGF0ZXMsIHJldHVybmluZyBhIGR1cmF0aW9uLCBiYXNlZCBvbiBncmFudWxhcml0eSBvZiB0aGUgZ3JpZAoJLy8gVE9ETzogcG9ydCBpc1RpbWVTY2FsZSBpbnRvIHRoaXMgc3lzdGVtPwoJZGlmZkRhdGVzOiBmdW5jdGlvbihhLCBiKSB7CgkJaWYgKHRoaXMubGFyZ2VVbml0KSB7CgkJCXJldHVybiBkaWZmQnlVbml0KGEsIGIsIHRoaXMubGFyZ2VVbml0KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBkaWZmRGF5VGltZShhLCBiKTsKCQl9Cgl9LAoKCgkvKiBIaXQgQXJlYQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ2FsbGVkIGJlZm9yZSBvbmUgb3IgbW9yZSBxdWVyeUhpdCBjYWxscyBtaWdodCBoYXBwZW4uIFNob3VsZCBwcmVwYXJlIGFueSBjYWNoZWQgY29vcmRpbmF0ZXMgZm9yIHF1ZXJ5SGl0CglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7Cgl9LAoKCgkvLyBDYWxsZWQgd2hlbiBxdWVyeUhpdCBjYWxscyBoYXZlIHN1YnNpZGVkLiBHb29kIHBsYWNlIHRvIGNsZWFyIGFueSBjb29yZGluYXRlIGNhY2hlcy4KCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8vIEdpdmVuIGNvb3JkaW5hdGVzIGZyb20gdGhlIHRvcGxlZnQgb2YgdGhlIGRvY3VtZW50LCByZXR1cm4gZGF0YSBhYm91dCB0aGUgZGF0ZS1yZWxhdGVkIGFyZWEgdW5kZXJuZWF0aC4KCS8vIENhbiByZXR1cm4gYW4gb2JqZWN0IHdpdGggYXJiaXRyYXJ5IHByb3BlcnRpZXMgKGFsdGhvdWdoIHRvcC9yaWdodC9sZWZ0L2JvdHRvbSBhcmUgZW5jb3VyYWdlZCkuCgkvLyBNdXN0IGhhdmUgYSBgZ3JpZGAgcHJvcGVydHksIGEgcmVmZXJlbmNlIHRvIHRoaXMgY3VycmVudCBncmlkLiBUT0RPOiBhdm9pZCB0aGlzCgkvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IGdldEhpdFNwYW4gYW5kIGdldEhpdEVsLgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJfSwKCgoJLy8gR2l2ZW4gcG9zaXRpb24tbGV2ZWwgaW5mb3JtYXRpb24gYWJvdXQgYSBkYXRlLXJlbGF0ZWQgYXJlYSB3aXRoaW4gdGhlIGdyaWQsCgkvLyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IGEgc3RhcnQvZW5kIGRhdGUuIENhbiBwcm92aWRlIG90aGVyIGluZm9ybWF0aW9uIGFzIHdlbGwuCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCX0sCgoKCS8vIEdpdmVuIHBvc2l0aW9uLWxldmVsIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0ZS1yZWxhdGVkIGFyZWEgd2l0aGluIHRoZSBncmlkLAoJLy8gc2hvdWxkIHJldHVybiBhIGpRdWVyeSBlbGVtZW50IHRoYXQgYmVzdCByZXByZXNlbnRzIGl0LiBwYXNzZWQgdG8gZGF5Q2xpY2sgY2FsbGJhY2suCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIGdyaWQgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoKCQlpZiAodGhpcy5oYXNEYXlJbnRlcmFjdGlvbnMpIHsKCQkJcHJldmVudFNlbGVjdGlvbihlbCk7CgoJCQl0aGlzLmJpbmREYXlIYW5kbGVyKCd0b3VjaHN0YXJ0JywgdGhpcy5kYXlUb3VjaFN0YXJ0KTsKCQkJdGhpcy5iaW5kRGF5SGFuZGxlcignbW91c2Vkb3duJywgdGhpcy5kYXlNb3VzZWRvd24pOwoJCX0KCgkJLy8gYXR0YWNoIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycy4gaW4gR3JpZC5ldmVudHMKCQkvLyBzYW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBub3RlIGFzIGFib3ZlLgoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzKCk7CgoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgliaW5kRGF5SGFuZGxlcjogZnVuY3Rpb24obmFtZSwgaGFuZGxlcikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgoJCS8vIGF0dGFjaCBhIGhhbmRsZXIgdG8gdGhlIGdyaWQncyByb290IGVsZW1lbnQuCgkJLy8galF1ZXJ5IHdpbGwgdGFrZSBjYXJlIG9mIHVucmVnaXN0ZXJpbmcgdGhlbSB3aGVuIHJlbW92ZUVsZW1lbnQgZ2V0cyBjYWxsZWQuCgkJdGhpcy5lbC5vbihuYW1lLCBmdW5jdGlvbihldikgewoJCQlpZiAoCgkJCQkhJChldi50YXJnZXQpLmlzKAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJywnICsgLy8gZGlyZWN0bHkgb24gYW4gZXZlbnQgZWxlbWVudAoJCQkJCV90aGlzLnNlZ1NlbGVjdG9yICsgJyAqLCcgKyAvLyB3aXRoaW4gYW4gZXZlbnQgZWxlbWVudAoJCQkJCScuZmMtbW9yZSwnICsgLy8gYSAibW9yZS4uIiBsaW5rCgkJCQkJJ2FbZGF0YS1nb3RvXScgLy8gYSBjbGlja2FibGUgbmF2IGxpbmsKCQkJCSkKCQkJKSB7CgkJCQlyZXR1cm4gaGFuZGxlci5jYWxsKF90aGlzLCBldik7CgkJCX0KCQl9KTsKCX0sCgoKCS8vIFJlbW92ZXMgdGhlIGdyaWQncyBjb250YWluZXIgZWxlbWVudCBmcm9tIHRoZSBET00uIFVuZG9lcyBhbnkgb3RoZXIgRE9NLXJlbGF0ZWQgYXR0YWNobWVudHMuCgkvLyBET0VTIE5PVCByZW1vdmUgYW55IGNvbnRlbnQgYmVmb3JlaGFuZCAoZG9lc24ndCBjbGVhciBldmVudHMgb3IgY2FsbCB1bnJlbmRlckRhdGVzKSwgdW5saWtlIFZpZXcKCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCQl0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpOwoKCQl0aGlzLmVsLnJlbW92ZSgpOwoKCQkvLyBOT1RFOiB3ZSBkb24ndCBudWxsLW91dCB0aGlzLmVsIGZvciB0aGUgc2FtZSByZWFzb25zIHdlIGRvbid0IGRvIGl0IHdpdGhpbiBWaWV3OjpyZW1vdmVFbGVtZW50Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgZ3JpZCB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgZ3JpZCdzIGRhdGUtcmVsYXRlZCBjb250ZW50IChsaWtlIGFyZWFzIHRoYXQgcmVwcmVzZW50IGRheXMvdGltZXMpLgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGdyaWQncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBIYW5kbGVycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQmluZHMgRE9NIGhhbmRsZXJzIHRvIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQsIHN1Y2ggYXMgdGhlIGRvY3VtZW50CgliaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksIHsKCQkJZHJhZ3N0YXJ0OiB0aGlzLmV4dGVybmFsRHJhZ1N0YXJ0LCAvLyBqcXVpCgkJCXNvcnRzdGFydDogdGhpcy5leHRlcm5hbERyYWdTdGFydCAvLyBqcXVpCgkJfSk7Cgl9LAoKCgkvLyBVbmJpbmRzIERPTSBoYW5kbGVycyBmcm9tIGVsZW1lbnRzIHRoYXQgcmVzaWRlIG91dHNpZGUgdGhlIGdyaWQKCXVuYmluZEdsb2JhbEhhbmRsZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnN0b3BMaXN0ZW5pbmdUbygkKGRvY3VtZW50KSk7Cgl9LAoKCgkvLyBQcm9jZXNzIGEgbW91c2Vkb3duIG9uIGFuIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgZGF5LiBGb3IgZGF5IGNsaWNraW5nIGFuZCBzZWxlY3RpbmcuCglkYXlNb3VzZWRvd246IGZ1bmN0aW9uKGV2KSB7CgkJaWYgKCF0aGlzLmlzSWdub3JpbmdNb3VzZSkgewoJCQl0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkvL2Rpc3RhbmNlOiA1LCAvLyBuZWVkcyBtb3JlIHdvcmsgaWYgd2Ugd2FudCBkYXlDbGljayB0byBmaXJlIGNvcnJlY3RseQoJCQl9KTsKCQl9Cgl9LAoKCglkYXlUb3VjaFN0YXJ0OiBmdW5jdGlvbihldikgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQkvLyBIQUNLIHRvIHByZXZlbnQgYSB1c2VyJ3MgY2xpY2thd2F5IGZvciB1bnNlbGVjdGluZyBhIHJhbmdlIG9yIGFuIGV2ZW50CgkJLy8gZnJvbSBjYXVzaW5nIGEgZGF5Q2xpY2suCgkJaWYgKHZpZXcuaXNTZWxlY3RlZCB8fCB2aWV3LnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCQl9CgoJCXRoaXMuZGF5RHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIHsKCQkJZGVsYXk6IHRoaXMudmlldy5vcHQoJ2xvbmdQcmVzc0RlbGF5JykKCQl9KTsKCX0sCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlcidzIGRyYWcgYWNyb3NzIGRheSBlbGVtZW50cy4KCS8vIEZvciBkYXkgY2xpY2tpbmcgYW5kIHNlbGVjdGluZy4KCWJ1aWxkRGF5RHJhZ0xpc3RlbmVyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1NlbGVjdGFibGUgPSB2aWV3Lm9wdCgnc2VsZWN0YWJsZScpOwoJCXZhciBkYXlDbGlja0hpdDsgLy8gbnVsbCBpZiBpbnZhbGlkIGRheUNsaWNrCgkJdmFyIHNlbGVjdGlvblNwYW47IC8vIG51bGwgaWYgaW52YWxpZCBzZWxlY3Rpb24KCgkJLy8gdGhpcyBsaXN0ZW5lciB0cmFja3MgYSBtb3VzZWRvd24gb24gYSBkYXkgZWxlbWVudCwgYW5kIGEgc3Vic2VxdWVudCBkcmFnLgoJCS8vIGlmIHRoZSBkcmFnIGVuZHMgb24gdGhlIHNhbWUgZGF5LCBpdCBpcyBhICdkYXlDbGljaycuCgkJLy8gaWYgJ3NlbGVjdGFibGUnIGlzIGVuYWJsZWQsIHRoaXMgbGlzdGVuZXIgYWxzbyBkZXRlY3RzIHNlbGVjdGlvbnMuCgkJdmFyIGRyYWdMaXN0ZW5lciA9IG5ldyBIaXREcmFnTGlzdGVuZXIodGhpcywgewoJCQlzY3JvbGw6IHZpZXcub3B0KCdkcmFnU2Nyb2xsJyksCgkJCWludGVyYWN0aW9uU3RhcnQ6IGZ1bmN0aW9uKCkgewoJCQkJZGF5Q2xpY2tIaXQgPSBkcmFnTGlzdGVuZXIub3JpZ0hpdDsgLy8gZm9yIGRheUNsaWNrLCB3aGVyZSBubyBkcmFnZ2luZyBoYXBwZW5zCgkJCQlzZWxlY3Rpb25TcGFuID0gbnVsbDsKCQkJfSwKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbigpIHsKCQkJCXZpZXcudW5zZWxlY3QoKTsgLy8gc2luY2Ugd2UgY291bGQgYmUgcmVuZGVyaW5nIGEgbmV3IHNlbGVjdGlvbiwgd2Ugd2FudCB0byBjbGVhciBhbnkgb2xkIG9uZQoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQsIGlzT3JpZywgb3JpZ0hpdCkgewoJCQkJaWYgKG9yaWdIaXQpIHsgLy8gY2xpY2sgbmVlZHMgdG8gaGF2ZSBzdGFydGVkIG9uIGEgaGl0CgoJCQkJCS8vIGlmIHVzZXIgZHJhZ2dlZCB0byBhbm90aGVyIGNlbGwgYXQgYW55IHBvaW50LCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGEgZGF5Q2xpY2sKCQkJCQlpZiAoIWlzT3JpZykgewoJCQkJCQlkYXlDbGlja0hpdCA9IG51bGw7CgkJCQkJfQoKCQkJCQlpZiAoaXNTZWxlY3RhYmxlKSB7CgkJCQkJCXNlbGVjdGlvblNwYW4gPSBfdGhpcy5jb21wdXRlU2VsZWN0aW9uKAoJCQkJCQkJX3RoaXMuZ2V0SGl0U3BhbihvcmlnSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdFNwYW4oaGl0KQoJCQkJCQkpOwoJCQkJCQlpZiAoc2VsZWN0aW9uU3BhbikgewoJCQkJCQkJX3RoaXMucmVuZGVyU2VsZWN0aW9uKHNlbGVjdGlvblNwYW4pOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKHNlbGVjdGlvblNwYW4gPT09IGZhbHNlKSB7CgkJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWhpdE91dDogZnVuY3Rpb24oKSB7IC8vIGNhbGxlZCBiZWZvcmUgbW91c2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgaGl0IE9SIG1vdmVkIG91dCBvZiBhbGwgaGl0cwoJCQkJZGF5Q2xpY2tIaXQgPSBudWxsOwoJCQkJc2VsZWN0aW9uU3BhbiA9IG51bGw7CgkJCQlfdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl9LAoJCQloaXREb25lOiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGFmdGVyIGEgaGl0T3V0IE9SIGJlZm9yZSBhIGRyYWdFbmQKCQkJCWVuYWJsZUN1cnNvcigpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYsIGlzQ2FuY2VsbGVkKSB7CgkJCQlpZiAoIWlzQ2FuY2VsbGVkKSB7CgkJCQkJaWYgKAoJCQkJCQlkYXlDbGlja0hpdCAmJgoJCQkJCQkhX3RoaXMuaXNJZ25vcmluZ01vdXNlIC8vIHNlZSBoYWNrIGluIGRheVRvdWNoU3RhcnQKCQkJCQkpIHsKCQkJCQkJdmlldy50cmlnZ2VyRGF5Q2xpY2soCgkJCQkJCQlfdGhpcy5nZXRIaXRTcGFuKGRheUNsaWNrSGl0KSwKCQkJCQkJCV90aGlzLmdldEhpdEVsKGRheUNsaWNrSGl0KSwKCQkJCQkJCWV2CgkJCQkJCSk7CgkJCQkJfQoJCQkJCWlmIChzZWxlY3Rpb25TcGFuKSB7CgkJCQkJCS8vIHRoZSBzZWxlY3Rpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiByZW5kZXJlZC4ganVzdCByZXBvcnQgaXQKCQkJCQkJdmlldy5yZXBvcnRTZWxlY3Rpb24oc2VsZWN0aW9uU3BhbiwgZXYpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gS2lsbHMgYWxsIGluLXByb2dyZXNzIGRyYWdnaW5nLgoJLy8gVXNlZnVsIGZvciB3aGVuIHB1YmxpYyBBUEkgbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiByZS1yZW5kZXJpbmcgYXJlIGludm9rZWQgZHVyaW5nIGEgZHJhZy4KCS8vIEFsc28gdXNlZnVsIGZvciB3aGVuIHRvdWNoIGRldmljZXMgbWlzYmVoYXZlIGFuZCBkb24ndCBmaXJlIHRoZWlyIHRvdWNoZW5kLgoJY2xlYXJEcmFnTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheURyYWdMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpOwoKCQlpZiAodGhpcy5zZWdEcmFnTGlzdGVuZXIpIHsKCQkJdGhpcy5zZWdEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKTsgLy8gd2lsbCBjbGVhciB0aGlzLnNlZ0RyYWdMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5zZWdSZXNpemVMaXN0ZW5lcikgewoJCQl0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5zZWdSZXNpemVMaXN0ZW5lcgoJCX0KCQlpZiAodGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcikgewoJCQl0aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCk7IC8vIHdpbGwgY2xlYXIgdGhpcy5leHRlcm5hbERyYWdMaXN0ZW5lcgoJCX0KCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IHNob3VsZCBwcm9iYWJseSBtb3ZlIHRoaXMgdG8gR3JpZC5ldmVudHMsIGxpa2Ugd2UgZGlkIGV2ZW50IGRyYWdnaW5nIC8gcmVzaXppbmcKCgoJLy8gUmVuZGVycyBhIG1vY2sgZXZlbnQgYXQgdGhlIGdpdmVuIGV2ZW50IGxvY2F0aW9uLCB3aGljaCBjb250YWlucyB6b25lZCBzdGFydC9lbmQgcHJvcGVydGllcy4KCS8vIFJldHVybnMgYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJFdmVudExvY2F0aW9uSGVscGVyOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gdGhpcy5mYWJyaWNhdGVIZWxwZXJFdmVudChldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpOwoKCQlyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIoZmFrZUV2ZW50LCBzb3VyY2VTZWcpOyAvLyBkbyB0aGUgYWN0dWFsIHJlbmRlcmluZwoJfSwKCgoJLy8gQnVpbGRzIGEgZmFrZSBldmVudCBnaXZlbiB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMgYW5kIGEgc2VnbWVudCBpcyBzaG91bGQgYmUgaW5zcGlyZWQgZnJvbS4KCS8vIFRoZSByYW5nZSdzIGVuZCBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgbW9jayBldmVudCB0aGF0IGlzIHJlbmRlcmVkIHdpbGwgaGF2ZSBhIG51bGwgZW5kIHRpbWUuCgkvLyBgc291cmNlU2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgaW52b2x2ZWQgaW4gdGhlIGRyYWcuIElmIG51bGwsIHNvbWV0aGluZyBleHRlcm5hbCBpcyBkcmFnZ2luZy4KCWZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzb3VyY2VTZWcpIHsKCQl2YXIgZmFrZUV2ZW50ID0gc291cmNlU2VnID8gY3JlYXRlT2JqZWN0KHNvdXJjZVNlZy5ldmVudCkgOiB7fTsgLy8gbWFzayB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0IGlmIHBvc3NpYmxlCgoJCWZha2VFdmVudC5zdGFydCA9IGV2ZW50TG9jYXRpb24uc3RhcnQuY2xvbmUoKTsKCQlmYWtlRXZlbnQuZW5kID0gZXZlbnRMb2NhdGlvbi5lbmQgPyBldmVudExvY2F0aW9uLmVuZC5jbG9uZSgpIDogbnVsbDsKCQlmYWtlRXZlbnQuYWxsRGF5ID0gbnVsbDsgLy8gZm9yY2UgaXQgdG8gYmUgZnJlc2hseSBjb21wdXRlZCBieSBub3JtYWxpemVFdmVudERhdGVzCgkJdGhpcy52aWV3LmNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50RGF0ZXMoZmFrZUV2ZW50KTsKCgkJLy8gdGhpcyBleHRyYSBjbGFzc05hbWUgd2lsbCBiZSB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyByZWFsIGV2ZW50cyBmcm9tIG1vY2sgZXZlbnRzIGluIENTUwoJCWZha2VFdmVudC5jbGFzc05hbWUgPSAoZmFrZUV2ZW50LmNsYXNzTmFtZSB8fCBbXSkuY29uY2F0KCdmYy1oZWxwZXInKTsKCgkJLy8gaWYgc29tZXRoaW5nIGV4dGVybmFsIGlzIGJlaW5nIGRyYWdnZWQgaW4sIGRvbid0IHJlbmRlciBhIHJlc2l6ZXIKCQlpZiAoIXNvdXJjZVNlZykgewoJCQlmYWtlRXZlbnQuZWRpdGFibGUgPSBmYWxzZTsKCQl9CgoJCXJldHVybiBmYWtlRXZlbnQ7Cgl9LAoKCgkvLyBSZW5kZXJzIGEgbW9jayBldmVudC4gR2l2ZW4gem9uZWQgZXZlbnQgZGF0ZSBwcm9wZXJ0aWVzLgoJLy8gTXVzdCByZXR1cm4gYWxsIG1vY2sgZXZlbnQgZWxlbWVudHMuCglyZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNvdXJjZVNlZykgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFVucmVuZGVycyBhIG1vY2sgZXZlbnQKCXVucmVuZGVySGVscGVyOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBTZWxlY3Rpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbi4gV2lsbCBoaWdobGlnaHQgYnkgZGVmYXVsdCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KCS8vIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbnMgb2YgYSBzZWxlY3Rpb24uIFdpbGwgdW5yZW5kZXIgYSBoaWdobGlnaHQgYnkgZGVmYXVsdC4KCXVucmVuZGVyU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCk7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZmlyc3QgYW5kIGxhc3QgZGF0ZS1zcGFucyBvZiBhIHNlbGVjdGlvbiwgcmV0dXJucyBhbm90aGVyIGRhdGUtc3BhbiBvYmplY3QuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgaW4gdGhlIHNwYW4gb2JqZWN0LiBXaWxsIGJlIHBhc3NlZCB0byByZW5kZXJTZWxlY3Rpb24oKS4KCS8vIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCBhbmQgdGhpcyBzaG91bGQgYmUgaW5kaWNhdGVkIHRvIHRoZSB1c2VyLgoJLy8gV2lsbCByZXR1cm4gbnVsbC91bmRlZmluZWQgaWYgYSBzZWxlY3Rpb24gaW52YWxpZCBidXQgbm8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkLgoJY29tcHV0ZVNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIHNwYW4gPSB0aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHNwYW4wLCBzcGFuMSk7CgoJCWlmIChzcGFuICYmICF0aGlzLnZpZXcuY2FsZW5kYXIuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChzcGFuKSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gc3BhbjsKCX0sCgoKCS8vIEdpdmVuIHR3byBzcGFucywgbXVzdCByZXR1cm4gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28uCgkvLyBUT0RPOiBkbyB0aGlzIHNlcGFyYXRpb24gb2YgY29uY2VybnMgKGNvbWJpbmluZyBWUyB2YWxpZGF0aW9uKSBmb3IgZXZlbnQgZG5kL3Jlc2l6ZSB0b28uCgljb21wdXRlU2VsZWN0aW9uU3BhbjogZnVuY3Rpb24oc3BhbjAsIHNwYW4xKSB7CgkJdmFyIGRhdGVzID0gWyBzcGFuMC5zdGFydCwgc3BhbjAuZW5kLCBzcGFuMS5zdGFydCwgc3BhbjEuZW5kIF07CgoJCWRhdGVzLnNvcnQoY29tcGFyZU51bWJlcnMpOyAvLyBzb3J0cyBjaHJvbm9sb2dpY2FsbHkuIHdvcmtzIHdpdGggTW9tZW50cwoKCQlyZXR1cm4geyBzdGFydDogZGF0ZXNbMF0uY2xvbmUoKSwgZW5kOiBkYXRlc1szXS5jbG9uZSgpIH07Cgl9LAoKCgkvKiBIaWdobGlnaHQKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYW4gZW1waGFzaXMgb24gdGhlIGdpdmVuIGRhdGUgcmFuZ2UuIEdpdmVuIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIG1pc2MgZGF0YSkKCXJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oc3BhbikgewoJCXRoaXMucmVuZGVyRmlsbCgnaGlnaGxpZ2h0JywgdGhpcy5zcGFuVG9TZWdzKHNwYW4pKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgZW1waGFzaXMgb24gYSBkYXRlIHJhbmdlCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2hpZ2hsaWdodCcpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgZm9yIHJlbmRlcmluZyB0aGUgaGlnaGxpZ2h0LiBVc2VkIGJ5IHRoZSBmaWxsIHN5c3RlbS4KCWhpZ2hsaWdodFNlZ0NsYXNzZXM6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBbICdmYy1oaWdobGlnaHQnIF07Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzSG91cnM6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7Cgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCX0sCgoKCXVucmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbigpIHsKCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglUT0RPOiByZW1vdmUgdGhpcyBzeXN0ZW0uIGxpa2Ugd2UgZGlkIGluIFRpbWVHcmlkCgkqLwoKCgkvLyBSZW5kZXJzIGEgc2V0IG9mIHJlY3RhbmdsZXMgb3ZlciB0aGUgZ2l2ZW4gc2VnbWVudHMgb2YgdGltZS4KCS8vIE1VU1QgUkVUVVJOIGEgc3Vic2V0IG9mIHNlZ3MsIHRoZSBzZWdzIHRoYXQgd2VyZSBhY3R1YWxseSByZW5kZXJlZC4KCS8vIFJlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoaXMuZWxzQnlGaWxsLiBUT0RPOiBiZXR0ZXIgQVBJIGZvciBleHByZXNzaW5nIHRoaXMgcmVxdWlyZW1lbnQKCXJlbmRlckZpbGw6IGZ1bmN0aW9uKHR5cGUsIHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSBzcGVjaWZpYyB0eXBlIG9mIGZpbGwgdGhhdCBpcyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSkgewoJCXZhciBlbCA9IHRoaXMuZWxzQnlGaWxsW3R5cGVdOwoKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWRlbGV0ZSB0aGlzLmVsc0J5RmlsbFt0eXBlXTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIGFuZCBhc3NpZ25zIGFuIGBlbGAgcHJvcGVydHkgZm9yIGVhY2ggZmlsbCBzZWdtZW50LiBHZW5lcmljIGVub3VnaCB0byB3b3JrIHdpdGggZGlmZmVyZW50IHR5cGVzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJLy8gVG8gYmUgaGFybmVzc2VkIGJ5IHJlbmRlckZpbGwgKGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpLgoJLy8gQW5hbGFnb3VzIHRvIHJlbmRlckZnU2VnRWxzLgoJcmVuZGVyRmlsbFNlZ0VsczogZnVuY3Rpb24odHlwZSwgc2VncykgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIHNlZ0VsTWV0aG9kID0gdGhpc1t0eXBlICsgJ1NlZ0VsJ107CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgcmVuZGVyZWRTZWdzID0gW107CgkJdmFyIGk7CgoJCWlmIChzZWdzLmxlbmd0aCkgewoKCQkJLy8gYnVpbGQgYSBsYXJnZSBjb25jYXRlbmF0aW9uIG9mIHNlZ21lbnQgSFRNTAoJCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQkJaHRtbCArPSB0aGlzLmZpbGxTZWdIdG1sKHR5cGUsIHNlZ3NbaV0pOwoJCQl9CgoJCQkvLyBHcmFiIGluZGl2aWR1YWwgZWxlbWVudHMgZnJvbSB0aGUgY29tYmluZWQgSFRNTCBzdHJpbmcuIFVzZSBlYWNoIGFzIHRoZSBkZWZhdWx0IHJlbmRlcmluZy4KCQkJLy8gVGhlbiwgY29tcHV0ZSB0aGUgJ2VsJyBmb3IgZWFjaCBzZWdtZW50LgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSAkKG5vZGUpOwoKCQkJCS8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgbWV0aG9kcyBwZXItdHlwZQoJCQkJaWYgKHNlZ0VsTWV0aG9kKSB7CgkJCQkJZWwgPSBzZWdFbE1ldGhvZC5jYWxsKF90aGlzLCBzZWcsIGVsKTsKCQkJCX0KCgkJCQlpZiAoZWwpIHsgLy8gY3VzdG9tIGZpbHRlcnMgZGlkIG5vdCBjYW5jZWwgdGhlIHJlbmRlcgoJCQkJCWVsID0gJChlbCk7IC8vIGFsbG93IGN1c3RvbSBmaWx0ZXIgdG8gcmV0dXJuIHJhdyBET00gbm9kZQoKCQkJCQkvLyBjb3JyZWN0IGVsZW1lbnQgdHlwZT8gKHdvdWxkIGJlIGJhZCBpZiBhIG5vbi1URCB3ZXJlIGluc2VydGVkIGludG8gYSB0YWJsZSBmb3IgZXhhbXBsZSkKCQkJCQlpZiAoZWwuaXMoX3RoaXMuZmlsbFNlZ1RhZykpIHsKCQkJCQkJc2VnLmVsID0gZWw7CgkJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiByZW5kZXJlZFNlZ3M7Cgl9LAoKCglmaWxsU2VnVGFnOiAnZGl2JywgLy8gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIGZpbGwgc2VnbWVudC4gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGRpZmZlcmVudCB0eXBlcy4KCWZpbGxTZWdIdG1sOiBmdW5jdGlvbih0eXBlLCBzZWcpIHsKCgkJLy8gY3VzdG9tIGhvb2tzIHBlci10eXBlCgkJdmFyIGNsYXNzZXNNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ2xhc3NlcyddOwoJCXZhciBjc3NNZXRob2QgPSB0aGlzW3R5cGUgKyAnU2VnQ3NzJ107CgoJCXZhciBjbGFzc2VzID0gY2xhc3Nlc01ldGhvZCA/IGNsYXNzZXNNZXRob2QuY2FsbCh0aGlzLCBzZWcpIDogW107CgkJdmFyIGNzcyA9IGNzc1RvU3RyKGNzc01ldGhvZCA/IGNzc01ldGhvZC5jYWxsKHRoaXMsIHNlZykgOiB7fSk7CgoJCXJldHVybiAnPCcgKyB0aGlzLmZpbGxTZWdUYWcgKwoJCQkoY2xhc3Nlcy5sZW5ndGggPyAnIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgOiAnJykgKwoJCQkoY3NzID8gJyBzdHlsZT0iJyArIGNzcyArICciJyA6ICcnKSArCgkJCScgLz4nOwoJfSwKCgoKCS8qIEdlbmVyaWMgcmVuZGVyaW5nIHV0aWxpdGllcyBmb3Igc3ViY2xhc3NlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgSFRNTCBjbGFzc05hbWVzIGZvciBhIHNpbmdsZS1kYXkgZWxlbWVudAoJZ2V0RGF5Q2xhc3NlczogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB0b2RheSA9IHZpZXcuY2FsZW5kYXIuZ2V0Tm93KCk7CgkJdmFyIGNsYXNzZXMgPSBbICdmYy0nICsgZGF5SURzW2RhdGUuZGF5KCldIF07CgoJCWlmICgKCQkJdmlldy5pbnRlcnZhbER1cmF0aW9uLmFzKCdtb250aHMnKSA9PSAxICYmCgkJCWRhdGUubW9udGgoKSAhPSB2aWV3LmludGVydmFsU3RhcnQubW9udGgoKQoJCSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLW90aGVyLW1vbnRoJyk7CgkJfQoKCQlpZiAoZGF0ZS5pc1NhbWUodG9kYXksICdkYXknKSkgewoJCQljbGFzc2VzLnB1c2goCgkJCQknZmMtdG9kYXknLAoJCQkJdmlldy5oaWdobGlnaHRTdGF0ZUNsYXNzCgkJCSk7CgkJfQoJCWVsc2UgaWYgKGRhdGUgPCB0b2RheSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXBhc3QnKTsKCQl9CgkJZWxzZSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtZnV0dXJlJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0KCn0pOwoKOzsKCi8qIEV2ZW50LXJlbmRlcmluZyBhbmQgZXZlbnQtaW50ZXJhY3Rpb24gbWV0aG9kcyBmb3IgdGhlIGFic3RyYWN0IEdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpHcmlkLm1peGluKHsKCgkvLyBzZWxmLWNvbmZpZywgb3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcwoJc2VnU2VsZWN0b3I6ICcuZmMtZXZlbnQtY29udGFpbmVyID4gKicsIC8vIHdoYXQgY29uc3RpdHV0ZXMgYW4gZXZlbnQgZWxlbWVudD8KCgltb3VzZWRPdmVyU2VnOiBudWxsLCAvLyB0aGUgc2VnbWVudCBvYmplY3QgdGhlIHVzZXIncyBtb3VzZSBpcyBvdmVyLiBudWxsIGlmIG92ZXIgbm90aGluZwoJaXNEcmFnZ2luZ1NlZzogZmFsc2UsIC8vIGlzIGEgc2VnbWVudCBiZWluZyBkcmFnZ2VkPyBib29sZWFuCglpc1Jlc2l6aW5nU2VnOiBmYWxzZSwgLy8gaXMgYSBzZWdtZW50IGJlaW5nIHJlc2l6ZWQ/IGJvb2xlYW4KCWlzRHJhZ2dpbmdFeHRlcm5hbDogZmFsc2UsIC8vIGpxdWktZHJhZ2dpbmcgYW4gZXh0ZXJuYWwgZWxlbWVudD8gYm9vbGVhbgoJc2VnczogbnVsbCwgLy8gdGhlICpldmVudCogc2VnbWVudHMgY3VycmVudGx5IHJlbmRlcmVkIGluIHRoZSBncmlkLiBUT0RPOiByZW5hbWUgdG8gYGV2ZW50U2Vnc2AKCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIGdyaWQKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdmFyIGJnRXZlbnRzID0gW107CgkJdmFyIGZnRXZlbnRzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJKGlzQmdFdmVudChldmVudHNbaV0pID8gYmdFdmVudHMgOiBmZ0V2ZW50cykucHVzaChldmVudHNbaV0pOwoJCX0KCgkJdGhpcy5zZWdzID0gW10uY29uY2F0KCAvLyByZWNvcmQgYWxsIHNlZ3MKCQkJdGhpcy5yZW5kZXJCZ0V2ZW50cyhiZ0V2ZW50cyksCgkJCXRoaXMucmVuZGVyRmdFdmVudHMoZmdFdmVudHMpCgkJKTsKCX0sCgoKCXJlbmRlckJnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckJnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJCZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCXJlbmRlckZnRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CgoJCS8vIHJlbmRlckZnU2VncyBtaWdodCByZXR1cm4gYSBzdWJzZXQgb2Ygc2Vncywgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCQlyZXR1cm4gdGhpcy5yZW5kZXJGZ1NlZ3Moc2VncykgfHwgc2VnczsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnRzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJdW5yZW5kZXJFdmVudHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlU2VnTW91c2VvdXQoKTsgLy8gdHJpZ2dlciBhbiBldmVudE1vdXNlb3V0IGlmIHVzZXIncyBtb3VzZSBpcyBvdmVyIGFuIGV2ZW50CgkJdGhpcy5jbGVhckRyYWdMaXN0ZW5lcnMoKTsKCgkJdGhpcy51bnJlbmRlckZnU2VncygpOwoJCXRoaXMudW5yZW5kZXJCZ1NlZ3MoKTsKCgkJdGhpcy5zZWdzID0gbnVsbDsKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGN1cnJlbnRseSByZW5kZXJlZCBvbiB0aGUgZ3JpZAoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zZWdzIHx8IFtdOwoJfSwKCgoJLyogRm9yZWdyb3VuZCBTZWdtZW50IFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBmb3JlZ3JvdW5kIGV2ZW50IHNlZ21lbnRzIG9udG8gdGhlIGdyaWQuIE1heSByZXR1cm4gYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQuCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGN1cnJlbnRseSByZW5kZXJlZCBmb3JlZ3JvdW5kIHNlZ21lbnRzCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyBhbmQgYXNzaWducyBhbiBgZWxgIHByb3BlcnR5IGZvciBlYWNoIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudC4KCS8vIE9ubHkgcmV0dXJucyBzZWdtZW50cyB0aGF0IHN1Y2Nlc3NmdWxseSByZW5kZXJlZC4KCS8vIEEgdXRpbGl0eSB0aGF0IHN1YmNsYXNzZXMgbWF5IHVzZS4KCXJlbmRlckZnU2VnRWxzOiBmdW5jdGlvbihzZWdzLCBkaXNhYmxlUmVzaXppbmcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByZW5kZXJlZFNlZ3MgPSBbXTsKCQl2YXIgaTsKCgkJaWYgKHNlZ3MubGVuZ3RoKSB7IC8vIGRvbid0IGJ1aWxkIGFuIGVtcHR5IGh0bWwgc3RyaW5nCgoJCQkvLyBidWlsZCBhIGxhcmdlIGNvbmNhdGVuYXRpb24gb2YgZXZlbnQgc2VnbWVudCBIVE1MCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlodG1sICs9IHRoaXMuZmdTZWdIdG1sKHNlZ3NbaV0sIGRpc2FibGVSZXNpemluZyk7CgkJCX0KCgkJCS8vIEdyYWIgaW5kaXZpZHVhbCBlbGVtZW50cyBmcm9tIHRoZSBjb21iaW5lZCBIVE1MIHN0cmluZy4gVXNlIGVhY2ggYXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nLgoJCQkvLyBUaGVuLCBjb21wdXRlIHRoZSAnZWwnIGZvciBlYWNoIHNlZ21lbnQuIEFuIGVsIG1pZ2h0IGJlIG51bGwgaWYgdGhlIGV2ZW50UmVuZGVyIGNhbGxiYWNrIHJldHVybmVkIGZhbHNlLgoJCQkkKGh0bWwpLmVhY2goZnVuY3Rpb24oaSwgbm9kZSkgewoJCQkJdmFyIHNlZyA9IHNlZ3NbaV07CgkJCQl2YXIgZWwgPSB2aWV3LnJlc29sdmVFdmVudEVsKHNlZy5ldmVudCwgJChub2RlKSk7CgoJCQkJaWYgKGVsKSB7CgkJCQkJZWwuZGF0YSgnZmMtc2VnJywgc2VnKTsgLy8gdXNlZCBieSBoYW5kbGVycwoJCQkJCXNlZy5lbCA9IGVsOwoJCQkJCXJlbmRlcmVkU2Vncy5wdXNoKHNlZyk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJlbmRlcmVkU2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgZm9yZWdyb3VuZCBldmVudCBzZWdtZW50LiBVc2VkIGJ5IHJlbmRlckZnU2VnRWxzKCkKCWZnU2VnSHRtbDogZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIEJhY2tncm91bmQgU2VnbWVudCBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZC4KCS8vIFJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkLgoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYmdFdmVudCcsIHNlZ3MpOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFsbCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyQmdTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyRmlsbCgnYmdFdmVudCcpOwoJfSwKCgoJLy8gUmVuZGVycyBhIGJhY2tncm91bmQgZXZlbnQgZWxlbWVudCwgZ2l2ZW4gdGhlIGRlZmF1bHQgcmVuZGVyaW5nLiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJYmdFdmVudFNlZ0VsOiBmdW5jdGlvbihzZWcsIGVsKSB7CgkJcmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbChzZWcuZXZlbnQsIGVsKTsgLy8gd2lsbCBmaWx0ZXIgdGhyb3VnaCBldmVudFJlbmRlcgoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9mIGEgYmFja2dyb3VuZCBldmVudC4KCS8vIENhbGxlZCBieSBmaWxsU2VnSHRtbC4KCWJnRXZlbnRTZWdDbGFzc2VzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIFsgJ2ZjLWJnZXZlbnQnIF0uY29uY2F0KAoJCQlldmVudC5jbGFzc05hbWUsCgkJCXNvdXJjZS5jbGFzc05hbWUgfHwgW10KCQkpOwoJfSwKCgoJLy8gR2VuZXJhdGVzIGEgc2VtaWNvbG9uLXNlcGFyYXRlZCBDU1Mgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBvZiBhIGJhY2tncm91bmQgZXZlbnQuCgkvLyBDYWxsZWQgYnkgZmlsbFNlZ0h0bWwuCgliZ0V2ZW50U2VnQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gewoJCQknYmFja2dyb3VuZC1jb2xvcic6IHRoaXMuZ2V0U2VnU2tpbkNzcyhzZWcpWydiYWNrZ3JvdW5kLWNvbG9yJ10KCQl9OwoJfSwKCgoJLy8gR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNsYXNzTmFtZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlbmRlcmluZyBidXNpbmVzcyBob3VycyBvdmVybGF5LiBDYWxsZWQgYnkgdGhlIGZpbGwgc3lzdGVtLgoJLy8gQ2FsbGVkIGJ5IGZpbGxTZWdIdG1sLgoJYnVzaW5lc3NIb3Vyc1NlZ0NsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBbICdmYy1ub25idXNpbmVzcycsICdmYy1iZ2V2ZW50JyBdOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGUgYnVzaW5lc3MgaG91ciBzZWdzIGZvciB0aGUgZ3JpZCdzIGN1cnJlbnQgZGF0ZSByYW5nZS4KCS8vIENhbGxlciBtdXN0IGFzayBpZiB3aG9sZS1kYXkgYnVzaW5lc3MgaG91cnMgYXJlIG5lZWRlZC4KCWJ1aWxkQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKCQl2YXIgZXZlbnRzID0gdGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXkpOwoKCQkvLyBIQUNLLiBFdmVudHVhbGx5IHJlZmFjdG9yIGJ1c2luZXNzIGhvdXJzICJldmVudHMiIHN5c3RlbS4KCQkvLyBJZiBubyBldmVudHMgYXJlIGdpdmVuLCBidXQgYnVzaW5lc3NIb3VycyBpcyBhY3RpdmF0ZWQsIHRoaXMgbWVhbnMgdGhlIGVudGlyZSB2aXNpYmxlIHJhbmdlIHNob3VsZCBiZQoJCS8vIG1hcmtlZCBhcyAqbm90KiBidXNpbmVzcy1ob3VycywgdmlhIGludmVyc2UtYmFja2dyb3VuZCByZW5kZXJpbmcuCgkJaWYgKAoJCQkhZXZlbnRzLmxlbmd0aCAmJgoJCQl0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzIC8vIGRvbid0IGFjY2VzcyB2aWV3IG9wdGlvbi4gZG9lc24ndCB1cGRhdGUgd2l0aCBkeW5hbWljIG9wdGlvbnMKCQkpIHsKCQkJZXZlbnRzID0gWwoJCQkJJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIHsKCQkJCQlzdGFydDogdGhpcy52aWV3LmVuZCwgLy8gZ3VhcmFudGVlZCBvdXQtb2YtcmFuZ2UKCQkJCQllbmQ6IHRoaXMudmlldy5lbmQsICAgLy8gIgoJCQkJCWRvdzogbnVsbAoJCQkJfSkKCQkJXTsKCQl9CgoJCXJldHVybiB0aGlzLmV2ZW50c1RvU2VncyhldmVudHMpOwoJfSwKCgoJLyogSGFuZGxlcnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyBmb3IgKmFsbCogcmVuZGVyZWQgZXZlbnQgc2VnbWVudHMgb2YgdGhlIHZpZXcuCgliaW5kU2VnSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLmVsKTsKCX0sCgoKCS8vIEF0dGFjaGVzIGV2ZW50LWVsZW1lbnQtcmVsYXRlZCBoYW5kbGVycyB0byBhbiBhcmJpdHJhcnkgY29udGFpbmVyIGVsZW1lbnQuIGxldmVyYWdlcyBidWJibGluZy4KCWJpbmRTZWdIYW5kbGVyc1RvRWw6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KTsKCQl0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbChlbCwgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCk7CgkJdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwoZWwsICdtb3VzZWVudGVyJywgdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2VsZWF2ZScsIHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnbW91c2Vkb3duJywgdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pOwoJCXRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKGVsLCAnY2xpY2snLCB0aGlzLmhhbmRsZVNlZ0NsaWNrKTsKCX0sCgoKCS8vIEV4ZWN1dGVzIGEgaGFuZGxlciBmb3IgYW55IGEgdXNlci1pbnRlcmFjdGlvbiBvbiBhIHNlZ21lbnQuCgkvLyBIYW5kbGVyIGdldHMgY2FsbGVkIHdpdGggKHNlZywgZXYpLCBhbmQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIEdyaWQKCWJpbmRTZWdIYW5kbGVyVG9FbDogZnVuY3Rpb24oZWwsIG5hbWUsIGhhbmRsZXIpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoKCQllbC5vbihuYW1lLCB0aGlzLnNlZ1NlbGVjdG9yLCBmdW5jdGlvbihldikgewoJCQl2YXIgc2VnID0gJCh0aGlzKS5kYXRhKCdmYy1zZWcnKTsgLy8gZ3JhYiBzZWdtZW50IGRhdGEuIHB1dCB0aGVyZSBieSBWaWV3OjpyZW5kZXJFdmVudHMKCgkJCS8vIG9ubHkgY2FsbCB0aGUgaGFuZGxlcnMgaWYgdGhlcmUgaXMgbm90IGEgZHJhZy9yZXNpemUgaW4gcHJvZ3Jlc3MKCQkJaWYgKHNlZyAmJiAhX3RoaXMuaXNEcmFnZ2luZ1NlZyAmJiAhX3RoaXMuaXNSZXNpemluZ1NlZykgewoJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbChfdGhpcywgc2VnLCBldik7IC8vIGNvbnRleHQgd2lsbCBiZSB0aGUgR3JpZAoJCQl9CgkJfSk7Cgl9LAoKCgloYW5kbGVTZWdDbGljazogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciByZXMgPSB0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRDbGljaycsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldik7IC8vIGNhbiByZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwKCQlpZiAocmVzID09PSBmYWxzZSkgewoJCQlldi5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG92ZXIKCWhhbmRsZVNlZ01vdXNlb3ZlcjogZnVuY3Rpb24oc2VnLCBldikgewoJCWlmICgKCQkJIXRoaXMuaXNJZ25vcmluZ01vdXNlICYmCgkJCSF0aGlzLm1vdXNlZE92ZXJTZWcKCQkpIHsKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gc2VnOwoJCQlpZiAodGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUoc2VnLmV2ZW50KSkgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1hbGxvdy1tb3VzZS1yZXNpemUnKTsKCQkJfQoJCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRNb3VzZW92ZXInLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgYW5kIHRyaWdnZXJzIGhhbmRsZXJzIGZvciB3aGVuIGFuIGV2ZW50IGVsZW1lbnQgaXMgbW91c2VkIG91dC4KCS8vIENhbiBiZSBnaXZlbiBubyBhcmd1bWVudHMsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBtb3VzZW91dCB0aGUgc2VnbWVudCB0aGF0IHdhcyBwcmV2aW91c2x5IG1vdXNlZCBvdmVyLgoJaGFuZGxlU2VnTW91c2VvdXQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQlldiA9IGV2IHx8IHt9OyAvLyBpZiBnaXZlbiBubyBhcmdzLCBtYWtlIGEgbW9jayBtb3VzZSBldmVudAoKCQlpZiAodGhpcy5tb3VzZWRPdmVyU2VnKSB7CgkJCXNlZyA9IHNlZyB8fCB0aGlzLm1vdXNlZE92ZXJTZWc7IC8vIGlmIGdpdmVuIG5vIGFyZ3MsIHVzZSB0aGUgY3VycmVudGx5IG1vdXNlZC1vdmVyIHNlZ21lbnQKCQkJdGhpcy5tb3VzZWRPdmVyU2VnID0gbnVsbDsKCQkJaWYgKHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlKHNlZy5ldmVudCkpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtYWxsb3ctbW91c2UtcmVzaXplJyk7CgkJCX0KCQkJdGhpcy52aWV3LnRyaWdnZXIoJ2V2ZW50TW91c2VvdXQnLCBzZWcuZWxbMF0sIHNlZy5ldmVudCwgZXYpOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ01vdXNlZG93bjogZnVuY3Rpb24oc2VnLCBldikgewoJCXZhciBpc1Jlc2l6aW5nID0gdGhpcy5zdGFydFNlZ1Jlc2l6ZShzZWcsIGV2LCB7IGRpc3RhbmNlOiA1IH0pOwoKCQlpZiAoIWlzUmVzaXppbmcgJiYgdGhpcy52aWV3LmlzRXZlbnREcmFnZ2FibGUoc2VnLmV2ZW50KSkgewoJCQl0aGlzLmJ1aWxkU2VnRHJhZ0xpc3RlbmVyKHNlZykKCQkJCS5zdGFydEludGVyYWN0aW9uKGV2LCB7CgkJCQkJZGlzdGFuY2U6IDUKCQkJCX0pOwoJCX0KCX0sCgoKCWhhbmRsZVNlZ1RvdWNoU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzU2VsZWN0ZWQgPSB2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCk7CgkJdmFyIGlzRHJhZ2dhYmxlID0gdmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGUgPSB2aWV3LmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJCXZhciBpc1Jlc2l6aW5nID0gZmFsc2U7CgkJdmFyIGRyYWdMaXN0ZW5lcjsKCgkJaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZXNpemFibGUpIHsKCQkJLy8gb25seSBhbGxvdyByZXNpemluZyBvZiB0aGUgZXZlbnQgaXMgc2VsZWN0ZWQKCQkJaXNSZXNpemluZyA9IHRoaXMuc3RhcnRTZWdSZXNpemUoc2VnLCBldik7CgkJfQoKCQlpZiAoIWlzUmVzaXppbmcgJiYgKGlzRHJhZ2dhYmxlIHx8IGlzUmVzaXphYmxlKSkgeyAvLyBhbGxvd2VkIHRvIGJlIHNlbGVjdGVkPwoKCQkJZHJhZ0xpc3RlbmVyID0gaXNEcmFnZ2FibGUgPwoJCQkJdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcihzZWcpIDoKCQkJCXRoaXMuYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcihzZWcpOyAvLyBzZWcgaXNuJ3QgZHJhZ2dhYmxlLCBidXQgc3RpbGwgbmVlZHMgdG8gYmUgc2VsZWN0ZWQKCgkJCWRyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKGV2LCB7IC8vIHdvbid0IHN0YXJ0IGlmIGFscmVhZHkgc3RhcnRlZAoJCQkJZGVsYXk6IGlzU2VsZWN0ZWQgPyAwIDogdGhpcy52aWV3Lm9wdCgnbG9uZ1ByZXNzRGVsYXknKSAvLyBkbyBkZWxheSBpZiBub3QgYWxyZWFkeSBzZWxlY3RlZAoJCQl9KTsKCQl9CgoJCS8vIGEgbG9uZyB0YXAgc2ltdWxhdGVzIGEgbW91c2VvdmVyLiBpZ25vcmUgdGhpcyBib2d1cyBtb3VzZW92ZXIuCgkJdGhpcy50ZW1wSWdub3JlTW91c2UoKTsKCX0sCgoKCWhhbmRsZVNlZ1RvdWNoRW5kOiBmdW5jdGlvbihzZWcsIGV2KSB7CgkJLy8gdG91Y2hzdGFydCt0b3VjaGVuZCA9IGNsaWNrLCB3aGljaCBzaW11bGF0ZXMgYSBtb3VzZW92ZXIuCgkJLy8gaWdub3JlIHRoaXMgYm9ndXMgbW91c2VvdmVyLgoJCXRoaXMudGVtcElnbm9yZU1vdXNlKCk7Cgl9LAoKCgkvLyByZXR1cm5zIGJvb2xlYW4gd2hldGhlciByZXNpemluZyBhY3R1YWxseSBzdGFydGVkIG9yIG5vdC4KCS8vIGFzc3VtZXMgdGhlIHNlZyBhbGxvd3MgcmVzaXppbmcuCgkvLyBgZHJhZ09wdGlvbnNgIGFyZSBvcHRpb25hbC4KCXN0YXJ0U2VnUmVzaXplOiBmdW5jdGlvbihzZWcsIGV2LCBkcmFnT3B0aW9ucykgewoJCWlmICgkKGV2LnRhcmdldCkuaXMoJy5mYy1yZXNpemVyJykpIHsKCQkJdGhpcy5idWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyKHNlZywgJChldi50YXJnZXQpLmlzKCcuZmMtc3RhcnQtcmVzaXplcicpKQoJCQkJLnN0YXJ0SW50ZXJhY3Rpb24oZXYsIGRyYWdPcHRpb25zKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoKCgkvKiBFdmVudCBEcmFnZ2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQnVpbGRzIGEgbGlzdGVuZXIgdGhhdCB3aWxsIHRyYWNrIHVzZXItZHJhZ2dpbmcgb24gYW4gZXZlbnQgc2VnbWVudC4KCS8vIEdlbmVyaWMgZW5vdWdoIHRvIHdvcmsgd2l0aCBhbnkgdHlwZSBvZiBHcmlkLgoJLy8gSGFzIHNpZGUgZWZmZWN0IG9mIHNldHRpbmcvdW5zZXR0aW5nIGBzZWdEcmFnTGlzdGVuZXJgCglidWlsZFNlZ0RyYWdMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2FsZW5kYXIgPSB2aWV3LmNhbGVuZGFyOwoJCXZhciBlbCA9IHNlZy5lbDsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIG1vdXNlRm9sbG93ZXI7IC8vIEEgY2xvbmUgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhhdCB3aWxsIG1vdmUgd2l0aCB0aGUgbW91c2UKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKHRoaXMuc2VnRHJhZ0xpc3RlbmVyKSB7CgkJCXJldHVybiB0aGlzLnNlZ0RyYWdMaXN0ZW5lcjsKCQl9CgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqdmlldydzKiBjb29yZGluYXRlIG1hcC4gQWxsb3dzIGRyYWdnaW5nIGFuZCBkcm9wcGluZyBiZXR3ZWVuIHN1YmNvbXBvbmVudHMKCQkvLyBvZiB0aGUgdmlldy4KCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHZpZXcsIHsKCQkJc2Nyb2xsOiB2aWV3Lm9wdCgnZHJhZ1Njcm9sbCcpLAoJCQlzdWJqZWN0RWw6IGVsLAoJCQlzdWJqZWN0Q2VudGVyOiB0cnVlLAoJCQlpbnRlcmFjdGlvblN0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJc2VnLmNvbXBvbmVudCA9IF90aGlzOyAvLyBmb3IgcmVuZGVyRHJhZwoJCQkJaXNEcmFnZ2luZyA9IGZhbHNlOwoJCQkJbW91c2VGb2xsb3dlciA9IG5ldyBNb3VzZUZvbGxvd2VyKHNlZy5lbCwgewoJCQkJCWFkZGl0aW9uYWxDbGFzczogJ2ZjLWRyYWdnaW5nJywKCQkJCQlwYXJlbnRFbDogdmlldy5lbCwKCQkJCQlvcGFjaXR5OiBkcmFnTGlzdGVuZXIuaXNUb3VjaCA/IG51bGwgOiB2aWV3Lm9wdCgnZHJhZ09wYWNpdHknKSwKCQkJCQlyZXZlcnREdXJhdGlvbjogdmlldy5vcHQoJ2RyYWdSZXZlcnREdXJhdGlvbicpLAoJCQkJCXpJbmRleDogMiAvLyBvbmUgYWJvdmUgdGhlIC5mYy12aWV3CgkJCQl9KTsKCQkJCW1vdXNlRm9sbG93ZXIuaGlkZSgpOyAvLyBkb24ndCBzaG93IHVudGlsIHdlIGtub3cgdGhpcyBpcyBhIHJlYWwgZHJhZwoJCQkJbW91c2VGb2xsb3dlci5zdGFydChldik7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcmFnTGlzdGVuZXIuaXNUb3VjaCAmJiAhdmlldy5pc0V2ZW50U2VsZWN0ZWQoZXZlbnQpKSB7CgkJCQkJLy8gaWYgbm90IHByZXZpb3VzbHkgc2VsZWN0ZWQsIHdpbGwgZmlyZSBhZnRlciBhIGRlbGF5LiB0aGVuLCBzZWxlY3QgdGhlIGV2ZW50CgkJCQkJdmlldy5zZWxlY3RFdmVudChldmVudCk7CgkJCQl9CgkJCQlpc0RyYWdnaW5nID0gdHJ1ZTsKCQkJCV90aGlzLmhhbmRsZVNlZ01vdXNlb3V0KHNlZywgZXYpOyAvLyBlbnN1cmUgYSBtb3VzZW91dCBvbiB0aGUgbWFuaXB1bGF0ZWQgZXZlbnQgaGFzIGJlZW4gcmVwb3J0ZWQKCQkJCV90aGlzLnNlZ0RyYWdTdGFydChzZWcsIGV2KTsKCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsgLy8gaGlkZSBhbGwgZXZlbnQgc2VnbWVudHMuIG91ciBtb3VzZUZvbGxvd2VyIHdpbGwgdGFrZSBvdmVyCgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgZHJhZ0hlbHBlckVsczsKCgkJCQkvLyBzdGFydGluZyBoaXQgY291bGQgYmUgZm9yY2VkIChEYXlHcmlkLmxpbWl0KQoJCQkJaWYgKHNlZy5oaXQpIHsKCQkJCQlvcmlnSGl0ID0gc2VnLmhpdDsKCQkJCX0KCgkJCQkvLyBzaW5jZSB3ZSBhcmUgcXVlcnlpbmcgdGhlIHBhcmVudCB2aWV3LCBtaWdodCBub3QgYmVsb25nIHRvIHRoaXMgZ3JpZAoJCQkJZHJvcExvY2F0aW9uID0gX3RoaXMuY29tcHV0ZUV2ZW50RHJvcCgKCQkJCQlvcmlnSGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKG9yaWdIaXQpLAoJCQkJCWhpdC5jb21wb25lbnQuZ2V0SGl0U3BhbihoaXQpLAoJCQkJCWV2ZW50CgkJCQkpOwoKCQkJCWlmIChkcm9wTG9jYXRpb24gJiYgIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3Bhbihkcm9wTG9jYXRpb24pLCBldmVudCkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQkvLyBpZiBhIHZhbGlkIGRyb3AgbG9jYXRpb24sIGhhdmUgdGhlIHN1YmNsYXNzIHJlbmRlciBhIHZpc3VhbCBpbmRpY2F0aW9uCgkJCQlpZiAoZHJvcExvY2F0aW9uICYmIChkcmFnSGVscGVyRWxzID0gdmlldy5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKSkpIHsKCgkJCQkJZHJhZ0hlbHBlckVscy5hZGRDbGFzcygnZmMtZHJhZ2dpbmcnKTsKCQkJCQlpZiAoIWRyYWdMaXN0ZW5lci5pc1RvdWNoKSB7CgkJCQkJCV90aGlzLmFwcGx5RHJhZ09wYWNpdHkoZHJhZ0hlbHBlckVscyk7CgkJCQkJfQoKCQkJCQltb3VzZUZvbGxvd2VyLmhpZGUoKTsgLy8gaWYgdGhlIHN1YmNsYXNzIGlzIGFscmVhZHkgdXNpbmcgYSBtb2NrIGV2ZW50ICJoZWxwZXIiLCBoaWRlIG91ciBvd24KCQkJCX0KCQkJCWVsc2UgewoJCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBvdGhlcndpc2UsIGhhdmUgdGhlIGhlbHBlciBmb2xsb3cgdGhlIG1vdXNlIChubyBzbmFwcGluZykKCQkJCX0KCgkJCQlpZiAoaXNPcmlnKSB7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsgLy8gbmVlZHMgdG8gaGF2ZSBtb3ZlZCBoaXRzIHRvIGJlIGEgdmFsaWQgZHJvcAoJCQkJfQoJCQl9LAoJCQloaXRPdXQ6IGZ1bmN0aW9uKCkgeyAvLyBjYWxsZWQgYmVmb3JlIG1vdXNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IGhpdCBPUiBtb3ZlZCBvdXQgb2YgYWxsIGhpdHMKCQkJCXZpZXcudW5yZW5kZXJEcmFnKCk7IC8vIHVucmVuZGVyIHdoYXRldmVyIHdhcyBkb25lIGluIHJlbmRlckRyYWcKCQkJCW1vdXNlRm9sbG93ZXIuc2hvdygpOyAvLyBzaG93IGluIGNhc2Ugd2UgYXJlIG1vdmluZyBvdXQgb2YgYWxsIGhpdHMKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyBDYWxsZWQgYWZ0ZXIgYSBoaXRPdXQgT1IgYmVmb3JlIGEgZHJhZ0VuZAoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJZGVsZXRlIHNlZy5jb21wb25lbnQ7IC8vIHByZXZlbnQgc2lkZSBlZmZlY3RzCgoJCQkJLy8gZG8gcmV2ZXJ0IGFuaW1hdGlvbiBpZiBoYXNuJ3QgY2hhbmdlZC4gY2FsbHMgYSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkICh3aGV0aGVyIGFuaW1hdGlvbiBvciBub3QpCgkJCQltb3VzZUZvbGxvd2VyLnN0b3AoIWRyb3BMb2NhdGlvbiwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQkJdmlldy51bnJlbmRlckRyYWcoKTsKCQkJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJCQlfdGhpcy5zZWdEcmFnU3RvcChzZWcsIGV2KTsKCQkJCQl9CgkJCQkJaWYgKGRyb3BMb2NhdGlvbikgewoJCQkJCQl2aWV3LnJlcG9ydEV2ZW50RHJvcChldmVudCwgZHJvcExvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCQl9CgkJCQl9KTsKCQkJCV90aGlzLnNlZ0RyYWdMaXN0ZW5lciA9IG51bGw7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIGRyYWdMaXN0ZW5lcjsKCX0sCgoKCS8vIHNlZyBpc24ndCBkcmFnZ2FibGUsIGJ1dCBsZXQncyB1c2UgYSBnZW5lcmljIERyYWdMaXN0ZW5lcgoJLy8gc2ltcGx5IGZvciB0aGUgZGVsYXksIHNvIGl0IGNhbiBiZSBzZWxlY3RlZC4KCS8vIEhhcyBzaWRlIGVmZmVjdCBvZiBzZXR0aW5nL3Vuc2V0dGluZyBgc2VnRHJhZ0xpc3RlbmVyYAoJYnVpbGRTZWdTZWxlY3RMaXN0ZW5lcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgoJCWlmICh0aGlzLnNlZ0RyYWdMaXN0ZW5lcikgewoJCQlyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7CgkJfQoKCQl2YXIgZHJhZ0xpc3RlbmVyID0gdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHsKCQkJZHJhZ1N0YXJ0OiBmdW5jdGlvbihldikgewoJCQkJaWYgKGRyYWdMaXN0ZW5lci5pc1RvdWNoICYmICF2aWV3LmlzRXZlbnRTZWxlY3RlZChldmVudCkpIHsKCQkJCQkvLyBpZiBub3QgcHJldmlvdXNseSBzZWxlY3RlZCwgd2lsbCBmaXJlIGFmdGVyIGEgZGVsYXkuIHRoZW4sIHNlbGVjdCB0aGUgZXZlbnQKCQkJCQl2aWV3LnNlbGVjdEV2ZW50KGV2ZW50KTsKCQkJCX0KCQkJfSwKCQkJaW50ZXJhY3Rpb25FbmQ6IGZ1bmN0aW9uKGV2KSB7CgkJCQlfdGhpcy5zZWdEcmFnTGlzdGVuZXIgPSBudWxsOwoJCQl9CgkJfSk7CgoJCXJldHVybiBkcmFnTGlzdGVuZXI7Cgl9LAoKCgkvLyBDYWxsZWQgYmVmb3JlIGV2ZW50IHNlZ21lbnQgZHJhZ2dpbmcgc3RhcnRzCglzZWdEcmFnU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzRHJhZ2dpbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdGFydCcsIHNlZy5lbFswXSwgc2VnLmV2ZW50LCBldiwge30pOyAvLyBsYXN0IGFyZ3VtZW50IGlzIGpxdWkgZHVtbXkKCX0sCgoKCS8vIENhbGxlZCBhZnRlciBldmVudCBzZWdtZW50IGRyYWdnaW5nIHN0b3BzCglzZWdEcmFnU3RvcDogZnVuY3Rpb24oc2VnLCBldikgewoJCXRoaXMuaXNEcmFnZ2luZ1NlZyA9IGZhbHNlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudERyYWdTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gR2l2ZW4gdGhlIHNwYW5zIGFuIGV2ZW50IGRyYWcgYmVnYW4sIGFuZCB0aGUgc3BhbiBldmVudCB3YXMgZHJvcHBlZCwgY2FsY3VsYXRlcyB0aGUgbmV3IHpvbmVkIHN0YXJ0L2VuZC9hbGxEYXkKCS8vIHZhbHVlcyBmb3IgdGhlIGV2ZW50LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhbmQgc2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSB1c2VkIGJ5IHJlbmRlckRyYWcuCgkvLyBBIGZhbHN5IHJldHVybmVkIHZhbHVlIGluZGljYXRlcyBhbiBpbnZhbGlkIGRyb3AuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcmFnU3RhcnQgPSBzdGFydFNwYW4uc3RhcnQ7CgkJdmFyIGRyYWdFbmQgPSBlbmRTcGFuLnN0YXJ0OwoJCXZhciBkZWx0YTsKCQl2YXIgZHJvcExvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMKCgkJaWYgKGRyYWdTdGFydC5oYXNUaW1lKCkgPT09IGRyYWdFbmQuaGFzVGltZSgpKSB7CgkJCWRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZHJhZ0VuZCwgZHJhZ1N0YXJ0KTsKCgkJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgaXQgd2FzIGRyYWdnZWQgdG8gYSBkaWZmZXJlbnQgdGltZSwKCQkJLy8gZ3VhcmFudGVlIGFuIGVuZCBhbmQgYWRqdXN0IHN0YXJ0L2VuZCB0byBoYXZlIHRpbWVzCgkJCWlmIChldmVudC5hbGxEYXkgJiYgZHVyYXRpb25IYXNUaW1lKGRlbHRhKSkgewoJCQkJZHJvcExvY2F0aW9uID0gewoJCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLCAvLyB3aWxsIGJlIGFuIGFtYmlnIGRheQoJCQkJCWFsbERheTogZmFsc2UgLy8gZm9yIG5vcm1hbGl6ZUV2ZW50VGltZXMKCQkJCX07CgkJCQljYWxlbmRhci5ub3JtYWxpemVFdmVudFRpbWVzKGRyb3BMb2NhdGlvbik7CgkJCX0KCQkJLy8gb3RoZXdpc2UsIHdvcmsgb2ZmIGV4aXN0aW5nIHZhbHVlcwoJCQllbHNlIHsKCQkJCWRyb3BMb2NhdGlvbiA9IHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpOwoJCQl9CgoJCQlkcm9wTG9jYXRpb24uc3RhcnQuYWRkKGRlbHRhKTsKCQkJaWYgKGRyb3BMb2NhdGlvbi5lbmQpIHsKCQkJCWRyb3BMb2NhdGlvbi5lbmQuYWRkKGRlbHRhKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gaWYgc3dpdGNoaW5nIGZyb20gZGF5IDwtPiB0aW1lZCwgc3RhcnQgc2hvdWxkIGJlIHJlc2V0IHRvIHRoZSBkcm9wcGVkIGRhdGUsIGFuZCB0aGUgZW5kIGNsZWFyZWQKCQkJZHJvcExvY2F0aW9uID0gewoJCQkJc3RhcnQ6IGRyYWdFbmQuY2xvbmUoKSwKCQkJCWVuZDogbnVsbCwgLy8gZW5kIHNob3VsZCBiZSBjbGVhcmVkCgkJCQlhbGxEYXk6ICFkcmFnRW5kLmhhc1RpbWUoKQoJCQl9OwoJCX0KCgkJcmV0dXJuIGRyb3BMb2NhdGlvbjsKCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGFwcGx5IGRyYWdPcGFjaXR5IHRvIGEgalF1ZXJ5IHNldAoJYXBwbHlEcmFnT3BhY2l0eTogZnVuY3Rpb24oZWxzKSB7CgkJdmFyIG9wYWNpdHkgPSB0aGlzLnZpZXcub3B0KCdkcmFnT3BhY2l0eScpOwoKCQlpZiAob3BhY2l0eSAhPSBudWxsKSB7CgkJCWVscy5jc3MoJ29wYWNpdHknLCBvcGFjaXR5KTsKCQl9Cgl9LAoKCgkvKiBFeHRlcm5hbCBFbGVtZW50IERyYWdnaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDYWxsZWQgd2hlbiBhIGpRdWVyeSBVSSBkcmFnIGlzIGluaXRpYXRlZCBhbnl3aGVyZSBpbiB0aGUgRE9NCglleHRlcm5hbERyYWdTdGFydDogZnVuY3Rpb24oZXYsIHVpKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGVsOwoJCXZhciBhY2NlcHQ7CgoJCWlmICh2aWV3Lm9wdCgnZHJvcHBhYmxlJykpIHsgLy8gb25seSBsaXN0ZW4gaWYgdGhpcyBzZXR0aW5nIGlzIG9uCgkJCWVsID0gJCgodWkgPyB1aS5pdGVtIDogbnVsbCkgfHwgZXYudGFyZ2V0KTsKCgkJCS8vIFRlc3QgdGhhdCB0aGUgZHJhZ2dlZCBlbGVtZW50IHBhc3NlcyB0aGUgZHJvcEFjY2VwdCBzZWxlY3RvciBvciBmaWx0ZXIgZnVuY3Rpb24uCgkJCS8vIEZZSSwgdGhlIGRlZmF1bHQgaXMgIioiIChtYXRjaGVzIGFsbCkKCQkJYWNjZXB0ID0gdmlldy5vcHQoJ2Ryb3BBY2NlcHQnKTsKCQkJaWYgKCQuaXNGdW5jdGlvbihhY2NlcHQpID8gYWNjZXB0LmNhbGwoZWxbMF0sIGVsKSA6IGVsLmlzKGFjY2VwdCkpIHsKCQkJCWlmICghdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwpIHsgLy8gcHJldmVudCBkb3VibGUtbGlzdGVuaW5nIGlmIGZpcmVkIHR3aWNlCgkJCQkJdGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhlbCwgZXYsIHVpKTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgalF1ZXJ5IFVJIGRyYWcgc3RhcnRzIGFuZCBpdCBuZWVkcyB0byBiZSBtb25pdG9yZWQgZm9yIGRyb3BwaW5nCglsaXN0ZW5Ub0V4dGVybmFsRHJhZzogZnVuY3Rpb24oZWwsIGV2LCB1aSkgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBtZXRhID0gZ2V0RHJhZ2dlZEVsTWV0YShlbCk7IC8vIGV4dHJhIGRhdGEgYWJvdXQgZXZlbnQgZHJvcCwgaW5jbHVkaW5nIHBvc3NpYmxlIGV2ZW50IHRvIGNyZWF0ZQoJCXZhciBkcm9wTG9jYXRpb247IC8vIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIHVuc3VjY2Vzc2Z1bCBkcmFnCgoJCS8vIGxpc3RlbmVyIHRoYXQgdHJhY2tzIG1vdXNlIG1vdmVtZW50IG92ZXIgZGF0ZS1hc3NvY2lhdGVkIHBpeGVsIHJlZ2lvbnMKCQl2YXIgZHJhZ0xpc3RlbmVyID0gX3RoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIgPSBuZXcgSGl0RHJhZ0xpc3RlbmVyKHRoaXMsIHsKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSB0cnVlOwoJCQl9LAoJCQloaXRPdmVyOiBmdW5jdGlvbihoaXQpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IF90aGlzLmNvbXB1dGVFeHRlcm5hbERyb3AoCgkJCQkJaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCksIC8vIHNpbmNlIHdlIGFyZSBxdWVyeWluZyB0aGUgcGFyZW50IHZpZXcsIG1pZ2h0IG5vdCBiZWxvbmcgdG8gdGhpcyBncmlkCgkJCQkJbWV0YQoJCQkJKTsKCgkJCQlpZiAoIC8vIGludmFsaWQgaGl0PwoJCQkJCWRyb3BMb2NhdGlvbiAmJgoJCQkJCSFjYWxlbmRhci5pc0V4dGVybmFsU3BhbkFsbG93ZWQoX3RoaXMuZXZlbnRUb1NwYW4oZHJvcExvY2F0aW9uKSwgZHJvcExvY2F0aW9uLCBtZXRhLmV2ZW50UHJvcHMpCgkJCQkpIHsKCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJZHJvcExvY2F0aW9uID0gbnVsbDsKCQkJCX0KCgkJCQlpZiAoZHJvcExvY2F0aW9uKSB7CgkJCQkJX3RoaXMucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24pOyAvLyBjYWxsZWQgd2l0aG91dCBhIHNlZyBwYXJhbWV0ZXIKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsKCQkJCWRyb3BMb2NhdGlvbiA9IG51bGw7IC8vIHNpZ25hbCB1bnN1Y2Nlc3NmdWwKCQkJfSwKCQkJaGl0RG9uZTogZnVuY3Rpb24oKSB7IC8vIENhbGxlZCBhZnRlciBhIGhpdE91dCBPUiBiZWZvcmUgYSBkcmFnRW5kCgkJCQllbmFibGVDdXJzb3IoKTsKCQkJCV90aGlzLnVucmVuZGVyRHJhZygpOwoJCQl9LAoJCQlpbnRlcmFjdGlvbkVuZDogZnVuY3Rpb24oZXYpIHsKCQkJCWlmIChkcm9wTG9jYXRpb24pIHsgLy8gZWxlbWVudCB3YXMgZHJvcHBlZCBvbiBhIHZhbGlkIGhpdAoJCQkJCV90aGlzLnZpZXcucmVwb3J0RXh0ZXJuYWxEcm9wKG1ldGEsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSk7CgkJCQl9CgkJCQlfdGhpcy5pc0RyYWdnaW5nRXh0ZXJuYWwgPSBmYWxzZTsKCQkJCV90aGlzLmV4dGVybmFsRHJhZ0xpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlkcmFnTGlzdGVuZXIuc3RhcnREcmFnKGV2KTsgLy8gc3RhcnQgbGlzdGVuaW5nIGltbWVkaWF0ZWx5Cgl9LAoKCgkvLyBHaXZlbiBhIGhpdCB0byBiZSBkcm9wcGVkIHVwb24sIGFuZCBtaXNjIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBqcXVpIGRyYWcgKGd1YXJhbnRlZWQgdG8gYmUgYSBwbGFpbiBvYmplY3QpLAoJLy8gcmV0dXJucyB0aGUgem9uZWQgc3RhcnQvZW5kIGRhdGVzIGZvciB0aGUgZXZlbnQgdGhhdCB3b3VsZCByZXN1bHQgZnJvbSB0aGUgaHlwb3RoZXRpY2FsIGRyb3AuIGVuZCBtaWdodCBiZSBudWxsLgoJLy8gUmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSBzaWduYWxzIGFuIGludmFsaWQgZHJvcCBoaXQuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihzcGFuLCBtZXRhKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy52aWV3LmNhbGVuZGFyOwoJCXZhciBkcm9wTG9jYXRpb24gPSB7CgkJCXN0YXJ0OiBjYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uc3RhcnQpLCAvLyBzaW11bGF0ZSBhIHpvbmVkIGV2ZW50IHN0YXJ0IGRhdGUKCQkJZW5kOiBudWxsCgkJfTsKCgkJLy8gaWYgZHJvcHBlZCBvbiBhbiBhbGwtZGF5IHNwYW4sIGFuZCBlbGVtZW50J3MgbWV0YWRhdGEgc3BlY2lmaWVkIGEgdGltZSwgc2V0IGl0CgkJaWYgKG1ldGEuc3RhcnRUaW1lICYmICFkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCWRyb3BMb2NhdGlvbi5zdGFydC50aW1lKG1ldGEuc3RhcnRUaW1lKTsKCQl9CgoJCWlmIChtZXRhLmR1cmF0aW9uKSB7CgkJCWRyb3BMb2NhdGlvbi5lbmQgPSBkcm9wTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQobWV0YS5kdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gZHJvcExvY2F0aW9uOwoJfSwKCgoKCS8qIERyYWcgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGFuIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IG9yIGV4dGVybmFsIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZC4KCS8vIGBkcm9wTG9jYXRpb25gIGNvbnRhaW5zIGh5cG90aGV0aWNhbCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyB0aGUgZXZlbnQgd291bGQgaGF2ZSBpZiBkcm9wcGVkLiBlbmQgY2FuIGJlIG51bGwuCgkvLyBgc2VnYCBpcyB0aGUgaW50ZXJuYWwgc2VnbWVudCBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLiBJZiBkcmFnZ2luZyBhbiBleHRlcm5hbCBlbGVtZW50LCBgc2VnYCBpcyBudWxsLgoJLy8gQSB0cnV0aHkgcmV0dXJuZWQgdmFsdWUgaW5kaWNhdGVzIHRoaXMgbWV0aG9kIGhhcyByZW5kZXJlZCBhIGhlbHBlciBlbGVtZW50LgoJLy8gTXVzdCByZXR1cm4gZWxlbWVudHMgdXNlZCBmb3IgYW55IG1vY2sgZXZlbnRzLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLyogUmVzaXppbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENyZWF0ZXMgYSBsaXN0ZW5lciB0aGF0IHRyYWNrcyB0aGUgdXNlciBhcyB0aGV5IHJlc2l6ZSBhbiBldmVudCBzZWdtZW50LgoJLy8gR2VuZXJpYyBlbm91Z2ggdG8gd29yayB3aXRoIGFueSB0eXBlIG9mIEdyaWQuCglidWlsZFNlZ1Jlc2l6ZUxpc3RlbmVyOiBmdW5jdGlvbihzZWcsIGlzU3RhcnQpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjYWxlbmRhciA9IHZpZXcuY2FsZW5kYXI7CgkJdmFyIGVsID0gc2VnLmVsOwoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCQl2YXIgZXZlbnRFbmQgPSBjYWxlbmRhci5nZXRFdmVudEVuZChldmVudCk7CgkJdmFyIGlzRHJhZ2dpbmc7CgkJdmFyIHJlc2l6ZUxvY2F0aW9uOyAvLyB6b25lZCBldmVudCBkYXRlIHByb3BlcnRpZXMuIGZhbHN5IGlmIGludmFsaWQgcmVzaXplCgoJCS8vIFRyYWNrcyBtb3VzZSBtb3ZlbWVudCBvdmVyIHRoZSAqZ3JpZCdzKiBjb29yZGluYXRlIG1hcAoJCXZhciBkcmFnTGlzdGVuZXIgPSB0aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbmV3IEhpdERyYWdMaXN0ZW5lcih0aGlzLCB7CgkJCXNjcm9sbDogdmlldy5vcHQoJ2RyYWdTY3JvbGwnKSwKCQkJc3ViamVjdEVsOiBlbCwKCQkJaW50ZXJhY3Rpb25TdGFydDogZnVuY3Rpb24oKSB7CgkJCQlpc0RyYWdnaW5nID0gZmFsc2U7CgkJCX0sCgkJCWRyYWdTdGFydDogZnVuY3Rpb24oZXYpIHsKCQkJCWlzRHJhZ2dpbmcgPSB0cnVlOwoJCQkJX3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoc2VnLCBldik7IC8vIGVuc3VyZSBhIG1vdXNlb3V0IG9uIHRoZSBtYW5pcHVsYXRlZCBldmVudCBoYXMgYmVlbiByZXBvcnRlZAoJCQkJX3RoaXMuc2VnUmVzaXplU3RhcnQoc2VnLCBldik7CgkJCX0sCgkJCWhpdE92ZXI6IGZ1bmN0aW9uKGhpdCwgaXNPcmlnLCBvcmlnSGl0KSB7CgkJCQl2YXIgb3JpZ0hpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKG9yaWdIaXQpOwoJCQkJdmFyIGhpdFNwYW4gPSBfdGhpcy5nZXRIaXRTcGFuKGhpdCk7CgoJCQkJcmVzaXplTG9jYXRpb24gPSBpc1N0YXJ0ID8KCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRTdGFydFJlc2l6ZShvcmlnSGl0U3BhbiwgaGl0U3BhbiwgZXZlbnQpIDoKCQkJCQlfdGhpcy5jb21wdXRlRXZlbnRFbmRSZXNpemUob3JpZ0hpdFNwYW4sIGhpdFNwYW4sIGV2ZW50KTsKCgkJCQlpZiAocmVzaXplTG9jYXRpb24pIHsKCQkJCQlpZiAoIWNhbGVuZGFyLmlzRXZlbnRTcGFuQWxsb3dlZChfdGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbiksIGV2ZW50KSkgewoJCQkJCQlkaXNhYmxlQ3Vyc29yKCk7CgkJCQkJCXJlc2l6ZUxvY2F0aW9uID0gbnVsbDsKCQkJCQl9CgkJCQkJLy8gbm8gY2hhbmdlPyAoRllJLCBldmVudCBkYXRlcyBtaWdodCBoYXZlIHpvbmVzKQoJCQkJCWVsc2UgaWYgKAoJCQkJCQlyZXNpemVMb2NhdGlvbi5zdGFydC5pc1NhbWUoZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSkgJiYKCQkJCQkJcmVzaXplTG9jYXRpb24uZW5kLmlzU2FtZShldmVudEVuZC5jbG9uZSgpLnN0cmlwWm9uZSgpKQoJCQkJCSkgewoJCQkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZXNpemVMb2NhdGlvbikgewoJCQkJCXZpZXcuaGlkZUV2ZW50KGV2ZW50KTsKCQkJCQlfdGhpcy5yZW5kZXJFdmVudFJlc2l6ZShyZXNpemVMb2NhdGlvbiwgc2VnKTsKCQkJCX0KCQkJfSwKCQkJaGl0T3V0OiBmdW5jdGlvbigpIHsgLy8gY2FsbGVkIGJlZm9yZSBtb3VzZSBtb3ZlcyB0byBhIGRpZmZlcmVudCBoaXQgT1IgbW92ZWQgb3V0IG9mIGFsbCBoaXRzCgkJCQlyZXNpemVMb2NhdGlvbiA9IG51bGw7CgkJCX0sCgkJCWhpdERvbmU6IGZ1bmN0aW9uKCkgeyAvLyByZXNldHMgdGhlIHJlbmRlcmluZyB0byBzaG93IHRoZSBvcmlnaW5hbCBldmVudAoJCQkJX3RoaXMudW5yZW5kZXJFdmVudFJlc2l6ZSgpOwoJCQkJdmlldy5zaG93RXZlbnQoZXZlbnQpOwoJCQkJZW5hYmxlQ3Vyc29yKCk7CgkJCX0sCgkJCWludGVyYWN0aW9uRW5kOiBmdW5jdGlvbihldikgewoJCQkJaWYgKGlzRHJhZ2dpbmcpIHsKCQkJCQlfdGhpcy5zZWdSZXNpemVTdG9wKHNlZywgZXYpOwoJCQkJfQoJCQkJaWYgKHJlc2l6ZUxvY2F0aW9uKSB7IC8vIHZhbGlkIGRhdGUgdG8gcmVzaXplIHRvPwoJCQkJCXZpZXcucmVwb3J0RXZlbnRSZXNpemUoZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCB0aGlzLmxhcmdlVW5pdCwgZWwsIGV2KTsKCQkJCX0KCQkJCV90aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyID0gbnVsbDsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gZHJhZ0xpc3RlbmVyOwoJfSwKCgoJLy8gQ2FsbGVkIGJlZm9yZSBldmVudCBzZWdtZW50IHJlc2l6aW5nIHN0YXJ0cwoJc2VnUmVzaXplU3RhcnQ6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSB0cnVlOwoJCXRoaXMudmlldy50cmlnZ2VyKCdldmVudFJlc2l6ZVN0YXJ0Jywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gQ2FsbGVkIGFmdGVyIGV2ZW50IHNlZ21lbnQgcmVzaXppbmcgc3RvcHMKCXNlZ1Jlc2l6ZVN0b3A6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl0aGlzLmlzUmVzaXppbmdTZWcgPSBmYWxzZTsKCQl0aGlzLnZpZXcudHJpZ2dlcignZXZlbnRSZXNpemVTdG9wJywgc2VnLmVsWzBdLCBzZWcuZXZlbnQsIGV2LCB7fSk7IC8vIGxhc3QgYXJndW1lbnQgaXMganF1aSBkdW1teQoJfSwKCgoJLy8gUmV0dXJucyBuZXcgZGF0ZS1pbmZvcm1hdGlvbiBmb3IgYW4gZXZlbnQgc2VnbWVudCBiZWluZyByZXNpemVkIGZyb20gaXRzIHN0YXJ0Cgljb21wdXRlRXZlbnRTdGFydFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnc3RhcnQnLCBzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KTsKCX0sCgoKCS8vIFJldHVybnMgbmV3IGRhdGUtaW5mb3JtYXRpb24gZm9yIGFuIGV2ZW50IHNlZ21lbnQgYmVpbmcgcmVzaXplZCBmcm9tIGl0cyBlbmQKCWNvbXB1dGVFdmVudEVuZFJlc2l6ZTogZnVuY3Rpb24oc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgnZW5kJywgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCk7Cgl9LAoKCgkvLyBSZXR1cm5zIG5ldyB6b25lZCBkYXRlIGluZm9ybWF0aW9uIGZvciBhbiBldmVudCBzZWdtZW50IGJlaW5nIHJlc2l6ZWQgZnJvbSBpdHMgc3RhcnQgT1IgZW5kCgkvLyBgdHlwZWAgaXMgZWl0aGVyICdzdGFydCcgb3IgJ2VuZCcuCgkvLyBET0VTIE5PVCBjb25zaWRlciBvdmVybGFwL2NvbnN0cmFpbnQuCgljb21wdXRlRXZlbnRSZXNpemU6IGZ1bmN0aW9uKHR5cGUsIHN0YXJ0U3BhbiwgZW5kU3BhbiwgZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIGRlbHRhID0gdGhpcy5kaWZmRGF0ZXMoZW5kU3Bhblt0eXBlXSwgc3RhcnRTcGFuW3R5cGVdKTsKCQl2YXIgcmVzaXplTG9jYXRpb247IC8vIHpvbmVkIGV2ZW50IGRhdGUgcHJvcGVydGllcwoJCXZhciBkZWZhdWx0RHVyYXRpb247CgoJCS8vIGJ1aWxkIG9yaWdpbmFsIHZhbHVlcyB0byB3b3JrIGZyb20sIGd1YXJhbnRlZWluZyBhIHN0YXJ0IGFuZCBlbmQKCQlyZXNpemVMb2NhdGlvbiA9IHsKCQkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJCWVuZDogY2FsZW5kYXIuZ2V0RXZlbnRFbmQoZXZlbnQpLAoJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCX07CgoJCS8vIGlmIGFuIGFsbC1kYXkgZXZlbnQgd2FzIGluIGEgdGltZWQgYXJlYSBhbmQgd2FzIHJlc2l6ZWQgdG8gYSB0aW1lLCBhZGp1c3Qgc3RhcnQvZW5kIHRvIGhhdmUgdGltZXMKCQlpZiAocmVzaXplTG9jYXRpb24uYWxsRGF5ICYmIGR1cmF0aW9uSGFzVGltZShkZWx0YSkpIHsKCQkJcmVzaXplTG9jYXRpb24uYWxsRGF5ID0gZmFsc2U7CgkJCWNhbGVuZGFyLm5vcm1hbGl6ZUV2ZW50VGltZXMocmVzaXplTG9jYXRpb24pOwoJCX0KCgkJcmVzaXplTG9jYXRpb25bdHlwZV0uYWRkKGRlbHRhKTsgLy8gYXBwbHkgZGVsdGEgdG8gc3RhcnQgb3IgZW5kCgoJCS8vIGlmIHRoZSBldmVudCB3YXMgY29tcHJlc3NlZCB0b28gc21hbGwsIGZpbmQgYSBuZXcgcmVhc29uYWJsZSBkdXJhdGlvbiBmb3IgaXQKCQlpZiAoIXJlc2l6ZUxvY2F0aW9uLnN0YXJ0LmlzQmVmb3JlKHJlc2l6ZUxvY2F0aW9uLmVuZCkpIHsKCgkJCWRlZmF1bHREdXJhdGlvbiA9CgkJCQl0aGlzLm1pblJlc2l6ZUR1cmF0aW9uIHx8IC8vIFRPRE86IGhhY2sKCQkJCShldmVudC5hbGxEYXkgPwoJCQkJCWNhbGVuZGFyLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDoKCQkJCQljYWxlbmRhci5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgkJCWlmICh0eXBlID09ICdzdGFydCcpIHsgLy8gcmVzaXppbmcgdGhlIHN0YXJ0PwoJCQkJcmVzaXplTG9jYXRpb24uc3RhcnQgPSByZXNpemVMb2NhdGlvbi5lbmQuY2xvbmUoKS5zdWJ0cmFjdChkZWZhdWx0RHVyYXRpb24pOwoJCQl9CgkJCWVsc2UgeyAvLyByZXNpemluZyB0aGUgZW5kPwoJCQkJcmVzaXplTG9jYXRpb24uZW5kID0gcmVzaXplTG9jYXRpb24uc3RhcnQuY2xvbmUoKS5hZGQoZGVmYXVsdER1cmF0aW9uKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwoJfSwKCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQuCgkvLyBgcmFuZ2VgIGhhcyB0aGUgdXBkYXRlZCBkYXRlcyBvZiB0aGUgZXZlbnQuIGBzZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBpbnZvbHZlZCBpbiB0aGUgZHJhZy4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihyYW5nZSwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZC4KCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8qIFJlbmRlcmluZyBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZSB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gYW4gZXZlbnQncyBlbGVtZW50LgoJLy8gYHJhbmdlYCBjYW4gYmUgdGhlIEV2ZW50IG9iamVjdCBpdHNlbGYsIG9yIHNvbWV0aGluZyByYW5nZS1saWtlLCB3aXRoIGF0IGxlYXN0IGEgYHN0YXJ0YC4KCS8vIElmIGV2ZW50IHRpbWVzIGFyZSBkaXNhYmxlZCwgb3IgdGhlIGV2ZW50IGhhcyBubyB0aW1lLCB3aWxsIHJldHVybiBhIGJsYW5rIHN0cmluZy4KCS8vIElmIG5vdCBzcGVjaWZpZWQsIGZvcm1hdFN0ciB3aWxsIGRlZmF1bHQgdG8gdGhlIGV2ZW50VGltZUZvcm1hdCBzZXR0aW5nLAoJLy8gYW5kIGRpc3BsYXlFbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkaXNwbGF5RXZlbnRFbmQgc2V0dGluZy4KCWdldEV2ZW50VGltZVRleHQ6IGZ1bmN0aW9uKHJhbmdlLCBmb3JtYXRTdHIsIGRpc3BsYXlFbmQpIHsKCgkJaWYgKGZvcm1hdFN0ciA9PSBudWxsKSB7CgkJCWZvcm1hdFN0ciA9IHRoaXMuZXZlbnRUaW1lRm9ybWF0OwoJCX0KCgkJaWYgKGRpc3BsYXlFbmQgPT0gbnVsbCkgewoJCQlkaXNwbGF5RW5kID0gdGhpcy5kaXNwbGF5RXZlbnRFbmQ7CgkJfQoKCQlpZiAodGhpcy5kaXNwbGF5RXZlbnRUaW1lICYmIHJhbmdlLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQlpZiAoZGlzcGxheUVuZCAmJiByYW5nZS5lbmQpIHsKCQkJCXJldHVybiB0aGlzLnZpZXcuZm9ybWF0UmFuZ2UocmFuZ2UsIGZvcm1hdFN0cik7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gcmFuZ2Uuc3RhcnQuZm9ybWF0KGZvcm1hdFN0cik7CgkJCX0KCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyaWMgdXRpbGl0eSBmb3IgZ2VuZXJhdGluZyB0aGUgSFRNTCBjbGFzc05hbWVzIGZvciBhbiBldmVudCBzZWdtZW50J3MgZWxlbWVudAoJZ2V0U2VnQ2xhc3NlczogZnVuY3Rpb24oc2VnLCBpc0RyYWdnYWJsZSwgaXNSZXNpemFibGUpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsKCQkJJ2ZjLWV2ZW50JywKCQkJc2VnLmlzU3RhcnQgPyAnZmMtc3RhcnQnIDogJ2ZjLW5vdC1zdGFydCcsCgkJCXNlZy5pc0VuZCA/ICdmYy1lbmQnIDogJ2ZjLW5vdC1lbmQnCgkJXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoKCQlpZiAoaXNEcmFnZ2FibGUpIHsKCQkJY2xhc3Nlcy5wdXNoKCdmYy1kcmFnZ2FibGUnKTsKCQl9CgkJaWYgKGlzUmVzaXphYmxlKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtcmVzaXphYmxlJyk7CgkJfQoKCQkvLyBldmVudCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQ/IGF0dGFjaCBhIGNsYXNzTmFtZS4KCQlpZiAodmlldy5pc0V2ZW50U2VsZWN0ZWQoc2VnLmV2ZW50KSkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXNlbGVjdGVkJyk7CgkJfQoKCQlyZXR1cm4gY2xhc3NlczsKCX0sCgoKCS8vIExpc3Qgb2YgY2xhc3NlcyB0aGF0IHdlcmUgZGVmaW5lZCBieSB0aGUgY2FsbGVyIG9mIHRoZSBBUEkgaW4gc29tZSB3YXkKCWdldFNlZ0N1c3RvbUNsYXNzZXM6IGZ1bmN0aW9uKHNlZykgewoJCXZhciBldmVudCA9IHNlZy5ldmVudDsKCgkJcmV0dXJuIFtdLmNvbmNhdCgKCQkJZXZlbnQuY2xhc3NOYW1lLCAvLyBndWFyYW50ZWVkIHRvIGJlIGFuIGFycmF5CgkJCWV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZS5jbGFzc05hbWUgOiBbXQoJCSk7Cgl9LAoKCgkvLyBVdGlsaXR5IGZvciBnZW5lcmF0aW5nIGV2ZW50IHNraW4tcmVsYXRlZCBDU1MgcHJvcGVydGllcwoJZ2V0U2VnU2tpbkNzczogZnVuY3Rpb24oc2VnKSB7CgkJcmV0dXJuIHsKCQkJJ2JhY2tncm91bmQtY29sb3InOiB0aGlzLmdldFNlZ0JhY2tncm91bmRDb2xvcihzZWcpLAoJCQknYm9yZGVyLWNvbG9yJzogdGhpcy5nZXRTZWdCb3JkZXJDb2xvcihzZWcpLAoJCQljb2xvcjogdGhpcy5nZXRTZWdUZXh0Q29sb3Ioc2VnKQoJCX07Cgl9LAoKCgkvLyBRdWVyaWVzIGZvciBjYWxsZXItc3BlY2lmaWVkIGNvbG9yLCB0aGVuIGZhbGxzIGJhY2sgdG8gZGVmYXVsdAoJZ2V0U2VnQmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJhY2tncm91bmRDb2xvciB8fAoJCQlzZWcuZXZlbnQuY29sb3IgfHwKCQkJdGhpcy5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yKHNlZyk7Cgl9LAoKCglnZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5iYWNrZ3JvdW5kQ29sb3IgfHwKCQkJc291cmNlLmNvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50QmFja2dyb3VuZENvbG9yJykgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRDb2xvcicpOwoJfSwKCgoJLy8gUXVlcmllcyBmb3IgY2FsbGVyLXNwZWNpZmllZCBjb2xvciwgdGhlbiBmYWxscyBiYWNrIHRvIGRlZmF1bHQKCWdldFNlZ0JvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQlyZXR1cm4gc2VnLmV2ZW50LmJvcmRlckNvbG9yIHx8CgkJCXNlZy5ldmVudC5jb2xvciB8fAoJCQl0aGlzLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc291cmNlID0gc2VnLmV2ZW50LnNvdXJjZSB8fCB7fTsKCgkJcmV0dXJuIHNvdXJjZS5ib3JkZXJDb2xvciB8fAoJCQlzb3VyY2UuY29sb3IgfHwKCQkJdGhpcy52aWV3Lm9wdCgnZXZlbnRCb3JkZXJDb2xvcicpIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50Q29sb3InKTsKCX0sCgoKCS8vIFF1ZXJpZXMgZm9yIGNhbGxlci1zcGVjaWZpZWQgY29sb3IsIHRoZW4gZmFsbHMgYmFjayB0byBkZWZhdWx0CglnZXRTZWdUZXh0Q29sb3I6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiBzZWcuZXZlbnQudGV4dENvbG9yIHx8CgkJCXRoaXMuZ2V0U2VnRGVmYXVsdFRleHRDb2xvcihzZWcpOwoJfSwKCgoJZ2V0U2VnRGVmYXVsdFRleHRDb2xvcjogZnVuY3Rpb24oc2VnKSB7CgkJdmFyIHNvdXJjZSA9IHNlZy5ldmVudC5zb3VyY2UgfHwge307CgoJCXJldHVybiBzb3VyY2UudGV4dENvbG9yIHx8CgkJCXRoaXMudmlldy5vcHQoJ2V2ZW50VGV4dENvbG9yJyk7Cgl9LAoKCgkvKiBDb252ZXJ0aW5nIGV2ZW50cyAtPiBldmVudFJhbmdlIC0+IGV2ZW50U3BhbiAtPiBldmVudFNlZ3MKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBhbiBhcnJheSBvZiBzZWdtZW50cyBmb3IgdGhlIGdpdmVuIHNpbmdsZSBldmVudAoJLy8gQ2FuIGFjY2VwdCBhbiBldmVudCAibG9jYXRpb24iIGFzIHdlbGwgKHdoaWNoIG9ubHkgaGFzIHN0YXJ0L2VuZCBhbmQgbm8gYWxsRGF5KQoJZXZlbnRUb1NlZ3M6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFsgZXZlbnQgXSk7Cgl9LAoKCglldmVudFRvU3BhbjogZnVuY3Rpb24oZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5ldmVudFRvU3BhbnMoZXZlbnQpWzBdOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHNwYW5zIChhbHdheXMgdW56b25lZCkgZm9yIHRoZSBnaXZlbiBldmVudC4KCS8vIERvZXMgbm90IGRvIGFueSBpbnZlcnRpbmcgZm9yIGludmVyc2UtYmFja2dyb3VuZCBldmVudHMuCgkvLyBDYW4gYWNjZXB0IGFuIGV2ZW50ICJsb2NhdGlvbiIgYXMgd2VsbCAod2hpY2ggb25seSBoYXMgc3RhcnQvZW5kIGFuZCBubyBhbGxEYXkpCglldmVudFRvU3BhbnM6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5ldmVudFRvUmFuZ2UoZXZlbnQpOwoJCXJldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHJhbmdlLCBldmVudCk7Cgl9LAoKCgoJLy8gQ29udmVydHMgYW4gYXJyYXkgb2YgZXZlbnQgb2JqZWN0cyBpbnRvIGFuIGFycmF5IG9mIGV2ZW50IHNlZ21lbnQgb2JqZWN0cy4KCS8vIEEgY3VzdG9tIGBzZWdTbGljZUZ1bmNgIG1heSBiZSBnaXZlbiBmb3IgYXJiaXRyYXJpbHkgc2xpY2luZyB1cCBldmVudHMuCgkvLyBEb2Vzbid0IGd1YXJhbnRlZSBhbiBvcmRlciBmb3IgdGhlIHJlc3VsdGluZyBhcnJheS4KCWV2ZW50c1RvU2VnczogZnVuY3Rpb24oYWxsRXZlbnRzLCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBldmVudHNCeUlkID0gZ3JvdXBFdmVudHNCeUlkKGFsbEV2ZW50cyk7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJJC5lYWNoKGV2ZW50c0J5SWQsIGZ1bmN0aW9uKGlkLCBldmVudHMpIHsKCQkJdmFyIHJhbmdlcyA9IFtdOwoJCQl2YXIgaTsKCgkJCWZvciAoaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKCQkJCXJhbmdlcy5wdXNoKF90aGlzLmV2ZW50VG9SYW5nZShldmVudHNbaV0pKTsKCQkJfQoKCQkJLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyAodXRpbGl6ZSBvbmx5IHRoZSBmaXJzdCBldmVudCBpbiBjYWxjdWxhdGlvbnMpCgkJCWlmIChpc0ludmVyc2VCZ0V2ZW50KGV2ZW50c1swXSkpIHsKCQkJCXJhbmdlcyA9IF90aGlzLmludmVydFJhbmdlcyhyYW5nZXMpOwoKCQkJCWZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQkJCV90aGlzLmV2ZW50UmFuZ2VUb1NlZ3MocmFuZ2VzW2ldLCBldmVudHNbMF0sIHNlZ1NsaWNlRnVuYykpOwoJCQkJfQoJCQl9CgkJCS8vIG5vcm1hbCBldmVudCByYW5nZXMKCQkJZWxzZSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJc2Vncy5wdXNoLmFwcGx5KHNlZ3MsIC8vIGFwcGVuZCB0bwoJCQkJCQlfdGhpcy5ldmVudFJhbmdlVG9TZWdzKHJhbmdlc1tpXSwgZXZlbnRzW2ldLCBzZWdTbGljZUZ1bmMpKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdW56b25lZCBzdGFydC9lbmQgZGF0ZXMgYW4gZXZlbnQgYXBwZWFycyB0byBvY2N1cHkKCS8vIENhbiBhY2NlcHQgYW4gZXZlbnQgImxvY2F0aW9uIiBhcyB3ZWxsICh3aGljaCBvbmx5IGhhcyBzdGFydC9lbmQgYW5kIG5vIGFsbERheSkKCWV2ZW50VG9SYW5nZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgY2FsZW5kYXIgPSB0aGlzLnZpZXcuY2FsZW5kYXI7CgkJdmFyIHN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCQl2YXIgZW5kID0gKAoJCQkJZXZlbnQuZW5kID8KCQkJCQlldmVudC5lbmQuY2xvbmUoKSA6CgkJCQkJLy8gZGVyaXZlIHRoZSBlbmQgZnJvbSB0aGUgc3RhcnQgYW5kIGFsbERheS4gY29tcHV0ZSBhbGxEYXkgaWYgbmVjZXNzYXJ5CgkJCQkJY2FsZW5kYXIuZ2V0RGVmYXVsdEV2ZW50RW5kKAoJCQkJCQlldmVudC5hbGxEYXkgIT0gbnVsbCA/CgkJCQkJCQlldmVudC5hbGxEYXkgOgoJCQkJCQkJIWV2ZW50LnN0YXJ0Lmhhc1RpbWUoKSwKCQkJCQkJZXZlbnQuc3RhcnQKCQkJCQkpCgkJCSkuc3RyaXBab25lKCk7CgoJCS8vIGhhY2s6IGR5bmFtaWMgbG9jYWxlIGNoYW5nZSBmb3JnZXRzIHRvIHVwYXRlIHN0b3JlZCBldmVudCBsb2NhbGVkCgkJY2FsZW5kYXIubG9jYWxpemVNb21lbnQoc3RhcnQpOwoJCWNhbGVuZGFyLmxvY2FsaXplTW9tZW50KGVuZCk7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50J3MgcmFuZ2UgKHVuem9uZWQgc3RhcnQvZW5kKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZSBpbnRvIHNlZ21lbnRzICh1c2luZyB0aGUgc2VnU2xpY2VGdW5jIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCkKCWV2ZW50UmFuZ2VUb1NlZ3M6IGZ1bmN0aW9uKHJhbmdlLCBldmVudCwgc2VnU2xpY2VGdW5jKSB7CgkJdmFyIHNwYW5zID0gdGhpcy5ldmVudFJhbmdlVG9TcGFucyhyYW5nZSwgZXZlbnQpOwoJCXZhciBzZWdzID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewoJCQlzZWdzLnB1c2guYXBwbHkoc2VncywgLy8gYXBwZW5kIHRvCgkJCQl0aGlzLmV2ZW50U3BhblRvU2VncyhzcGFuc1tpXSwgZXZlbnQsIHNlZ1NsaWNlRnVuYykpOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBHaXZlbiBhbiBldmVudCdzIHVuem9uZWQgZGF0ZSByYW5nZSwgcmV0dXJuIGFuIGFycmF5IG9mICJzcGFuIiBvYmplY3RzLgoJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCglldmVudFJhbmdlVG9TcGFuczogZnVuY3Rpb24ocmFuZ2UsIGV2ZW50KSB7CgkJcmV0dXJuIFsgJC5leHRlbmQoe30sIHJhbmdlKSBdOyAvLyBjb3B5IGludG8gYSBzaW5nbGUtaXRlbSBhcnJheQoJfSwKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCBhbmQgb3RoZXIgbWlzYyBkYXRhKSwgYW5kIHRoZSBldmVudCBpdHNlbGYsCgkvLyBzbGljZXMgaW50byBzZWdtZW50cyBhbmQgYXR0YWNoZXMgZXZlbnQtZGVyaXZlZCBwcm9wZXJ0aWVzIHRvIHRoZW0uCglldmVudFNwYW5Ub1NlZ3M6IGZ1bmN0aW9uKHNwYW4sIGV2ZW50LCBzZWdTbGljZUZ1bmMpIHsKCQl2YXIgc2VncyA9IHNlZ1NsaWNlRnVuYyA/IHNlZ1NsaWNlRnVuYyhzcGFuKSA6IHRoaXMuc3BhblRvU2VncyhzcGFuKTsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZXZlbnQgPSBldmVudDsKCQkJc2VnLmV2ZW50U3RhcnRNUyA9ICtzcGFuLnN0YXJ0OyAvLyBUT0RPOiBub3QgdGhlIGJlc3QgbmFtZSBhZnRlciBtYWtpbmcgc3BhbnMgdW56b25lZAoJCQlzZWcuZXZlbnREdXJhdGlvbk1TID0gc3Bhbi5lbmQgLSBzcGFuLnN0YXJ0OwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvLyBQcm9kdWNlcyBhIG5ldyBhcnJheSBvZiByYW5nZSBvYmplY3RzIHRoYXQgd2lsbCBjb3ZlciBhbGwgdGhlIHRpbWUgTk9UIGNvdmVyZWQgYnkgdGhlIGdpdmVuIHJhbmdlcy4KCS8vIFNJREUgRUZGRUNUOiB3aWxsIG11dGF0ZSB0aGUgZ2l2ZW4gYXJyYXkgYW5kIHdpbGwgdXNlIGl0cyBkYXRlIHJlZmVyZW5jZXMuCglpbnZlcnRSYW5nZXM6IGZ1bmN0aW9uKHJhbmdlcykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB2aWV3U3RhcnQgPSB2aWV3LnN0YXJ0LmNsb25lKCk7IC8vIG5lZWQgYSBjb3B5CgkJdmFyIHZpZXdFbmQgPSB2aWV3LmVuZC5jbG9uZSgpOyAvLyBuZWVkIGEgY29weQoJCXZhciBpbnZlcnNlUmFuZ2VzID0gW107CgkJdmFyIHN0YXJ0ID0gdmlld1N0YXJ0OyAvLyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyByYW5nZS4gdGhlIHN0YXJ0IG9mIHRoZSBuZXcgcmFuZ2UKCQl2YXIgaSwgcmFuZ2U7CgoJCS8vIHJhbmdlcyBuZWVkIHRvIGJlIGluIG9yZGVyLiByZXF1aXJlZCBmb3Igb3VyIGRhdGUtd2Fsa2luZyBhbGdvcml0aG0KCQlyYW5nZXMuc29ydChjb21wYXJlUmFuZ2VzKTsKCgkJZm9yIChpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewoJCQlyYW5nZSA9IHJhbmdlc1tpXTsKCgkJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGJlZm9yZSB0aGUgZXZlbnQgKGlmIHRoZXJlIGlzIGFueSkKCQkJaWYgKHJhbmdlLnN0YXJ0ID4gc3RhcnQpIHsgLy8gY29tcGFyZSBtaWxsaXNlY29uZCB0aW1lIChza2lwIGFueSBhbWJpZyBsb2dpYykKCQkJCWludmVyc2VSYW5nZXMucHVzaCh7CgkJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJCWVuZDogcmFuZ2Uuc3RhcnQKCQkJCX0pOwoJCQl9CgoJCQlzdGFydCA9IHJhbmdlLmVuZDsKCQl9CgoJCS8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGFmdGVyIHRoZSBsYXN0IGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpCgkJaWYgKHN0YXJ0IDwgdmlld0VuZCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKQoJCQlpbnZlcnNlUmFuZ2VzLnB1c2goewoJCQkJc3RhcnQ6IHN0YXJ0LAoJCQkJZW5kOiB2aWV3RW5kCgkJCX0pOwoJCX0KCgkJcmV0dXJuIGludmVyc2VSYW5nZXM7Cgl9LAoKCglzb3J0RXZlbnRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2Vncy5zb3J0KHByb3h5KHRoaXMsICdjb21wYXJlRXZlbnRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIHNlZ21lbnRzIHNob3VsZCB0YWtlIHZpc3VhbCBwcmlvcml0eQoJY29tcGFyZUV2ZW50U2VnczogZnVuY3Rpb24oc2VnMSwgc2VnMikgewoJCXJldHVybiBzZWcxLmV2ZW50U3RhcnRNUyAtIHNlZzIuZXZlbnRTdGFydE1TIHx8IC8vIGVhcmxpZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnREdXJhdGlvbk1TIC0gc2VnMS5ldmVudER1cmF0aW9uTVMgfHwgLy8gdGllPyBsb25nZXIgZXZlbnRzIGdvIGZpcnN0CgkJCXNlZzIuZXZlbnQuYWxsRGF5IC0gc2VnMS5ldmVudC5hbGxEYXkgfHwgLy8gdGllPyBwdXQgYWxsLWRheSBldmVudHMgZmlyc3QgKGJvb2xlYW5zIGNhc3QgdG8gMC8xKQoJCQljb21wYXJlQnlGaWVsZFNwZWNzKHNlZzEuZXZlbnQsIHNlZzIuZXZlbnQsIHRoaXMudmlldy5ldmVudE9yZGVyU3BlY3MpOwoJfQoKfSk7CgoKLyogVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCmZ1bmN0aW9uIHBsdWNrRXZlbnREYXRlUHJvcHMoZXZlbnQpIHsKCXJldHVybiB7CgkJc3RhcnQ6IGV2ZW50LnN0YXJ0LmNsb25lKCksCgkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJYWxsRGF5OiBldmVudC5hbGxEYXkgLy8ga2VlcCBpdCB0aGUgc2FtZQoJfTsKfQpGQy5wbHVja0V2ZW50RGF0ZVByb3BzID0gcGx1Y2tFdmVudERhdGVQcm9wczsKCgpmdW5jdGlvbiBpc0JnRXZlbnQoZXZlbnQpIHsgLy8gcmV0dXJucyB0cnVlIGlmIGJhY2tncm91bmQgT1IgaW52ZXJzZS1iYWNrZ3JvdW5kCgl2YXIgcmVuZGVyaW5nID0gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpOwoJcmV0dXJuIHJlbmRlcmluZyA9PT0gJ2JhY2tncm91bmQnIHx8IHJlbmRlcmluZyA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7Cn0KRkMuaXNCZ0V2ZW50ID0gaXNCZ0V2ZW50OyAvLyBleHBvcnQKCgpmdW5jdGlvbiBpc0ludmVyc2VCZ0V2ZW50KGV2ZW50KSB7CglyZXR1cm4gZ2V0RXZlbnRSZW5kZXJpbmcoZXZlbnQpID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJzsKfQoKCmZ1bmN0aW9uIGdldEV2ZW50UmVuZGVyaW5nKGV2ZW50KSB7CglyZXR1cm4gZmlyc3REZWZpbmVkKChldmVudC5zb3VyY2UgfHwge30pLnJlbmRlcmluZywgZXZlbnQucmVuZGVyaW5nKTsKfQoKCmZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlJZChldmVudHMpIHsKCXZhciBldmVudHNCeUlkID0ge307Cgl2YXIgaSwgZXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewoJCWV2ZW50ID0gZXZlbnRzW2ldOwoJCShldmVudHNCeUlkW2V2ZW50Ll9pZF0gfHwgKGV2ZW50c0J5SWRbZXZlbnQuX2lkXSA9IFtdKSkucHVzaChldmVudCk7Cgl9CgoJcmV0dXJuIGV2ZW50c0J5SWQ7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggbm9uLWludmVydGVkICJyYW5nZXMiIChzZWUgYWJvdmUpIGhhcHBlbiBlYXJsaWVyCmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UxLCByYW5nZTIpIHsKCXJldHVybiByYW5nZTEuc3RhcnQgLSByYW5nZTIuc3RhcnQ7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0Cn0KCgovKiBFeHRlcm5hbC1EcmFnZ2luZy1FbGVtZW50IERhdGEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyBSZXF1aXJlIGFsbCBIVE1MNSBkYXRhLSogYXR0cmlidXRlcyB1c2VkIGJ5IEZ1bGxDYWxlbmRhciB0byBoYXZlIHRoaXMgcHJlZml4LgovLyBBIHZhbHVlIG9mICcnIHdpbGwgcXVlcnkgYXR0cmlidXRlcyBsaWtlIGRhdGEtZXZlbnQuIEEgdmFsdWUgb2YgJ2ZjJyB3aWxsIHF1ZXJ5IGF0dHJpYnV0ZXMgbGlrZSBkYXRhLWZjLWV2ZW50LgpGQy5kYXRhQXR0clByZWZpeCA9ICcnOwoKLy8gR2l2ZW4gYSBqUXVlcnkgZWxlbWVudCB0aGF0IG1pZ2h0IHJlcHJlc2VudCBhIGRyYWdnZWQgRnVsbENhbGVuZGFyIGV2ZW50LCByZXR1cm5zIGFuIGludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZQovLyB0byBiZSB1c2VkIGZvciBFdmVudCBPYmplY3QgY3JlYXRpb24uCi8vIEEgZGVmaW5lZCBgLmV2ZW50UHJvcHNgLCBldmVuIHdoZW4gZW1wdHksIGluZGljYXRlcyB0aGF0IGFuIGV2ZW50IHNob3VsZCBiZSBjcmVhdGVkLgpmdW5jdGlvbiBnZXREcmFnZ2VkRWxNZXRhKGVsKSB7Cgl2YXIgcHJlZml4ID0gRkMuZGF0YUF0dHJQcmVmaXg7Cgl2YXIgZXZlbnRQcm9wczsgLy8gcHJvcGVydGllcyBmb3IgY3JlYXRpbmcgdGhlIGV2ZW50LCBub3QgcmVsYXRlZCB0byBkYXRlL3RpbWUKCXZhciBzdGFydFRpbWU7IC8vIGEgRHVyYXRpb24KCXZhciBkdXJhdGlvbjsKCXZhciBzdGljazsKCglpZiAocHJlZml4KSB7IHByZWZpeCArPSAnLSc7IH0KCWV2ZW50UHJvcHMgPSBlbC5kYXRhKHByZWZpeCArICdldmVudCcpIHx8IG51bGw7CgoJaWYgKGV2ZW50UHJvcHMpIHsKCQlpZiAodHlwZW9mIGV2ZW50UHJvcHMgPT09ICdvYmplY3QnKSB7CgkJCWV2ZW50UHJvcHMgPSAkLmV4dGVuZCh7fSwgZXZlbnRQcm9wcyk7IC8vIG1ha2UgYSBjb3B5CgkJfQoJCWVsc2UgeyAvLyBzb21ldGhpbmcgbGlrZSAxIG9yIHRydWUuIHN0aWxsIHNpZ25hbCBldmVudCBjcmVhdGlvbgoJCQlldmVudFByb3BzID0ge307CgkJfQoKCQkvLyBwbHVjayBzcGVjaWFsLWNhc2VkIGRhdGUvdGltZSBwcm9wZXJ0aWVzCgkJc3RhcnRUaW1lID0gZXZlbnRQcm9wcy5zdGFydDsKCQlpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZXZlbnRQcm9wcy50aW1lOyB9IC8vIGFjY2VwdCAndGltZScgYXMgd2VsbAoJCWR1cmF0aW9uID0gZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlzdGljayA9IGV2ZW50UHJvcHMuc3RpY2s7CgkJZGVsZXRlIGV2ZW50UHJvcHMuc3RhcnQ7CgkJZGVsZXRlIGV2ZW50UHJvcHMudGltZTsKCQlkZWxldGUgZXZlbnRQcm9wcy5kdXJhdGlvbjsKCQlkZWxldGUgZXZlbnRQcm9wcy5zdGljazsKCX0KCgkvLyBmYWxsYmFjayB0byBzdGFuZGFsb25lIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGRhdGUvdGltZSBwcm9wZXJ0aWVzCglpZiAoc3RhcnRUaW1lID09IG51bGwpIHsgc3RhcnRUaW1lID0gZWwuZGF0YShwcmVmaXggKyAnc3RhcnQnKTsgfQoJaWYgKHN0YXJ0VGltZSA9PSBudWxsKSB7IHN0YXJ0VGltZSA9IGVsLmRhdGEocHJlZml4ICsgJ3RpbWUnKTsgfSAvLyBhY2NlcHQgJ3RpbWUnIGFzIHdlbGwKCWlmIChkdXJhdGlvbiA9PSBudWxsKSB7IGR1cmF0aW9uID0gZWwuZGF0YShwcmVmaXggKyAnZHVyYXRpb24nKTsgfQoJaWYgKHN0aWNrID09IG51bGwpIHsgc3RpY2sgPSBlbC5kYXRhKHByZWZpeCArICdzdGljaycpOyB9CgoJLy8gbWFzc2FnZSBpbnRvIGNvcnJlY3QgZGF0YSB0eXBlcwoJc3RhcnRUaW1lID0gc3RhcnRUaW1lICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oc3RhcnRUaW1lKSA6IG51bGw7CglkdXJhdGlvbiA9IGR1cmF0aW9uICE9IG51bGwgPyBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pIDogbnVsbDsKCXN0aWNrID0gQm9vbGVhbihzdGljayk7CgoJcmV0dXJuIHsgZXZlbnRQcm9wczogZXZlbnRQcm9wcywgc3RhcnRUaW1lOiBzdGFydFRpbWUsIGR1cmF0aW9uOiBkdXJhdGlvbiwgc3RpY2s6IHN0aWNrIH07Cn0KCgo7OwoKLyoKQSBzZXQgb2YgcmVuZGVyaW5nIGFuZCBkYXRlLXJlbGF0ZWQgbWV0aG9kcyBmb3IgYSB2aXN1YWwgY29tcG9uZW50IGNvbXByaXNlZCBvZiBvbmUgb3IgbW9yZSByb3dzIG9mIGRheSBjb2x1bW5zLgpQcmVyZXF1aXNpdGU6IHRoZSBvYmplY3QgYmVpbmcgbWl4ZWQgaW50byBuZWVkcyB0byBiZSBhICpHcmlkKgoqLwp2YXIgRGF5VGFibGVNaXhpbiA9IEZDLkRheVRhYmxlTWl4aW4gPSB7CgoJYnJlYWtPbldlZWtzOiBmYWxzZSwgLy8gc2hvdWxkIGNyZWF0ZSBhIG5ldyByb3cgZm9yIGVhY2ggd2Vlaz8KCWRheURhdGVzOiBudWxsLCAvLyB3aG9sZS1kYXkgZGF0ZXMgZm9yIGVhY2ggY29sdW1uLiBsZWZ0IHRvIHJpZ2h0CglkYXlJbmRpY2VzOiBudWxsLCAvLyBmb3IgZWFjaCBkYXkgZnJvbSBzdGFydCwgdGhlIG9mZnNldAoJZGF5c1BlclJvdzogbnVsbCwKCXJvd0NudDogbnVsbCwKCWNvbENudDogbnVsbCwKCWNvbEhlYWRGb3JtYXQ6IG51bGwsCgoKCS8vIFBvcHVsYXRlcyBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgZGF0ZSBjYWxjdWxhdGlvbiBhbmQgcmVuZGVyaW5nCgl1cGRhdGVEYXlUYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCk7CgkJdmFyIGRheUluZGV4ID0gLTE7CgkJdmFyIGRheUluZGljZXMgPSBbXTsKCQl2YXIgZGF5RGF0ZXMgPSBbXTsKCQl2YXIgZGF5c1BlclJvdzsKCQl2YXIgZmlyc3REYXk7CgkJdmFyIHJvd0NudDsKCgkJd2hpbGUgKGRhdGUuaXNCZWZvcmUodGhpcy5lbmQpKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmQKCQkJaWYgKHZpZXcuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlcwoJCQl9CgkJCWVsc2UgewoJCQkJZGF5SW5kZXgrKzsKCQkJCWRheUluZGljZXMucHVzaChkYXlJbmRleCk7CgkJCQlkYXlEYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CgkJCX0KCQkJZGF0ZS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCWlmICh0aGlzLmJyZWFrT25XZWVrcykgewoJCQkvLyBjb3VudCBjb2x1bW5zIHVudGlsIHRoZSBkYXktb2Ytd2VlayByZXBlYXRzCgkJCWZpcnN0RGF5ID0gZGF5RGF0ZXNbMF0uZGF5KCk7CgkJCWZvciAoZGF5c1BlclJvdyA9IDE7IGRheXNQZXJSb3cgPCBkYXlEYXRlcy5sZW5ndGg7IGRheXNQZXJSb3crKykgewoJCQkJaWYgKGRheURhdGVzW2RheXNQZXJSb3ddLmRheSgpID09IGZpcnN0RGF5KSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJcm93Q250ID0gTWF0aC5jZWlsKGRheURhdGVzLmxlbmd0aCAvIGRheXNQZXJSb3cpOwoJCX0KCQllbHNlIHsKCQkJcm93Q250ID0gMTsKCQkJZGF5c1BlclJvdyA9IGRheURhdGVzLmxlbmd0aDsKCQl9CgoJCXRoaXMuZGF5RGF0ZXMgPSBkYXlEYXRlczsKCQl0aGlzLmRheUluZGljZXMgPSBkYXlJbmRpY2VzOwoJCXRoaXMuZGF5c1BlclJvdyA9IGRheXNQZXJSb3c7CgkJdGhpcy5yb3dDbnQgPSByb3dDbnQ7CgkJCgkJdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKTsKCX0sCgoKCS8vIENvbXB1dGVzIGFuZCBhc3NpZ25lZCB0aGUgY29sQ250IHByb3BlcnR5IGFuZCB1cGRhdGVzIGFueSBvcHRpb25zIHRoYXQgbWF5IGJlIGNvbXB1dGVkIGZyb20gaXQKCXVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDbnQgPSB0aGlzLmNvbXB1dGVDb2xDbnQoKTsKCQl0aGlzLmNvbEhlYWRGb3JtYXQgPSB0aGlzLnZpZXcub3B0KCdjb2x1bW5Gb3JtYXQnKSB8fCB0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCk7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIGhvdyBtYW55IGNvbHVtbnMgdGhlcmUgc2hvdWxkIGJlIGluIHRoZSB0YWJsZQoJY29tcHV0ZUNvbENudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZGF5c1BlclJvdzsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBhbWJpZ3VvdXNseS10aW1lZCBtb21lbnQgZm9yIHRoZSBnaXZlbiBjZWxsCglnZXRDZWxsRGF0ZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gdGhpcy5kYXlEYXRlc1sKCQkJCXRoaXMuZ2V0Q2VsbERheUluZGV4KHJvdywgY29sKQoJCQldLmNsb25lKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgYW1iaWd1b3VzbHktdGltZWQgZGF0ZSByYW5nZSBmb3IgdGhlIGdpdmVuIGNlbGwKCWdldENlbGxSYW5nZTogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQl2YXIgZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCgkJcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgZ3JpZCAoMC1iYXNlZCkKCWdldENlbGxEYXlJbmRleDogZnVuY3Rpb24ocm93LCBjb2wpIHsKCQlyZXR1cm4gcm93ICogdGhpcy5kYXlzUGVyUm93ICsgdGhpcy5nZXRDb2xEYXlJbmRleChjb2wpOwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgbnVtbmVyIG9mIGRheSBjZWxscywgY2hyb25vbG9naWNhbGx5LCBmcm9tIHRoZSBmaXJzdCBjZWxsIGluICphbnkgZ2l2ZW4gcm93KgoJZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewoJCWlmICh0aGlzLmlzUlRMKSB7CgkJCXJldHVybiB0aGlzLmNvbENudCAtIDEgLSBjb2w7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gY29sOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGEgZGF0ZSwgcmV0dXJucyBpdHMgY2hyb25vbG9jaWFsIGNlbGwtaW5kZXggZnJvbSB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgZ3JpZC4KCS8vIElmIHRoZSBkYXRlIGxpZXMgYmV0d2VlbiBjZWxscyAoYmVjYXVzZSBvZiBoaWRkZW5EYXlzKSwgcmV0dXJucyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJldHdlZW4gb2Zmc2V0cy4KCS8vIElmIGJlZm9yZSB0aGUgZmlyc3Qgb2Zmc2V0LCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyLgoJLy8gSWYgYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0LCByZXR1cm5zIGFuIG9mZnNldCBwYXN0IHRoZSBsYXN0IGNlbGwgb2Zmc2V0LgoJLy8gT25seSB3b3JrcyBmb3IgKnN0YXJ0KiBkYXRlcyBvZiBjZWxscy4gV2lsbCBub3Qgd29yayBmb3IgZXhjbHVzaXZlIGVuZCBkYXRlcyBmb3IgY2VsbHMuCglnZXREYXRlRGF5SW5kZXg6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgZGF5SW5kaWNlcyA9IHRoaXMuZGF5SW5kaWNlczsKCQl2YXIgZGF5T2Zmc2V0ID0gZGF0ZS5kaWZmKHRoaXMuc3RhcnQsICdkYXlzJyk7CgoJCWlmIChkYXlPZmZzZXQgPCAwKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzWzBdIC0gMTsKCQl9CgkJZWxzZSBpZiAoZGF5T2Zmc2V0ID49IGRheUluZGljZXMubGVuZ3RoKSB7CgkJCXJldHVybiBkYXlJbmRpY2VzW2RheUluZGljZXMubGVuZ3RoIC0gMV0gKyAxOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuIGRheUluZGljZXNbZGF5T2Zmc2V0XTsKCQl9Cgl9LAoKCgkvKiBPcHRpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlQ29sSGVhZEZvcm1hdDogZnVuY3Rpb24oKSB7CgkJLy8gaWYgbW9yZSB0aGFuIG9uZSB3ZWVrIHJvdywgb3IgaWYgdGhlcmUgYXJlIGEgbG90IG9mIGNvbHVtbnMgd2l0aCBub3QgbXVjaCBzcGFjZSwKCQkvLyBwdXQganVzdCB0aGUgZGF5IG51bWJlcnMgd2lsbCBiZSBpbiBlYWNoIGNlbGwKCQlpZiAodGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID4gMTApIHsKCQkJcmV0dXJuICdkZGQnOyAvLyAiU2F0IgoJCX0KCQkvLyBtdWx0aXBsZSBkYXlzLCBzbyBmdWxsIHNpbmdsZSBkYXRlIHN0cmluZyBXT04nVCBiZSBpbiB0aXRsZSB0ZXh0CgkJZWxzZSBpZiAodGhpcy5jb2xDbnQgPiAxKSB7CgkJCXJldHVybiB0aGlzLnZpZXcub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7IC8vICJTYXQgMTIvMTAiCgkJfQoJCS8vIHNpbmdsZSBkYXksIHNvIGZ1bGwgc2luZ2xlIGRhdGUgc3RyaW5nIHdpbGwgcHJvYmFibHkgYmUgaW4gdGl0bGUgdGV4dAoJCWVsc2UgewoJCQlyZXR1cm4gJ2RkZGQnOyAvLyAiU2F0dXJkYXkiCgkJfQoJfSwKCgoJLyogU2xpY2luZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2xpY2VzIHVwIGEgZGF0ZSByYW5nZSBpbnRvIGEgc2VnbWVudCBmb3IgZXZlcnkgd2Vlay1yb3cgaXQgaW50ZXJzZWN0cyB3aXRoCglzbGljZVJhbmdlQnlSb3c6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJdmFyIGRheXNQZXJSb3cgPSB0aGlzLmRheXNQZXJSb3c7CgkJdmFyIG5vcm1hbFJhbmdlID0gdGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZShyYW5nZSk7IC8vIG1ha2Ugd2hvbGUtZGF5IHJhbmdlLCBjb25zaWRlcmluZyBuZXh0RGF5VGhyZXNob2xkCgkJdmFyIHJhbmdlRmlyc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5zdGFydCk7IC8vIGluY2x1c2l2ZSBmaXJzdCBpbmRleAoJCXZhciByYW5nZUxhc3QgPSB0aGlzLmdldERhdGVEYXlJbmRleChub3JtYWxSYW5nZS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCAnZGF5cycpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXgKCQl2YXIgc2VncyA9IFtdOwoJCXZhciByb3c7CgkJdmFyIHJvd0ZpcnN0LCByb3dMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBjdXJyZW50IHJvdwoJCXZhciBzZWdGaXJzdCwgc2VnTGFzdDsgLy8gaW5jbHVzaXZlIGRheS1pbmRleCByYW5nZSBmb3Igc2VnbWVudAoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHRoaXMucm93Q250OyByb3crKykgewoJCQlyb3dGaXJzdCA9IHJvdyAqIGRheXNQZXJSb3c7CgkJCXJvd0xhc3QgPSByb3dGaXJzdCArIGRheXNQZXJSb3cgLSAxOwoKCQkJLy8gaW50ZXJzZWN0IHNlZ21lbnQncyBvZmZzZXQgcmFuZ2Ugd2l0aCB0aGUgcm93J3MKCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCByb3dGaXJzdCk7CgkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIHJvd0xhc3QpOwoKCQkJLy8gZGVhbCB3aXRoIGluLWJldHdlZW4gaW5kaWNlcwoJCQlzZWdGaXJzdCA9IE1hdGguY2VpbChzZWdGaXJzdCk7IC8vIGluLWJldHdlZW4gc3RhcnRzIHJvdW5kIHRvIG5leHQgY2VsbAoJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJaWYgKHNlZ0ZpcnN0IDw9IHNlZ0xhc3QpIHsgLy8gd2FzIHRoZXJlIGFueSBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgY3VycmVudCByb3c/CgkJCQlzZWdzLnB1c2goewoJCQkJCXJvdzogcm93LAoKCQkJCQkvLyBub3JtYWxpemUgdG8gc3RhcnQgb2Ygcm93CgkJCQkJZmlyc3RSb3dEYXlJbmRleDogc2VnRmlyc3QgLSByb3dGaXJzdCwKCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJLy8gbXVzdCBiZSBtYXRjaGluZyBpbnRlZ2VycyB0byBiZSB0aGUgc2VnbWVudCdzIHN0YXJ0L2VuZAoJCQkJCWlzU3RhcnQ6IHNlZ0ZpcnN0ID09PSByYW5nZUZpcnN0LAoJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCX0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIFNsaWNlcyB1cCBhIGRhdGUgcmFuZ2UgaW50byBhIHNlZ21lbnQgZm9yIGV2ZXJ5IGRheS1jZWxsIGl0IGludGVyc2VjdHMgd2l0aC4KCS8vIFRPRE86IG1ha2UgbW9yZSBEUlkgd2l0aCBzbGljZVJhbmdlQnlSb3cgc29tZWhvdy4KCXNsaWNlUmFuZ2VCeURheTogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgZGF5c1BlclJvdyA9IHRoaXMuZGF5c1BlclJvdzsKCQl2YXIgbm9ybWFsUmFuZ2UgPSB0aGlzLnZpZXcuY29tcHV0ZURheVJhbmdlKHJhbmdlKTsgLy8gbWFrZSB3aG9sZS1kYXkgcmFuZ2UsIGNvbnNpZGVyaW5nIG5leHREYXlUaHJlc2hvbGQKCQl2YXIgcmFuZ2VGaXJzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4CgkJdmFyIHJhbmdlTGFzdCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEsICdkYXlzJykpOyAvLyBpbmNsdXNpdmUgbGFzdCBpbmRleAoJCXZhciBzZWdzID0gW107CgkJdmFyIHJvdzsKCQl2YXIgcm93Rmlyc3QsIHJvd0xhc3Q7IC8vIGluY2x1c2l2ZSBkYXktaW5kZXggcmFuZ2UgZm9yIGN1cnJlbnQgcm93CgkJdmFyIGk7CgkJdmFyIHNlZ0ZpcnN0LCBzZWdMYXN0OyAvLyBpbmNsdXNpdmUgZGF5LWluZGV4IHJhbmdlIGZvciBzZWdtZW50CgoJCWZvciAocm93ID0gMDsgcm93IDwgdGhpcy5yb3dDbnQ7IHJvdysrKSB7CgkJCXJvd0ZpcnN0ID0gcm93ICogZGF5c1BlclJvdzsKCQkJcm93TGFzdCA9IHJvd0ZpcnN0ICsgZGF5c1BlclJvdyAtIDE7CgoJCQlmb3IgKGkgPSByb3dGaXJzdDsgaSA8PSByb3dMYXN0OyBpKyspIHsKCgkJCQkvLyBpbnRlcnNlY3Qgc2VnbWVudCdzIG9mZnNldCByYW5nZSB3aXRoIHRoZSByb3cncwoJCQkJc2VnRmlyc3QgPSBNYXRoLm1heChyYW5nZUZpcnN0LCBpKTsKCQkJCXNlZ0xhc3QgPSBNYXRoLm1pbihyYW5nZUxhc3QsIGkpOwoKCQkJCS8vIGRlYWwgd2l0aCBpbi1iZXR3ZWVuIGluZGljZXMKCQkJCXNlZ0ZpcnN0ID0gTWF0aC5jZWlsKHNlZ0ZpcnN0KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsCgkJCQlzZWdMYXN0ID0gTWF0aC5mbG9vcihzZWdMYXN0KTsgLy8gaW4tYmV0d2VlbiBlbmRzIHJvdW5kIHRvIHByZXYgY2VsbAoKCQkJCWlmIChzZWdGaXJzdCA8PSBzZWdMYXN0KSB7IC8vIHdhcyB0aGVyZSBhbnkgaW50ZXJzZWN0aW9uIHdpdGggdGhlIGN1cnJlbnQgcm93PwoJCQkJCXNlZ3MucHVzaCh7CgkJCQkJCXJvdzogcm93LAoKCQkJCQkJLy8gbm9ybWFsaXplIHRvIHN0YXJ0IG9mIHJvdwoJCQkJCQlmaXJzdFJvd0RheUluZGV4OiBzZWdGaXJzdCAtIHJvd0ZpcnN0LAoJCQkJCQlsYXN0Um93RGF5SW5kZXg6IHNlZ0xhc3QgLSByb3dGaXJzdCwKCgkJCQkJCS8vIG11c3QgYmUgbWF0Y2hpbmcgaW50ZWdlcnMgdG8gYmUgdGhlIHNlZ21lbnQncyBzdGFydC9lbmQKCQkJCQkJaXNTdGFydDogc2VnRmlyc3QgPT09IHJhbmdlRmlyc3QsCgkJCQkJCWlzRW5kOiBzZWdMYXN0ID09PSByYW5nZUxhc3QKCQkJCQl9KTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIZWFkZXIgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIZWFkSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1yb3cgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJJzx0aGVhZD4nICsKCQkJCQkJdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkgKwoJCQkJCSc8L3RoZWFkPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJIZWFkVHJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVySGVhZEludHJvSHRtbCgpKSArCgkJCQl0aGlzLnJlbmRlckhlYWREYXRlQ2VsbHNIdG1sKCkgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJIZWFkRGF0ZUNlbGxzSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUoMCwgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwoZGF0ZSkpOwoJCX0KCgkJcmV0dXJuIGh0bWxzLmpvaW4oJycpOwoJfSwKCgoJLy8gVE9ETzogd2hlbiBpbnRlcm5hbEFwaVZlcnNpb24sIGFjY2VwdCBhbiBvYmplY3QgZm9yIEhUTUwgYXR0cmlidXRlcwoJLy8gKGNvbHNwYW4gc2hvdWxkIGJlIG5vIGRpZmZlcmVudCkKCXJlbmRlckhlYWREYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIGNvbHNwYW4sIG90aGVyQXR0cnMpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICcnICsKCQkJJzx0aCBjbGFzcz0iZmMtZGF5LWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICcgZmMtJyArIGRheUlEc1tkYXRlLmRheSgpXSArICciJyArCgkJCQkodGhpcy5yb3dDbnQgPT09IDEgPwoJCQkJCScgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6CgkJCQkJJycpICsKCQkJCShjb2xzcGFuID4gMSA/CgkJCQkJJyBjb2xzcGFuPSInICsgY29sc3BhbiArICciJyA6CgkJCQkJJycpICsKCQkJCShvdGhlckF0dHJzID8KCQkJCQknICcgKyBvdGhlckF0dHJzIDoKCQkJCQknJykgKwoJCQkJJz4nICsKCQkJCS8vIGRvbid0IG1ha2UgYSBsaW5rIGlmIHRoZSBoZWFkaW5nIGNvdWxkIHJlcHJlc2VudCBtdWx0aXBsZSBkYXlzLCBvciBpZiB0aGVyZSdzIG9ubHkgb25lIGRheSAoZm9yY2VPZmYpCgkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoCgkJCQkJeyBkYXRlOiBkYXRlLCBmb3JjZU9mZjogdGhpcy5yb3dDbnQgPiAxIHx8IHRoaXMuY29sQ250ID09PSAxIH0sCgkJCQkJaHRtbEVzY2FwZShkYXRlLmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSAvLyBpbm5lciBIVE1MCgkJCQkpICsKCQkJJzwvdGg+JzsKCX0sCgoKCS8qIEJhY2tncm91bmQgUmVuZGVyaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCZ1RySHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuICcnICsKCQkJJzx0cj4nICsKCQkJCSh0aGlzLmlzUlRMID8gJycgOiB0aGlzLnJlbmRlckJnSW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyQmdDZWxsc0h0bWwocm93KSArCgkJCQkodGhpcy5pc1JUTCA/IHRoaXMucmVuZGVyQmdJbnRyb0h0bWwocm93KSA6ICcnKSArCgkJCSc8L3RyPic7Cgl9LAoKCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7IC8vIGZhbGwgYmFjayB0byBnZW5lcmljCgl9LAoKCglyZW5kZXJCZ0NlbGxzSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJdmFyIGh0bWxzID0gW107CgkJdmFyIGNvbCwgZGF0ZTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJZGF0ZSA9IHRoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQlodG1scy5wdXNoKHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlKSk7CgkJfQoKCQlyZXR1cm4gaHRtbHMuam9pbignJyk7Cgl9LAoKCglyZW5kZXJCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCBvdGhlckF0dHJzKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGNsYXNzZXMgPSB0aGlzLmdldERheUNsYXNzZXMoZGF0ZSk7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5Jywgdmlldy53aWRnZXRDb250ZW50Q2xhc3MpOwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyInICsKCQkJJyBkYXRhLWRhdGU9IicgKyBkYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpICsgJyInICsgLy8gaWYgZGF0ZSBoYXMgYSB0aW1lLCB3b24ndCBmb3JtYXQgaXQKCQkJKG90aGVyQXR0cnMgPwoJCQkJJyAnICsgb3RoZXJBdHRycyA6CgkJCQknJykgKwoJCQknPjwvdGQ+JzsKCX0sCgoKCS8qIEdlbmVyaWMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyB0aGUgZGVmYXVsdCBIVE1MIGludHJvIGZvciBhbnkgcm93LiBVc2VyIGNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gVE9ETzogYSBnZW5lcmljIG1ldGhvZCBmb3IgZGVhbGluZyB3aXRoIDx0cj4sIFJUTCwgaW50cm8KCS8vIHdoZW4gaW5jcmVtZW50IGludGVybmFsQXBpVmVyc2lvbgoJLy8gd3JhcFRyIChzY2hlZHVsZXIpCgoKCS8qIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBBcHBsaWVzIHRoZSBnZW5lcmljICJpbnRybyIgYW5kICJvdXRybyIgSFRNTCB0byB0aGUgZ2l2ZW4gY2VsbHMuCgkvLyBJbnRybyBtZWFucyB0aGUgbGVmdG1vc3QgY2VsbCB3aGVuIHRoZSBjYWxlbmRhciBpcyBMVFIgYW5kIHRoZSByaWdodG1vc3QgY2VsbCB3aGVuIFJUTC4gVmljZS12ZXJzYSBmb3Igb3V0cm8uCglib29rZW5kQ2VsbHM6IGZ1bmN0aW9uKHRyRWwpIHsKCQl2YXIgaW50cm9IdG1sID0gdGhpcy5yZW5kZXJJbnRyb0h0bWwoKTsKCgkJaWYgKGludHJvSHRtbCkgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJdHJFbC5hcHBlbmQoaW50cm9IdG1sKTsKCQkJfQoJCQllbHNlIHsKCQkJCXRyRWwucHJlcGVuZChpbnRyb0h0bWwpOwoJCQl9CgkJfQoJfQoKfTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgYSBncmlkIG9mIHdob2xlLWRheXMgdGhhdCBydW5zIGhvcml6b250YWxseS4gVGhlcmUgY2FuIGJlIG11bHRpcGxlIHJvd3MsIG9uZSBwZXIgd2Vlay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgRGF5R3JpZCA9IEZDLkRheUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJbnVtYmVyc1Zpc2libGU6IGZhbHNlLCAvLyBzaG91bGQgcmVuZGVyIGEgcm93IGZvciBkYXkvd2VlayBudW1iZXJzPyBzZXQgYnkgb3V0c2lkZSB2aWV3LiBUT0RPOiBtYWtlIGludGVybmFsCglib3R0b21Db29yZFBhZGRpbmc6IDAsIC8vIGhhY2sgZm9yIGV4dGVuZGluZyB0aGUgaGl0IGFyZWEgZm9yIHRoZSBsYXN0IHJvdyBvZiB0aGUgY29vcmRpbmF0ZSBncmlkCgoJcm93RWxzOiBudWxsLCAvLyBzZXQgb2YgZmFrZSByb3cgZWxlbWVudHMKCWNlbGxFbHM6IG51bGwsIC8vIHNldCBvZiB3aG9sZS1kYXkgZWxlbWVudHMgY29tcHJpc2luZyB0aGUgcm93J3MgYmFja2dyb3VuZAoJaGVscGVyRWxzOiBudWxsLCAvLyBzZXQgb2YgY2VsbCBza2VsZXRvbiBlbGVtZW50cyBmb3IgcmVuZGVyaW5nIHRoZSBtb2NrIGV2ZW50ICJoZWxwZXIiCgoJcm93Q29vcmRDYWNoZTogbnVsbCwKCWNvbENvb3JkQ2FjaGU6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIHJvd3MgYW5kIGNvbHVtbnMgaW50byB0aGUgY29tcG9uZW50J3MgYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZC4KCS8vIGlzUmlnaWQgZGV0ZXJtaW5zIHdoZXRoZXIgdGhlIGluZGl2aWR1YWwgcm93cyBzaG91bGQgaWdub3JlIHRoZSBjb250ZW50cyBhbmQgYmUgYSBjb25zdGFudCBoZWlnaHQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQgYW5kIHJvd0NudC4gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb21wb25lbnQgc2hvdWxkIHByb2JhYmx5IGJlIHNlbGYtc3VmZmljaWVudC4KCXJlbmRlckRhdGVzOiBmdW5jdGlvbihpc1JpZ2lkKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHJvd0NudCA9IHRoaXMucm93Q250OwoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgaHRtbCA9ICcnOwoJCXZhciByb3c7CgkJdmFyIGNvbDsKCgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWh0bWwgKz0gdGhpcy5yZW5kZXJEYXlSb3dIdG1sKHJvdywgaXNSaWdpZCk7CgkJfQoJCXRoaXMuZWwuaHRtbChodG1sKTsKCgkJdGhpcy5yb3dFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1yb3cnKTsKCQl0aGlzLmNlbGxFbHMgPSB0aGlzLmVsLmZpbmQoJy5mYy1kYXknKTsKCgkJdGhpcy5yb3dDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMucm93RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgkJdGhpcy5jb2xDb29yZENhY2hlID0gbmV3IENvb3JkQ2FjaGUoewoJCQllbHM6IHRoaXMuY2VsbEVscy5zbGljZSgwLCB0aGlzLmNvbENudCksIC8vIG9ubHkgdGhlIGZpcnN0IHJvdwoJCQlpc0hvcml6b250YWw6IHRydWUKCQl9KTsKCgkJLy8gdHJpZ2dlciBkYXlSZW5kZXIgd2l0aCBlYWNoIGNlbGwncyBlbGVtZW50CgkJZm9yIChyb3cgPSAwOyByb3cgPCByb3dDbnQ7IHJvdysrKSB7CgkJCWZvciAoY29sID0gMDsgY29sIDwgY29sQ250OyBjb2wrKykgewoJCQkJdmlldy50cmlnZ2VyKAoJCQkJCSdkYXlSZW5kZXInLAoJCQkJCW51bGwsCgkJCQkJdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCksCgkJCQkJdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpCgkJCQkpOwoJCQl9CgkJfQoJfSwKCgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW1vdmVTZWdQb3BvdmVyKCk7Cgl9LAoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VncyA9IHRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKHRydWUpOyAvLyB3aG9sZURheT10cnVlCgkJdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckZpbGwoJ2J1c2luZXNzSG91cnMnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgcm93LCB3aGljaCBpcyBhIGRpdiB0aGF0IHdyYXBzIGEgdGFibGUuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCXJlbmRlckRheVJvd0h0bWw6IGZ1bmN0aW9uKHJvdywgaXNSaWdpZCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBjbGFzc2VzID0gWyAnZmMtcm93JywgJ2ZjLXdlZWsnLCB2aWV3LndpZGdldENvbnRlbnRDbGFzcyBdOwoKCQlpZiAoaXNSaWdpZCkgewoJCQljbGFzc2VzLnB1c2goJ2ZjLXJpZ2lkJyk7CgkJfQoKCQlyZXR1cm4gJycgKwoJCQknPGRpdiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtYmciPicgKwoJCQkJCSc8dGFibGU+JyArCgkJCQkJCXRoaXMucmVuZGVyQmdUckh0bWwocm93KSArCgkJCQkJJzwvdGFibGU+JyArCgkJCQknPC9kaXY+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtY29udGVudC1za2VsZXRvbiI+JyArCgkJCQkJJzx0YWJsZT4nICsKCQkJCQkJKHRoaXMubnVtYmVyc1Zpc2libGUgPwoJCQkJCQkJJzx0aGVhZD4nICsKCQkJCQkJCQl0aGlzLnJlbmRlck51bWJlclRySHRtbChyb3cpICsKCQkJCQkJCSc8L3RoZWFkPicgOgoJCQkJCQkJJycKCQkJCQkJCSkgKwoJCQkJCSc8L3RhYmxlPicgKwoJCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JzsKCX0sCgoKCS8qIEdyaWQgTnVtYmVyIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyTnVtYmVyVHJIdG1sOiBmdW5jdGlvbihyb3cpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRyPicgKwoJCQkJKHRoaXMuaXNSVEwgPyAnJyA6IHRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHJvdykpICsKCQkJCXRoaXMucmVuZGVyTnVtYmVyQ2VsbHNIdG1sKHJvdykgKwoJCQkJKHRoaXMuaXNSVEwgPyB0aGlzLnJlbmRlck51bWJlckludHJvSHRtbChyb3cpIDogJycpICsKCQkJJzwvdHI+JzsKCX0sCgoKCXJlbmRlck51bWJlckludHJvSHRtbDogZnVuY3Rpb24ocm93KSB7CgkJcmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCk7Cgl9LAoKCglyZW5kZXJOdW1iZXJDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciBodG1scyA9IFtdOwoJCXZhciBjb2wsIGRhdGU7CgoJCWZvciAoY29sID0gMDsgY29sIDwgdGhpcy5jb2xDbnQ7IGNvbCsrKSB7CgkJCWRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKCQkJaHRtbHMucHVzaCh0aGlzLnJlbmRlck51bWJlckNlbGxIdG1sKGRhdGUpKTsKCQl9CgoJCXJldHVybiBodG1scy5qb2luKCcnKTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIDx0ZD5zIG9mIHRoZSAibnVtYmVyIiByb3cgaW4gdGhlIERheUdyaWQncyBjb250ZW50IHNrZWxldG9uLgoJLy8gVGhlIG51bWJlciByb3cgd2lsbCBvbmx5IGV4aXN0IGlmIGVpdGhlciBkYXkgbnVtYmVycyBvciB3ZWVrIG51bWJlcnMgYXJlIHR1cm5lZCBvbi4KCXJlbmRlck51bWJlckNlbGxIdG1sOiBmdW5jdGlvbihkYXRlKSB7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgY2xhc3NlczsKCQl2YXIgd2Vla0NhbGNGaXJzdERvVzsKCgkJaWYgKCF0aGlzLnZpZXcuZGF5TnVtYmVyc1Zpc2libGUgJiYgIXRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIG5vIG51bWJlcnMgaW4gZGF5IGNlbGwgKHdlZWsgbnVtYmVyIG11c3QgYmUgYWxvbmcgdGhlIHNpZGUpCgkJCXJldHVybiAnPHRkLz4nOyAvLyAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgc3BhY2UgYWJvdmUgZXZlbnRzIDooCgkJfQoKCQljbGFzc2VzID0gdGhpcy5nZXREYXlDbGFzc2VzKGRhdGUpOwoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LXRvcCcpOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJLy8gVG8gZGV0ZXJtaW5lIHRoZSBkYXkgb2Ygd2VlayBudW1iZXIgY2hhbmdlIHVuZGVyIElTTywgd2UgY2Fubm90CgkJCS8vIHJlbHkgb24gbW9tZW50LmpzIG1ldGhvZHMgc3VjaCBhcyBmaXJzdERheU9mV2VlaygpIG9yIHdlZWtkYXkoKSwKCQkJLy8gYmVjYXVzZSB0aGV5IHJlbHkgb24gdGhlIGxvY2FsZSdzIGRvdyAocG9zc2libHkgb3ZlcnJpZGRlbiBieQoJCQkvLyBvdXIgZmlyc3REYXkgb3B0aW9uKSwgd2hpY2ggbWF5IG5vdCBiZSBNb25kYXkuIFdlIGNhbm5vdCBjaGFuZ2UKCQkJLy8gZG93LCBiZWNhdXNlIHRoYXQgd291bGQgYWZmZWN0IHRoZSBjYWxlbmRhciBzdGFydCBkYXkgYXMgd2VsbC4KCQkJaWYgKGRhdGUuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjID09PSAnSVNPJykgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IDE7ICAvLyBNb25kYXkgYnkgSVNPIDg2MDEgZGVmaW5pdGlvbgoJCQl9CgkJCWVsc2UgewoJCQkJd2Vla0NhbGNGaXJzdERvVyA9IGRhdGUuX2xvY2FsZS5maXJzdERheU9mV2VlaygpOwoJCQl9CgkJfQoKCQlodG1sICs9ICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIGRhdGEtZGF0ZT0iJyArIGRhdGUuZm9ybWF0KCkgKyAnIj4nOwoKCQlpZiAodGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgJiYgKGRhdGUuZGF5KCkgPT0gd2Vla0NhbGNGaXJzdERvVykpIHsKCQkJaHRtbCArPSB0aGlzLnZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCXsgZGF0ZTogZGF0ZSwgdHlwZTogJ3dlZWsnIH0sCgkJCQl7ICdjbGFzcyc6ICdmYy13ZWVrLW51bWJlcicgfSwKCQkJCWRhdGUuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkpOwoJCX0KCgkJaWYgKHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZSkgewoJCQlodG1sICs9IHRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJZGF0ZSwKCQkJCXsgJ2NsYXNzJzogJ2ZjLWRheS1udW1iZXInIH0sCgkJCQlkYXRlLmRhdGUoKSAvLyBpbm5lciBIVE1MCgkJCSk7CgkJfQoKCQlodG1sICs9ICc8L3RkPic7CgoJCXJldHVybiBodG1sOwoJfSwKCgoJLyogT3B0aW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGV2ZW50IHRpbWUgZm9ybWF0dGluZyBzdHJpbmcgaWYgYHRpbWVGb3JtYXRgIGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQKCWNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnZpZXcub3B0KCdleHRyYVNtYWxsVGltZUZvcm1hdCcpOyAvLyBsaWtlICI2cCIgb3IgIjY6MzBwIgoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmNvbENudCA9PSAxOyAvLyB3ZSdsbCBsaWtlbHkgaGF2ZSBzcGFjZSBpZiB0aGVyZSdzIG9ubHkgb25lIGRheQoJfSwKCgoJLyogRGF0ZXMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJhbmdlVXBkYXRlZDogZnVuY3Rpb24oKSB7CgkJdGhpcy51cGRhdGVEYXlUYWJsZSgpOwoJfSwKCgoJLy8gU2xpY2VzIHVwIHRoZSBnaXZlbiBzcGFuICh1bnpvbmVkIHN0YXJ0L2VuZCB3aXRoIG90aGVyIG1pc2MgZGF0YSkgaW50byBhbiBhcnJheSBvZiBzZWdtZW50cwoJc3BhblRvU2VnczogZnVuY3Rpb24oc3BhbikgewoJCXZhciBzZWdzID0gdGhpcy5zbGljZVJhbmdlQnlSb3coc3Bhbik7CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJCXNlZy5sZWZ0Q29sID0gdGhpcy5kYXlzUGVyUm93IC0gMSAtIHNlZy5sYXN0Um93RGF5SW5kZXg7CgkJCQlzZWcucmlnaHRDb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CgkJCX0KCQkJZWxzZSB7CgkJCQlzZWcubGVmdENvbCA9IHNlZy5maXJzdFJvd0RheUluZGV4OwoJCQkJc2VnLnJpZ2h0Q29sID0gc2VnLmxhc3RSb3dEYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBIaXQgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglwcmVwYXJlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CgkJdGhpcy5yb3dDb29yZENhY2hlLmJvdHRvbXNbdGhpcy5yb3dDbnQgLSAxXSArPSB0aGlzLmJvdHRvbUNvb3JkUGFkZGluZzsgLy8gaGFjawoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpOwoJCXRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewoJCWlmICh0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHMobGVmdE9mZnNldCkgJiYgdGhpcy5yb3dDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sID0gdGhpcy5jb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHJvdyA9IHRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KHRvcE9mZnNldCk7CgoJCQlpZiAocm93ICE9IG51bGwgJiYgY29sICE9IG51bGwpIHsKCQkJCXJldHVybiB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl9CgkJfQoJfSwKCgoJZ2V0SGl0U3BhbjogZnVuY3Rpb24oaGl0KSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q2VsbFJhbmdlKGhpdC5yb3csIGhpdC5jb2wpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmdldENlbGxFbChoaXQucm93LCBoaXQuY29sKTsKCX0sCgoKCS8qIENlbGwgU3lzdGVtCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gRllJOiB0aGUgZmlyc3QgY29sdW1uIGlzIHRoZSBsZWZ0bW9zdCBjb2x1bW4sIHJlZ2FyZGxlc3Mgb2YgZGF0ZQoKCglnZXRDZWxsSGl0OiBmdW5jdGlvbihyb3csIGNvbCkgewoJCXJldHVybiB7CgkJCXJvdzogcm93LAoJCQljb2w6IGNvbCwKCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQlsZWZ0OiB0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2wpLAoJCQlyaWdodDogdGhpcy5jb2xDb29yZENhY2hlLmdldFJpZ2h0T2Zmc2V0KGNvbCksCgkJCXRvcDogdGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChyb3cpLAoJCQlib3R0b206IHRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQocm93KQoJCX07Cgl9LAoKCglnZXRDZWxsRWw6IGZ1bmN0aW9uKHJvdywgY29sKSB7CgkJcmV0dXJuIHRoaXMuY2VsbEVscy5lcShyb3cgKiB0aGlzLmNvbENudCArIGNvbCk7Cgl9LAoKCgkvKiBFdmVudCBEcmFnIFZpc3VhbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRvIERheUdyaWQuZXZlbnQsIHNpbWlsYXIgdG8gd2hhdCB3ZSBkaWQgd2l0aCBHcmlkJ3MgZHJhZyBtZXRob2RzCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhbiBldmVudCBvciBleHRlcm5hbCBlbGVtZW50IGJlaW5nIGRyYWdnZWQuCgkvLyBgZXZlbnRMb2NhdGlvbmAgaGFzIHpvbmVkIHN0YXJ0IGFuZCBlbmQgKG9wdGlvbmFsKQoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCS8vIGFsd2F5cyByZW5kZXIgYSBoaWdobGlnaHQgdW5kZXJuZWF0aAoJCXRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4oZXZlbnRMb2NhdGlvbikpOwoKCQkvLyBpZiBhIHNlZ21lbnQgZnJvbSB0aGUgc2FtZSBjYWxlbmRhciBidXQgYW5vdGhlciBjb21wb25lbnQgaXMgYmVpbmcgZHJhZ2dlZCwgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgkJaWYgKHNlZyAmJiBzZWcuY29tcG9uZW50ICE9PSB0aGlzKSB7CgkJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgkJfQoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSB2aXN1YWwgaW5kaWNhdGlvbiBvZiBhIGhvdmVyaW5nIGV2ZW50Cgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCQl0aGlzLnVucmVuZGVySGVscGVyKCk7Cgl9LAoKCgkvKiBFdmVudCBSZXNpemUgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXJlbmRlckV2ZW50UmVzaXplOiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQlyZXR1cm4gdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKGV2ZW50TG9jYXRpb24sIHNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJdW5yZW5kZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpOwoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBhc3NvY2lhdGVkIGludGVybmFsIHNlZ21lbnQgb2JqZWN0LiBJdCBjYW4gYmUgbnVsbC4KCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJOb2RlcyA9IFtdOwoJCXZhciBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBhc3NpZ25zIGVhY2ggc2VnJ3MgZWwgYW5kIHJldHVybnMgYSBzdWJzZXQgb2Ygc2VncyB0aGF0IHdlcmUgcmVuZGVyZWQKCQlyb3dTdHJ1Y3RzID0gdGhpcy5yZW5kZXJTZWdSb3dzKHNlZ3MpOwoKCQkvLyBpbmplY3QgZWFjaCBuZXcgZXZlbnQgc2tlbGV0b24gaW50byBlYWNoIGFzc29jaWF0ZWQgcm93CgkJdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihyb3csIHJvd05vZGUpIHsKCQkJdmFyIHJvd0VsID0gJChyb3dOb2RlKTsgLy8gdGhlIC5mYy1yb3cKCQkJdmFyIHNrZWxldG9uRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1oZWxwZXItc2tlbGV0b24iPjx0YWJsZS8+PC9kaXY+Jyk7IC8vIHdpbGwgYmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkCgkJCXZhciBza2VsZXRvblRvcDsKCgkJCS8vIElmIHRoZXJlIGlzIGFuIG9yaWdpbmFsIHNlZ21lbnQsIG1hdGNoIHRoZSB0b3AgcG9zaXRpb24uIE90aGVyd2lzZSwgcHV0IGl0IGF0IHRoZSByb3cncyB0b3AgbGV2ZWwKCQkJaWYgKHNvdXJjZVNlZyAmJiBzb3VyY2VTZWcucm93ID09PSByb3cpIHsKCQkJCXNrZWxldG9uVG9wID0gc291cmNlU2VnLmVsLnBvc2l0aW9uKCkudG9wOwoJCQl9CgkJCWVsc2UgewoJCQkJc2tlbGV0b25Ub3AgPSByb3dFbC5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiB0Ym9keScpLnBvc2l0aW9uKCkudG9wOwoJCQl9CgoJCQlza2VsZXRvbkVsLmNzcygndG9wJywgc2tlbGV0b25Ub3ApCgkJCQkuZmluZCgndGFibGUnKQoJCQkJCS5hcHBlbmQocm93U3RydWN0c1tyb3ddLnRib2R5RWwpOwoKCQkJcm93RWwuYXBwZW5kKHNrZWxldG9uRWwpOwoJCQloZWxwZXJOb2Rlcy5wdXNoKHNrZWxldG9uRWxbMF0pOwoJCX0pOwoKCQlyZXR1cm4gKCAvLyBtdXN0IHJldHVybiB0aGUgZWxlbWVudHMgcmVuZGVyZWQKCQkJdGhpcy5oZWxwZXJFbHMgPSAkKGhlbHBlck5vZGVzKSAvLyBhcnJheSAtPiBqUXVlcnkgc2V0CgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbnkgdmlzdWFsIGluZGljYXRpb24gb2YgYSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmhlbHBlckVscykgewoJCQl0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKCQkJdGhpcy5oZWxwZXJFbHMgPSBudWxsOwoJCX0KCX0sCgoKCS8qIEZpbGwgU3lzdGVtIChoaWdobGlnaHQsIGJhY2tncm91bmQgZXZlbnRzLCBidXNpbmVzcyBob3VycykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZpbGxTZWdUYWc6ICd0ZCcsIC8vIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHRhZyBuYW1lCgoKCS8vIFJlbmRlcnMgYSBzZXQgb2YgcmVjdGFuZ2xlcyBvdmVyIHRoZSBnaXZlbiBzZWdtZW50cyBvZiBkYXlzLgoJLy8gT25seSByZXR1cm5zIHNlZ21lbnRzIHRoYXQgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkLgoJcmVuZGVyRmlsbDogZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CgkJdmFyIG5vZGVzID0gW107CgkJdmFyIGksIHNlZzsKCQl2YXIgc2tlbGV0b25FbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsgLy8gYXNzaWduZXMgYC5lbGAgdG8gZWFjaCBzZWcuIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHNlZ3MKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJc2tlbGV0b25FbCA9IHRoaXMucmVuZGVyRmlsbFJvdyh0eXBlLCBzZWcsIGNsYXNzTmFtZSk7CgkJCXRoaXMucm93RWxzLmVxKHNlZy5yb3cpLmFwcGVuZChza2VsZXRvbkVsKTsKCQkJbm9kZXMucHVzaChza2VsZXRvbkVsWzBdKTsKCQl9CgoJCXRoaXMuZWxzQnlGaWxsW3R5cGVdID0gJChub2Rlcyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIG5lZWRlZCBmb3Igb25lIHJvdyBvZiBhIGZpbGwuIFJlcXVpcmVzIHRoZSBzZWcncyBlbCB0byBiZSByZW5kZXJlZC4KCXJlbmRlckZpbGxSb3c6IGZ1bmN0aW9uKHR5cGUsIHNlZywgY2xhc3NOYW1lKSB7CgkJdmFyIGNvbENudCA9IHRoaXMuY29sQ250OwoJCXZhciBzdGFydENvbCA9IHNlZy5sZWZ0Q29sOwoJCXZhciBlbmRDb2wgPSBzZWcucmlnaHRDb2wgKyAxOwoJCXZhciBza2VsZXRvbkVsOwoJCXZhciB0ckVsOwoKCQljbGFzc05hbWUgPSBjbGFzc05hbWUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpOwoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLScgKyBjbGFzc05hbWUgKyAnLXNrZWxldG9uIj4nICsKCQkJCSc8dGFibGU+PHRyLz48L3RhYmxlPicgKwoJCQknPC9kaXY+JwoJCSk7CgkJdHJFbCA9IHNrZWxldG9uRWwuZmluZCgndHInKTsKCgkJaWYgKHN0YXJ0Q29sID4gMCkgewoJCQl0ckVsLmFwcGVuZCgnPHRkIGNvbHNwYW49IicgKyBzdGFydENvbCArICciLz4nKTsKCQl9CgoJCXRyRWwuYXBwZW5kKAoJCQlzZWcuZWwuYXR0cignY29sc3BhbicsIGVuZENvbCAtIHN0YXJ0Q29sKQoJCSk7CgoJCWlmIChlbmRDb2wgPCBjb2xDbnQpIHsKCQkJdHJFbC5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInICsgKGNvbENudCAtIGVuZENvbCkgKyAnIi8+Jyk7CgkJfQoKCQl0aGlzLmJvb2tlbmRDZWxscyh0ckVsKTsKCgkJcmV0dXJuIHNrZWxldG9uRWw7Cgl9Cgp9KTsKCjs7CgovKiBFdmVudC1yZW5kZXJpbmcgbWV0aG9kcyBmb3IgdGhlIERheUdyaWQgY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpEYXlHcmlkLm1peGluKHsKCglyb3dTdHJ1Y3RzOiBudWxsLCAvLyBhbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSByb3cncyBmb3JlZ3JvdW5kIGV2ZW50LXJlbmRlcmluZwoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKTsgLy8gcmVtb3ZlcyB0aGUgIm1vcmUuLiIgZXZlbnRzIHBvcG92ZXIKCQlHcmlkLnByb3RvdHlwZS51bnJlbmRlckV2ZW50cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBjYWxscyB0aGUgc3VwZXItbWV0aG9kCgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHJlbmRlcmVkIHNlZ21lbnQgb2JqZWN0cyBjdXJyZW50bHkgcmVuZGVyZWQgb24gdGhlIGdyaWQKCWdldEV2ZW50U2VnczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpIC8vIGdldCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgc3VwZXItbWV0aG9kCgkJCS5jb25jYXQodGhpcy5wb3BvdmVyU2VncyB8fCBbXSk7IC8vIGFwcGVuZCB0aGUgc2VnbWVudHMgZnJvbSB0aGUgIm1vcmUuLi4iIHBvcG92ZXIKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGJhY2tncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyQmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgoJCS8vIGRvbid0IHJlbmRlciB0aW1lZCBiYWNrZ3JvdW5kIGV2ZW50cwoJCXZhciBhbGxEYXlTZWdzID0gJC5ncmVwKHNlZ3MsIGZ1bmN0aW9uKHNlZykgewoJCQlyZXR1cm4gc2VnLmV2ZW50LmFsbERheTsKCQl9KTsKCgkJcmV0dXJuIEdyaWQucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsIGFsbERheVNlZ3MpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIGdpdmVuIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMgb250byB0aGUgZ3JpZAoJcmVuZGVyRmdTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJdmFyIHJvd1N0cnVjdHM7CgoJCS8vIHJlbmRlciBhbiBgLmVsYCBvbiBlYWNoIHNlZwoJCS8vIHJldHVybnMgYSBzdWJzZXQgb2YgdGhlIHNlZ3MuIHNlZ3MgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbmRlcmVkCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CgoJCXJvd1N0cnVjdHMgPSB0aGlzLnJvd1N0cnVjdHMgPSB0aGlzLnJlbmRlclNlZ1Jvd3Moc2Vncyk7CgoJCS8vIGFwcGVuZCB0byBlYWNoIHJvdydzIGNvbnRlbnQgc2tlbGV0b24KCQl0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGksIHJvd05vZGUpIHsKCQkJJChyb3dOb2RlKS5maW5kKCcuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlJykuYXBwZW5kKAoJCQkJcm93U3RydWN0c1tpXS50Ym9keUVsCgkJCSk7CgkJfSk7CgoJCXJldHVybiBzZWdzOyAvLyByZXR1cm4gb25seSB0aGUgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgY3VycmVudGx5IHJlbmRlcmVkIGZvcmVncm91bmQgZXZlbnQgc2VnbWVudHMKCXVucmVuZGVyRmdTZWdzOiBmdW5jdGlvbigpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93U3RydWN0OwoKCQl3aGlsZSAoKHJvd1N0cnVjdCA9IHJvd1N0cnVjdHMucG9wKCkpKSB7CgkJCXJvd1N0cnVjdC50Ym9keUVsLnJlbW92ZSgpOwoJCX0KCgkJdGhpcy5yb3dTdHJ1Y3RzID0gbnVsbDsKCX0sCgoKCS8vIFVzZXMgdGhlIGdpdmVuIGV2ZW50cyBhcnJheSB0byBnZW5lcmF0ZSA8dGJvZHk+IGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIGVhY2ggcm93J3MgY29udGVudCBza2VsZXRvbi4KCS8vIFJldHVybnMgYW4gYXJyYXkgb2Ygcm93U3RydWN0IG9iamVjdHMgKHNlZSB0aGUgYm90dG9tIG9mIGByZW5kZXJTZWdSb3dgKS4KCS8vIFBSRUNPTkRJVElPTjogZWFjaCBzZWdtZW50IHNob3VkIGFscmVhZHkgaGF2ZSBhIHJlbmRlcmVkIGFuZCBhc3NpZ25lZCBgLmVsYAoJcmVuZGVyU2VnUm93czogZnVuY3Rpb24oc2VncykgewoJCXZhciByb3dTdHJ1Y3RzID0gW107CgkJdmFyIHNlZ1Jvd3M7CgkJdmFyIHJvdzsKCgkJc2VnUm93cyA9IHRoaXMuZ3JvdXBTZWdSb3dzKHNlZ3MpOyAvLyBncm91cCBpbnRvIG5lc3RlZCBhcnJheXMKCgkJLy8gaXRlcmF0ZSBlYWNoIHJvdyBvZiBzZWdtZW50IGdyb3VwaW5ncwoJCWZvciAocm93ID0gMDsgcm93IDwgc2VnUm93cy5sZW5ndGg7IHJvdysrKSB7CgkJCXJvd1N0cnVjdHMucHVzaCgKCQkJCXRoaXMucmVuZGVyU2VnUm93KHJvdywgc2VnUm93c1tyb3ddKQoJCQkpOwoJCX0KCgkJcmV0dXJuIHJvd1N0cnVjdHM7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgdG8gYmUgdXNlZCBmb3IgdGhlIGRlZmF1bHQgZWxlbWVudCBmb3IgYW4gaW5kaXZpZHVhbCBzZWdtZW50CglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzU3RhcnQgJiYgdmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KGV2ZW50KTsKCQl2YXIgaXNSZXNpemFibGVGcm9tRW5kID0gIWRpc2FibGVSZXNpemluZyAmJiBldmVudC5hbGxEYXkgJiYKCQkJc2VnLmlzRW5kICYmIHZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQoZXZlbnQpOwoJCXZhciBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CgkJdmFyIHNraW5Dc3MgPSBjc3NUb1N0cih0aGlzLmdldFNlZ1NraW5Dc3Moc2VnKSk7CgkJdmFyIHRpbWVIdG1sID0gJyc7CgkJdmFyIHRpbWVUZXh0OwoJCXZhciB0aXRsZUh0bWw7CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtZGF5LWdyaWQtZXZlbnQnLCAnZmMtaC1ldmVudCcpOwoKCQkvLyBPbmx5IGRpc3BsYXkgYSB0aW1lZCBldmVudHMgdGltZSBpZiBpdCBpcyB0aGUgc3RhcnRpbmcgc2VnbWVudAoJCWlmIChzZWcuaXNTdGFydCkgewoJCQl0aW1lVGV4dCA9IHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChldmVudCk7CgkJCWlmICh0aW1lVGV4dCkgewoJCQkJdGltZUh0bWwgPSAnPHNwYW4gY2xhc3M9ImZjLXRpbWUiPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JzsKCQkJfQoJCX0KCgkJdGl0bGVIdG1sID0KCQkJJzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JyArCgkJCQkoaHRtbEVzY2FwZShldmVudC50aXRsZSB8fCAnJykgfHwgJyZuYnNwOycpICsgLy8gd2UgYWx3YXlzIHdhbnQgb25lIGxpbmUgb2YgaGVpZ2h0CgkJCSc8L3NwYW4+JzsKCQkKCQlyZXR1cm4gJzxhIGNsYXNzPSInICsgY2xhc3Nlcy5qb2luKCcgJykgKyAnIicgKwoJCQkJKGV2ZW50LnVybCA/CgkJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKHNraW5Dc3MgPwoJCQkJCScgc3R5bGU9IicgKyBza2luQ3NzICsgJyInIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aGlzLmlzUlRMID8KCQkJCQkJdGl0bGVIdG1sICsgJyAnICsgdGltZUh0bWwgOiAvLyBwdXQgYSBuYXR1cmFsIHNwYWNlIGluIGJldHdlZW4KCQkJCQkJdGltZUh0bWwgKyAnICcgKyB0aXRsZUh0bWwgICAvLwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCShpc1Jlc2l6YWJsZUZyb21TdGFydCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQkJKGlzUmVzaXphYmxlRnJvbUVuZCA/CgkJCQkJJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJJzwvYT4nOwoJfSwKCgoJLy8gR2l2ZW4gYSByb3cgIyBhbmQgYW4gYXJyYXkgb2Ygc2VnbWVudHMgYWxsIGluIHRoZSBzYW1lIHJvdywgcmVuZGVyIGEgPHRib2R5PiBlbGVtZW50LCBhIHNrZWxldG9uIHRoYXQgY29udGFpbnMKCS8vIHRoZSBzZWdtZW50cy4gUmV0dXJucyBvYmplY3Qgd2l0aCBhIGJ1bmNoIG9mIGludGVybmFsIGRhdGEgYWJvdXQgaG93IHRoZSByZW5kZXIgd2FzIGNhbGN1bGF0ZWQuCgkvLyBOT1RFOiBtb2RpZmllcyByb3dTZWdzCglyZW5kZXJTZWdSb3c6IGZ1bmN0aW9uKHJvdywgcm93U2VncykgewoJCXZhciBjb2xDbnQgPSB0aGlzLmNvbENudDsKCQl2YXIgc2VnTGV2ZWxzID0gdGhpcy5idWlsZFNlZ0xldmVscyhyb3dTZWdzKTsgLy8gZ3JvdXAgaW50byBzdWItYXJyYXlzIG9mIGxldmVscwoJCXZhciBsZXZlbENudCA9IE1hdGgubWF4KDEsIHNlZ0xldmVscy5sZW5ndGgpOyAvLyBlbnN1cmUgYXQgbGVhc3Qgb25lIGxldmVsCgkJdmFyIHRib2R5ID0gJCgnPHRib2R5Lz4nKTsKCQl2YXIgc2VnTWF0cml4ID0gW107IC8vIGxvb2t1cCBmb3Igd2hpY2ggc2VnbWVudHMgYXJlIHJlbmRlcmVkIGludG8gd2hpY2ggbGV2ZWwrY29sIGNlbGxzCgkJdmFyIGNlbGxNYXRyaXggPSBbXTsgLy8gbG9va3VwIGZvciBhbGwgPHRkPiBlbGVtZW50cyBvZiB0aGUgbGV2ZWwrY29sIG1hdHJpeAoJCXZhciBsb25lQ2VsbE1hdHJpeCA9IFtdOyAvLyBsb29rdXAgZm9yIDx0ZD4gZWxlbWVudHMgdGhhdCBvbmx5IHRha2UgdXAgYSBzaW5nbGUgY29sdW1uCgkJdmFyIGksIGxldmVsU2VnczsKCQl2YXIgY29sOwoJCXZhciB0cjsKCQl2YXIgaiwgc2VnOwoJCXZhciB0ZDsKCgkJLy8gcG9wdWxhdGVzIGVtcHR5IGNlbGxzIGZyb20gdGhlIGN1cnJlbnQgY29sdW1uIChgY29sYCkgdG8gYGVuZENvbGAKCQlmdW5jdGlvbiBlbXB0eUNlbGxzVW50aWwoZW5kQ29sKSB7CgkJCXdoaWxlIChjb2wgPCBlbmRDb2wpIHsKCQkJCS8vIHRyeSB0byBncmFiIGEgY2VsbCBmcm9tIHRoZSBsZXZlbCBhYm92ZSBhbmQgZXh0ZW5kIGl0cyByb3dzcGFuLiBvdGhlcndpc2UsIGNyZWF0ZSBhIGZyZXNoIGNlbGwKCQkJCXRkID0gKGxvbmVDZWxsTWF0cml4W2kgLSAxXSB8fCBbXSlbY29sXTsKCQkJCWlmICh0ZCkgewoJCQkJCXRkLmF0dHIoCgkJCQkJCSdyb3dzcGFuJywKCQkJCQkJcGFyc2VJbnQodGQuYXR0cigncm93c3BhbicpIHx8IDEsIDEwKSArIDEKCQkJCQkpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdGQgPSAkKCc8dGQvPicpOwoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCQljZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWxvbmVDZWxsTWF0cml4W2ldW2NvbF0gPSB0ZDsKCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWxDbnQ7IGkrKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGxldmVscwoJCQlsZXZlbFNlZ3MgPSBzZWdMZXZlbHNbaV07CgkJCWNvbCA9IDA7CgkJCXRyID0gJCgnPHRyLz4nKTsKCgkJCXNlZ01hdHJpeC5wdXNoKFtdKTsKCQkJY2VsbE1hdHJpeC5wdXNoKFtdKTsKCQkJbG9uZUNlbGxNYXRyaXgucHVzaChbXSk7CgoJCQkvLyBsZXZlbENudCBtaWdodCBiZSAxIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBubyBhY3R1YWwgbGV2ZWxzLiBwcm90ZWN0IGFnYWluc3QgdGhpcy4KCQkJLy8gdGhpcyBzaW5nbGUgZW1wdHkgcm93IGlzIHVzZWZ1bCBmb3Igc3R5bGluZy4KCQkJaWYgKGxldmVsU2VncykgewoJCQkJZm9yIChqID0gMDsgaiA8IGxldmVsU2Vncy5sZW5ndGg7IGorKykgeyAvLyBpdGVyYXRlIHRocm91Z2ggc2VnbWVudHMgaW4gbGV2ZWwKCQkJCQlzZWcgPSBsZXZlbFNlZ3Nbal07CgoJCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7CgoJCQkJCS8vIGNyZWF0ZSBhIGNvbnRhaW5lciB0aGF0IG9jY3VwaWVzIG9yIG1vcmUgY29sdW1ucy4gYXBwZW5kIHRoZSBldmVudCBlbGVtZW50LgoJCQkJCXRkID0gJCgnPHRkIGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmQoc2VnLmVsKTsKCQkJCQlpZiAoc2VnLmxlZnRDb2wgIT0gc2VnLnJpZ2h0Q29sKSB7CgkJCQkJCXRkLmF0dHIoJ2NvbHNwYW4nLCBzZWcucmlnaHRDb2wgLSBzZWcubGVmdENvbCArIDEpOwoJCQkJCX0KCQkJCQllbHNlIHsgLy8gYSBzaW5nbGUtY29sdW1uIHNlZ21lbnQKCQkJCQkJbG9uZUNlbGxNYXRyaXhbaV1bY29sXSA9IHRkOwoJCQkJCX0KCgkJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQkJY2VsbE1hdHJpeFtpXVtjb2xdID0gdGQ7CgkJCQkJCXNlZ01hdHJpeFtpXVtjb2xdID0gc2VnOwoJCQkJCQljb2wrKzsKCQkJCQl9CgoJCQkJCXRyLmFwcGVuZCh0ZCk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbChjb2xDbnQpOyAvLyBmaW5pc2ggb2ZmIHRoZSByb3cKCQkJdGhpcy5ib29rZW5kQ2VsbHModHIpOwoJCQl0Ym9keS5hcHBlbmQodHIpOwoJCX0KCgkJcmV0dXJuIHsgLy8gYSAicm93U3RydWN0IgoJCQlyb3c6IHJvdywgLy8gdGhlIHJvdyBudW1iZXIKCQkJdGJvZHlFbDogdGJvZHksCgkJCWNlbGxNYXRyaXg6IGNlbGxNYXRyaXgsCgkJCXNlZ01hdHJpeDogc2VnTWF0cml4LAoJCQlzZWdMZXZlbHM6IHNlZ0xldmVscywKCQkJc2Vnczogcm93U2VncwoJCX07Cgl9LAoKCgkvLyBTdGFja3MgYSBmbGF0IGFycmF5IG9mIHNlZ21lbnRzLCB3aGljaCBhcmUgYWxsIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgcm93LCBpbnRvIHN1YmFycmF5cyBvZiB2ZXJ0aWNhbCBsZXZlbHMuCgkvLyBOT1RFOiBtb2RpZmllcyBzZWdzCglidWlsZFNlZ0xldmVsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBqOwoKCQkvLyBHaXZlIHByZWZlcmVuY2UgdG8gZWxlbWVudHMgd2l0aCBjZXJ0YWluIGNyaXRlcmlhLCBzbyB0aGV5IGhhdmUKCQkvLyBhIGNoYW5jZSB0byBiZSBjbG9zZXIgdG8gdGhlIHRvcC4KCQl0aGlzLnNvcnRFdmVudFNlZ3Moc2Vncyk7CgkJCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCgkJCS8vIGxvb3AgdGhyb3VnaCBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlIHRvcG1vc3QsIHVudGlsIHRoZSBzZWdtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIG90aGVyIHNlZ21lbnRzCgkJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJCWlmICghaXNEYXlTZWdDb2xsaXNpb24oc2VnLCBsZXZlbHNbal0pKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJLy8gYGpgIG5vdyBob2xkcyB0aGUgZGVzaXJlZCBzdWJyb3cgaW5kZXgKCQkJc2VnLmxldmVsID0gajsKCgkJCS8vIGNyZWF0ZSBuZXcgbGV2ZWwgYXJyYXkgaWYgbmVlZGVkIGFuZCBhcHBlbmQgc2VnbWVudAoJCQkobGV2ZWxzW2pdIHx8IChsZXZlbHNbal0gPSBbXSkpLnB1c2goc2VnKTsKCQl9CgoJCS8vIG9yZGVyIHNlZ21lbnRzIGxlZnQtdG8tcmlnaHQuIHZlcnkgaW1wb3J0YW50IGlmIGNhbGVuZGFyIGlzIFJUTAoJCWZvciAoaiA9IDA7IGogPCBsZXZlbHMubGVuZ3RoOyBqKyspIHsKCQkJbGV2ZWxzW2pdLnNvcnQoY29tcGFyZURheVNlZ0NvbHMpOwoJCX0KCgkJcmV0dXJuIGxldmVsczsKCX0sCgoKCS8vIEdpdmVuIGEgZmxhdCBhcnJheSBvZiBzZWdtZW50cywgcmV0dXJuIGFuIGFycmF5IG9mIHN1Yi1hcnJheXMsIGdyb3VwZWQgYnkgZWFjaCBzZWdtZW50J3Mgcm93Cglncm91cFNlZ1Jvd3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2VnUm93cyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy5yb3dDbnQ7IGkrKykgewoJCQlzZWdSb3dzLnB1c2goW10pOwoJCX0KCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnUm93c1tzZWdzW2ldLnJvd10ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdSb3dzOwoJfQoKfSk7CgoKLy8gQ29tcHV0ZXMgd2hldGhlciB0d28gc2VnbWVudHMnIGNvbHVtbnMgY29sbGlkZS4gVGhleSBhcmUgYXNzdW1lZCB0byBiZSBpbiB0aGUgc2FtZSByb3cuCmZ1bmN0aW9uIGlzRGF5U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzKSB7Cgl2YXIgaSwgb3RoZXJTZWc7CgoJZm9yIChpID0gMDsgaSA8IG90aGVyU2Vncy5sZW5ndGg7IGkrKykgewoJCW90aGVyU2VnID0gb3RoZXJTZWdzW2ldOwoKCQlpZiAoCgkJCW90aGVyU2VnLmxlZnRDb2wgPD0gc2VnLnJpZ2h0Q29sICYmCgkJCW90aGVyU2VnLnJpZ2h0Q29sID49IHNlZy5sZWZ0Q29sCgkJKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gZmFsc2U7Cn0KCgovLyBBIGNtcCBmdW5jdGlvbiBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxlZnRtb3N0IGV2ZW50CmZ1bmN0aW9uIGNvbXBhcmVEYXlTZWdDb2xzKGEsIGIpIHsKCXJldHVybiBhLmxlZnRDb2wgLSBiLmxlZnRDb2w7Cn0KCjs7CgovKiBNZXRob2RzIHJlbGF0ZSB0byBsaW1pdGluZyB0aGUgbnVtYmVyIGV2ZW50cyBmb3IgYSBnaXZlbiBkYXkgb24gYSBEYXlHcmlkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBOT1RFOiBhbGwgdGhlIHNlZ3MgYmVpbmcgcGFzc2VkIGFyb3VuZCBpbiBoZXJlIGFyZSBmb3JlZ3JvdW5kIHNlZ3MKCkRheUdyaWQubWl4aW4oewoKCXNlZ1BvcG92ZXI6IG51bGwsIC8vIHRoZSBQb3BvdmVyIHRoYXQgaG9sZHMgZXZlbnRzIHRoYXQgY2FuJ3QgZml0IGluIGEgY2VsbC4gbnVsbCB3aGVuIG5vdCB2aXNpYmxlCglwb3BvdmVyU2VnczogbnVsbCwgLy8gYW4gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIHRoYXQgdGhlIHNlZ1BvcG92ZXIgaG9sZHMuIG51bGwgd2hlbiBub3QgdmlzaWJsZQoKCglyZW1vdmVTZWdQb3BvdmVyOiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5zZWdQb3BvdmVyKSB7CgkJCXRoaXMuc2VnUG9wb3Zlci5oaWRlKCk7IC8vIGluIGhhbmRsZXIsIHdpbGwgY2FsbCBzZWdQb3BvdmVyJ3MgcmVtb3ZlRWxlbWVudAoJCX0KCX0sCgoKCS8vIExpbWl0cyB0aGUgbnVtYmVyIG9mICJsZXZlbHMiICh2ZXJ0aWNhbGx5IHN0YWNraW5nIGxheWVycyBvZiBldmVudHMpIGZvciBlYWNoIHJvdyBvZiB0aGUgZ3JpZC4KCS8vIGBsZXZlbExpbWl0YCBjYW4gYmUgZmFsc2UgKGRvbid0IGxpbWl0KSwgYSBudW1iZXIsIG9yIHRydWUgKHNob3VsZCBiZSBjb21wdXRlZCkuCglsaW1pdFJvd3M6IGZ1bmN0aW9uKGxldmVsTGltaXQpIHsKCQl2YXIgcm93U3RydWN0cyA9IHRoaXMucm93U3RydWN0cyB8fCBbXTsKCQl2YXIgcm93OyAvLyByb3cgIwoJCXZhciByb3dMZXZlbExpbWl0OwoKCQlmb3IgKHJvdyA9IDA7IHJvdyA8IHJvd1N0cnVjdHMubGVuZ3RoOyByb3crKykgewoJCQl0aGlzLnVubGltaXRSb3cocm93KTsKCgkJCWlmICghbGV2ZWxMaW1pdCkgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGZhbHNlOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiBsZXZlbExpbWl0ID09PSAnbnVtYmVyJykgewoJCQkJcm93TGV2ZWxMaW1pdCA9IGxldmVsTGltaXQ7CgkJCX0KCQkJZWxzZSB7CgkJCQlyb3dMZXZlbExpbWl0ID0gdGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChyb3cpOwoJCQl9CgoJCQlpZiAocm93TGV2ZWxMaW1pdCAhPT0gZmFsc2UpIHsKCQkJCXRoaXMubGltaXRSb3cocm93LCByb3dMZXZlbExpbWl0KTsKCQkJfQoJCX0KCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGEgcm93IHdpbGwgYWNjb21vZGF0ZSB3aXRob3V0IGdvaW5nIG91dHNpZGUgaXRzIGJvdW5kcy4KCS8vIEFzc3VtZXMgdGhlIHJvdyBpcyAicmlnaWQiIChtYWludGFpbnMgYSBjb25zdGFudCBoZWlnaHQgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIGluc2lkZSkuCgkvLyBgcm93YCBpcyB0aGUgcm93IG51bWJlci4KCWNvbXB1dGVSb3dMZXZlbExpbWl0OiBmdW5jdGlvbihyb3cpIHsKCQl2YXIgcm93RWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB0aGUgY29udGFpbmluZyAiZmFrZSIgcm93IGRpdgoJCXZhciByb3dIZWlnaHQgPSByb3dFbC5oZWlnaHQoKTsgLy8gVE9ETzogY2FjaGUgc29tZWhvdz8KCQl2YXIgdHJFbHMgPSB0aGlzLnJvd1N0cnVjdHNbcm93XS50Ym9keUVsLmNoaWxkcmVuKCk7CgkJdmFyIGksIHRyRWw7CgkJdmFyIHRySGVpZ2h0OwoKCQlmdW5jdGlvbiBpdGVySW5uZXJIZWlnaHRzKGksIGNoaWxkTm9kZSkgewoJCQl0ckhlaWdodCA9IE1hdGgubWF4KHRySGVpZ2h0LCAkKGNoaWxkTm9kZSkub3V0ZXJIZWlnaHQoKSk7CgkJfQoKCQkvLyBSZXZlYWwgb25lIGxldmVsIDx0cj4gYXQgYSB0aW1lIGFuZCBzdG9wIHdoZW4gd2UgZmluZCBvbmUgb3V0IG9mIGJvdW5kcwoJCWZvciAoaSA9IDA7IGkgPCB0ckVscy5sZW5ndGg7IGkrKykgewoJCQl0ckVsID0gdHJFbHMuZXEoaSkucmVtb3ZlQ2xhc3MoJ2ZjLWxpbWl0ZWQnKTsgLy8gcmVzZXQgdG8gb3JpZ2luYWwgc3RhdGUgKHJldmVhbCkKCgkJCS8vIHdpdGggcm93c3BhbnM+MSBhbmQgSUU4LCB0ckVsLm91dGVySGVpZ2h0KCkgd291bGQgcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgY2VsbCwKCQkJLy8gc28gaW5zdGVhZCwgZmluZCB0aGUgdGFsbGVzdCBpbm5lciBjb250ZW50IGVsZW1lbnQuCgkJCXRySGVpZ2h0ID0gMDsKCQkJdHJFbC5maW5kKCc+IHRkID4gOmZpcnN0LWNoaWxkJykuZWFjaChpdGVySW5uZXJIZWlnaHRzKTsKCgkJCWlmICh0ckVsLnBvc2l0aW9uKCkudG9wICsgdHJIZWlnaHQgPiByb3dIZWlnaHQpIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7IC8vIHNob3VsZCBub3QgbGltaXQgYXQgYWxsCgl9LAoKCgkvLyBMaW1pdHMgdGhlIGdpdmVuIGdyaWQgcm93IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsZXZlbHMgYW5kIGluamVjdHMgIm1vcmUiIGxpbmtzIGlmIG5lY2Vzc2FyeS4KCS8vIGByb3dgIGlzIHRoZSByb3cgbnVtYmVyLgoJLy8gYGxldmVsTGltaXRgIGlzIGEgbnVtYmVyIGZvciB0aGUgbWF4aW11bSAoaW5jbHVzaXZlKSBudW1iZXIgb2YgbGV2ZWxzIGFsbG93ZWQuCglsaW1pdFJvdzogZnVuY3Rpb24ocm93LCBsZXZlbExpbWl0KSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcm93U3RydWN0ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd107CgkJdmFyIG1vcmVOb2RlcyA9IFtdOyAvLyBhcnJheSBvZiAibW9yZSIgPGE+IGxpbmtzIGFuZCA8dGQ+IERPTSBub2RlcwoJCXZhciBjb2wgPSAwOyAvLyBjb2wgIywgbGVmdC10by1yaWdodCAobm90IGNocm9ub2xvZ2ljYWxseSkKCQl2YXIgbGV2ZWxTZWdzOyAvLyBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsLCBvcmRlcmVkIGxlZnQtdG8tcmlnaHQKCQl2YXIgY2VsbE1hdHJpeDsgLy8gYSBtYXRyaXggKGJ5IGxldmVsLCB0aGVuIGNvbHVtbikgb2YgYWxsIDx0ZD4galF1ZXJ5IGVsZW1lbnRzIGluIHRoZSByb3cKCQl2YXIgbGltaXRlZE5vZGVzOyAvLyBhcnJheSBvZiB0ZW1wb3JhcmlseSBoaWRkZW4gbGV2ZWwgPHRyPiBhbmQgc2VnbWVudCA8dGQ+IERPTSBub2RlcwoJCXZhciBpLCBzZWc7CgkJdmFyIHNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBvYmplY3RzIGJlbG93IGBzZWdgIGluIHRoZSBjdXJyZW50IGBjb2xgCgkJdmFyIHRvdGFsU2Vnc0JlbG93OyAvLyB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgYmVsb3cgYHNlZ2AgaW4gYW55IG9mIHRoZSBjb2x1bW5zIGBzZWdgIG9jY3VwaWVzCgkJdmFyIGNvbFNlZ3NCZWxvdzsgLy8gYXJyYXkgb2Ygc2VnbWVudCBhcnJheXMsIGJlbG93IHNlZywgb25lIGZvciBlYWNoIGNvbHVtbiAob2Zmc2V0IGZyb20gc2VncydzIGZpcnN0IGNvbHVtbikKCQl2YXIgdGQsIHJvd3NwYW47CgkJdmFyIHNlZ01vcmVOb2RlczsgLy8gYXJyYXkgb2YgIm1vcmUiIDx0ZD4gY2VsbHMgdGhhdCB3aWxsIHN0YW5kLWluIGZvciB0aGUgY3VycmVudCBzZWcncyBjZWxsCgkJdmFyIGo7CgkJdmFyIG1vcmVUZCwgbW9yZVdyYXAsIG1vcmVMaW5rOwoKCQkvLyBJdGVyYXRlcyB0aHJvdWdoIGVtcHR5IGxldmVsIGNlbGxzIGFuZCBwbGFjZXMgIm1vcmUiIGxpbmtzIGluc2lkZSBpZiBuZWVkIGJlCgkJZnVuY3Rpb24gZW1wdHlDZWxsc1VudGlsKGVuZENvbCkgeyAvLyBnb2VzIGZyb20gY3VycmVudCBgY29sYCB0byBgZW5kQ29sYAoJCQl3aGlsZSAoY29sIDwgZW5kQ29sKSB7CgkJCQlzZWdzQmVsb3cgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCwgbGV2ZWxMaW1pdCk7CgkJCQlpZiAoc2Vnc0JlbG93Lmxlbmd0aCkgewoJCQkJCXRkID0gY2VsbE1hdHJpeFtsZXZlbExpbWl0IC0gMV1bY29sXTsKCQkJCQltb3JlTGluayA9IF90aGlzLnJlbmRlck1vcmVMaW5rKHJvdywgY29sLCBzZWdzQmVsb3cpOwoJCQkJCW1vcmVXcmFwID0gJCgnPGRpdi8+JykuYXBwZW5kKG1vcmVMaW5rKTsKCQkJCQl0ZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCW1vcmVOb2Rlcy5wdXNoKG1vcmVXcmFwWzBdKTsKCQkJCX0KCQkJCWNvbCsrOwoJCQl9CgkJfQoKCQlpZiAobGV2ZWxMaW1pdCAmJiBsZXZlbExpbWl0IDwgcm93U3RydWN0LnNlZ0xldmVscy5sZW5ndGgpIHsgLy8gaXMgaXQgYWN0dWFsbHkgb3ZlciB0aGUgbGltaXQ/CgkJCWxldmVsU2VncyA9IHJvd1N0cnVjdC5zZWdMZXZlbHNbbGV2ZWxMaW1pdCAtIDFdOwoJCQljZWxsTWF0cml4ID0gcm93U3RydWN0LmNlbGxNYXRyaXg7CgoJCQlsaW1pdGVkTm9kZXMgPSByb3dTdHJ1Y3QudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKGxldmVsTGltaXQpIC8vIGdldCBsZXZlbCA8dHI+IGVsZW1lbnRzIHBhc3QgdGhlIGxpbWl0CgkJCQkuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5nZXQoKTsgLy8gaGlkZSBlbGVtZW50cyBhbmQgZ2V0IGEgc2ltcGxlIERPTS1ub2RlcyBhcnJheQoKCQkJLy8gaXRlcmF0ZSB0aG91Z2ggc2VnbWVudHMgaW4gdGhlIGxhc3QgYWxsb3dhYmxlIGxldmVsCgkJCWZvciAoaSA9IDA7IGkgPCBsZXZlbFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCXNlZyA9IGxldmVsU2Vnc1tpXTsKCQkJCWVtcHR5Q2VsbHNVbnRpbChzZWcubGVmdENvbCk7IC8vIHByb2Nlc3MgZW1wdHkgY2VsbHMgYmVmb3JlIHRoZSBzZWdtZW50CgoJCQkJLy8gZGV0ZXJtaW5lICphbGwqIHNlZ21lbnRzIGJlbG93IGBzZWdgIHRoYXQgb2NjdXB5IHRoZSBzYW1lIGNvbHVtbnMKCQkJCWNvbFNlZ3NCZWxvdyA9IFtdOwoJCQkJdG90YWxTZWdzQmVsb3cgPSAwOwoJCQkJd2hpbGUgKGNvbCA8PSBzZWcucmlnaHRDb2wpIHsKCQkJCQlzZWdzQmVsb3cgPSB0aGlzLmdldENlbGxTZWdzKHJvdywgY29sLCBsZXZlbExpbWl0KTsKCQkJCQljb2xTZWdzQmVsb3cucHVzaChzZWdzQmVsb3cpOwoJCQkJCXRvdGFsU2Vnc0JlbG93ICs9IHNlZ3NCZWxvdy5sZW5ndGg7CgkJCQkJY29sKys7CgkJCQl9CgoJCQkJaWYgKHRvdGFsU2Vnc0JlbG93KSB7IC8vIGRvIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGlzIHNlZ21lbnQgd2l0aCBvbmUgb3IgbWFueSAibW9yZSIgbGlua3M/CgkJCQkJdGQgPSBjZWxsTWF0cml4W2xldmVsTGltaXQgLSAxXVtzZWcubGVmdENvbF07IC8vIHRoZSBzZWdtZW50J3MgcGFyZW50IGNlbGwKCQkJCQlyb3dzcGFuID0gdGQuYXR0cigncm93c3BhbicpIHx8IDE7CgkJCQkJc2VnTW9yZU5vZGVzID0gW107CgoJCQkJCS8vIG1ha2UgYSByZXBsYWNlbWVudCA8dGQ+IGZvciBlYWNoIGNvbHVtbiB0aGUgc2VnbWVudCBvY2N1cGllcy4gd2lsbCBiZSBvbmUgZm9yIGVhY2ggY29sc3BhbgoJCQkJCWZvciAoaiA9IDA7IGogPCBjb2xTZWdzQmVsb3cubGVuZ3RoOyBqKyspIHsKCQkJCQkJbW9yZVRkID0gJCgnPHRkIGNsYXNzPSJmYy1tb3JlLWNlbGwiLz4nKS5hdHRyKCdyb3dzcGFuJywgcm93c3Bhbik7CgkJCQkJCXNlZ3NCZWxvdyA9IGNvbFNlZ3NCZWxvd1tqXTsKCQkJCQkJbW9yZUxpbmsgPSB0aGlzLnJlbmRlck1vcmVMaW5rKAoJCQkJCQkJcm93LAoJCQkJCQkJc2VnLmxlZnRDb2wgKyBqLAoJCQkJCQkJWyBzZWcgXS5jb25jYXQoc2Vnc0JlbG93KSAvLyBjb3VudCBzZWcgYXMgaGlkZGVuIHRvbwoJCQkJCQkpOwoJCQkJCQltb3JlV3JhcCA9ICQoJzxkaXYvPicpLmFwcGVuZChtb3JlTGluayk7CgkJCQkJCW1vcmVUZC5hcHBlbmQobW9yZVdyYXApOwoJCQkJCQlzZWdNb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCQltb3JlTm9kZXMucHVzaChtb3JlVGRbMF0pOwoJCQkJCX0KCgkJCQkJdGQuYWRkQ2xhc3MoJ2ZjLWxpbWl0ZWQnKS5hZnRlcigkKHNlZ01vcmVOb2RlcykpOyAvLyBoaWRlIG9yaWdpbmFsIDx0ZD4gYW5kIGluamVjdCByZXBsYWNlbWVudHMKCQkJCQlsaW1pdGVkTm9kZXMucHVzaCh0ZFswXSk7CgkJCQl9CgkJCX0KCgkJCWVtcHR5Q2VsbHNVbnRpbCh0aGlzLmNvbENudCk7IC8vIGZpbmlzaCBvZmYgdGhlIGxldmVsCgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gJChtb3JlTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJCXJvd1N0cnVjdC5saW1pdGVkRWxzID0gJChsaW1pdGVkTm9kZXMpOyAvLyBmb3IgZWFzeSB1bmRvaW5nIGxhdGVyCgkJfQoJfSwKCgoJLy8gUmV2ZWFscyBhbGwgbGV2ZWxzIGFuZCByZW1vdmVzIGFsbCAibW9yZSItcmVsYXRlZCBlbGVtZW50cyBmb3IgYSBncmlkJ3Mgcm93LgoJLy8gYHJvd2AgaXMgYSByb3cgbnVtYmVyLgoJdW5saW1pdFJvdzogZnVuY3Rpb24ocm93KSB7CgkJdmFyIHJvd1N0cnVjdCA9IHRoaXMucm93U3RydWN0c1tyb3ddOwoKCQlpZiAocm93U3RydWN0Lm1vcmVFbHMpIHsKCQkJcm93U3RydWN0Lm1vcmVFbHMucmVtb3ZlKCk7CgkJCXJvd1N0cnVjdC5tb3JlRWxzID0gbnVsbDsKCQl9CgoJCWlmIChyb3dTdHJ1Y3QubGltaXRlZEVscykgewoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscy5yZW1vdmVDbGFzcygnZmMtbGltaXRlZCcpOwoJCQlyb3dTdHJ1Y3QubGltaXRlZEVscyA9IG51bGw7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyBhbiA8YT4gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgaGlkZGVuIGV2ZW50IGVsZW1lbnQgZm9yIGEgY2VsbC4KCS8vIFJlc3BvbnNpYmxlIGZvciBhdHRhY2hpbmcgY2xpY2sgaGFuZGxlciBhcyB3ZWxsLgoJcmVuZGVyTW9yZUxpbms6IGZ1bmN0aW9uKHJvdywgY29sLCBoaWRkZW5TZWdzKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJcmV0dXJuICQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykKCQkJLnRleHQoCgkJCQl0aGlzLmdldE1vcmVMaW5rVGV4dChoaWRkZW5TZWdzLmxlbmd0aCkKCQkJKQoJCQkub24oJ2NsaWNrJywgZnVuY3Rpb24oZXYpIHsKCQkJCXZhciBjbGlja09wdGlvbiA9IHZpZXcub3B0KCdldmVudExpbWl0Q2xpY2snKTsKCQkJCXZhciBkYXRlID0gX3RoaXMuZ2V0Q2VsbERhdGUocm93LCBjb2wpOwoJCQkJdmFyIG1vcmVFbCA9ICQodGhpcyk7CgkJCQl2YXIgZGF5RWwgPSBfdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpOwoJCQkJdmFyIGFsbFNlZ3MgPSBfdGhpcy5nZXRDZWxsU2Vncyhyb3csIGNvbCk7CgoJCQkJLy8gcmVzY29wZSB0aGUgc2VnbWVudHMgdG8gYmUgd2l0aGluIHRoZSBjZWxsJ3MgZGF0ZQoJCQkJdmFyIHJlc2xpY2VkQWxsU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGFsbFNlZ3MsIGRhdGUpOwoJCQkJdmFyIHJlc2xpY2VkSGlkZGVuU2VncyA9IF90aGlzLnJlc2xpY2VEYXlTZWdzKGhpZGRlblNlZ3MsIGRhdGUpOwoKCQkJCWlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdmdW5jdGlvbicpIHsKCQkJCQkvLyB0aGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIGFuIGF0b21pYyBvcHRpb24KCQkJCQljbGlja09wdGlvbiA9IHZpZXcudHJpZ2dlcignZXZlbnRMaW1pdENsaWNrJywgbnVsbCwgewoJCQkJCQlkYXRlOiBkYXRlLAoJCQkJCQlkYXlFbDogZGF5RWwsCgkJCQkJCW1vcmVFbDogbW9yZUVsLAoJCQkJCQlzZWdzOiByZXNsaWNlZEFsbFNlZ3MsCgkJCQkJCWhpZGRlblNlZ3M6IHJlc2xpY2VkSGlkZGVuU2VncwoJCQkJCX0sIGV2KTsKCQkJCX0KCgkJCQlpZiAoY2xpY2tPcHRpb24gPT09ICdwb3BvdmVyJykgewoJCQkJCV90aGlzLnNob3dTZWdQb3BvdmVyKHJvdywgY29sLCBtb3JlRWwsIHJlc2xpY2VkQWxsU2Vncyk7CgkJCQl9CgkJCQllbHNlIGlmICh0eXBlb2YgY2xpY2tPcHRpb24gPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lCgkJCQkJdmlldy5jYWxlbmRhci56b29tVG8oZGF0ZSwgY2xpY2tPcHRpb24pOwoJCQkJfQoJCQl9KTsKCX0sCgoKCS8vIFJldmVhbHMgdGhlIHBvcG92ZXIgdGhhdCBkaXNwbGF5cyBhbGwgZXZlbnRzIHdpdGhpbiBhIGNlbGwKCXNob3dTZWdQb3BvdmVyOiBmdW5jdGlvbihyb3csIGNvbCwgbW9yZUxpbmssIHNlZ3MpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtb3JlV3JhcCA9IG1vcmVMaW5rLnBhcmVudCgpOyAvLyB0aGUgPGRpdj4gd3JhcHBlciBhcm91bmQgdGhlIDxhPgoJCXZhciB0b3BFbDsgLy8gdGhlIGVsZW1lbnQgd2Ugd2FudCB0byBtYXRjaCB0aGUgdG9wIGNvb3JkaW5hdGUgb2YKCQl2YXIgb3B0aW9uczsKCgkJaWYgKHRoaXMucm93Q250ID09IDEpIHsKCQkJdG9wRWwgPSB2aWV3LmVsOyAvLyB3aWxsIGNhdXNlIHRoZSBwb3BvdmVyIHRvIGNvdmVyIGFueSBzb3J0IG9mIGhlYWRlcgoJCX0KCQllbHNlIHsKCQkJdG9wRWwgPSB0aGlzLnJvd0Vscy5lcShyb3cpOyAvLyB3aWxsIGFsaWduIHdpdGggdG9wIG9mIHJvdwoJCX0KCgkJb3B0aW9ucyA9IHsKCQkJY2xhc3NOYW1lOiAnZmMtbW9yZS1wb3BvdmVyJywKCQkJY29udGVudDogdGhpcy5yZW5kZXJTZWdQb3BvdmVyQ29udGVudChyb3csIGNvbCwgc2VncyksCgkJCXBhcmVudEVsOiB0aGlzLnZpZXcuZWwsIC8vIGF0dGFjaCB0byByb290IG9mIHZpZXcuIGd1YXJhbnRlZXMgb3V0c2lkZSBvZiBzY3JvbGxiYXJzLgoJCQl0b3A6IHRvcEVsLm9mZnNldCgpLnRvcCwKCQkJYXV0b0hpZGU6IHRydWUsIC8vIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGVsc2V3aGVyZSwgaGlkZSB0aGUgcG9wb3ZlcgoJCQl2aWV3cG9ydENvbnN0cmFpbjogdmlldy5vcHQoJ3BvcG92ZXJWaWV3cG9ydENvbnN0cmFpbicpLAoJCQloaWRlOiBmdW5jdGlvbigpIHsKCQkJCS8vIGtpbGwgZXZlcnl0aGluZyB3aGVuIHRoZSBwb3BvdmVyIGlzIGhpZGRlbgoJCQkJX3RoaXMuc2VnUG9wb3Zlci5yZW1vdmVFbGVtZW50KCk7CgkJCQlfdGhpcy5zZWdQb3BvdmVyID0gbnVsbDsKCQkJCV90aGlzLnBvcG92ZXJTZWdzID0gbnVsbDsKCQkJfQoJCX07CgoJCS8vIERldGVybWluZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuCgkJLy8gV2UgdXNlIHRoZSBtb3JlV3JhcCBpbnN0ZWFkIG9mIHRoZSA8dGQ+IHRvIGF2b2lkIGJvcmRlciBjb25mdXNpb24uCgkJaWYgKHRoaXMuaXNSVEwpIHsKCQkJb3B0aW9ucy5yaWdodCA9IG1vcmVXcmFwLm9mZnNldCgpLmxlZnQgKyBtb3JlV3JhcC5vdXRlcldpZHRoKCkgKyAxOyAvLyArMSB0byBiZSBvdmVyIGNlbGwgYm9yZGVyCgkJfQoJCWVsc2UgewoJCQlvcHRpb25zLmxlZnQgPSBtb3JlV3JhcC5vZmZzZXQoKS5sZWZ0IC0gMTsgLy8gLTEgdG8gYmUgb3ZlciBjZWxsIGJvcmRlcgoJCX0KCgkJdGhpcy5zZWdQb3BvdmVyID0gbmV3IFBvcG92ZXIob3B0aW9ucyk7CgkJdGhpcy5zZWdQb3BvdmVyLnNob3coKTsKCgkJLy8gdGhlIHBvcG92ZXIgZG9lc24ndCBsaXZlIHdpdGhpbiB0aGUgZ3JpZCdzIGNvbnRhaW5lciBlbGVtZW50LCBhbmQgdGh1cyB3b24ndCBnZXQgdGhlIGV2ZW50CgkJLy8gZGVsZWdhdGVkLWhhbmRsZXJzIGZvciBmcmVlLiBhdHRhY2ggZXZlbnQtcmVsYXRlZCBoYW5kbGVycyB0byB0aGUgcG9wb3Zlci4KCQl0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5zZWdQb3BvdmVyLmVsKTsKCX0sCgoKCS8vIEJ1aWxkcyB0aGUgaW5uZXIgRE9NIGNvbnRlbnRzIG9mIHRoZSBzZWdtZW50IHBvcG92ZXIKCXJlbmRlclNlZ1BvcG92ZXJDb250ZW50OiBmdW5jdGlvbihyb3csIGNvbCwgc2VncykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1RoZW1lID0gdmlldy5vcHQoJ3RoZW1lJyk7CgkJdmFyIHRpdGxlID0gdGhpcy5nZXRDZWxsRGF0ZShyb3csIGNvbCkuZm9ybWF0KHZpZXcub3B0KCdkYXlQb3BvdmVyRm9ybWF0JykpOwoJCXZhciBjb250ZW50ID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWhlYWRlciAnICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnICsKCQkJCQkoaXNUaGVtZSA/ICd1aS1pY29uIHVpLWljb24tY2xvc2V0aGljaycgOiAnZmMtaWNvbiBmYy1pY29uLXgnKSArCgkJCQknIj48L3NwYW4+JyArCgkJCQknPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQlodG1sRXNjYXBlKHRpdGxlKSArCgkJCQknPC9zcGFuPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JyArCgkJCSc8L2Rpdj4nICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJvZHkgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQknPGRpdiBjbGFzcz0iZmMtZXZlbnQtY29udGFpbmVyIj48L2Rpdj4nICsKCQkJJzwvZGl2PicKCQkpOwoJCXZhciBzZWdDb250YWluZXIgPSBjb250ZW50LmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGVhY2ggc2VnJ3MgYGVsYCBhbmQgb25seSByZXR1cm4gdGhlIHZpc2libGUgc2VncwoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MsIHRydWUpOyAvLyBkaXNhYmxlUmVzaXppbmc9dHJ1ZQoJCXRoaXMucG9wb3ZlclNlZ3MgPSBzZWdzOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoKCQkJLy8gYmVjYXVzZSBzZWdtZW50cyBpbiB0aGUgcG9wb3ZlciBhcmUgbm90IHBhcnQgb2YgYSBncmlkIGNvb3JkaW5hdGUgc3lzdGVtLCBwcm92aWRlIGEgaGludCB0byBhbnkKCQkJLy8gZ3JpZHMgdGhhdCB3YW50IHRvIGRvIGRyYWctbi1kcm9wIGFib3V0IHdoaWNoIGNlbGwgaXQgY2FtZSBmcm9tCgkJCXRoaXMucHJlcGFyZUhpdHMoKTsKCQkJc2Vnc1tpXS5oaXQgPSB0aGlzLmdldENlbGxIaXQocm93LCBjb2wpOwoJCQl0aGlzLnJlbGVhc2VIaXRzKCk7CgoJCQlzZWdDb250YWluZXIuYXBwZW5kKHNlZ3NbaV0uZWwpOwoJCX0KCgkJcmV0dXJuIGNvbnRlbnQ7Cgl9LAoKCgkvLyBHaXZlbiB0aGUgZXZlbnRzIHdpdGhpbiBhbiBhcnJheSBvZiBzZWdtZW50IG9iamVjdHMsIHJlc2xpY2UgdGhlbSB0byBiZSBpbiBhIHNpbmdsZSBkYXkKCXJlc2xpY2VEYXlTZWdzOiBmdW5jdGlvbihzZWdzLCBkYXlEYXRlKSB7CgoJCS8vIGJ1aWxkIGFuIGFycmF5IG9mIHRoZSBvcmlnaW5hbCBldmVudHMKCQl2YXIgZXZlbnRzID0gJC5tYXAoc2VncywgZnVuY3Rpb24oc2VnKSB7CgkJCXJldHVybiBzZWcuZXZlbnQ7CgkJfSk7CgoJCXZhciBkYXlTdGFydCA9IGRheURhdGUuY2xvbmUoKTsKCQl2YXIgZGF5RW5kID0gZGF5U3RhcnQuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl2YXIgZGF5UmFuZ2UgPSB7IHN0YXJ0OiBkYXlTdGFydCwgZW5kOiBkYXlFbmQgfTsKCgkJLy8gc2xpY2UgdGhlIGV2ZW50cyB3aXRoIGEgY3VzdG9tIHNsaWNpbmcgZnVuY3Rpb24KCQlzZWdzID0gdGhpcy5ldmVudHNUb1NlZ3MoCgkJCWV2ZW50cywKCQkJZnVuY3Rpb24ocmFuZ2UpIHsKCQkJCXZhciBzZWcgPSBpbnRlcnNlY3RSYW5nZXMocmFuZ2UsIGRheVJhbmdlKTsgLy8gdW5kZWZpbmQgaWYgbm8gaW50ZXJzZWN0aW9uCgkJCQlyZXR1cm4gc2VnID8gWyBzZWcgXSA6IFtdOyAvLyBtdXN0IHJldHVybiBhbiBhcnJheSBvZiBzZWdtZW50cwoJCQl9CgkJKTsKCgkJLy8gZm9yY2UgYW4gb3JkZXIgYmVjYXVzZSBldmVudHNUb1NlZ3MgZG9lc24ndCBndWFyYW50ZWUgb25lCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOwoKCQlyZXR1cm4gc2VnczsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBpbnNpZGUgYSAibW9yZSIgbGluaywgZ2l2ZW4gdGhlIG51bWJlciBvZiBldmVudHMgaXQgcmVwcmVzZW50cwoJZ2V0TW9yZUxpbmtUZXh0OiBmdW5jdGlvbihudW0pIHsKCQl2YXIgb3B0ID0gdGhpcy52aWV3Lm9wdCgnZXZlbnRMaW1pdFRleHQnKTsKCgkJaWYgKHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicpIHsKCQkJcmV0dXJuIG9wdChudW0pOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuICcrJyArIG51bSArICcgJyArIG9wdDsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIHNlZ21lbnRzIHdpdGhpbiBhIGdpdmVuIGNlbGwuCgkvLyBJZiBgc3RhcnRMZXZlbGAgaXMgc3BlY2lmaWVkLCByZXR1cm5zIG9ubHkgZXZlbnRzIGluY2x1ZGluZyBhbmQgYmVsb3cgdGhhdCBsZXZlbC4gT3RoZXJ3aXNlIHJldHVybnMgYWxsIHNlZ3MuCglnZXRDZWxsU2VnczogZnVuY3Rpb24ocm93LCBjb2wsIHN0YXJ0TGV2ZWwpIHsKCQl2YXIgc2VnTWF0cml4ID0gdGhpcy5yb3dTdHJ1Y3RzW3Jvd10uc2VnTWF0cml4OwoJCXZhciBsZXZlbCA9IHN0YXJ0TGV2ZWwgfHwgMDsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgoJCXdoaWxlIChsZXZlbCA8IHNlZ01hdHJpeC5sZW5ndGgpIHsKCQkJc2VnID0gc2VnTWF0cml4W2xldmVsXVtjb2xdOwoJCQlpZiAoc2VnKSB7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCQlsZXZlbCsrOwoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9Cgp9KTsKCjs7CgovKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgb25lIG9yIG1vcmUgY29sdW1ucyBvZiB2ZXJ0aWNhbCB0aW1lIHNsb3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLyBXZSBtaXhpbiBEYXlUYWJsZSwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgb25seSBhIHNpbmdsZSByb3cgb2YgZGF5cwoKdmFyIFRpbWVHcmlkID0gRkMuVGltZUdyaWQgPSBHcmlkLmV4dGVuZChEYXlUYWJsZU1peGluLCB7CgoJc2xvdER1cmF0aW9uOiBudWxsLCAvLyBkdXJhdGlvbiBvZiBhICJzbG90IiwgYSBkaXN0aW5jdCB0aW1lIHNlZ21lbnQgb24gZ2l2ZW4gZGF5LCB2aXN1YWxpemVkIGJ5IGxpbmVzCglzbmFwRHVyYXRpb246IG51bGwsIC8vIGdyYW51bGFyaXR5IG9mIHRpbWUgZm9yIGRyYWdnaW5nIGFuZCBzZWxlY3RpbmcKCXNuYXBzUGVyU2xvdDogbnVsbCwKCW1pblRpbWU6IG51bGwsIC8vIER1cmF0aW9uIG9iamVjdCB0aGF0IGRlbm90ZXMgdGhlIGZpcnN0IHZpc2libGUgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CgltYXhUaW1lOiBudWxsLCAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBleGNsdXNpdmUgdmlzaWJsZSBlbmQgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5CglsYWJlbEZvcm1hdDogbnVsbCwgLy8gZm9ybWF0dGluZyBzdHJpbmcgZm9yIHRpbWVzIHJ1bm5pbmcgYWxvbmcgdmVydGljYWwgYXhpcwoJbGFiZWxJbnRlcnZhbDogbnVsbCwgLy8gZHVyYXRpb24gb2YgaG93IG9mdGVuIGEgbGFiZWwgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgYSBzbG90CgoJY29sRWxzOiBudWxsLCAvLyBjZWxscyBlbGVtZW50cyBpbiB0aGUgZGF5LXJvdyBiYWNrZ3JvdW5kCglzbGF0Q29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IHdyYXBzIGFsbCB0aGUgc2xhdCByb3dzCglzbGF0RWxzOiBudWxsLCAvLyBlbGVtZW50cyBydW5uaW5nIGhvcml6b250YWxseSBhY3Jvc3MgYWxsIGNvbHVtbnMKCW5vd0luZGljYXRvckVsczogbnVsbCwKCgljb2xDb29yZENhY2hlOiBudWxsLAoJc2xhdENvb3JkQ2FjaGU6IG51bGwsCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHsKCQlHcmlkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGNhbGwgdGhlIHN1cGVyLWNvbnN0cnVjdG9yCgoJCXRoaXMucHJvY2Vzc09wdGlvbnMoKTsKCX0sCgoKCS8vIFJlbmRlcnMgdGhlIHRpbWUgZ3JpZCBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgYXNzaWduZWQuCgkvLyBSZWxpZXMgb24gdGhlIHZpZXcncyBjb2xDbnQuIEluIHRoZSBmdXR1cmUsIHRoaXMgY29tcG9uZW50IHNob3VsZCBwcm9iYWJseSBiZSBzZWxmLXN1ZmZpY2llbnQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5odG1sKHRoaXMucmVuZGVySHRtbCgpKTsKCQl0aGlzLmNvbEVscyA9IHRoaXMuZWwuZmluZCgnLmZjLWRheScpOwoJCXRoaXMuc2xhdENvbnRhaW5lckVsID0gdGhpcy5lbC5maW5kKCcuZmMtc2xhdHMnKTsKCQl0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0cicpOwoKCQl0aGlzLmNvbENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5jb2xFbHMsCgkJCWlzSG9yaXpvbnRhbDogdHJ1ZQoJCX0pOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CgkJCWVsczogdGhpcy5zbGF0RWxzLAoJCQlpc1ZlcnRpY2FsOiB0cnVlCgkJfSk7CgoJCXRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCk7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBiYXNpYyBIVE1MIHNrZWxldG9uIGZvciB0aGUgZ3JpZAoJcmVuZGVySHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzxkaXYgY2xhc3M9ImZjLWJnIj4nICsKCQkJCSc8dGFibGU+JyArCgkJCQkJdGhpcy5yZW5kZXJCZ1RySHRtbCgwKSArIC8vIHJvdz0wCgkJCQknPC90YWJsZT4nICsKCQkJJzwvZGl2PicgKwoJCQknPGRpdiBjbGFzcz0iZmMtc2xhdHMiPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQl0aGlzLnJlbmRlclNsYXRSb3dIdG1sKCkgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIGZvciB0aGUgaG9yaXpvbnRhbCAic2xhdHMiIHRoYXQgcnVuIHdpZHRoLXdpc2UuIEhhcyBhIHRpbWUgYXhpcyBvbiBhIHNpZGUuIERlcGVuZHMgb24gUlRMLgoJcmVuZGVyU2xhdFJvd0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBpc1JUTCA9IHRoaXMuaXNSVEw7CgkJdmFyIGh0bWwgPSAnJzsKCQl2YXIgc2xvdFRpbWUgPSBtb21lbnQuZHVyYXRpb24oK3RoaXMubWluVGltZSk7IC8vIHdpc2ggdGhlcmUgd2FzIC5jbG9uZSgpIGZvciBkdXJhdGlvbnMKCQl2YXIgc2xvdERhdGU7IC8vIHdpbGwgYmUgb24gdGhlIHZpZXcncyBmaXJzdCBkYXksIGJ1dCB3ZSBvbmx5IGNhcmUgYWJvdXQgaXRzIHRpbWUKCQl2YXIgaXNMYWJlbGVkOwoJCXZhciBheGlzSHRtbDsKCgkJLy8gQ2FsY3VsYXRlIHRoZSB0aW1lIGZvciBlYWNoIHNsb3QKCQl3aGlsZSAoc2xvdFRpbWUgPCB0aGlzLm1heFRpbWUpIHsKCQkJc2xvdERhdGUgPSB0aGlzLnN0YXJ0LmNsb25lKCkudGltZShzbG90VGltZSk7CgkJCWlzTGFiZWxlZCA9IGlzSW50KGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihzbG90VGltZSwgdGhpcy5sYWJlbEludGVydmFsKSk7CgoJCQlheGlzSHRtbCA9CgkJCQknPHRkIGNsYXNzPSJmYy1heGlzIGZjLXRpbWUgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQkoaXNMYWJlbGVkID8KCQkJCQkJJzxzcGFuPicgKyAvLyBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCQlodG1sRXNjYXBlKHNsb3REYXRlLmZvcm1hdCh0aGlzLmxhYmVsRm9ybWF0KSkgKwoJCQkJCQknPC9zcGFuPicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L3RkPic7CgoJCQlodG1sICs9CgkJCQknPHRyIGRhdGEtdGltZT0iJyArIHNsb3REYXRlLmZvcm1hdCgnSEg6bW06c3MnKSArICciJyArCgkJCQkJKGlzTGFiZWxlZCA/ICcnIDogJyBjbGFzcz0iZmMtbWlub3IiJykgKwoJCQkJCSc+JyArCgkJCQkJKCFpc1JUTCA/IGF4aXNIdG1sIDogJycpICsKCQkJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIi8+JyArCgkJCQkJKGlzUlRMID8gYXhpc0h0bWwgOiAnJykgKwoJCQkJIjwvdHI+IjsKCgkJCXNsb3RUaW1lLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4gaHRtbDsKCX0sCgoKCS8qIE9wdGlvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFBhcnNlcyB2YXJpb3VzIG9wdGlvbnMgaW50byBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0Cglwcm9jZXNzT3B0aW9uczogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIHNsb3REdXJhdGlvbiA9IHZpZXcub3B0KCdzbG90RHVyYXRpb24nKTsKCQl2YXIgc25hcER1cmF0aW9uID0gdmlldy5vcHQoJ3NuYXBEdXJhdGlvbicpOwoJCXZhciBpbnB1dDsKCgkJc2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7CgkJc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uID8gbW9tZW50LmR1cmF0aW9uKHNuYXBEdXJhdGlvbikgOiBzbG90RHVyYXRpb247CgoJCXRoaXMuc2xvdER1cmF0aW9uID0gc2xvdER1cmF0aW9uOwoJCXRoaXMuc25hcER1cmF0aW9uID0gc25hcER1cmF0aW9uOwoJCXRoaXMuc25hcHNQZXJTbG90ID0gc2xvdER1cmF0aW9uIC8gc25hcER1cmF0aW9uOyAvLyBUT0RPOiBlbnN1cmUgYW4gaW50ZWdlciBtdWx0aXBsZT8KCgkJdGhpcy5taW5SZXNpemVEdXJhdGlvbiA9IHNuYXBEdXJhdGlvbjsgLy8gaGFjawoKCQl0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odmlldy5vcHQoJ21pblRpbWUnKSk7CgkJdGhpcy5tYXhUaW1lID0gbW9tZW50LmR1cmF0aW9uKHZpZXcub3B0KCdtYXhUaW1lJykpOwoKCQkvLyBtaWdodCBiZSBhbiBhcnJheSB2YWx1ZSAoZm9yIFRpbWVsaW5lVmlldykuCgkJLy8gaWYgc28sIGdldHRpbmcgdGhlIG1vc3QgZ3JhbnVsYXIgZW50cnkgKHRoZSBsYXN0IG9uZSBwcm9iYWJseSkuCgkJaW5wdXQgPSB2aWV3Lm9wdCgnc2xvdExhYmVsRm9ybWF0Jyk7CgkJaWYgKCQuaXNBcnJheShpbnB1dCkpIHsKCQkJaW5wdXQgPSBpbnB1dFtpbnB1dC5sZW5ndGggLSAxXTsKCQl9CgoJCXRoaXMubGFiZWxGb3JtYXQgPQoJCQlpbnB1dCB8fAoJCQl2aWV3Lm9wdCgnc21hbGxUaW1lRm9ybWF0Jyk7IC8vIHRoZSBjb21wdXRlZCBkZWZhdWx0CgoJCWlucHV0ID0gdmlldy5vcHQoJ3Nsb3RMYWJlbEludGVydmFsJyk7CgkJdGhpcy5sYWJlbEludGVydmFsID0gaW5wdXQgPwoJCQltb21lbnQuZHVyYXRpb24oaW5wdXQpIDoKCQkJdGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChzbG90RHVyYXRpb24pOwoJfSwKCgoJLy8gQ29tcHV0ZXMgYW4gYXV0b21hdGljIHZhbHVlIGZvciBzbG90TGFiZWxJbnRlcnZhbAoJY29tcHV0ZUxhYmVsSW50ZXJ2YWw6IGZ1bmN0aW9uKHNsb3REdXJhdGlvbikgewoJCXZhciBpOwoJCXZhciBsYWJlbEludGVydmFsOwoJCXZhciBzbG90c1BlckxhYmVsOwoKCQkvLyBmaW5kIHRoZSBzbWFsbGVzdCBzdG9jayBsYWJlbCBpbnRlcnZhbCB0aGF0IHJlc3VsdHMgaW4gbW9yZSB0aGFuIG9uZSBzbG90cy1wZXItbGFiZWwKCQlmb3IgKGkgPSBBR0VOREFfU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlsYWJlbEludGVydmFsID0gbW9tZW50LmR1cmF0aW9uKEFHRU5EQV9TVE9DS19TVUJfRFVSQVRJT05TW2ldKTsKCQkJc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCBzbG90RHVyYXRpb24pOwoJCQlpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEpIHsKCQkJCXJldHVybiBsYWJlbEludGVydmFsOwoJCQl9CgkJfQoKCQlyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHNsb3REdXJhdGlvbik7IC8vIGZhbGwgYmFjay4gY2xvbmUKCX0sCgoKCS8vIENvbXB1dGVzIGEgZGVmYXVsdCBldmVudCB0aW1lIGZvcm1hdHRpbmcgc3RyaW5nIGlmIGB0aW1lRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbm9NZXJpZGllbVRpbWVGb3JtYXQnKTsgLy8gbGlrZSAiNjozMCIgKG5vIEFNL1BNKQoJfSwKCgoJLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGBkaXNwbGF5RXZlbnRFbmRgIHZhbHVlIGlmIG9uZSBpcyBub3QgZXhwbGljbHR5IGRlZmluZWQKCWNvbXB1dGVEaXNwbGF5RXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0cnVlOwoJfSwKCgoJLyogSGl0IFN5c3RlbQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpOwoJCXRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKCX0sCgoKCXJlbGVhc2VIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKTsKCQkvLyBOT1RFOiBkb24ndCBjbGVhciBzbGF0Q29vcmRDYWNoZSBiZWNhdXNlIHdlIHJlbHkgb24gaXQgZm9yIGNvbXB1dGVUaW1lVG9wCgl9LAoKCglxdWVyeUhpdDogZnVuY3Rpb24obGVmdE9mZnNldCwgdG9wT2Zmc2V0KSB7CgkJdmFyIHNuYXBzUGVyU2xvdCA9IHRoaXMuc25hcHNQZXJTbG90OwoJCXZhciBjb2xDb29yZENhY2hlID0gdGhpcy5jb2xDb29yZENhY2hlOwoJCXZhciBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CgoJCWlmIChjb2xDb29yZENhY2hlLmlzTGVmdEluQm91bmRzKGxlZnRPZmZzZXQpICYmIHNsYXRDb29yZENhY2hlLmlzVG9wSW5Cb3VuZHModG9wT2Zmc2V0KSkgewoJCQl2YXIgY29sSW5kZXggPSBjb2xDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKCQkJdmFyIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgodG9wT2Zmc2V0KTsKCgkJCWlmIChjb2xJbmRleCAhPSBudWxsICYmIHNsYXRJbmRleCAhPSBudWxsKSB7CgkJCQl2YXIgc2xhdFRvcCA9IHNsYXRDb29yZENhY2hlLmdldFRvcE9mZnNldChzbGF0SW5kZXgpOwoJCQkJdmFyIHNsYXRIZWlnaHQgPSBzbGF0Q29vcmRDYWNoZS5nZXRIZWlnaHQoc2xhdEluZGV4KTsKCQkJCXZhciBwYXJ0aWFsID0gKHRvcE9mZnNldCAtIHNsYXRUb3ApIC8gc2xhdEhlaWdodDsgLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQoJCQkJdmFyIGxvY2FsU25hcEluZGV4ID0gTWF0aC5mbG9vcihwYXJ0aWFsICogc25hcHNQZXJTbG90KTsgLy8gdGhlIHNuYXAgIyByZWxhdGl2ZSB0byBzdGFydCBvZiBzbGF0CgkJCQl2YXIgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CgkJCQl2YXIgc25hcFRvcCA9IHNsYXRUb3AgKyAobG9jYWxTbmFwSW5kZXggLyBzbmFwc1BlclNsb3QpICogc2xhdEhlaWdodDsKCQkJCXZhciBzbmFwQm90dG9tID0gc2xhdFRvcCArICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0SGVpZ2h0OwoKCQkJCXJldHVybiB7CgkJCQkJY29sOiBjb2xJbmRleCwKCQkJCQlzbmFwOiBzbmFwSW5kZXgsCgkJCQkJY29tcG9uZW50OiB0aGlzLCAvLyBuZWVkZWQgdW5mb3J0dW5hdGVseSA6KAoJCQkJCWxlZnQ6IGNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChjb2xJbmRleCksCgkJCQkJcmlnaHQ6IGNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoY29sSW5kZXgpLAoJCQkJCXRvcDogc25hcFRvcCwKCQkJCQlib3R0b206IHNuYXBCb3R0b20KCQkJCX07CgkJCX0KCQl9Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQl2YXIgc3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKDAsIGhpdC5jb2wpOyAvLyByb3c9MAoJCXZhciB0aW1lID0gdGhpcy5jb21wdXRlU25hcFRpbWUoaGl0LnNuYXApOyAvLyBwYXNzIGluIHRoZSBzbmFwLWluZGV4CgkJdmFyIGVuZDsKCgkJc3RhcnQudGltZSh0aW1lKTsKCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbik7CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKCX0sCgoKCWdldEhpdEVsOiBmdW5jdGlvbihoaXQpIHsKCQlyZXR1cm4gdGhpcy5jb2xFbHMuZXEoaGl0LmNvbCk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmFuZ2VVcGRhdGVkOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVwZGF0ZURheVRhYmxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHJvdyBudW1iZXIgb2YgdGhlIGdyaWQsIHJlcHJlc2VudGluZyBhICJzbmFwIiwgcmV0dXJucyBhIHRpbWUgKER1cmF0aW9uKSBmcm9tIGl0cyBzdGFydC1vZi1kYXkKCWNvbXB1dGVTbmFwVGltZTogZnVuY3Rpb24oc25hcEluZGV4KSB7CgkJcmV0dXJuIG1vbWVudC5kdXJhdGlvbih0aGlzLm1pblRpbWUgKyB0aGlzLnNuYXBEdXJhdGlvbiAqIHNuYXBJbmRleCk7Cgl9LAoKCgkvLyBTbGljZXMgdXAgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBpbnRvIGFuIGFycmF5IG9mIHNlZ21lbnRzCglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2VCeVRpbWVzKHNwYW4pOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5pc1JUTCkgewoJCQkJc2Vnc1tpXS5jb2wgPSB0aGlzLmRheXNQZXJSb3cgLSAxIC0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCQllbHNlIHsKCQkJCXNlZ3NbaV0uY29sID0gc2Vnc1tpXS5kYXlJbmRleDsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCglzbGljZVJhbmdlQnlUaW1lczogZnVuY3Rpb24ocmFuZ2UpIHsKCQl2YXIgc2VncyA9IFtdOwoJCXZhciBzZWc7CgkJdmFyIGRheUluZGV4OwoJCXZhciBkYXlEYXRlOwoJCXZhciBkYXlSYW5nZTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgdGhpcy5kYXlzUGVyUm93OyBkYXlJbmRleCsrKSB7CgkJCWRheURhdGUgPSB0aGlzLmRheURhdGVzW2RheUluZGV4XS5jbG9uZSgpOyAvLyBUT0RPOiBiZXR0ZXIgQVBJIGZvciB0aGlzPwoJCQlkYXlSYW5nZSA9IHsKCQkJCXN0YXJ0OiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1pblRpbWUpLAoJCQkJZW5kOiBkYXlEYXRlLmNsb25lKCkudGltZSh0aGlzLm1heFRpbWUpCgkJCX07CgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhyYW5nZSwgZGF5UmFuZ2UpOyAvLyBib3RoIHdpbGwgYmUgYW1iaWcgdGltZXpvbmUKCQkJaWYgKHNlZykgewoJCQkJc2VnLmRheUluZGV4ID0gZGF5SW5kZXg7CgkJCQlzZWdzLnB1c2goc2VnKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHNlZ3M7Cgl9LAoKCgkvKiBDb29yZGluYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsgLy8gTk9UIGEgc3RhbmRhcmQgR3JpZCBtZXRob2QKCQl0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCk7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscygKCQkJCVtdLmNvbmNhdCh0aGlzLmZnU2VncyB8fCBbXSwgdGhpcy5iZ1NlZ3MgfHwgW10sIHRoaXMuYnVzaW5lc3NTZWdzIHx8IFtdKQoJCQkpOwoJCX0KCX0sCgoKCWdldFRvdGFsU2xhdEhlaWdodDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2xhdENvbnRhaW5lckVsLm91dGVySGVpZ2h0KCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgdG9wIGNvb3JkaW5hdGUsIHJlbGF0aXZlIHRvIHRoZSBib3VuZHMgb2YgdGhlIGdyaWQsIG9mIHRoZSBnaXZlbiBkYXRlLgoJLy8gQSBgc3RhcnRPZkRheURhdGVgIG11c3QgYmUgZ2l2ZW4gZm9yIGF2b2lkaW5nIGFtYmlndWl0eSBvdmVyIGhvdyB0byB0cmVhdCBtaWRuaWdodC4KCWNvbXB1dGVEYXRlVG9wOiBmdW5jdGlvbihkYXRlLCBzdGFydE9mRGF5RGF0ZSkgewoJCXJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKAoJCQltb21lbnQuZHVyYXRpb24oCgkJCQlkYXRlIC0gc3RhcnRPZkRheURhdGUuY2xvbmUoKS5zdHJpcFRpbWUoKQoJCQkpCgkJKTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSB0b3AgY29vcmRpbmF0ZSwgcmVsYXRpdmUgdG8gdGhlIGJvdW5kcyBvZiB0aGUgZ3JpZCwgb2YgdGhlIGdpdmVuIHRpbWUgKGEgRHVyYXRpb24pLgoJY29tcHV0ZVRpbWVUb3A6IGZ1bmN0aW9uKHRpbWUpIHsKCQl2YXIgbGVuID0gdGhpcy5zbGF0RWxzLmxlbmd0aDsKCQl2YXIgc2xhdENvdmVyYWdlID0gKHRpbWUgLSB0aGlzLm1pblRpbWUpIC8gdGhpcy5zbG90RHVyYXRpb247IC8vIGZsb2F0aW5nLXBvaW50IHZhbHVlIG9mICMgb2Ygc2xvdHMgY292ZXJlZAoJCXZhciBzbGF0SW5kZXg7CgkJdmFyIHNsYXRSZW1haW5kZXI7CgoJCS8vIGNvbXB1dGUgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgZm9yIGhvdyBtYW55IHNsYXRzIHNob3VsZCBiZSBwcm9ncmVzc2VkIHRocm91Z2guCgkJLy8gZnJvbSAwIHRvIG51bWJlciBvZiBzbGF0cyAoaW5jbHVzaXZlKQoJCS8vIGNvbnN0cmFpbmVkIGJlY2F1c2UgbWluVGltZS9tYXhUaW1lIG1pZ2h0IGJlIGN1c3RvbWl6ZWQuCgkJc2xhdENvdmVyYWdlID0gTWF0aC5tYXgoMCwgc2xhdENvdmVyYWdlKTsKCQlzbGF0Q292ZXJhZ2UgPSBNYXRoLm1pbihsZW4sIHNsYXRDb3ZlcmFnZSk7CgoJCS8vIGFuIGludGVnZXIgaW5kZXggb2YgdGhlIGZ1cnRoZXN0IHdob2xlIHNsYXQKCQkvLyBmcm9tIDAgdG8gbnVtYmVyIHNsYXRzICgqZXhjbHVzaXZlKiwgc28gbGVuLTEpCgkJc2xhdEluZGV4ID0gTWF0aC5mbG9vcihzbGF0Q292ZXJhZ2UpOwoJCXNsYXRJbmRleCA9IE1hdGgubWluKHNsYXRJbmRleCwgbGVuIC0gMSk7CgoJCS8vIGhvdyBtdWNoIGZ1cnRoZXIgdGhyb3VnaCB0aGUgc2xhdEluZGV4IHNsYXQgKGZyb20gMC4wLTEuMCkgbXVzdCBiZSBjb3ZlcmVkIGluIGFkZGl0aW9uLgoJCS8vIGNvdWxkIGJlIDEuMCBpZiBzbGF0Q292ZXJhZ2UgaXMgY292ZXJpbmcgKmFsbCogdGhlIHNsb3RzCgkJc2xhdFJlbWFpbmRlciA9IHNsYXRDb3ZlcmFnZSAtIHNsYXRJbmRleDsKCgkJcmV0dXJuIHRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0VG9wUG9zaXRpb24oc2xhdEluZGV4KSArCgkJCXRoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KHNsYXRJbmRleCkgKiBzbGF0UmVtYWluZGVyOwoJfSwKCgoKCS8qIEV2ZW50IERyYWcgVmlzdWFsaXphdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQgb3ZlciB0aGUgc3BlY2lmaWVkIGRhdGUocykuCgkvLyBBIHJldHVybmVkIHZhbHVlIG9mIGB0cnVlYCBzaWduYWxzIHRoYXQgYSBtb2NrICJoZWxwZXIiIGV2ZW50IGhhcyBiZWVuIHJlbmRlcmVkLgoJcmVuZGVyRHJhZzogZnVuY3Rpb24oZXZlbnRMb2NhdGlvbiwgc2VnKSB7CgoJCWlmIChzZWcpIHsgLy8gaWYgdGhlcmUgaXMgZXZlbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgZHJhZywgcmVuZGVyIGEgaGVscGVyIGV2ZW50CgoJCQkvLyByZXR1cm5zIG1vY2sgZXZlbnQgZWxlbWVudHMKCQkJLy8gc2lnbmFsIHRoYXQgYSBoZWxwZXIgaGFzIGJlZW4gcmVuZGVyZWQKCQkJcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihldmVudExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIHsKCQkJLy8gb3RoZXJ3aXNlLCBqdXN0IHJlbmRlciBhIGhpZ2hsaWdodAoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGV2ZW50TG9jYXRpb24pKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIGRyYWdnZWQKCXVucmVuZGVyRHJhZzogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEV2ZW50IFJlc2l6ZSBWaXN1YWxpemF0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgYmVpbmcgcmVzaXplZAoJcmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKGV2ZW50TG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoZXZlbnRMb2NhdGlvbiwgc2VnKTsgLy8gcmV0dXJucyBtb2NrIGV2ZW50IGVsZW1lbnRzCgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGFuIGV2ZW50IGJlaW5nIHJlc2l6ZWQKCXVucmVuZGVyRXZlbnRSZXNpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXIoKTsKCX0sCgoKCS8qIEV2ZW50IEhlbHBlcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIG1vY2sgImhlbHBlciIgZXZlbnQuIGBzb3VyY2VTZWdgIGlzIHRoZSBvcmlnaW5hbCBzZWdtZW50IG9iamVjdCBhbmQgbWlnaHQgYmUgbnVsbCAoYW4gZXh0ZXJuYWwgZHJhZykKCXJlbmRlckhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewoJCXJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3ModGhpcy5ldmVudFRvU2VncyhldmVudCksIHNvdXJjZVNlZyk7IC8vIHJldHVybnMgbW9jayBldmVudCBlbGVtZW50cwoJfSwKCgoJLy8gVW5yZW5kZXJzIGFueSBtb2NrIGhlbHBlciBldmVudAoJdW5yZW5kZXJIZWxwZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3MoCgkJCXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCkKCQkpOwoJfSwKCgoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyQnVzaW5lc3NTZWdzKCk7Cgl9LAoKCgkvKiBOb3cgSW5kaWNhdG9yCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJ21pbnV0ZSc7IC8vIHdpbGwgcmVmcmVzaCBvbiB0aGUgbWludXRlCgl9LAoKCglyZW5kZXJOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKGRhdGUpIHsKCQkvLyBzZWcgc3lzdGVtIG1pZ2h0IGJlIG92ZXJraWxsLCBidXQgaXQgaGFuZGxlcyBzY2VuYXJpbyB3aGVyZSBsaW5lIG5lZWRzIHRvIGJlIHJlbmRlcmVkCgkJLy8gIG1vcmUgdGhhbiBvbmNlIGJlY2F1c2Ugb2YgY29sdW1ucyB3aXRoIHRoZSBzYW1lIGRhdGUgKHJlc291cmNlcyBjb2x1bW5zIGZvciBleGFtcGxlKQoJCXZhciBzZWdzID0gdGhpcy5zcGFuVG9TZWdzKHsgc3RhcnQ6IGRhdGUsIGVuZDogZGF0ZSB9KTsKCQl2YXIgdG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChkYXRlLCBkYXRlKTsKCQl2YXIgbm9kZXMgPSBbXTsKCQl2YXIgaTsKCgkJLy8gcmVuZGVyIGxpbmVzIHdpdGhpbiB0aGUgY29sdW1ucwoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCW5vZGVzLnB1c2goJCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpCgkJCQkuY3NzKCd0b3AnLCB0b3ApCgkJCQkuYXBwZW5kVG8odGhpcy5jb2xDb250YWluZXJFbHMuZXEoc2Vnc1tpXS5jb2wpKVswXSk7CgkJfQoKCQkvLyByZW5kZXIgYW4gYXJyb3cgb3ZlciB0aGUgYXhpcwoJCWlmIChzZWdzLmxlbmd0aCA+IDApIHsgLy8gaXMgdGhlIGN1cnJlbnQgdGltZSBpbiB2aWV3PwoJCQlub2Rlcy5wdXNoKCQoJzxkaXYgY2xhc3M9ImZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1hcnJvdyI+PC9kaXY+JykKCQkJCS5jc3MoJ3RvcCcsIHRvcCkKCQkJCS5hcHBlbmRUbyh0aGlzLmVsLmZpbmQoJy5mYy1jb250ZW50LXNrZWxldG9uJykpWzBdKTsKCQl9CgoJCXRoaXMubm93SW5kaWNhdG9yRWxzID0gJChub2Rlcyk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMubm93SW5kaWNhdG9yRWxzKSB7CgkJCXRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpOwoJCQl0aGlzLm5vd0luZGljYXRvckVscyA9IG51bGw7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24uIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCwgd2hpY2ggd2FzIHRvIHNpbXBseSByZW5kZXIgYSBoaWdobGlnaHQuCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQlpZiAodGhpcy52aWV3Lm9wdCgnc2VsZWN0SGVscGVyJykpIHsgLy8gdGhpcyBzZXR0aW5nIHNpZ25hbHMgdGhhdCBhIG1vY2sgaGVscGVyIGV2ZW50IHNob3VsZCBiZSByZW5kZXJlZAoKCQkJLy8gbm9ybWFsbHkgYWNjZXBzIGFuIGV2ZW50TG9jYXRpb24sIHNwYW4gaGFzIGEgc3RhcnQvZW5kLCB3aGljaCBpcyBnb29kIGVub3VnaAoJCQl0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIoc3Bhbik7CgkJfQoJCWVsc2UgewoJCQl0aGlzLnJlbmRlckhpZ2hsaWdodChzcGFuKTsKCQl9Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYW55IHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhlbHBlcigpOwoJCXRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKCX0sCgoKCS8qIEhpZ2hsaWdodAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVySGlnaGxpZ2h0OiBmdW5jdGlvbihzcGFuKSB7CgkJdGhpcy5yZW5kZXJIaWdobGlnaHRTZWdzKHRoaXMuc3BhblRvU2VncyhzcGFuKSk7Cgl9LAoKCgl1bnJlbmRlckhpZ2hsaWdodDogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlckhpZ2hsaWdodFNlZ3MoKTsKCX0KCn0pOwoKOzsKCi8qIE1ldGhvZHMgZm9yIHJlbmRlcmluZyBTRUdNRU5UUywgcGllY2VzIG9mIGNvbnRlbnQgdGhhdCBsaXZlIG9uIHRoZSB2aWV3CiAoIHRoaXMgZmlsZSBpcyBubyBsb25nZXIganVzdCBmb3IgZXZlbnRzICkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpUaW1lR3JpZC5taXhpbih7CgoJY29sQ29udGFpbmVyRWxzOiBudWxsLCAvLyBjb250YWluZXJzIGZvciBlYWNoIGNvbHVtbgoKCS8vIGlubmVyLWNvbnRhaW5lcnMgZm9yIGVhY2ggY29sdW1uIHdoZXJlIGRpZmZlcmVudCB0eXBlcyBvZiBzZWdzIGxpdmUKCWZnQ29udGFpbmVyRWxzOiBudWxsLAoJYmdDb250YWluZXJFbHM6IG51bGwsCgloZWxwZXJDb250YWluZXJFbHM6IG51bGwsCgloaWdobGlnaHRDb250YWluZXJFbHM6IG51bGwsCglidXNpbmVzc0NvbnRhaW5lckVsczogbnVsbCwKCgkvLyBhcnJheXMgb2YgZGlmZmVyZW50IHR5cGVzIG9mIGRpc3BsYXllZCBzZWdtZW50cwoJZmdTZWdzOiBudWxsLAoJYmdTZWdzOiBudWxsLAoJaGVscGVyU2VnczogbnVsbCwKCWhpZ2hsaWdodFNlZ3M6IG51bGwsCglidXNpbmVzc1NlZ3M6IG51bGwsCgoKCS8vIFJlbmRlcnMgdGhlIERPTSB0aGF0IHRoZSB2aWV3J3MgY29udGVudCB3aWxsIGxpdmUgaW4KCXJlbmRlckNvbnRlbnRTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGNlbGxIdG1sID0gJyc7CgkJdmFyIGk7CgkJdmFyIHNrZWxldG9uRWw7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCWNlbGxIdG1sICs9CgkJCQknPHRkPicgKwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1jb250ZW50LWNvbCI+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCQknPGRpdiBjbGFzcz0iZmMtaGlnaGxpZ2h0LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZ2V2ZW50LWNvbnRhaW5lciI+PC9kaXY+JyArCgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PicgKwoJCQkJCSc8L2Rpdj4nICsKCQkJCSc8L3RkPic7CgkJfQoKCQlza2VsZXRvbkVsID0gJCgKCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPicgKwoJCQkJJzx0YWJsZT4nICsKCQkJCQknPHRyPicgKyBjZWxsSHRtbCArICc8L3RyPicgKwoJCQkJJzwvdGFibGU+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCgkJdGhpcy5jb2xDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1jb250ZW50LWNvbCcpOwoJCXRoaXMuaGVscGVyQ29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGVscGVyLWNvbnRhaW5lcicpOwoJCXRoaXMuZmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKScpOwoJCXRoaXMuYmdDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1iZ2V2ZW50LWNvbnRhaW5lcicpOwoJCXRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzID0gc2tlbGV0b25FbC5maW5kKCcuZmMtaGlnaGxpZ2h0LWNvbnRhaW5lcicpOwoJCXRoaXMuYnVzaW5lc3NDb250YWluZXJFbHMgPSBza2VsZXRvbkVsLmZpbmQoJy5mYy1idXNpbmVzcy1jb250YWluZXInKTsKCgkJdGhpcy5ib29rZW5kQ2VsbHMoc2tlbGV0b25FbC5maW5kKCd0cicpKTsgLy8gVE9ETzogZG8gdGhpcyBvbiBzdHJpbmcgbGV2ZWwKCQl0aGlzLmVsLmFwcGVuZChza2VsZXRvbkVsKTsKCX0sCgoKCS8qIEZvcmVncm91bmQgRXZlbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJGZ1NlZ3M6IGZ1bmN0aW9uKHNlZ3MpIHsKCQlzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyhzZWdzLCB0aGlzLmZnQ29udGFpbmVyRWxzKTsKCQl0aGlzLmZnU2VncyA9IHNlZ3M7CgkJcmV0dXJuIHNlZ3M7IC8vIG5lZWRlZCBmb3IgR3JpZDo6cmVuZGVyRXZlbnRzCgl9LAoKCgl1bnJlbmRlckZnU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnZmdTZWdzJyk7Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEhlbHBlciBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckhlbHBlclNlZ3M6IGZ1bmN0aW9uKHNlZ3MsIHNvdXJjZVNlZykgewoJCXZhciBoZWxwZXJFbHMgPSBbXTsKCQl2YXIgaSwgc2VnOwoJCXZhciBzb3VyY2VFbDsKCgkJc2VncyA9IHRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoc2VncywgdGhpcy5oZWxwZXJDb250YWluZXJFbHMpOwoKCQkvLyBUcnkgdG8gbWFrZSB0aGUgc2VnbWVudCB0aGF0IGlzIGluIHRoZSBzYW1lIHJvdyBhcyBzb3VyY2VTZWcgbG9vayB0aGUgc2FtZQoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCWlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLmNvbCA9PT0gc2VnLmNvbCkgewoJCQkJc291cmNlRWwgPSBzb3VyY2VTZWcuZWw7CgkJCQlzZWcuZWwuY3NzKHsKCQkJCQlsZWZ0OiBzb3VyY2VFbC5jc3MoJ2xlZnQnKSwKCQkJCQlyaWdodDogc291cmNlRWwuY3NzKCdyaWdodCcpLAoJCQkJCSdtYXJnaW4tbGVmdCc6IHNvdXJjZUVsLmNzcygnbWFyZ2luLWxlZnQnKSwKCQkJCQknbWFyZ2luLXJpZ2h0Jzogc291cmNlRWwuY3NzKCdtYXJnaW4tcmlnaHQnKQoJCQkJfSk7CgkJCX0KCQkJaGVscGVyRWxzLnB1c2goc2VnLmVsWzBdKTsKCQl9CgoJCXRoaXMuaGVscGVyU2VncyA9IHNlZ3M7CgoJCXJldHVybiAkKGhlbHBlckVscyk7IC8vIG11c3QgcmV0dXJuIHJlbmRlcmVkIGhlbHBlcnMKCX0sCgoKCXVucmVuZGVySGVscGVyU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnaGVscGVyU2VncycpOwoJfSwKCgoJLyogQmFja2dyb3VuZCBFdmVudHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCXJlbmRlckJnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2JnRXZlbnQnLCBzZWdzKTsgLy8gVE9ETzogb2xkIGZpbGwgc3lzdGVtCgkJdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoc2Vncyk7CgkJdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKSwgdGhpcy5iZ0NvbnRhaW5lckVscyk7CgkJdGhpcy5iZ1NlZ3MgPSBzZWdzOwoJCXJldHVybiBzZWdzOyAvLyBuZWVkZWQgZm9yIEdyaWQ6OnJlbmRlckV2ZW50cwoJfSwKCgoJdW5yZW5kZXJCZ1NlZ3M6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5yZW5kZXJOYW1lZFNlZ3MoJ2JnU2VncycpOwoJfSwKCgoJLyogSGlnaGxpZ2h0CgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnaGlnaGxpZ2h0Jywgc2Vncyk7IC8vIFRPRE86IG9sZCBmaWxsIHN5c3RlbQoJCXRoaXMudXBkYXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2woc2VncyksIHRoaXMuaGlnaGxpZ2h0Q29udGFpbmVyRWxzKTsKCQl0aGlzLmhpZ2hsaWdodFNlZ3MgPSBzZWdzOwoJfSwKCgoJdW5yZW5kZXJIaWdobGlnaHRTZWdzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCdoaWdobGlnaHRTZWdzJyk7Cgl9LAoKCgkvKiBCdXNpbmVzcyBIb3VycwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcmVuZGVyQnVzaW5lc3NTZWdzOiBmdW5jdGlvbihzZWdzKSB7CgkJc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0VscygnYnVzaW5lc3NIb3VycycsIHNlZ3MpOyAvLyBUT0RPOiBvbGQgZmlsbCBzeXN0ZW0KCQl0aGlzLnVwZGF0ZVNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbCh0aGlzLmdyb3VwU2Vnc0J5Q29sKHNlZ3MpLCB0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKTsKCQl0aGlzLmJ1c2luZXNzU2VncyA9IHNlZ3M7Cgl9LAoKCgl1bnJlbmRlckJ1c2luZXNzU2VnczogZnVuY3Rpb24oKSB7CgkJdGhpcy51bnJlbmRlck5hbWVkU2VncygnYnVzaW5lc3NTZWdzJyk7Cgl9LAoKCgkvKiBTZWcgUmVuZGVyaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBhIGZsYXQgYXJyYXkgb2Ygc2VnbWVudHMsIHJldHVybiBhbiBhcnJheSBvZiBzdWItYXJyYXlzLCBncm91cGVkIGJ5IGVhY2ggc2VnbWVudCdzIGNvbAoJZ3JvdXBTZWdzQnlDb2w6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgc2Vnc0J5Q29sID0gW107CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbENudDsgaSsrKSB7CgkJCXNlZ3NCeUNvbC5wdXNoKFtdKTsKCQl9CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZ3NCeUNvbFtzZWdzW2ldLmNvbF0ucHVzaChzZWdzW2ldKTsKCQl9CgoJCXJldHVybiBzZWdzQnlDb2w7Cgl9LAoKCgkvLyBHaXZlbiBzZWdtZW50cyBncm91cGVkIGJ5IGNvbHVtbiwgaW5zZXJ0IHRoZSBzZWdtZW50cycgZWxlbWVudHMgaW50byBhIHBhcmFsbGVsIGFycmF5IG9mIGNvbnRhaW5lcgoJLy8gZWxlbWVudHMsIGVhY2ggbGl2aW5nIHdpdGhpbiBhIGNvbHVtbi4KCWF0dGFjaFNlZ3NCeUNvbDogZnVuY3Rpb24oc2Vnc0J5Q29sLCBjb250YWluZXJFbHMpIHsKCQl2YXIgY29sOwoJCXZhciBzZWdzOwoJCXZhciBpOwoKCQlmb3IgKGNvbCA9IDA7IGNvbCA8IHRoaXMuY29sQ250OyBjb2wrKykgeyAvLyBpdGVyYXRlIGVhY2ggY29sdW1uIGdyb3VwaW5nCgkJCXNlZ3MgPSBzZWdzQnlDb2xbY29sXTsKCgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQljb250YWluZXJFbHMuZXEoY29sKS5hcHBlbmQoc2Vnc1tpXS5lbCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHaXZlbiB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGB0aGlzYCBvYmplY3QsIGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgb2Ygc2VnbWVudHMsCgkvLyBsb29wcyB0aHJvdWdoIGVhY2ggc2VnbWVudCBhbmQgcmVtb3ZlcyBmcm9tIERPTS4gV2lsbCBudWxsLW91dCB0aGUgcHJvcGVydHkgYWZ0ZXJ3YXJkcy4KCXVucmVuZGVyTmFtZWRTZWdzOiBmdW5jdGlvbihwcm9wTmFtZSkgewoJCXZhciBzZWdzID0gdGhpc1twcm9wTmFtZV07CgkJdmFyIGk7CgoJCWlmIChzZWdzKSB7CgkJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCQlzZWdzW2ldLmVsLnJlbW92ZSgpOwoJCQl9CgkJCXRoaXNbcHJvcE5hbWVdID0gbnVsbDsKCQl9Cgl9LAoKCgoJLyogRm9yZWdyb3VuZCBFdmVudCBSZW5kZXJpbmcgVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdpdmVuIGFuIGFycmF5IG9mIGZvcmVncm91bmQgc2VnbWVudHMsIHJlbmRlciBhIERPTSBlbGVtZW50IGZvciBlYWNoLCBjb21wdXRlcyBwb3NpdGlvbiwKCS8vIGFuZCBhdHRhY2hlcyB0byB0aGUgY29sdW1uIGlubmVyLWNvbnRhaW5lciBlbGVtZW50cy4KCXJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOiBmdW5jdGlvbihzZWdzLCBjb250YWluZXJFbHMpIHsKCQl2YXIgc2Vnc0J5Q29sOwoJCXZhciBjb2w7CgoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyB3aWxsIGNhbGwgZmdTZWdIdG1sCgkJc2Vnc0J5Q29sID0gdGhpcy5ncm91cFNlZ3NCeUNvbChzZWdzKTsKCgkJZm9yIChjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sKyspIHsKCQkJdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhzZWdzQnlDb2xbY29sXSk7CgkJfQoKCQl0aGlzLmF0dGFjaFNlZ3NCeUNvbChzZWdzQnlDb2wsIGNvbnRhaW5lckVscyk7CgoJCXJldHVybiBzZWdzOwoJfSwKCgoJLy8gUmVuZGVycyB0aGUgSFRNTCBmb3IgYSBzaW5nbGUgZXZlbnQgc2VnbWVudCdzIGRlZmF1bHQgcmVuZGVyaW5nCglmZ1NlZ0h0bWw6IGZ1bmN0aW9uKHNlZywgZGlzYWJsZVJlc2l6aW5nKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGV2ZW50ID0gc2VnLmV2ZW50OwoJCXZhciBpc0RyYWdnYWJsZSA9IHZpZXcuaXNFdmVudERyYWdnYWJsZShldmVudCk7CgkJdmFyIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gIWRpc2FibGVSZXNpemluZyAmJiBzZWcuaXNTdGFydCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwoJCXZhciBpc1Jlc2l6YWJsZUZyb21FbmQgPSAhZGlzYWJsZVJlc2l6aW5nICYmIHNlZy5pc0VuZCAmJiB2aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tRW5kKGV2ZW50KTsKCQl2YXIgY2xhc3NlcyA9IHRoaXMuZ2V0U2VnQ2xhc3NlcyhzZWcsIGlzRHJhZ2dhYmxlLCBpc1Jlc2l6YWJsZUZyb21TdGFydCB8fCBpc1Jlc2l6YWJsZUZyb21FbmQpOwoJCXZhciBza2luQ3NzID0gY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpOwoJCXZhciB0aW1lVGV4dDsKCQl2YXIgZnVsbFRpbWVUZXh0OyAvLyBtb3JlIHZlcmJvc2UgdGltZSB0ZXh0LiBmb3IgdGhlIHByaW50IHN0eWxlc2hlZXQKCQl2YXIgc3RhcnRUaW1lVGV4dDsgLy8ganVzdCB0aGUgc3RhcnQgdGltZSB0ZXh0CgoJCWNsYXNzZXMudW5zaGlmdCgnZmMtdGltZS1ncmlkLWV2ZW50JywgJ2ZjLXYtZXZlbnQnKTsKCgkJaWYgKHZpZXcuaXNNdWx0aURheUV2ZW50KGV2ZW50KSkgeyAvLyBpZiB0aGUgZXZlbnQgYXBwZWFycyB0byBzcGFuIG1vcmUgdGhhbiBvbmUgZGF5Li4uCgkJCS8vIERvbid0IGRpc3BsYXkgdGltZSB0ZXh0IG9uIHNlZ21lbnRzIHRoYXQgcnVuIGVudGlyZWx5IHRocm91Z2ggYSBkYXkuCgkJCS8vIFRoYXQgd291bGQgYXBwZWFyIGFzIG1pZG5pZ2h0LW1pZG5pZ2h0IGFuZCB3b3VsZCBsb29rIGR1bWIuCgkJCS8vIE90aGVyd2lzZSwgZGlzcGxheSB0aGUgdGltZSB0ZXh0IGZvciB0aGUgKnNlZ21lbnQncyogdGltZXMgKGxpa2UgNnBtLW1pZG5pZ2h0IG9yIG1pZG5pZ2h0LTEwYW0pCgkJCWlmIChzZWcuaXNTdGFydCB8fCBzZWcuaXNFbmQpIHsKCQkJCXRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZyk7CgkJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCAnTFQnKTsKCQkJCXN0YXJ0VGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoc2VnLCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIERpc3BsYXkgdGhlIG5vcm1hbCB0aW1lIHRleHQgZm9yIHRoZSAqZXZlbnQncyogdGltZXMKCQkJdGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQpOwoJCQlmdWxsVGltZVRleHQgPSB0aGlzLmdldEV2ZW50VGltZVRleHQoZXZlbnQsICdMVCcpOwoJCQlzdGFydFRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50LCBudWxsLCBmYWxzZSk7IC8vIGRpc3BsYXlFbmQ9ZmFsc2UKCQl9CgoJCXJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArCgkJCShldmVudC51cmwgPwoJCQkJJyBocmVmPSInICsgaHRtbEVzY2FwZShldmVudC51cmwpICsgJyInIDoKCQkJCScnCgkJCQkpICsKCQkJKHNraW5Dc3MgPwoJCQkJJyBzdHlsZT0iJyArIHNraW5Dc3MgKyAnIicgOgoJCQkJJycKCQkJCSkgKwoJCQknPicgKwoJCQkJJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicgKwoJCQkJCSh0aW1lVGV4dCA/CgkJCQkJCSc8ZGl2IGNsYXNzPSJmYy10aW1lIicgKwoJCQkJCQknIGRhdGEtc3RhcnQ9IicgKyBodG1sRXNjYXBlKHN0YXJ0VGltZVRleHQpICsgJyInICsKCQkJCQkJJyBkYXRhLWZ1bGw9IicgKyBodG1sRXNjYXBlKGZ1bGxUaW1lVGV4dCkgKyAnIicgKwoJCQkJCQknPicgKwoJCQkJCQkJJzxzcGFuPicgKyBodG1sRXNjYXBlKHRpbWVUZXh0KSArICc8L3NwYW4+JyArCgkJCQkJCSc8L2Rpdj4nIDoKCQkJCQkJJycKCQkJCQkJKSArCgkJCQkJKGV2ZW50LnRpdGxlID8KCQkJCQkJJzxkaXYgY2xhc3M9ImZjLXRpdGxlIj4nICsKCQkJCQkJCWh0bWxFc2NhcGUoZXZlbnQudGl0bGUpICsKCQkJCQkJJzwvZGl2PicgOgoJCQkJCQknJwoJCQkJCQkpICsKCQkJCSc8L2Rpdj4nICsKCQkJCSc8ZGl2IGNsYXNzPSJmYy1iZyIvPicgKwoJCQkJLyogVE9ETzogd3JpdGUgQ1NTIGZvciB0aGlzCgkJCQkoaXNSZXNpemFibGVGcm9tU3RhcnQgPwoJCQkJCSc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLXN0YXJ0LXJlc2l6ZXIiIC8+JyA6CgkJCQkJJycKCQkJCQkpICsKCQkJCSovCgkJCQkoaXNSZXNpemFibGVGcm9tRW5kID8KCQkJCQknPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciIgLz4nIDoKCQkJCQknJwoJCQkJCSkgKwoJCQknPC9hPic7Cgl9LAoKCgkvKiBTZWcgUG9zaXRpb24gVXRpbHMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgQ1NTIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgZm9yIGVhY2ggc2VnbWVudCBlbGVtZW50LgoJLy8gV29ya3Mgd2hlbiBjYWxsZWQgYWZ0ZXIgaW5pdGlhbCByZW5kZXIsIGFmdGVyIGEgd2luZG93IHJlc2l6ZS96b29tIGZvciBleGFtcGxlLgoJdXBkYXRlU2VnVmVydGljYWxzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOwoJCXRoaXMuYXNzaWduU2VnVmVydGljYWxzKHNlZ3MpOwoJfSwKCgoJLy8gRm9yIGVhY2ggc2VnbWVudCBpbiBhbiBhcnJheSwgY29tcHV0ZXMgYW5kIGFzc2lnbnMgaXRzIHRvcCBhbmQgYm90dG9tIHByb3BlcnRpZXMKCWNvbXB1dGVTZWdWZXJ0aWNhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcudG9wID0gdGhpcy5jb21wdXRlRGF0ZVRvcChzZWcuc3RhcnQsIHNlZy5zdGFydCk7CgkJCXNlZy5ib3R0b20gPSB0aGlzLmNvbXB1dGVEYXRlVG9wKHNlZy5lbmQsIHNlZy5zdGFydCk7CgkJfQoJfSwKCgoJLy8gR2l2ZW4gc2VnbWVudHMgdGhhdCBhbHJlYWR5IGhhdmUgdGhlaXIgdG9wL2JvdHRvbSBwcm9wZXJ0aWVzIGNvbXB1dGVkLCBhcHBsaWVzIHRob3NlIHZhbHVlcyB0bwoJLy8gdGhlIHNlZ21lbnRzJyBlbGVtZW50cy4KCWFzc2lnblNlZ1ZlcnRpY2FsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBpLCBzZWc7CgoJCWZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSsrKSB7CgkJCXNlZyA9IHNlZ3NbaV07CgkJCXNlZy5lbC5jc3ModGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHNlZykpOwoJCX0KCX0sCgoKCS8vIEdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCBDU1MgcHJvcGVydGllcyBmb3IgdGhlIHRvcC9ib3R0b20gY29vcmRpbmF0ZXMgb2YgYSBzZWdtZW50IGVsZW1lbnQKCWdlbmVyYXRlU2VnVmVydGljYWxDc3M6IGZ1bmN0aW9uKHNlZykgewoJCXJldHVybiB7CgkJCXRvcDogc2VnLnRvcCwKCQkJYm90dG9tOiAtc2VnLmJvdHRvbSAvLyBmbGlwcGVkIGJlY2F1c2UgbmVlZHMgdG8gYmUgc3BhY2UgYmV5b25kIGJvdHRvbSBlZGdlIG9mIGV2ZW50IGNvbnRhaW5lcgoJCX07Cgl9LAoKCgkvKiBGb3JlZ3JvdW5kIEV2ZW50IFBvc2l0aW9uaW5nIFV0aWxzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBHaXZlbiBzZWdtZW50cyB0aGF0IGFyZSBhc3N1bWVkIHRvIGFsbCBsaXZlIGluIHRoZSAqc2FtZSBjb2x1bW4qLAoJLy8gY29tcHV0ZSB0aGVpciB2ZXJpY2FsL2hvcml6b250YWwgY29vcmRpbmF0ZXMgYW5kIGFzc2lnbiB0byB0aGVpciBlbGVtZW50cy4KCXVwZGF0ZUZnU2VnQ29vcmRzOiBmdW5jdGlvbihzZWdzKSB7CgkJdGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHNlZ3MpOyAvLyBob3Jpem9udGFscyByZWxpZXMgb24gdGhpcwoJCXRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7IC8vIGNvbXB1dGUgaG9yaXpvbnRhbCBjb29yZGluYXRlcywgei1pbmRleCdzLCBhbmQgcmVvcmRlciB0aGUgYXJyYXkKCQl0aGlzLmFzc2lnblNlZ1ZlcnRpY2FscyhzZWdzKTsKCQl0aGlzLmFzc2lnbkZnU2VnSG9yaXpvbnRhbHMoc2Vncyk7Cgl9LAoKCgkvLyBHaXZlbiBhbiBhcnJheSBvZiBzZWdtZW50cyB0aGF0IGFyZSBhbGwgaW4gdGhlIHNhbWUgY29sdW1uLCBzZXRzIHRoZSBiYWNrd2FyZENvb3JkIGFuZCBmb3J3YXJkQ29vcmQgb24gZWFjaC4KCS8vIE5PVEU6IEFsc28gcmVvcmRlcnMgdGhlIGdpdmVuIGFycmF5IGJ5IGRhdGUhCgljb21wdXRlRmdTZWdIb3Jpem9udGFsczogZnVuY3Rpb24oc2VncykgewoJCXZhciBsZXZlbHM7CgkJdmFyIGxldmVsMDsKCQl2YXIgaTsKCgkJdGhpcy5zb3J0RXZlbnRTZWdzKHNlZ3MpOyAvLyBvcmRlciBieSBjZXJ0YWluIGNyaXRlcmlhCgkJbGV2ZWxzID0gYnVpbGRTbG90U2VnTGV2ZWxzKHNlZ3MpOwoJCWNvbXB1dGVGb3J3YXJkU2xvdFNlZ3MobGV2ZWxzKTsKCgkJaWYgKChsZXZlbDAgPSBsZXZlbHNbMF0pKSB7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhsZXZlbDBbaV0pOwoJCQl9CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwwLmxlbmd0aDsgaSsrKSB7CgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGxldmVsMFtpXSwgMCwgMCk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBDYWxjdWxhdGUgc2VnLmZvcndhcmRDb29yZCBhbmQgc2VnLmJhY2t3YXJkQ29vcmQgZm9yIHRoZSBzZWdtZW50LCB3aGVyZSBib3RoIHZhbHVlcyByYW5nZQoJLy8gZnJvbSAwIHRvIDEuIElmIHRoZSBjYWxlbmRhciBpcyBsZWZ0LXRvLXJpZ2h0LCB0aGUgc2VnLmJhY2t3YXJkQ29vcmQgbWFwcyB0byAibGVmdCIgYW5kCgkvLyBzZWcuZm9yd2FyZENvb3JkIG1hcHMgdG8gInJpZ2h0IiAodmlhIHBlcmNlbnRhZ2UpLiBWaWNlLXZlcnNhIGlmIHRoZSBjYWxlbmRhciBpcyByaWdodC10by1sZWZ0LgoJLy8KCS8vIFRoZSBzZWdtZW50IG1pZ2h0IGJlIHBhcnQgb2YgYSAic2VyaWVzIiwgd2hpY2ggbWVhbnMgY29uc2VjdXRpdmUgc2VnbWVudHMgd2l0aCB0aGUgc2FtZSBwcmVzc3VyZQoJLy8gd2hvJ3Mgd2lkdGggaXMgdW5rbm93biB1bnRpbCBhbiBlZGdlIGhhcyBiZWVuIGhpdC4gYHNlcmllc0JhY2t3YXJkUHJlc3N1cmVgIGlzIHRoZSBudW1iZXIgb2YKCS8vIHNlZ21lbnRzIGJlaGluZCB0aGlzIG9uZSBpbiB0aGUgY3VycmVudCBzZXJpZXMsIGFuZCBgc2VyaWVzQmFja3dhcmRDb29yZGAgaXMgdGhlIHN0YXJ0aW5nCgkvLyBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBzZXJpZXMuCgljb21wdXRlRmdTZWdGb3J3YXJkQmFjazogZnVuY3Rpb24oc2VnLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlLCBzZXJpZXNCYWNrd2FyZENvb3JkKSB7CgkJdmFyIGZvcndhcmRTZWdzID0gc2VnLmZvcndhcmRTZWdzOwoJCXZhciBpOwoKCQlpZiAoc2VnLmZvcndhcmRDb29yZCA9PT0gdW5kZWZpbmVkKSB7IC8vIG5vdCBhbHJlYWR5IGNvbXB1dGVkCgoJCQlpZiAoIWZvcndhcmRTZWdzLmxlbmd0aCkgewoKCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBmb3J3YXJkIHNlZ21lbnRzLCB0aGlzIHNlZ21lbnQgc2hvdWxkIGJ1dHQgdXAgYWdhaW5zdCB0aGUgZWRnZQoJCQkJc2VnLmZvcndhcmRDb29yZCA9IDE7CgkJCX0KCQkJZWxzZSB7CgoJCQkJLy8gc29ydCBoaWdoZXN0IHByZXNzdXJlIGZpcnN0CgkJCQl0aGlzLnNvcnRGb3J3YXJkU2Vncyhmb3J3YXJkU2Vncyk7CgoJCQkJLy8gdGhpcyBzZWdtZW50J3MgZm9yd2FyZENvb3JkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBiYWNrd2FyZENvb3JkIG9mIHRoZQoJCQkJLy8gaGlnaGVzdC1wcmVzc3VyZSBmb3J3YXJkIHNlZ21lbnQuCgkJCQl0aGlzLmNvbXB1dGVGZ1NlZ0ZvcndhcmRCYWNrKGZvcndhcmRTZWdzWzBdLCBzZXJpZXNCYWNrd2FyZFByZXNzdXJlICsgMSwgc2VyaWVzQmFja3dhcmRDb29yZCk7CgkJCQlzZWcuZm9yd2FyZENvb3JkID0gZm9yd2FyZFNlZ3NbMF0uYmFja3dhcmRDb29yZDsKCQkJfQoKCQkJLy8gY2FsY3VsYXRlIHRoZSBiYWNrd2FyZENvb3JkIGZyb20gdGhlIGZvcndhcmRDb29yZC4gY29uc2lkZXIgdGhlIHNlcmllcwoJCQlzZWcuYmFja3dhcmRDb29yZCA9IHNlZy5mb3J3YXJkQ29vcmQgLQoJCQkJKHNlZy5mb3J3YXJkQ29vcmQgLSBzZXJpZXNCYWNrd2FyZENvb3JkKSAvIC8vIGF2YWlsYWJsZSB3aWR0aCBmb3Igc2VyaWVzCgkJCQkoc2VyaWVzQmFja3dhcmRQcmVzc3VyZSArIDEpOyAvLyAjIG9mIHNlZ21lbnRzIGluIHRoZSBzZXJpZXMKCgkJCS8vIHVzZSB0aGlzIHNlZ21lbnQncyBjb29yZGluYXRlcyB0byBjb21wdXRlZCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxlc3MtcHJlc3N1cml6ZWQKCQkJLy8gZm9yd2FyZCBzZWdtZW50cwoJCQlmb3IgKGk9MDsgaTxmb3J3YXJkU2Vncy5sZW5ndGg7IGkrKykgewoJCQkJdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhmb3J3YXJkU2Vnc1tpXSwgMCwgc2VnLmZvcndhcmRDb29yZCk7CgkJCX0KCQl9Cgl9LAoKCglzb3J0Rm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKGZvcndhcmRTZWdzKSB7CgkJZm9yd2FyZFNlZ3Muc29ydChwcm94eSh0aGlzLCAnY29tcGFyZUZvcndhcmRTZWdzJykpOwoJfSwKCgoJLy8gQSBjbXAgZnVuY3Rpb24gZm9yIGRldGVybWluaW5nIHdoaWNoIGZvcndhcmQgc2VnbWVudCB0byByZWx5IG9uIG1vcmUgd2hlbiBjb21wdXRpbmcgY29vcmRpbmF0ZXMuCgljb21wYXJlRm9yd2FyZFNlZ3M6IGZ1bmN0aW9uKHNlZzEsIHNlZzIpIHsKCQkvLyBwdXQgaGlnaGVyLXByZXNzdXJlIGZpcnN0CgkJcmV0dXJuIHNlZzIuZm9yd2FyZFByZXNzdXJlIC0gc2VnMS5mb3J3YXJkUHJlc3N1cmUgfHwKCQkJLy8gcHV0IHNlZ21lbnRzIHRoYXQgYXJlIGNsb3NlciB0byBpbml0aWFsIGVkZ2UgZmlyc3QgKGFuZCBmYXZvciBvbmVzIHdpdGggbm8gY29vcmRzIHlldCkKCQkJKHNlZzEuYmFja3dhcmRDb29yZCB8fCAwKSAtIChzZWcyLmJhY2t3YXJkQ29vcmQgfHwgMCkgfHwKCQkJLy8gZG8gbm9ybWFsIHNvcnRpbmcuLi4KCQkJdGhpcy5jb21wYXJlRXZlbnRTZWdzKHNlZzEsIHNlZzIpOwoJfSwKCgoJLy8gR2l2ZW4gZm9yZWdyb3VuZCBldmVudCBzZWdtZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBoYWQgdGhlaXIgcG9zaXRpb24gY29vcmRpbmF0ZXMgY29tcHV0ZWQsCgkvLyBhc3NpZ25zIHBvc2l0aW9uLXJlbGF0ZWQgQ1NTIHZhbHVlcyB0byB0aGVpciBlbGVtZW50cy4KCWFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6IGZ1bmN0aW9uKHNlZ3MpIHsKCQl2YXIgaSwgc2VnOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlzZWcgPSBzZWdzW2ldOwoJCQlzZWcuZWwuY3NzKHRoaXMuZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3Moc2VnKSk7CgoJCQkvLyBpZiB0aGUgaGVpZ2h0IGlzIHNob3J0LCBhZGQgYSBjbGFzc05hbWUgZm9yIGFsdGVybmF0ZSBzdHlsaW5nCgkJCWlmIChzZWcuYm90dG9tIC0gc2VnLnRvcCA8IDMwKSB7CgkJCQlzZWcuZWwuYWRkQ2xhc3MoJ2ZjLXNob3J0Jyk7CgkJCX0KCQl9Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gb2JqZWN0IHdpdGggQ1NTIHByb3BlcnRpZXMvdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYW4gZXZlbnQgc2VnbWVudCBlbGVtZW50LgoJLy8gQ29udGFpbnMgaW1wb3J0YW50IHBvc2l0aW9uaW5nLXJlbGF0ZWQgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIGFueSBldmVudCBlbGVtZW50LCBjdXN0b21pemVkIG9yIG5vdC4KCWdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgc2hvdWxkT3ZlcmxhcCA9IHRoaXMudmlldy5vcHQoJ3Nsb3RFdmVudE92ZXJsYXAnKTsKCQl2YXIgYmFja3dhcmRDb29yZCA9IHNlZy5iYWNrd2FyZENvb3JkOyAvLyB0aGUgbGVmdCBzaWRlIGlmIExUUi4gdGhlIHJpZ2h0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBmb3J3YXJkQ29vcmQgPSBzZWcuZm9yd2FyZENvb3JkOyAvLyB0aGUgcmlnaHQgc2lkZSBpZiBMVFIuIHRoZSBsZWZ0IHNpZGUgaWYgUlRMLiBmbG9hdGluZy1wb2ludAoJCXZhciBwcm9wcyA9IHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhzZWcpOyAvLyBnZXQgdG9wL2JvdHRvbSBmaXJzdAoJCXZhciBsZWZ0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSBsZWZ0IGVkZ2UsIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHdpZHRoCgkJdmFyIHJpZ2h0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSByaWdodCBlZGdlLCBhIGZyYWN0aW9uIG9mIHRoZSB0b3RhbCB3aWR0aAoKCQlpZiAoc2hvdWxkT3ZlcmxhcCkgewoJCQkvLyBkb3VibGUgdGhlIHdpZHRoLCBidXQgZG9uJ3QgZ28gYmV5b25kIHRoZSBtYXhpbXVtIGZvcndhcmQgY29vcmRpbmF0ZSAoMS4wKQoJCQlmb3J3YXJkQ29vcmQgPSBNYXRoLm1pbigxLCBiYWNrd2FyZENvb3JkICsgKGZvcndhcmRDb29yZCAtIGJhY2t3YXJkQ29vcmQpICogMik7CgkJfQoKCQlpZiAodGhpcy5pc1JUTCkgewoJCQlsZWZ0ID0gMSAtIGZvcndhcmRDb29yZDsKCQkJcmlnaHQgPSBiYWNrd2FyZENvb3JkOwoJCX0KCQllbHNlIHsKCQkJbGVmdCA9IGJhY2t3YXJkQ29vcmQ7CgkJCXJpZ2h0ID0gMSAtIGZvcndhcmRDb29yZDsKCQl9CgoJCXByb3BzLnpJbmRleCA9IHNlZy5sZXZlbCArIDE7IC8vIGNvbnZlcnQgZnJvbSAwLWJhc2UgdG8gMS1iYXNlZAoJCXByb3BzLmxlZnQgPSBsZWZ0ICogMTAwICsgJyUnOwoJCXByb3BzLnJpZ2h0ID0gcmlnaHQgKiAxMDAgKyAnJSc7CgoJCWlmIChzaG91bGRPdmVybGFwICYmIHNlZy5mb3J3YXJkUHJlc3N1cmUpIHsKCQkJLy8gYWRkIHBhZGRpbmcgdG8gdGhlIGVkZ2Ugc28gdGhhdCBmb3J3YXJkIHN0YWNrZWQgZXZlbnRzIGRvbid0IGNvdmVyIHRoZSByZXNpemVyJ3MgaWNvbgoJCQlwcm9wc1t0aGlzLmlzUlRMID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSAxMCAqIDI7IC8vIDEwIGlzIGEgZ3Vlc3N0aW1hdGUgb2YgdGhlIGljb24ncyB3aWR0aAoJCX0KCgkJcmV0dXJuIHByb3BzOwoJfQoKfSk7CgoKLy8gQnVpbGRzIGFuIGFycmF5IG9mIHNlZ21lbnRzICJsZXZlbHMiLiBUaGUgZmlyc3QgbGV2ZWwgd2lsbCBiZSB0aGUgbGVmdG1vc3QgdGllciBvZiBzZWdtZW50cyBpZiB0aGUgY2FsZW5kYXIgaXMKLy8gbGVmdC10by1yaWdodCwgb3IgdGhlIHJpZ2h0bW9zdCBpZiB0aGUgY2FsZW5kYXIgaXMgcmlnaHQtdG8tbGVmdC4gQXNzdW1lcyB0aGUgc2VnbWVudHMgYXJlIGFscmVhZHkgb3JkZXJlZCBieSBkYXRlLgpmdW5jdGlvbiBidWlsZFNsb3RTZWdMZXZlbHMoc2VncykgewoJdmFyIGxldmVscyA9IFtdOwoJdmFyIGksIHNlZzsKCXZhciBqOwoKCWZvciAoaT0wOyBpPHNlZ3MubGVuZ3RoOyBpKyspIHsKCQlzZWcgPSBzZWdzW2ldOwoKCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgbGV2ZWxzIGFuZCBzdG9wIG9uIHRoZSBmaXJzdCBsZXZlbCB3aGVyZSB0aGVyZSBhcmUgbm8gY29sbGlzaW9ucwoJCWZvciAoaj0wOyBqPGxldmVscy5sZW5ndGg7IGorKykgewoJCQlpZiAoIWNvbXB1dGVTbG90U2VnQ29sbGlzaW9ucyhzZWcsIGxldmVsc1tqXSkubGVuZ3RoKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJc2VnLmxldmVsID0gajsKCgkJKGxldmVsc1tqXSB8fCAobGV2ZWxzW2pdID0gW10pKS5wdXNoKHNlZyk7Cgl9CgoJcmV0dXJuIGxldmVsczsKfQoKCi8vIEZvciBldmVyeSBzZWdtZW50LCBmaWd1cmUgb3V0IHRoZSBvdGhlciBzZWdtZW50cyB0aGF0IGFyZSBpbiBzdWJzZXF1ZW50Ci8vIGxldmVscyB0aGF0IGFsc28gb2NjdXB5IHRoZSBzYW1lIHZlcnRpY2FsIHNwYWNlLiBBY2N1bXVsYXRlIGluIHNlZy5mb3J3YXJkU2VncwpmdW5jdGlvbiBjb21wdXRlRm9yd2FyZFNsb3RTZWdzKGxldmVscykgewoJdmFyIGksIGxldmVsOwoJdmFyIGosIHNlZzsKCXZhciBrOwoKCWZvciAoaT0wOyBpPGxldmVscy5sZW5ndGg7IGkrKykgewoJCWxldmVsID0gbGV2ZWxzW2ldOwoKCQlmb3IgKGo9MDsgajxsZXZlbC5sZW5ndGg7IGorKykgewoJCQlzZWcgPSBsZXZlbFtqXTsKCgkJCXNlZy5mb3J3YXJkU2VncyA9IFtdOwoJCQlmb3IgKGs9aSsxOyBrPGxldmVscy5sZW5ndGg7IGsrKykgewoJCQkJY29tcHV0ZVNsb3RTZWdDb2xsaXNpb25zKHNlZywgbGV2ZWxzW2tdLCBzZWcuZm9yd2FyZFNlZ3MpOwoJCQl9CgkJfQoJfQp9CgoKLy8gRmlndXJlIG91dCB3aGljaCBwYXRoIGZvcndhcmQgKHZpYSBzZWcuZm9yd2FyZFNlZ3MpIHJlc3VsdHMgaW4gdGhlIGxvbmdlc3QgcGF0aCB1bnRpbAovLyB0aGUgZnVydGhlc3QgZWRnZSBpcyByZWFjaGVkLiBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoaXMgcGF0aCB3aWxsIGJlIHNlZy5mb3J3YXJkUHJlc3N1cmUKZnVuY3Rpb24gY29tcHV0ZVNsb3RTZWdQcmVzc3VyZXMoc2VnKSB7Cgl2YXIgZm9yd2FyZFNlZ3MgPSBzZWcuZm9yd2FyZFNlZ3M7Cgl2YXIgZm9yd2FyZFByZXNzdXJlID0gMDsKCXZhciBpLCBmb3J3YXJkU2VnOwoKCWlmIChzZWcuZm9yd2FyZFByZXNzdXJlID09PSB1bmRlZmluZWQpIHsgLy8gbm90IGFscmVhZHkgY29tcHV0ZWQKCgkJZm9yIChpPTA7IGk8Zm9yd2FyZFNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJZm9yd2FyZFNlZyA9IGZvcndhcmRTZWdzW2ldOwoKCQkJLy8gZmlndXJlIG91dCB0aGUgY2hpbGQncyBtYXhpbXVtIGZvcndhcmQgcGF0aAoJCQljb21wdXRlU2xvdFNlZ1ByZXNzdXJlcyhmb3J3YXJkU2VnKTsKCgkJCS8vIGVpdGhlciB1c2UgdGhlIGV4aXN0aW5nIG1heGltdW0sIG9yIHVzZSB0aGUgY2hpbGQncyBmb3J3YXJkIHByZXNzdXJlCgkJCS8vIHBsdXMgb25lIChmb3IgdGhlIGZvcndhcmRTZWcgaXRzZWxmKQoJCQlmb3J3YXJkUHJlc3N1cmUgPSBNYXRoLm1heCgKCQkJCWZvcndhcmRQcmVzc3VyZSwKCQkJCTEgKyBmb3J3YXJkU2VnLmZvcndhcmRQcmVzc3VyZQoJCQkpOwoJCX0KCgkJc2VnLmZvcndhcmRQcmVzc3VyZSA9IGZvcndhcmRQcmVzc3VyZTsKCX0KfQoKCi8vIEZpbmQgYWxsIHRoZSBzZWdtZW50cyBpbiBgb3RoZXJTZWdzYCB0aGF0IHZlcnRpY2FsbHkgY29sbGlkZSB3aXRoIGBzZWdgLgovLyBBcHBlbmQgaW50byBhbiBvcHRpb25hbGx5LXN1cHBsaWVkIGByZXN1bHRzYCBhcnJheSBhbmQgcmV0dXJuLgpmdW5jdGlvbiBjb21wdXRlU2xvdFNlZ0NvbGxpc2lvbnMoc2VnLCBvdGhlclNlZ3MsIHJlc3VsdHMpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoKCWZvciAodmFyIGk9MDsgaTxvdGhlclNlZ3MubGVuZ3RoOyBpKyspIHsKCQlpZiAoaXNTbG90U2VnQ29sbGlzaW9uKHNlZywgb3RoZXJTZWdzW2ldKSkgewoJCQlyZXN1bHRzLnB1c2gob3RoZXJTZWdzW2ldKTsKCQl9Cgl9CgoJcmV0dXJuIHJlc3VsdHM7Cn0KCgovLyBEbyB0aGVzZSBzZWdtZW50cyBvY2N1cHkgdGhlIHNhbWUgdmVydGljYWwgc3BhY2U/CmZ1bmN0aW9uIGlzU2xvdFNlZ0NvbGxpc2lvbihzZWcxLCBzZWcyKSB7CglyZXR1cm4gc2VnMS5ib3R0b20gPiBzZWcyLnRvcCAmJiBzZWcxLnRvcCA8IHNlZzIuYm90dG9tOwp9Cgo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBvdGhlciB2aWV3cyBpbmhlcml0IGZyb20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgVmlldyA9IEZDLlZpZXcgPSBDbGFzcy5leHRlbmQoRW1pdHRlck1peGluLCBMaXN0ZW5lck1peGluLCB7CgoJdHlwZTogbnVsbCwgLy8gc3ViY2xhc3MnIHZpZXcgbmFtZSAoc3RyaW5nKQoJbmFtZTogbnVsbCwgLy8gZGVwcmVjYXRlZC4gdXNlIGB0eXBlYCBpbnN0ZWFkCgl0aXRsZTogbnVsbCwgLy8gdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyJ3MgdGl0bGUKCgljYWxlbmRhcjogbnVsbCwgLy8gb3duZXIgQ2FsZW5kYXIgb2JqZWN0CglvcHRpb25zOiBudWxsLCAvLyBoYXNoIGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMuIGFscmVhZHkgbWVyZ2VkIHdpdGggdmlldy1zcGVjaWZpYy1vcHRpb25zCgllbDogbnVsbCwgLy8gdGhlIHZpZXcncyBjb250YWluaW5nIGVsZW1lbnQuIHNldCBieSBDYWxlbmRhcgoKCWRpc3BsYXlpbmc6IG51bGwsIC8vIGEgcHJvbWlzZSByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHJlbmRlcmluZy4gbnVsbCBpZiBubyByZW5kZXIgcmVxdWVzdGVkCglpc1NrZWxldG9uUmVuZGVyZWQ6IGZhbHNlLAoJaXNFdmVudHNSZW5kZXJlZDogZmFsc2UsCgoJLy8gcmFuZ2UgdGhlIHZpZXcgaXMgYWN0dWFsbHkgZGlzcGxheWluZyAobW9tZW50cykKCXN0YXJ0OiBudWxsLAoJZW5kOiBudWxsLCAvLyBleGNsdXNpdmUKCgkvLyByYW5nZSB0aGUgdmlldyBpcyBmb3JtYWxseSByZXNwb25zaWJsZSBmb3IgKG1vbWVudHMpCgkvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20gc3RhcnQvZW5kLiBmb3IgZXhhbXBsZSwgYSBtb250aCB2aWV3IG1pZ2h0IGhhdmUgMXN0LTMxc3QsIGV4Y2x1ZGluZyBwYWRkZWQgZGF0ZXMKCWludGVydmFsU3RhcnQ6IG51bGwsCglpbnRlcnZhbEVuZDogbnVsbCwgLy8gZXhjbHVzaXZlCglpbnRlcnZhbER1cmF0aW9uOiBudWxsLAoJaW50ZXJ2YWxVbml0OiBudWxsLCAvLyBuYW1lIG9mIGxhcmdlc3QgdW5pdCBiZWluZyBkaXNwbGF5ZWQsIGxpa2UgIm1vbnRoIiBvciAid2VlayIKCglpc1JUTDogZmFsc2UsCglpc1NlbGVjdGVkOiBmYWxzZSwgLy8gYm9vbGVhbiB3aGV0aGVyIGEgcmFuZ2Ugb2YgdGltZSBpcyB1c2VyLXNlbGVjdGVkIG9yIG5vdAoJc2VsZWN0ZWRFdmVudDogbnVsbCwKCglldmVudE9yZGVyU3BlY3M6IG51bGwsIC8vIGNyaXRlcmlhIGZvciBvcmRlcmluZyBldmVudHMgd2hlbiB0aGV5IGhhdmUgc2FtZSBkYXRlL3RpbWUKCgkvLyBjbGFzc05hbWVzIHN0eWxlZCBieSBqcXVpIHRoZW1lcwoJd2lkZ2V0SGVhZGVyQ2xhc3M6IG51bGwsCgl3aWRnZXRDb250ZW50Q2xhc3M6IG51bGwsCgloaWdobGlnaHRTdGF0ZUNsYXNzOiBudWxsLAoKCS8vIGZvciBkYXRlIHV0aWxzLCBjb21wdXRlZCBmcm9tIG9wdGlvbnMKCW5leHREYXlUaHJlc2hvbGQ6IG51bGwsCglpc0hpZGRlbkRheUhhc2g6IG51bGwsCgoJLy8gbm93IGluZGljYXRvcgoJaXNOb3dJbmRpY2F0b3JSZW5kZXJlZDogbnVsbCwKCWluaXRpYWxOb3dEYXRlOiBudWxsLCAvLyByZXN1bHQgZmlyc3QgZ2V0Tm93IGNhbGwKCWluaXRpYWxOb3dRdWVyaWVkTXM6IG51bGwsIC8vIG1zIHRpbWUgdGhlIGdldE5vdyB3YXMgY2FsbGVkCglub3dJbmRpY2F0b3JUaW1lb3V0SUQ6IG51bGwsIC8vIGZvciByZWZyZXNoIHRpbWluZyBvZiBub3cgaW5kaWNhdG9yCglub3dJbmRpY2F0b3JJbnRlcnZhbElEOiBudWxsLCAvLyAiCgoKCWNvbnN0cnVjdG9yOiBmdW5jdGlvbihjYWxlbmRhciwgdHlwZSwgb3B0aW9ucywgaW50ZXJ2YWxEdXJhdGlvbikgewoKCQl0aGlzLmNhbGVuZGFyID0gY2FsZW5kYXI7CgkJdGhpcy50eXBlID0gdGhpcy5uYW1lID0gdHlwZTsgLy8gLm5hbWUgaXMgZGVwcmVjYXRlZAoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5pbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxEdXJhdGlvbiB8fCBtb21lbnQuZHVyYXRpb24oMSwgJ2RheScpOwoKCQl0aGlzLm5leHREYXlUaHJlc2hvbGQgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ25leHREYXlUaHJlc2hvbGQnKSk7CgkJdGhpcy5pbml0VGhlbWluZ1Byb3BzKCk7CgkJdGhpcy5pbml0SGlkZGVuRGF5cygpOwoJCXRoaXMuaXNSVEwgPSB0aGlzLm9wdCgnaXNSVEwnKTsKCgkJdGhpcy5ldmVudE9yZGVyU3BlY3MgPSBwYXJzZUZpZWxkU3BlY3ModGhpcy5vcHQoJ2V2ZW50T3JkZXInKSk7CgoJCXRoaXMuaW5pdGlhbGl6ZSgpOwoJfSwKCgoJLy8gQSBnb29kIHBsYWNlIGZvciBzdWJjbGFzc2VzIHRvIGluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcwoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBjYW4gaW1wbGVtZW50Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYW4gb3B0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUKCW9wdDogZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiB0aGlzLm9wdGlvbnNbbmFtZV07Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0aGF0IGFyZSB2aWV3LXJlbGF0ZWQuIE1vZGlmaWVzIGFyZ3MgYmVmb3JlIHBhc3NpbmcgdG8gY2FsZW5kYXIuCgl0cmlnZ2VyOiBmdW5jdGlvbihuYW1lLCB0aGlzT2JqKSB7IC8vIGFyZ3VtZW50cyBiZXlvbmQgdGhpc09iaiBhcmUgcGFzc2VkIGFsb25nCgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsKCgkJcmV0dXJuIGNhbGVuZGFyLnRyaWdnZXIuYXBwbHkoCgkJCWNhbGVuZGFyLAoJCQlbbmFtZSwgdGhpc09iaiB8fCB0aGlzXS5jb25jYXQoCgkJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLCAvLyBhcmd1bWVudHMgYmV5b25kIHRoaXNPYmoKCQkJCVsgdGhpcyBdIC8vIGFsd2F5cyBtYWtlIHRoZSBsYXN0IGFyZ3VtZW50IGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3LiBUT0RPOiBkZXByZWNhdGUKCQkJKQoJCSk7Cgl9LAoKCgkvKiBEYXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gVXBkYXRlcyBhbGwgaW50ZXJuYWwgZGF0ZXMgdG8gY2VudGVyIGFyb3VuZCB0aGUgZ2l2ZW4gY3VycmVudCB1bnpvbmVkIGRhdGUuCglzZXREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy5zZXRSYW5nZSh0aGlzLmNvbXB1dGVSYW5nZShkYXRlKSk7Cgl9LAoKCgkvLyBVcGRhdGVzIGFsbCBpbnRlcm5hbCBkYXRlcyBmb3IgZGlzcGxheWluZyB0aGUgZ2l2ZW4gdW56b25lZCByYW5nZS4KCXNldFJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCSQuZXh0ZW5kKHRoaXMsIHJhbmdlKTsgLy8gYXNzaWducyBldmVyeSBwcm9wZXJ0eSB0byB0aGlzIG9iamVjdCdzIG1lbWJlciB2YXJpYWJsZXMKCQl0aGlzLnVwZGF0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBHaXZlbiBhIHNpbmdsZSBjdXJyZW50IHVuem9uZWQgZGF0ZSwgcHJvZHVjZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHJhbmdlIHRvIGRpc3BsYXkuCgkvLyBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4gTXVzdCByZXR1cm4gYWxsIHByb3BlcnRpZXMuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgaW50ZXJ2YWxVbml0ID0gY29tcHV0ZUludGVydmFsVW5pdCh0aGlzLmludGVydmFsRHVyYXRpb24pOwoJCXZhciBpbnRlcnZhbFN0YXJ0ID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoaW50ZXJ2YWxVbml0KTsKCQl2YXIgaW50ZXJ2YWxFbmQgPSBpbnRlcnZhbFN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbik7CgkJdmFyIHN0YXJ0LCBlbmQ7CgoJCS8vIG5vcm1hbGl6ZSB0aGUgcmFuZ2UncyB0aW1lLWFtYmlndWl0eQoJCWlmICgveWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpbnRlcnZhbFVuaXQpKSB7IC8vIHdob2xlLWRheXM/CgkJCWludGVydmFsU3RhcnQuc3RyaXBUaW1lKCk7CgkJCWludGVydmFsRW5kLnN0cmlwVGltZSgpOwoJCX0KCQllbHNlIHsgLy8gbmVlZHMgdG8gaGF2ZSBhIHRpbWU/CgkJCWlmICghaW50ZXJ2YWxTdGFydC5oYXNUaW1lKCkpIHsKCQkJCWludGVydmFsU3RhcnQgPSB0aGlzLmNhbGVuZGFyLnRpbWUoMCk7IC8vIGdpdmUgMDA6MDAgdGltZQoJCQl9CgkJCWlmICghaW50ZXJ2YWxFbmQuaGFzVGltZSgpKSB7CgkJCQlpbnRlcnZhbEVuZCA9IHRoaXMuY2FsZW5kYXIudGltZSgwKTsgLy8gZ2l2ZSAwMDowMCB0aW1lCgkJCX0KCQl9CgoJCXN0YXJ0ID0gaW50ZXJ2YWxTdGFydC5jbG9uZSgpOwoJCXN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7CgkJZW5kID0gaW50ZXJ2YWxFbmQuY2xvbmUoKTsKCQllbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoKCQlyZXR1cm4gewoJCQlpbnRlcnZhbFVuaXQ6IGludGVydmFsVW5pdCwKCQkJaW50ZXJ2YWxTdGFydDogaW50ZXJ2YWxTdGFydCwKCQkJaW50ZXJ2YWxFbmQ6IGludGVydmFsRW5kLAoJCQlzdGFydDogc3RhcnQsCgkJCWVuZDogZW5kCgkJfTsKCX0sCgoKCS8vIENvbXB1dGVzIHRoZSBuZXcgZGF0ZSB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlIHByZXYgYnV0dG9uLCBnaXZlbiB0aGUgY3VycmVudCBkYXRlCgljb21wdXRlUHJldkRhdGU6IGZ1bmN0aW9uKGRhdGUpIHsKCQlyZXR1cm4gdGhpcy5tYXNzYWdlQ3VycmVudERhdGUoCgkJCWRhdGUuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLCAtMQoJCSk7Cgl9LAoKCgkvLyBDb21wdXRlcyB0aGUgbmV3IGRhdGUgd2hlbiB0aGUgdXNlciBoaXRzIHRoZSBuZXh0IGJ1dHRvbiwgZ2l2ZW4gdGhlIGN1cnJlbnQgZGF0ZQoJY29tcHV0ZU5leHREYXRlOiBmdW5jdGlvbihkYXRlKSB7CgkJcmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKAoJCQlkYXRlLmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikKCQkpOwoJfSwKCgoJLy8gR2l2ZW4gYW4gYXJiaXRyYXJpbHkgY2FsY3VsYXRlZCBjdXJyZW50IGRhdGUgb2YgdGhlIGNhbGVuZGFyLCByZXR1cm5zIGEgZGF0ZSB0aGF0IGlzIGVuc3VyZWQgdG8gYmUgY29tcGxldGVseQoJLy8gdmlzaWJsZS4gYGRpcmVjdGlvbmAgaXMgb3B0aW9uYWwgYW5kIGluZGljYXRlcyB3aGljaCBkaXJlY3Rpb24gdGhlIGN1cnJlbnQgZGF0ZSB3YXMgYmVpbmcKCS8vIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkICgxIG9yIC0xKS4KCW1hc3NhZ2VDdXJyZW50RGF0ZTogZnVuY3Rpb24oZGF0ZSwgZGlyZWN0aW9uKSB7CgkJaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpIDw9IDEpIHsgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXIKCQkJaWYgKHRoaXMuaXNIaWRkZW5EYXkoZGF0ZSkpIHsKCQkJCWRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7CgkJCQlkYXRlLnN0YXJ0T2YoJ2RheScpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0ZTsKCX0sCgoKCS8qIFRpdGxlIGFuZCBEYXRlIEZvcm1hdHRpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIHZpZXcncyB0aXRsZSBwcm9wZXJ0eSB0byB0aGUgbW9zdCB1cGRhdGVkIGNvbXB1dGVkIHZhbHVlCgl1cGRhdGVUaXRsZTogZnVuY3Rpb24oKSB7CgkJdGhpcy50aXRsZSA9IHRoaXMuY29tcHV0ZVRpdGxlKCk7Cgl9LAoKCgkvLyBDb21wdXRlcyB3aGF0IHRoZSB0aXRsZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhciBzaG91bGQgYmUgZm9yIHRoaXMgdmlldwoJY29tcHV0ZVRpdGxlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5mb3JtYXRSYW5nZSgKCQkJewoJCQkJLy8gaW4gY2FzZSBpbnRlcnZhbFN0YXJ0L0VuZCBoYXMgYSB0aW1lLCBtYWtlIHN1cmUgdGltZXpvbmUgaXMgY29ycmVjdAoJCQkJc3RhcnQ6IHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLAoJCQkJZW5kOiB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCkKCQkJfSwKCQkJdGhpcy5vcHQoJ3RpdGxlRm9ybWF0JykgfHwgdGhpcy5jb21wdXRlVGl0bGVGb3JtYXQoKSwKCQkJdGhpcy5vcHQoJ3RpdGxlUmFuZ2VTZXBhcmF0b3InKQoJCSk7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuCgkvLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLgoJY29tcHV0ZVRpdGxlRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlpZiAodGhpcy5pbnRlcnZhbFVuaXQgPT0gJ3llYXInKSB7CgkJCXJldHVybiAnWVlZWSc7CgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxVbml0ID09ICdtb250aCcpIHsKCQkJcmV0dXJuIHRoaXMub3B0KCdtb250aFllYXJGb3JtYXQnKTsgLy8gbGlrZSAiU2VwdGVtYmVyIDIwMTQiCgkJfQoJCWVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbi5hcygnZGF5cycpID4gMSkgewoJCQlyZXR1cm4gJ2xsJzsgLy8gbXVsdGktZGF5IHJhbmdlLiBzaG9ydGVyLCBsaWtlICJTZXAgOSAtIDEwIDIwMTQiCgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gJ0xMJzsgLy8gb25lIGRheS4gbG9uZ2VyLCBsaWtlICJTZXB0ZW1iZXIgOSAyMDE0IgoJCX0KCX0sCgoKCS8vIFV0aWxpdHkgZm9yIGZvcm1hdHRpbmcgYSByYW5nZS4gQWNjZXB0cyBhIHJhbmdlIG9iamVjdCwgZm9ybWF0dGluZyBzdHJpbmcsIGFuZCBvcHRpb25hbCBzZXBhcmF0b3IuCgkvLyBEaXNwbGF5cyBhbGwtZGF5IHJhbmdlcyBuYXR1cmFsbHksIHdpdGggYW4gaW5jbHVzaXZlIGVuZC4gVGFrZXMgdGhlIGN1cnJlbnQgaXNSVEwgaW50byBhY2NvdW50LgoJLy8gVGhlIHRpbWV6b25lcyBvZiB0aGUgZGF0ZXMgd2l0aGluIGByYW5nZWAgd2lsbCBiZSByZXNwZWN0ZWQuCglmb3JtYXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UsIGZvcm1hdFN0ciwgc2VwYXJhdG9yKSB7CgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCgkJaWYgKCFlbmQuaGFzVGltZSgpKSB7IC8vIGFsbC1kYXk/CgkJCWVuZCA9IGVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpOyAvLyBjb252ZXJ0IHRvIGluY2x1c2l2ZS4gbGFzdCBtcyBvZiBwcmV2aW91cyBkYXkKCQl9CgoJCXJldHVybiBmb3JtYXRSYW5nZShyYW5nZS5zdGFydCwgZW5kLCBmb3JtYXRTdHIsIHNlcGFyYXRvciwgdGhpcy5vcHQoJ2lzUlRMJykpOwoJfSwKCgoJZ2V0QWxsRGF5SHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMub3B0KCdhbGxEYXlIdG1sJykgfHwgaHRtbEVzY2FwZSh0aGlzLm9wdCgnYWxsRGF5VGV4dCcpKTsKCX0sCgoKCS8qIE5hdmlnYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEdlbmVyYXRlcyBIVE1MIGZvciBhbiBhbmNob3IgdG8gYW5vdGhlciB2aWV3IGludG8gdGhlIGNhbGVuZGFyLgoJLy8gV2lsbCBlaXRoZXIgZ2VuZXJhdGUgYW4gPGE+IHRhZyBvciBhIG5vbi1jbGlja2FibGUgPHNwYW4+IHRhZywgZGVwZW5kaW5nIG9uIGVuYWJsZWQgc2V0dGluZ3MuCgkvLyBgZ290b09wdGlvbnNgIGNhbiBlaXRoZXIgYmUgYSBtb21lbnQgaW5wdXQsIG9yIGFuIG9iamVjdCB3aXRoIHRoZSBmb3JtOgoJLy8geyBkYXRlLCB0eXBlLCBmb3JjZU9mZiB9CgkvLyBgdHlwZWAgaXMgYSB2aWV3LXR5cGUgbGlrZSAiZGF5IiBvciAid2VlayIuIGRlZmF1bHQgdmFsdWUgaXMgImRheSIuCgkvLyBgYXR0cnNgIGFuZCBgaW5uZXJIdG1sYCBhcmUgdXNlIHRvIGdlbmVyYXRlIHRoZSByZXN0IG9mIHRoZSBIVE1MIHRhZy4KCWJ1aWxkR290b0FuY2hvckh0bWw6IGZ1bmN0aW9uKGdvdG9PcHRpb25zLCBhdHRycywgaW5uZXJIdG1sKSB7CgkJdmFyIGRhdGUsIHR5cGUsIGZvcmNlT2ZmOwoJCXZhciBmaW5hbE9wdGlvbnM7CgoJCWlmICgkLmlzUGxhaW5PYmplY3QoZ290b09wdGlvbnMpKSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9ucy5kYXRlOwoJCQl0eXBlID0gZ290b09wdGlvbnMudHlwZTsKCQkJZm9yY2VPZmYgPSBnb3RvT3B0aW9ucy5mb3JjZU9mZjsKCQl9CgkJZWxzZSB7CgkJCWRhdGUgPSBnb3RvT3B0aW9uczsgLy8gYSBzaW5nbGUgbW9tZW50IGlucHV0CgkJfQoJCWRhdGUgPSBGQy5tb21lbnQoZGF0ZSk7IC8vIGlmIGEgc3RyaW5nLCBwYXJzZSBpdAoKCQlmaW5hbE9wdGlvbnMgPSB7IC8vIGZvciBzZXJpYWxpemF0aW9uIGludG8gdGhlIGxpbmsKCQkJZGF0ZTogZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKCQkJdHlwZTogdHlwZSB8fCAnZGF5JwoJCX07CgoJCWlmICh0eXBlb2YgYXR0cnMgPT09ICdzdHJpbmcnKSB7CgkJCWlubmVySHRtbCA9IGF0dHJzOwoJCQlhdHRycyA9IG51bGw7CgkJfQoKCQlhdHRycyA9IGF0dHJzID8gJyAnICsgYXR0cnNUb1N0cihhdHRycykgOiAnJzsgLy8gd2lsbCBoYXZlIGEgbGVhZGluZyBzcGFjZQoJCWlubmVySHRtbCA9IGlubmVySHRtbCB8fCAnJzsKCgkJaWYgKCFmb3JjZU9mZiAmJiB0aGlzLm9wdCgnbmF2TGlua3MnKSkgewoJCQlyZXR1cm4gJzxhJyArIGF0dHJzICsKCQkJCScgZGF0YS1nb3RvPSInICsgaHRtbEVzY2FwZShKU09OLnN0cmluZ2lmeShmaW5hbE9wdGlvbnMpKSArICciPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L2E+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHNwYW4nICsgYXR0cnMgKyAnPicgKwoJCQkJaW5uZXJIdG1sICsKCQkJCSc8L3NwYW4+JzsKCQl9Cgl9LAoKCgkvKiBSZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFNldHMgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgdGhlIHZpZXcgc2hvdWxkIHJlbmRlciBpbnNpZGUgb2YuCgkvLyBEb2VzIG90aGVyIERPTS1yZWxhdGVkIGluaXRpYWxpemF0aW9ucy4KCXNldEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CgkJdGhpcy5lbCA9IGVsOwoJCXRoaXMuYmluZEdsb2JhbEhhbmRsZXJzKCk7Cgl9LAoKCgkvLyBSZW1vdmVzIHRoZSB2aWV3J3MgY29udGFpbmVyIGVsZW1lbnQgZnJvbSB0aGUgRE9NLCBjbGVhcmluZyBhbnkgY29udGVudCBiZWZvcmVoYW5kLgoJLy8gVW5kb2VzIGFueSBvdGhlciBET00tcmVsYXRlZCBhdHRhY2htZW50cy4KCXJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuY2xlYXIoKTsgLy8gY2xlYXJzIGFsbCBjb250ZW50CgoJCS8vIGNsZWFuIHVwIHRoZSBza2VsZXRvbgoJCWlmICh0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCkgewoJCQl0aGlzLnVucmVuZGVyU2tlbGV0b24oKTsKCQkJdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQgPSBmYWxzZTsKCQl9CgoJCXRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKTsKCgkJdGhpcy5lbC5yZW1vdmUoKTsKCgkJLy8gTk9URTogZG9uJ3QgbnVsbC1vdXQgdGhpcy5lbCBpbiBjYXNlIHRoZSBWaWV3IHdhcyBkZXN0cm95ZWQgd2l0aGluIGFuIEFQSSBjYWxsYmFjay4KCQkvLyBXZSBkb24ndCBudWxsLW91dCB0aGUgVmlldydzIG90aGVyIGpRdWVyeSBlbGVtZW50IHJlZmVyZW5jZXMgdXBvbiBkZXN0cm95LAoJCS8vICBzbyB3ZSBzaG91bGRuJ3Qga2lsbCB0aGlzLmVsIGVpdGhlci4KCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGlzcGxheSB0aGUgdmlldyBjZW50ZXJlZCBhcm91bmQgdGhlIGdpdmVuIHVuem9uZWQgZGF0ZS4KCS8vIERvZXMgZXZlcnkgdHlwZSBvZiByZW5kZXJpbmcgRVhDRVBUIHJlbmRlcmluZyBldmVudHMuCgkvLyBJcyBhc3ljaHJvbm91cyBhbmQgcmV0dXJucyBhIHByb21pc2UuCglkaXNwbGF5OiBmdW5jdGlvbihkYXRlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgcHJldlNjcm9sbFN0YXRlID0gbnVsbDsKCgkJaWYgKGV4cGxpY2l0U2Nyb2xsU3RhdGUgIT0gbnVsbCAmJiB0aGlzLmRpc3BsYXlpbmcpIHsgLy8gZG9uJ3QgbmVlZCBwcmV2U2Nyb2xsU3RhdGUgaWYgZXhwbGljaXRTY3JvbGxTdGF0ZQoJCQlwcmV2U2Nyb2xsU3RhdGUgPSB0aGlzLnF1ZXJ5U2Nyb2xsKCk7CgkJfQoKCQl0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCgkJcmV0dXJuIHN5bmNUaGVuKHRoaXMuY2xlYXIoKSwgZnVuY3Rpb24oKSB7IC8vIGNsZWFyIHRoZSBjb250ZW50IGZpcnN0CgkJCXJldHVybiAoCgkJCQlfdGhpcy5kaXNwbGF5aW5nID0KCQkJCQlzeW5jVGhlbihfdGhpcy5kaXNwbGF5VmlldyhkYXRlKSwgZnVuY3Rpb24oKSB7IC8vIGRpc3BsYXlWaWV3IG1pZ2h0IHJldHVybiBhIHByb21pc2UKCgkJCQkJCS8vIGNhbGxlciBvZiBkaXNwbGF5KCkgd2FudHMgYSBzcGVjaWZpYyBzY3JvbGwgc3RhdGU/CgkJCQkJCWlmIChleHBsaWNpdFNjcm9sbFN0YXRlICE9IG51bGwpIHsKCQkJCQkJCS8vIHdlIG1ha2UgYW4gYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgTk9UIHRoZSBpbml0aWFsIHJlbmRlciwKCQkJCQkJCS8vIGFuZCB0aHVzIGRvbid0IG5lZWQgZm9yY2VTY3JvbGwgKGlzIGluY29udmVuaWVudGx5IGFzeW5jaHJvbm91cykKCQkJCQkJCV90aGlzLnNldFNjcm9sbChleHBsaWNpdFNjcm9sbFN0YXRlKTsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCV90aGlzLmZvcmNlU2Nyb2xsKF90aGlzLmNvbXB1dGVJbml0aWFsU2Nyb2xsKHByZXZTY3JvbGxTdGF0ZSkpOwoJCQkJCQl9CgoJCQkJCQlfdGhpcy5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsKCQkJCQkJX3RoaXMudHJpZ2dlclJlbmRlcigpOwoJCQkJCX0pCgkJCSk7CgkJfSk7Cgl9LAoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3LgoJLy8gQ2xlYXJzIGRhdGVzIGFuZCBldmVudHMuIERvZXMgbm90IGNsZWFyIHRoZSBza2VsZXRvbi4KCS8vIElzIGFzeWNocm9ub3VzIGFuZCByZXR1cm5zIGEgcHJvbWlzZS4KCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl2YXIgX3RoaXMgPSB0aGlzOwoJCXZhciBkaXNwbGF5aW5nID0gdGhpcy5kaXNwbGF5aW5nOwoKCQlpZiAoZGlzcGxheWluZykgeyAvLyBwcmV2aW91c2x5IGRpc3BsYXllZCwgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzcGxheWVkPwoJCQlyZXR1cm4gc3luY1RoZW4oZGlzcGxheWluZywgZnVuY3Rpb24oKSB7IC8vIHdhaXQgZm9yIHRoZSBkaXNwbGF5IHRvIGZpbmlzaAoJCQkJX3RoaXMuZGlzcGxheWluZyA9IG51bGw7CgkJCQlfdGhpcy5jbGVhckV2ZW50cygpOwoJCQkJcmV0dXJuIF90aGlzLmNsZWFyVmlldygpOyAvLyBtaWdodCByZXR1cm4gYSBwcm9taXNlLiBjaGFpbiBpdAoJCQl9KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAkLndoZW4oKTsgLy8gYW4gaW1tZWRpYXRlbHktcmVzb2x2ZWQgcHJvbWlzZQoJCX0KCX0sCgoKCS8vIERpc3BsYXlzIHRoZSB2aWV3J3Mgbm9uLWV2ZW50IGNvbnRlbnQsIHN1Y2ggYXMgZGF0ZS1yZWxhdGVkIGNvbnRlbnQgb3IgYW55dGhpbmcgcmVxdWlyZWQgYnkgZXZlbnRzLgoJLy8gUmVuZGVycyB0aGUgdmlldydzIG5vbi1jb250ZW50IHNrZWxldG9uIGlmIG5lY2Vzc2FyeS4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCglkaXNwbGF5VmlldzogZnVuY3Rpb24oZGF0ZSkgewoJCWlmICghdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQpIHsKCQkJdGhpcy5yZW5kZXJTa2VsZXRvbigpOwoJCQl0aGlzLmlzU2tlbGV0b25SZW5kZXJlZCA9IHRydWU7CgkJfQoJCWlmIChkYXRlKSB7CgkJCXRoaXMuc2V0RGF0ZShkYXRlKTsKCQl9CgkJaWYgKHRoaXMucmVuZGVyKSB7CgkJCXRoaXMucmVuZGVyKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCX0KCQl0aGlzLnJlbmRlckRhdGVzKCk7CgkJdGhpcy51cGRhdGVTaXplKCk7CgkJdGhpcy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7IC8vIG1pZ2h0IG5lZWQgY29vcmRpbmF0ZXMsIHNvIHNob3VsZCBnbyBhZnRlciB1cGRhdGVTaXplKCkKCQl0aGlzLnN0YXJ0Tm93SW5kaWNhdG9yKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcgY29udGVudCB0aGF0IHdhcyByZW5kZXJlZCBpbiBkaXNwbGF5Vmlldy4KCS8vIENhbiBiZSBhc3luY2hyb25vdXMgYW5kIHJldHVybiBhIHByb21pc2UuCgljbGVhclZpZXc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudW5zZWxlY3QoKTsKCQl0aGlzLnN0b3BOb3dJbmRpY2F0b3IoKTsKCQl0aGlzLnRyaWdnZXJVbnJlbmRlcigpOwoJCXRoaXMudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJdGhpcy51bnJlbmRlckRhdGVzKCk7CgkJaWYgKHRoaXMuZGVzdHJveSkgewoJCQl0aGlzLmRlc3Ryb3koKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoZSB2aWV3IGJlZm9yZSBhbnkgY29udGVudCBpcyByZW5kZXJlZAoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIHZpZXcKCXVucmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldydzIGRhdGUtcmVsYXRlZCBjb250ZW50LgoJLy8gQXNzdW1lcyBzZXRSYW5nZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbmQgdGhlIHNrZWxldG9uIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIHZpZXcncyBkYXRlLXJlbGF0ZWQgY29udGVudAoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKCX0sCgoKCS8vIFNpZ25hbHMgdGhhdCB0aGUgdmlldydzIGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJSZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld1JlbmRlcicsIHRoaXMsIHRoaXMsIHRoaXMuZWwpOwoJfSwKCgoJLy8gU2lnbmFscyB0aGF0IHRoZSB2aWV3J3MgY29udGVudCBpcyBhYm91dCB0byBiZSB1bnJlbmRlcmVkCgl0cmlnZ2VyVW5yZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudHJpZ2dlcigndmlld0Rlc3Ryb3knLCB0aGlzLCB0aGlzLCB0aGlzLmVsKTsKCX0sCgoKCS8vIEJpbmRzIERPTSBoYW5kbGVycyB0byBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lciwgc3VjaCBhcyB0aGUgZG9jdW1lbnQKCWJpbmRHbG9iYWxIYW5kbGVyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5saXN0ZW5UbygkKGRvY3VtZW50KSwgJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pOwoJCXRoaXMubGlzdGVuVG8oJChkb2N1bWVudCksICd0b3VjaHN0YXJ0JywgdGhpcy5wcm9jZXNzVW5zZWxlY3QpOwoJfSwKCgoJLy8gVW5iaW5kcyBET00gaGFuZGxlcnMgZnJvbSBlbGVtZW50cyB0aGF0IHJlc2lkZSBvdXRzaWRlIHRoZSB2aWV3IGNvbnRhaW5lcgoJdW5iaW5kR2xvYmFsSGFuZGxlcnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc3RvcExpc3RlbmluZ1RvKCQoZG9jdW1lbnQpKTsKCX0sCgoKCS8vIEluaXRpYWxpemVzIGludGVybmFsIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRoZW1pbmcKCWluaXRUaGVtaW5nUHJvcHM6IGZ1bmN0aW9uKCkgewoJCXZhciB0bSA9IHRoaXMub3B0KCd0aGVtZScpID8gJ3VpJyA6ICdmYyc7CgoJCXRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgPSB0bSArICctd2lkZ2V0LWhlYWRlcic7CgkJdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgPSB0bSArICctd2lkZ2V0LWNvbnRlbnQnOwoJCXRoaXMuaGlnaGxpZ2h0U3RhdGVDbGFzcyA9IHRtICsgJy1zdGF0ZS1oaWdobGlnaHQnOwoJfSwKCgoJLyogQnVzaW5lc3MgSG91cnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlbmRlcnMgYnVzaW5lc3MtaG91cnMgb250byB0aGUgdmlldy4gQXNzdW1lcyB1cGRhdGVTaXplIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbnJlbmRlcnMgcHJldmlvdXNseS1yZW5kZXJlZCBidXNpbmVzcy1ob3VycwoJdW5yZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8qIE5vdyBJbmRpY2F0b3IKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEltbWVkaWF0ZWx5IHJlbmRlciB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgYmVnaW5zIHJlLXJlbmRlcmluZyBpdCBhdCBhbiBpbnRlcnZhbCwKCS8vIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCkuCgkvLyBUT0RPOiBzb21laG93IGRvIHRoaXMgZm9yIHRoZSBjdXJyZW50IHdob2xlIGRheSdzIGJhY2tncm91bmQgdG9vCglzdGFydE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCQl2YXIgdW5pdDsKCQl2YXIgdXBkYXRlOwoJCXZhciBkZWxheTsgLy8gbXMgd2FpdCB2YWx1ZQoKCQlpZiAodGhpcy5vcHQoJ25vd0luZGljYXRvcicpKSB7CgkJCXVuaXQgPSB0aGlzLmdldE5vd0luZGljYXRvclVuaXQoKTsKCQkJaWYgKHVuaXQpIHsKCQkJCXVwZGF0ZSA9IHByb3h5KHRoaXMsICd1cGRhdGVOb3dJbmRpY2F0b3InKTsgLy8gYmluZCB0byBgdGhpc2AKCgkJCQl0aGlzLmluaXRpYWxOb3dEYXRlID0gdGhpcy5jYWxlbmRhci5nZXROb3coKTsKCQkJCXRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcyA9ICtuZXcgRGF0ZSgpOwoJCQkJdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSk7CgkJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSB0cnVlOwoKCQkJCS8vIHdhaXQgdW50aWwgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpbnRlcnZhbAoJCQkJZGVsYXkgPSB0aGlzLmluaXRpYWxOb3dEYXRlLmNsb25lKCkuc3RhcnRPZih1bml0KS5hZGQoMSwgdW5pdCkgLSB0aGlzLmluaXRpYWxOb3dEYXRlOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCV90aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCA9IG51bGw7CgkJCQkJdXBkYXRlKCk7CgkJCQkJZGVsYXkgPSArbW9tZW50LmR1cmF0aW9uKDEsIHVuaXQpOwoJCQkJCWRlbGF5ID0gTWF0aC5tYXgoMTAwLCBkZWxheSk7IC8vIHByZXZlbnQgdG9vIGZyZXF1ZW50CgkJCQkJX3RoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHVwZGF0ZSwgZGVsYXkpOyAvLyB1cGRhdGUgZXZlcnkgaW50ZXJ2YWwKCQkJCX0sIGRlbGF5KTsKCQkJfQoJCX0KCX0sCgoKCS8vIHJlcmVuZGVycyB0aGUgbm93IGluZGljYXRvciwgY29tcHV0aW5nIHRoZSBuZXcgY3VycmVudCB0aW1lIGZyb20gdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgaGFzIHBhc3NlZAoJLy8gc2luY2UgdGhlIGluaXRpYWwgZ2V0Tm93IGNhbGwuCgl1cGRhdGVOb3dJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQpIHsKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLnJlbmRlck5vd0luZGljYXRvcigKCQkJCXRoaXMuaW5pdGlhbE5vd0RhdGUuY2xvbmUoKS5hZGQobmV3IERhdGUoKSAtIHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcykgLy8gYWRkIG1zCgkJCSk7CgkJfQoJfSwKCgoJLy8gSW1tZWRpYXRlbHkgdW5yZW5kZXJzIHRoZSB2aWV3J3MgY3VycmVudCB0aW1lIGluZGljYXRvciBhbmQgc3RvcHMgYW55IHJlLXJlbmRlcmluZyB0aW1lcnMuCgkvLyBXb24ndCBjYXVzZSBzaWRlIGVmZmVjdHMgaWYgaW5kaWNhdG9yIGlzbid0IHJlbmRlcmVkLgoJc3RvcE5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuaXNOb3dJbmRpY2F0b3JSZW5kZXJlZCkgewoKCQkJaWYgKHRoaXMubm93SW5kaWNhdG9yVGltZW91dElEKSB7CgkJCQljbGVhclRpbWVvdXQodGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQgPSBudWxsOwoJCQl9CgkJCWlmICh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpIHsKCQkJCWNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvckludGVydmFsSUQpOwoJCQkJdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEID0gbnVsbDsKCQkJfQoKCQkJdGhpcy51bnJlbmRlck5vd0luZGljYXRvcigpOwoJCQl0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZXR1cm5zIGEgc3RyaW5nIHVuaXQsIGxpa2UgJ3NlY29uZCcgb3IgJ21pbnV0ZScgdGhhdCBkZWZpbmVkIGhvdyBvZnRlbiB0aGUgY3VycmVudCB0aW1lIGluZGljYXRvcgoJLy8gc2hvdWxkIGJlIHJlZnJlc2hlZC4gSWYgc29tZXRoaW5nIGZhbHN5IGlzIHJldHVybmVkLCBubyB0aW1lIGluZGljYXRvciBpcyByZW5kZXJlZCBhdCBhbGwuCglnZXROb3dJbmRpY2F0b3JVbml0OiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIFJlbmRlcnMgYSBjdXJyZW50IHRpbWUgaW5kaWNhdG9yIGF0IHRoZSBnaXZlbiBkYXRldGltZQoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBVbmRvZXMgdGhlIHJlbmRlcmluZyBhY3Rpb25zIGZyb20gcmVuZGVyTm93SW5kaWNhdG9yCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvKiBEaW1lbnNpb25zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZWZyZXNoZXMgYW55dGhpbmcgZGVwZW5kYW50IHVwb24gc2l6aW5nIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCBvZiB0aGUgZ3JpZAoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl2YXIgc2Nyb2xsU3RhdGU7CgoJCWlmIChpc1Jlc2l6ZSkgewoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCQl9CgoJCXRoaXMudXBkYXRlSGVpZ2h0KGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZVdpZHRoKGlzUmVzaXplKTsKCQl0aGlzLnVwZGF0ZU5vd0luZGljYXRvcigpOwoKCQlpZiAoaXNSZXNpemUpIHsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCX0KCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhcgoJdXBkYXRlV2lkdGg6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZWZyZXNoZXMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIGNhbGVuZGFyCgl1cGRhdGVIZWlnaHQ6IGZ1bmN0aW9uKGlzUmVzaXplKSB7CgkJdmFyIGNhbGVuZGFyID0gdGhpcy5jYWxlbmRhcjsgLy8gd2UgcG9sbCB0aGUgY2FsZW5kYXIgZm9yIGhlaWdodCBpbmZvcm1hdGlvbgoKCQl0aGlzLnNldEhlaWdodCgKCQkJY2FsZW5kYXIuZ2V0U3VnZ2VzdGVkVmlld0hlaWdodCgpLAoJCQljYWxlbmRhci5pc0hlaWdodEF1dG8oKQoJCSk7Cgl9LAoKCgkvLyBVcGRhdGVzIHRoZSB2ZXJ0aWNhbCBkaW1lbnNpb25zIG9mIHRoZSBjYWxlbmRhciB0byB0aGUgc3BlY2lmaWVkIGhlaWdodC4KCS8vIGlmIGBpc0F1dG9gIGlzIHNldCB0byB0cnVlLCBoZWlnaHQgYmVjb21lcyBtZXJlbHkgYSBzdWdnZXN0aW9uIGFuZCB0aGUgdmlldyBzaG91bGQgdXNlIGl0cyAibmF0dXJhbCIgaGVpZ2h0LgoJc2V0SGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogU2Nyb2xsZXIKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIHRoZSBpbml0aWFsIHByZS1jb25maWd1cmVkIHNjcm9sbCBzdGF0ZSBwcmlvciB0byBhbGxvd2luZyB0aGUgdXNlciB0byBjaGFuZ2UgaXQuCgkvLyBHaXZlbiB0aGUgc2Nyb2xsIHN0YXRlIGZyb20gdGhlIHByZXZpb3VzIHJlbmRlcmluZy4gSWYgZmlyc3QgdGltZSByZW5kZXJpbmcsIGdpdmVuIG51bGwuCgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24ocHJldmlvdXNTY3JvbGxTdGF0ZSkgewoJCXJldHVybiAwOwoJfSwKCgoJLy8gUmV0cmlldmVzIHRoZSB2aWV3J3MgY3VycmVudCBuYXR1cmFsIHNjcm9sbCBzdGF0ZS4gQ2FuIHJldHVybiBhbiBhcmJpdHJhcnkgZm9ybWF0LgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKCX0sCgoKCS8vIFNldHMgdGhlIHZpZXcncyBzY3JvbGwgc3RhdGUuIFdpbGwgYWNjZXB0IHRoZSBzYW1lIGZvcm1hdCBjb21wdXRlSW5pdGlhbFNjcm9sbCBhbmQgcXVlcnlTY3JvbGwgcHJvZHVjZS4KCXNldFNjcm9sbDogZnVuY3Rpb24oc2Nyb2xsU3RhdGUpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvLyBTZXRzIHRoZSBzY3JvbGwgc3RhdGUsIG1ha2luZyBzdXJlIHRvIG92ZXJjb21lIGFueSBwcmVkZWZpbmVkIHNjcm9sbCB2YWx1ZSB0aGUgYnJvd3NlciBoYXMgaW4gbWluZAoJZm9yY2VTY3JvbGw6IGZ1bmN0aW9uKHNjcm9sbFN0YXRlKSB7CgkJdmFyIF90aGlzID0gdGhpczsKCgkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCV90aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJfSwgMCk7Cgl9LAoKCgkvKiBFdmVudCBFbGVtZW50cyAvIFNlZ21lbnRzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBEb2VzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgdGhlIGdpdmVuIGV2ZW50cyBvbnRvIHRoZSBjdXJyZW50IHZpZXcKCWRpc3BsYXlFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cykgewoJCXZhciBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJdGhpcy5jbGVhckV2ZW50cygpOwoJCXRoaXMucmVuZGVyRXZlbnRzKGV2ZW50cyk7CgkJdGhpcy5pc0V2ZW50c1JlbmRlcmVkID0gdHJ1ZTsKCQl0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CgkJdGhpcy50cmlnZ2VyRXZlbnRSZW5kZXIoKTsKCX0sCgoKCS8vIERvZXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gY2xlYXIgdGhlIHZpZXcncyBjdXJyZW50bHktcmVuZGVyZWQgZXZlbnRzCgljbGVhckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFN0YXRlOwoKCQlpZiAodGhpcy5pc0V2ZW50c1JlbmRlcmVkKSB7CgoJCQkvLyBUT0RPOiBvcHRpbWl6ZTogaWYgd2Uga25vdyB0aGlzIGlzIHBhcnQgb2YgYSBkaXNwbGF5RXZlbnRzIGNhbGwsIGRvbid0IHF1ZXJ5U2Nyb2xsL3NldFNjcm9sbAoJCQlzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKCgkJCXRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKTsKCQkJaWYgKHRoaXMuZGVzdHJveUV2ZW50cykgewoJCQkJdGhpcy5kZXN0cm95RXZlbnRzKCk7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQl9CgkJCXRoaXMudW5yZW5kZXJFdmVudHMoKTsKCQkJdGhpcy5zZXRTY3JvbGwoc2Nyb2xsU3RhdGUpOwoJCQl0aGlzLmlzRXZlbnRzUmVuZGVyZWQgPSBmYWxzZTsKCQl9Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSBldmVudHMgb250byB0aGUgdmlldy4KCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBSZW1vdmVzIGV2ZW50IGVsZW1lbnRzIGZyb20gdGhlIHZpZXcuCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJLy8gc3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50cyBoYXZlIGJlZW4gcmVuZGVyZWQKCXRyaWdnZXJFdmVudFJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyUmVuZGVyJywgc2VnLmV2ZW50LCBzZWcuZXZlbnQsIHNlZy5lbCk7CgkJfSk7CgkJdGhpcy50cmlnZ2VyKCdldmVudEFmdGVyQWxsUmVuZGVyJyk7Cgl9LAoKCgkvLyBTaWduYWxzIHRoYXQgYWxsIGV2ZW50IGVsZW1lbnRzIGFyZSBhYm91dCB0byBiZSByZW1vdmVkCgl0cmlnZ2VyRXZlbnRVbnJlbmRlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJdGhpcy50cmlnZ2VyKCdldmVudERlc3Ryb3knLCBzZWcuZXZlbnQsIHNlZy5ldmVudCwgc2VnLmVsKTsKCQl9KTsKCX0sCgoKCS8vIEdpdmVuIGFuIGV2ZW50IGFuZCB0aGUgZGVmYXVsdCBlbGVtZW50IHVzZWQgZm9yIHJlbmRlcmluZywgcmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBhY3R1YWxseSBiZSB1c2VkLgoJLy8gQmFzaWNhbGx5IHJ1bnMgZXZlbnRzIGFuZCBlbGVtZW50cyB0aHJvdWdoIHRoZSBldmVudFJlbmRlciBob29rLgoJcmVzb2x2ZUV2ZW50RWw6IGZ1bmN0aW9uKGV2ZW50LCBlbCkgewoJCXZhciBjdXN0b20gPSB0aGlzLnRyaWdnZXIoJ2V2ZW50UmVuZGVyJywgZXZlbnQsIGV2ZW50LCBlbCk7CgoJCWlmIChjdXN0b20gPT09IGZhbHNlKSB7IC8vIG1lYW5zIGRvbid0IHJlbmRlciBhdCBhbGwKCQkJZWwgPSBudWxsOwoJCX0KCQllbHNlIGlmIChjdXN0b20gJiYgY3VzdG9tICE9PSB0cnVlKSB7CgkJCWVsID0gJChjdXN0b20pOwoJCX0KCgkJcmV0dXJuIGVsOwoJfSwKCgoJLy8gSGlkZXMgYWxsIHJlbmRlcmVkIGV2ZW50IHNlZ21lbnRzIGxpbmtlZCB0byB0aGUgZ2l2ZW4gZXZlbnQKCXNob3dFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQlzZWcuZWwuY3NzKCd2aXNpYmlsaXR5JywgJycpOwoJCX0sIGV2ZW50KTsKCX0sCgoKCS8vIFNob3dzIGFsbCByZW5kZXJlZCBldmVudCBzZWdtZW50cyBsaW5rZWQgdG8gdGhlIGdpdmVuIGV2ZW50CgloaWRlRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJc2VnLmVsLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKCQl9LCBldmVudCk7Cgl9LAoKCgkvLyBJdGVyYXRlcyB0aHJvdWdoIGV2ZW50IHNlZ21lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIChoYXZlIGFuIGVsKS4gR29lcyB0aHJvdWdoIGFsbCBieSBkZWZhdWx0LgoJLy8gSWYgdGhlIG9wdGlvbmFsIGBldmVudGAgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBvbmx5IGl0ZXJhdGVzIHRocm91Z2ggc2VnbWVudHMgbGlua2VkIHRvIHRoYXQgZXZlbnQuCgkvLyBUaGUgYHRoaXNgIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIHRoZSB2aWV3LgoJcmVuZGVyZWRFdmVudFNlZ0VhY2g6IGZ1bmN0aW9uKGZ1bmMsIGV2ZW50KSB7CgkJdmFyIHNlZ3MgPSB0aGlzLmdldEV2ZW50U2VncygpOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykgewoJCQlpZiAoIWV2ZW50IHx8IHNlZ3NbaV0uZXZlbnQuX2lkID09PSBldmVudC5faWQpIHsKCQkJCWlmIChzZWdzW2ldLmVsKSB7CgkJCQkJZnVuYy5jYWxsKHRoaXMsIHNlZ3NbaV0pOwoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gUmV0cmlldmVzIGFsbCB0aGUgcmVuZGVyZWQgc2VnbWVudCBvYmplY3RzIGZvciB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50CgkJcmV0dXJuIFtdOwoJfSwKCgoJLyogRXZlbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIENvbXB1dGVzIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhbGxvd2VkIHRvIGJlIGRyYWdnZWQgYnkgdGhlIHVzZXIKCWlzRXZlbnREcmFnZ2FibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUoZXZlbnQpOwoJfSwKCgoJaXNFdmVudFN0YXJ0RWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZpcnN0RGVmaW5lZCgKCQkJZXZlbnQuc3RhcnRFZGl0YWJsZSwKCQkJKGV2ZW50LnNvdXJjZSB8fCB7fSkuc3RhcnRFZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50U3RhcnRFZGl0YWJsZScpLAoJCQl0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZShldmVudCkKCQkpOwoJfSwKCgoJaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmaXJzdERlZmluZWQoCgkJCWV2ZW50LmVkaXRhYmxlLAoJCQkoZXZlbnQuc291cmNlIHx8IHt9KS5lZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2VkaXRhYmxlJykKCQkpOwoJfSwKCgoJLy8gTXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBldmVudCBpbiB0aGUgdmlldyBpcyBkcm9wcGVkIG9udG8gbmV3IGxvY2F0aW9uLgoJLy8gYGRyb3BMb2NhdGlvbmAgaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG5ldyB6b25lZCBzdGFydC9lbmQvYWxsRGF5IHZhbHVlcyBmb3IgdGhlIGV2ZW50LgoJcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCBkcm9wTG9jYXRpb24sIGxhcmdlVW5pdCk7CgkJdmFyIHVuZG9GdW5jID0gZnVuY3Rpb24oKSB7CgkJCW11dGF0ZVJlc3VsdC51bmRvKCk7CgkJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7CgkJfTsKCgkJdGhpcy50cmlnZ2VyRXZlbnREcm9wKGV2ZW50LCBtdXRhdGVSZXN1bHQuZGF0ZURlbHRhLCB1bmRvRnVuYywgZWwsIGV2KTsKCQljYWxlbmRhci5yZXBvcnRFdmVudENoYW5nZSgpOyAvLyB3aWxsIHJlcmVuZGVyIGV2ZW50cwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXZlbnQtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV2ZW50RHJvcDogZnVuY3Rpb24oZXZlbnQsIGRhdGVEZWx0YSwgdW5kb0Z1bmMsIGVsLCBldikgewoJCXRoaXMudHJpZ2dlcignZXZlbnREcm9wJywgZWxbMF0sIGV2ZW50LCBkYXRlRGVsdGEsIHVuZG9GdW5jLCBldiwge30pOyAvLyB7fSA9IGpxdWkgZHVtbXkKCX0sCgoKCS8qIEV4dGVybmFsIEVsZW1lbnQgRHJhZy1uLURyb3AKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIE11c3QgYmUgY2FsbGVkIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCwgdmlhIGpRdWVyeSBVSSwgaGFzIGJlZW4gZHJvcHBlZCBvbnRvIHRoZSBjYWxlbmRhci4KCS8vIGBtZXRhYCBpcyB0aGUgcGFyc2VkIGRhdGEgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbnRvIHRoZSBkcmFnZ2luZyBldmVudC4KCS8vIGBkcm9wTG9jYXRpb25gIGlzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgem9uZWQgc3RhcnQvZW5kL2FsbERheSB2YWx1ZXMgZm9yIHRoZSBldmVudC4KCXJlcG9ydEV4dGVybmFsRHJvcDogZnVuY3Rpb24obWV0YSwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CgkJdmFyIGV2ZW50UHJvcHMgPSBtZXRhLmV2ZW50UHJvcHM7CgkJdmFyIGV2ZW50SW5wdXQ7CgkJdmFyIGV2ZW50OwoKCQkvLyBUcnkgdG8gYnVpbGQgYW4gZXZlbnQgb2JqZWN0IGFuZCByZW5kZXIgaXQuIFRPRE86IGRlY291cGxlIHRoZSB0d28KCQlpZiAoZXZlbnRQcm9wcykgewoJCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGRyb3BMb2NhdGlvbik7CgkJCWV2ZW50ID0gdGhpcy5jYWxlbmRhci5yZW5kZXJFdmVudChldmVudElucHV0LCBtZXRhLnN0aWNrKVswXTsgLy8gcmVuZGVyRXZlbnQgcmV0dXJucyBhbiBhcnJheQoJCX0KCgkJdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGV2ZW50LCBkcm9wTG9jYXRpb24sIGVsLCBldiwgdWkpOwoJfSwKCgoJLy8gVHJpZ2dlcnMgZXh0ZXJuYWwtZHJvcCBoYW5kbGVycyB0aGF0IGhhdmUgc3Vic2NyaWJlZCB2aWEgdGhlIEFQSQoJdHJpZ2dlckV4dGVybmFsRHJvcDogZnVuY3Rpb24oZXZlbnQsIGRyb3BMb2NhdGlvbiwgZWwsIGV2LCB1aSkgewoKCQkvLyB0cmlnZ2VyICdkcm9wJyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZWxlbWVudCByZXByZXNlbnRzIGFuIGV2ZW50CgkJdGhpcy50cmlnZ2VyKCdkcm9wJywgZWxbMF0sIGRyb3BMb2NhdGlvbi5zdGFydCwgZXYsIHVpKTsKCgkJaWYgKGV2ZW50KSB7CgkJCXRoaXMudHJpZ2dlcignZXZlbnRSZWNlaXZlJywgbnVsbCwgZXZlbnQpOyAvLyBzaWduYWwgYW4gZXh0ZXJuYWwgZXZlbnQgbGFuZGVkCgkJfQoJfSwKCgoJLyogRHJhZy1uLURyb3AgUmVuZGVyaW5nIChmb3IgYm90aCBldmVudHMgYW5kIGV4dGVybmFsIGVsZW1lbnRzKQoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBkcmFnIG92ZXIgdGhlIGdpdmVuIGRyb3Agem9uZS4KCS8vIElmIGFuIGV4dGVybmFsLWVsZW1lbnQsIHNlZyB3aWxsIGJlIGBudWxsYC4KCS8vIE11c3QgcmV0dXJuIGVsZW1lbnRzIHVzZWQgZm9yIGFueSBtb2NrIGV2ZW50cy4KCXJlbmRlckRyYWc6IGZ1bmN0aW9uKGRyb3BMb2NhdGlvbiwgc2VnKSB7CgkJLy8gc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudAoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYW4gZXZlbnQgb3IgZXh0ZXJuYWwtZWxlbWVudCBiZWluZyBkcmFnZ2VkLgoJdW5yZW5kZXJEcmFnOiBmdW5jdGlvbigpIHsKCQkvLyBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Cgl9LAoKCgkvKiBFdmVudCBSZXNpemluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBzdGFydGluZyBlZGdlCglpc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiB0aGlzLm9wdCgnZXZlbnRSZXNpemFibGVGcm9tU3RhcnQnKSAmJiB0aGlzLmlzRXZlbnRSZXNpemFibGUoZXZlbnQpOwoJfSwKCgoJLy8gQ29tcHV0ZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGFsbG93ZWQgdG8gYmUgcmVzaXplZCBmcm9tIGl0cyBlbmRpbmcgZWRnZQoJaXNFdmVudFJlc2l6YWJsZUZyb21FbmQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIHRoaXMuaXNFdmVudFJlc2l6YWJsZShldmVudCk7Cgl9LAoKCgkvLyBDb21wdXRlcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYWxsb3dlZCB0byBiZSByZXNpemVkIGJ5IHRoZSB1c2VyIGF0IGFsbAoJaXNFdmVudFJlc2l6YWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIgc291cmNlID0gZXZlbnQuc291cmNlIHx8IHt9OwoKCQlyZXR1cm4gZmlyc3REZWZpbmVkKAoJCQlldmVudC5kdXJhdGlvbkVkaXRhYmxlLAoJCQlzb3VyY2UuZHVyYXRpb25FZGl0YWJsZSwKCQkJdGhpcy5vcHQoJ2V2ZW50RHVyYXRpb25FZGl0YWJsZScpLAoJCQlldmVudC5lZGl0YWJsZSwKCQkJc291cmNlLmVkaXRhYmxlLAoJCQl0aGlzLm9wdCgnZWRpdGFibGUnKQoJCSk7Cgl9LAoKCgkvLyBNdXN0IGJlIGNhbGxlZCB3aGVuIGFuIGV2ZW50IGluIHRoZSB2aWV3IGhhcyBiZWVuIHJlc2l6ZWQgdG8gYSBuZXcgbGVuZ3RoCglyZXBvcnRFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHJlc2l6ZUxvY2F0aW9uLCBsYXJnZVVuaXQsIGVsLCBldikgewoJCXZhciBjYWxlbmRhciA9IHRoaXMuY2FsZW5kYXI7CgkJdmFyIG11dGF0ZVJlc3VsdCA9IGNhbGVuZGFyLm11dGF0ZUV2ZW50KGV2ZW50LCByZXNpemVMb2NhdGlvbiwgbGFyZ2VVbml0KTsKCQl2YXIgdW5kb0Z1bmMgPSBmdW5jdGlvbigpIHsKCQkJbXV0YXRlUmVzdWx0LnVuZG8oKTsKCQkJY2FsZW5kYXIucmVwb3J0RXZlbnRDaGFuZ2UoKTsKCQl9OwoKCQl0aGlzLnRyaWdnZXJFdmVudFJlc2l6ZShldmVudCwgbXV0YXRlUmVzdWx0LmR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpOwoJCWNhbGVuZGFyLnJlcG9ydEV2ZW50Q2hhbmdlKCk7IC8vIHdpbGwgcmVyZW5kZXIgZXZlbnRzCgl9LAoKCgkvLyBUcmlnZ2VycyBldmVudC1yZXNpemUgaGFuZGxlcnMgdGhhdCBoYXZlIHN1YnNjcmliZWQgdmlhIHRoZSBBUEkKCXRyaWdnZXJFdmVudFJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIGR1cmF0aW9uRGVsdGEsIHVuZG9GdW5jLCBlbCwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgZWxbMF0sIGV2ZW50LCBkdXJhdGlvbkRlbHRhLCB1bmRvRnVuYywgZXYsIHt9KTsgLy8ge30gPSBqcXVpIGR1bW15Cgl9LAoKCgkvKiBTZWxlY3Rpb24gKHRpbWUgcmFuZ2UpCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBTZWxlY3RzIGEgZGF0ZSBzcGFuIG9uIHRoZSB2aWV3LiBgc3RhcnRgIGFuZCBgZW5kYCBhcmUgYm90aCBNb21lbnRzLgoJLy8gYGV2YCBpcyB0aGUgbmF0aXZlIG1vdXNlIGV2ZW50IHRoYXQgYmVnaW4gdGhlIGludGVyYWN0aW9uLgoJc2VsZWN0OiBmdW5jdGlvbihzcGFuLCBldikgewoJCXRoaXMudW5zZWxlY3QoZXYpOwoJCXRoaXMucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCXRoaXMucmVwb3J0U2VsZWN0aW9uKHNwYW4sIGV2KTsKCX0sCgoKCS8vIFJlbmRlcnMgYSB2aXN1YWwgaW5kaWNhdGlvbiBvZiB0aGUgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQKCX0sCgoKCS8vIENhbGxlZCB3aGVuIGEgbmV3IHNlbGVjdGlvbiBpcyBtYWRlLiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KCXJlcG9ydFNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLmlzU2VsZWN0ZWQgPSB0cnVlOwoJCXRoaXMudHJpZ2dlclNlbGVjdChzcGFuLCBldik7Cgl9LAoKCgkvLyBUcmlnZ2VycyBoYW5kbGVycyB0byAnc2VsZWN0JwoJdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKCQl0aGlzLnRyaWdnZXIoCgkJCSdzZWxlY3QnLAoJCQludWxsLAoJCQl0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIC8vIGNvbnZlcnQgdG8gY2FsZW5kYXIncyB0eiBmb3IgZXh0ZXJuYWwgQVBJCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLmVuZCksIC8vICIKCQkJZXYKCQkpOwoJfSwKCgoJLy8gVW5kb2VzIGEgc2VsZWN0aW9uLiB1cGRhdGVzIGluIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQgdHJpZ2dlcnMgaGFuZGxlcnMuCgkvLyBgZXZgIGlzIHRoZSBuYXRpdmUgbW91c2UgZXZlbnQgdGhhdCBiZWdhbiB0aGUgaW50ZXJhY3Rpb24uCgl1bnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5pc1NlbGVjdGVkKSB7CgkJCXRoaXMuaXNTZWxlY3RlZCA9IGZhbHNlOwoJCQlpZiAodGhpcy5kZXN0cm95U2VsZWN0aW9uKSB7CgkJCQl0aGlzLmRlc3Ryb3lTZWxlY3Rpb24oKTsgLy8gVE9ETzogZGVwcmVjYXRlCgkJCX0KCQkJdGhpcy51bnJlbmRlclNlbGVjdGlvbigpOwoJCQl0aGlzLnRyaWdnZXIoJ3Vuc2VsZWN0JywgbnVsbCwgZXYpOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCS8vIHN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudAoJfSwKCgoJLyogRXZlbnQgU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglzZWxlY3RFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKCQlpZiAoIXRoaXMuc2VsZWN0ZWRFdmVudCB8fCB0aGlzLnNlbGVjdGVkRXZlbnQgIT09IGV2ZW50KSB7CgkJCXRoaXMudW5zZWxlY3RFdmVudCgpOwoJCQl0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHNlZykgewoJCQkJc2VnLmVsLmFkZENsYXNzKCdmYy1zZWxlY3RlZCcpOwoJCQl9LCBldmVudCk7CgkJCXRoaXMuc2VsZWN0ZWRFdmVudCA9IGV2ZW50OwoJCX0KCX0sCgoKCXVuc2VsZWN0RXZlbnQ6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLnNlbGVjdGVkRXZlbnQpIHsKCQkJdGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbihzZWcpIHsKCQkJCXNlZy5lbC5yZW1vdmVDbGFzcygnZmMtc2VsZWN0ZWQnKTsKCQkJfSwgdGhpcy5zZWxlY3RlZEV2ZW50KTsKCQkJdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDsKCQl9Cgl9LAoKCglpc0V2ZW50U2VsZWN0ZWQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy8gZXZlbnQgcmVmZXJlbmNlcyBtaWdodCBjaGFuZ2Ugb24gcmVmZXRjaEV2ZW50cygpLCB3aGlsZSBzZWxlY3RlZEV2ZW50IGRvZXNuJ3QsCgkJLy8gc28gY29tcGFyZSBJRHMKCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEV2ZW50ICYmIHRoaXMuc2VsZWN0ZWRFdmVudC5faWQgPT09IGV2ZW50Ll9pZDsKCX0sCgoKCS8qIE1vdXNlIC8gVG91Y2ggVW5zZWxlY3RpbmcgKHRpbWUgcmFuZ2UgJiBldmVudCB1bnNlbGVjdGlvbikKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIGNvbnNpc3RlbnRseSB0byBkb3duL3N0YXJ0IG9yIHVwL2VuZD8KCS8vIFRPRE86IGRvbid0IGtpbGwgcHJldmlvdXMgc2VsZWN0aW9uIGlmIHRvdWNoIHNjcm9sbGluZwoKCgloYW5kbGVEb2N1bWVudE1vdXNlZG93bjogZnVuY3Rpb24oZXYpIHsKCQlpZiAoaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpKSB7CgkJCXRoaXMucHJvY2Vzc1Vuc2VsZWN0KGV2KTsKCQl9Cgl9LAoKCglwcm9jZXNzVW5zZWxlY3Q6IGZ1bmN0aW9uKGV2KSB7CgkJdGhpcy5wcm9jZXNzUmFuZ2VVbnNlbGVjdChldik7CgkJdGhpcy5wcm9jZXNzRXZlbnRVbnNlbGVjdChldik7Cgl9LAoKCglwcm9jZXNzUmFuZ2VVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQl2YXIgaWdub3JlOwoKCQkvLyBpcyB0aGVyZSBhIHRpbWUtcmFuZ2Ugc2VsZWN0aW9uPwoJCWlmICh0aGlzLmlzU2VsZWN0ZWQgJiYgdGhpcy5vcHQoJ3Vuc2VsZWN0QXV0bycpKSB7CgkJCS8vIG9ubHkgdW5zZWxlY3QgaWYgdGhlIGNsaWNrZWQgZWxlbWVudCBpcyBub3QgaWRlbnRpY2FsIHRvIG9yIGluc2lkZSBvZiBhbiAndW5zZWxlY3RDYW5jZWwnIGVsZW1lbnQKCQkJaWdub3JlID0gdGhpcy5vcHQoJ3Vuc2VsZWN0Q2FuY2VsJyk7CgkJCWlmICghaWdub3JlIHx8ICEkKGV2LnRhcmdldCkuY2xvc2VzdChpZ25vcmUpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdChldik7CgkJCX0KCQl9Cgl9LAoKCglwcm9jZXNzRXZlbnRVbnNlbGVjdDogZnVuY3Rpb24oZXYpIHsKCQlpZiAodGhpcy5zZWxlY3RlZEV2ZW50KSB7CgkJCWlmICghJChldi50YXJnZXQpLmNsb3Nlc3QoJy5mYy1zZWxlY3RlZCcpLmxlbmd0aCkgewoJCQkJdGhpcy51bnNlbGVjdEV2ZW50KCk7CgkJCX0KCQl9Cgl9LAoKCgkvKiBEYXkgQ2xpY2sKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFRyaWdnZXJzIGhhbmRsZXJzIHRvICdkYXlDbGljaycKCS8vIFNwYW4gaGFzIHN0YXJ0L2VuZCBvZiB0aGUgY2xpY2tlZCBhcmVhLiBPbmx5IHRoZSBzdGFydCBpcyB1c2VmdWwuCgl0cmlnZ2VyRGF5Q2xpY2s6IGZ1bmN0aW9uKHNwYW4sIGRheUVsLCBldikgewoJCXRoaXMudHJpZ2dlcigKCQkJJ2RheUNsaWNrJywKCQkJZGF5RWwsCgkJCXRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgLy8gY29udmVydCB0byBjYWxlbmRhcidzIHRpbWV6b25lIGZvciBleHRlcm5hbCBBUEkKCQkJZXYKCQkpOwoJfSwKCgoJLyogRGF0ZSBVdGlscwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gSW5pdGlhbGl6ZXMgaW50ZXJuYWwgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FsY3VsYXRpbmcgaGlkZGVuIGRheXMtb2Ytd2VlawoJaW5pdEhpZGRlbkRheXM6IGZ1bmN0aW9uKCkgewoJCXZhciBoaWRkZW5EYXlzID0gdGhpcy5vcHQoJ2hpZGRlbkRheXMnKSB8fCBbXTsgLy8gYXJyYXkgb2YgZGF5LW9mLXdlZWsgaW5kaWNlcyB0aGF0IGFyZSBoaWRkZW4KCQl2YXIgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbCkKCQl2YXIgZGF5Q250ID0gMDsKCQl2YXIgaTsKCgkJaWYgKHRoaXMub3B0KCd3ZWVrZW5kcycpID09PSBmYWxzZSkgewoJCQloaWRkZW5EYXlzLnB1c2goMCwgNik7IC8vIDA9c3VuZGF5LCA2PXNhdHVyZGF5CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJCWlmICgKCQkJCSEoaXNIaWRkZW5EYXlIYXNoW2ldID0gJC5pbkFycmF5KGksIGhpZGRlbkRheXMpICE9PSAtMSkKCQkJKSB7CgkJCQlkYXlDbnQrKzsKCQkJfQoJCX0KCgkJaWYgKCFkYXlDbnQpIHsKCQkJdGhyb3cgJ2ludmFsaWQgaGlkZGVuRGF5cyc7IC8vIGFsbCBkYXlzIHdlcmUgaGlkZGVuPyBiYWQuCgkJfQoKCQl0aGlzLmlzSGlkZGVuRGF5SGFzaCA9IGlzSGlkZGVuRGF5SGFzaDsKCX0sCgoKCS8vIElzIHRoZSBjdXJyZW50IGRheSBoaWRkZW4/CgkvLyBgZGF5YCBpcyBhIGRheS1vZi13ZWVrIGluZGV4ICgwLTYpLCBvciBhIE1vbWVudAoJaXNIaWRkZW5EYXk6IGZ1bmN0aW9uKGRheSkgewoJCWlmIChtb21lbnQuaXNNb21lbnQoZGF5KSkgewoJCQlkYXkgPSBkYXkuZGF5KCk7CgkJfQoJCXJldHVybiB0aGlzLmlzSGlkZGVuRGF5SGFzaFtkYXldOwoJfSwKCgoJLy8gSW5jcmVtZW50aW5nIHRoZSBjdXJyZW50IGRheSB1bnRpbCBpdCBpcyBubyBsb25nZXIgYSBoaWRkZW4gZGF5LCByZXR1cm5pbmcgYSBjb3B5LgoJLy8gSWYgdGhlIGluaXRpYWwgdmFsdWUgb2YgYGRhdGVgIGlzIG5vdCBhIGhpZGRlbiBkYXksIGRvbid0IGRvIGFueXRoaW5nLgoJLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS4KCS8vIGBpbmNgIGRlZmF1bHRzIHRvIGAxYCAoaW5jcmVtZW50IG9uZSBkYXkgZm9yd2FyZCBlYWNoIHRpbWUpCglza2lwSGlkZGVuRGF5czogZnVuY3Rpb24oZGF0ZSwgaW5jLCBpc0V4Y2x1c2l2ZSkgewoJCXZhciBvdXQgPSBkYXRlLmNsb25lKCk7CgkJaW5jID0gaW5jIHx8IDE7CgkJd2hpbGUgKAoJCQl0aGlzLmlzSGlkZGVuRGF5SGFzaFsob3V0LmRheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddCgkJKSB7CgkJCW91dC5hZGQoaW5jLCAnZGF5cycpOwoJCX0KCQlyZXR1cm4gb3V0OwoJfSwKCgoJLy8gUmV0dXJucyB0aGUgZGF0ZSByYW5nZSBvZiB0aGUgZnVsbCBkYXlzIHRoZSBnaXZlbiByYW5nZSB2aXN1YWxseSBhcHBlYXJzIHRvIG9jY3VweS4KCS8vIFJldHVybnMgYSBuZXcgcmFuZ2Ugb2JqZWN0LgoJY29tcHV0ZURheVJhbmdlOiBmdW5jdGlvbihyYW5nZSkgewoJCXZhciBzdGFydERheSA9IHJhbmdlLnN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRheSB0aGUgcmFuZ2Ugc3RhcnRzCgkJdmFyIGVuZCA9IHJhbmdlLmVuZDsKCQl2YXIgZW5kRGF5ID0gbnVsbDsKCQl2YXIgZW5kVGltZU1TOwoKCQlpZiAoZW5kKSB7CgkJCWVuZERheSA9IGVuZC5jbG9uZSgpLnN0cmlwVGltZSgpOyAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXkgdGhlIHJhbmdlIGV4Y2x1c2l2ZWx5IGVuZHMKCQkJZW5kVGltZU1TID0gK2VuZC50aW1lKCk7IC8vICMgb2YgbWlsbGlzZWNvbmRzIGludG8gYGVuZERheWAKCgkJCS8vIElmIHRoZSBlbmQgdGltZSBpcyBhY3R1YWxseSBpbmNsdXNpdmVseSBwYXJ0IG9mIHRoZSBuZXh0IGRheSBhbmQgaXMgZXF1YWwgdG8gb3IKCQkJLy8gYmV5b25kIHRoZSBuZXh0IGRheSB0aHJlc2hvbGQsIGFkanVzdCB0aGUgZW5kIHRvIGJlIHRoZSBleGNsdXNpdmUgZW5kIG9mIGBlbmREYXlgLgoJCQkvLyBPdGhlcndpc2UsIGxlYXZpbmcgaXQgYXMgaW5jbHVzaXZlIHdpbGwgY2F1c2UgaXQgdG8gZXhjbHVkZSBgZW5kRGF5YC4KCQkJaWYgKGVuZFRpbWVNUyAmJiBlbmRUaW1lTVMgPj0gdGhpcy5uZXh0RGF5VGhyZXNob2xkKSB7CgkJCQllbmREYXkuYWRkKDEsICdkYXlzJyk7CgkJCX0KCQl9CgoJCS8vIElmIG5vIGVuZCB3YXMgc3BlY2lmaWVkLCBvciBpZiBpdCBpcyB3aXRoaW4gYHN0YXJ0RGF5YCBidXQgbm90IHBhc3QgbmV4dERheVRocmVzaG9sZCwKCQkvLyBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS4KCQlpZiAoIWVuZCB8fCBlbmREYXkgPD0gc3RhcnREYXkpIHsKCQkJZW5kRGF5ID0gc3RhcnREYXkuY2xvbmUoKS5hZGQoMSwgJ2RheXMnKTsKCQl9CgoJCXJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTsKCX0sCgoKCS8vIERvZXMgdGhlIGdpdmVuIGV2ZW50IHZpc3VhbGx5IGFwcGVhciB0byBvY2N1cHkgbW9yZSB0aGFuIG9uZSBkYXk/Cglpc011bHRpRGF5RXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHJhbmdlID0gdGhpcy5jb21wdXRlRGF5UmFuZ2UoZXZlbnQpOyAvLyBldmVudCBpcyByYW5nZS1pc2gKCgkJcmV0dXJuIHJhbmdlLmVuZC5kaWZmKHJhbmdlLnN0YXJ0LCAnZGF5cycpID4gMTsKCX0KCn0pOwoKOzsKCi8qCkVtYm9kaWVzIGEgZGl2IHRoYXQgaGFzIHBvdGVudGlhbCBzY3JvbGxiYXJzCiovCnZhciBTY3JvbGxlciA9IEZDLlNjcm9sbGVyID0gQ2xhc3MuZXh0ZW5kKHsKCgllbDogbnVsbCwgLy8gdGhlIGd1YXJhbnRlZWQgb3V0ZXIgZWxlbWVudAoJc2Nyb2xsRWw6IG51bGwsIC8vIHRoZSBlbGVtZW50IHdpdGggdGhlIHNjcm9sbGJhcnMKCW92ZXJmbG93WDogbnVsbCwKCW92ZXJmbG93WTogbnVsbCwKCgoJY29uc3RydWN0b3I6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQl0aGlzLm92ZXJmbG93WCA9IG9wdGlvbnMub3ZlcmZsb3dYIHx8IG9wdGlvbnMub3ZlcmZsb3cgfHwgJ2F1dG8nOwoJCXRoaXMub3ZlcmZsb3dZID0gb3B0aW9ucy5vdmVyZmxvd1kgfHwgb3B0aW9ucy5vdmVyZmxvdyB8fCAnYXV0byc7Cgl9LAoKCglyZW5kZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwgPSB0aGlzLnJlbmRlckVsKCk7CgkJdGhpcy5hcHBseU92ZXJmbG93KCk7Cgl9LAoKCglyZW5kZXJFbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICh0aGlzLnNjcm9sbEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXIiPjwvZGl2PicpKTsKCX0sCgoKCS8vIHNldHMgdG8gbmF0dXJhbCBoZWlnaHQsIHVubG9ja3Mgb3ZlcmZsb3cKCWNsZWFyOiBmdW5jdGlvbigpIHsKCQl0aGlzLnNldEhlaWdodCgnYXV0bycpOwoJCXRoaXMuYXBwbHlPdmVyZmxvdygpOwoJfSwKCgoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbC5yZW1vdmUoKTsKCX0sCgoKCS8vIE92ZXJmbG93CgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCglhcHBseU92ZXJmbG93OiBmdW5jdGlvbigpIHsKCQl0aGlzLnNjcm9sbEVsLmNzcyh7CgkJCSdvdmVyZmxvdy14JzogdGhpcy5vdmVyZmxvd1gsCgkJCSdvdmVyZmxvdy15JzogdGhpcy5vdmVyZmxvd1kKCQl9KTsKCX0sCgoKCS8vIENhdXNlcyBhbnkgJ2F1dG8nIG92ZXJmbG93IHZhbHVlcyB0byByZXNvbHZlcyB0byAnc2Nyb2xsJyBvciAnaGlkZGVuJy4KCS8vIFVzZWZ1bCBmb3IgcHJlc2VydmluZyBzY3JvbGxiYXIgd2lkdGhzIHJlZ2FyZGxlc3Mgb2YgZnV0dXJlIHJlc2l6ZXMuCgkvLyBDYW4gcGFzcyBpbiBzY3JvbGxiYXJXaWR0aHMgZm9yIG9wdGltaXphdGlvbi4KCWxvY2tPdmVyZmxvdzogZnVuY3Rpb24oc2Nyb2xsYmFyV2lkdGhzKSB7CgkJdmFyIG92ZXJmbG93WCA9IHRoaXMub3ZlcmZsb3dYOwoJCXZhciBvdmVyZmxvd1kgPSB0aGlzLm92ZXJmbG93WTsKCgkJc2Nyb2xsYmFyV2lkdGhzID0gc2Nyb2xsYmFyV2lkdGhzIHx8IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGhzKCk7CgoJCWlmIChvdmVyZmxvd1ggPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1ggPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLnRvcCB8fCBzY3JvbGxiYXJXaWR0aHMuYm90dG9tIHx8IC8vIGhvcml6b250YWwgc2Nyb2xsYmFycz8KCQkJCQkvLyBPUiBzY3JvbGxpbmcgcGFuZSB3aXRoIG1hc3NsZXNzIHNjcm9sbGJhcnM/CgkJCQkJdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxXaWR0aCAtIDEgPiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoCgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCWlmIChvdmVyZmxvd1kgPT09ICdhdXRvJykgewoJCQlvdmVyZmxvd1kgPSAoCgkJCQkJc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0IHx8IC8vIHZlcnRpY2FsIHNjcm9sbGJhcnM/CgkJCQkJLy8gT1Igc2Nyb2xsaW5nIHBhbmUgd2l0aCBtYXNzbGVzcyBzY3JvbGxiYXJzPwoJCQkJCXRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0IC0gMSA+IHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50SGVpZ2h0CgkJCQkJCS8vIHN1YnRyYWN0IDEgYmVjYXVzZSBvZiBJRSBvZmYtYnktb25lIGlzc3VlCgkJCQkpID8gJ3Njcm9sbCcgOiAnaGlkZGVuJzsKCQl9CgoJCXRoaXMuc2Nyb2xsRWwuY3NzKHsgJ292ZXJmbG93LXgnOiBvdmVyZmxvd1gsICdvdmVyZmxvdy15Jzogb3ZlcmZsb3dZIH0pOwoJfSwKCgoJLy8gR2V0dGVycyAvIFNldHRlcnMKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCXNldEhlaWdodDogZnVuY3Rpb24oaGVpZ2h0KSB7CgkJdGhpcy5zY3JvbGxFbC5oZWlnaHQoaGVpZ2h0KTsKCX0sCgoKCWdldFNjcm9sbFRvcDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKCk7Cgl9LAoKCglzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKHRvcCkgewoJCXRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wKHRvcCk7Cgl9LAoKCglnZXRDbGllbnRXaWR0aDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGg7Cgl9LAoKCglnZXRDbGllbnRIZWlnaHQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodDsKCX0sCgoKCWdldFNjcm9sbGJhcldpZHRoczogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKCX0KCn0pOwoKOzsKCnZhciBDYWxlbmRhciA9IEZDLkNhbGVuZGFyID0gQ2xhc3MuZXh0ZW5kKHsKCglkaXJEZWZhdWx0czogbnVsbCwgLy8gb3B0aW9uIGRlZmF1bHRzIHJlbGF0ZWQgdG8gTFRSIG9yIFJUTAoJbG9jYWxlRGVmYXVsdHM6IG51bGwsIC8vIG9wdGlvbiBkZWZhdWx0cyByZWxhdGVkIHRvIGN1cnJlbnQgbG9jYWxlCglvdmVycmlkZXM6IG51bGwsIC8vIG9wdGlvbiBvdmVycmlkZXMgZ2l2ZW4gdG8gdGhlIGZ1bGxDYWxlbmRhciBjb25zdHJ1Y3RvcgoJZHluYW1pY092ZXJyaWRlczogbnVsbCwgLy8gb3B0aW9ucyBzZXQgd2l0aCBkeW5hbWljIHNldHRlciBtZXRob2QuIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdmlldyBvdmVycmlkZXMuCglvcHRpb25zOiBudWxsLCAvLyBhbGwgZGVmYXVsdHMgY29tYmluZWQgd2l0aCBvdmVycmlkZXMKCXZpZXdTcGVjQ2FjaGU6IG51bGwsIC8vIGNhY2hlIG9mIHZpZXcgZGVmaW5pdGlvbnMKCXZpZXc6IG51bGwsIC8vIGN1cnJlbnQgVmlldyBvYmplY3QKCWhlYWRlcjogbnVsbCwKCWxvYWRpbmdMZXZlbDogMCwgLy8gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBsb2FkaW5nIHRhc2tzCgoKCS8vIGEgbG90IG9mIHRoaXMgY2xhc3MnIE9PUCBsb2dpYyBpcyBzY29wZWQgd2l0aGluIHRoaXMgY29uc3RydWN0b3IgZnVuY3Rpb24sCgkvLyBidXQgaW4gdGhlIGZ1dHVyZSwgd3JpdGUgaW5kaXZpZHVhbCBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUuCgljb25zdHJ1Y3RvcjogQ2FsZW5kYXJfY29uc3RydWN0b3IsCgoKCS8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGluaXRpYWxpemF0aW9uIGxvZ2ljIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJfSwKCgoJLy8gQ29tcHV0ZXMgdGhlIGZsYXR0ZW5lZCBvcHRpb25zIGhhc2ggZm9yIHRoZSBjYWxlbmRhciBhbmQgYXNzaWducyB0byBgdGhpcy5vcHRpb25zYC4KCS8vIEFzc3VtZXMgdGhpcy5vdmVycmlkZXMgYW5kIHRoaXMuZHluYW1pY092ZXJyaWRlcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KCXBvcHVsYXRlT3B0aW9uc0hhc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBsb2NhbGUsIGxvY2FsZURlZmF1bHRzOwoJCXZhciBpc1JUTCwgZGlyRGVmYXVsdHM7CgoJCWxvY2FsZSA9IGZpcnN0RGVmaW5lZCggLy8gZXhwbGljaXQgbG9jYWxlIG9wdGlvbiBnaXZlbj8KCQkJdGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSwKCQkJdGhpcy5vdmVycmlkZXMubG9jYWxlCgkJKTsKCQlsb2NhbGVEZWZhdWx0cyA9IGxvY2FsZU9wdGlvbkhhc2hbbG9jYWxlXTsKCQlpZiAoIWxvY2FsZURlZmF1bHRzKSB7IC8vIGV4cGxpY2l0IGxvY2FsZSBvcHRpb24gbm90IGdpdmVuIG9yIGludmFsaWQ/CgkJCWxvY2FsZSA9IENhbGVuZGFyLmRlZmF1bHRzLmxvY2FsZTsKCQkJbG9jYWxlRGVmYXVsdHMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZV0gfHwge307CgkJfQoKCQlpc1JUTCA9IGZpcnN0RGVmaW5lZCggLy8gYmFzZWQgb24gb3B0aW9ucyBjb21wdXRlZCBzbyBmYXIsIGlzIGRpcmVjdGlvbiBSVEw/CgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcy5pc1JUTCwKCQkJdGhpcy5vdmVycmlkZXMuaXNSVEwsCgkJCWxvY2FsZURlZmF1bHRzLmlzUlRMLAoJCQlDYWxlbmRhci5kZWZhdWx0cy5pc1JUTAoJCSk7CgkJZGlyRGVmYXVsdHMgPSBpc1JUTCA/IENhbGVuZGFyLnJ0bERlZmF1bHRzIDoge307CgoJCXRoaXMuZGlyRGVmYXVsdHMgPSBkaXJEZWZhdWx0czsKCQl0aGlzLmxvY2FsZURlZmF1bHRzID0gbG9jYWxlRGVmYXVsdHM7CgkJdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFsgLy8gbWVyZ2UgZGVmYXVsdHMgYW5kIG92ZXJyaWRlcy4gbG93ZXN0IHRvIGhpZ2hlc3QgcHJlY2VkZW5jZQoJCQlDYWxlbmRhci5kZWZhdWx0cywgLy8gZ2xvYmFsIGRlZmF1bHRzCgkJCWRpckRlZmF1bHRzLAoJCQlsb2NhbGVEZWZhdWx0cywKCQkJdGhpcy5vdmVycmlkZXMsCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcwoJCV0pOwoJCXBvcHVsYXRlSW5zdGFuY2VDb21wdXRhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpOyAvLyBmaWxsIGluIGdhcHMgd2l0aCBjb21wdXRlZCBvcHRpb25zCgl9LAoKCgkvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjcmVhdGUgYSB2aWV3LiBXaWxsIHVzZSBhIGNhY2hlLgoJZ2V0Vmlld1NwZWM6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJdmFyIGNhY2hlID0gdGhpcy52aWV3U3BlY0NhY2hlOwoKCQlyZXR1cm4gY2FjaGVbdmlld1R5cGVdIHx8IChjYWNoZVt2aWV3VHlwZV0gPSB0aGlzLmJ1aWxkVmlld1NwZWModmlld1R5cGUpKTsKCX0sCgoKCS8vIEdpdmVuIGEgZHVyYXRpb24gc2luZ3VsYXIgdW5pdCwgbGlrZSAid2VlayIgb3IgImRheSIsIGZpbmRzIGEgbWF0Y2hpbmcgdmlldyBzcGVjLgoJLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byB2aWV3cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBidXR0b25zLgoJZ2V0VW5pdFZpZXdTcGVjOiBmdW5jdGlvbih1bml0KSB7CgkJdmFyIHZpZXdUeXBlczsKCQl2YXIgaTsKCQl2YXIgc3BlYzsKCgkJaWYgKCQuaW5BcnJheSh1bml0LCBpbnRlcnZhbFVuaXRzKSAhPSAtMSkgewoKCQkJLy8gcHV0IHZpZXdzIHRoYXQgaGF2ZSBidXR0b25zIGZpcnN0LiB0aGVyZSB3aWxsIGJlIGR1cGxpY2F0ZXMsIGJ1dCBvaCB3ZWxsCgkJCXZpZXdUeXBlcyA9IHRoaXMuaGVhZGVyLmdldFZpZXdzV2l0aEJ1dHRvbnMoKTsKCQkJJC5lYWNoKEZDLnZpZXdzLCBmdW5jdGlvbih2aWV3VHlwZSkgeyAvLyBhbGwgdmlld3MKCQkJCXZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTsKCQkJfSk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSsrKSB7CgkJCQlzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZXNbaV0pOwoJCQkJaWYgKHNwZWMpIHsKCQkJCQlpZiAoc3BlYy5zaW5nbGVVbml0ID09IHVuaXQpIHsKCQkJCQkJcmV0dXJuIHNwZWM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfSwKCgoJLy8gQnVpbGRzIGFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUgYSBnaXZlbiB2aWV3CglidWlsZFZpZXdTcGVjOiBmdW5jdGlvbihyZXF1ZXN0ZWRWaWV3VHlwZSkgewoJCXZhciB2aWV3T3ZlcnJpZGVzID0gdGhpcy5vdmVycmlkZXMudmlld3MgfHwge307CgkJdmFyIHNwZWNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIGRlZmF1bHRzQ2hhaW4gPSBbXTsgLy8gZm9yIHRoZSB2aWV3LiBsb3dlc3QgdG8gaGlnaGVzdCBwcmlvcml0eQoJCXZhciBvdmVycmlkZXNDaGFpbiA9IFtdOyAvLyBmb3IgdGhlIHZpZXcuIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJdmFyIHZpZXdUeXBlID0gcmVxdWVzdGVkVmlld1R5cGU7CgkJdmFyIHNwZWM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBvdmVycmlkZXM7IC8vIGZvciB0aGUgdmlldwoJCXZhciBkdXJhdGlvbjsKCQl2YXIgdW5pdDsKCgkJLy8gaXRlcmF0ZSBmcm9tIHRoZSBzcGVjaWZpYyB2aWV3IGRlZmluaXRpb24gdG8gYSBtb3JlIGdlbmVyYWwgb25lIHVudGlsIHdlIGhpdCBhbiBhY3R1YWwgVmlldyBjbGFzcwoJCXdoaWxlICh2aWV3VHlwZSkgewoJCQlzcGVjID0gZmNWaWV3c1t2aWV3VHlwZV07CgkJCW92ZXJyaWRlcyA9IHZpZXdPdmVycmlkZXNbdmlld1R5cGVdOwoJCQl2aWV3VHlwZSA9IG51bGw7IC8vIGNsZWFyLiBtaWdodCByZXBvcHVsYXRlIGZvciBhbm90aGVyIGl0ZXJhdGlvbgoKCQkJaWYgKHR5cGVvZiBzcGVjID09PSAnZnVuY3Rpb24nKSB7IC8vIFRPRE86IGRlcHJlY2F0ZQoJCQkJc3BlYyA9IHsgJ2NsYXNzJzogc3BlYyB9OwoJCQl9CgoJCQlpZiAoc3BlYykgewoJCQkJc3BlY0NoYWluLnVuc2hpZnQoc3BlYyk7CgkJCQlkZWZhdWx0c0NoYWluLnVuc2hpZnQoc3BlYy5kZWZhdWx0cyB8fCB7fSk7CgkJCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IHNwZWMuZHVyYXRpb247CgkJCQl2aWV3VHlwZSA9IHZpZXdUeXBlIHx8IHNwZWMudHlwZTsKCQkJfQoKCQkJaWYgKG92ZXJyaWRlcykgewoJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdChvdmVycmlkZXMpOyAvLyB2aWV3LXNwZWNpZmljIG9wdGlvbiBoYXNoZXMgaGF2ZSBvcHRpb25zIGF0IHplcm8tbGV2ZWwKCQkJCWR1cmF0aW9uID0gZHVyYXRpb24gfHwgb3ZlcnJpZGVzLmR1cmF0aW9uOwoJCQkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCBvdmVycmlkZXMudHlwZTsKCQkJfQoJCX0KCgkJc3BlYyA9IG1lcmdlUHJvcHMoc3BlY0NoYWluKTsKCQlzcGVjLnR5cGUgPSByZXF1ZXN0ZWRWaWV3VHlwZTsKCQlpZiAoIXNwZWNbJ2NsYXNzJ10pIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKGR1cmF0aW9uKSB7CgkJCWR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKTsKCQkJaWYgKGR1cmF0aW9uLnZhbHVlT2YoKSkgeyAvLyB2YWxpZD8KCQkJCXNwZWMuZHVyYXRpb24gPSBkdXJhdGlvbjsKCQkJCXVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGR1cmF0aW9uKTsKCgkJCQkvLyB2aWV3IGlzIGEgc2luZ2xlLXVuaXQgZHVyYXRpb24sIGxpa2UgIndlZWsiIG9yICJkYXkiCgkJCQkvLyBpbmNvcnBvcmF0ZSBvcHRpb25zIGZvciB0aGlzLiBsb3dlc3QgcHJpb3JpdHkKCQkJCWlmIChkdXJhdGlvbi5hcyh1bml0KSA9PT0gMSkgewoJCQkJCXNwZWMuc2luZ2xlVW5pdCA9IHVuaXQ7CgkJCQkJb3ZlcnJpZGVzQ2hhaW4udW5zaGlmdCh2aWV3T3ZlcnJpZGVzW3VuaXRdIHx8IHt9KTsKCQkJCX0KCQkJfQoJCX0KCgkJc3BlYy5kZWZhdWx0cyA9IG1lcmdlT3B0aW9ucyhkZWZhdWx0c0NoYWluKTsKCQlzcGVjLm92ZXJyaWRlcyA9IG1lcmdlT3B0aW9ucyhvdmVycmlkZXNDaGFpbik7CgoJCXRoaXMuYnVpbGRWaWV3U3BlY09wdGlvbnMoc3BlYyk7CgkJdGhpcy5idWlsZFZpZXdTcGVjQnV0dG9uVGV4dChzcGVjLCByZXF1ZXN0ZWRWaWV3VHlwZSk7CgoJCXJldHVybiBzcGVjOwoJfSwKCgoJLy8gQnVpbGRzIGFuZCBhc3NpZ25zIGEgdmlldyBzcGVjJ3Mgb3B0aW9ucyBvYmplY3QgZnJvbSBpdHMgYWxyZWFkeS1hc3NpZ25lZCBkZWZhdWx0cyBhbmQgb3ZlcnJpZGVzCglidWlsZFZpZXdTcGVjT3B0aW9uczogZnVuY3Rpb24oc3BlYykgewoJCXNwZWMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhbIC8vIGxvd2VzdCB0byBoaWdoZXN0IHByaW9yaXR5CgkJCUNhbGVuZGFyLmRlZmF1bHRzLCAvLyBnbG9iYWwgZGVmYXVsdHMKCQkJc3BlYy5kZWZhdWx0cywgLy8gdmlldydzIGRlZmF1bHRzIChmcm9tIFZpZXdTdWJjbGFzcy5kZWZhdWx0cykKCQkJdGhpcy5kaXJEZWZhdWx0cywKCQkJdGhpcy5sb2NhbGVEZWZhdWx0cywgLy8gbG9jYWxlIGFuZCBkaXIgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdmlldydzIGRlZmF1bHRzIQoJCQl0aGlzLm92ZXJyaWRlcywgLy8gY2FsZW5kYXIncyBvdmVycmlkZXMgKG9wdGlvbnMgZ2l2ZW4gdG8gY29uc3RydWN0b3IpCgkJCXNwZWMub3ZlcnJpZGVzLCAvLyB2aWV3J3Mgb3ZlcnJpZGVzICh2aWV3LXNwZWNpZmljIG9wdGlvbnMpCgkJCXRoaXMuZHluYW1pY092ZXJyaWRlcyAvLyBkeW5hbWljYWxseSBzZXQgdmlhIHNldHRlci4gaGlnaGVzdCBwcmVjZWRlbmNlCgkJXSk7CgkJcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKHNwZWMub3B0aW9ucyk7Cgl9LAoKCgkvLyBDb21wdXRlcyBhbmQgYXNzaWducyBhIHZpZXcgc3BlYydzIGJ1dHRvblRleHQtcmVsYXRlZCBvcHRpb25zCglidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDogZnVuY3Rpb24oc3BlYywgcmVxdWVzdGVkVmlld1R5cGUpIHsKCgkJLy8gZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3Qgd2l0aCBhIHBvc3NpYmxlIGBidXR0b25UZXh0YCBoYXNoLCBsb29rdXAgdGhlIGJ1dHRvblRleHQgZm9yIHRoZQoJCS8vIHJlcXVlc3RlZCB2aWV3LCBmYWxsaW5nIGJhY2sgdG8gYSBnZW5lcmljIHVuaXQgZW50cnkgbGlrZSAid2VlayIgb3IgImRheSIKCQlmdW5jdGlvbiBxdWVyeUJ1dHRvblRleHQob3B0aW9ucykgewoJCQl2YXIgYnV0dG9uVGV4dCA9IG9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTsKCQkJcmV0dXJuIGJ1dHRvblRleHRbcmVxdWVzdGVkVmlld1R5cGVdIHx8CgkJCQkvLyB2aWV3IGNhbiBkZWNpZGUgdG8gbG9vayB1cCBhIGNlcnRhaW4ga2V5CgkJCQkoc3BlYy5idXR0b25UZXh0S2V5ID8gYnV0dG9uVGV4dFtzcGVjLmJ1dHRvblRleHRLZXldIDogbnVsbCkgfHwKCQkJCS8vIGEga2V5IGxpa2UgIm1vbnRoIgoJCQkJKHNwZWMuc2luZ2xlVW5pdCA/IGJ1dHRvblRleHRbc3BlYy5zaW5nbGVVbml0XSA6IG51bGwpOwoJCX0KCgkJLy8gaGlnaGVzdCB0byBsb3dlc3QgcHJpb3JpdHkKCQlzcGVjLmJ1dHRvblRleHRPdmVycmlkZSA9CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLmR5bmFtaWNPdmVycmlkZXMpIHx8CgkJCXF1ZXJ5QnV0dG9uVGV4dCh0aGlzLm92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZQoJCQlzcGVjLm92ZXJyaWRlcy5idXR0b25UZXh0OyAvLyBgYnV0dG9uVGV4dGAgZm9yIHZpZXctc3BlY2lmaWMgb3B0aW9ucyBpcyBhIHN0cmluZwoKCQkvLyBoaWdoZXN0IHRvIGxvd2VzdCBwcmlvcml0eS4gbWlycm9ycyBidWlsZFZpZXdTcGVjT3B0aW9ucwoJCXNwZWMuYnV0dG9uVGV4dERlZmF1bHQgPQoJCQlxdWVyeUJ1dHRvblRleHQodGhpcy5sb2NhbGVEZWZhdWx0cykgfHwKCQkJcXVlcnlCdXR0b25UZXh0KHRoaXMuZGlyRGVmYXVsdHMpIHx8CgkJCXNwZWMuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fCAvLyBhIHNpbmdsZSBzdHJpbmcuIGZyb20gVmlld1N1YmNsYXNzLmRlZmF1bHRzCgkJCXF1ZXJ5QnV0dG9uVGV4dChDYWxlbmRhci5kZWZhdWx0cykgfHwKCQkJKHNwZWMuZHVyYXRpb24gPyB0aGlzLmh1bWFuaXplRHVyYXRpb24oc3BlYy5kdXJhdGlvbikgOiBudWxsKSB8fCAvLyBsaWtlICIzIGRheXMiCgkJCXJlcXVlc3RlZFZpZXdUeXBlOyAvLyBmYWxsIGJhY2sgdG8gZ2l2ZW4gdmlldyBuYW1lCgl9LAoKCgkvLyBHaXZlbiBhIHZpZXcgbmFtZSBmb3IgYSBjdXN0b20gdmlldyBvciBhIHN0YW5kYXJkIHZpZXcsIGNyZWF0ZXMgYSByZWFkeS10by1nbyBWaWV3IG9iamVjdAoJaW5zdGFudGlhdGVWaWV3OiBmdW5jdGlvbih2aWV3VHlwZSkgewoJCXZhciBzcGVjID0gdGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCXJldHVybiBuZXcgc3BlY1snY2xhc3MnXSh0aGlzLCB2aWV3VHlwZSwgc3BlYy5vcHRpb25zLCBzcGVjLmR1cmF0aW9uKTsKCX0sCgoKCS8vIFJldHVybnMgYSBib29sZWFuIGFib3V0IHdoZXRoZXIgdGhlIHZpZXcgaXMgb2theSB0byBpbnN0YW50aWF0ZSBhdCBzb21lIHBvaW50Cglpc1ZhbGlkVmlld1R5cGU6IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CgkJcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh2aWV3VHlwZSkpOwoJfSwKCgoJLy8gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFueSB0eXBlIG9mIGFzeW5jIGRhdGEgZmV0Y2hpbmcgYmVnaW5zCglwdXNoTG9hZGluZzogZnVuY3Rpb24oKSB7CgkJaWYgKCEodGhpcy5sb2FkaW5nTGV2ZWwrKykpIHsKCQkJdGhpcy50cmlnZ2VyKCdsb2FkaW5nJywgbnVsbCwgdHJ1ZSwgdGhpcy52aWV3KTsKCQl9Cgl9LAoKCgkvLyBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYW55IHR5cGUgb2YgYXN5bmMgZGF0YSBmZXRjaGluZyBjb21wbGV0ZXMKCXBvcExvYWRpbmc6IGZ1bmN0aW9uKCkgewoJCWlmICghKC0tdGhpcy5sb2FkaW5nTGV2ZWwpKSB7CgkJCXRoaXMudHJpZ2dlcignbG9hZGluZycsIG51bGwsIGZhbHNlLCB0aGlzLnZpZXcpOwoJCX0KCX0sCgoKCS8vIEdpdmVuIGFyZ3VtZW50cyB0byB0aGUgc2VsZWN0IG1ldGhvZCBpbiB0aGUgQVBJLCByZXR1cm5zIGEgc3BhbiAodW56b25lZCBzdGFydC9lbmQgYW5kIG90aGVyIGluZm8pCglidWlsZFNlbGVjdFNwYW46IGZ1bmN0aW9uKHpvbmVkU3RhcnRJbnB1dCwgem9uZWRFbmRJbnB1dCkgewoJCXZhciBzdGFydCA9IHRoaXMubW9tZW50KHpvbmVkU3RhcnRJbnB1dCkuc3RyaXBab25lKCk7CgkJdmFyIGVuZDsKCgkJaWYgKHpvbmVkRW5kSW5wdXQpIHsKCQkJZW5kID0gdGhpcy5tb21lbnQoem9uZWRFbmRJbnB1dCkuc3RyaXBab25lKCk7CgkJfQoJCWVsc2UgaWYgKHN0YXJ0Lmhhc1RpbWUoKSkgewoJCQllbmQgPSBzdGFydC5jbG9uZSgpLmFkZCh0aGlzLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kID0gc3RhcnQuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7CgkJfQoKCQlyZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07Cgl9Cgp9KTsKCgpDYWxlbmRhci5taXhpbihFbWl0dGVyTWl4aW4pOwoKCmZ1bmN0aW9uIENhbGVuZGFyX2NvbnN0cnVjdG9yKGVsZW1lbnQsIG92ZXJyaWRlcykgewoJdmFyIHQgPSB0aGlzOwoKCgkvLyBFeHBvcnRzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5kZXN0cm95ID0gZGVzdHJveTsKCXQucmVmZXRjaEV2ZW50cyA9IHJlZmV0Y2hFdmVudHM7Cgl0LnJlZmV0Y2hFdmVudFNvdXJjZXMgPSByZWZldGNoRXZlbnRTb3VyY2VzOwoJdC5yZXBvcnRFdmVudHMgPSByZXBvcnRFdmVudHM7Cgl0LnJlcG9ydEV2ZW50Q2hhbmdlID0gcmVwb3J0RXZlbnRDaGFuZ2U7Cgl0LnJlcmVuZGVyRXZlbnRzID0gcmVuZGVyRXZlbnRzOyAvLyBgcmVuZGVyRXZlbnRzYCBzZXJ2ZXMgYXMgYSByZXJlbmRlci4gYW4gQVBJIG1ldGhvZAoJdC5jaGFuZ2VWaWV3ID0gcmVuZGVyVmlldzsgLy8gYHJlbmRlclZpZXdgIHdpbGwgc3dpdGNoIHRvIGFub3RoZXIgdmlldwoJdC5zZWxlY3QgPSBzZWxlY3Q7Cgl0LnVuc2VsZWN0ID0gdW5zZWxlY3Q7Cgl0LnByZXYgPSBwcmV2OwoJdC5uZXh0ID0gbmV4dDsKCXQucHJldlllYXIgPSBwcmV2WWVhcjsKCXQubmV4dFllYXIgPSBuZXh0WWVhcjsKCXQudG9kYXkgPSB0b2RheTsKCXQuZ290b0RhdGUgPSBnb3RvRGF0ZTsKCXQuaW5jcmVtZW50RGF0ZSA9IGluY3JlbWVudERhdGU7Cgl0Lnpvb21UbyA9IHpvb21UbzsKCXQuZ2V0RGF0ZSA9IGdldERhdGU7Cgl0LmdldENhbGVuZGFyID0gZ2V0Q2FsZW5kYXI7Cgl0LmdldFZpZXcgPSBnZXRWaWV3OwoJdC5vcHRpb24gPSBvcHRpb247IC8vIGdldHRlci9zZXR0ZXIgbWV0aG9kCgl0LnRyaWdnZXIgPSB0cmlnZ2VyOwoKCgkvLyBPcHRpb25zCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCXQuZHluYW1pY092ZXJyaWRlcyA9IHt9OwoJdC52aWV3U3BlY0NhY2hlID0ge307Cgl0Lm9wdGlvbkhhbmRsZXJzID0ge307IC8vIGZvciBDYWxlbmRhci5vcHRpb25zLmpzCgl0Lm92ZXJyaWRlcyA9ICQuZXh0ZW5kKHt9LCBvdmVycmlkZXMpOyAvLyBtYWtlIGEgY29weQoKCXQucG9wdWxhdGVPcHRpb25zSGFzaCgpOyAvLyBzZXRzIHRoaXMub3B0aW9ucwoKCgoJLy8gTG9jYWxlLWRhdGEgSW50ZXJuYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIHRoZSBjdXJyZW50IGxvY2FsZSdzIGRhdGEKCgl2YXIgbG9jYWxlRGF0YTsKCgkvLyBDYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgb3B0aW9ucyBjaGFuZ2UuCgkvLyBIYXBwZW5zIGJlZm9yZSBhbnkgaW50ZXJuYWwgb2JqZWN0cyByZWJ1aWxkIG9yIHJlcmVuZGVyLCBiZWNhdXNlIHRoaXMgaXMgdmVyeSBjb3JlLgoJdC5iaW5kT3B0aW9ucyhbCgkJJ2xvY2FsZScsICdtb250aE5hbWVzJywgJ21vbnRoTmFtZXNTaG9ydCcsICdkYXlOYW1lcycsICdkYXlOYW1lc1Nob3J0JywgJ2ZpcnN0RGF5JywgJ3dlZWtOdW1iZXJDYWxjdWxhdGlvbicKCV0sIGZ1bmN0aW9uKGxvY2FsZSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0LCBkYXlOYW1lcywgZGF5TmFtZXNTaG9ydCwgZmlyc3REYXksIHdlZWtOdW1iZXJDYWxjdWxhdGlvbikgewoKCQkvLyBub3JtYWxpemUKCQlpZiAod2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnaXNvJykgewoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPSAnSVNPJzsgLy8gbm9ybWFsaXplCgkJfQoKCQlsb2NhbGVEYXRhID0gY3JlYXRlT2JqZWN0KCAvLyBtYWtlIGEgY2hlYXAgY29weQoJCQlnZXRNb21lbnRMb2NhbGVEYXRhKGxvY2FsZSkgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCQkpOwoKCQlpZiAobW9udGhOYW1lcykgewoJCQlsb2NhbGVEYXRhLl9tb250aHMgPSBtb250aE5hbWVzOwoJCX0KCQlpZiAobW9udGhOYW1lc1Nob3J0KSB7CgkJCWxvY2FsZURhdGEuX21vbnRoc1Nob3J0ID0gbW9udGhOYW1lc1Nob3J0OwoJCX0KCQlpZiAoZGF5TmFtZXMpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXMgPSBkYXlOYW1lczsKCQl9CgkJaWYgKGRheU5hbWVzU2hvcnQpIHsKCQkJbG9jYWxlRGF0YS5fd2Vla2RheXNTaG9ydCA9IGRheU5hbWVzU2hvcnQ7CgkJfQoKCQlpZiAoZmlyc3REYXkgPT0gbnVsbCAmJiB3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nKSB7CgkJCWZpcnN0RGF5ID0gMTsKCQl9CgkJaWYgKGZpcnN0RGF5ICE9IG51bGwpIHsKCQkJdmFyIF93ZWVrID0gY3JlYXRlT2JqZWN0KGxvY2FsZURhdGEuX3dlZWspOyAvLyBfd2VlazogeyBkb3c6ICMgfQoJCQlfd2Vlay5kb3cgPSBmaXJzdERheTsKCQkJbG9jYWxlRGF0YS5fd2VlayA9IF93ZWVrOwoJCX0KCgkJaWYgKCAvLyB3aGl0ZWxpc3QgY2VydGFpbiBraW5kcyBvZiBpbnB1dAoJCQl3ZWVrTnVtYmVyQ2FsY3VsYXRpb24gPT09ICdJU08nIHx8CgkJCXdlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2xvY2FsJyB8fAoJCQl0eXBlb2Ygd2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnZnVuY3Rpb24nCgkJKSB7CgkJCWxvY2FsZURhdGEuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYyA9IHdlZWtOdW1iZXJDYWxjdWxhdGlvbjsgLy8gbW9tZW50LWV4dCB3aWxsIGtub3cgd2hhdCB0byBkbyB3aXRoIGl0CgkJfQoKCQkvLyBJZiB0aGUgaW50ZXJuYWwgY3VycmVudCBkYXRlIG9iamVjdCBhbHJlYWR5IGV4aXN0cywgbW92ZSB0byBuZXcgbG9jYWxlLgoJCS8vIFdlIGRvIE5PVCBuZWVkIHRvIGRvIHRoaXMgdGVjaG5pcXVlIGZvciBldmVudCBkYXRlcywgYmVjYXVzZSB0aGlzIGhhcHBlbnMgd2hlbiBjb252ZXJ0aW5nIHRvICJzZWdtZW50cyIuCgkJaWYgKGRhdGUpIHsKCQkJbG9jYWxpemVNb21lbnQoZGF0ZSk7IC8vIHNldHMgdG8gbG9jYWxlRGF0YQoJCX0KCX0pOwoKCgkvLyBDYWxlbmRhci1zcGVjaWZpYyBEYXRlIFV0aWxpdGllcwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJdC5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbih0Lm9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJdC5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHQub3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTsKCgoJLy8gQnVpbGRzIGEgbW9tZW50IHVzaW5nIHRoZSBzZXR0aW5ncyBvZiB0aGUgY3VycmVudCBjYWxlbmRhcjogdGltZXpvbmUgYW5kIGxvY2FsZS4KCS8vIEFjY2VwdHMgYW55dGhpbmcgdGhlIHZhbmlsbGEgbW9tZW50KCkgY29uc3RydWN0b3IgYWNjZXB0cy4KCXQubW9tZW50ID0gZnVuY3Rpb24oKSB7CgkJdmFyIG1vbTsKCgkJaWYgKHQub3B0aW9ucy50aW1lem9uZSA9PT0gJ2xvY2FsJykgewoJCQltb20gPSBGQy5tb21lbnQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKCgkJCS8vIEZvcmNlIHRoZSBtb21lbnQgdG8gYmUgbG9jYWwsIGJlY2F1c2UgRkMubW9tZW50IGRvZXNuJ3QgZ3VhcmFudGVlIGl0LgoJCQlpZiAobW9tLmhhc1RpbWUoKSkgeyAvLyBkb24ndCBnaXZlIGFtYmlndW91c2x5LXRpbWVkIG1vbWVudHMgYSBsb2NhbCB6b25lCgkJCQltb20ubG9jYWwoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0Lm9wdGlvbnMudGltZXpvbmUgPT09ICdVVEMnKSB7CgkJCW1vbSA9IEZDLm1vbWVudC51dGMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gcHJvY2VzcyBhcyBVVEMKCQl9CgkJZWxzZSB7CgkJCW1vbSA9IEZDLm1vbWVudC5wYXJzZVpvbmUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgLy8gbGV0IHRoZSBpbnB1dCBkZWNpZGUgdGhlIHpvbmUKCQl9CgoJCWxvY2FsaXplTW9tZW50KG1vbSk7CgoJCXJldHVybiBtb207Cgl9OwoKCgkvLyBVcGRhdGVzIHRoZSBnaXZlbiBtb21lbnQncyBsb2NhbGUgc2V0dGluZ3MgdG8gdGhlIGN1cnJlbnQgY2FsZW5kYXIgbG9jYWxlIHNldHRpbmdzLgoJZnVuY3Rpb24gbG9jYWxpemVNb21lbnQobW9tKSB7CgkJbW9tLl9sb2NhbGUgPSBsb2NhbGVEYXRhOwoJfQoJdC5sb2NhbGl6ZU1vbWVudCA9IGxvY2FsaXplTW9tZW50OwoKCgkvLyBSZXR1cm5zIGEgYm9vbGVhbiBhYm91dCB3aGV0aGVyIG9yIG5vdCB0aGUgY2FsZW5kYXIga25vd3MgaG93IHRvIGNhbGN1bGF0ZQoJLy8gdGhlIHRpbWV6b25lIG9mZnNldCBvZiBhcmJpdHJhcnkgZGF0ZXMgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuCgl0LmdldElzQW1iaWdUaW1lem9uZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0Lm9wdGlvbnMudGltZXpvbmUgIT09ICdsb2NhbCcgJiYgdC5vcHRpb25zLnRpbWV6b25lICE9PSAnVVRDJzsKCX07CgoKCS8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiBIYXMgbm8gZWZmZWN0IG9uIGRhdGVzIHdpdGhvdXQgdGltZXMuCgl0LmFwcGx5VGltZXpvbmUgPSBmdW5jdGlvbihkYXRlKSB7CgkJaWYgKCFkYXRlLmhhc1RpbWUoKSkgewoJCQlyZXR1cm4gZGF0ZS5jbG9uZSgpOwoJCX0KCgkJdmFyIHpvbmVkRGF0ZSA9IHQubW9tZW50KGRhdGUudG9BcnJheSgpKTsKCQl2YXIgdGltZUFkanVzdCA9IGRhdGUudGltZSgpIC0gem9uZWREYXRlLnRpbWUoKTsKCQl2YXIgYWRqdXN0ZWRab25lZERhdGU7CgoJCS8vIFNhZmFyaSBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhpcyBjb2Vyc2lvbiB3aGVuIG5lYXIgRFNULiBBZGp1c3QgaWYgbmVjZXNzYXJ5LiAoYnVnICMyMzk2KQoJCWlmICh0aW1lQWRqdXN0KSB7IC8vIGlzIHRoZSB0aW1lIHJlc3VsdCBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZD8KCQkJYWRqdXN0ZWRab25lZERhdGUgPSB6b25lZERhdGUuY2xvbmUoKS5hZGQodGltZUFkanVzdCk7IC8vIGFkZCBtaWxsaXNlY29uZHMKCQkJaWYgKGRhdGUudGltZSgpIC0gYWRqdXN0ZWRab25lZERhdGUudGltZSgpID09PSAwKSB7IC8vIGRvZXMgaXQgbWF0Y2ggcGVyZmVjdGx5IG5vdz8KCQkJCXpvbmVkRGF0ZSA9IGFkanVzdGVkWm9uZWREYXRlOwoJCQl9CgkJfQoKCQlyZXR1cm4gem9uZWREYXRlOwoJfTsKCgoJLy8gUmV0dXJucyBhIG1vbWVudCBmb3IgdGhlIGN1cnJlbnQgZGF0ZSwgYXMgZGVmaW5lZCBieSB0aGUgY2xpZW50J3MgY29tcHV0ZXIgb3IgZnJvbSB0aGUgYG5vd2Agb3B0aW9uLgoJLy8gV2lsbCByZXR1cm4gYW4gbW9tZW50IHdpdGggYW4gYW1iaWd1b3VzIHRpbWV6b25lLgoJdC5nZXROb3cgPSBmdW5jdGlvbigpIHsKCQl2YXIgbm93ID0gdC5vcHRpb25zLm5vdzsKCQlpZiAodHlwZW9mIG5vdyA9PT0gJ2Z1bmN0aW9uJykgewoJCQlub3cgPSBub3coKTsKCQl9CgkJcmV0dXJuIHQubW9tZW50KG5vdykuc3RyaXBab25lKCk7Cgl9OwoKCgkvLyBHZXQgYW4gZXZlbnQncyBub3JtYWxpemVkIGVuZCBkYXRlLiBJZiBub3QgcHJlc2VudCwgY2FsY3VsYXRlIGl0IGZyb20gdGhlIGRlZmF1bHRzLgoJdC5nZXRFdmVudEVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKGV2ZW50LmVuZCkgewoJCQlyZXR1cm4gZXZlbnQuZW5kLmNsb25lKCk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuYWxsRGF5LCBldmVudC5zdGFydCk7CgkJfQoJfTsKCgoJLy8gR2l2ZW4gYW4gZXZlbnQncyBhbGxEYXkgc3RhdHVzIGFuZCBzdGFydCBkYXRlLCByZXR1cm4gd2hhdCBpdHMgZmFsbGJhY2sgZW5kIGRhdGUgc2hvdWxkIGJlLgoJLy8gVE9ETzogcmVuYW1lIHRvIGNvbXB1dGVEZWZhdWx0RXZlbnRFbmQKCXQuZ2V0RGVmYXVsdEV2ZW50RW5kID0gZnVuY3Rpb24oYWxsRGF5LCB6b25lZFN0YXJ0KSB7CgkJdmFyIGVuZCA9IHpvbmVkU3RhcnQuY2xvbmUoKTsKCgkJaWYgKGFsbERheSkgewoJCQllbmQuc3RyaXBUaW1lKCkuYWRkKHQuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOwoJCX0KCQllbHNlIHsKCQkJZW5kLmFkZCh0LmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pOwoJCX0KCgkJaWYgKHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCkpIHsKCQkJZW5kLnN0cmlwWm9uZSgpOyAvLyB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHR6byBzaG91bGQgYmUKCQl9CgoJCXJldHVybiBlbmQ7Cgl9OwoKCgkvLyBQcm9kdWNlcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uLgoJLy8gU2lkZS1lZmZlY3Q6IGNoYW5nZXMgdGhlIGxvY2FsZSBvZiB0aGUgZ2l2ZW4gZHVyYXRpb24uCgl0Lmh1bWFuaXplRHVyYXRpb24gPSBmdW5jdGlvbihkdXJhdGlvbikgewoJCXJldHVybiBkdXJhdGlvbi5sb2NhbGUodC5vcHRpb25zLmxvY2FsZSkuaHVtYW5pemUoKTsKCX07CgoKCQoJLy8gSW1wb3J0cwoJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoJRXZlbnRNYW5hZ2VyLmNhbGwodCk7Cgl2YXIgaXNGZXRjaE5lZWRlZCA9IHQuaXNGZXRjaE5lZWRlZDsKCXZhciBmZXRjaEV2ZW50cyA9IHQuZmV0Y2hFdmVudHM7Cgl2YXIgZmV0Y2hFdmVudFNvdXJjZXMgPSB0LmZldGNoRXZlbnRTb3VyY2VzOwoKCgoJLy8gTG9jYWxzCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl2YXIgX2VsZW1lbnQgPSBlbGVtZW50WzBdOwoJdmFyIGhlYWRlcjsKCXZhciBjb250ZW50OwoJdmFyIHRtOyAvLyBmb3IgbWFraW5nIHRoZW1lIGNsYXNzZXMKCXZhciBjdXJyZW50VmlldzsgLy8gTk9URToga2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGlzLnZpZXcKCXZhciB2aWV3c0J5VHlwZSA9IHt9OyAvLyBob2xkcyBhbGwgaW5zdGFudGlhdGVkIHZpZXcgaW5zdGFuY2VzLCBjdXJyZW50IG9yIG5vdAoJdmFyIHN1Z2dlc3RlZFZpZXdIZWlnaHQ7Cgl2YXIgd2luZG93UmVzaXplUHJveHk7IC8vIHdyYXBzIHRoZSB3aW5kb3dSZXNpemUgZnVuY3Rpb24KCXZhciBpZ25vcmVXaW5kb3dSZXNpemUgPSAwOwoJdmFyIGV2ZW50cyA9IFtdOwoJdmFyIGRhdGU7IC8vIHVuem9uZWQKCQoJCgkKCS8vIE1haW4gUmVuZGVyaW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgkvLyBjb21wdXRlIHRoZSBpbml0aWFsIGFtYmlnLXRpbWV6b25lIGRhdGUKCWlmICh0Lm9wdGlvbnMuZGVmYXVsdERhdGUgIT0gbnVsbCkgewoJCWRhdGUgPSB0Lm1vbWVudCh0Lm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOwoJfQoJZWxzZSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7IC8vIGdldE5vdyBhbHJlYWR5IHJldHVybnMgdW56b25lZAoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlcigpIHsKCQlpZiAoIWNvbnRlbnQpIHsKCQkJaW5pdGlhbFJlbmRlcigpOwoJCX0KCQllbHNlIGlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCS8vIG1haW5seSBmb3IgdGhlIHB1YmxpYyBBUEkKCQkJY2FsY1NpemUoKTsKCQkJcmVuZGVyVmlldygpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBpbml0aWFsUmVuZGVyKCkgewoJCWVsZW1lbnQuYWRkQ2xhc3MoJ2ZjJyk7CgoJCS8vIGV2ZW50IGRlbGVnYXRpb24gZm9yIG5hdiBsaW5rcwoJCWVsZW1lbnQub24oJ2NsaWNrLmZjJywgJ2FbZGF0YS1nb3RvXScsIGZ1bmN0aW9uKGV2KSB7CgkJCXZhciBhbmNob3JFbCA9ICQodGhpcyk7CgkJCXZhciBnb3RvT3B0aW9ucyA9IGFuY2hvckVsLmRhdGEoJ2dvdG8nKTsgLy8gd2lsbCBhdXRvbWF0aWNhbGx5IHBhcnNlIEpTT04KCQkJdmFyIGRhdGUgPSB0Lm1vbWVudChnb3RvT3B0aW9ucy5kYXRlKTsKCQkJdmFyIHZpZXdUeXBlID0gZ290b09wdGlvbnMudHlwZTsKCgkJCS8vIHByb3BlcnR5IGxpa2UgIm5hdkxpbmtEYXlDbGljayIuIG1pZ2h0IGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24KCQkJdmFyIGN1c3RvbUFjdGlvbiA9IGN1cnJlbnRWaWV3Lm9wdCgnbmF2TGluaycgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodmlld1R5cGUpICsgJ0NsaWNrJyk7CgoJCQlpZiAodHlwZW9mIGN1c3RvbUFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewoJCQkJY3VzdG9tQWN0aW9uKGRhdGUsIGV2KTsKCQkJfQoJCQllbHNlIHsKCQkJCWlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykgewoJCQkJCXZpZXdUeXBlID0gY3VzdG9tQWN0aW9uOwoJCQkJfQoJCQkJem9vbVRvKGRhdGUsIHZpZXdUeXBlKTsKCQkJfQoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UKCQl0LmJpbmRPcHRpb24oJ3RoZW1lJywgZnVuY3Rpb24odGhlbWUpIHsKCQkJdG0gPSB0aGVtZSA/ICd1aScgOiAnZmMnOyAvLyBhZmZlY3RzIGEgbGFyZ2VyIHNjb3BlCgkJCWVsZW1lbnQudG9nZ2xlQ2xhc3MoJ3VpLXdpZGdldCcsIHRoZW1lKTsKCQkJZWxlbWVudC50b2dnbGVDbGFzcygnZmMtdW50aGVtZWQnLCAhdGhlbWUpOwoJCX0pOwoKCQkvLyBjYWxsZWQgaW1tZWRpYXRlbHksIGFuZCB1cG9uIG9wdGlvbiBjaGFuZ2UuCgkJLy8gSEFDSzogbG9jYWxlIG9mdGVuIGFmZmVjdHMgaXNSVEwsIHNvIHdlIGV4cGxpY2l0bHkgbGlzdGVuIHRvIHRoYXQgdG9vLgoJCXQuYmluZE9wdGlvbnMoWyAnaXNSVEwnLCAnbG9jYWxlJyBdLCBmdW5jdGlvbihpc1JUTCkgewoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1sdHInLCAhaXNSVEwpOwoJCQllbGVtZW50LnRvZ2dsZUNsYXNzKCdmYy1ydGwnLCBpc1JUTCk7CgkJfSk7CgoJCWNvbnRlbnQgPSAkKCI8ZGl2IGNsYXNzPSdmYy12aWV3LWNvbnRhaW5lcicvPiIpLnByZXBlbmRUbyhlbGVtZW50KTsKCgkJaGVhZGVyID0gdC5oZWFkZXIgPSBuZXcgSGVhZGVyKHQpOwoJCXJlbmRlckhlYWRlcigpOwoKCQlyZW5kZXJWaWV3KHQub3B0aW9ucy5kZWZhdWx0Vmlldyk7CgoJCWlmICh0Lm9wdGlvbnMuaGFuZGxlV2luZG93UmVzaXplKSB7CgkJCXdpbmRvd1Jlc2l6ZVByb3h5ID0gZGVib3VuY2Uod2luZG93UmVzaXplLCB0Lm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpOyAvLyBwcmV2ZW50cyByYXBpZCBjYWxscwoJCQkkKHdpbmRvdykucmVzaXplKHdpbmRvd1Jlc2l6ZVByb3h5KTsKCQl9Cgl9CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgSGVhZGVyIHdpbGwgcmVyZW5kZXIKCWZ1bmN0aW9uIHJlbmRlckhlYWRlcigpIHsKCQloZWFkZXIucmVuZGVyKCk7CgkJaWYgKGhlYWRlci5lbCkgewoJCQllbGVtZW50LnByZXBlbmQoaGVhZGVyLmVsKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVzdHJveSgpIHsKCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgkJCWN1cnJlbnRWaWV3LnJlbW92ZUVsZW1lbnQoKTsKCgkJCS8vIE5PVEU6IGRvbid0IG51bGwtb3V0IGN1cnJlbnRWaWV3L3QudmlldyBpbiBjYXNlIEFQSSBtZXRob2RzIGFyZSBjYWxsZWQgYWZ0ZXIgZGVzdHJveS4KCQkJLy8gSXQgaXMgc3RpbGwgdGhlICJjdXJyZW50IiB2aWV3LCBqdXN0IG5vdCByZW5kZXJlZC4KCQl9CgoJCWhlYWRlci5yZW1vdmVFbGVtZW50KCk7CgkJY29udGVudC5yZW1vdmUoKTsKCQllbGVtZW50LnJlbW92ZUNsYXNzKCdmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCcpOwoKCQllbGVtZW50Lm9mZignLmZjJyk7IC8vIHVuYmluZCBuYXYgbGluayBoYW5kbGVycwoKCQlpZiAod2luZG93UmVzaXplUHJveHkpIHsKCQkJJCh3aW5kb3cpLnVuYmluZCgncmVzaXplJywgd2luZG93UmVzaXplUHJveHkpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbGVtZW50VmlzaWJsZSgpIHsKCQlyZXR1cm4gZWxlbWVudC5pcygnOnZpc2libGUnKTsKCX0KCQoJCgoJLy8gVmlldyBSZW5kZXJpbmcKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCS8vIFJlbmRlcnMgYSB2aWV3IGJlY2F1c2Ugb2YgYSBkYXRlIGNoYW5nZSwgdmlldy10eXBlIGNoYW5nZSwgb3IgZm9yIHRoZSBmaXJzdCB0aW1lLgoJLy8gSWYgbm90IGdpdmVuIGEgdmlld1R5cGUsIGtlZXAgdGhlIGN1cnJlbnQgdmlldyBidXQgcmVuZGVyIGRpZmZlcmVudCBkYXRlcy4KCS8vIEFjY2VwdHMgYW4gb3B0aW9uYWwgc2Nyb2xsIHN0YXRlIHRvIHJlc3RvcmUgdG8uCglmdW5jdGlvbiByZW5kZXJWaWV3KHZpZXdUeXBlLCBleHBsaWNpdFNjcm9sbFN0YXRlKSB7CgkJaWdub3JlV2luZG93UmVzaXplKys7CgoJCS8vIGlmIHZpZXdUeXBlIGlzIGNoYW5naW5nLCByZW1vdmUgdGhlIG9sZCB2aWV3J3MgcmVuZGVyaW5nCgkJaWYgKGN1cnJlbnRWaWV3ICYmIHZpZXdUeXBlICYmIGN1cnJlbnRWaWV3LnR5cGUgIT09IHZpZXdUeXBlKSB7CgkJCWZyZWV6ZUNvbnRlbnRIZWlnaHQoKTsgLy8gcHJldmVudCBhIHNjcm9sbCBqdW1wIHdoZW4gdmlldyBlbGVtZW50IGlzIHJlbW92ZWQKCQkJY2xlYXJWaWV3KCk7CgkJfQoKCQkvLyBpZiB2aWV3VHlwZSBjaGFuZ2VkLCBvciB0aGUgdmlldyB3YXMgbmV2ZXIgY3JlYXRlZCwgY3JlYXRlIGEgZnJlc2ggdmlldwoJCWlmICghY3VycmVudFZpZXcgJiYgdmlld1R5cGUpIHsKCQkJY3VycmVudFZpZXcgPSB0LnZpZXcgPQoJCQkJdmlld3NCeVR5cGVbdmlld1R5cGVdIHx8CgkJCQkodmlld3NCeVR5cGVbdmlld1R5cGVdID0gdC5pbnN0YW50aWF0ZVZpZXcodmlld1R5cGUpKTsKCgkJCWN1cnJlbnRWaWV3LnNldEVsZW1lbnQoCgkJCQkkKCI8ZGl2IGNsYXNzPSdmYy12aWV3IGZjLSIgKyB2aWV3VHlwZSArICItdmlldycgLz4iKS5hcHBlbmRUbyhjb250ZW50KQoJCQkpOwoJCQloZWFkZXIuYWN0aXZhdGVCdXR0b24odmlld1R5cGUpOwoJCX0KCgkJaWYgKGN1cnJlbnRWaWV3KSB7CgoJCQkvLyBpbiBjYXNlIHRoZSB2aWV3IHNob3VsZCByZW5kZXIgYSBwZXJpb2Qgb2YgdGltZSB0aGF0IGlzIGNvbXBsZXRlbHkgaGlkZGVuCgkJCWRhdGUgPSBjdXJyZW50Vmlldy5tYXNzYWdlQ3VycmVudERhdGUoZGF0ZSk7CgoJCQkvLyByZW5kZXIgb3IgcmVyZW5kZXIgdGhlIHZpZXcKCQkJaWYgKAoJCQkJIWN1cnJlbnRWaWV3LmRpc3BsYXlpbmcgfHwKCQkJCSEoIC8vIE5PVCB3aXRoaW4gaW50ZXJ2YWwgcmFuZ2Ugc2lnbmFscyBhbiBpbXBsaWNpdCBkYXRlIHdpbmRvdyBjaGFuZ2UKCQkJCQlkYXRlID49IGN1cnJlbnRWaWV3LmludGVydmFsU3RhcnQgJiYKCQkJCQlkYXRlIDwgY3VycmVudFZpZXcuaW50ZXJ2YWxFbmQKCQkJCSkKCQkJKSB7CgkJCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoKCQkJCQljdXJyZW50Vmlldy5kaXNwbGF5KGRhdGUsIGV4cGxpY2l0U2Nyb2xsU3RhdGUpOyAvLyB3aWxsIGNhbGwgZnJlZXplQ29udGVudEhlaWdodAoJCQkJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyBpbW1lZGlhdGVseSB1bmZyZWV6ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGlzcGxheSBpcyBhc3luYwoKCQkJCQkvLyBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgVmlldzo6cmVuZGVyLCBzbyBkYXRlcyBhcmUgY2FsY3VsYXRlZAoJCQkJCXVwZGF0ZUhlYWRlclRpdGxlKCk7CgkJCQkJdXBkYXRlVG9kYXlCdXR0b24oKTsKCgkJCQkJZ2V0QW5kUmVuZGVyRXZlbnRzKCk7CgkJCQl9CgkJCX0KCQl9CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOyAvLyB1bmRvIGFueSBsb25lIGZyZWV6ZUNvbnRlbnRIZWlnaHQgY2FsbHMKCQlpZ25vcmVXaW5kb3dSZXNpemUtLTsKCX0KCgoJLy8gVW5yZW5kZXJzIHRoZSBjdXJyZW50IHZpZXcgYW5kIHJlZmxlY3RzIHRoaXMgY2hhbmdlIGluIHRoZSBIZWFkZXIuCgkvLyBVbnJlZ3NpdGVycyB0aGUgYGN1cnJlbnRWaWV3YCwgYnV0IGRvZXMgbm90IHJlbW92ZSBmcm9tIHZpZXdCeVR5cGUgaGFzaC4KCWZ1bmN0aW9uIGNsZWFyVmlldygpIHsKCQloZWFkZXIuZGVhY3RpdmF0ZUJ1dHRvbihjdXJyZW50Vmlldy50eXBlKTsKCQljdXJyZW50Vmlldy5yZW1vdmVFbGVtZW50KCk7CgkJY3VycmVudFZpZXcgPSB0LnZpZXcgPSBudWxsOwoJfQoKCgkvLyBEZXN0cm95cyB0aGUgdmlldywgaW5jbHVkaW5nIHRoZSB2aWV3IG9iamVjdC4gVGhlbiwgcmUtaW5zdGFudGlhdGVzIGl0IGFuZCByZW5kZXJzIGl0LgoJLy8gTWFpbnRhaW5zIHRoZSBzYW1lIHNjcm9sbCBzdGF0ZS4KCS8vIFRPRE86IG1haW50YWluIGFueSBvdGhlciB1c2VyLW1hbmlwdWxhdGVkIHN0YXRlLgoJZnVuY3Rpb24gcmVpbml0VmlldygpIHsKCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgoJCXZhciB2aWV3VHlwZSA9IGN1cnJlbnRWaWV3LnR5cGU7CgkJdmFyIHNjcm9sbFN0YXRlID0gY3VycmVudFZpZXcucXVlcnlTY3JvbGwoKTsKCQljbGVhclZpZXcoKTsKCQlyZW5kZXJWaWV3KHZpZXdUeXBlLCBzY3JvbGxTdGF0ZSk7CgoJCXVuZnJlZXplQ29udGVudEhlaWdodCgpOwoJCWlnbm9yZVdpbmRvd1Jlc2l6ZS0tOwoJfQoKCQoKCS8vIFJlc2l6aW5nCgkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgl0LmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBmdW5jdGlvbigpIHsKCQlpZiAoc3VnZ2VzdGVkVmlld0hlaWdodCA9PT0gdW5kZWZpbmVkKSB7CgkJCWNhbGNTaXplKCk7CgkJfQoJCXJldHVybiBzdWdnZXN0ZWRWaWV3SGVpZ2h0OwoJfTsKCgoJdC5pc0hlaWdodEF1dG8gPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJyB8fCB0Lm9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0byc7Cgl9OwoJCgkKCWZ1bmN0aW9uIHVwZGF0ZVNpemUoc2hvdWxkUmVjYWxjKSB7CgkJaWYgKGVsZW1lbnRWaXNpYmxlKCkpIHsKCgkJCWlmIChzaG91bGRSZWNhbGMpIHsKCQkJCV9jYWxjU2l6ZSgpOwoJCQl9CgoJCQlpZ25vcmVXaW5kb3dSZXNpemUrKzsKCQkJY3VycmVudFZpZXcudXBkYXRlU2l6ZSh0cnVlKTsgLy8gaXNSZXNpemU9dHJ1ZS4gd2lsbCBwb2xsIGdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSBhbmQgaXNIZWlnaHRBdXRvKCkKCQkJaWdub3JlV2luZG93UmVzaXplLS07CgoJCQlyZXR1cm4gdHJ1ZTsgLy8gc2lnbmFsIHN1Y2Nlc3MKCQl9Cgl9CgoKCWZ1bmN0aW9uIGNhbGNTaXplKCkgewoJCWlmIChlbGVtZW50VmlzaWJsZSgpKSB7CgkJCV9jYWxjU2l6ZSgpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfY2FsY1NpemUoKSB7IC8vIGFzc3VtZXMgZWxlbWVudFZpc2libGUKCQl2YXIgY29udGVudEhlaWdodElucHV0ID0gdC5vcHRpb25zLmNvbnRlbnRIZWlnaHQ7CgkJdmFyIGhlaWdodElucHV0ID0gdC5vcHRpb25zLmhlaWdodDsKCgkJaWYgKHR5cGVvZiBjb250ZW50SGVpZ2h0SW5wdXQgPT09ICdudW1iZXInKSB7IC8vIGV4aXN0cyBhbmQgbm90ICdhdXRvJwoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0OwoJCX0KCQllbHNlIGlmICh0eXBlb2YgY29udGVudEhlaWdodElucHV0ID09PSAnZnVuY3Rpb24nKSB7IC8vIGV4aXN0cyBhbmQgaXMgYSBmdW5jdGlvbgoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gY29udGVudEhlaWdodElucHV0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ251bWJlcicpIHsgLy8gZXhpc3RzIGFuZCBub3QgJ2F1dG8nCgkJCXN1Z2dlc3RlZFZpZXdIZWlnaHQgPSBoZWlnaHRJbnB1dCAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBoZWlnaHRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBleGlzdHMgYW5kIGlzIGEgZnVuY3Rpb24KCQkJc3VnZ2VzdGVkVmlld0hlaWdodCA9IGhlaWdodElucHV0KCkgLSBxdWVyeUhlYWRlckhlaWdodCgpOwoJCX0KCQllbHNlIGlmIChoZWlnaHRJbnB1dCA9PT0gJ3BhcmVudCcpIHsgLy8gc2V0IHRvIGhlaWdodCBvZiBwYXJlbnQgZWxlbWVudAoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gZWxlbWVudC5wYXJlbnQoKS5oZWlnaHQoKSAtIHF1ZXJ5SGVhZGVySGVpZ2h0KCk7CgkJfQoJCWVsc2UgewoJCQlzdWdnZXN0ZWRWaWV3SGVpZ2h0ID0gTWF0aC5yb3VuZChjb250ZW50LndpZHRoKCkgLyBNYXRoLm1heCh0Lm9wdGlvbnMuYXNwZWN0UmF0aW8sIC41KSk7CgkJfQoJfQoKCglmdW5jdGlvbiBxdWVyeUhlYWRlckhlaWdodCgpIHsKCQlyZXR1cm4gaGVhZGVyLmVsID8gaGVhZGVyLmVsLm91dGVySGVpZ2h0KHRydWUpIDogMDsgLy8gaW5jbHVkZXMgbWFyZ2luCgl9CgkKCQoJZnVuY3Rpb24gd2luZG93UmVzaXplKGV2KSB7CgkJaWYgKAoJCQkhaWdub3JlV2luZG93UmVzaXplICYmCgkJCWV2LnRhcmdldCA9PT0gd2luZG93ICYmIC8vIHNvIHdlIGRvbid0IHByb2Nlc3MganF1aSAicmVzaXplIiBldmVudHMgdGhhdCBoYXZlIGJ1YmJsZWQgdXAKCQkJY3VycmVudFZpZXcuc3RhcnQgLy8gdmlldyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkCgkJKSB7CgkJCWlmICh1cGRhdGVTaXplKHRydWUpKSB7CgkJCQljdXJyZW50Vmlldy50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCBfZWxlbWVudCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBFdmVudCBGZXRjaGluZy9SZW5kZXJpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIFRPRE86IGdvaW5nIGZvcndhcmQsIG1vc3Qgb2YgdGhpcyBzdHVmZiBzaG91bGQgYmUgZGlyZWN0bHkgaGFuZGxlZCBieSB0aGUgdmlldwoKCglmdW5jdGlvbiByZWZldGNoRXZlbnRzKCkgeyAvLyBjYW4gYmUgY2FsbGVkIGFzIGFuIEFQSSBtZXRob2QKCQlmZXRjaEFuZFJlbmRlckV2ZW50cygpOwoJfQoKCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byBFdmVudE1hbmFnZXI/CglmdW5jdGlvbiByZWZldGNoRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJZmV0Y2hFdmVudFNvdXJjZXModC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpKTsKCX0KCgoJZnVuY3Rpb24gcmVuZGVyRXZlbnRzKCkgeyAvLyBkZXN0cm95cyBvbGQgZXZlbnRzIGlmIHByZXZpb3VzbHkgcmVuZGVyZWQKCQlpZiAoZWxlbWVudFZpc2libGUoKSkgewoJCQlmcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJCWN1cnJlbnRWaWV3LmRpc3BsYXlFdmVudHMoZXZlbnRzKTsKCQkJdW5mcmVlemVDb250ZW50SGVpZ2h0KCk7CgkJfQoJfQoJCgoJZnVuY3Rpb24gZ2V0QW5kUmVuZGVyRXZlbnRzKCkgewoJCWlmICghdC5vcHRpb25zLmxhenlGZXRjaGluZyB8fCBpc0ZldGNoTmVlZGVkKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpKSB7CgkJCWZldGNoQW5kUmVuZGVyRXZlbnRzKCk7CgkJfQoJCWVsc2UgewoJCQlyZW5kZXJFdmVudHMoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGZldGNoQW5kUmVuZGVyRXZlbnRzKCkgewoJCWZldGNoRXZlbnRzKGN1cnJlbnRWaWV3LnN0YXJ0LCBjdXJyZW50Vmlldy5lbmQpOwoJCQkvLyAuLi4gd2lsbCBjYWxsIHJlcG9ydEV2ZW50cwoJCQkvLyAuLi4gd2hpY2ggd2lsbCBjYWxsIHJlbmRlckV2ZW50cwoJfQoKCQoJLy8gY2FsbGVkIHdoZW4gZXZlbnQgZGF0YSBhcnJpdmVzCglmdW5jdGlvbiByZXBvcnRFdmVudHMoX2V2ZW50cykgewoJCWV2ZW50cyA9IF9ldmVudHM7CgkJcmVuZGVyRXZlbnRzKCk7Cgl9CgoKCS8vIGNhbGxlZCB3aGVuIGEgc2luZ2xlIGV2ZW50J3MgZGF0YSBoYXMgYmVlbiBjaGFuZ2VkCglmdW5jdGlvbiByZXBvcnRFdmVudENoYW5nZSgpIHsKCQlyZW5kZXJFdmVudHMoKTsKCX0KCgoKCS8qIEhlYWRlciBVcGRhdGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglmdW5jdGlvbiB1cGRhdGVIZWFkZXJUaXRsZSgpIHsKCQloZWFkZXIudXBkYXRlVGl0bGUoY3VycmVudFZpZXcudGl0bGUpOwoJfQoKCglmdW5jdGlvbiB1cGRhdGVUb2RheUJ1dHRvbigpIHsKCQl2YXIgbm93ID0gdC5nZXROb3coKTsKCgkJaWYgKG5vdyA+PSBjdXJyZW50Vmlldy5pbnRlcnZhbFN0YXJ0ICYmIG5vdyA8IGN1cnJlbnRWaWV3LmludGVydmFsRW5kKSB7CgkJCWhlYWRlci5kaXNhYmxlQnV0dG9uKCd0b2RheScpOwoJCX0KCQllbHNlIHsKCQkJaGVhZGVyLmVuYWJsZUJ1dHRvbigndG9kYXknKTsKCQl9Cgl9CgkKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCgkvLyB0aGlzIHB1YmxpYyBtZXRob2QgcmVjZWl2ZXMgc3RhcnQvZW5kIGRhdGVzIGluIGFueSBmb3JtYXQsIHdpdGggYW55IHRpbWV6b25lCglmdW5jdGlvbiBzZWxlY3Qoem9uZWRTdGFydElucHV0LCB6b25lZEVuZElucHV0KSB7CgkJY3VycmVudFZpZXcuc2VsZWN0KAoJCQl0LmJ1aWxkU2VsZWN0U3Bhbi5hcHBseSh0LCBhcmd1bWVudHMpCgkJKTsKCX0KCQoKCWZ1bmN0aW9uIHVuc2VsZWN0KCkgeyAvLyBzYWZlIHRvIGJlIGNhbGxlZCBiZWZvcmUgcmVuZGVyVmlldwoJCWlmIChjdXJyZW50VmlldykgewoJCQljdXJyZW50Vmlldy51bnNlbGVjdCgpOwoJCX0KCX0KCQoJCgkKCS8qIERhdGUKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCQoJCglmdW5jdGlvbiBwcmV2KCkgewoJCWRhdGUgPSBjdXJyZW50Vmlldy5jb21wdXRlUHJldkRhdGUoZGF0ZSk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIG5leHQoKSB7CgkJZGF0ZSA9IGN1cnJlbnRWaWV3LmNvbXB1dGVOZXh0RGF0ZShkYXRlKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gcHJldlllYXIoKSB7CgkJZGF0ZS5hZGQoLTEsICd5ZWFycycpOwoJCXJlbmRlclZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiBuZXh0WWVhcigpIHsKCQlkYXRlLmFkZCgxLCAneWVhcnMnKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gdG9kYXkoKSB7CgkJZGF0ZSA9IHQuZ2V0Tm93KCk7CgkJcmVuZGVyVmlldygpOwoJfQoJCgkKCWZ1bmN0aW9uIGdvdG9EYXRlKHpvbmVkRGF0ZUlucHV0KSB7CgkJZGF0ZSA9IHQubW9tZW50KHpvbmVkRGF0ZUlucHV0KS5zdHJpcFpvbmUoKTsKCQlyZW5kZXJWaWV3KCk7Cgl9CgkKCQoJZnVuY3Rpb24gaW5jcmVtZW50RGF0ZShkZWx0YSkgewoJCWRhdGUuYWRkKG1vbWVudC5kdXJhdGlvbihkZWx0YSkpOwoJCXJlbmRlclZpZXcoKTsKCX0KCgoJLy8gRm9yY2VzIG5hdmlnYXRpb24gdG8gYSB2aWV3IGZvciB0aGUgZ2l2ZW4gZGF0ZS4KCS8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSAid2VlayIgb3IgImRheSIuCglmdW5jdGlvbiB6b29tVG8obmV3RGF0ZSwgdmlld1R5cGUpIHsKCQl2YXIgc3BlYzsKCgkJdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbQoJCXNwZWMgPSB0LmdldFZpZXdTcGVjKHZpZXdUeXBlKSB8fCB0LmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7CgoJCWRhdGUgPSBuZXdEYXRlLmNsb25lKCk7CgkJcmVuZGVyVmlldyhzcGVjID8gc3BlYy50eXBlIDogbnVsbCk7Cgl9CgkKCQoJLy8gZm9yIGV4dGVybmFsIEFQSQoJZnVuY3Rpb24gZ2V0RGF0ZSgpIHsKCQlyZXR1cm4gdC5hcHBseVRpbWV6b25lKGRhdGUpOyAvLyBpbmZ1c2UgdGhlIGNhbGVuZGFyJ3MgdGltZXpvbmUKCX0KCgoKCS8qIEhlaWdodCAiRnJlZXppbmciCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byB0aGUgdmlldwoKCXQuZnJlZXplQ29udGVudEhlaWdodCA9IGZyZWV6ZUNvbnRlbnRIZWlnaHQ7Cgl0LnVuZnJlZXplQ29udGVudEhlaWdodCA9IHVuZnJlZXplQ29udGVudEhlaWdodDsKCgoJZnVuY3Rpb24gZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnMTAwJScsCgkJCWhlaWdodDogY29udGVudC5oZWlnaHQoKSwKCQkJb3ZlcmZsb3c6ICdoaWRkZW4nCgkJfSk7Cgl9CgoKCWZ1bmN0aW9uIHVuZnJlZXplQ29udGVudEhlaWdodCgpIHsKCQljb250ZW50LmNzcyh7CgkJCXdpZHRoOiAnJywKCQkJaGVpZ2h0OiAnJywKCQkJb3ZlcmZsb3c6ICcnCgkJfSk7Cgl9CgkKCQoJCgkvKiBNaXNjCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgkKCglmdW5jdGlvbiBnZXRDYWxlbmRhcigpIHsKCQlyZXR1cm4gdDsKCX0KCgkKCWZ1bmN0aW9uIGdldFZpZXcoKSB7CgkJcmV0dXJuIGN1cnJlbnRWaWV3OwoJfQoJCgkKCWZ1bmN0aW9uIG9wdGlvbihuYW1lLCB2YWx1ZSkgewoJCXZhciBuZXdPcHRpb25IYXNoOwoKCQlpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7CgkJCWlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IC8vIGdldHRlcgoJCQkJcmV0dXJuIHQub3B0aW9uc1tuYW1lXTsKCQkJfQoJCQllbHNlIHsgLy8gc2V0dGVyIGZvciBpbmRpdmlkdWFsIG9wdGlvbgoJCQkJbmV3T3B0aW9uSGFzaCA9IHt9OwoJCQkJbmV3T3B0aW9uSGFzaFtuYW1lXSA9IHZhbHVlOwoJCQkJc2V0T3B0aW9ucyhuZXdPcHRpb25IYXNoKTsKCQkJfQoJCX0KCQllbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHsgLy8gY29tcG91bmQgc2V0dGVyIHdpdGggb2JqZWN0IGlucHV0CgkJCXNldE9wdGlvbnMobmFtZSk7CgkJfQoJfQoKCglmdW5jdGlvbiBzZXRPcHRpb25zKG5ld09wdGlvbkhhc2gpIHsKCQl2YXIgb3B0aW9uQ250ID0gMDsKCQl2YXIgb3B0aW9uTmFtZTsKCgkJZm9yIChvcHRpb25OYW1lIGluIG5ld09wdGlvbkhhc2gpIHsKCQkJdC5keW5hbWljT3ZlcnJpZGVzW29wdGlvbk5hbWVdID0gbmV3T3B0aW9uSGFzaFtvcHRpb25OYW1lXTsKCQl9CgoJCXQudmlld1NwZWNDYWNoZSA9IHt9OyAvLyB0aGUgZHluYW1pYyBvdmVycmlkZSBpbnZhbGlkYXRlcyB0aGUgb3B0aW9ucyBpbiB0aGlzIGNhY2hlLCBzbyBqdXN0IGNsZWFyIGl0CgkJdC5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7IC8vIHRoaXMub3B0aW9ucyBuZWVkcyB0byBiZSByZWNvbXB1dGVkIGFmdGVyIHRoZSBkeW5hbWljIG92ZXJyaWRlCgoJCS8vIHRyaWdnZXIgaGFuZGxlcnMgYWZ0ZXIgdGhpcy5vcHRpb25zIGhhcyBiZWVuIHVwZGF0ZWQKCQlmb3IgKG9wdGlvbk5hbWUgaW4gbmV3T3B0aW9uSGFzaCkgewoJCQl0LnRyaWdnZXJPcHRpb25IYW5kbGVycyhvcHRpb25OYW1lKTsgLy8gcmVjYWxsIGJpbmRPcHRpb24vYmluZE9wdGlvbnMKCQkJb3B0aW9uQ250Kys7CgkJfQoKCQkvLyBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2Ygc2luZ2xlIG9wdGlvbiBjaGFuZ2UuCgkJLy8gaWYgb25seSBvbmUgb3B0aW9uIGNoYW5nZSwgYG9wdGlvbk5hbWVgIHdpbGwgYmUgaXRzIG5hbWUuCgkJaWYgKG9wdGlvbkNudCA9PT0gMSkgewoJCQlpZiAob3B0aW9uTmFtZSA9PT0gJ2hlaWdodCcgfHwgb3B0aW9uTmFtZSA9PT0gJ2NvbnRlbnRIZWlnaHQnIHx8IG9wdGlvbk5hbWUgPT09ICdhc3BlY3RSYXRpbycpIHsKCQkJCXVwZGF0ZVNpemUodHJ1ZSk7IC8vIHRydWUgPSBhbGxvdyByZWNhbGN1bGF0aW9uIG9mIGhlaWdodAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKG9wdGlvbk5hbWUgPT09ICdkZWZhdWx0RGF0ZScpIHsKCQkJCXJldHVybjsgLy8gY2FuJ3QgY2hhbmdlIGRhdGUgdGhpcyB3YXkuIHVzZSBnb3RvRGF0ZSBpbnN0ZWFkCgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJCQlpZiAoY3VycmVudFZpZXcpIHsKCQkJCQljdXJyZW50Vmlldy51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCQkJCQljdXJyZW50Vmlldy5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJCQl9CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSBpZiAob3B0aW9uTmFtZSA9PT0gJ3RpbWV6b25lJykgewoJCQkJdC5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpOwoJCQkJcmVmZXRjaEV2ZW50cygpOwoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQkvLyBjYXRjaC1hbGwuIHJlcmVuZGVyIHRoZSBoZWFkZXIgYW5kIHJlYnVpbGQvcmVyZW5kZXIgdGhlIGN1cnJlbnQgdmlldwoJCXJlbmRlckhlYWRlcigpOwoJCXZpZXdzQnlUeXBlID0ge307IC8vIGV2ZW4gbm9uLWN1cnJlbnQgdmlld3Mgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbiBjaGFuZ2UuIGRvIGJlZm9yZSByZXJlbmRlcgoJCXJlaW5pdFZpZXcoKTsKCX0KCQoJCglmdW5jdGlvbiB0cmlnZ2VyKG5hbWUsIHRoaXNPYmopIHsgLy8gb3ZlcnJpZGVzIHRoZSBFbWl0dGVyJ3MgdHJpZ2dlciBtZXRob2QgOigKCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CgoJCXRoaXNPYmogPSB0aGlzT2JqIHx8IF9lbGVtZW50OwoJCXRoaXMudHJpZ2dlcldpdGgobmFtZSwgdGhpc09iaiwgYXJncyk7IC8vIEVtaXR0ZXIncyBtZXRob2QKCgkJaWYgKHQub3B0aW9uc1tuYW1lXSkgewoJCQlyZXR1cm4gdC5vcHRpb25zW25hbWVdLmFwcGx5KHRoaXNPYmosIGFyZ3MpOwoJCX0KCX0KCgl0LmluaXRpYWxpemUoKTsKfQoKOzsKLyoKT3B0aW9ucyBiaW5kaW5nL3RyaWdnZXJpbmcgc3lzdGVtLgoqLwpDYWxlbmRhci5taXhpbih7CgoJLy8gQSBtYXAgb2Ygb3B0aW9uIG5hbWVzIHRvIGFycmF5cyBvZiBoYW5kbGVyIG9iamVjdHMuIEluaXRpYWxpemVkIHRvIHt9IGluIENhbGVuZGFyLgoJLy8gRm9ybWF0IGZvciBhIGhhbmRsZXIgb2JqZWN0OgoJLy8gewoJLy8gICBmdW5jIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uIGNoYW5nZQoJLy8gICBuYW1lcyAvLyBvcHRpb24gbmFtZXMgd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBnaXZlbiB0byBmdW5jCgkvLyB9CglvcHRpb25IYW5kbGVyczogbnVsbCwgCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIHRoZSBnaXZlbiBvcHRpb24gaGFzIGNoYW5nZWQuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIHRoZSBvcHRpb24gdmFsdWUuCgliaW5kT3B0aW9uOiBmdW5jdGlvbihvcHRpb25OYW1lLCBoYW5kbGVyRnVuYykgewoJCXRoaXMuYmluZE9wdGlvbnMoWyBvcHRpb25OYW1lIF0sIGhhbmRsZXJGdW5jKTsKCX0sCgoJLy8gQ2FsbHMgaGFuZGxlckZ1bmMgaW1tZWRpYXRlbHksIGFuZCB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gb3B0aW9ucyBjaGFuZ2UuCgkvLyBoYW5kbGVyRnVuYyB3aWxsIGJlIGdpdmVuIGVhY2ggb3B0aW9uIHZhbHVlIGFzIG9yZGVyZWQgZnVuY3Rpb24gYXJndW1lbnRzLgoJYmluZE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbk5hbWVzLCBoYW5kbGVyRnVuYykgewoJCXZhciBoYW5kbGVyT2JqID0geyBmdW5jOiBoYW5kbGVyRnVuYywgbmFtZXM6IG9wdGlvbk5hbWVzIH07CgkJdmFyIGk7CgoJCWZvciAoaSA9IDA7IGkgPCBvcHRpb25OYW1lcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnJlZ2lzdGVyT3B0aW9uSGFuZGxlck9iaihvcHRpb25OYW1lc1tpXSwgaGFuZGxlck9iaik7CgkJfQoKCQl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKGhhbmRsZXJPYmopOwoJfSwKCgkvLyBQdXRzIHRoZSBnaXZlbiBoYW5kbGVyIG9iamVjdCBpbnRvIHRoZSBpbnRlcm5hbCBoYXNoCglyZWdpc3Rlck9wdGlvbkhhbmRsZXJPYmo6IGZ1bmN0aW9uKG9wdGlvbk5hbWUsIGhhbmRsZXJPYmopIHsKCQkodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCAodGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSA9IFtdKSkKCQkJLnB1c2goaGFuZGxlck9iaik7Cgl9LAoKCS8vIFJlcG9ydHMgdGhhdCB0aGUgZ2l2ZW4gb3B0aW9uIGhhcyBjaGFuZ2VkLCBhbmQgY2FsbHMgYWxsIGFwcHJvcHJpYXRlIGhhbmRsZXJzLgoJdHJpZ2dlck9wdGlvbkhhbmRsZXJzOiBmdW5jdGlvbihvcHRpb25OYW1lKSB7CgkJdmFyIGhhbmRsZXJPYmpzID0gdGhpcy5vcHRpb25IYW5kbGVyc1tvcHRpb25OYW1lXSB8fCBbXTsKCQl2YXIgaTsKCgkJZm9yIChpID0gMDsgaSA8IGhhbmRsZXJPYmpzLmxlbmd0aDsgaSsrKSB7CgkJCXRoaXMudHJpZ2dlck9wdGlvbkhhbmRsZXJPYmooaGFuZGxlck9ianNbaV0pOwoJCX0KCX0sCgoJLy8gQ2FsbHMgdGhlIGNhbGxiYWNrIGZvciBhIHNwZWNpZmljIGhhbmRsZXIgb2JqZWN0LCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCgl0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajogZnVuY3Rpb24oaGFuZGxlck9iaikgewoJCXZhciBvcHRpb25OYW1lcyA9IGhhbmRsZXJPYmoubmFtZXM7CgkJdmFyIG9wdGlvblZhbHVlcyA9IFtdOwoJCXZhciBpOwoKCQlmb3IgKGkgPSAwOyBpIDwgb3B0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKCQkJb3B0aW9uVmFsdWVzLnB1c2godGhpcy5vcHRpb25zW29wdGlvbk5hbWVzW2ldXSk7CgkJfQoKCQloYW5kbGVyT2JqLmZ1bmMuYXBwbHkodGhpcywgb3B0aW9uVmFsdWVzKTsgLy8gbWFpbnRhaW4gdGhlIENhbGVuZGFyJ3MgYHRoaXNgIGNvbnRleHQKCX0KCn0pOwoKOzsKCkNhbGVuZGFyLmRlZmF1bHRzID0gewoKCXRpdGxlUmFuZ2VTZXBhcmF0b3I6ICcgXHUyMDEzICcsIC8vIGVuIGRhc2gKCW1vbnRoWWVhckZvcm1hdDogJ01NTU0gWVlZWScsIC8vIHJlcXVpcmVkIGZvciBlbi4gb3RoZXIgbG9jYWxlcyByZWx5IG9uIGRhdGVwaWNrZXIgY29tcHV0YWJsZSBvcHRpb24KCglkZWZhdWx0VGltZWRFdmVudER1cmF0aW9uOiAnMDI6MDA6MDAnLAoJZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IHsgZGF5czogMSB9LAoJZm9yY2VFdmVudER1cmF0aW9uOiBmYWxzZSwKCW5leHREYXlUaHJlc2hvbGQ6ICcwOTowMDowMCcsIC8vIDlhbQoKCS8vIGRpc3BsYXkKCWRlZmF1bHRWaWV3OiAnbW9udGgnLAoJYXNwZWN0UmF0aW86IDEuMzUsCgloZWFkZXI6IHsKCQlsZWZ0OiAndGl0bGUnLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0b2RheSBwcmV2LG5leHQnCgl9LAoJd2Vla2VuZHM6IHRydWUsCgl3ZWVrTnVtYmVyczogZmFsc2UsCgoJd2Vla051bWJlclRpdGxlOiAnVycsCgl3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdsb2NhbCcsCgkKCS8vZWRpdGFibGU6IGZhbHNlLAoKCS8vbm93SW5kaWNhdG9yOiBmYWxzZSwKCglzY3JvbGxUaW1lOiAnMDY6MDA6MDAnLAoJCgkvLyBldmVudCBhamF4CglsYXp5RmV0Y2hpbmc6IHRydWUsCglzdGFydFBhcmFtOiAnc3RhcnQnLAoJZW5kUGFyYW06ICdlbmQnLAoJdGltZXpvbmVQYXJhbTogJ3RpbWV6b25lJywKCgl0aW1lem9uZTogZmFsc2UsCgoJLy9hbGxEYXlEZWZhdWx0OiB1bmRlZmluZWQsCgoJLy8gbG9jYWxlCglpc1JUTDogZmFsc2UsCglidXR0b25UZXh0OiB7CgkJcHJldjogInByZXYiLAoJCW5leHQ6ICJuZXh0IiwKCQlwcmV2WWVhcjogInByZXYgeWVhciIsCgkJbmV4dFllYXI6ICJuZXh0IHllYXIiLAoJCXllYXI6ICd5ZWFyJywgLy8gVE9ETzogbG9jYWxlIGZpbGVzIG5lZWQgdG8gc3BlY2lmeSB0aGlzCgkJdG9kYXk6ICd0b2RheScsCgkJbW9udGg6ICdtb250aCcsCgkJd2VlazogJ3dlZWsnLAoJCWRheTogJ2RheScKCX0sCgoJYnV0dG9uSWNvbnM6IHsKCQlwcmV2OiAnbGVmdC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCXByZXZZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAncmlnaHQtZG91YmxlLWFycm93JwoJfSwKCglhbGxEYXlUZXh0OiAnYWxsLWRheScsCgkKCS8vIGpxdWVyeS11aSB0aGVtaW5nCgl0aGVtZTogZmFsc2UsCgl0aGVtZUJ1dHRvbkljb25zOiB7CgkJcHJldjogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0OiAnY2lyY2xlLXRyaWFuZ2xlLWUnLAoJCXByZXZZZWFyOiAnc2Vlay1wcmV2JywKCQluZXh0WWVhcjogJ3NlZWstbmV4dCcKCX0sCgoJLy9ldmVudFJlc2l6YWJsZUZyb21TdGFydDogZmFsc2UsCglkcmFnT3BhY2l0eTogLjc1LAoJZHJhZ1JldmVydER1cmF0aW9uOiA1MDAsCglkcmFnU2Nyb2xsOiB0cnVlLAoJCgkvL3NlbGVjdGFibGU6IGZhbHNlLAoJdW5zZWxlY3RBdXRvOiB0cnVlLAoJCglkcm9wQWNjZXB0OiAnKicsCgoJZXZlbnRPcmRlcjogJ3RpdGxlJywKCglldmVudExpbWl0OiBmYWxzZSwKCWV2ZW50TGltaXRUZXh0OiAnbW9yZScsCglldmVudExpbWl0Q2xpY2s6ICdwb3BvdmVyJywKCWRheVBvcG92ZXJGb3JtYXQ6ICdMTCcsCgkKCWhhbmRsZVdpbmRvd1Jlc2l6ZTogdHJ1ZSwKCXdpbmRvd1Jlc2l6ZURlbGF5OiAxMDAsIC8vIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdXBkYXRlU2l6ZSBoYXBwZW5zCgoJbG9uZ1ByZXNzRGVsYXk6IDEwMDAKCQp9OwoKCkNhbGVuZGFyLmVuZ2xpc2hEZWZhdWx0cyA9IHsgLy8gdXNlZCBieSBsb2NhbGUuanMKCWRheVBvcG92ZXJGb3JtYXQ6ICdkZGRkLCBNTU1NIEQnCn07CgoKQ2FsZW5kYXIucnRsRGVmYXVsdHMgPSB7IC8vIHJpZ2h0LXRvLWxlZnQgZGVmYXVsdHMKCWhlYWRlcjogeyAvLyBUT0RPOiBzbWFydGVyIHNvbHV0aW9uIChmaXJzdC9jZW50ZXIvbGFzdCA/KQoJCWxlZnQ6ICduZXh0LHByZXYgdG9kYXknLAoJCWNlbnRlcjogJycsCgkJcmlnaHQ6ICd0aXRsZScKCX0sCglidXR0b25JY29uczogewoJCXByZXY6ICdyaWdodC1zaW5nbGUtYXJyb3cnLAoJCW5leHQ6ICdsZWZ0LXNpbmdsZS1hcnJvdycsCgkJcHJldlllYXI6ICdyaWdodC1kb3VibGUtYXJyb3cnLAoJCW5leHRZZWFyOiAnbGVmdC1kb3VibGUtYXJyb3cnCgl9LAoJdGhlbWVCdXR0b25JY29uczogewoJCXByZXY6ICdjaXJjbGUtdHJpYW5nbGUtZScsCgkJbmV4dDogJ2NpcmNsZS10cmlhbmdsZS13JywKCQluZXh0WWVhcjogJ3NlZWstcHJldicsCgkJcHJldlllYXI6ICdzZWVrLW5leHQnCgl9Cn07Cgo7OwoKdmFyIGxvY2FsZU9wdGlvbkhhc2ggPSBGQy5sb2NhbGVzID0ge307IC8vIGluaXRpYWxpemUgYW5kIGV4cG9zZQoKCi8vIFRPRE86IGRvY3VtZW50IHRoZSBzdHJ1Y3R1cmUgYW5kIG9yZGVyaW5nIG9mIGEgRnVsbENhbGVuZGFyIGxvY2FsZSBmaWxlCgoKLy8gSW5pdGlhbGl6ZSBqUXVlcnkgVUkgZGF0ZXBpY2tlciB0cmFuc2xhdGlvbnMgd2hpbGUgdXNpbmcgc29tZSBvZiB0aGUgdHJhbnNsYXRpb25zCi8vIFdpbGwgc2V0IHRoaXMgYXMgdGhlIGRlZmF1bHQgbG9jYWxlcyBmb3IgZGF0ZXBpY2tlci4KRkMuZGF0ZXBpY2tlckxvY2FsZSA9IGZ1bmN0aW9uKGxvY2FsZUNvZGUsIGRwTG9jYWxlQ29kZSwgZHBPcHRpb25zKSB7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5Cgl2YXIgZmNPcHRpb25zID0gbG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSB8fCAobG9jYWxlT3B0aW9uSGFzaFtsb2NhbGVDb2RlXSA9IHt9KTsKCgkvLyB0cmFuc2ZlciBzb21lIHNpbXBsZSBvcHRpb25zIGZyb20gZGF0ZXBpY2tlciB0byBmYwoJZmNPcHRpb25zLmlzUlRMID0gZHBPcHRpb25zLmlzUlRMOwoJZmNPcHRpb25zLndlZWtOdW1iZXJUaXRsZSA9IGRwT3B0aW9ucy53ZWVrSGVhZGVyOwoKCS8vIGNvbXB1dGUgc29tZSBtb3JlIGNvbXBsZXggb3B0aW9ucyBmcm9tIGRhdGVwaWNrZXIKCSQuZWFjaChkcENvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJZmNPcHRpb25zW25hbWVdID0gZnVuYyhkcE9wdGlvbnMpOwoJfSk7CgoJLy8gaXMgalF1ZXJ5IFVJIERhdGVwaWNrZXIgaXMgb24gdGhlIHBhZ2U/CglpZiAoJC5kYXRlcGlja2VyKSB7CgoJCS8vIFJlZ2lzdGVyIHRoZSBsb2NhbGUgZGF0YS4KCQkvLyBGdWxsQ2FsZW5kYXIgYW5kIE1vbWVudEpTIHVzZSBsb2NhbGUgY29kZXMgbGlrZSAicHQtYnIiIGJ1dCBEYXRlcGlja2VyCgkJLy8gZG9lcyBpdCBsaWtlICJwdC1CUiIgb3IgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBsb2NhbGUsIG1heWJlIGp1c3QgInB0Ii4KCQkvLyBNYWtlIGFuIGFsaWFzIHNvIHRoZSBsb2NhbGUgY2FuIGJlIHJlZmVyZW5jZWQgZWl0aGVyIHdheS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWxbZHBMb2NhbGVDb2RlXSA9CgkJCSQuZGF0ZXBpY2tlci5yZWdpb25hbFtsb2NhbGVDb2RlXSA9IC8vIGFsaWFzCgkJCQlkcE9wdGlvbnM7CgoJCS8vIEFsaWFzICdlbicgdG8gdGhlIGRlZmF1bHQgbG9jYWxlIGRhdGEuIERvIHRoaXMgZXZlcnkgdGltZS4KCQkkLmRhdGVwaWNrZXIucmVnaW9uYWwuZW4gPSAkLmRhdGVwaWNrZXIucmVnaW9uYWxbJyddOwoKCQkvLyBTZXQgYXMgRGF0ZXBpY2tlcidzIGdsb2JhbCBkZWZhdWx0cy4KCQkkLmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoZHBPcHRpb25zKTsKCX0KfTsKCgovLyBTZXRzIEZ1bGxDYWxlbmRhci1zcGVjaWZpYyB0cmFuc2xhdGlvbnMuIFdpbGwgc2V0IHRoZSBsb2NhbGVzIGFzIHRoZSBnbG9iYWwgZGVmYXVsdC4KRkMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlQ29kZSwgbmV3RmNPcHRpb25zKSB7Cgl2YXIgZmNPcHRpb25zOwoJdmFyIG1vbU9wdGlvbnM7CgoJLy8gZ2V0IHRoZSBGdWxsQ2FsZW5kYXIgaW50ZXJuYWwgb3B0aW9uIGhhc2ggZm9yIHRoaXMgbG9jYWxlLiBjcmVhdGUgaWYgbmVjZXNzYXJ5CglmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdIHx8IChsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0ge30pOwoKCS8vIHByb3ZpZGVkIG5ldyBvcHRpb25zIGZvciB0aGlzIGxvY2FsZXM/IG1lcmdlIHRoZW0gaW4KCWlmIChuZXdGY09wdGlvbnMpIHsKCQlmY09wdGlvbnMgPSBsb2NhbGVPcHRpb25IYXNoW2xvY2FsZUNvZGVdID0gbWVyZ2VPcHRpb25zKFsgZmNPcHRpb25zLCBuZXdGY09wdGlvbnMgXSk7Cgl9CgoJLy8gY29tcHV0ZSBsb2NhbGUgb3B0aW9ucyB0aGF0IHdlcmVuJ3QgZGVmaW5lZC4KCS8vIGFsd2F5cyBkbyB0aGlzLiBuZXdGY09wdGlvbnMgY2FuIGJlIHVuZGVmaW5lZCB3aGVuIGluaXRpYWxpemluZyBmcm9tIGkxOG4gZmlsZSwKCS8vIHNvIG5vIHdheSB0byB0ZWxsIGlmIHRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gb3IgYSBkZWZhdWx0LXNldHRpbmcuCgltb21PcHRpb25zID0gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKTsgLy8gd2lsbCBmYWxsIGJhY2sgdG8gZW4KCSQuZWFjaChtb21Db21wdXRhYmxlT3B0aW9ucywgZnVuY3Rpb24obmFtZSwgZnVuYykgewoJCWlmIChmY09wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlmY09wdGlvbnNbbmFtZV0gPSBmdW5jKG1vbU9wdGlvbnMsIGZjT3B0aW9ucyk7CgkJfQoJfSk7CgoJLy8gc2V0IGl0IGFzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgRnVsbENhbGVuZGFyCglDYWxlbmRhci5kZWZhdWx0cy5sb2NhbGUgPSBsb2NhbGVDb2RlOwp9OwoKCi8vIE5PVEU6IGNhbid0IGd1YXJhbnRlZSBhbnkgb2YgdGhlc2UgY29tcHV0YXRpb25zIHdpbGwgcnVuIGJlY2F1c2Ugbm90IGV2ZXJ5IGxvY2FsZSBoYXMgZGF0ZXBpY2tlcgovLyBjb25maWdzLCBzbyBtYWtlIHN1cmUgdGhlcmUgYXJlIEVuZ2xpc2ggZmFsbGJhY2tzIGZvciB0aGVzZSBpbiB0aGUgZGVmYXVsdHMgZmlsZS4KdmFyIGRwQ29tcHV0YWJsZU9wdGlvbnMgPSB7CgoJYnV0dG9uVGV4dDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIHsKCQkJLy8gdGhlIHRyYW5zbGF0aW9ucyBzb21ldGltZXMgd3JvbmdseSBjb250YWluIEhUTUwgZW50aXRpZXMKCQkJcHJldjogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLnByZXZUZXh0KSwKCQkJbmV4dDogc3RyaXBIdG1sRW50aXRpZXMoZHBPcHRpb25zLm5leHRUZXh0KSwKCQkJdG9kYXk6IHN0cmlwSHRtbEVudGl0aWVzKGRwT3B0aW9ucy5jdXJyZW50VGV4dCkKCQl9OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJNTU1NIFlZWVkiIC0+ICJTZXB0ZW1iZXIgMjAxNCIKCW1vbnRoWWVhckZvcm1hdDogZnVuY3Rpb24oZHBPcHRpb25zKSB7CgkJcmV0dXJuIGRwT3B0aW9ucy5zaG93TW9udGhBZnRlclllYXIgPwoJCQknWVlZWVsnICsgZHBPcHRpb25zLnllYXJTdWZmaXggKyAnXSBNTU1NJyA6CgkJCSdNTU1NIFlZWVlbJyArIGRwT3B0aW9ucy55ZWFyU3VmZml4ICsgJ10nOwoJfQoKfTsKCnZhciBtb21Db21wdXRhYmxlT3B0aW9ucyA9IHsKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJkZGQgTS9EIiAtPiAiRnJpIDkvMTUiCglkYXlPZk1vbnRoRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zLCBmY09wdGlvbnMpIHsKCQl2YXIgZm9ybWF0ID0gbW9tT3B0aW9ucy5sb25nRGF0ZUZvcm1hdCgnbCcpOyAvLyBmb3IgdGhlIGZvcm1hdCBsaWtlICJNL0QvWVlZWSIKCgkJLy8gc3RyaXAgdGhlIHllYXIgb2ZmIHRoZSBlZGdlLCBhcyB3ZWxsIGFzIG90aGVyIG1pc2Mgbm9uLXdoaXRlc3BhY2UgY2hhcnMKCQlmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXlkrW15cd1xzXSp8W15cd1xzXSpZKyQvZywgJycpOwoKCQlpZiAoZmNPcHRpb25zLmlzUlRMKSB7CgkJCWZvcm1hdCArPSAnIGRkZCc7IC8vIGZvciBSVEwsIGFkZCBkYXktb2Ytd2VlayB0byBlbmQKCQl9CgkJZWxzZSB7CgkJCWZvcm1hdCA9ICdkZGQgJyArIGZvcm1hdDsgLy8gZm9yIExUUiwgYWRkIGRheS1vZi13ZWVrIHRvIGJlZ2lubmluZwoJCX0KCQlyZXR1cm4gZm9ybWF0OwoJfSwKCgkvLyBQcm9kdWNlcyBmb3JtYXQgc3RyaW5ncyBsaWtlICJoOm1tYSIgLT4gIjY6MDBwbSIKCW1lZGl1bVRpbWVGb3JtYXQ6IGZ1bmN0aW9uKG1vbU9wdGlvbnMpIHsgLy8gY2FuJ3QgYmUgY2FsbGVkIGB0aW1lRm9ybWF0YCBiZWNhdXNlIGNvbGxpZGVzIHdpdGggb3B0aW9uCgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKWEiIC0+ICI2cG0iIC8gIjY6MzBwbSIKCXNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImgoOm1tKXQiIC0+ICI2cCIgLyAiNjozMHAiCglleHRyYVNtYWxsVGltZUZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnKDptbSknKQoJCQkucmVwbGFjZSgvKFxXbW0pJC8sICcoJDEpJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICd0Jyk7IC8vIGNvbnZlcnQgdG8gQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlIG9uZS1sZXR0ZXIuIHJlbW92ZSBhbnkgc3BhY2VzIGJlZm9yZWhhbmQKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgbGlrZSAiaGEiIC8gIkgiIC0+ICI2cG0iIC8gIjE4IgoJaG91ckZvcm1hdDogZnVuY3Rpb24obW9tT3B0aW9ucykgewoJCXJldHVybiBtb21PcHRpb25zLmxvbmdEYXRlRm9ybWF0KCdMVCcpCgkJCS5yZXBsYWNlKCc6bW0nLCAnJykKCQkJLnJlcGxhY2UoLyhcV21tKSQvLCAnJykgLy8gbGlrZSBhYm92ZSwgYnV0IGZvciBmb3JlaWduIGxvY2FsZXMKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICdhJyk7IC8vIGNvbnZlcnQgQU0vUE0vYW0vcG0gdG8gbG93ZXJjYXNlLiByZW1vdmUgYW55IHNwYWNlcyBiZWZvcmVoYW5kCgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGxpa2UgImg6bW0iIC0+ICI2OjMwIiAod2l0aCBubyBBTS9QTSkKCW5vTWVyaWRpZW1UaW1lRm9ybWF0OiBmdW5jdGlvbihtb21PcHRpb25zKSB7CgkJcmV0dXJuIG1vbU9wdGlvbnMubG9uZ0RhdGVGb3JtYXQoJ0xUJykKCQkJLnJlcGxhY2UoL1xzKmEkL2ksICcnKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIEFNL1BNCgl9Cgp9OwoKCi8vIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgY29tcHV0ZWQgb2ZmIGxpdmUgY2FsZW5kYXIgb3B0aW9ucyAoY29uc2lkZXJzIG92ZXJyaWRlIG9wdGlvbnMpCi8vIFRPRE86IGJlc3QgcGxhY2UgZm9yIHRoaXM/IHJlbGF0ZWQgdG8gbG9jYWxlPwovLyBUT0RPOiBmbGlwcGluZyB0ZXh0IGJhc2VkIG9uIGlzUlRMIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgQ1NTIGBkaXJlY3Rpb25gIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIGl0CnZhciBpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zID0gewoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIk1vIDE2IgoJc21hbGxEYXlEYXRlRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknRCBkZCcgOgoJCQknZGQgRCc7Cgl9LAoKCS8vIFByb2R1Y2VzIGZvcm1hdCBzdHJpbmdzIGZvciByZXN1bHRzIGxpa2UgIldrIDUiCgl3ZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1sgJyArIG9wdGlvbnMud2Vla051bWJlclRpdGxlICsgJ10nIDoKCQkJJ1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnIF13JzsKCX0sCgoJLy8gUHJvZHVjZXMgZm9ybWF0IHN0cmluZ3MgZm9yIHJlc3VsdHMgbGlrZSAiV2s1IgoJc21hbGxXZWVrRm9ybWF0OiBmdW5jdGlvbihvcHRpb25zKSB7CgkJcmV0dXJuIG9wdGlvbnMuaXNSVEwgPwoJCQknd1snICsgb3B0aW9ucy53ZWVrTnVtYmVyVGl0bGUgKyAnXScgOgoJCQknWycgKyBvcHRpb25zLndlZWtOdW1iZXJUaXRsZSArICdddyc7Cgl9Cgp9OwoKZnVuY3Rpb24gcG9wdWxhdGVJbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zKG9wdGlvbnMpIHsKCSQuZWFjaChpbnN0YW5jZUNvbXB1dGFibGVPcHRpb25zLCBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CgkJaWYgKG9wdGlvbnNbbmFtZV0gPT0gbnVsbCkgewoJCQlvcHRpb25zW25hbWVdID0gZnVuYyhvcHRpb25zKTsKCQl9Cgl9KTsKfQoKCi8vIFJldHVybnMgbW9tZW50J3MgaW50ZXJuYWwgbG9jYWxlIGRhdGEuIElmIGRvZXNuJ3QgZXhpc3QsIHJldHVybnMgRW5nbGlzaC4KZnVuY3Rpb24gZ2V0TW9tZW50TG9jYWxlRGF0YShsb2NhbGVDb2RlKSB7CglyZXR1cm4gbW9tZW50LmxvY2FsZURhdGEobG9jYWxlQ29kZSkgfHwgbW9tZW50LmxvY2FsZURhdGEoJ2VuJyk7Cn0KCgovLyBJbml0aWFsaXplIEVuZ2xpc2ggYnkgZm9yY2luZyBjb21wdXRhdGlvbiBvZiBtb21lbnQtZGVyaXZlZCBvcHRpb25zLgovLyBBbHNvLCBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0LgpGQy5sb2NhbGUoJ2VuJywgQ2FsZW5kYXIuZW5nbGlzaERlZmF1bHRzKTsKCjs7CgovKiBUb3AgdG9vbGJhciBhcmVhIHdpdGggYnV0dG9ucyBhbmQgdGl0bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8vIFRPRE86IHJlbmFtZSBhbGwgaGVhZGVyLXJlbGF0ZWQgdGhpbmdzIHRvICJ0b29sYmFyIgoKZnVuY3Rpb24gSGVhZGVyKGNhbGVuZGFyKSB7Cgl2YXIgdCA9IHRoaXM7CgkKCS8vIGV4cG9ydHMKCXQucmVuZGVyID0gcmVuZGVyOwoJdC5yZW1vdmVFbGVtZW50ID0gcmVtb3ZlRWxlbWVudDsKCXQudXBkYXRlVGl0bGUgPSB1cGRhdGVUaXRsZTsKCXQuYWN0aXZhdGVCdXR0b24gPSBhY3RpdmF0ZUJ1dHRvbjsKCXQuZGVhY3RpdmF0ZUJ1dHRvbiA9IGRlYWN0aXZhdGVCdXR0b247Cgl0LmRpc2FibGVCdXR0b24gPSBkaXNhYmxlQnV0dG9uOwoJdC5lbmFibGVCdXR0b24gPSBlbmFibGVCdXR0b247Cgl0LmdldFZpZXdzV2l0aEJ1dHRvbnMgPSBnZXRWaWV3c1dpdGhCdXR0b25zOwoJdC5lbCA9IG51bGw7IC8vIG1pcnJvcnMgbG9jYWwgYGVsYAoJCgkvLyBsb2NhbHMKCXZhciBlbDsKCXZhciB2aWV3c1dpdGhCdXR0b25zID0gW107Cgl2YXIgdG07CgoKCS8vIGNhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSBhbmQgd2lsbCByZXJlbmRlcgoJZnVuY3Rpb24gcmVuZGVyKCkgewoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgc2VjdGlvbnMgPSBvcHRpb25zLmhlYWRlcjsKCgkJdG0gPSBvcHRpb25zLnRoZW1lID8gJ3VpJyA6ICdmYyc7CgoJCWlmIChzZWN0aW9ucykgewoJCQlpZiAoIWVsKSB7CgkJCQllbCA9IHRoaXMuZWwgPSAkKCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+Iik7CgkJCX0KCQkJZWxzZSB7CgkJCQllbC5lbXB0eSgpOwoJCQl9CgkJCWVsLmFwcGVuZChyZW5kZXJTZWN0aW9uKCdsZWZ0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ3JpZ2h0JykpCgkJCQkuYXBwZW5kKHJlbmRlclNlY3Rpb24oJ2NlbnRlcicpKQoJCQkJLmFwcGVuZCgnPGRpdiBjbGFzcz0iZmMtY2xlYXIiLz4nKTsKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZUVsZW1lbnQoKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHsKCQlpZiAoZWwpIHsKCQkJZWwucmVtb3ZlKCk7CgkJCWVsID0gdC5lbCA9IG51bGw7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIHJlbmRlclNlY3Rpb24ocG9zaXRpb24pIHsKCQl2YXIgc2VjdGlvbkVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIHBvc2l0aW9uICsgJyIvPicpOwoJCXZhciBvcHRpb25zID0gY2FsZW5kYXIub3B0aW9uczsKCQl2YXIgYnV0dG9uU3RyID0gb3B0aW9ucy5oZWFkZXJbcG9zaXRpb25dOwoKCQlpZiAoYnV0dG9uU3RyKSB7CgkJCSQuZWFjaChidXR0b25TdHIuc3BsaXQoJyAnKSwgZnVuY3Rpb24oaSkgewoJCQkJdmFyIGdyb3VwQ2hpbGRyZW4gPSAkKCk7CgkJCQl2YXIgaXNPbmx5QnV0dG9ucyA9IHRydWU7CgkJCQl2YXIgZ3JvdXBFbDsKCgkJCQkkLmVhY2godGhpcy5zcGxpdCgnLCcpLCBmdW5jdGlvbihqLCBidXR0b25OYW1lKSB7CgkJCQkJdmFyIGN1c3RvbUJ1dHRvblByb3BzOwoJCQkJCXZhciB2aWV3U3BlYzsKCQkJCQl2YXIgYnV0dG9uQ2xpY2s7CgkJCQkJdmFyIG92ZXJyaWRlVGV4dDsgLy8gdGV4dCBleHBsaWNpdGx5IHNldCBieSBjYWxlbmRhcidzIGNvbnN0cnVjdG9yIG9wdGlvbnMuIG92ZXJjb21lcyBpY29ucwoJCQkJCXZhciBkZWZhdWx0VGV4dDsKCQkJCQl2YXIgdGhlbWVJY29uOwoJCQkJCXZhciBub3JtYWxJY29uOwoJCQkJCXZhciBpbm5lckh0bWw7CgkJCQkJdmFyIGNsYXNzZXM7CgkJCQkJdmFyIGJ1dHRvbjsgLy8gdGhlIGVsZW1lbnQKCgkJCQkJaWYgKGJ1dHRvbk5hbWUgPT0gJ3RpdGxlJykgewoJCQkJCQlncm91cENoaWxkcmVuID0gZ3JvdXBDaGlsZHJlbi5hZGQoJCgnPGgyPiZuYnNwOzwvaDI+JykpOyAvLyB3ZSBhbHdheXMgd2FudCBpdCB0byB0YWtlIHVwIGhlaWdodAoJCQkJCQlpc09ubHlCdXR0b25zID0gZmFsc2U7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlpZiAoKGN1c3RvbUJ1dHRvblByb3BzID0gKG9wdGlvbnMuY3VzdG9tQnV0dG9ucyB8fCB7fSlbYnV0dG9uTmFtZV0pKSB7CgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJaWYgKGN1c3RvbUJ1dHRvblByb3BzLmNsaWNrKSB7CgkJCQkJCQkJCWN1c3RvbUJ1dHRvblByb3BzLmNsaWNrLmNhbGwoYnV0dG9uWzBdLCBldik7CgkJCQkJCQkJfQoJCQkJCQkJfTsKCQkJCQkJCW92ZXJyaWRlVGV4dCA9ICcnOyAvLyBpY29ucyB3aWxsIG92ZXJyaWRlIHRleHQKCQkJCQkJCWRlZmF1bHRUZXh0ID0gY3VzdG9tQnV0dG9uUHJvcHMudGV4dDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmICgodmlld1NwZWMgPSBjYWxlbmRhci5nZXRWaWV3U3BlYyhidXR0b25OYW1lKSkpIHsKCQkJCQkJCWJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7CgkJCQkJCQkJY2FsZW5kYXIuY2hhbmdlVmlldyhidXR0b25OYW1lKTsKCQkJCQkJCX07CgkJCQkJCQl2aWV3c1dpdGhCdXR0b25zLnB1c2goYnV0dG9uTmFtZSk7CgkJCQkJCQlvdmVycmlkZVRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0T3ZlcnJpZGU7CgkJCQkJCQlkZWZhdWx0VGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHREZWZhdWx0OwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYgKGNhbGVuZGFyW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXIgbWV0aG9kCgkJCQkJCQlidXR0b25DbGljayA9IGZ1bmN0aW9uKCkgewoJCQkJCQkJCWNhbGVuZGFyW2J1dHRvbk5hbWVdKCk7CgkJCQkJCQl9OwoJCQkJCQkJb3ZlcnJpZGVUZXh0ID0gKGNhbGVuZGFyLm92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9KVtidXR0b25OYW1lXTsKCQkJCQkJCWRlZmF1bHRUZXh0ID0gb3B0aW9ucy5idXR0b25UZXh0W2J1dHRvbk5hbWVdOyAvLyBldmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCBkZWZhdWx0CgkJCQkJCX0KCgkJCQkJCWlmIChidXR0b25DbGljaykgewoKCQkJCQkJCXRoZW1lSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy50aGVtZUljb24gOgoJCQkJCQkJCQlvcHRpb25zLnRoZW1lQnV0dG9uSWNvbnNbYnV0dG9uTmFtZV07CgoJCQkJCQkJbm9ybWFsSWNvbiA9CgkJCQkJCQkJY3VzdG9tQnV0dG9uUHJvcHMgPwoJCQkJCQkJCQljdXN0b21CdXR0b25Qcm9wcy5pY29uIDoKCQkJCQkJCQkJb3B0aW9ucy5idXR0b25JY29uc1tidXR0b25OYW1lXTsKCgkJCQkJCQlpZiAob3ZlcnJpZGVUZXh0KSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gaHRtbEVzY2FwZShvdmVycmlkZVRleHQpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZSBpZiAodGhlbWVJY29uICYmIG9wdGlvbnMudGhlbWUpIHsKCQkJCQkJCQlpbm5lckh0bWwgPSAiPHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi0iICsgdGhlbWVJY29uICsgIic+PC9zcGFuPiI7CgkJCQkJCQl9CgkJCQkJCQllbHNlIGlmIChub3JtYWxJY29uICYmICFvcHRpb25zLnRoZW1lKSB7CgkJCQkJCQkJaW5uZXJIdG1sID0gIjxzcGFuIGNsYXNzPSdmYy1pY29uIGZjLWljb24tIiArIG5vcm1hbEljb24gKyAiJz48L3NwYW4+IjsKCQkJCQkJCX0KCQkJCQkJCWVsc2UgewoJCQkJCQkJCWlubmVySHRtbCA9IGh0bWxFc2NhcGUoZGVmYXVsdFRleHQpOwoJCQkJCQkJfQoKCQkJCQkJCWNsYXNzZXMgPSBbCgkJCQkJCQkJJ2ZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1idXR0b24nLAoJCQkJCQkJCXRtICsgJy1zdGF0ZS1kZWZhdWx0JwoJCQkJCQkJXTsKCgkJCQkJCQlidXR0b24gPSAkKCAvLyB0eXBlPSJidXR0b24iIHNvIHRoYXQgaXQgZG9lc24ndCBzdWJtaXQgYSBmb3JtCgkJCQkJCQkJJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJyArIGNsYXNzZXMuam9pbignICcpICsgJyI+JyArCgkJCQkJCQkJCWlubmVySHRtbCArCgkJCQkJCQkJJzwvYnV0dG9uPicKCQkJCQkJCQkpCgkJCQkJCQkJLmNsaWNrKGZ1bmN0aW9uKGV2KSB7CgkJCQkJCQkJCS8vIGRvbid0IHByb2Nlc3MgY2xpY2tzIGZvciBkaXNhYmxlZCBidXR0b25zCgkJCQkJCQkJCWlmICghYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpKSB7CgoJCQkJCQkJCQkJYnV0dG9uQ2xpY2soZXYpOwoKCQkJCQkJCQkJCS8vIGFmdGVyIHRoZSBjbGljayBhY3Rpb24sIGlmIHRoZSBidXR0b24gYmVjb21lcyB0aGUgImFjdGl2ZSIgdGFiLCBvciBkaXNhYmxlZCwKCQkJCQkJCQkJCS8vIGl0IHNob3VsZCBuZXZlciBoYXZlIGEgaG92ZXIgY2xhc3MsIHNvIHJlbW92ZSBpdCBub3cuCgkJCQkJCQkJCQlpZiAoCgkJCQkJCQkJCQkJYnV0dG9uLmhhc0NsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKSB8fAoJCQkJCQkJCQkJCWJ1dHRvbi5oYXNDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJKSB7CgkJCQkJCQkJCQkJYnV0dG9uLnJlbW92ZUNsYXNzKHRtICsgJy1zdGF0ZS1ob3ZlcicpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2Vkb3duKGZ1bmN0aW9uKCkgewoJCQkJCQkJCQkvLyB0aGUgKmRvd24qIGVmZmVjdCAobW91c2UgcHJlc3NlZCBpbikuCgkJCQkJCQkJCS8vIG9ubHkgb24gYnV0dG9ucyB0aGF0IGFyZSBub3QgdGhlICJhY3RpdmUiIHRhYiwgb3IgZGlzYWJsZWQKCQkJCQkJCQkJYnV0dG9uCgkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJLm5vdCgnLicgKyB0bSArICctc3RhdGUtZGlzYWJsZWQnKQoJCQkJCQkJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kb3duJyk7CgkJCQkJCQkJfSkKCQkJCQkJCQkubW91c2V1cChmdW5jdGlvbigpIHsKCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmRvd24qIGVmZmVjdAoJCQkJCQkJCQlidXR0b24ucmVtb3ZlQ2xhc3ModG0gKyAnLXN0YXRlLWRvd24nKTsKCQkJCQkJCQl9KQoJCQkJCQkJCS5ob3ZlcigKCQkJCQkJCQkJZnVuY3Rpb24oKSB7CgkJCQkJCQkJCQkvLyB0aGUgKmhvdmVyKiBlZmZlY3QuCgkJCQkJCQkJCQkvLyBvbmx5IG9uIGJ1dHRvbnMgdGhhdCBhcmUgbm90IHRoZSAiYWN0aXZlIiB0YWIsIG9yIGRpc2FibGVkCgkJCQkJCQkJCQlidXR0b24KCQkJCQkJCQkJCQkubm90KCcuJyArIHRtICsgJy1zdGF0ZS1hY3RpdmUnKQoJCQkJCQkJCQkJCS5ub3QoJy4nICsgdG0gKyAnLXN0YXRlLWRpc2FibGVkJykKCQkJCQkJCQkJCQkuYWRkQ2xhc3ModG0gKyAnLXN0YXRlLWhvdmVyJyk7CgkJCQkJCQkJCX0sCgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJLy8gdW5kbyB0aGUgKmhvdmVyKiBlZmZlY3QKCQkJCQkJCQkJCWJ1dHRvbgoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtaG92ZXInKQoJCQkJCQkJCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZG93bicpOyAvLyBpZiBtb3VzZWxlYXZlIGhhcHBlbnMgYmVmb3JlIG1vdXNldXAKCQkJCQkJCQkJfQoJCQkJCQkJCSk7CgoJCQkJCQkJZ3JvdXBDaGlsZHJlbiA9IGdyb3VwQ2hpbGRyZW4uYWRkKGJ1dHRvbik7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KTsKCgkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCWdyb3VwQ2hpbGRyZW4KCQkJCQkJLmZpcnN0KCkuYWRkQ2xhc3ModG0gKyAnLWNvcm5lci1sZWZ0JykuZW5kKCkKCQkJCQkJLmxhc3QoKS5hZGRDbGFzcyh0bSArICctY29ybmVyLXJpZ2h0JykuZW5kKCk7CgkJCQl9CgoJCQkJaWYgKGdyb3VwQ2hpbGRyZW4ubGVuZ3RoID4gMSkgewoJCQkJCWdyb3VwRWwgPSAkKCc8ZGl2Lz4nKTsKCQkJCQlpZiAoaXNPbmx5QnV0dG9ucykgewoJCQkJCQlncm91cEVsLmFkZENsYXNzKCdmYy1idXR0b24tZ3JvdXAnKTsKCQkJCQl9CgkJCQkJZ3JvdXBFbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7CgkJCQkJc2VjdGlvbkVsLmFwcGVuZChncm91cEVsKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXNlY3Rpb25FbC5hcHBlbmQoZ3JvdXBDaGlsZHJlbik7IC8vIDEgb3IgMCBjaGlsZHJlbgoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiBzZWN0aW9uRWw7Cgl9CgkKCQoJZnVuY3Rpb24gdXBkYXRlVGl0bGUodGV4dCkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCdoMicpLnRleHQodGV4dCk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGFjdGl2YXRlQnV0dG9uKGJ1dHRvbk5hbWUpIHsKCQlpZiAoZWwpIHsKCQkJZWwuZmluZCgnLmZjLScgKyBidXR0b25OYW1lICsgJy1idXR0b24nKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1hY3RpdmUnKTsKCQl9Cgl9CgkKCQoJZnVuY3Rpb24gZGVhY3RpdmF0ZUJ1dHRvbihidXR0b25OYW1lKSB7CgkJaWYgKGVsKSB7CgkJCWVsLmZpbmQoJy5mYy0nICsgYnV0dG9uTmFtZSArICctYnV0dG9uJykKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtYWN0aXZlJyk7CgkJfQoJfQoJCgkKCWZ1bmN0aW9uIGRpc2FibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQoJCQkJLmFkZENsYXNzKHRtICsgJy1zdGF0ZS1kaXNhYmxlZCcpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBlbmFibGVCdXR0b24oYnV0dG9uTmFtZSkgewoJCWlmIChlbCkgewoJCQllbC5maW5kKCcuZmMtJyArIGJ1dHRvbk5hbWUgKyAnLWJ1dHRvbicpCgkJCQkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKCQkJCS5yZW1vdmVDbGFzcyh0bSArICctc3RhdGUtZGlzYWJsZWQnKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGdldFZpZXdzV2l0aEJ1dHRvbnMoKSB7CgkJcmV0dXJuIHZpZXdzV2l0aEJ1dHRvbnM7Cgl9Cgp9Cgo7OwoKRkMuc291cmNlTm9ybWFsaXplcnMgPSBbXTsKRkMuc291cmNlRmV0Y2hlcnMgPSBbXTsKCnZhciBhamF4RGVmYXVsdHMgPSB7CglkYXRhVHlwZTogJ2pzb24nLAoJY2FjaGU6IGZhbHNlCn07Cgp2YXIgZXZlbnRHVUlEID0gMTsKCgpmdW5jdGlvbiBFdmVudE1hbmFnZXIoKSB7IC8vIGFzc3VtZWQgdG8gYmUgYSBjYWxlbmRhcgoJdmFyIHQgPSB0aGlzOwoJCgkKCS8vIGV4cG9ydHMKCXQuaXNGZXRjaE5lZWRlZCA9IGlzRmV0Y2hOZWVkZWQ7Cgl0LmZldGNoRXZlbnRzID0gZmV0Y2hFdmVudHM7Cgl0LmZldGNoRXZlbnRTb3VyY2VzID0gZmV0Y2hFdmVudFNvdXJjZXM7Cgl0LmdldEV2ZW50U291cmNlcyA9IGdldEV2ZW50U291cmNlczsKCXQuZ2V0RXZlbnRTb3VyY2VCeUlkID0gZ2V0RXZlbnRTb3VyY2VCeUlkOwoJdC5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkgPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk7Cgl0LmdldEV2ZW50U291cmNlc0J5TWF0Y2ggPSBnZXRFdmVudFNvdXJjZXNCeU1hdGNoOwoJdC5hZGRFdmVudFNvdXJjZSA9IGFkZEV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZSA9IHJlbW92ZUV2ZW50U291cmNlOwoJdC5yZW1vdmVFdmVudFNvdXJjZXMgPSByZW1vdmVFdmVudFNvdXJjZXM7Cgl0LnVwZGF0ZUV2ZW50ID0gdXBkYXRlRXZlbnQ7Cgl0LnJlbmRlckV2ZW50ID0gcmVuZGVyRXZlbnQ7Cgl0LnJlbW92ZUV2ZW50cyA9IHJlbW92ZUV2ZW50czsKCXQuY2xpZW50RXZlbnRzID0gY2xpZW50RXZlbnRzOwoJdC5tdXRhdGVFdmVudCA9IG11dGF0ZUV2ZW50OwoJdC5ub3JtYWxpemVFdmVudERhdGVzID0gbm9ybWFsaXplRXZlbnREYXRlczsKCXQubm9ybWFsaXplRXZlbnRUaW1lcyA9IG5vcm1hbGl6ZUV2ZW50VGltZXM7CgkKCQoJLy8gaW1wb3J0cwoJdmFyIHJlcG9ydEV2ZW50cyA9IHQucmVwb3J0RXZlbnRzOwoJCgkKCS8vIGxvY2FscwoJdmFyIHN0aWNreVNvdXJjZSA9IHsgZXZlbnRzOiBbXSB9OwoJdmFyIHNvdXJjZXMgPSBbIHN0aWNreVNvdXJjZSBdOwoJdmFyIHJhbmdlU3RhcnQsIHJhbmdlRW5kOwoJdmFyIHBlbmRpbmdTb3VyY2VDbnQgPSAwOyAvLyBvdXRzdGFuZGluZyBmZXRjaCByZXF1ZXN0cywgbWF4IG9uZSBwZXIgc291cmNlCgl2YXIgY2FjaGUgPSBbXTsgLy8gaG9sZHMgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZXhwYW5kZWQKCgoJJC5lYWNoKAoJCSh0Lm9wdGlvbnMuZXZlbnRzID8gWyB0Lm9wdGlvbnMuZXZlbnRzIF0gOiBbXSkuY29uY2F0KHQub3B0aW9ucy5ldmVudFNvdXJjZXMgfHwgW10pLAoJCWZ1bmN0aW9uKGksIHNvdXJjZUlucHV0KSB7CgkJCXZhciBzb3VyY2UgPSBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KTsKCQkJaWYgKHNvdXJjZSkgewoJCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCX0KCQl9CgkpOwoJCgkKCQoJLyogRmV0Y2hpbmcKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gc3RhcnQgYW5kIGVuZCBhcmUgYXNzdW1lZCB0byBiZSB1bnpvbmVkCglmdW5jdGlvbiBpc0ZldGNoTmVlZGVkKHN0YXJ0LCBlbmQpIHsKCQlyZXR1cm4gIXJhbmdlU3RhcnQgfHwgLy8gbm90aGluZyBoYXMgYmVlbiBmZXRjaGVkIHlldD8KCQkJc3RhcnQgPCByYW5nZVN0YXJ0IHx8IGVuZCA+IHJhbmdlRW5kOyAvLyBpcyBwYXJ0IG9mIHRoZSBuZXcgcmFuZ2Ugb3V0c2lkZSBvZiB0aGUgb2xkIHJhbmdlPwoJfQoJCgkKCWZ1bmN0aW9uIGZldGNoRXZlbnRzKHN0YXJ0LCBlbmQpIHsKCQlyYW5nZVN0YXJ0ID0gc3RhcnQ7CgkJcmFuZ2VFbmQgPSBlbmQ7CgkJZmV0Y2hFdmVudFNvdXJjZXMoc291cmNlcywgJ3Jlc2V0Jyk7Cgl9CgoKCS8vIGV4cGVjdHMgYW4gYXJyYXkgb2YgZXZlbnQgc291cmNlIG9iamVjdHMgKHRoZSBvcmlnaW5hbHMsIG5vdCBjb3BpZXMpCgkvLyBgc3BlY2lhbEZldGNoVHlwZWAgaXMgYW4gb3B0aW1pemF0aW9uIHBhcmFtZXRlciB0aGF0IGFmZmVjdHMgcHVyZ2luZyBvZiB0aGUgZXZlbnQgY2FjaGUuCglmdW5jdGlvbiBmZXRjaEV2ZW50U291cmNlcyhzcGVjaWZpY1NvdXJjZXMsIHNwZWNpYWxGZXRjaFR5cGUpIHsKCQl2YXIgaSwgc291cmNlOwoKCQlpZiAoc3BlY2lhbEZldGNoVHlwZSA9PT0gJ3Jlc2V0JykgewoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIGlmIChzcGVjaWFsRmV0Y2hUeXBlICE9PSAnYWRkJykgewoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHNwZWNpZmljU291cmNlcyk7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCS8vIGFscmVhZHktcGVuZGluZyBzb3VyY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGFjY291bnRlZCBmb3IgaW4gcGVuZGluZ1NvdXJjZUNudAoJCQlpZiAoc291cmNlLl9zdGF0dXMgIT09ICdwZW5kaW5nJykgewoJCQkJcGVuZGluZ1NvdXJjZUNudCsrOwoJCQl9CgoJCQlzb3VyY2UuX2ZldGNoSWQgPSAoc291cmNlLl9mZXRjaElkIHx8IDApICsgMTsKCQkJc291cmNlLl9zdGF0dXMgPSAncGVuZGluZyc7CgkJfQoKCQlmb3IgKGkgPSAwOyBpIDwgc3BlY2lmaWNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNwZWNpZmljU291cmNlc1tpXTsKCgkJCXRyeUZldGNoRXZlbnRTb3VyY2Uoc291cmNlLCBzb3VyY2UuX2ZldGNoSWQpOwoJCX0KCX0KCgoJLy8gZmV0Y2hlcyBhbiBldmVudCBzb3VyY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzdWx0IE9OTFkgaWYgaXQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgZmV0Y2guCgkvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluY3JlbWVudGluZyBwZW5kaW5nU291cmNlQ250IGZpcnN0LgoJZnVuY3Rpb24gdHJ5RmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZldGNoSWQpIHsKCQlfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGZ1bmN0aW9uKGV2ZW50SW5wdXRzKSB7CgkJCXZhciBpc0FycmF5U291cmNlID0gJC5pc0FycmF5KHNvdXJjZS5ldmVudHMpOwoJCQl2YXIgaSwgZXZlbnRJbnB1dDsKCQkJdmFyIGFic3RyYWN0RXZlbnQ7CgoJCQlpZiAoCgkJCQkvLyBpcyB0aGlzIHRoZSBzb3VyY2UncyBtb3N0IHJlY2VudCBmZXRjaD8KCQkJCS8vIGlmIG5vdCwgcmVseSBvbiBhbiB1cGNvbWluZyBmZXRjaCBvZiB0aGlzIHNvdXJjZSB0byBkZWNyZW1lbnQgcGVuZGluZ1NvdXJjZUNudAoJCQkJZmV0Y2hJZCA9PT0gc291cmNlLl9mZXRjaElkICYmCgkJCQkvLyBldmVudCBzb3VyY2Ugbm8gbG9uZ2VyIHZhbGlkPwoJCQkJc291cmNlLl9zdGF0dXMgIT09ICdyZWplY3RlZCcKCQkJKSB7CgkJCQlzb3VyY2UuX3N0YXR1cyA9ICdyZXNvbHZlZCc7CgoJCQkJaWYgKGV2ZW50SW5wdXRzKSB7CgkJCQkJZm9yIChpID0gMDsgaSA8IGV2ZW50SW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCWV2ZW50SW5wdXQgPSBldmVudElucHV0c1tpXTsKCgkJCQkJCWlmIChpc0FycmF5U291cmNlKSB7IC8vIGFycmF5IHNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gY29udmVydCB0byBFdmVudCBPYmplY3RzCgkJCQkJCQlhYnN0cmFjdEV2ZW50ID0gZXZlbnRJbnB1dDsKCQkJCQkJfQoJCQkJCQllbHNlIHsKCQkJCQkJCWFic3RyYWN0RXZlbnQgPSBidWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQsIHNvdXJjZSk7CgkJCQkJCX0KCgkJCQkJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYW4gaW52YWxpZCBldmVudCkKCQkJCQkJCWNhY2hlLnB1c2guYXBwbHkoCgkJCQkJCQkJY2FjaGUsCgkJCQkJCQkJZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCkgLy8gYWRkIGluZGl2aWR1YWwgZXhwYW5kZWQgZXZlbnRzIHRvIHRoZSBjYWNoZQoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlkZWNyZW1lbnRQZW5kaW5nU291cmNlQ250KCk7CgkJCX0KCQl9KTsKCX0KCgoJZnVuY3Rpb24gcmVqZWN0RXZlbnRTb3VyY2Uoc291cmNlKSB7CgkJdmFyIHdhc1BlbmRpbmcgPSBzb3VyY2UuX3N0YXR1cyA9PT0gJ3BlbmRpbmcnOwoKCQlzb3VyY2UuX3N0YXR1cyA9ICdyZWplY3RlZCc7CgoJCWlmICh3YXNQZW5kaW5nKSB7CgkJCWRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKTsKCQl9Cgl9CgoKCWZ1bmN0aW9uIGRlY3JlbWVudFBlbmRpbmdTb3VyY2VDbnQoKSB7CgkJcGVuZGluZ1NvdXJjZUNudC0tOwoJCWlmICghcGVuZGluZ1NvdXJjZUNudCkgewoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoJCX0KCX0KCQoJCglmdW5jdGlvbiBfZmV0Y2hFdmVudFNvdXJjZShzb3VyY2UsIGNhbGxiYWNrKSB7CgkJdmFyIGk7CgkJdmFyIGZldGNoZXJzID0gRkMuc291cmNlRmV0Y2hlcnM7CgkJdmFyIHJlczsKCgkJZm9yIChpPTA7IGk8ZmV0Y2hlcnMubGVuZ3RoOyBpKyspIHsKCQkJcmVzID0gZmV0Y2hlcnNbaV0uY2FsbCgKCQkJCXQsIC8vIHRoaXMsIHRoZSBDYWxlbmRhciBvYmplY3QKCQkJCXNvdXJjZSwKCQkJCXJhbmdlU3RhcnQuY2xvbmUoKSwKCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQl0Lm9wdGlvbnMudGltZXpvbmUsCgkJCQljYWxsYmFjawoJCQkpOwoKCQkJaWYgKHJlcyA9PT0gdHJ1ZSkgewoJCQkJLy8gdGhlIGZldGNoZXIgaXMgaW4gY2hhcmdlLiBtYWRlIGl0cyBvd24gYXN5bmMgcmVxdWVzdAoJCQkJcmV0dXJuOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGVvZiByZXMgPT0gJ29iamVjdCcpIHsKCQkJCS8vIHRoZSBmZXRjaGVyIHJldHVybmVkIGEgbmV3IHNvdXJjZS4gcHJvY2VzcyBpdAoJCQkJX2ZldGNoRXZlbnRTb3VyY2UocmVzLCBjYWxsYmFjayk7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCXZhciBldmVudHMgPSBzb3VyY2UuZXZlbnRzOwoJCWlmIChldmVudHMpIHsKCQkJaWYgKCQuaXNGdW5jdGlvbihldmVudHMpKSB7CgkJCQl0LnB1c2hMb2FkaW5nKCk7CgkJCQlldmVudHMuY2FsbCgKCQkJCQl0LCAvLyB0aGlzLCB0aGUgQ2FsZW5kYXIgb2JqZWN0CgkJCQkJcmFuZ2VTdGFydC5jbG9uZSgpLAoJCQkJCXJhbmdlRW5kLmNsb25lKCksCgkJCQkJdC5vcHRpb25zLnRpbWV6b25lLAoJCQkJCWZ1bmN0aW9uKGV2ZW50cykgewoJCQkJCQljYWxsYmFjayhldmVudHMpOwoJCQkJCQl0LnBvcExvYWRpbmcoKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJCWVsc2UgaWYgKCQuaXNBcnJheShldmVudHMpKSB7CgkJCQljYWxsYmFjayhldmVudHMpOwoJCQl9CgkJCWVsc2UgewoJCQkJY2FsbGJhY2soKTsKCQkJfQoJCX1lbHNlewoJCQl2YXIgdXJsID0gc291cmNlLnVybDsKCQkJaWYgKHVybCkgewoJCQkJdmFyIHN1Y2Nlc3MgPSBzb3VyY2Uuc3VjY2VzczsKCQkJCXZhciBlcnJvciA9IHNvdXJjZS5lcnJvcjsKCQkJCXZhciBjb21wbGV0ZSA9IHNvdXJjZS5jb21wbGV0ZTsKCgkJCQkvLyByZXRyaWV2ZSBhbnkgb3V0Ym91bmQgR0VUL1BPU1QgJC5hamF4IGRhdGEgZnJvbSB0aGUgb3B0aW9ucwoJCQkJdmFyIGN1c3RvbURhdGE7CgkJCQlpZiAoJC5pc0Z1bmN0aW9uKHNvdXJjZS5kYXRhKSkgewoJCQkJCS8vIHN1cHBsaWVkIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEga2V5L3ZhbHVlIG9iamVjdAoJCQkJCWN1c3RvbURhdGEgPSBzb3VyY2UuZGF0YSgpOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJLy8gc3VwcGxpZWQgYXMgYSBzdHJhaWdodCBrZXkvdmFsdWUgb2JqZWN0CgkJCQkJY3VzdG9tRGF0YSA9IHNvdXJjZS5kYXRhOwoJCQkJfQoKCQkJCS8vIHVzZSBhIGNvcHkgb2YgdGhlIGN1c3RvbSBkYXRhIHNvIHdlIGNhbiBtb2RpZnkgdGhlIHBhcmFtZXRlcnMKCQkJCS8vIGFuZCBub3QgYWZmZWN0IHRoZSBwYXNzZWQtaW4gb2JqZWN0LgoJCQkJdmFyIGRhdGEgPSAkLmV4dGVuZCh7fSwgY3VzdG9tRGF0YSB8fCB7fSk7CgoJCQkJdmFyIHN0YXJ0UGFyYW0gPSBmaXJzdERlZmluZWQoc291cmNlLnN0YXJ0UGFyYW0sIHQub3B0aW9ucy5zdGFydFBhcmFtKTsKCQkJCXZhciBlbmRQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UuZW5kUGFyYW0sIHQub3B0aW9ucy5lbmRQYXJhbSk7CgkJCQl2YXIgdGltZXpvbmVQYXJhbSA9IGZpcnN0RGVmaW5lZChzb3VyY2UudGltZXpvbmVQYXJhbSwgdC5vcHRpb25zLnRpbWV6b25lUGFyYW0pOwoKCQkJCWlmIChzdGFydFBhcmFtKSB7CgkJCQkJZGF0YVtzdGFydFBhcmFtXSA9IHJhbmdlU3RhcnQuZm9ybWF0KCk7CgkJCQl9CgkJCQlpZiAoZW5kUGFyYW0pIHsKCQkJCQlkYXRhW2VuZFBhcmFtXSA9IHJhbmdlRW5kLmZvcm1hdCgpOwoJCQkJfQoJCQkJaWYgKHQub3B0aW9ucy50aW1lem9uZSAmJiB0Lm9wdGlvbnMudGltZXpvbmUgIT0gJ2xvY2FsJykgewoJCQkJCWRhdGFbdGltZXpvbmVQYXJhbV0gPSB0Lm9wdGlvbnMudGltZXpvbmU7CgkJCQl9CgoJCQkJdC5wdXNoTG9hZGluZygpOwoJCQkJJC5hamF4KCQuZXh0ZW5kKHt9LCBhamF4RGVmYXVsdHMsIHNvdXJjZSwgewoJCQkJCWRhdGE6IGRhdGEsCgkJCQkJc3VjY2VzczogZnVuY3Rpb24oZXZlbnRzKSB7CgkJCQkJCWV2ZW50cyA9IGV2ZW50cyB8fCBbXTsKCQkJCQkJdmFyIHJlcyA9IGFwcGx5QWxsKHN1Y2Nlc3MsIHRoaXMsIGFyZ3VtZW50cyk7CgkJCQkJCWlmICgkLmlzQXJyYXkocmVzKSkgewoJCQkJCQkJZXZlbnRzID0gcmVzOwoJCQkJCQl9CgkJCQkJCWNhbGxiYWNrKGV2ZW50cyk7CgkJCQkJfSwKCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCWFwcGx5QWxsKGVycm9yLCB0aGlzLCBhcmd1bWVudHMpOwoJCQkJCQljYWxsYmFjaygpOwoJCQkJCX0sCgkJCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJCQlhcHBseUFsbChjb21wbGV0ZSwgdGhpcywgYXJndW1lbnRzKTsKCQkJCQkJdC5wb3BMb2FkaW5nKCk7CgkJCQkJfQoJCQkJfSkpOwoJCQl9ZWxzZXsKCQkJCWNhbGxiYWNrKCk7CgkJCX0KCQl9Cgl9CgkKCQoJCgkvKiBTb3VyY2VzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCWZ1bmN0aW9uIGFkZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7CgkJdmFyIHNvdXJjZSA9IGJ1aWxkRXZlbnRTb3VyY2Uoc291cmNlSW5wdXQpOwoJCWlmIChzb3VyY2UpIHsKCQkJc291cmNlcy5wdXNoKHNvdXJjZSk7CgkJCWZldGNoRXZlbnRTb3VyY2VzKFsgc291cmNlIF0sICdhZGQnKTsgLy8gd2lsbCBldmVudHVhbGx5IGNhbGwgcmVwb3J0RXZlbnRzCgkJfQoJfQoKCglmdW5jdGlvbiBidWlsZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7IC8vIHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiBpbnZhbGlkIHNvdXJjZQoJCXZhciBub3JtYWxpemVycyA9IEZDLnNvdXJjZU5vcm1hbGl6ZXJzOwoJCXZhciBzb3VyY2U7CgkJdmFyIGk7CgoJCWlmICgkLmlzRnVuY3Rpb24oc291cmNlSW5wdXQpIHx8ICQuaXNBcnJheShzb3VyY2VJbnB1dCkpIHsKCQkJc291cmNlID0geyBldmVudHM6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ3N0cmluZycpIHsKCQkJc291cmNlID0geyB1cmw6IHNvdXJjZUlucHV0IH07CgkJfQoJCWVsc2UgaWYgKHR5cGVvZiBzb3VyY2VJbnB1dCA9PT0gJ29iamVjdCcpIHsKCQkJc291cmNlID0gJC5leHRlbmQoe30sIHNvdXJjZUlucHV0KTsgLy8gc2hhbGxvdyBjb3B5CgkJfQoKCQlpZiAoc291cmNlKSB7CgoJCQkvLyBUT0RPOiByZXBlYXQgY29kZSwgc2FtZSBjb2RlIGZvciBldmVudCBjbGFzc05hbWVzCgkJCWlmIChzb3VyY2UuY2xhc3NOYW1lKSB7CgkJCQlpZiAodHlwZW9mIHNvdXJjZS5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7CgkJCQkJc291cmNlLmNsYXNzTmFtZSA9IHNvdXJjZS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOwoJCQkJfQoJCQkJLy8gb3RoZXJ3aXNlLCBhc3N1bWVkIHRvIGJlIGFuIGFycmF5CgkJCX0KCQkJZWxzZSB7CgkJCQlzb3VyY2UuY2xhc3NOYW1lID0gW107CgkJCX0KCgkJCS8vIGZvciBhcnJheSBzb3VyY2VzLCB3ZSBjb252ZXJ0IHRvIHN0YW5kYXJkIEV2ZW50IE9iamVjdHMgdXAgZnJvbnQKCQkJaWYgKCQuaXNBcnJheShzb3VyY2UuZXZlbnRzKSkgewoJCQkJc291cmNlLm9yaWdBcnJheSA9IHNvdXJjZS5ldmVudHM7IC8vIGZvciByZW1vdmVFdmVudFNvdXJjZQoJCQkJc291cmNlLmV2ZW50cyA9ICQubWFwKHNvdXJjZS5ldmVudHMsIGZ1bmN0aW9uKGV2ZW50SW5wdXQpIHsKCQkJCQlyZXR1cm4gYnVpbGRFdmVudEZyb21JbnB1dChldmVudElucHV0LCBzb3VyY2UpOwoJCQkJfSk7CgkJCX0KCgkJCWZvciAoaT0wOyBpPG5vcm1hbGl6ZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQlub3JtYWxpemVyc1tpXS5jYWxsKHQsIHNvdXJjZSk7CgkJCX0KCgkJCXJldHVybiBzb3VyY2U7CgkJfQoJfQoKCglmdW5jdGlvbiByZW1vdmVFdmVudFNvdXJjZShtYXRjaElucHV0KSB7CgkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoCgkJCWdldEV2ZW50U291cmNlc0J5TWF0Y2gobWF0Y2hJbnB1dCkKCQkpOwoJfQoKCgkvLyBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIHJlbW92ZXMgYWxsLgoJZnVuY3Rpb24gcmVtb3ZlRXZlbnRTb3VyY2VzKG1hdGNoSW5wdXRzKSB7CgkJaWYgKG1hdGNoSW5wdXRzID09IG51bGwpIHsKCQkJcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXMoc291cmNlcywgdHJ1ZSk7IC8vIGlzQWxsPXRydWUKCQl9CgkJZWxzZSB7CgkJCXJlbW92ZVNwZWNpZmljRXZlbnRTb3VyY2VzKAoJCQkJZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaEFycmF5KG1hdGNoSW5wdXRzKQoJCQkpOwoJCX0KCX0KCgoJZnVuY3Rpb24gcmVtb3ZlU3BlY2lmaWNFdmVudFNvdXJjZXModGFyZ2V0U291cmNlcywgaXNBbGwpIHsKCQl2YXIgaTsKCgkJLy8gY2FuY2VsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlyZWplY3RFdmVudFNvdXJjZSh0YXJnZXRTb3VyY2VzW2ldKTsKCQl9CgoJCWlmIChpc0FsbCkgeyAvLyBhbiBvcHRpbWl6YXRpb24KCQkJc291cmNlcyA9IFtdOwoJCQljYWNoZSA9IFtdOwoJCX0KCQllbHNlIHsKCQkJLy8gcmVtb3ZlIGZyb20gcGVyc2lzdGVkIHNvdXJjZSBsaXN0CgkJCXNvdXJjZXMgPSAkLmdyZXAoc291cmNlcywgZnVuY3Rpb24oc291cmNlKSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0U291cmNlcy5sZW5ndGg7IGkrKykgewoJCQkJCWlmIChzb3VyY2UgPT09IHRhcmdldFNvdXJjZXNbaV0pIHsKCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBleGNsdWRlCgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHRydWU7IC8vIGluY2x1ZGUKCQkJfSk7CgoJCQljYWNoZSA9IGV4Y2x1ZGVFdmVudHNCeVNvdXJjZXMoY2FjaGUsIHRhcmdldFNvdXJjZXMpOwoJCX0KCgkJcmVwb3J0RXZlbnRzKGNhY2hlKTsKCX0KCgoJZnVuY3Rpb24gZ2V0RXZlbnRTb3VyY2VzKCkgewoJCXJldHVybiBzb3VyY2VzLnNsaWNlKDEpOyAvLyByZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHNvdXJjZXMgd2l0aCBzdGlja3lTb3VyY2UgcmVtb3ZlZAoJfQoKCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZUJ5SWQoaWQpIHsKCQlyZXR1cm4gJC5ncmVwKHNvdXJjZXMsIGZ1bmN0aW9uKHNvdXJjZSkgewoJCQlyZXR1cm4gc291cmNlLmlkICYmIHNvdXJjZS5pZCA9PT0gaWQ7CgkJfSlbMF07Cgl9CgoKCS8vIGxpa2UgZ2V0RXZlbnRTb3VyY2VzQnlNYXRjaCwgYnV0IGFjY2VwdHMgbXVsdHBsZSBtYXRjaCBjcml0ZXJpYSAobGlrZSBtdWx0aXBsZSBJRHMpCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXkobWF0Y2hJbnB1dHMpIHsKCgkJLy8gY29lcmNlIGludG8gYW4gYXJyYXkKCQlpZiAoIW1hdGNoSW5wdXRzKSB7CgkJCW1hdGNoSW5wdXRzID0gW107CgkJfQoJCWVsc2UgaWYgKCEkLmlzQXJyYXkobWF0Y2hJbnB1dHMpKSB7CgkJCW1hdGNoSW5wdXRzID0gWyBtYXRjaElucHV0cyBdOwoJCX0KCgkJdmFyIG1hdGNoaW5nU291cmNlcyA9IFtdOwoJCXZhciBpOwoKCQkvLyByZXNvbHZlIHJhdyBpbnB1dHMgdG8gcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0cwoJCWZvciAoaSA9IDA7IGkgPCBtYXRjaElucHV0cy5sZW5ndGg7IGkrKykgewoJCQltYXRjaGluZ1NvdXJjZXMucHVzaC5hcHBseSggLy8gYXBwZW5kCgkJCQltYXRjaGluZ1NvdXJjZXMsCgkJCQlnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXRzW2ldKQoJCQkpOwoJCX0KCgkJcmV0dXJuIG1hdGNoaW5nU291cmNlczsKCX0KCgoJLy8gbWF0Y2hJbnB1dCBjYW4gZWl0aGVyIGJ5IGEgcmVhbCBldmVudCBzb3VyY2Ugb2JqZWN0LCBhbiBJRCwgb3IgdGhlIGZ1bmN0aW9uL1VSTCBmb3IgdGhlIHNvdXJjZS4KCS8vIHJldHVybnMgYW4gYXJyYXkgb2YgbWF0Y2hpbmcgc291cmNlIG9iamVjdHMuCglmdW5jdGlvbiBnZXRFdmVudFNvdXJjZXNCeU1hdGNoKG1hdGNoSW5wdXQpIHsKCQl2YXIgaSwgc291cmNlOwoKCQkvLyBnaXZlbiBhbiBwcm9wZXIgZXZlbnQgc291cmNlIG9iamVjdAoJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CgkJCXNvdXJjZSA9IHNvdXJjZXNbaV07CgkJCWlmIChzb3VyY2UgPT09IG1hdGNoSW5wdXQpIHsKCQkJCXJldHVybiBbIHNvdXJjZSBdOwoJCQl9CgkJfQoKCQkvLyBhbiBJRCBtYXRjaAoJCXNvdXJjZSA9IGdldEV2ZW50U291cmNlQnlJZChtYXRjaElucHV0KTsKCQlpZiAoc291cmNlKSB7CgkJCXJldHVybiBbIHNvdXJjZSBdOwoJCX0KCgkJcmV0dXJuICQuZ3JlcChzb3VyY2VzLCBmdW5jdGlvbihzb3VyY2UpIHsKCQkJcmV0dXJuIGlzU291cmNlc0VxdWl2YWxlbnQobWF0Y2hJbnB1dCwgc291cmNlKTsKCQl9KTsKCX0KCgoJZnVuY3Rpb24gaXNTb3VyY2VzRXF1aXZhbGVudChzb3VyY2UxLCBzb3VyY2UyKSB7CgkJcmV0dXJuIHNvdXJjZTEgJiYgc291cmNlMiAmJiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlMSkgPT0gZ2V0U291cmNlUHJpbWl0aXZlKHNvdXJjZTIpOwoJfQoKCglmdW5jdGlvbiBnZXRTb3VyY2VQcmltaXRpdmUoc291cmNlKSB7CgkJcmV0dXJuICgKCQkJKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSA/IC8vIGEgbm9ybWFsaXplZCBldmVudCBzb3VyY2U/CgkJCQkoc291cmNlLm9yaWdBcnJheSB8fCBzb3VyY2UuZ29vZ2xlQ2FsZW5kYXJJZCB8fCBzb3VyY2UudXJsIHx8IHNvdXJjZS5ldmVudHMpIDogLy8gZ2V0IHRoZSBwcmltaXRpdmUKCQkJCW51bGwKCQkpIHx8CgkJc291cmNlOyAvLyB0aGUgZ2l2ZW4gYXJndW1lbnQgKmlzKiB0aGUgcHJpbWl0aXZlCgl9CgoKCS8vIHV0aWwKCS8vIHJldHVybnMgYSBmaWx0ZXJlZCBhcnJheSB3aXRob3V0IGV2ZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGFueSBvZiB0aGUgZ2l2ZW4gc291cmNlcwoJZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlcyhzcGVjaWZpY0V2ZW50cywgc3BlY2lmaWNTb3VyY2VzKSB7CgkJcmV0dXJuICQuZ3JlcChzcGVjaWZpY0V2ZW50cywgZnVuY3Rpb24oZXZlbnQpIHsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjaWZpY1NvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJCWlmIChldmVudC5zb3VyY2UgPT09IHNwZWNpZmljU291cmNlc1tpXSkgewoJCQkJCXJldHVybiBmYWxzZTsgLy8gZXhjbHVkZQoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOyAvLyBrZWVwCgkJfSk7Cgl9CgkKCQoJCgkvKiBNYW5pcHVsYXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gT25seSBldmVyIGNhbGxlZCBmcm9tIHRoZSBleHRlcm5hbGx5LWZhY2luZyBBUEkKCWZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGV2ZW50KSB7CgoJCS8vIG1hc3NhZ2Ugc3RhcnQvZW5kIHZhbHVlcywgZXZlbiBpZiBkYXRlIHN0cmluZyB2YWx1ZXMKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWVsc2UgewoJCQlldmVudC5lbmQgPSBudWxsOwoJCX0KCgkJbXV0YXRlRXZlbnQoZXZlbnQsIGdldE1pc2NFdmVudFByb3BzKGV2ZW50KSk7IC8vIHdpbGwgaGFuZGxlIHN0YXJ0L2VuZC9hbGxEYXkgbm9ybWFsaXphdGlvbgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7IC8vIHJlcG9ydHMgZXZlbnQgbW9kaWZpY2F0aW9ucyAoc28gd2UgY2FuIHJlZHJhdykKCX0KCgoJLy8gUmV0dXJucyBhIGhhc2ggb2YgbWlzYyBldmVudCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGNvcGllZCBvdmVyIHRvIHJlbGF0ZWQgZXZlbnRzLgoJZnVuY3Rpb24gZ2V0TWlzY0V2ZW50UHJvcHMoZXZlbnQpIHsKCQl2YXIgcHJvcHMgPSB7fTsKCgkJJC5lYWNoKGV2ZW50LCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiBpc0F0b21pYyh2YWwpKSB7IC8vIGEgZGVmaW5lZCBub24tb2JqZWN0CgkJCQkJcHJvcHNbbmFtZV0gPSB2YWw7CgkJCQl9CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHByb3BzOwoJfQoKCS8vIG5vbi1kYXRlLXJlbGF0ZWQsIG5vbi1pZC1yZWxhdGVkLCBub24tc2VjcmV0CglmdW5jdGlvbiBpc01pc2NFdmVudFByb3BOYW1lKG5hbWUpIHsKCQlyZXR1cm4gIS9eX3xeKGlkfGFsbERheXxzdGFydHxlbmQpJC8udGVzdChuYW1lKTsKCX0KCgkKCS8vIHJldHVybnMgdGhlIGV4cGFuZGVkIGV2ZW50cyB0aGF0IHdlcmUgY3JlYXRlZAoJZnVuY3Rpb24gcmVuZGVyRXZlbnQoZXZlbnRJbnB1dCwgc3RpY2spIHsKCQl2YXIgYWJzdHJhY3RFdmVudCA9IGJ1aWxkRXZlbnRGcm9tSW5wdXQoZXZlbnRJbnB1dCk7CgkJdmFyIGV2ZW50czsKCQl2YXIgaSwgZXZlbnQ7CgoJCWlmIChhYnN0cmFjdEV2ZW50KSB7IC8vIG5vdCBmYWxzZSAoYSB2YWxpZCBpbnB1dCkKCQkJZXZlbnRzID0gZXhwYW5kRXZlbnQoYWJzdHJhY3RFdmVudCk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlldmVudCA9IGV2ZW50c1tpXTsKCgkJCQlpZiAoIWV2ZW50LnNvdXJjZSkgewoJCQkJCWlmIChzdGljaykgewoJCQkJCQlzdGlja3lTb3VyY2UuZXZlbnRzLnB1c2goZXZlbnQpOwoJCQkJCQlldmVudC5zb3VyY2UgPSBzdGlja3lTb3VyY2U7CgkJCQkJfQoJCQkJCWNhY2hlLnB1c2goZXZlbnQpOwoJCQkJfQoJCQl9CgoJCQlyZXBvcnRFdmVudHMoY2FjaGUpOwoKCQkJcmV0dXJuIGV2ZW50czsKCQl9CgoJCXJldHVybiBbXTsKCX0KCQoJCglmdW5jdGlvbiByZW1vdmVFdmVudHMoZmlsdGVyKSB7CgkJdmFyIGV2ZW50SUQ7CgkJdmFyIGk7CgoJCWlmIChmaWx0ZXIgPT0gbnVsbCkgeyAvLyBudWxsIG9yIHVuZGVmaW5lZC4gcmVtb3ZlIGFsbCBldmVudHMKCQkJZmlsdGVyID0gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OyAvLyB3aWxsIGFsd2F5cyBtYXRjaAoJCX0KCQllbHNlIGlmICghJC5pc0Z1bmN0aW9uKGZpbHRlcikpIHsgLy8gYW4gZXZlbnQgSUQKCQkJZXZlbnRJRCA9IGZpbHRlciArICcnOwoJCQlmaWx0ZXIgPSBmdW5jdGlvbihldmVudCkgewoJCQkJcmV0dXJuIGV2ZW50Ll9pZCA9PSBldmVudElEOwoJCQl9OwoJCX0KCgkJLy8gUHVyZ2UgZXZlbnQocykgZnJvbSBvdXIgbG9jYWwgY2FjaGUKCQljYWNoZSA9ICQuZ3JlcChjYWNoZSwgZmlsdGVyLCB0cnVlKTsgLy8gaW52ZXJzZT10cnVlCgoJCS8vIFJlbW92ZSBldmVudHMgZnJvbSBhcnJheSBzb3VyY2VzLgoJCS8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gb2ZmaWNpYWwgRXZlbnQgT2JqZWN0cyB1cCBmcm9udC4KCQkvLyAoYW5kIGFzIGEgcmVzdWx0LCBldmVudC5faWQgaGFzIGJlZW4gY2FsY3VsYXRlZCkuCgkJZm9yIChpPTA7IGk8c291cmNlcy5sZW5ndGg7IGkrKykgewoJCQlpZiAoJC5pc0FycmF5KHNvdXJjZXNbaV0uZXZlbnRzKSkgewoJCQkJc291cmNlc1tpXS5ldmVudHMgPSAkLmdyZXAoc291cmNlc1tpXS5ldmVudHMsIGZpbHRlciwgdHJ1ZSk7CgkJCX0KCQl9CgoJCXJlcG9ydEV2ZW50cyhjYWNoZSk7Cgl9CgoJCglmdW5jdGlvbiBjbGllbnRFdmVudHMoZmlsdGVyKSB7CgkJaWYgKCQuaXNGdW5jdGlvbihmaWx0ZXIpKSB7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZpbHRlcik7CgkJfQoJCWVsc2UgaWYgKGZpbHRlciAhPSBudWxsKSB7IC8vIG5vdCBudWxsLCBub3QgdW5kZWZpbmVkLiBhbiBldmVudCBJRAoJCQlmaWx0ZXIgKz0gJyc7CgkJCXJldHVybiAkLmdyZXAoY2FjaGUsIGZ1bmN0aW9uKGUpIHsKCQkJCXJldHVybiBlLl9pZCA9PSBmaWx0ZXI7CgkJCX0pOwoJCX0KCQlyZXR1cm4gY2FjaGU7IC8vIGVsc2UsIHJldHVybiBhbGwKCX0KCgoJLy8gTWFrZXMgc3VyZSBhbGwgYXJyYXkgZXZlbnQgc291cmNlcyBoYXZlIHRoZWlyIGludGVybmFsIGV2ZW50IG9iamVjdHMKCS8vIGNvbnZlcnRlZCBvdmVyIHRvIHRoZSBDYWxlbmRhcidzIGN1cnJlbnQgdGltZXpvbmUuCgl0LnJlem9uZUFycmF5RXZlbnRTb3VyY2VzID0gZnVuY3Rpb24oKSB7CgkJdmFyIGk7CgkJdmFyIGV2ZW50czsKCQl2YXIgajsKCgkJZm9yIChpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHsKCQkJZXZlbnRzID0gc291cmNlc1tpXS5ldmVudHM7CgkJCWlmICgkLmlzQXJyYXkoZXZlbnRzKSkgewoKCQkJCWZvciAoaiA9IDA7IGogPCBldmVudHMubGVuZ3RoOyBqKyspIHsKCQkJCQlyZXpvbmVFdmVudERhdGVzKGV2ZW50c1tqXSk7CgkJCQl9CgkJCX0KCQl9Cgl9OwoKCWZ1bmN0aW9uIHJlem9uZUV2ZW50RGF0ZXMoZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHQubW9tZW50KGV2ZW50LnN0YXJ0KTsKCQlpZiAoZXZlbnQuZW5kKSB7CgkJCWV2ZW50LmVuZCA9IHQubW9tZW50KGV2ZW50LmVuZCk7CgkJfQoJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOwoJfQoJCgkKCS8qIEV2ZW50IE5vcm1hbGl6YXRpb24KCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gR2l2ZW4gYSByYXcgb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHByb3BlcnRpZXMsIHJldHVybnMgYW4gImFic3RyYWN0IiBFdmVudCBvYmplY3QuCgkvLyBBbiAiYWJzdHJhY3QiIGV2ZW50IGlzIGFuIGV2ZW50IHRoYXQsIGlmIHJlY3VycmluZywgd2lsbCBub3QgaGF2ZSBiZWVuIGV4cGFuZGVkIHlldC4KCS8vIFdpbGwgcmV0dXJuIGBmYWxzZWAgd2hlbiBpbnB1dCBpcyBpbnZhbGlkLgoJLy8gYHNvdXJjZWAgaXMgb3B0aW9uYWwKCWZ1bmN0aW9uIGJ1aWxkRXZlbnRGcm9tSW5wdXQoaW5wdXQsIHNvdXJjZSkgewoJCXZhciBvdXQgPSB7fTsKCQl2YXIgc3RhcnQsIGVuZDsKCQl2YXIgYWxsRGF5OwoKCQlpZiAodC5vcHRpb25zLmV2ZW50RGF0YVRyYW5zZm9ybSkgewoJCQlpbnB1dCA9IHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm0oaW5wdXQpOwoJCX0KCQlpZiAoc291cmNlICYmIHNvdXJjZS5ldmVudERhdGFUcmFuc2Zvcm0pIHsKCQkJaW5wdXQgPSBzb3VyY2UuZXZlbnREYXRhVHJhbnNmb3JtKGlucHV0KTsKCQl9CgoJCS8vIENvcHkgYWxsIHByb3BlcnRpZXMgb3ZlciB0byB0aGUgcmVzdWx0aW5nIG9iamVjdC4KCQkvLyBUaGUgc3BlY2lhbC1jYXNlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgb3ZlciBhZnRlcndhcmRzLgoJCSQuZXh0ZW5kKG91dCwgaW5wdXQpOwoKCQlpZiAoc291cmNlKSB7CgkJCW91dC5zb3VyY2UgPSBzb3VyY2U7CgkJfQoKCQlvdXQuX2lkID0gaW5wdXQuX2lkIHx8IChpbnB1dC5pZCA9PT0gdW5kZWZpbmVkID8gJ19mYycgKyBldmVudEdVSUQrKyA6IGlucHV0LmlkICsgJycpOwoKCQlpZiAoaW5wdXQuY2xhc3NOYW1lKSB7CgkJCWlmICh0eXBlb2YgaW5wdXQuY2xhc3NOYW1lID09ICdzdHJpbmcnKSB7CgkJCQlvdXQuY2xhc3NOYW1lID0gaW5wdXQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKCQkJfQoJCQllbHNlIHsgLy8gYXNzdW1lZCB0byBiZSBhbiBhcnJheQoJCQkJb3V0LmNsYXNzTmFtZSA9IGlucHV0LmNsYXNzTmFtZTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJb3V0LmNsYXNzTmFtZSA9IFtdOwoJCX0KCgkJc3RhcnQgPSBpbnB1dC5zdGFydCB8fCBpbnB1dC5kYXRlOyAvLyAiZGF0ZSIgaXMgYW4gYWxpYXMgZm9yICJzdGFydCIKCQllbmQgPSBpbnB1dC5lbmQ7CgoJCS8vIHBhcnNlIGFzIGEgdGltZSAoRHVyYXRpb24pIGlmIGFwcGxpY2FibGUKCQlpZiAoaXNUaW1lU3RyaW5nKHN0YXJ0KSkgewoJCQlzdGFydCA9IG1vbWVudC5kdXJhdGlvbihzdGFydCk7CgkJfQoJCWlmIChpc1RpbWVTdHJpbmcoZW5kKSkgewoJCQllbmQgPSBtb21lbnQuZHVyYXRpb24oZW5kKTsKCQl9CgoJCWlmIChpbnB1dC5kb3cgfHwgbW9tZW50LmlzRHVyYXRpb24oc3RhcnQpIHx8IG1vbWVudC5pc0R1cmF0aW9uKGVuZCkpIHsKCgkJCS8vIHRoZSBldmVudCBpcyAiYWJzdHJhY3QiIChyZWN1cnJpbmcpIHNvIGRvbid0IGNhbGN1bGF0ZSBleGFjdCBzdGFydC9lbmQgZGF0ZXMganVzdCB5ZXQKCQkJb3V0LnN0YXJ0ID0gc3RhcnQgPyBtb21lbnQuZHVyYXRpb24oc3RhcnQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0LmVuZCA9IGVuZCA/IG1vbWVudC5kdXJhdGlvbihlbmQpIDogbnVsbDsgLy8gd2lsbCBiZSBhIER1cmF0aW9uIG9yIG51bGwKCQkJb3V0Ll9yZWN1cnJpbmcgPSB0cnVlOyAvLyBvdXIgaW50ZXJuYWwgbWFya2VyCgkJfQoJCWVsc2UgewoKCQkJaWYgKHN0YXJ0KSB7CgkJCQlzdGFydCA9IHQubW9tZW50KHN0YXJ0KTsKCQkJCWlmICghc3RhcnQuaXNWYWxpZCgpKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoZW5kKSB7CgkJCQllbmQgPSB0Lm1vbWVudChlbmQpOwoJCQkJaWYgKCFlbmQuaXNWYWxpZCgpKSB7CgkJCQkJZW5kID0gbnVsbDsgLy8gbGV0IGRlZmF1bHRzIHRha2Ugb3ZlcgoJCQkJfQoJCQl9CgoJCQlhbGxEYXkgPSBpbnB1dC5hbGxEYXk7CgkJCWlmIChhbGxEYXkgPT09IHVuZGVmaW5lZCkgeyAvLyBzdGlsbCB1bmRlZmluZWQ/IGZhbGxiYWNrIHRvIGRlZmF1bHQKCQkJCWFsbERheSA9IGZpcnN0RGVmaW5lZCgKCQkJCQlzb3VyY2UgPyBzb3VyY2UuYWxsRGF5RGVmYXVsdCA6IHVuZGVmaW5lZCwKCQkJCQl0Lm9wdGlvbnMuYWxsRGF5RGVmYXVsdAoJCQkJKTsKCQkJCS8vIHN0aWxsIHVuZGVmaW5lZD8gbm9ybWFsaXplRXZlbnREYXRlcyB3aWxsIGNhbGN1bGF0ZSBpdAoJCQl9CgoJCQlhc3NpZ25EYXRlc1RvRXZlbnQoc3RhcnQsIGVuZCwgYWxsRGF5LCBvdXQpOwoJCX0KCgkJdC5ub3JtYWxpemVFdmVudChvdXQpOyAvLyBob29rIGZvciBleHRlcm5hbCB1c2UuIGEgcHJvdG90eXBlIG1ldGhvZAoKCQlyZXR1cm4gb3V0OwoJfQoJdC5idWlsZEV2ZW50RnJvbUlucHV0ID0gYnVpbGRFdmVudEZyb21JbnB1dDsKCgoJLy8gTm9ybWFsaXplcyBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0ZXMgdG8gdGhlIGdpdmVuIHBhcnRpYWxseS1mb3JtZWQgZXZlbnQgb2JqZWN0LgoJLy8gTk9URTogbXV0YXRlcyB0aGUgZ2l2ZW4gc3RhcnQvZW5kIG1vbWVudHMuIGRvZXMgbm90IG1ha2UgYSBjb3B5LgoJZnVuY3Rpb24gYXNzaWduRGF0ZXNUb0V2ZW50KHN0YXJ0LCBlbmQsIGFsbERheSwgZXZlbnQpIHsKCQlldmVudC5zdGFydCA9IHN0YXJ0OwoJCWV2ZW50LmVuZCA9IGVuZDsKCQlldmVudC5hbGxEYXkgPSBhbGxEYXk7CgkJbm9ybWFsaXplRXZlbnREYXRlcyhldmVudCk7CgkJYmFja3VwRXZlbnREYXRlcyhldmVudCk7Cgl9CgoKCS8vIEVuc3VyZXMgcHJvcGVyIHZhbHVlcyBmb3IgYWxsRGF5L3N0YXJ0L2VuZC4gQWNjZXB0cyBhbiBFdmVudCBvYmplY3QsIG9yIGEgcGxhaW4gb2JqZWN0IHdpdGggZXZlbnQtaXNoIHByb3BlcnRpZXMuCgkvLyBOT1RFOiBXaWxsIG1vZGlmeSB0aGUgZ2l2ZW4gb2JqZWN0LgoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnREYXRlcyhldmVudFByb3BzKSB7CgoJCW5vcm1hbGl6ZUV2ZW50VGltZXMoZXZlbnRQcm9wcyk7CgoJCWlmIChldmVudFByb3BzLmVuZCAmJiAhZXZlbnRQcm9wcy5lbmQuaXNBZnRlcihldmVudFByb3BzLnN0YXJ0KSkgewoJCQlldmVudFByb3BzLmVuZCA9IG51bGw7CgkJfQoKCQlpZiAoIWV2ZW50UHJvcHMuZW5kKSB7CgkJCWlmICh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uKSB7CgkJCQlldmVudFByb3BzLmVuZCA9IHQuZ2V0RGVmYXVsdEV2ZW50RW5kKGV2ZW50UHJvcHMuYWxsRGF5LCBldmVudFByb3BzLnN0YXJ0KTsKCQkJfQoJCQllbHNlIHsKCQkJCWV2ZW50UHJvcHMuZW5kID0gbnVsbDsKCQkJfQoJCX0KCX0KCgoJLy8gRW5zdXJlcyB0aGUgYWxsRGF5IHByb3BlcnR5IGV4aXN0cyBhbmQgdGhlIHRpbWVsaW5lc3Mgb2YgdGhlIHN0YXJ0L2VuZCBkYXRlcyBhcmUgY29uc2lzdGVudAoJZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRUaW1lcyhldmVudFByb3BzKSB7CgkJaWYgKGV2ZW50UHJvcHMuYWxsRGF5ID09IG51bGwpIHsKCQkJZXZlbnRQcm9wcy5hbGxEYXkgPSAhKGV2ZW50UHJvcHMuc3RhcnQuaGFzVGltZSgpIHx8IChldmVudFByb3BzLmVuZCAmJiBldmVudFByb3BzLmVuZC5oYXNUaW1lKCkpKTsKCQl9CgoJCWlmIChldmVudFByb3BzLmFsbERheSkgewoJCQlldmVudFByb3BzLnN0YXJ0LnN0cmlwVGltZSgpOwoJCQlpZiAoZXZlbnRQcm9wcy5lbmQpIHsKCQkJCS8vIFRPRE86IGNvbnNpZGVyIG5leHREYXlUaHJlc2hvbGQgaGVyZT8gSWYgc28sIHdpbGwgcmVxdWlyZSBhIGxvdCBvZiB0ZXN0aW5nIGFuZCBhZGp1c3RtZW50CgkJCQlldmVudFByb3BzLmVuZC5zdHJpcFRpbWUoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCFldmVudFByb3BzLnN0YXJ0Lmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5zdGFydCA9IHQuYXBwbHlUaW1lem9uZShldmVudFByb3BzLnN0YXJ0LnRpbWUoMCkpOyAvLyB3aWxsIGFzc2lnbiBhIDAwOjAwIHRpbWUKCQkJfQoJCQlpZiAoZXZlbnRQcm9wcy5lbmQgJiYgIWV2ZW50UHJvcHMuZW5kLmhhc1RpbWUoKSkgewoJCQkJZXZlbnRQcm9wcy5lbmQgPSB0LmFwcGx5VGltZXpvbmUoZXZlbnRQcm9wcy5lbmQudGltZSgwKSk7IC8vIHdpbGwgYXNzaWduIGEgMDA6MDAgdGltZQoJCQl9CgkJfQoJfQoKCgkvLyBJZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYSByZWN1cnJpbmcgZXZlbnQsIGJyZWFrIGl0IGRvd24gaW50byBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcy4KCS8vIElmIG5vdCBhIHJlY3VycmluZyBldmVudCwgcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHNpbmdsZSBvcmlnaW5hbCBldmVudC4KCS8vIElmIGdpdmVuIGEgZmFsc3kgaW5wdXQgKHByb2JhYmx5IGJlY2F1c2Ugb2YgYSBmYWlsZWQgYnVpbGRFdmVudEZyb21JbnB1dCBjYWxsKSwgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4KCS8vIEhBQ0s6IGNhbiBvdmVycmlkZSB0aGUgcmVjdXJyaW5nIHdpbmRvdyBieSBwcm92aWRpbmcgY3VzdG9tIHJhbmdlU3RhcnQvcmFuZ2VFbmQgKGZvciBidXNpbmVzc0hvdXJzKS4KCWZ1bmN0aW9uIGV4cGFuZEV2ZW50KGFic3RyYWN0RXZlbnQsIF9yYW5nZVN0YXJ0LCBfcmFuZ2VFbmQpIHsKCQl2YXIgZXZlbnRzID0gW107CgkJdmFyIGRvd0hhc2g7CgkJdmFyIGRvdzsKCQl2YXIgaTsKCQl2YXIgZGF0ZTsKCQl2YXIgc3RhcnRUaW1lLCBlbmRUaW1lOwoJCXZhciBzdGFydCwgZW5kOwoJCXZhciBldmVudDsKCgkJX3JhbmdlU3RhcnQgPSBfcmFuZ2VTdGFydCB8fCByYW5nZVN0YXJ0OwoJCV9yYW5nZUVuZCA9IF9yYW5nZUVuZCB8fCByYW5nZUVuZDsKCgkJaWYgKGFic3RyYWN0RXZlbnQpIHsKCQkJaWYgKGFic3RyYWN0RXZlbnQuX3JlY3VycmluZykgewoKCQkJCS8vIG1ha2UgYSBib29sZWFuIGhhc2ggYXMgdG8gd2hldGhlciB0aGUgZXZlbnQgb2NjdXJzIG9uIGVhY2ggZGF5LW9mLXdlZWsKCQkJCWlmICgoZG93ID0gYWJzdHJhY3RFdmVudC5kb3cpKSB7CgkJCQkJZG93SGFzaCA9IHt9OwoJCQkJCWZvciAoaSA9IDA7IGkgPCBkb3cubGVuZ3RoOyBpKyspIHsKCQkJCQkJZG93SGFzaFtkb3dbaV1dID0gdHJ1ZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGRheSBpbiB0aGUgY3VycmVudCByYW5nZQoJCQkJZGF0ZSA9IF9yYW5nZVN0YXJ0LmNsb25lKCkuc3RyaXBUaW1lKCk7IC8vIGhvbGRzIHRoZSBkYXRlIG9mIHRoZSBjdXJyZW50IGRheQoJCQkJd2hpbGUgKGRhdGUuaXNCZWZvcmUoX3JhbmdlRW5kKSkgewoKCQkJCQlpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXRlLmRheSgpXSkgeyAvLyBpZiBldmVyeWRheSwgb3IgdGhpcyBwYXJ0aWN1bGFyIGRheS1vZi13ZWVrCgoJCQkJCQlzdGFydFRpbWUgPSBhYnN0cmFjdEV2ZW50LnN0YXJ0OyAvLyB0aGUgc3RvcmVkIHN0YXJ0IGFuZCBlbmQgcHJvcGVydGllcyBhcmUgdGltZXMgKER1cmF0aW9ucykKCQkJCQkJZW5kVGltZSA9IGFic3RyYWN0RXZlbnQuZW5kOyAvLyAiCgkJCQkJCXN0YXJ0ID0gZGF0ZS5jbG9uZSgpOwoJCQkJCQllbmQgPSBudWxsOwoKCQkJCQkJaWYgKHN0YXJ0VGltZSkgewoJCQkJCQkJc3RhcnQgPSBzdGFydC50aW1lKHN0YXJ0VGltZSk7CgkJCQkJCX0KCQkJCQkJaWYgKGVuZFRpbWUpIHsKCQkJCQkJCWVuZCA9IGRhdGUuY2xvbmUoKS50aW1lKGVuZFRpbWUpOwoJCQkJCQl9CgoJCQkJCQlldmVudCA9ICQuZXh0ZW5kKHt9LCBhYnN0cmFjdEV2ZW50KTsgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsCgkJCQkJCWFzc2lnbkRhdGVzVG9FdmVudCgKCQkJCQkJCXN0YXJ0LCBlbmQsCgkJCQkJCQkhc3RhcnRUaW1lICYmICFlbmRUaW1lLCAvLyBhbGxEYXk/CgkJCQkJCQlldmVudAoJCQkJCQkpOwoJCQkJCQlldmVudHMucHVzaChldmVudCk7CgkJCQkJfQoKCQkJCQlkYXRlLmFkZCgxLCAnZGF5cycpOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJZXZlbnRzLnB1c2goYWJzdHJhY3RFdmVudCk7IC8vIHJldHVybiB0aGUgb3JpZ2luYWwgZXZlbnQuIHdpbGwgYmUgYSBvbmUtaXRlbSBhcnJheQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnRzOwoJfQoJdC5leHBhbmRFdmVudCA9IGV4cGFuZEV2ZW50OwoKCgoJLyogRXZlbnQgTW9kaWZpY2F0aW9uIE1hdGgKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gTW9kaWZpZXMgYW4gZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cyBieSBhcHBseWluZyB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KCS8vIFNwZWNpYWwgZGF0ZS1kaWZmaW5nIGxvZ2ljIGlzIHVzZWQgZm9yIG1hbmlwdWxhdGlvbiBvZiBkYXRlcy4KCS8vIElmIGBwcm9wc2AgZG9lcyBub3QgY29udGFpbiBzdGFydC9lbmQgZGF0ZXMsIHRoZSB1cGRhdGVkIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSB0aGUgZXZlbnQncyBjdXJyZW50IHN0YXJ0L2VuZC4KCS8vIEFsbCBkYXRlIGNvbXBhcmlzb25zIGFyZSBkb25lIGFnYWluc3QgdGhlIGV2ZW50J3MgcHJpc3RpbmUgX3N0YXJ0IGFuZCBfZW5kIGRhdGVzLgoJLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBkZWx0YSBpbmZvcm1hdGlvbiBhbmQgYSBmdW5jdGlvbiB0byB1bmRvIGFsbCBvcGVyYXRpb25zLgoJLy8gRm9yIG1ha2luZyBjb21wdXRhdGlvbnMgaW4gYSBncmFudWxhcml0eSBncmVhdGVyIHRoYW4gZGF5L3RpbWUsIHNwZWNpZnkgbGFyZ2VVbml0LgoJLy8gTk9URTogVGhlIGdpdmVuIGBuZXdQcm9wc2AgbWlnaHQgYmUgbXV0YXRlZCBmb3Igbm9ybWFsaXphdGlvbiBwdXJwb3Nlcy4KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50KGV2ZW50LCBuZXdQcm9wcywgbGFyZ2VVbml0KSB7CgkJdmFyIG1pc2NQcm9wcyA9IHt9OwoJCXZhciBvbGRQcm9wczsKCQl2YXIgY2xlYXJFbmQ7CgkJdmFyIHN0YXJ0RGVsdGE7CgkJdmFyIGVuZERlbHRhOwoJCXZhciBkdXJhdGlvbkRlbHRhOwoJCXZhciB1bmRvRnVuYzsKCgkJLy8gZGlmZnMgdGhlIGRhdGVzIGluIHRoZSBhcHByb3ByaWF0ZSB3YXksIHJldHVybmluZyBhIGR1cmF0aW9uCgkJZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUxLCBkYXRlMCkgeyAvLyBkYXRlMSAtIGRhdGUwCgkJCWlmIChsYXJnZVVuaXQpIHsKCQkJCXJldHVybiBkaWZmQnlVbml0KGRhdGUxLCBkYXRlMCwgbGFyZ2VVbml0KTsKCQkJfQoJCQllbHNlIGlmIChuZXdQcm9wcy5hbGxEYXkpIHsKCQkJCXJldHVybiBkaWZmRGF5KGRhdGUxLCBkYXRlMCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlyZXR1cm4gZGlmZkRheVRpbWUoZGF0ZTEsIGRhdGUwKTsKCQkJfQoJCX0KCgkJbmV3UHJvcHMgPSBuZXdQcm9wcyB8fCB7fTsKCgkJLy8gbm9ybWFsaXplIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcwoJCWlmICghbmV3UHJvcHMuc3RhcnQpIHsKCQkJbmV3UHJvcHMuc3RhcnQgPSBldmVudC5zdGFydC5jbG9uZSgpOwoJCX0KCQlpZiAobmV3UHJvcHMuZW5kID09PSB1bmRlZmluZWQpIHsKCQkJbmV3UHJvcHMuZW5kID0gZXZlbnQuZW5kID8gZXZlbnQuZW5kLmNsb25lKCkgOiBudWxsOwoJCX0KCQlpZiAobmV3UHJvcHMuYWxsRGF5ID09IG51bGwpIHsgLy8gaXMgbnVsbCBvciB1bmRlZmluZWQ/CgkJCW5ld1Byb3BzLmFsbERheSA9IGV2ZW50LmFsbERheTsKCQl9CgkJbm9ybWFsaXplRXZlbnREYXRlcyhuZXdQcm9wcyk7CgoJCS8vIGNyZWF0ZSBub3JtYWxpemVkIHZlcnNpb25zIG9mIHRoZSBvcmlnaW5hbCBwcm9wcyB0byBjb21wYXJlIGFnYWluc3QKCQkvLyBuZWVkIGEgcmVhbCBlbmQgdmFsdWUsIGZvciBkaWZmaW5nCgkJb2xkUHJvcHMgPSB7CgkJCXN0YXJ0OiBldmVudC5fc3RhcnQuY2xvbmUoKSwKCQkJZW5kOiBldmVudC5fZW5kID8gZXZlbnQuX2VuZC5jbG9uZSgpIDogdC5nZXREZWZhdWx0RXZlbnRFbmQoZXZlbnQuX2FsbERheSwgZXZlbnQuX3N0YXJ0KSwKCQkJYWxsRGF5OiBuZXdQcm9wcy5hbGxEYXkgLy8gbm9ybWFsaXplIHRoZSBkYXRlcyBpbiB0aGUgc2FtZSByZWdhcmQgYXMgdGhlIG5ldyBwcm9wZXJ0aWVzCgkJfTsKCQlub3JtYWxpemVFdmVudERhdGVzKG9sZFByb3BzKTsKCgkJLy8gbmVlZCB0byBjbGVhciB0aGUgZW5kIGRhdGUgaWYgZXhwbGljaXRseSBjaGFuZ2VkIHRvIG51bGwKCQljbGVhckVuZCA9IGV2ZW50Ll9lbmQgIT09IG51bGwgJiYgbmV3UHJvcHMuZW5kID09PSBudWxsOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBzdGFydCBkYXRlCgkJc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhuZXdQcm9wcy5zdGFydCwgb2xkUHJvcHMuc3RhcnQpOwoKCQkvLyBjb21wdXRlIHRoZSBkZWx0YSBmb3IgbW92aW5nIHRoZSBlbmQgZGF0ZQoJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJZW5kRGVsdGEgPSBkaWZmRGF0ZXMobmV3UHJvcHMuZW5kLCBvbGRQcm9wcy5lbmQpOwoJCQlkdXJhdGlvbkRlbHRhID0gZW5kRGVsdGEuc3VidHJhY3Qoc3RhcnREZWx0YSk7CgkJfQoJCWVsc2UgewoJCQlkdXJhdGlvbkRlbHRhID0gbnVsbDsKCQl9CgoJCS8vIGdhdGhlciBhbGwgbm9uLWRhdGUtcmVsYXRlZCBwcm9wZXJ0aWVzCgkJJC5lYWNoKG5ld1Byb3BzLCBmdW5jdGlvbihuYW1lLCB2YWwpIHsKCQkJaWYgKGlzTWlzY0V2ZW50UHJvcE5hbWUobmFtZSkpIHsKCQkJCWlmICh2YWwgIT09IHVuZGVmaW5lZCkgewoJCQkJCW1pc2NQcm9wc1tuYW1lXSA9IHZhbDsKCQkJCX0KCQkJfQoJCX0pOwoKCQkvLyBhcHBseSB0aGUgb3BlcmF0aW9ucyB0byB0aGUgZXZlbnQgYW5kIGFsbCByZWxhdGVkIGV2ZW50cwoJCXVuZG9GdW5jID0gbXV0YXRlRXZlbnRzKAoJCQljbGllbnRFdmVudHMoZXZlbnQuX2lkKSwgLy8gZ2V0IGV2ZW50cyB3aXRoIHRoaXMgSUQKCQkJY2xlYXJFbmQsCgkJCW5ld1Byb3BzLmFsbERheSwKCQkJc3RhcnREZWx0YSwKCQkJZHVyYXRpb25EZWx0YSwKCQkJbWlzY1Byb3BzCgkJKTsKCgkJcmV0dXJuIHsKCQkJZGF0ZURlbHRhOiBzdGFydERlbHRhLAoJCQlkdXJhdGlvbkRlbHRhOiBkdXJhdGlvbkRlbHRhLAoJCQl1bmRvOiB1bmRvRnVuYwoJCX07Cgl9CgoKCS8vIE1vZGlmaWVzIGFuIGFycmF5IG9mIGV2ZW50cyBpbiB0aGUgZm9sbG93aW5nIHdheXMgKG9wZXJhdGlvbnMgYXJlIGluIG9yZGVyKToKCS8vIC0gY2xlYXIgdGhlIGV2ZW50J3MgYGVuZGAKCS8vIC0gY29udmVydCB0aGUgZXZlbnQgdG8gYWxsRGF5CgkvLyAtIGFkZCBgZGF0ZURlbHRhYCB0byB0aGUgc3RhcnQgYW5kIGVuZAoJLy8gLSBhZGQgYGR1cmF0aW9uRGVsdGFgIHRvIHRoZSBldmVudCdzIGR1cmF0aW9uCgkvLyAtIGFzc2lnbiBgbWlzY1Byb3BzYCB0byB0aGUgZXZlbnQKCS8vCgkvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHVuZG8gYWxsIHRoZSBvcGVyYXRpb25zLgoJLy8KCS8vIFRPRE86IGRvbid0IHVzZSBzbyBtYW55IGNsb3N1cmVzLiBwb3NzaWJsZSBtZW1vcnkgaXNzdWVzIHdoZW4gbG90cyBvZiBldmVudHMgd2l0aCBzYW1lIElELgoJLy8KCWZ1bmN0aW9uIG11dGF0ZUV2ZW50cyhldmVudHMsIGNsZWFyRW5kLCBhbGxEYXksIGRhdGVEZWx0YSwgZHVyYXRpb25EZWx0YSwgbWlzY1Byb3BzKSB7CgkJdmFyIGlzQW1iaWdUaW1lem9uZSA9IHQuZ2V0SXNBbWJpZ1RpbWV6b25lKCk7CgkJdmFyIHVuZG9GdW5jdGlvbnMgPSBbXTsKCgkJLy8gbm9ybWFsaXplIHplcm8tbGVuZ3RoIGRlbHRhcyB0byBiZSBudWxsCgkJaWYgKGRhdGVEZWx0YSAmJiAhZGF0ZURlbHRhLnZhbHVlT2YoKSkgeyBkYXRlRGVsdGEgPSBudWxsOyB9CgkJaWYgKGR1cmF0aW9uRGVsdGEgJiYgIWR1cmF0aW9uRGVsdGEudmFsdWVPZigpKSB7IGR1cmF0aW9uRGVsdGEgPSBudWxsOyB9CgoJCSQuZWFjaChldmVudHMsIGZ1bmN0aW9uKGksIGV2ZW50KSB7CgkJCXZhciBvbGRQcm9wczsKCQkJdmFyIG5ld1Byb3BzOwoKCQkJLy8gYnVpbGQgYW4gb2JqZWN0IGhvbGRpbmcgYWxsIHRoZSBvbGQgdmFsdWVzLCBib3RoIGRhdGUtcmVsYXRlZCBhbmQgbWlzYy4KCQkJLy8gZm9yIHRoZSB1bmRvIGZ1bmN0aW9uLgoJCQlvbGRQcm9wcyA9IHsKCQkJCXN0YXJ0OiBldmVudC5zdGFydC5jbG9uZSgpLAoJCQkJZW5kOiBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGwsCgkJCQlhbGxEYXk6IGV2ZW50LmFsbERheQoJCQl9OwoJCQkkLmVhY2gobWlzY1Byb3BzLCBmdW5jdGlvbihuYW1lKSB7CgkJCQlvbGRQcm9wc1tuYW1lXSA9IGV2ZW50W25hbWVdOwoJCQl9KTsKCgkJCS8vIG5ldyBkYXRlLXJlbGF0ZWQgcHJvcGVydGllcy4gd29yayBvZmYgdGhlIG9yaWdpbmFsIGRhdGUgc25hcHNob3QuCgkJCS8vIG9rIHRvIHVzZSByZWZlcmVuY2VzIGJlY2F1c2UgdGhleSB3aWxsIGJlIHRocm93biBhd2F5IHdoZW4gYmFja3VwRXZlbnREYXRlcyBpcyBjYWxsZWQuCgkJCW5ld1Byb3BzID0gewoJCQkJc3RhcnQ6IGV2ZW50Ll9zdGFydCwKCQkJCWVuZDogZXZlbnQuX2VuZCwKCQkJCWFsbERheTogYWxsRGF5IC8vIG5vcm1hbGl6ZSB0aGUgZGF0ZXMgaW4gdGhlIHNhbWUgcmVnYXJkIGFzIHRoZSBuZXcgcHJvcGVydGllcwoJCQl9OwoJCQlub3JtYWxpemVFdmVudERhdGVzKG5ld1Byb3BzKTsgLy8gbWFzc2FnZXMgc3RhcnQvZW5kL2FsbERheQoKCQkJLy8gc3RyaXAgb3IgZW5zdXJlIHRoZSBlbmQgZGF0ZQoJCQlpZiAoY2xlYXJFbmQpIHsKCQkJCW5ld1Byb3BzLmVuZCA9IG51bGw7CgkJCX0KCQkJZWxzZSBpZiAoZHVyYXRpb25EZWx0YSAmJiAhbmV3UHJvcHMuZW5kKSB7IC8vIHRoZSBkdXJhdGlvbiB0cmFuc2xhdGlvbiByZXF1aXJlcyBhbiBlbmQgZGF0ZQoJCQkJbmV3UHJvcHMuZW5kID0gdC5nZXREZWZhdWx0RXZlbnRFbmQobmV3UHJvcHMuYWxsRGF5LCBuZXdQcm9wcy5zdGFydCk7CgkJCX0KCgkJCWlmIChkYXRlRGVsdGEpIHsKCQkJCW5ld1Byb3BzLnN0YXJ0LmFkZChkYXRlRGVsdGEpOwoJCQkJaWYgKG5ld1Byb3BzLmVuZCkgewoJCQkJCW5ld1Byb3BzLmVuZC5hZGQoZGF0ZURlbHRhKTsKCQkJCX0KCQkJfQoKCQkJaWYgKGR1cmF0aW9uRGVsdGEpIHsKCQkJCW5ld1Byb3BzLmVuZC5hZGQoZHVyYXRpb25EZWx0YSk7IC8vIGVuZCBhbHJlYWR5IGVuc3VyZWQgYWJvdmUKCQkJfQoKCQkJLy8gaWYgdGhlIGRhdGVzIGhhdmUgY2hhbmdlZCwgYW5kIHdlIGtub3cgaXQgaXMgaW1wb3NzaWJsZSB0byByZWNvbXB1dGUgdGhlCgkJCS8vIHRpbWV6b25lIG9mZnNldHMsIHN0cmlwIHRoZSB6b25lLgoJCQlpZiAoCgkJCQlpc0FtYmlnVGltZXpvbmUgJiYKCQkJCSFuZXdQcm9wcy5hbGxEYXkgJiYKCQkJCShkYXRlRGVsdGEgfHwgZHVyYXRpb25EZWx0YSkKCQkJKSB7CgkJCQluZXdQcm9wcy5zdGFydC5zdHJpcFpvbmUoKTsKCQkJCWlmIChuZXdQcm9wcy5lbmQpIHsKCQkJCQluZXdQcm9wcy5lbmQuc3RyaXBab25lKCk7CgkJCQl9CgkJCX0KCgkJCSQuZXh0ZW5kKGV2ZW50LCBtaXNjUHJvcHMsIG5ld1Byb3BzKTsgLy8gY29weSBvdmVyIG1pc2MgcHJvcHMsIHRoZW4gZGF0ZS1yZWxhdGVkIHByb3BzCgkJCWJhY2t1cEV2ZW50RGF0ZXMoZXZlbnQpOyAvLyByZWdlbmVyYXRlIGludGVybmFsIF9zdGFydC9fZW5kL19hbGxEYXkKCgkJCXVuZG9GdW5jdGlvbnMucHVzaChmdW5jdGlvbigpIHsKCQkJCSQuZXh0ZW5kKGV2ZW50LCBvbGRQcm9wcyk7CgkJCQliYWNrdXBFdmVudERhdGVzKGV2ZW50KTsgLy8gcmVnZW5lcmF0ZSBpbnRlcm5hbCBfc3RhcnQvX2VuZC9fYWxsRGF5CgkJCX0pOwoJCX0pOwoKCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdW5kb0Z1bmN0aW9ucy5sZW5ndGg7IGkrKykgewoJCQkJdW5kb0Z1bmN0aW9uc1tpXSgpOwoJCQl9CgkJfTsKCX0KCgoJdC5nZXRFdmVudENhY2hlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGNhY2hlOwoJfTsKCn0KCgovLyBob29rIGZvciBleHRlcm5hbCBsaWJzIHRvIG1hbmlwdWxhdGUgZXZlbnQgcHJvcGVydGllcyB1cG9uIGNyZWF0aW9uLgovLyBzaG91bGQgbWFuaXB1bGF0ZSB0aGUgZXZlbnQgaW4tcGxhY2UuCkNhbGVuZGFyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7Cn07CgoKLy8gRG9lcyB0aGUgZ2l2ZW4gc3BhbiAoc3RhcnQsIGVuZCwgYW5kIG90aGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uKQovLyBmdWxseSBjb250YWluIHRoZSBvdGhlcj8KQ2FsZW5kYXIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewoJdmFyIGV2ZW50U3RhcnQgPSBvdXRlclNwYW4uc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQob3V0ZXJTcGFuKS5zdHJpcFpvbmUoKTsKCglyZXR1cm4gaW5uZXJTcGFuLnN0YXJ0ID49IGV2ZW50U3RhcnQgJiYgaW5uZXJTcGFuLmVuZCA8PSBldmVudEVuZDsKfTsKCgovLyBSZXR1cm5zIGEgbGlzdCBvZiBldmVudHMgdGhhdCB0aGUgZ2l2ZW4gZXZlbnQgc2hvdWxkIGJlIGNvbXBhcmVkIGFnYWluc3Qgd2hlbiBiZWluZyBjb25zaWRlcmVkIGZvciBhIG1vdmUgdG8KLy8gdGhlIHNwZWNpZmllZCBzcGFuLiBBdHRhY2hlZCB0byB0aGUgQ2FsZW5kYXIncyBwcm90b3R5cGUgYmVjYXVzZSBFdmVudE1hbmFnZXIgaXMgYSBtaXhpbiBmb3IgYSBDYWxlbmRhci4KQ2FsZW5kYXIucHJvdG90eXBlLmdldFBlZXJFdmVudHMgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIGNhY2hlID0gdGhpcy5nZXRFdmVudENhY2hlKCk7Cgl2YXIgcGVlckV2ZW50cyA9IFtdOwoJdmFyIGksIG90aGVyRXZlbnQ7CgoJZm9yIChpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7CgkJb3RoZXJFdmVudCA9IGNhY2hlW2ldOwoJCWlmICgKCQkJIWV2ZW50IHx8CgkJCWV2ZW50Ll9pZCAhPT0gb3RoZXJFdmVudC5faWQgLy8gZG9uJ3QgY29tcGFyZSB0aGUgZXZlbnQgdG8gaXRzZWxmIG9yIG90aGVyIHJlbGF0ZWQgW3JlcGVhdGluZ10gZXZlbnRzCgkJKSB7CgkJCXBlZXJFdmVudHMucHVzaChvdGhlckV2ZW50KTsKCQl9Cgl9CgoJcmV0dXJuIHBlZXJFdmVudHM7Cn07CgoKLy8gdXBkYXRlcyB0aGUgImJhY2t1cCIgcHJvcGVydGllcywgd2hpY2ggYXJlIHByZXNlcnZlZCBpbiBvcmRlciB0byBjb21wdXRlIGRpZmZzIGxhdGVyIG9uLgpmdW5jdGlvbiBiYWNrdXBFdmVudERhdGVzKGV2ZW50KSB7CglldmVudC5fYWxsRGF5ID0gZXZlbnQuYWxsRGF5OwoJZXZlbnQuX3N0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKTsKCWV2ZW50Ll9lbmQgPSBldmVudC5lbmQgPyBldmVudC5lbmQuY2xvbmUoKSA6IG51bGw7Cn0KCgovKiBPdmVybGFwcGluZyAvIENvbnN0cmFpbmluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKLy8gRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgY2FuIGJlIHJlbG9jYXRlZCB0byB0aGUgZ2l2ZW4gc3BhbiAodW56b25lZCBzdGFydC9lbmQgd2l0aCBvdGhlciBtaXNjIGRhdGEpCkNhbGVuZGFyLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQgPSBmdW5jdGlvbihzcGFuLCBldmVudCkgewoJdmFyIHNvdXJjZSA9IGV2ZW50LnNvdXJjZSB8fCB7fTsKCgl2YXIgY29uc3RyYWludCA9IGZpcnN0RGVmaW5lZCgKCQlldmVudC5jb25zdHJhaW50LAoJCXNvdXJjZS5jb25zdHJhaW50LAoJCXRoaXMub3B0aW9ucy5ldmVudENvbnN0cmFpbnQKCSk7CgoJdmFyIG92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJZXZlbnQub3ZlcmxhcCwKCQlzb3VyY2Uub3ZlcmxhcCwKCQl0aGlzLm9wdGlvbnMuZXZlbnRPdmVybGFwCgkpOwoKCXJldHVybiB0aGlzLmlzU3BhbkFsbG93ZWQoc3BhbiwgY29uc3RyYWludCwgb3ZlcmxhcCwgZXZlbnQpICYmCgkJKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyB8fCB0aGlzLm9wdGlvbnMuZXZlbnRBbGxvdyhzcGFuLCBldmVudCkgIT09IGZhbHNlKTsKfTsKCgovLyBEZXRlcm1pbmVzIGlmIGFuIGV4dGVybmFsIGV2ZW50IGNhbiBiZSByZWxvY2F0ZWQgdG8gdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKQpDYWxlbmRhci5wcm90b3R5cGUuaXNFeHRlcm5hbFNwYW5BbGxvd2VkID0gZnVuY3Rpb24oZXZlbnRTcGFuLCBldmVudExvY2F0aW9uLCBldmVudFByb3BzKSB7Cgl2YXIgZXZlbnRJbnB1dDsKCXZhciBldmVudDsKCgkvLyBub3RlOiB2ZXJ5IHNpbWlsYXIgbG9naWMgaXMgaW4gVmlldydzIHJlcG9ydEV4dGVybmFsRHJvcAoJaWYgKGV2ZW50UHJvcHMpIHsKCQlldmVudElucHV0ID0gJC5leHRlbmQoe30sIGV2ZW50UHJvcHMsIGV2ZW50TG9jYXRpb24pOwoJCWV2ZW50ID0gdGhpcy5leHBhbmRFdmVudCgKCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGV2ZW50SW5wdXQpCgkJKVswXTsKCX0KCglpZiAoZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5pc0V2ZW50U3BhbkFsbG93ZWQoZXZlbnRTcGFuLCBldmVudCk7Cgl9CgllbHNlIHsgLy8gdHJlYXQgaXQgYXMgYSBzZWxlY3Rpb24KCgkJcmV0dXJuIHRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChldmVudFNwYW4pOwoJfQp9OwoKCi8vIERldGVybWluZXMgdGhlIGdpdmVuIHNwYW4gKHVuem9uZWQgc3RhcnQvZW5kIHdpdGggb3RoZXIgbWlzYyBkYXRhKSBjYW4gYmUgc2VsZWN0ZWQuCkNhbGVuZGFyLnByb3RvdHlwZS5pc1NlbGVjdGlvblNwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbikgewoJcmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZChzcGFuLCB0aGlzLm9wdGlvbnMuc2VsZWN0Q29uc3RyYWludCwgdGhpcy5vcHRpb25zLnNlbGVjdE92ZXJsYXApICYmCgkJKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3cgfHwgdGhpcy5vcHRpb25zLnNlbGVjdEFsbG93KHNwYW4pICE9PSBmYWxzZSk7Cn07CgoKLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzcGFuIChjYXVzZWQgYnkgYW4gZXZlbnQgZHJvcC9yZXNpemUgb3IgYSBzZWxlY3Rpb24pIGlzIGFsbG93ZWQgdG8gZXhpc3QKLy8gYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50L292ZXJsYXAgc2V0dGluZ3MuCi8vIGBldmVudGAgaXMgbm90IHJlcXVpcmVkIGlmIGNoZWNraW5nIGEgc2VsZWN0aW9uLgpDYWxlbmRhci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZCA9IGZ1bmN0aW9uKHNwYW4sIGNvbnN0cmFpbnQsIG92ZXJsYXAsIGV2ZW50KSB7Cgl2YXIgY29uc3RyYWludEV2ZW50czsKCXZhciBhbnlDb250YWlubWVudDsKCXZhciBwZWVyRXZlbnRzOwoJdmFyIGksIHBlZXJFdmVudDsKCXZhciBwZWVyT3ZlcmxhcDsKCgkvLyB0aGUgcmFuZ2UgbXVzdCBiZSBmdWxseSBjb250YWluZWQgYnkgYXQgbGVhc3Qgb25lIG9mIHByb2R1Y2VkIGNvbnN0cmFpbnQgZXZlbnRzCglpZiAoY29uc3RyYWludCAhPSBudWxsKSB7CgoJCS8vIG5vdCB0cmVhdGVkIGFzIGFuIGV2ZW50ISBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUKCQkvLyBUT0RPOiB1c2UgcmFuZ2VzIGluIHRoZSBmdXR1cmUKCQljb25zdHJhaW50RXZlbnRzID0gdGhpcy5jb25zdHJhaW50VG9FdmVudHMoY29uc3RyYWludCk7CgkJaWYgKGNvbnN0cmFpbnRFdmVudHMpIHsgLy8gbm90IGludmFsaWQKCgkJCWFueUNvbnRhaW5tZW50ID0gZmFsc2U7CgkJCWZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50RXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCQlpZiAodGhpcy5zcGFuQ29udGFpbnNTcGFuKGNvbnN0cmFpbnRFdmVudHNbaV0sIHNwYW4pKSB7CgkJCQkJYW55Q29udGFpbm1lbnQgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAoIWFueUNvbnRhaW5tZW50KSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CgoJcGVlckV2ZW50cyA9IHRoaXMuZ2V0UGVlckV2ZW50cyhzcGFuLCBldmVudCk7CgoJZm9yIChpID0gMDsgaSA8IHBlZXJFdmVudHMubGVuZ3RoOyBpKyspICB7CgkJcGVlckV2ZW50ID0gcGVlckV2ZW50c1tpXTsKCgkJLy8gdGhlcmUgbmVlZHMgdG8gYmUgYW4gYWN0dWFsIGludGVyc2VjdGlvbiBiZWZvcmUgZGlzYWxsb3dpbmcgYW55dGhpbmcKCQlpZiAodGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShwZWVyRXZlbnQsIHNwYW4pKSB7CgoJCQkvLyBldmFsdWF0ZSBvdmVybGFwIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIHNob3J0LWNpcmN1aXQgaWYgbmVjZXNzYXJ5CgkJCWlmIChvdmVybGFwID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCS8vIGlmIHRoZSBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBwZWVyIGV2ZW50IGluIHF1ZXN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbQoJCQllbHNlIGlmICh0eXBlb2Ygb3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhb3ZlcmxhcChwZWVyRXZlbnQsIGV2ZW50KSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQkvLyBpZiB3ZSBhcmUgY29tcHV0aW5nIGlmIHRoZSBnaXZlbiByYW5nZSBpcyBhbGxvd2FibGUgZm9yIGFuIGV2ZW50LCBjb25zaWRlciB0aGUgb3RoZXIgZXZlbnQncwoJCQkvLyBFdmVudE9iamVjdC1zcGVjaWZpYyBvciBTb3VyY2Utc3BlY2lmaWMgYG92ZXJsYXBgIHByb3BlcnR5CgkJCWlmIChldmVudCkgewoJCQkJcGVlck92ZXJsYXAgPSBmaXJzdERlZmluZWQoCgkJCQkJcGVlckV2ZW50Lm92ZXJsYXAsCgkJCQkJKHBlZXJFdmVudC5zb3VyY2UgfHwge30pLm92ZXJsYXAKCQkJCQkvLyB3ZSBhbHJlYWR5IGNvbnNpZGVyZWQgdGhlIGdsb2JhbCBgZXZlbnRPdmVybGFwYAoJCQkJKTsKCQkJCWlmIChwZWVyT3ZlcmxhcCA9PT0gZmFsc2UpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkvLyBpZiB0aGUgcGVlciBldmVudCdzIG92ZXJsYXAgaXMgYSB0ZXN0IGZ1bmN0aW9uLCBwYXNzIHRoZSBzdWJqZWN0IGV2ZW50IGFzIHRoZSBmaXJzdCBwYXJhbQoJCQkJaWYgKHR5cGVvZiBwZWVyT3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyAmJiAhcGVlck92ZXJsYXAoZXZlbnQsIHBlZXJFdmVudCkpIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn07CgoKLy8gR2l2ZW4gYW4gZXZlbnQgaW5wdXQgZnJvbSB0aGUgQVBJLCBwcm9kdWNlcyBhbiBhcnJheSBvZiBldmVudCBvYmplY3RzLiBQb3NzaWJsZSBldmVudCBpbnB1dHM6Ci8vICdidXNpbmVzc0hvdXJzJwovLyBBbiBldmVudCBJRCAobnVtYmVyIG9yIHN0cmluZykKLy8gQW4gb2JqZWN0IHdpdGggc3BlY2lmaWMgc3RhcnQvZW5kIGRhdGVzIG9yIGEgcmVjdXJyaW5nIGV2ZW50IChsaWtlIHdoYXQgYnVzaW5lc3NIb3VycyBhY2NlcHRzKQpDYWxlbmRhci5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzID0gZnVuY3Rpb24oY29uc3RyYWludElucHV0KSB7CgoJaWYgKGNvbnN0cmFpbnRJbnB1dCA9PT0gJ2J1c2luZXNzSG91cnMnKSB7CgkJcmV0dXJuIHRoaXMuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cygpOwoJfQoKCWlmICh0eXBlb2YgY29uc3RyYWludElucHV0ID09PSAnb2JqZWN0JykgewoJCWlmIChjb25zdHJhaW50SW5wdXQuc3RhcnQgIT0gbnVsbCkgeyAvLyBuZWVkcyB0byBiZSBldmVudC1saWtlIGlucHV0CgkJCXJldHVybiB0aGlzLmV4cGFuZEV2ZW50KHRoaXMuYnVpbGRFdmVudEZyb21JbnB1dChjb25zdHJhaW50SW5wdXQpKTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkCgkJfQoJfQoKCXJldHVybiB0aGlzLmNsaWVudEV2ZW50cyhjb25zdHJhaW50SW5wdXQpOyAvLyBwcm9iYWJseSBhbiBJRAp9OwoKCi8vIERvZXMgdGhlIGV2ZW50J3MgZGF0ZSByYW5nZSBpbnRlcnNlY3Qgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2U/Ci8vIHN0YXJ0L2VuZCBhbHJlYWR5IGFzc3VtZWQgdG8gaGF2ZSBzdHJpcHBlZCB6b25lcyA6KApDYWxlbmRhci5wcm90b3R5cGUuZXZlbnRJbnRlcnNlY3RzUmFuZ2UgPSBmdW5jdGlvbihldmVudCwgcmFuZ2UpIHsKCXZhciBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKTsKCXZhciBldmVudEVuZCA9IHRoaXMuZ2V0RXZlbnRFbmQoZXZlbnQpLnN0cmlwWm9uZSgpOwoKCXJldHVybiByYW5nZS5zdGFydCA8IGV2ZW50RW5kICYmIHJhbmdlLmVuZCA+IGV2ZW50U3RhcnQ7Cn07CgoKLyogQnVzaW5lc3MgSG91cnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdmFyIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMgPSB7CglpZDogJ19mY0J1c2luZXNzSG91cnMnLCAvLyB3aWxsIHJlbGF0ZSBldmVudHMgZnJvbSBkaWZmZXJlbnQgY2FsbHMgdG8gZXhwYW5kRXZlbnQKCXN0YXJ0OiAnMDk6MDAnLAoJZW5kOiAnMTc6MDAnLAoJZG93OiBbIDEsIDIsIDMsIDQsIDUgXSwgLy8gbW9uZGF5IC0gZnJpZGF5CglyZW5kZXJpbmc6ICdpbnZlcnNlLWJhY2tncm91bmQnCgkvLyBjbGFzc05hbWVzIGFyZSBkZWZpbmVkIGluIGJ1c2luZXNzSG91cnNTZWdDbGFzc2VzCn07CgovLyBSZXR1cm4gZXZlbnRzIG9iamVjdHMgZm9yIGJ1c2luZXNzIGhvdXJzIHdpdGhpbiB0aGUgY3VycmVudCB2aWV3LgovLyBBYnVzZSBvZiBvdXIgZXZlbnQgc3lzdGVtIDooCkNhbGVuZGFyLnByb3RvdHlwZS5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzID0gZnVuY3Rpb24od2hvbGVEYXkpIHsKCXJldHVybiB0aGlzLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIHRoaXMub3B0aW9ucy5idXNpbmVzc0hvdXJzKTsKfTsKCi8vIEdpdmVuIGEgcmF3IGlucHV0IHZhbHVlIGZyb20gb3B0aW9ucywgcmV0dXJuIGV2ZW50cyBvYmplY3RzIGZvciBidXNpbmVzcyBob3VycyB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldy4KQ2FsZW5kYXIucHJvdG90eXBlLmNvbXB1dGVCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXQpIHsKCWlmIChpbnB1dCA9PT0gdHJ1ZSkgewoJCXJldHVybiB0aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgWyB7fSBdKTsKCX0KCWVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdChpbnB1dCkpIHsKCQlyZXR1cm4gdGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMod2hvbGVEYXksIFsgaW5wdXQgXSk7Cgl9CgllbHNlIGlmICgkLmlzQXJyYXkoaW5wdXQpKSB7CgkJcmV0dXJuIHRoaXMuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzKHdob2xlRGF5LCBpbnB1dCwgdHJ1ZSk7Cgl9CgllbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn07CgovLyBpbnB1dHMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLy8gaWYgaWdub3JlTm9Eb3cgaXMgdHJ1ZSwgd2lsbCBpZ25vcmUgZW50cmllcyB0aGF0IGRvbid0IHNwZWNpZnkgYSBkYXktb2Ytd2VlayAoZG93KSBrZXkuCkNhbGVuZGFyLnByb3RvdHlwZS5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMgPSBmdW5jdGlvbih3aG9sZURheSwgaW5wdXRzLCBpZ25vcmVOb0RvdykgewoJdmFyIHZpZXcgPSB0aGlzLmdldFZpZXcoKTsKCXZhciBldmVudHMgPSBbXTsKCXZhciBpLCBpbnB1dDsKCglmb3IgKGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJaW5wdXQgPSBpbnB1dHNbaV07CgoJCWlmIChpZ25vcmVOb0RvdyAmJiAhaW5wdXQuZG93KSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJLy8gZ2l2ZSBkZWZhdWx0cy4gd2lsbCBtYWtlIGEgY29weQoJCWlucHV0ID0gJC5leHRlbmQoe30sIEJVU0lORVNTX0hPVVJfRVZFTlRfREVGQVVMVFMsIGlucHV0KTsKCgkJLy8gaWYgYSB3aG9sZS1kYXkgc2VyaWVzIGlzIHJlcXVlc3RlZCwgY2xlYXIgdGhlIHN0YXJ0L2VuZCB0aW1lcwoJCWlmICh3aG9sZURheSkgewoJCQlpbnB1dC5zdGFydCA9IG51bGw7CgkJCWlucHV0LmVuZCA9IG51bGw7CgkJfQoKCQlldmVudHMucHVzaC5hcHBseShldmVudHMsIC8vIGFwcGVuZAoJCQl0aGlzLmV4cGFuZEV2ZW50KAoJCQkJdGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KGlucHV0KSwKCQkJCXZpZXcuc3RhcnQsCgkJCQl2aWV3LmVuZAoJCQkpCgkJKTsKCX0KCglyZXR1cm4gZXZlbnRzOwp9OwoKOzsKCi8qIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGUgImJhc2ljIiB2aWV3cywgYXMgd2VsbCBhcyBtb250aCB2aWV3LiBSZW5kZXJzIG9uZSBvciBtb3JlIHJvd3Mgb2YgZGF5IGNlbGxzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXQgaXMgYSBtYW5hZ2VyIGZvciBhIERheUdyaWQgc3ViY29tcG9uZW50LCB3aGljaCBkb2VzIG1vc3Qgb2YgdGhlIGhlYXZ5IGxpZnRpbmcuCi8vIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB3aWR0aC9oZWlnaHQuCgp2YXIgQmFzaWNWaWV3ID0gRkMuQmFzaWNWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdGhlIGRheUdyaWQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZnJvbSAob3ZlcnJpZGFibGUgYnkgc3ViY2xhc3NlcykKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSBtYWluIHN1YmNvbXBvbmVudCB0aGF0IGRvZXMgbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZwoKCWRheU51bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSBkYXkgbnVtYmVycyBvbiBlYWNoIGRheSBjZWxsPwoJY29sV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgYWxvbmcgdGhlIHNpZGU/CgljZWxsV2Vla051bWJlcnNWaXNpYmxlOiBmYWxzZSwgLy8gZGlzcGxheSB3ZWVrIG51bWJlcnMgaW4gZGF5IGNlbGw/CgoJd2Vla051bWJlcldpZHRoOiBudWxsLCAvLyB3aWR0aCBvZiBhbGwgdGhlIHdlZWstbnVtYmVyIGNlbGxzIHJ1bm5pbmcgZG93biB0aGUgc2lkZQoKCWhlYWRDb250YWluZXJFbDogbnVsbCwgLy8gZGl2IHRoYXQgaG9sZCdzIHRoZSBkYXlHcmlkJ3MgcmVuZGVyZWQgZGF0ZSBoZWFkZXIKCWhlYWRSb3dFbDogbnVsbCwgLy8gdGhlIGZha2Ugcm93IGVsZW1lbnQgb2YgdGhlIGRheS1vZi13ZWVrIGhlYWRlcgoKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOwoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG5lZWRzLiBEcmF3cyBmcm9tIHRoaXMuZGF5R3JpZENsYXNzCglpbnN0YW50aWF0ZURheUdyaWQ6IGZ1bmN0aW9uKCkgewoJCS8vIGdlbmVyYXRlIGEgc3ViY2xhc3Mgb24gdGhlIGZseSB3aXRoIEJhc2ljVmlldy1zcGVjaWZpYyBiZWhhdmlvcgoJCS8vIFRPRE86IGNhY2hlIHRoaXMgc3ViY2xhc3MKCQl2YXIgc3ViY2xhc3MgPSB0aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoYmFzaWNEYXlHcmlkTWV0aG9kcyk7CgoJCXJldHVybiBuZXcgc3ViY2xhc3ModGhpcyk7Cgl9LAoKCgkvLyBTZXRzIHRoZSBkaXNwbGF5IHJhbmdlIGFuZCBjb21wdXRlcyBhbGwgbmVjZXNzYXJ5IGRhdGVzCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gY2FsbCB0aGUgc3VwZXItbWV0aG9kCgoJCXRoaXMuZGF5R3JpZC5icmVha09uV2Vla3MgPSAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHRoaXMuaW50ZXJ2YWxVbml0KTsgLy8gZG8gYmVmb3JlIHNldFJhbmdlCgkJdGhpcy5kYXlHcmlkLnNldFJhbmdlKHJhbmdlKTsKCX0sCgoKCS8vIENvbXB1dGUgdGhlIHZhbHVlIHRvIGZlZWQgaW50byBzZXRSYW5nZS4gT3ZlcnJpZGVzIHN1cGVyY2xhc3MuCgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBWaWV3LnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLCBkYXRlKTsgLy8gZ2V0IHZhbHVlIGZyb20gdGhlIHN1cGVyLW1ldGhvZAoKCQkvLyB5ZWFyIGFuZCBtb250aCB2aWV3cyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHdlZWtzLiB0aGlzIGlzIGFscmVhZHkgZG9uZSBmb3Igd2VlawoJCWlmICgveWVhcnxtb250aC8udGVzdChyYW5nZS5pbnRlcnZhbFVuaXQpKSB7CgkJCXJhbmdlLnN0YXJ0LnN0YXJ0T2YoJ3dlZWsnKTsKCQkJcmFuZ2Uuc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLnN0YXJ0KTsKCgkJCS8vIG1ha2UgZW5kLW9mLXdlZWsgaWYgbm90IGFscmVhZHkKCQkJaWYgKHJhbmdlLmVuZC53ZWVrZGF5KCkpIHsKCQkJCXJhbmdlLmVuZC5hZGQoMSwgJ3dlZWsnKS5zdGFydE9mKCd3ZWVrJyk7CgkJCQlyYW5nZS5lbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHJhbmdlLmVuZCwgLTEsIHRydWUpOyAvLyBleGNsdXNpdmVseSBtb3ZlIGJhY2t3YXJkcwoJCQl9CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBSZW5kZXJzIHRoZSB2aWV3IGludG8gYHRoaXMuZWxgLCB3aGljaCBzaG91bGQgYWxyZWFkeSBiZSBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmRheU51bWJlcnNWaXNpYmxlID0gdGhpcy5kYXlHcmlkLnJvd0NudCA+IDE7IC8vIFRPRE86IG1ha2UgZ3JpZCByZXNwb25zaWJsZQoJCWlmICh0aGlzLm9wdCgnd2Vla051bWJlcnMnKSkgewoJCQlpZiAodGhpcy5vcHQoJ3dlZWtOdW1iZXJzV2l0aGluRGF5cycpKSB7CgkJCQl0aGlzLmNlbGxXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSBmYWxzZTsKCQkJfQoJCQllbHNlIHsKCQkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSA9IGZhbHNlOwoJCQkJdGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUgPSB0cnVlOwoJCQl9OwoJCX0KCQl0aGlzLmRheUdyaWQubnVtYmVyc1Zpc2libGUgPSB0aGlzLmRheU51bWJlcnNWaXNpYmxlIHx8CgkJCXRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSB8fCB0aGlzLmNvbFdlZWtOdW1iZXJzVmlzaWJsZTsKCgkJdGhpcy5lbC5hZGRDbGFzcygnZmMtYmFzaWMtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIGRheUdyaWRDb250YWluZXJFbCA9IHRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoJ2ZjLWRheS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciBkYXlHcmlkRWwgPSAkKCc8ZGl2IGNsYXNzPSJmYy1kYXktZ3JpZCIgLz4nKS5hcHBlbmRUbyhkYXlHcmlkQ29udGFpbmVyRWwpOwoJCXRoaXMuZWwuZmluZCgnLmZjLWJvZHkgPiB0ciA+IHRkJykuYXBwZW5kKGRheUdyaWRDb250YWluZXJFbCk7CgoJCXRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KGRheUdyaWRFbCk7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKHRoaXMuaGFzUmlnaWRSb3dzKCkpOwoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMuZGF5R3JpZC5yZW5kZXJIZWFkSHRtbCgpKTsKCQl0aGlzLmhlYWRSb3dFbCA9IHRoaXMuaGVhZENvbnRhaW5lckVsLmZpbmQoJy5mYy1yb3cnKTsKCX0sCgoKCS8vIFVucmVuZGVycyB0aGUgY29udGVudCBvZiB0aGUgdmlldy4gU2luY2Ugd2UgaGF2ZW4ndCBzZXBhcmF0ZWQgc2tlbGV0b24gcmVuZGVyaW5nIGZyb20gZGF0ZSByZW5kZXJpbmcsCgkvLyBhbHdheXMgY29tcGxldGVseSBraWxsIHRoZSBkYXlHcmlkJ3MgcmVuZGVyaW5nLgoJdW5yZW5kZXJEYXRlczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCXRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpOwoJfSwKCgoJcmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJfSwKCgoJLy8gQnVpbGRzIHRoZSBIVE1MIHNrZWxldG9uIGZvciB0aGUgdmlldy4KCS8vIFRoZSBkYXktZ3JpZCBjb21wb25lbnQgd2lsbCByZW5kZXIgaW5zaWRlIG9mIGEgY29udGFpbmVyIGRlZmluZWQgYnkgdGhpcyBIVE1MLgoJcmVuZGVyU2tlbGV0b25IdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gJycgKwoJCQknPHRhYmxlPicgKwoJCQkJJzx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGhlYWQ+JyArCgkJCQknPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4nICsKCQkJCQknPHRyPicgKwoJCQkJCQknPHRkIGNsYXNzPSInICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgd2VlayBudW1iZXIgY29sdW1uLCBpZiBpdCBpcyBrbm93bgoJd2Vla051bWJlclN0eWxlQXR0cjogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMud2Vla051bWJlcldpZHRoICE9PSBudWxsKSB7CgkJCXJldHVybiAnc3R5bGU9IndpZHRoOicgKyB0aGlzLndlZWtOdW1iZXJXaWR0aCArICdweCInOwoJCX0KCQlyZXR1cm4gJyc7Cgl9LAoKCgkvLyBEZXRlcm1pbmVzIHdoZXRoZXIgZWFjaCByb3cgc2hvdWxkIGhhdmUgYSBjb25zdGFudCBoZWlnaHQKCWhhc1JpZ2lkUm93czogZnVuY3Rpb24oKSB7CgkJdmFyIGV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCXJldHVybiBldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ICE9PSAnbnVtYmVyJzsKCX0sCgoKCS8qIERpbWVuc2lvbnMKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCS8vIE1ha2Ugc3VyZSBhbGwgd2VlayBudW1iZXIgY2VsbHMgcnVubmluZyBkb3duIHRoZSBzaWRlIGhhdmUgdGhlIHNhbWUgd2lkdGguCgkJCS8vIFJlY29yZCB0aGUgd2lkdGggZm9yIGNlbGxzIGNyZWF0ZWQgbGF0ZXIuCgkJCXRoaXMud2Vla051bWJlcldpZHRoID0gbWF0Y2hDZWxsV2lkdGhzKAoJCQkJdGhpcy5lbC5maW5kKCcuZmMtd2Vlay1udW1iZXInKQoJCQkpOwoJCX0KCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0ID0gdGhpcy5vcHQoJ2V2ZW50TGltaXQnKTsKCQl2YXIgc2Nyb2xsZXJIZWlnaHQ7CgkJdmFyIHNjcm9sbGJhcldpZHRoczsKCgkJLy8gcmVzZXQgYWxsIGhlaWdodHMgdG8gYmUgbmF0dXJhbAoJCXRoaXMuc2Nyb2xsZXIuY2xlYXIoKTsKCQl1bmNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwpOwoKCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJLy8gaXMgdGhlIGV2ZW50IGxpbWl0IGEgY29uc3RhbnQgbGV2ZWwgbnVtYmVyPwoJCWlmIChldmVudExpbWl0ICYmIHR5cGVvZiBldmVudExpbWl0ID09PSAnbnVtYmVyJykgewoJCQl0aGlzLmRheUdyaWQubGltaXRSb3dzKGV2ZW50TGltaXQpOyAvLyBsaW1pdCB0aGUgbGV2ZWxzIGZpcnN0IHNvIHRoZSBoZWlnaHQgY2FuIHJlZGlzdHJpYnV0ZSBhZnRlcgoJCX0KCgkJLy8gZGlzdHJpYnV0ZSB0aGUgaGVpZ2h0IHRvIHRoZSByb3dzCgkJLy8gKHRvdGFsSGVpZ2h0IGlzIGEgInJlY29tbWVuZGVkIiB2YWx1ZSBpZiBpc0F1dG8pCgkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJdGhpcy5zZXRHcmlkSGVpZ2h0KHNjcm9sbGVySGVpZ2h0LCBpc0F1dG8pOwoKCQkvLyBpcyB0aGUgZXZlbnQgbGltaXQgZHluYW1pY2FsbHkgY2FsY3VsYXRlZD8KCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsgLy8gbGltaXQgdGhlIGxldmVscyBhZnRlciB0aGUgZ3JpZCdzIHJvdyBoZWlnaHRzIGhhdmUgYmVlbiBzZXQKCQl9CgoJCWlmICghaXNBdXRvKSB7IC8vIHNob3VsZCB3ZSBmb3JjZSBkaW1lbnNpb25zIG9mIHRoZSBzY3JvbGwgY29udGFpbmVyPwoKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCWNvbXBlbnNhdGVTY3JvbGwodGhpcy5oZWFkUm93RWwsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gZG9pbmcgdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjcmVhdGVkIHRleHQgb3ZlcmZsb3cgd2hpY2ggY3JlYXRlZCBtb3JlIGhlaWdodC4gcmVkbwoJCQkJc2Nyb2xsZXJIZWlnaHQgPSB0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCk7CgkJCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodChzY3JvbGxlckhlaWdodCk7CgkJCX0KCgkJCS8vIGd1YXJhbnRlZXMgdGhlIHNhbWUgc2Nyb2xsYmFyIHdpZHRocwoJCQl0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aHMpOwoJCX0KCX0sCgoKCS8vIGdpdmVuIGEgZGVzaXJlZCB0b3RhbCBoZWlnaHQgb2YgdGhlIHZpZXcsIHJldHVybnMgd2hhdCB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JvbGxlciBzaG91bGQgYmUKCWNvbXB1dGVTY3JvbGxlckhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQpIHsKCQlyZXR1cm4gdG90YWxIZWlnaHQgLQoJCQlzdWJ0cmFjdElubmVyRWxIZWlnaHQodGhpcy5lbCwgdGhpcy5zY3JvbGxlci5lbCk7IC8vIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCB0aGUgc2Nyb2xsZXIKCX0sCgoKCS8vIFNldHMgdGhlIGhlaWdodCBvZiBqdXN0IHRoZSBEYXlHcmlkIGNvbXBvbmVudCBpbiB0aGlzIHZpZXcKCXNldEdyaWRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgaXNBdXRvKSB7CgkJaWYgKGlzQXV0bykgewoJCQl1bmRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0Vscyk7IC8vIGxldCB0aGUgcm93cyBiZSB0aGVpciBuYXR1cmFsIGhlaWdodCB3aXRoIG5vIGV4cGFuZGluZwoJCX0KCQllbHNlIHsKCQkJZGlzdHJpYnV0ZUhlaWdodCh0aGlzLmRheUdyaWQucm93RWxzLCBoZWlnaHQsIHRydWUpOyAvLyB0cnVlID0gY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJCX0KCX0sCgoKCS8qIFNjcm9sbAoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJcXVlcnlTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwoJfSwKCgoJc2V0U2Nyb2xsOiBmdW5jdGlvbih0b3ApIHsKCQl0aGlzLnNjcm9sbGVyLnNldFNjcm9sbFRvcCh0b3ApOwoJfSwKCgoJLyogSGl0IEFyZWFzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJLy8gZm9yd2FyZCBhbGwgaGl0LXJlbGF0ZWQgbWV0aG9kIGNhbGxzIHRvIGRheUdyaWQKCgoJcHJlcGFyZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5wcmVwYXJlSGl0cygpOwoJfSwKCgoJcmVsZWFzZUhpdHM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC5yZWxlYXNlSGl0cygpOwoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCX0sCgoKCWdldEhpdFNwYW46IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3BhbihoaXQpOwoJfSwKCgoJZ2V0SGl0RWw6IGZ1bmN0aW9uKGhpdCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyB0aGUgZ2l2ZW4gZXZlbnRzIG9udG8gdGhlIHZpZXcgYW5kIHBvcHVsYXRlcyB0aGUgc2VnbWVudHMgYXJyYXkKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoKCQl0aGlzLnVwZGF0ZUhlaWdodCgpOyAvLyBtdXN0IGNvbXBlbnNhdGUgZm9yIGV2ZW50cyB0aGF0IG92ZXJmbG93IHRoZSByb3cKCX0sCgoKCS8vIFJldHJpZXZlcyBhbGwgc2VnbWVudCBvYmplY3RzIHRoYXQgYXJlIHJlbmRlcmVkIGluIHRoZSB2aWV3CglnZXRFdmVudFNlZ3M6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgYWxsIGV2ZW50IGVsZW1lbnRzIGFuZCBjbGVhcnMgaW50ZXJuYWwgc2VnbWVudCBkYXRhCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyRXZlbnRzKCk7CgoJCS8vIHdlIERPTidUIG5lZWQgdG8gY2FsbCB1cGRhdGVIZWlnaHQoKSBiZWNhdXNlCgkJLy8gYSByZW5kZXJFdmVudHMoKSBjYWxsIGFsd2F5cyBoYXBwZW5zIGFmdGVyIHRoaXMsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBjYWxsIHVwZGF0ZUhlaWdodCgpCgl9LAoKCgkvKiBEcmFnZ2luZyAoZm9yIGJvdGggZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCXJldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyhkcm9wTG9jYXRpb24sIHNlZyk7Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKTsKCX0sCgoKCS8qIFNlbGVjdGlvbgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uCglyZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKHNwYW4pIHsKCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJfSwKCgoJLy8gVW5yZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb25zIG9mIGEgc2VsZWN0aW9uCgl1bnJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5kYXlHcmlkLnVucmVuZGVyU2VsZWN0aW9uKCk7Cgl9Cgp9KTsKCgovLyBNZXRob2RzIHRoYXQgd2lsbCBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBiZWhhdmlvciBvZiB0aGUgQmFzaWNWaWV3J3MgZGF5R3JpZAp2YXIgYmFzaWNEYXlHcmlkTWV0aG9kcyA9IHsKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgd2lsbCBnbyBiZWZvcmUgdGhlIGRheS1vZiB3ZWVrIGhlYWRlciBjZWxscwoJcmVuZGVySGVhZEludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0aCBjbGFzcz0iZmMtd2Vlay1udW1iZXIgJyArIHZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiAnICsgdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPicgKwoJCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJaHRtbEVzY2FwZSh2aWV3Lm9wdCgnd2Vla051bWJlclRpdGxlJykpICsKCQkJCQknPC9zcGFuPicgKwoJCQkJJzwvdGg+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIGNvbnRlbnQtc2tlbGV0b24gY2VsbHMgdGhhdCBkaXNwbGF5IHRoZSBkYXkvd2VlayBudW1iZXJzCglyZW5kZXJOdW1iZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKHJvdykgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrU3RhcnQgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgMCk7CgoJCWlmICh2aWV3LmNvbFdlZWtOdW1iZXJzVmlzaWJsZSkgewoJCQlyZXR1cm4gJycgKwoJCQkJJzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcgKyB2aWV3LndlZWtOdW1iZXJTdHlsZUF0dHIoKSArICc+JyArCgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKCAvLyBhc2lkZSBmcm9tIGxpbmssIGltcG9ydGFudCBmb3IgbWF0Y2hDZWxsV2lkdGhzCgkJCQkJCXsgZGF0ZTogd2Vla1N0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA9PT0gMSB9LAoJCQkJCQl3ZWVrU3RhcnQuZm9ybWF0KCd3JykgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBkYXkgYmcgY2VsbHMgZm9yIGVhY2ggZGF5LXJvdwoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlpZiAodmlldy5jb2xXZWVrTnVtYmVyc1Zpc2libGUpIHsKCQkJcmV0dXJuICc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciICcgKwoJCQkJdmlldy53ZWVrTnVtYmVyU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCQl9CgoJCXJldHVybiAnJzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGV2ZXJ5IG90aGVyIHR5cGUgb2Ygcm93IGdlbmVyYXRlZCBieSBEYXlHcmlkLgoJLy8gQWZmZWN0cyBoZWxwZXItc2tlbGV0b24gYW5kIGhpZ2hsaWdodC1za2VsZXRvbiByb3dzLgoJcmVuZGVySW50cm9IdG1sOiBmdW5jdGlvbigpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCgkJaWYgKHZpZXcuY29sV2Vla051bWJlcnNWaXNpYmxlKSB7CgkJCXJldHVybiAnPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyArIHZpZXcud2Vla051bWJlclN0eWxlQXR0cigpICsgJz48L3RkPic7CgkJfQoKCQlyZXR1cm4gJyc7Cgl9Cgp9OwoKOzsKCi8qIEEgbW9udGggdmlldyB3aXRoIGRheSBjZWxscyBydW5uaW5nIGluIHJvd3MgKG9uZS1wZXItd2VlaykgYW5kIGNvbHVtbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2YXIgTW9udGhWaWV3ID0gRkMuTW9udGhWaWV3ID0gQmFzaWNWaWV3LmV4dGVuZCh7CgoJLy8gUHJvZHVjZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCByYW5nZSB0byBkaXNwbGF5Cgljb21wdXRlUmFuZ2U6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgcmFuZ2UgPSBCYXNpY1ZpZXcucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsIGRhdGUpOyAvLyBnZXQgdmFsdWUgZnJvbSBzdXBlci1tZXRob2QKCQl2YXIgcm93Q250OwoKCQkvLyBlbnN1cmUgNiB3ZWVrcwoJCWlmICh0aGlzLmlzRml4ZWRXZWVrcygpKSB7CgkJCXJvd0NudCA9IE1hdGguY2VpbChyYW5nZS5lbmQuZGlmZihyYW5nZS5zdGFydCwgJ3dlZWtzJywgdHJ1ZSkpOyAvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzCgkJCXJhbmdlLmVuZC5hZGQoNiAtIHJvd0NudCwgJ3dlZWtzJyk7CgkJfQoKCQlyZXR1cm4gcmFuZ2U7Cgl9LAoKCgkvLyBPdmVycmlkZXMgdGhlIGRlZmF1bHQgQmFzaWNWaWV3IGJlaGF2aW9yIHRvIGhhdmUgc3BlY2lhbCBtdWx0aS13ZWVrIGF1dG8taGVpZ2h0IGxvZ2ljCglzZXRHcmlkSGVpZ2h0OiBmdW5jdGlvbihoZWlnaHQsIGlzQXV0bykgewoKCQkvLyBpZiBhdXRvLCBtYWtlIHRoZSBoZWlnaHQgb2YgZWFjaCByb3cgdGhlIGhlaWdodCB0aGF0IGl0IHdvdWxkIGJlIGlmIHRoZXJlIHdlcmUgNiB3ZWVrcwoJCWlmIChpc0F1dG8pIHsKCQkJaGVpZ2h0ICo9IHRoaXMucm93Q250IC8gNjsKCQl9CgoJCWRpc3RyaWJ1dGVIZWlnaHQodGhpcy5kYXlHcmlkLnJvd0VscywgaGVpZ2h0LCAhaXNBdXRvKTsgLy8gaWYgYXV0bywgZG9uJ3QgY29tcGVuc2F0ZSBmb3IgaGVpZ2h0LWhvZ2dpbmcgcm93cwoJfSwKCgoJaXNGaXhlZFdlZWtzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5vcHQoJ2ZpeGVkV2Vla0NvdW50Jyk7Cgl9Cgp9KTsKCjs7CgpmY1ZpZXdzLmJhc2ljID0gewoJJ2NsYXNzJzogQmFzaWNWaWV3Cn07CgpmY1ZpZXdzLmJhc2ljRGF5ID0gewoJdHlwZTogJ2Jhc2ljJywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfQp9OwoKZmNWaWV3cy5iYXNpY1dlZWsgPSB7Cgl0eXBlOiAnYmFzaWMnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfQp9OwoKZmNWaWV3cy5tb250aCA9IHsKCSdjbGFzcyc6IE1vbnRoVmlldywKCWR1cmF0aW9uOiB7IG1vbnRoczogMSB9LCAvLyBpbXBvcnRhbnQgZm9yIHByZXYvbmV4dAoJZGVmYXVsdHM6IHsKCQlmaXhlZFdlZWtDb3VudDogdHJ1ZQoJfQp9Owo7OwoKLyogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBhZ2VuZGEtcmVsYXRlZCB2aWV3cy4gRGlzcGxheXMgb25lIG1vcmUgY29sdW1ucyB3aXRoIHRpbWUgc2xvdHMgcnVubmluZyB2ZXJ0aWNhbGx5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8gSXMgYSBtYW5hZ2VyIGZvciB0aGUgVGltZUdyaWQgc3ViY29tcG9uZW50IGFuZCBwb3NzaWJseSB0aGUgRGF5R3JpZCBzdWJjb21wb25lbnQgKGlmIGFsbERheVNsb3QgaXMgb24pLgovLyBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgd2lkdGgvaGVpZ2h0LgoKdmFyIEFnZW5kYVZpZXcgPSBGQy5BZ2VuZGFWaWV3ID0gVmlldy5leHRlbmQoewoKCXNjcm9sbGVyOiBudWxsLAoKCXRpbWVHcmlkQ2xhc3M6IFRpbWVHcmlkLCAvLyBjbGFzcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSB0aW1lR3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCXRpbWVHcmlkOiBudWxsLCAvLyB0aGUgbWFpbiB0aW1lLWdyaWQgc3ViY29tcG9uZW50IG9mIHRoaXMgdmlldwoKCWRheUdyaWRDbGFzczogRGF5R3JpZCwgLy8gY2xhc3MgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgZGF5R3JpZC4gc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKCWRheUdyaWQ6IG51bGwsIC8vIHRoZSAiYWxsLWRheSIgc3ViY29tcG9uZW50LiBpZiBhbGwtZGF5IGlzIHR1cm5lZCBvZmYsIHRoaXMgd2lsbCBiZSBudWxsCgoJYXhpc1dpZHRoOiBudWxsLCAvLyB0aGUgd2lkdGggb2YgdGhlIHRpbWUgYXhpcyBydW5uaW5nIGRvd24gdGhlIHNpZGUKCgloZWFkQ29udGFpbmVyRWw6IG51bGwsIC8vIGRpdiB0aGF0IGhvbGQncyB0aGUgdGltZUdyaWQncyByZW5kZXJlZCBkYXRlIGhlYWRlcgoJbm9TY3JvbGxSb3dFbHM6IG51bGwsIC8vIHNldCBvZiBmYWtlIHJvdyBlbGVtZW50cyB0aGF0IG11c3QgY29tcGVuc2F0ZSB3aGVuIHNjcm9sbGVyIGhhcyBzY3JvbGxiYXJzCgoJLy8gd2hlbiB0aGUgdGltZS1ncmlkIGlzbid0IHRhbGwgZW5vdWdoIHRvIG9jY3VweSB0aGUgZ2l2ZW4gaGVpZ2h0LCB3ZSByZW5kZXIgYW4gPGhyPiB1bmRlcm5lYXRoCglib3R0b21SdWxlRWw6IG51bGwsCgoKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKTsKCgkJaWYgKHRoaXMub3B0KCdhbGxEYXlTbG90JykpIHsgLy8gc2hvdWxkIHdlIGRpc3BsYXkgdGhlICJhbGwtZGF5IiBhcmVhPwoJCQl0aGlzLmRheUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlRGF5R3JpZCgpOyAvLyB0aGUgYWxsLWRheSBzdWJjb21wb25lbnQgb2YgdGhpcyB2aWV3CgkJfQoKCQl0aGlzLnNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKHsKCQkJb3ZlcmZsb3dYOiAnaGlkZGVuJywKCQkJb3ZlcmZsb3dZOiAnYXV0bycKCQl9KTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgVGltZUdyaWQgb2JqZWN0IHRoaXMgdmlldyBuZWVkcy4gRHJhd3MgZnJvbSB0aGlzLnRpbWVHcmlkQ2xhc3MKCWluc3RhbnRpYXRlVGltZUdyaWQ6IGZ1bmN0aW9uKCkgewoJCXZhciBzdWJjbGFzcyA9IHRoaXMudGltZUdyaWRDbGFzcy5leHRlbmQoYWdlbmRhVGltZUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8vIEluc3RhbnRpYXRlcyB0aGUgRGF5R3JpZCBvYmplY3QgdGhpcyB2aWV3IG1pZ2h0IG5lZWQuIERyYXdzIGZyb20gdGhpcy5kYXlHcmlkQ2xhc3MKCWluc3RhbnRpYXRlRGF5R3JpZDogZnVuY3Rpb24oKSB7CgkJdmFyIHN1YmNsYXNzID0gdGhpcy5kYXlHcmlkQ2xhc3MuZXh0ZW5kKGFnZW5kYURheUdyaWRNZXRob2RzKTsKCgkJcmV0dXJuIG5ldyBzdWJjbGFzcyh0aGlzKTsKCX0sCgoKCS8qIFJlbmRlcmluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gU2V0cyB0aGUgZGlzcGxheSByYW5nZSBhbmQgY29tcHV0ZXMgYWxsIG5lY2Vzc2FyeSBkYXRlcwoJc2V0UmFuZ2U6IGZ1bmN0aW9uKHJhbmdlKSB7CgkJVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLCByYW5nZSk7IC8vIGNhbGwgdGhlIHN1cGVyLW1ldGhvZAoKCQl0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHJhbmdlKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC5zZXRSYW5nZShyYW5nZSk7CgkJfQoJfSwKCgoJLy8gUmVuZGVycyB0aGUgdmlldyBpbnRvIGB0aGlzLmVsYCwgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZAoJcmVuZGVyRGF0ZXM6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLmVsLmFkZENsYXNzKCdmYy1hZ2VuZGEtdmlldycpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CgkJdGhpcy5yZW5kZXJIZWFkKCk7CgoJCXRoaXMuc2Nyb2xsZXIucmVuZGVyKCk7CgkJdmFyIHRpbWVHcmlkV3JhcEVsID0gdGhpcy5zY3JvbGxlci5lbC5hZGRDbGFzcygnZmMtdGltZS1ncmlkLWNvbnRhaW5lcicpOwoJCXZhciB0aW1lR3JpZEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtdGltZS1ncmlkIiAvPicpLmFwcGVuZFRvKHRpbWVHcmlkV3JhcEVsKTsKCQl0aGlzLmVsLmZpbmQoJy5mYy1ib2R5ID4gdHIgPiB0ZCcpLmFwcGVuZCh0aW1lR3JpZFdyYXBFbCk7CgoJCXRoaXMudGltZUdyaWQuc2V0RWxlbWVudCh0aW1lR3JpZEVsKTsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CgoJCS8vIHRoZSA8aHI+IHRoYXQgc29tZXRpbWVzIGRpc3BsYXlzIHVuZGVyIHRoZSB0aW1lLWdyaWQKCQl0aGlzLmJvdHRvbVJ1bGVFbCA9ICQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciLz4nKQoJCQkuYXBwZW5kVG8odGhpcy50aW1lR3JpZC5lbCk7IC8vIGluamVjdCBpdCBpbnRvIHRoZSB0aW1lLWdyaWQKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQuc2V0RWxlbWVudCh0aGlzLmVsLmZpbmQoJy5mYy1kYXktZ3JpZCcpKTsKCQkJdGhpcy5kYXlHcmlkLnJlbmRlckRhdGVzKCk7CgoJCQkvLyBoYXZlIHRoZSBkYXktZ3JpZCBleHRlbmQgaXQncyBjb29yZGluYXRlIGFyZWEgb3ZlciB0aGUgPGhyPiBkaXZpZGluZyB0aGUgdHdvIGdyaWRzCgkJCXRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmcgPSB0aGlzLmRheUdyaWQuZWwubmV4dCgnaHInKS5vdXRlckhlaWdodCgpOwoJCX0KCgkJdGhpcy5ub1Njcm9sbFJvd0VscyA9IHRoaXMuZWwuZmluZCgnLmZjLXJvdzpub3QoLmZjLXNjcm9sbGVyICopJyk7IC8vIGZha2Ugcm93cyBub3Qgd2l0aGluIHRoZSBzY3JvbGxlcgoJfSwKCgoJLy8gcmVuZGVyIHRoZSBkYXktb2Ytd2VlayBoZWFkZXJzCglyZW5kZXJIZWFkOiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRDb250YWluZXJFbCA9CgkJCXRoaXMuZWwuZmluZCgnLmZjLWhlYWQtY29udGFpbmVyJykKCQkJCS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSk7Cgl9LAoKCgkvLyBVbnJlbmRlcnMgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXcuIFNpbmNlIHdlIGhhdmVuJ3Qgc2VwYXJhdGVkIHNrZWxldG9uIHJlbmRlcmluZyBmcm9tIGRhdGUgcmVuZGVyaW5nLAoJLy8gYWx3YXlzIGNvbXBsZXRlbHkga2lsbCBlYWNoIGdyaWQncyByZW5kZXJpbmcuCgl1bnJlbmRlckRhdGVzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKTsKCQl0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpOwoJCQl0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpOwoJCX0KCgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7Cgl9LAoKCgkvLyBCdWlsZHMgdGhlIEhUTUwgc2tlbGV0b24gZm9yIHRoZSB2aWV3LgoJLy8gVGhlIGRheS1ncmlkIGFuZCB0aW1lLWdyaWQgY29tcG9uZW50cyB3aWxsIHJlbmRlciBpbnNpZGUgY29udGFpbmVycyBkZWZpbmVkIGJ5IHRoaXMgSFRNTC4KCXJlbmRlclNrZWxldG9uSHRtbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICcnICsKCQkJJzx0YWJsZT4nICsKCQkJCSc8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPicgKwoJCQkJCSc8dHI+JyArCgkJCQkJCSc8dGQgY2xhc3M9ImZjLWhlYWQtY29udGFpbmVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4nICsKCQkJCQknPC90cj4nICsKCQkJCSc8L3RoZWFkPicgKwoJCQkJJzx0Ym9keSBjbGFzcz0iZmMtYm9keSI+JyArCgkJCQkJJzx0cj4nICsKCQkJCQkJJzx0ZCBjbGFzcz0iJyArIHRoaXMud2lkZ2V0Q29udGVudENsYXNzICsgJyI+JyArCgkJCQkJCQkodGhpcy5kYXlHcmlkID8KCQkJCQkJCQknPGRpdiBjbGFzcz0iZmMtZGF5LWdyaWQiLz4nICsKCQkJCQkJCQknPGhyIGNsYXNzPSJmYy1kaXZpZGVyICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyIvPicgOgoJCQkJCQkJCScnCgkJCQkJCQkJKSArCgkJCQkJCSc8L3RkPicgKwoJCQkJCSc8L3RyPicgKwoJCQkJJzwvdGJvZHk+JyArCgkJCSc8L3RhYmxlPic7Cgl9LAoKCgkvLyBHZW5lcmF0ZXMgYW4gSFRNTCBhdHRyaWJ1dGUgc3RyaW5nIGZvciBzZXR0aW5nIHRoZSB3aWR0aCBvZiB0aGUgYXhpcywgaWYgaXQgaXMga25vd24KCWF4aXNTdHlsZUF0dHI6IGZ1bmN0aW9uKCkgewoJCWlmICh0aGlzLmF4aXNXaWR0aCAhPT0gbnVsbCkgewoJCQkgcmV0dXJuICdzdHlsZT0id2lkdGg6JyArIHRoaXMuYXhpc1dpZHRoICsgJ3B4Iic7CgkJfQoJCXJldHVybiAnJzsKCX0sCgoKCS8qIEJ1c2luZXNzIEhvdXJzCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCglyZW5kZXJCdXNpbmVzc0hvdXJzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpOwoJCX0KCX0sCgoKCXVucmVuZGVyQnVzaW5lc3NIb3VyczogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlckJ1c2luZXNzSG91cnMoKTsKCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CgkJfQoJfSwKCgoJLyogTm93IEluZGljYXRvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJZ2V0Tm93SW5kaWNhdG9yVW5pdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwoJfSwKCgoJcmVuZGVyTm93SW5kaWNhdG9yOiBmdW5jdGlvbihkYXRlKSB7CgkJdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IoZGF0ZSk7Cgl9LAoKCgl1bnJlbmRlck5vd0luZGljYXRvcjogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpOwoJfSwKCgoJLyogRGltZW5zaW9ucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJdXBkYXRlU2l6ZTogZnVuY3Rpb24oaXNSZXNpemUpIHsKCQl0aGlzLnRpbWVHcmlkLnVwZGF0ZVNpemUoaXNSZXNpemUpOwoKCQlWaWV3LnByb3RvdHlwZS51cGRhdGVTaXplLmNhbGwodGhpcywgaXNSZXNpemUpOyAvLyBjYWxsIHRoZSBzdXBlci1tZXRob2QKCX0sCgoKCS8vIFJlZnJlc2hlcyB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb25zIG9mIHRoZSB2aWV3Cgl1cGRhdGVXaWR0aDogZnVuY3Rpb24oKSB7CgkJLy8gbWFrZSBhbGwgYXhpcyBjZWxscyBsaW5lIHVwLCBhbmQgcmVjb3JkIHRoZSB3aWR0aCBzbyBuZXdseSBjcmVhdGVkIGF4aXMgY2VsbHMgd2lsbCBoYXZlIGl0CgkJdGhpcy5heGlzV2lkdGggPSBtYXRjaENlbGxXaWR0aHModGhpcy5lbC5maW5kKCcuZmMtYXhpcycpKTsKCX0sCgoKCS8vIEFkanVzdHMgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXcgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMKCXNldEhlaWdodDogZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewoJCXZhciBldmVudExpbWl0OwoJCXZhciBzY3JvbGxlckhlaWdodDsKCQl2YXIgc2Nyb2xsYmFyV2lkdGhzOwoKCQkvLyByZXNldCBhbGwgZGltZW5zaW9ucyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZQoJCXRoaXMuYm90dG9tUnVsZUVsLmhpZGUoKTsgLy8gLnNob3coKSB3aWxsIGJlIGNhbGxlZCBsYXRlciBpZiB0aGlzIDxocj4gaXMgbmVjZXNzYXJ5CgkJdGhpcy5zY3JvbGxlci5jbGVhcigpOyAvLyBzZXRzIGhlaWdodCB0byAnYXV0bycgYW5kIGNsZWFycyBvdmVyZmxvdwoJCXVuY29tcGVuc2F0ZVNjcm9sbCh0aGlzLm5vU2Nyb2xsUm93RWxzKTsKCgkJLy8gbGltaXQgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYWxsLWRheSBhcmVhCgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpOyAvLyBraWxsIHRoZSAibW9yZSIgcG9wb3ZlciBpZiBkaXNwbGF5ZWQKCgkJCWV2ZW50TGltaXQgPSB0aGlzLm9wdCgnZXZlbnRMaW1pdCcpOwoJCQlpZiAoZXZlbnRMaW1pdCAmJiB0eXBlb2YgZXZlbnRMaW1pdCAhPT0gJ251bWJlcicpIHsKCQkJCWV2ZW50TGltaXQgPSBBR0VOREFfQUxMX0RBWV9FVkVOVF9MSU1JVDsgLy8gbWFrZSBzdXJlICJhdXRvIiBnb2VzIHRvIGEgcmVhbCBudW1iZXIKCQkJfQoJCQlpZiAoZXZlbnRMaW1pdCkgewoJCQkJdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhldmVudExpbWl0KTsKCQkJfQoJCX0KCgkJaWYgKCFpc0F1dG8pIHsgLy8gc2hvdWxkIHdlIGZvcmNlIGRpbWVuc2lvbnMgb2YgdGhlIHNjcm9sbCBjb250YWluZXI/CgoJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJdGhpcy5zY3JvbGxlci5zZXRIZWlnaHQoc2Nyb2xsZXJIZWlnaHQpOwoJCQlzY3JvbGxiYXJXaWR0aHMgPSB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpOwoKCQkJaWYgKHNjcm9sbGJhcldpZHRocy5sZWZ0IHx8IHNjcm9sbGJhcldpZHRocy5yaWdodCkgeyAvLyB1c2luZyBzY3JvbGxiYXJzPwoKCQkJCS8vIG1ha2UgdGhlIGFsbC1kYXkgYW5kIGhlYWRlciByb3dzIGxpbmVzIHVwCgkJCQljb21wZW5zYXRlU2Nyb2xsKHRoaXMubm9TY3JvbGxSb3dFbHMsIHNjcm9sbGJhcldpZHRocyk7CgoJCQkJLy8gdGhlIHNjcm9sbGJhciBjb21wZW5zYXRpb24gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRleHQgZmxvdywgd2hpY2ggbWlnaHQgYWZmZWN0IGhlaWdodCwgc28gcmVjYWxjdWxhdGUKCQkJCS8vIGFuZCByZWFwcGx5IHRoZSBkZXNpcmVkIGhlaWdodCB0byB0aGUgc2Nyb2xsZXIuCgkJCQlzY3JvbGxlckhlaWdodCA9IHRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHRvdGFsSGVpZ2h0KTsKCQkJCXRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHNjcm9sbGVySGVpZ2h0KTsKCQkJfQoKCQkJLy8gZ3VhcmFudGVlcyB0aGUgc2FtZSBzY3JvbGxiYXIgd2lkdGhzCgkJCXRoaXMuc2Nyb2xsZXIubG9ja092ZXJmbG93KHNjcm9sbGJhcldpZHRocyk7CgoJCQkvLyBpZiB0aGVyZSdzIGFueSBzcGFjZSBiZWxvdyB0aGUgc2xhdHMsIHNob3cgdGhlIGhvcml6b250YWwgcnVsZS4KCQkJLy8gdGhpcyB3b24ndCBjYXVzZSBhbnkgbmV3IG92ZXJmbG93LCBiZWNhdXNlIGxvY2tPdmVyZmxvdyBhbHJlYWR5IGNhbGxlZC4KCQkJaWYgKHRoaXMudGltZUdyaWQuZ2V0VG90YWxTbGF0SGVpZ2h0KCkgPCBzY3JvbGxlckhlaWdodCkgewoJCQkJdGhpcy5ib3R0b21SdWxlRWwuc2hvdygpOwoJCQl9CgkJfQoJfSwKCgoJLy8gZ2l2ZW4gYSBkZXNpcmVkIHRvdGFsIGhlaWdodCBvZiB0aGUgdmlldywgcmV0dXJucyB3aGF0IHRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbGVyIHNob3VsZCBiZQoJY29tcHV0ZVNjcm9sbGVySGVpZ2h0OiBmdW5jdGlvbih0b3RhbEhlaWdodCkgewoJCXJldHVybiB0b3RhbEhlaWdodCAtCgkJCXN1YnRyYWN0SW5uZXJFbEhlaWdodCh0aGlzLmVsLCB0aGlzLnNjcm9sbGVyLmVsKTsgLy8gZXZlcnl0aGluZyB0aGF0J3MgTk9UIHRoZSBzY3JvbGxlcgoJfSwKCgoJLyogU2Nyb2xsCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBDb21wdXRlcyB0aGUgaW5pdGlhbCBwcmUtY29uZmlndXJlZCBzY3JvbGwgc3RhdGUgcHJpb3IgdG8gYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIGl0Cgljb21wdXRlSW5pdGlhbFNjcm9sbDogZnVuY3Rpb24oKSB7CgkJdmFyIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ3Njcm9sbFRpbWUnKSk7CgkJdmFyIHRvcCA9IHRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3Aoc2Nyb2xsVGltZSk7CgoJCS8vIHpvb20gY2FuIGdpdmUgd2VpcmQgZmxvYXRpbmctcG9pbnQgdmFsdWVzLiByYXRoZXIgc2Nyb2xsIGEgbGl0dGxlIGJpdCBmdXJ0aGVyCgkJdG9wID0gTWF0aC5jZWlsKHRvcCk7CgoJCWlmICh0b3ApIHsKCQkJdG9wKys7IC8vIHRvIG92ZXJjb21lIHRvcCBib3JkZXIgdGhhdCBzbG90cyBiZXlvbmQgdGhlIGZpcnN0IGhhdmUuIGxvb2tzIGJldHRlcgoJCX0KCgkJcmV0dXJuIHRvcDsKCX0sCgoKCXF1ZXJ5U2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxUb3AoKTsKCX0sCgoKCXNldFNjcm9sbDogZnVuY3Rpb24odG9wKSB7CgkJdGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodG9wKTsKCX0sCgoKCS8qIEhpdCBBcmVhcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCS8vIGZvcndhcmQgYWxsIGhpdC1yZWxhdGVkIG1ldGhvZCBjYWxscyB0byB0aGUgZ3JpZHMgKGRheUdyaWQgbWlnaHQgbm90IGJlIGRlZmluZWQpCgoKCXByZXBhcmVIaXRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLnRpbWVHcmlkLnByZXBhcmVIaXRzKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucHJlcGFyZUhpdHMoKTsKCQl9Cgl9LAoKCglyZWxlYXNlSGl0czogZnVuY3Rpb24oKSB7CgkJdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwoJCWlmICh0aGlzLmRheUdyaWQpIHsKCQkJdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCk7CgkJfQoJfSwKCgoJcXVlcnlIaXQ6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgewoJCXZhciBoaXQgPSB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnQsIHRvcCk7CgoJCWlmICghaGl0ICYmIHRoaXMuZGF5R3JpZCkgewoJCQloaXQgPSB0aGlzLmRheUdyaWQucXVlcnlIaXQobGVmdCwgdG9wKTsKCQl9CgoJCXJldHVybiBoaXQ7Cgl9LAoKCglnZXRIaXRTcGFuOiBmdW5jdGlvbihoaXQpIHsKCQkvLyBUT0RPOiBoaXQuY29tcG9uZW50IGlzIHNldCBhcyBhIGhhY2sgdG8gaWRlbnRpZnkgd2hlcmUgdGhlIGhpdCBjYW1lIGZyb20KCQlyZXR1cm4gaGl0LmNvbXBvbmVudC5nZXRIaXRTcGFuKGhpdCk7Cgl9LAoKCglnZXRIaXRFbDogZnVuY3Rpb24oaGl0KSB7CgkJLy8gVE9ETzogaGl0LmNvbXBvbmVudCBpcyBzZXQgYXMgYSBoYWNrIHRvIGlkZW50aWZ5IHdoZXJlIHRoZSBoaXQgY2FtZSBmcm9tCgkJcmV0dXJuIGhpdC5jb21wb25lbnQuZ2V0SGl0RWwoaGl0KTsKCX0sCgoKCS8qIEV2ZW50cwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgoJLy8gUmVuZGVycyBldmVudHMgb250byB0aGUgdmlldyBhbmQgcG9wdWxhdGVzIHRoZSBWaWV3J3Mgc2VnbWVudCBhcnJheQoJcmVuZGVyRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHsKCQl2YXIgZGF5RXZlbnRzID0gW107CgkJdmFyIHRpbWVkRXZlbnRzID0gW107CgkJdmFyIGRheVNlZ3MgPSBbXTsKCQl2YXIgdGltZWRTZWdzOwoJCXZhciBpOwoKCQkvLyBzZXBhcmF0ZSB0aGUgZXZlbnRzIGludG8gYWxsLWRheSBhbmQgdGltZWQKCQlmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CgkJCWlmIChldmVudHNbaV0uYWxsRGF5KSB7CgkJCQlkYXlFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJCWVsc2UgewoJCQkJdGltZWRFdmVudHMucHVzaChldmVudHNbaV0pOwoJCQl9CgkJfQoKCQkvLyByZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRpbWVkU2VncyA9IHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHRpbWVkRXZlbnRzKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCWRheVNlZ3MgPSB0aGlzLmRheUdyaWQucmVuZGVyRXZlbnRzKGRheUV2ZW50cyk7CgkJfQoKCQkvLyB0aGUgYWxsLWRheSBhcmVhIGlzIGZsZXhpYmxlIGFuZCBtaWdodCBoYXZlIGEgbG90IG9mIGV2ZW50cywgc28gc2hpZnQgdGhlIGhlaWdodAoJCXRoaXMudXBkYXRlSGVpZ2h0KCk7Cgl9LAoKCgkvLyBSZXRyaWV2ZXMgYWxsIHNlZ21lbnQgb2JqZWN0cyB0aGF0IGFyZSByZW5kZXJlZCBpbiB0aGUgdmlldwoJZ2V0RXZlbnRTZWdzOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKS5jb25jYXQoCgkJCXRoaXMuZGF5R3JpZCA/IHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKSA6IFtdCgkJKTsKCX0sCgoKCS8vIFVucmVuZGVycyBhbGwgZXZlbnQgZWxlbWVudHMgYW5kIGNsZWFycyBpbnRlcm5hbCBzZWdtZW50IGRhdGEKCXVucmVuZGVyRXZlbnRzOiBmdW5jdGlvbigpIHsKCgkJLy8gdW5yZW5kZXIgdGhlIGV2ZW50cyBpbiB0aGUgc3ViY29tcG9uZW50cwoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpOwoJCX0KCgkJLy8gd2UgRE9OJ1QgbmVlZCB0byBjYWxsIHVwZGF0ZUhlaWdodCgpIGJlY2F1c2UKCQkvLyBhIHJlbmRlckV2ZW50cygpIGNhbGwgYWx3YXlzIGhhcHBlbnMgYWZ0ZXIgdGhpcywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGNhbGwgdXBkYXRlSGVpZ2h0KCkKCX0sCgoKCS8qIERyYWdnaW5nIChmb3IgZXZlbnRzIGFuZCBleHRlcm5hbCBlbGVtZW50cykKCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKCS8vIEEgcmV0dXJuZWQgdmFsdWUgb2YgYHRydWVgIHNpZ25hbHMgdGhhdCBhIG1vY2sgImhlbHBlciIgZXZlbnQgaGFzIGJlZW4gcmVuZGVyZWQuCglyZW5kZXJEcmFnOiBmdW5jdGlvbihkcm9wTG9jYXRpb24sIHNlZykgewoJCWlmIChkcm9wTG9jYXRpb24uc3RhcnQuaGFzVGltZSgpKSB7CgkJCXJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwoJCX0KCQllbHNlIGlmICh0aGlzLmRheUdyaWQpIHsKCQkJcmV0dXJuIHRoaXMuZGF5R3JpZC5yZW5kZXJEcmFnKGRyb3BMb2NhdGlvbiwgc2VnKTsKCQl9Cgl9LAoKCgl1bnJlbmRlckRyYWc6IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCk7CgkJfQoJfSwKCgoJLyogU2VsZWN0aW9uCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgkvLyBSZW5kZXJzIGEgdmlzdWFsIGluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24KCXJlbmRlclNlbGVjdGlvbjogZnVuY3Rpb24oc3BhbikgewoJCWlmIChzcGFuLnN0YXJ0Lmhhc1RpbWUoKSB8fCBzcGFuLmVuZC5oYXNUaW1lKCkpIHsKCQkJdGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24oc3Bhbik7CgkJfQoJCWVsc2UgaWYgKHRoaXMuZGF5R3JpZCkgewoJCQl0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHNwYW4pOwoJCX0KCX0sCgoKCS8vIFVucmVuZGVycyBhIHZpc3VhbCBpbmRpY2F0aW9ucyBvZiBhIHNlbGVjdGlvbgoJdW5yZW5kZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKTsKCQlpZiAodGhpcy5kYXlHcmlkKSB7CgkJCXRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwoJCX0KCX0KCn0pOwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgdGltZUdyaWQKLy8gVE9ETzogbW92ZSBpbnRvIFRpbWVHcmlkCnZhciBhZ2VuZGFUaW1lR3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHdpbGwgZ28gYmVmb3JlIHRoZSBkYXktb2Ygd2VlayBoZWFkZXIgY2VsbHMKCXJlbmRlckhlYWRJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciB3ZWVrVGV4dDsKCgkJaWYgKHZpZXcub3B0KCd3ZWVrTnVtYmVycycpKSB7CgkJCXdlZWtUZXh0ID0gdGhpcy5zdGFydC5mb3JtYXQodmlldy5vcHQoJ3NtYWxsV2Vla0Zvcm1hdCcpKTsKCgkJCXJldHVybiAnJyArCgkJCQknPHRoIGNsYXNzPSJmYy1heGlzIGZjLXdlZWstbnVtYmVyICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCQl2aWV3LmJ1aWxkR290b0FuY2hvckh0bWwoIC8vIGFzaWRlIGZyb20gbGluaywgaW1wb3J0YW50IGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQkJeyBkYXRlOiB0aGlzLnN0YXJ0LCB0eXBlOiAnd2VlaycsIGZvcmNlT2ZmOiB0aGlzLmNvbENudCA+IDEgfSwKCQkJCQkJaHRtbEVzY2FwZSh3ZWVrVGV4dCkgLy8gaW5uZXIgSFRNTAoJCQkJCSkgKwoJCQkJJzwvdGg+JzsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiAnPHRoIGNsYXNzPSJmYy1heGlzICcgKyB2aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RoPic7CgkJfQoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgdGhlIGJnIG9mIHRoZSBUaW1lR3JpZCBzbG90IGFyZWEuIExvbmcgdmVydGljYWwgY29sdW1uLgoJcmVuZGVyQmdJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyAnICsgdmlldy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0sCgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIGFsbCBvdGhlciB0eXBlcyBvZiBjZWxscy4KCS8vIEFmZmVjdHMgY29udGVudC1za2VsZXRvbiwgaGVscGVyLXNrZWxldG9uLCBoaWdobGlnaHQtc2tlbGV0b24gZm9yIGJvdGggdGhlIHRpbWUtZ3JpZCBhbmQgZGF5LWdyaWQuCglyZW5kZXJJbnRyb0h0bWw6IGZ1bmN0aW9uKCkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoKCQlyZXR1cm4gJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz48L3RkPic7Cgl9Cgp9OwoKCi8vIE1ldGhvZHMgdGhhdCB3aWxsIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIGJlaGF2aW9yIG9mIHRoZSBBZ2VuZGFWaWV3J3MgZGF5R3JpZAp2YXIgYWdlbmRhRGF5R3JpZE1ldGhvZHMgPSB7CgoKCS8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IGdvZXMgYmVmb3JlIHRoZSBhbGwtZGF5IGNlbGxzCglyZW5kZXJCZ0ludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnJyArCgkJCSc8dGQgY2xhc3M9ImZjLWF4aXMgJyArIHZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIgJyArIHZpZXcuYXhpc1N0eWxlQXR0cigpICsgJz4nICsKCQkJCSc8c3Bhbj4nICsgLy8gbmVlZGVkIGZvciBtYXRjaENlbGxXaWR0aHMKCQkJCQl2aWV3LmdldEFsbERheUh0bWwoKSArCgkJCQknPC9zcGFuPicgKwoJCQknPC90ZD4nOwoJfSwKCgoJLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgZ29lcyBiZWZvcmUgYWxsIG90aGVyIHR5cGVzIG9mIGNlbGxzLgoJLy8gQWZmZWN0cyBjb250ZW50LXNrZWxldG9uLCBoZWxwZXItc2tlbGV0b24sIGhpZ2hsaWdodC1za2VsZXRvbiBmb3IgYm90aCB0aGUgdGltZS1ncmlkIGFuZCBkYXktZ3JpZC4KCXJlbmRlckludHJvSHRtbDogZnVuY3Rpb24oKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgoJCXJldHVybiAnPHRkIGNsYXNzPSJmYy1heGlzIiAnICsgdmlldy5heGlzU3R5bGVBdHRyKCkgKyAnPjwvdGQ+JzsKCX0KCn07Cgo7OwoKdmFyIEFHRU5EQV9BTExfREFZX0VWRU5UX0xJTUlUID0gNTsKCi8vIHBvdGVudGlhbCBuaWNlIHZhbHVlcyBmb3IgdGhlIHNsb3QtZHVyYXRpb24gYW5kIGludGVydmFsLWR1cmF0aW9uCi8vIGZyb20gbGFyZ2VzdCB0byBzbWFsbGVzdAp2YXIgQUdFTkRBX1NUT0NLX1NVQl9EVVJBVElPTlMgPSBbCgl7IGhvdXJzOiAxIH0sCgl7IG1pbnV0ZXM6IDMwIH0sCgl7IG1pbnV0ZXM6IDE1IH0sCgl7IHNlY29uZHM6IDMwIH0sCgl7IHNlY29uZHM6IDE1IH0KXTsKCmZjVmlld3MuYWdlbmRhID0gewoJJ2NsYXNzJzogQWdlbmRhVmlldywKCWRlZmF1bHRzOiB7CgkJYWxsRGF5U2xvdDogdHJ1ZSwKCQlzbG90RHVyYXRpb246ICcwMDozMDowMCcsCgkJbWluVGltZTogJzAwOjAwOjAwJywKCQltYXhUaW1lOiAnMjQ6MDA6MDAnLAoJCXNsb3RFdmVudE92ZXJsYXA6IHRydWUgLy8gYSBiYWQgbmFtZS4gY29uZnVzZWQgd2l0aCBvdmVybGFwL2NvbnN0cmFpbnQgc3lzdGVtCgl9Cn07CgpmY1ZpZXdzLmFnZW5kYURheSA9IHsKCXR5cGU6ICdhZ2VuZGEnLAoJZHVyYXRpb246IHsgZGF5czogMSB9Cn07CgpmY1ZpZXdzLmFnZW5kYVdlZWsgPSB7Cgl0eXBlOiAnYWdlbmRhJywKCWR1cmF0aW9uOiB7IHdlZWtzOiAxIH0KfTsKOzsKCi8qClJlc3BvbnNpYmxlIGZvciB0aGUgc2Nyb2xsZXIsIGFuZCBmb3J3YXJkaW5nIGV2ZW50LXJlbGF0ZWQgYWN0aW9ucyBpbnRvIHRoZSAiZ3JpZCIKKi8KdmFyIExpc3RWaWV3ID0gVmlldy5leHRlbmQoewoKCWdyaWQ6IG51bGwsCglzY3JvbGxlcjogbnVsbCwKCglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl0aGlzLmdyaWQgPSBuZXcgTGlzdFZpZXdHcmlkKHRoaXMpOwoJCXRoaXMuc2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoewoJCQlvdmVyZmxvd1g6ICdoaWRkZW4nLAoJCQlvdmVyZmxvd1k6ICdhdXRvJwoJCX0pOwoJfSwKCglzZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsKCQlWaWV3LnByb3RvdHlwZS5zZXRSYW5nZS5jYWxsKHRoaXMsIHJhbmdlKTsgLy8gc3VwZXIKCgkJdGhpcy5ncmlkLnNldFJhbmdlKHJhbmdlKTsgLy8gbmVlZHMgdG8gcHJvY2VzcyByYW5nZS1yZWxhdGVkIG9wdGlvbnMKCX0sCgoJcmVuZGVyU2tlbGV0b246IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuYWRkQ2xhc3MoCgkJCSdmYy1saXN0LXZpZXcgJyArCgkJCXRoaXMud2lkZ2V0Q29udGVudENsYXNzCgkJKTsKCgkJdGhpcy5zY3JvbGxlci5yZW5kZXIoKTsKCQl0aGlzLnNjcm9sbGVyLmVsLmFwcGVuZFRvKHRoaXMuZWwpOwoKCQl0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKTsKCX0sCgoJdW5yZW5kZXJTa2VsZXRvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5zY3JvbGxlci5kZXN0cm95KCk7IC8vIHdpbGwgcmVtb3ZlIHRoZSBHcmlkIHRvbwoJfSwKCglzZXRIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKCQl0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0b3RhbEhlaWdodCkpOwoJfSwKCgljb21wdXRlU2Nyb2xsZXJIZWlnaHQ6IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0KSB7CgkJcmV0dXJuIHRvdGFsSGVpZ2h0IC0KCQkJc3VidHJhY3RJbm5lckVsSGVpZ2h0KHRoaXMuZWwsIHRoaXMuc2Nyb2xsZXIuZWwpOyAvLyBldmVyeXRoaW5nIHRoYXQncyBOT1QgdGhlIHNjcm9sbGVyCgl9LAoKCXJlbmRlckV2ZW50czogZnVuY3Rpb24oZXZlbnRzKSB7CgkJdGhpcy5ncmlkLnJlbmRlckV2ZW50cyhldmVudHMpOwoJfSwKCgl1bnJlbmRlckV2ZW50czogZnVuY3Rpb24oKSB7CgkJdGhpcy5ncmlkLnVucmVuZGVyRXZlbnRzKCk7Cgl9LAoKCWlzRXZlbnRSZXNpemFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJcmV0dXJuIGZhbHNlOwoJfSwKCglpc0V2ZW50RHJhZ2dhYmxlOiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiBmYWxzZTsKCX0KCn0pOwoKLyoKUmVzcG9uc2libGUgZm9yIGV2ZW50IHJlbmRlcmluZyBhbmQgdXNlci1pbnRlcmFjdGlvbi4KSXRzICJlbCIgaXMgdGhlIGlubmVyLWNvbnRlbnQgb2YgdGhlIGFib3ZlIHZpZXcncyBzY3JvbGxlci4KKi8KdmFyIExpc3RWaWV3R3JpZCA9IEdyaWQuZXh0ZW5kKHsKCglzZWdTZWxlY3RvcjogJy5mYy1saXN0LWl0ZW0nLCAvLyB3aGljaCBlbGVtZW50cyBhY2NlcHQgZXZlbnQgYWN0aW9ucwoJaGFzRGF5SW50ZXJhY3Rpb25zOiBmYWxzZSwgLy8gbm8gZGF5IHNlbGVjdGlvbiBvciBkYXkgY2xpY2tpbmcKCgkvLyBzbGljZXMgYnkgZGF5CglzcGFuVG9TZWdzOiBmdW5jdGlvbihzcGFuKSB7CgkJdmFyIHZpZXcgPSB0aGlzLnZpZXc7CgkJdmFyIGRheVN0YXJ0ID0gdmlldy5zdGFydC5jbG9uZSgpLnRpbWUoMCk7IC8vIHRpbWVkLCBzbyBzZWdzIGdldCB0aW1lcyEKCQl2YXIgZGF5SW5kZXggPSAwOwoJCXZhciBzZWc7CgkJdmFyIHNlZ3MgPSBbXTsKCgkJd2hpbGUgKGRheVN0YXJ0IDwgdmlldy5lbmQpIHsKCgkJCXNlZyA9IGludGVyc2VjdFJhbmdlcyhzcGFuLCB7CgkJCQlzdGFydDogZGF5U3RhcnQsCgkJCQllbmQ6IGRheVN0YXJ0LmNsb25lKCkuYWRkKDEsICdkYXknKQoJCQl9KTsKCgkJCWlmIChzZWcpIHsKCQkJCXNlZy5kYXlJbmRleCA9IGRheUluZGV4OwoJCQkJc2Vncy5wdXNoKHNlZyk7CgkJCX0KCgkJCWRheVN0YXJ0LmFkZCgxLCAnZGF5Jyk7CgkJCWRheUluZGV4Kys7CgoJCQkvLyBkZXRlY3Qgd2hlbiBzcGFuIHdvbid0IGdvIGZ1bGx5IGludG8gdGhlIG5leHQgZGF5LAoJCQkvLyBhbmQgbXV0YXRlIHRoZSBsYXRlc3Qgc2VnIHRvIHRoZSBiZSB0aGUgZW5kLgoJCQlpZiAoCgkJCQlzZWcgJiYgIXNlZy5pc0VuZCAmJiBzcGFuLmVuZC5oYXNUaW1lKCkgJiYKCQkJCXNwYW4uZW5kIDwgZGF5U3RhcnQuY2xvbmUoKS5hZGQodGhpcy52aWV3Lm5leHREYXlUaHJlc2hvbGQpCgkJCSkgewoJCQkJc2VnLmVuZCA9IHNwYW4uZW5kLmNsb25lKCk7CgkJCQlzZWcuaXNFbmQgPSB0cnVlOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCgkvLyBsaWtlICI0OjAwYW0iCgljb21wdXRlRXZlbnRUaW1lRm9ybWF0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy52aWV3Lm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwoJfSwKCgkvLyBmb3IgZXZlbnRzIHdpdGggYSB1cmwsIHRoZSB3aG9sZSA8dHI+IHNob3VsZCBiZSBjbGlja2FibGUsCgkvLyBidXQgaXQncyBpbXBvc3NpYmxlIHRvIHdyYXAgd2l0aCBhbiA8YT4gdGFnLiBzaW11bGF0ZSB0aGlzLgoJaGFuZGxlU2VnQ2xpY2s6IGZ1bmN0aW9uKHNlZywgZXYpIHsKCQl2YXIgdXJsOwoKCQlHcmlkLnByb3RvdHlwZS5oYW5kbGVTZWdDbGljay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBzdXBlci4gbWlnaHQgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24KCgkJLy8gbm90IGNsaWNraW5nIG9uIG9yIHdpdGhpbiBhbiA8YT4gd2l0aCBhbiBocmVmCgkJaWYgKCEkKGV2LnRhcmdldCkuY2xvc2VzdCgnYVtocmVmXScpLmxlbmd0aCkgewoJCQl1cmwgPSBzZWcuZXZlbnQudXJsOwoJCQlpZiAodXJsICYmICFldi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgeyAvLyBqc0V2ZW50IG5vdCBjYW5jZWxsZWQgaW4gaGFuZGxlcgoJCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7IC8vIHNpbXVsYXRlIGxpbmsgY2xpY2sKCQkJfQoJCX0KCX0sCgoJLy8gcmV0dXJucyBsaXN0IG9mIGZvcmVncm91bmQgc2VncyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVuZGVyZWQKCXJlbmRlckZnU2VnczogZnVuY3Rpb24oc2VncykgewoJCXNlZ3MgPSB0aGlzLnJlbmRlckZnU2VnRWxzKHNlZ3MpOyAvLyBtaWdodCBmaWx0ZXIgYXdheSBoaWRkZW4gZXZlbnRzCgoJCWlmICghc2Vncy5sZW5ndGgpIHsKCQkJdGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKTsKCQl9CgkJZWxzZSB7CgkJCXRoaXMucmVuZGVyU2VnTGlzdChzZWdzKTsKCQl9CgoJCXJldHVybiBzZWdzOwoJfSwKCglyZW5kZXJFbXB0eU1lc3NhZ2U6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWwuaHRtbCgKCQkJJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPicgKyAvLyBUT0RPOiB0cnkgbGVzcyB3cmFwcwoJCQknPGRpdiBjbGFzcz0iZmMtbGlzdC1lbXB0eS13cmFwMSI+JyArCgkJCSc8ZGl2IGNsYXNzPSJmYy1saXN0LWVtcHR5Ij4nICsKCQkJCWh0bWxFc2NhcGUodGhpcy52aWV3Lm9wdCgnbm9FdmVudHNNZXNzYWdlJykpICsKCQkJJzwvZGl2PicgKwoJCQknPC9kaXY+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCX0sCgoJLy8gcmVuZGVyIHRoZSBldmVudCBzZWdtZW50cyBpbiB0aGUgdmlldwoJcmVuZGVyU2VnTGlzdDogZnVuY3Rpb24oYWxsU2VncykgewoJCXZhciBzZWdzQnlEYXkgPSB0aGlzLmdyb3VwU2Vnc0J5RGF5KGFsbFNlZ3MpOyAvLyBzcGFyc2UgYXJyYXkKCQl2YXIgZGF5SW5kZXg7CgkJdmFyIGRheVNlZ3M7CgkJdmFyIGk7CgkJdmFyIHRhYmxlRWwgPSAkKCc8dGFibGUgY2xhc3M9ImZjLWxpc3QtdGFibGUiPjx0Ym9keS8+PC90YWJsZT4nKTsKCQl2YXIgdGJvZHlFbCA9IHRhYmxlRWwuZmluZCgndGJvZHknKTsKCgkJZm9yIChkYXlJbmRleCA9IDA7IGRheUluZGV4IDwgc2Vnc0J5RGF5Lmxlbmd0aDsgZGF5SW5kZXgrKykgewoJCQlkYXlTZWdzID0gc2Vnc0J5RGF5W2RheUluZGV4XTsKCQkJaWYgKGRheVNlZ3MpIHsgLy8gc3BhcnNlIGFycmF5LCBzbyBtaWdodCBiZSB1bmRlZmluZWQKCgkJCQkvLyBhcHBlbmQgYSBkYXkgaGVhZGVyCgkJCQl0Ym9keUVsLmFwcGVuZCh0aGlzLmRheUhlYWRlckh0bWwoCgkJCQkJdGhpcy52aWV3LnN0YXJ0LmNsb25lKCkuYWRkKGRheUluZGV4LCAnZGF5cycpCgkJCQkpKTsKCgkJCQl0aGlzLnNvcnRFdmVudFNlZ3MoZGF5U2Vncyk7CgoJCQkJZm9yIChpID0gMDsgaSA8IGRheVNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJCQl0Ym9keUVsLmFwcGVuZChkYXlTZWdzW2ldLmVsKTsgLy8gYXBwZW5kIGV2ZW50IHJvdwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKHRhYmxlRWwpOwoJfSwKCgkvLyBSZXR1cm5zIGEgc3BhcnNlIGFycmF5IG9mIGFycmF5cywgc2VncyBncm91cGVkIGJ5IHRoZWlyIGRheUluZGV4Cglncm91cFNlZ3NCeURheTogZnVuY3Rpb24oc2VncykgewoJCXZhciBzZWdzQnlEYXkgPSBbXTsgLy8gc3BhcnNlIGFycmF5CgkJdmFyIGksIHNlZzsKCgkJZm9yIChpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHsKCQkJc2VnID0gc2Vnc1tpXTsKCQkJKHNlZ3NCeURheVtzZWcuZGF5SW5kZXhdIHx8IChzZWdzQnlEYXlbc2VnLmRheUluZGV4XSA9IFtdKSkKCQkJCS5wdXNoKHNlZyk7CgkJfQoKCQlyZXR1cm4gc2Vnc0J5RGF5OwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIHRoZSBkYXkgaGVhZGVycyB0aGF0IGxpdmUgYW1vbmdzdCB0aGUgZXZlbnQgcm93cwoJZGF5SGVhZGVySHRtbDogZnVuY3Rpb24oZGF5RGF0ZSkgewoJCXZhciB2aWV3ID0gdGhpcy52aWV3OwoJCXZhciBtYWluRm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlGb3JtYXQnKTsKCQl2YXIgYWx0Rm9ybWF0ID0gdmlldy5vcHQoJ2xpc3REYXlBbHRGb3JtYXQnKTsKCgkJcmV0dXJuICc8dHIgY2xhc3M9ImZjLWxpc3QtaGVhZGluZyIgZGF0YS1kYXRlPSInICsgZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciPicgKwoJCQknPHRkIGNsYXNzPSInICsgdmlldy53aWRnZXRIZWFkZXJDbGFzcyArICciIGNvbHNwYW49IjMiPicgKwoJCQkJKG1haW5Gb3JtYXQgPwoJCQkJCXZpZXcuYnVpbGRHb3RvQW5jaG9ySHRtbCgKCQkJCQkJZGF5RGF0ZSwKCQkJCQkJeyAnY2xhc3MnOiAnZmMtbGlzdC1oZWFkaW5nLW1haW4nIH0sCgkJCQkJCWh0bWxFc2NhcGUoZGF5RGF0ZS5mb3JtYXQobWFpbkZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQkJKGFsdEZvcm1hdCA/CgkJCQkJdmlldy5idWlsZEdvdG9BbmNob3JIdG1sKAoJCQkJCQlkYXlEYXRlLAoJCQkJCQl7ICdjbGFzcyc6ICdmYy1saXN0LWhlYWRpbmctYWx0JyB9LAoJCQkJCQlodG1sRXNjYXBlKGRheURhdGUuZm9ybWF0KGFsdEZvcm1hdCkpIC8vIGlubmVyIEhUTUwKCQkJCQkpIDoKCQkJCQknJykgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfSwKCgkvLyBnZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgc2luZ2xlIGV2ZW50IHJvdwoJZmdTZWdIdG1sOiBmdW5jdGlvbihzZWcpIHsKCQl2YXIgdmlldyA9IHRoaXMudmlldzsKCQl2YXIgY2xhc3NlcyA9IFsgJ2ZjLWxpc3QtaXRlbScgXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHNlZykpOwoJCXZhciBiZ0NvbG9yID0gdGhpcy5nZXRTZWdCYWNrZ3JvdW5kQ29sb3Ioc2VnKTsKCQl2YXIgZXZlbnQgPSBzZWcuZXZlbnQ7CgkJdmFyIHVybCA9IGV2ZW50LnVybDsKCQl2YXIgdGltZUh0bWw7CgoJCWlmIChldmVudC5hbGxEYXkpIHsKCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQl9CgkJZWxzZSBpZiAodmlldy5pc011bHRpRGF5RXZlbnQoZXZlbnQpKSB7IC8vIGlmIHRoZSBldmVudCBhcHBlYXJzIHRvIHNwYW4gbW9yZSB0aGFuIG9uZSBkYXkKCQkJaWYgKHNlZy5pc1N0YXJ0IHx8IHNlZy5pc0VuZCkgeyAvLyBvdXRlciBzZWdtZW50IHRoYXQgcHJvYmFibHkgbGFzdHMgcGFydCBvZiB0aGUgZGF5CgkJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KHNlZykpOwoJCQl9CgkJCWVsc2UgeyAvLyBpbm5lciBzZWdtZW50IHRoYXQgbGFzdHMgdGhlIHdob2xlIGRheQoJCQkJdGltZUh0bWwgPSB2aWV3LmdldEFsbERheUh0bWwoKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gRGlzcGxheSB0aGUgbm9ybWFsIHRpbWUgdGV4dCBmb3IgdGhlICpldmVudCdzKiB0aW1lcwoJCQl0aW1lSHRtbCA9IGh0bWxFc2NhcGUodGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KSk7CgkJfQoKCQlpZiAodXJsKSB7CgkJCWNsYXNzZXMucHVzaCgnZmMtaGFzLXVybCcpOwoJCX0KCgkJcmV0dXJuICc8dHIgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciPicgKwoJCQkodGhpcy5kaXNwbGF5RXZlbnRUaW1lID8KCQkJCSc8dGQgY2xhc3M9ImZjLWxpc3QtaXRlbS10aW1lICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJCSh0aW1lSHRtbCB8fCAnJykgKwoJCQkJJzwvdGQ+JyA6CgkJCQknJykgKwoJCQknPHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tbWFya2VyICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJyArCgkJCQkoYmdDb2xvciA/CgkJCQkJJyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjonICsgYmdDb2xvciArICciJyA6CgkJCQkJJycpICsKCQkJCSc+PC9zcGFuPicgKwoJCQknPC90ZD4nICsKCQkJJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpdGxlICcgKyB2aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPicgKwoJCQkJJzxhJyArICh1cmwgPyAnIGhyZWY9IicgKyBodG1sRXNjYXBlKHVybCkgKyAnIicgOiAnJykgKyAnPicgKwoJCQkJCWh0bWxFc2NhcGUoc2VnLmV2ZW50LnRpdGxlIHx8ICcnKSArCgkJCQknPC9hPicgKwoJCQknPC90ZD4nICsKCQknPC90cj4nOwoJfQoKfSk7Cgo7OwoKZmNWaWV3cy5saXN0ID0gewoJJ2NsYXNzJzogTGlzdFZpZXcsCglidXR0b25UZXh0S2V5OiAnbGlzdCcsIC8vIHdoYXQgdG8gbG9va3VwIGluIGxvY2FsZSBmaWxlcwoJZGVmYXVsdHM6IHsKCQlidXR0b25UZXh0OiAnbGlzdCcsIC8vIHRleHQgdG8gZGlzcGxheSBmb3IgRW5nbGlzaAoJCWxpc3REYXlGb3JtYXQ6ICdMTCcsIC8vIGxpa2UgIkphbnVhcnkgMSwgMjAxNiIKCQlub0V2ZW50c01lc3NhZ2U6ICdObyBldmVudHMgdG8gZGlzcGxheScKCX0KfTsKCmZjVmlld3MubGlzdERheSA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IGRheXM6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIGFsbCB3ZSBuZWVkLiBmdWxsIGRhdGUgaXMgcHJvYmFibHkgaW4gaGVhZGVyCgl9Cn07CgpmY1ZpZXdzLmxpc3RXZWVrID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgd2Vla3M6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUZvcm1hdDogJ2RkZGQnLCAvLyBkYXktb2Ytd2VlayBpcyBtb3JlIGltcG9ydGFudAoJCWxpc3REYXlBbHRGb3JtYXQ6ICdMTCcKCX0KfTsKCmZjVmlld3MubGlzdE1vbnRoID0gewoJdHlwZTogJ2xpc3QnLAoJZHVyYXRpb246IHsgbW9udGg6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKZmNWaWV3cy5saXN0WWVhciA9IHsKCXR5cGU6ICdsaXN0JywKCWR1cmF0aW9uOiB7IHllYXI6IDEgfSwKCWRlZmF1bHRzOiB7CgkJbGlzdERheUFsdEZvcm1hdDogJ2RkZGQnIC8vIGRheS1vZi13ZWVrIGlzIG5pY2UtdG8taGF2ZQoJfQp9OwoKOzsKDQpyZXR1cm4gRkM7IC8vIGV4cG9ydCBmb3IgTm9kZS9Db21tb25KUw0KfSk7
LyohCiAqIEZ1bGxDYWxlbmRhciB2My4wLjEKICogRG9jcyAmIExpY2Vuc2U6IGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vCiAqIChjKSAyMDE2IEFkYW0gU2hhdwogKi8KIWZ1bmN0aW9uKHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5IiwibW9tZW50Il0sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQocmVxdWlyZSgianF1ZXJ5IikscmVxdWlyZSgibW9tZW50IikpOnQoalF1ZXJ5LG1vbWVudCl9KGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gcSh0LHF0KX1mdW5jdGlvbiBpKHQsZSl7ZS5sZWZ0JiZ0LmNzcyh7ImJvcmRlci1sZWZ0LXdpZHRoIjoxLCJtYXJnaW4tbGVmdCI6ZS5sZWZ0LTF9KSxlLnJpZ2h0JiZ0LmNzcyh7ImJvcmRlci1yaWdodC13aWR0aCI6MSwibWFyZ2luLXJpZ2h0IjplLnJpZ2h0LTF9KX1mdW5jdGlvbiByKHQpe3QuY3NzKHsibWFyZ2luLWxlZnQiOiIiLCJtYXJnaW4tcmlnaHQiOiIiLCJib3JkZXItbGVmdC13aWR0aCI6IiIsImJvcmRlci1yaWdodC13aWR0aCI6IiJ9KX1mdW5jdGlvbiBzKCl7dCgiYm9keSIpLmFkZENsYXNzKCJmYy1ub3QtYWxsb3dlZCIpfWZ1bmN0aW9uIG8oKXt0KCJib2R5IikucmVtb3ZlQ2xhc3MoImZjLW5vdC1hbGxvd2VkIil9ZnVuY3Rpb24gbChlLG4saSl7dmFyIHI9TWF0aC5mbG9vcihuL2UubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihlLmxlbmd0aC0xKSksbz1bXSxsPVtdLHU9W10sZD0wO2EoZSksZS5lYWNoKGZ1bmN0aW9uKG4saSl7dmFyIGE9bj09PWUubGVuZ3RoLTE/czpyLGM9dChpKS5vdXRlckhlaWdodCghMCk7YzxhPyhvLnB1c2goaSksbC5wdXNoKGMpLHUucHVzaCh0KGkpLmhlaWdodCgpKSk6ZCs9Y30pLGkmJihuLT1kLHI9TWF0aC5mbG9vcihuL28ubGVuZ3RoKSxzPU1hdGguZmxvb3Iobi1yKihvLmxlbmd0aC0xKSkpLHQobykuZWFjaChmdW5jdGlvbihlLG4pe3ZhciBpPWU9PT1vLmxlbmd0aC0xP3M6cixhPWxbZV0sZD11W2VdLGM9aS0oYS1kKTthPGkmJnQobikuaGVpZ2h0KGMpfSl9ZnVuY3Rpb24gYSh0KXt0LmhlaWdodCgiIil9ZnVuY3Rpb24gdShlKXt2YXIgbj0wO3JldHVybiBlLmZpbmQoIj4gKiIpLmVhY2goZnVuY3Rpb24oZSxpKXt2YXIgcj10KGkpLm91dGVyV2lkdGgoKTtyPm4mJihuPXIpfSksbisrLGUud2lkdGgobiksbn1mdW5jdGlvbiBkKHQsZSl7dmFyIG4saT10LmFkZChlKTtyZXR1cm4gaS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGVmdDotMX0pLG49dC5vdXRlckhlaWdodCgpLWUub3V0ZXJIZWlnaHQoKSxpLmNzcyh7cG9zaXRpb246IiIsbGVmdDoiIn0pLG59ZnVuY3Rpb24gYyhlKXt2YXIgbj1lLmNzcygicG9zaXRpb24iKSxpPWUucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7cmV0dXJuLyhhdXRvfHNjcm9sbCkvLnRlc3QoZS5jc3MoIm92ZXJmbG93IikrZS5jc3MoIm92ZXJmbG93LXkiKStlLmNzcygib3ZlcmZsb3cteCIpKX0pLmVxKDApO3JldHVybiJmaXhlZCIhPT1uJiZpLmxlbmd0aD9pOnQoZVswXS5vd25lckRvY3VtZW50fHxkb2N1bWVudCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1uLmxlZnQtKGU/ZS5sZWZ0OjApLHI9bi50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6aSxyaWdodDppK3Qub3V0ZXJXaWR0aCgpLHRvcDpyLGJvdHRvbTpyK3Qub3V0ZXJIZWlnaHQoKX19ZnVuY3Rpb24gZih0LGUpe3ZhciBuPXQub2Zmc2V0KCksaT1wKHQpLHI9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKStpLmxlZnQtKGU/ZS5sZWZ0OjApLHM9bi50b3AreSh0LCJib3JkZXItdG9wLXdpZHRoIikraS50b3AtKGU/ZS50b3A6MCk7cmV0dXJue2xlZnQ6cixyaWdodDpyK3RbMF0uY2xpZW50V2lkdGgsdG9wOnMsYm90dG9tOnMrdFswXS5jbGllbnRIZWlnaHR9fWZ1bmN0aW9uIGcodCxlKXt2YXIgbj10Lm9mZnNldCgpLGk9bi5sZWZ0K3kodCwiYm9yZGVyLWxlZnQtd2lkdGgiKSt5KHQsInBhZGRpbmctbGVmdCIpLShlP2UubGVmdDowKSxyPW4udG9wK3kodCwiYm9yZGVyLXRvcC13aWR0aCIpK3kodCwicGFkZGluZy10b3AiKS0oZT9lLnRvcDowKTtyZXR1cm57bGVmdDppLHJpZ2h0OmkrdC53aWR0aCgpLHRvcDpyLGJvdHRvbTpyK3QuaGVpZ2h0KCl9fWZ1bmN0aW9uIHAodCl7dmFyIGU9dC5pbm5lcldpZHRoKCktdFswXS5jbGllbnRXaWR0aCxuPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206dC5pbm5lckhlaWdodCgpLXRbMF0uY2xpZW50SGVpZ2h0fTtyZXR1cm4gdigpJiYicnRsIj09dC5jc3MoImRpcmVjdGlvbiIpP24ubGVmdD1lOm4ucmlnaHQ9ZSxufWZ1bmN0aW9uIHYoKXtyZXR1cm4gbnVsbD09PVp0JiYoWnQ9bSgpKSxadH1mdW5jdGlvbiBtKCl7dmFyIGU9dCgiPGRpdj48ZGl2Lz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOi0xZTMsbGVmdDowLGJvcmRlcjowLHBhZGRpbmc6MCxvdmVyZmxvdzoic2Nyb2xsIixkaXJlY3Rpb246InJ0bCJ9KS5hcHBlbmRUbygiYm9keSIpLG49ZS5jaGlsZHJlbigpLGk9bi5vZmZzZXQoKS5sZWZ0PmUub2Zmc2V0KCkubGVmdDtyZXR1cm4gZS5yZW1vdmUoKSxpfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4gcGFyc2VGbG9hdCh0LmNzcyhlKSl8fDB9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gMT09dC53aGljaCYmIXQuY3RybEtleX1mdW5jdGlvbiB3KHQpe2lmKHZvaWQgMCE9PXQucGFnZVgpcmV0dXJuIHQucGFnZVg7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7cmV0dXJuIGU/ZVswXS5wYWdlWDp2b2lkIDB9ZnVuY3Rpb24gRSh0KXtpZih2b2lkIDAhPT10LnBhZ2VZKXJldHVybiB0LnBhZ2VZO3ZhciBlPXQub3JpZ2luYWxFdmVudC50b3VjaGVzO3JldHVybiBlP2VbMF0ucGFnZVk6dm9pZCAwfWZ1bmN0aW9uIEQodCl7cmV0dXJuL150b3VjaC8udGVzdCh0LnR5cGUpfWZ1bmN0aW9uIGIodCl7dC5hZGRDbGFzcygiZmMtdW5zZWxlY3RhYmxlIikub24oInNlbGVjdHN0YXJ0IixDKX1mdW5jdGlvbiBDKHQpe3QucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBIKHQpe3JldHVybiEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0LCEwKSwhMCl9ZnVuY3Rpb24gVCh0KXtyZXR1cm4hIXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdCwhMCksITApfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj17bGVmdDpNYXRoLm1heCh0LmxlZnQsZS5sZWZ0KSxyaWdodDpNYXRoLm1pbih0LnJpZ2h0LGUucmlnaHQpLHRvcDpNYXRoLm1heCh0LnRvcCxlLnRvcCksYm90dG9tOk1hdGgubWluKHQuYm90dG9tLGUuYm90dG9tKX07cmV0dXJuIG4ubGVmdDxuLnJpZ2h0JiZuLnRvcDxuLmJvdHRvbSYmbn1mdW5jdGlvbiBSKHQsZSl7cmV0dXJue2xlZnQ6TWF0aC5taW4oTWF0aC5tYXgodC5sZWZ0LGUubGVmdCksZS5yaWdodCksdG9wOk1hdGgubWluKE1hdGgubWF4KHQudG9wLGUudG9wKSxlLmJvdHRvbSl9fWZ1bmN0aW9uIEkodCl7cmV0dXJue2xlZnQ6KHQubGVmdCt0LnJpZ2h0KS8yLHRvcDoodC50b3ArdC5ib3R0b20pLzJ9fWZ1bmN0aW9uIGsodCxlKXtyZXR1cm57bGVmdDp0LmxlZnQtZS5sZWZ0LHRvcDp0LnRvcC1lLnRvcH19ZnVuY3Rpb24gTShlKXt2YXIgbixpLHI9W10scz1bXTtmb3IoInN0cmluZyI9PXR5cGVvZiBlP3M9ZS5zcGxpdCgvXHMqLFxzKi8pOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3M9W2VdOnQuaXNBcnJheShlKSYmKHM9ZSksbj0wO248cy5sZW5ndGg7bisrKWk9c1tuXSwic3RyaW5nIj09dHlwZW9mIGk/ci5wdXNoKCItIj09aS5jaGFyQXQoMCk/e2ZpZWxkOmkuc3Vic3RyaW5nKDEpLG9yZGVyOi0xfTp7ZmllbGQ6aSxvcmRlcjoxfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucHVzaCh7ZnVuYzppfSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTCh0LGUsbil7dmFyIGkscjtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKWlmKHI9Qih0LGUsbltpXSkpcmV0dXJuIHI7cmV0dXJuIDB9ZnVuY3Rpb24gQih0LGUsbil7cmV0dXJuIG4uZnVuYz9uLmZ1bmModCxlKTp6KHRbbi5maWVsZF0sZVtuLmZpZWxkXSkqKG4ub3JkZXJ8fDEpfWZ1bmN0aW9uIHooZSxuKXtyZXR1cm4gZXx8bj9udWxsPT1uPy0xOm51bGw9PWU/MToic3RyaW5nIj09PXQudHlwZShlKXx8InN0cmluZyI9PT10LnR5cGUobik/U3RyaW5nKGUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKG4pKTplLW46MH1mdW5jdGlvbiBGKHQsZSl7dmFyIG4saSxyLHMsbz10LnN0YXJ0LGw9dC5lbmQsYT1lLnN0YXJ0LHU9ZS5lbmQ7aWYobD5hJiZvPHUpcmV0dXJuIG8+PWE/KG49by5jbG9uZSgpLHI9ITApOihuPWEuY2xvbmUoKSxyPSExKSxsPD11PyhpPWwuY2xvbmUoKSxzPSEwKTooaT11LmNsb25lKCkscz0hMSkse3N0YXJ0Om4sZW5kOmksaXNTdGFydDpyLGlzRW5kOnN9fWZ1bmN0aW9uIE4odCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKSxtczp0LnRpbWUoKS1uLnRpbWUoKX0pfWZ1bmN0aW9uIEcodCxuKXtyZXR1cm4gZS5kdXJhdGlvbih7ZGF5czp0LmNsb25lKCkuc3RyaXBUaW1lKCkuZGlmZihuLmNsb25lKCkuc3RyaXBUaW1lKCksImRheXMiKX0pfWZ1bmN0aW9uIEEodCxuLGkpe3JldHVybiBlLmR1cmF0aW9uKE1hdGgucm91bmQodC5kaWZmKG4saSwhMCkpLGkpfWZ1bmN0aW9uIE8odCxlKXt2YXIgbixpLHI7Zm9yKG49MDtuPFh0Lmxlbmd0aCYmKGk9WHRbbl0scj1WKGksdCxlKSwhKHI+PTEmJm90KHIpKSk7bisrKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsbixpKXtyZXR1cm4gbnVsbCE9aT9pLmRpZmYobix0LCEwKTplLmlzRHVyYXRpb24obik/bi5hcyh0KTpuLmVuZC5kaWZmKG4uc3RhcnQsdCwhMCl9ZnVuY3Rpb24gUCh0LGUsbil7dmFyIGk7cmV0dXJuIFcobik/KGUtdCkvbjooaT1uLmFzTW9udGhzKCksTWF0aC5hYnMoaSk+PTEmJm90KGkpP2UuZGlmZih0LCJtb250aHMiLCEwKS9pOmUuZGlmZih0LCJkYXlzIiwhMCkvbi5hc0RheXMoKSl9ZnVuY3Rpb24gXyh0LGUpe3ZhciBuLGk7cmV0dXJuIFcodCl8fFcoZSk/dC9lOihuPXQuYXNNb250aHMoKSxpPWUuYXNNb250aHMoKSxNYXRoLmFicyhuKT49MSYmb3QobikmJk1hdGguYWJzKGkpPj0xJiZvdChpKT9uL2k6dC5hc0RheXMoKS9lLmFzRGF5cygpKX1mdW5jdGlvbiBZKHQsbil7dmFyIGk7cmV0dXJuIFcodCk/ZS5kdXJhdGlvbih0Km4pOihpPXQuYXNNb250aHMoKSxNYXRoLmFicyhpKT49MSYmb3QoaSk/ZS5kdXJhdGlvbih7bW9udGhzOmkqbn0pOmUuZHVyYXRpb24oe2RheXM6dC5hc0RheXMoKSpufSkpfWZ1bmN0aW9uIFcodCl7cmV0dXJuIEJvb2xlYW4odC5ob3VycygpfHx0Lm1pbnV0ZXMoKXx8dC5zZWNvbmRzKCl8fHQubWlsbGlzZWNvbmRzKCkpfWZ1bmN0aW9uIGoodCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfHx0IGluc3RhbmNlb2YgRGF0ZX1mdW5jdGlvbiBVKHQpe3JldHVybi9eXGQrXDpcZCsoPzpcOlxkK1wuPyg/OlxkezN9KT8pPyQvLnRlc3QodCl9ZnVuY3Rpb24gcSh0LGUpe3ZhciBuLGkscixzLG8sbCxhPXt9O2lmKGUpZm9yKG49MDtuPGUubGVuZ3RoO24rKyl7Zm9yKGk9ZVtuXSxyPVtdLHM9dC5sZW5ndGgtMTtzPj0wO3MtLSlpZihvPXRbc11baV0sIm9iamVjdCI9PXR5cGVvZiBvKXIudW5zaGlmdChvKTtlbHNlIGlmKHZvaWQgMCE9PW8pe2FbaV09bzticmVha31yLmxlbmd0aCYmKGFbaV09cShyKSl9Zm9yKG49dC5sZW5ndGgtMTtuPj0wO24tLSl7bD10W25dO2ZvcihpIGluIGwpaSBpbiBhfHwoYVtpXT1sW2ldKX1yZXR1cm4gYX1mdW5jdGlvbiBaKHQpe3ZhciBlPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZS5wcm90b3R5cGU9dCxuZXcgZX1mdW5jdGlvbiAkKHQsZSl7Zm9yKHZhciBuIGluIHQpWCh0LG4pJiYoZVtuXT10W25dKX1mdW5jdGlvbiBYKHQsZSl7cmV0dXJuIEt0LmNhbGwodCxlKX1mdW5jdGlvbiBLKGUpe3JldHVybi91bmRlZmluZWR8bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmcvLnRlc3QodC50eXBlKGUpKX1mdW5jdGlvbiBRKGUsbixpKXtpZih0LmlzRnVuY3Rpb24oZSkmJihlPVtlXSksZSl7dmFyIHIscztmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKXM9ZVtyXS5hcHBseShuLGkpfHxzO3JldHVybiBzfX1mdW5jdGlvbiBKKCl7Zm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylpZih2b2lkIDAhPT1hcmd1bWVudHNbdF0pcmV0dXJuIGFyZ3VtZW50c1t0XX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4odCsiIikucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLycvZywiJiMwMzk7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC9cbi9nLCI8YnIgLz4iKX1mdW5jdGlvbiBldCh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mLio/Oy9nLCIiKX1mdW5jdGlvbiBudChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsiOiIrZSl9KSxuLmpvaW4oIjsiKX1mdW5jdGlvbiBpdChlKXt2YXIgbj1bXTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtudWxsIT1lJiZuLnB1c2godCsnPSInK3R0KGUpKyciJyl9KSxuLmpvaW4oIiAiKX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWZ1bmN0aW9uIHN0KHQsZSl7cmV0dXJuIHQtZX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4gdCUxPT09MH1mdW5jdGlvbiBsdCh0LGUpe3ZhciBuPXRbZV07cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBhdCh0LGUsbil7dmFyIGkscixzLG8sbCxhPWZ1bmN0aW9uKCl7dmFyIHU9K25ldyBEYXRlLW87dTxlP2k9c2V0VGltZW91dChhLGUtdSk6KGk9bnVsbCxufHwobD10LmFwcGx5KHMscikscz1yPW51bGwpKX07cmV0dXJuIGZ1bmN0aW9uKCl7cz10aGlzLHI9YXJndW1lbnRzLG89K25ldyBEYXRlO3ZhciB1PW4mJiFpO3JldHVybiBpfHwoaT1zZXRUaW1lb3V0KGEsZSkpLHUmJihsPXQuYXBwbHkocyxyKSxzPXI9bnVsbCksbH19ZnVuY3Rpb24gdXQoZSxuKXtyZXR1cm4gZSYmZS50aGVuJiYicmVzb2x2ZWQiIT09ZS5zdGF0ZSgpP24/ZS50aGVuKG4pOnZvaWQgMDp0LndoZW4obigpKX1mdW5jdGlvbiBkdChuLGkscil7dmFyIHMsbyxsLGEsdT1uWzBdLGQ9MT09bi5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgdTtyZXR1cm4gZS5pc01vbWVudCh1KXx8aih1KXx8dm9pZCAwPT09dT9hPWUuYXBwbHkobnVsbCxuKToocz0hMSxvPSExLGQ/UXQudGVzdCh1KT8odSs9Ii0wMSIsbj1bdV0scz0hMCxvPSEwKToobD1KdC5leGVjKHUpKSYmKHM9IWxbNV0sbz0hMCk6dC5pc0FycmF5KHUpJiYobz0hMCksYT1pfHxzP2UudXRjLmFwcGx5KGUsbik6ZS5hcHBseShudWxsLG4pLHM/KGEuX2FtYmlnVGltZT0hMCxhLl9hbWJpZ1pvbmU9ITApOnImJihvP2EuX2FtYmlnWm9uZT0hMDpkJiZhLnV0Y09mZnNldCh1KSkpLGEuX2Z1bGxDYWxlbmRhcj0hMCxhfWZ1bmN0aW9uIGN0KHQsZSl7cmV0dXJuIGVlLmZvcm1hdC5jYWxsKHQsZSl9ZnVuY3Rpb24gaHQodCxlKXtyZXR1cm4gZnQodCx5dChlKSl9ZnVuY3Rpb24gZnQodCxlKXt2YXIgbixpPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaSs9Z3QodCxlW25dKTtyZXR1cm4gaX1mdW5jdGlvbiBndCh0LGUpe3ZhciBuLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6KG49ZS50b2tlbik/aWVbbl0/aWVbbl0odCk6Y3QodCxuKTplLm1heWJlJiYoaT1mdCh0LGUubWF5YmUpLGkubWF0Y2goL1sxLTldLykpP2k6IiJ9ZnVuY3Rpb24gcHQodCxlLG4saSxyKXt2YXIgcztyZXR1cm4gdD1qdC5tb21lbnQucGFyc2Vab25lKHQpLGU9anQubW9tZW50LnBhcnNlWm9uZShlKSxzPXQubG9jYWxlRGF0YSgpLG49cy5sb25nRGF0ZUZvcm1hdChuKXx8bixpPWl8fCIgLSAiLHZ0KHQsZSx5dChuKSxpLHIpfWZ1bmN0aW9uIHZ0KHQsZSxuLGkscil7dmFyIHMsbyxsLGEsdT10LmNsb25lKCkuc3RyaXBab25lKCksZD1lLmNsb25lKCkuc3RyaXBab25lKCksYz0iIixoPSIiLGY9IiIsZz0iIixwPSIiO2ZvcihvPTA7bzxuLmxlbmd0aCYmKHM9bXQodCxlLHUsZCxuW29dKSxzIT09ITEpO28rKyljKz1zO2ZvcihsPW4ubGVuZ3RoLTE7bD5vJiYocz1tdCh0LGUsdSxkLG5bbF0pLHMhPT0hMSk7bC0tKWg9cytoO2ZvcihhPW87YTw9bDthKyspZis9Z3QodCxuW2FdKSxnKz1ndChlLG5bYV0pO3JldHVybihmfHxnKSYmKHA9cj9nK2krZjpmK2krZyksYytwK2h9ZnVuY3Rpb24gbXQodCxlLG4saSxyKXt2YXIgcyxvO3JldHVybiJzdHJpbmciPT10eXBlb2Ygcj9yOiEhKChzPXIudG9rZW4pJiYobz1yZVtzLmNoYXJBdCgwKV0sbyYmbi5pc1NhbWUoaSxvKSkpJiZjdCh0LHMpfWZ1bmN0aW9uIHl0KHQpe3JldHVybiB0IGluIHNlP3NlW3RdOnNlW3RdPVN0KHQpfWZ1bmN0aW9uIFN0KHQpe2Zvcih2YXIgZSxuPVtdLGk9L1xbKFteXF1dKilcXXxcKChbXlwpXSopXCl8KExUU3xMVHwoXHcpXDQqbz8pfChbXlx3XFtcKF0rKS9nO2U9aS5leGVjKHQpOyllWzFdP24ucHVzaChlWzFdKTplWzJdP24ucHVzaCh7bWF5YmU6U3QoZVsyXSl9KTplWzNdP24ucHVzaCh7dG9rZW46ZVszXX0pOmVbNV0mJm4ucHVzaChlWzVdKTtyZXR1cm4gbn1mdW5jdGlvbiB3dCgpe31mdW5jdGlvbiBFdCh0LGUpe3ZhciBuO3JldHVybiBYKGUsImNvbnN0cnVjdG9yIikmJihuPWUuY29uc3RydWN0b3IpLCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1lLmNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxuLnByb3RvdHlwZT1aKHQucHJvdG90eXBlKSwkKGUsbi5wcm90b3R5cGUpLCQodCxuKSxufWZ1bmN0aW9uIER0KHQsZSl7JChlLHQucHJvdG90eXBlKX1mdW5jdGlvbiBidCh0LGUpe3JldHVybiF0JiYhZXx8ISghdHx8IWUpJiYodC5jb21wb25lbnQ9PT1lLmNvbXBvbmVudCYmQ3QodCxlKSYmQ3QoZSx0KSl9ZnVuY3Rpb24gQ3QodCxlKXtmb3IodmFyIG4gaW4gdClpZighL14oY29tcG9uZW50fGxlZnR8cmlnaHR8dG9wfGJvdHRvbSkkLy50ZXN0KG4pJiZ0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBIdCh0KXtyZXR1cm57c3RhcnQ6dC5zdGFydC5jbG9uZSgpLGVuZDp0LmVuZD90LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnQuYWxsRGF5fX1mdW5jdGlvbiBUdCh0KXt2YXIgZT1SdCh0KTtyZXR1cm4iYmFja2dyb3VuZCI9PT1lfHwiaW52ZXJzZS1iYWNrZ3JvdW5kIj09PWV9ZnVuY3Rpb24geHQodCl7cmV0dXJuImludmVyc2UtYmFja2dyb3VuZCI9PT1SdCh0KX1mdW5jdGlvbiBSdCh0KXtyZXR1cm4gSigodC5zb3VyY2V8fHt9KS5yZW5kZXJpbmcsdC5yZW5kZXJpbmcpfWZ1bmN0aW9uIEl0KHQpe3ZhciBlLG4saT17fTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSwoaVtuLl9pZF18fChpW24uX2lkXT1bXSkpLnB1c2gobik7cmV0dXJuIGl9ZnVuY3Rpb24ga3QodCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fWZ1bmN0aW9uIE10KG4pe3ZhciBpLHIscyxvLGw9anQuZGF0YUF0dHJQcmVmaXg7cmV0dXJuIGwmJihsKz0iLSIpLGk9bi5kYXRhKGwrImV2ZW50Iil8fG51bGwsaSYmKGk9Im9iamVjdCI9PXR5cGVvZiBpP3QuZXh0ZW5kKHt9LGkpOnt9LHI9aS5zdGFydCxudWxsPT1yJiYocj1pLnRpbWUpLHM9aS5kdXJhdGlvbixvPWkuc3RpY2ssZGVsZXRlIGkuc3RhcnQsZGVsZXRlIGkudGltZSxkZWxldGUgaS5kdXJhdGlvbixkZWxldGUgaS5zdGljayksbnVsbD09ciYmKHI9bi5kYXRhKGwrInN0YXJ0IikpLG51bGw9PXImJihyPW4uZGF0YShsKyJ0aW1lIikpLG51bGw9PXMmJihzPW4uZGF0YShsKyJkdXJhdGlvbiIpKSxudWxsPT1vJiYobz1uLmRhdGEobCsic3RpY2siKSkscj1udWxsIT1yP2UuZHVyYXRpb24ocik6bnVsbCxzPW51bGwhPXM/ZS5kdXJhdGlvbihzKTpudWxsLG89Qm9vbGVhbihvKSx7ZXZlbnRQcm9wczppLHN0YXJ0VGltZTpyLGR1cmF0aW9uOnMsc3RpY2s6b319ZnVuY3Rpb24gTHQodCxlKXt2YXIgbixpO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaWYoaT1lW25dLGkubGVmdENvbDw9dC5yaWdodENvbCYmaS5yaWdodENvbD49dC5sZWZ0Q29sKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEJ0KHQsZSl7cmV0dXJuIHQubGVmdENvbC1lLmxlZnRDb2x9ZnVuY3Rpb24genQodCl7dmFyIGUsbixpLHI9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmR3QobixyW2ldKS5sZW5ndGg7aSsrKTtuLmxldmVsPWksKHJbaV18fChyW2ldPVtdKSkucHVzaChuKX1yZXR1cm4gcn1mdW5jdGlvbiBGdCh0KXt2YXIgZSxuLGkscixzO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspZm9yKG49dFtlXSxpPTA7aTxuLmxlbmd0aDtpKyspZm9yKHI9bltpXSxyLmZvcndhcmRTZWdzPVtdLHM9ZSsxO3M8dC5sZW5ndGg7cysrKUd0KHIsdFtzXSxyLmZvcndhcmRTZWdzKX1mdW5jdGlvbiBOdCh0KXt2YXIgZSxuLGk9dC5mb3J3YXJkU2VncyxyPTA7aWYodm9pZCAwPT09dC5mb3J3YXJkUHJlc3N1cmUpe2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspbj1pW2VdLE50KG4pLHI9TWF0aC5tYXgociwxK24uZm9yd2FyZFByZXNzdXJlKTt0LmZvcndhcmRQcmVzc3VyZT1yfX1mdW5jdGlvbiBHdCh0LGUsbil7bj1ufHxbXTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylBdCh0LGVbaV0pJiZuLnB1c2goZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQXQodCxlKXtyZXR1cm4gdC5ib3R0b20+ZS50b3AmJnQudG9wPGUuYm90dG9tfWZ1bmN0aW9uIE90KG4saSl7ZnVuY3Rpb24gcih0KXt0Ll9sb2NhbGU9VX1mdW5jdGlvbiBzKCl7JD91KCkmJihnKCksZCgpKTpvKCl9ZnVuY3Rpb24gbygpe24uYWRkQ2xhc3MoImZjIiksbi5vbigiY2xpY2suZmMiLCJhW2RhdGEtZ290b10iLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcyksaT1uLmRhdGEoImdvdG8iKSxyPWoubW9tZW50KGkuZGF0ZSkscz1pLnR5cGUsbz1LLm9wdCgibmF2TGluayIrcnQocykrIkNsaWNrIik7ImZ1bmN0aW9uIj09dHlwZW9mIG8/byhyLGUpOigic3RyaW5nIj09dHlwZW9mIG8mJihzPW8pLE4ocixzKSl9KSxqLmJpbmRPcHRpb24oInRoZW1lIixmdW5jdGlvbih0KXtYPXQ/InVpIjoiZmMiLG4udG9nZ2xlQ2xhc3MoInVpLXdpZGdldCIsdCksbi50b2dnbGVDbGFzcygiZmMtdW50aGVtZWQiLCF0KX0pLGouYmluZE9wdGlvbnMoWyJpc1JUTCIsImxvY2FsZSJdLGZ1bmN0aW9uKHQpe24udG9nZ2xlQ2xhc3MoImZjLWx0ciIsIXQpLG4udG9nZ2xlQ2xhc3MoImZjLXJ0bCIsdCl9KSwkPXQoIjxkaXYgY2xhc3M9J2ZjLXZpZXctY29udGFpbmVyJy8+IikucHJlcGVuZFRvKG4pLHE9ai5oZWFkZXI9bmV3IF90KGopLGwoKSxkKGoub3B0aW9ucy5kZWZhdWx0Vmlldyksai5vcHRpb25zLmhhbmRsZVdpbmRvd1Jlc2l6ZSYmKEo9YXQobSxqLm9wdGlvbnMud2luZG93UmVzaXplRGVsYXkpLHQod2luZG93KS5yZXNpemUoSikpfWZ1bmN0aW9uIGwoKXtxLnJlbmRlcigpLHEuZWwmJm4ucHJlcGVuZChxLmVsKX1mdW5jdGlvbiBhKCl7SyYmSy5yZW1vdmVFbGVtZW50KCkscS5yZW1vdmVFbGVtZW50KCksJC5yZW1vdmUoKSxuLnJlbW92ZUNsYXNzKCJmYyBmYy1sdHIgZmMtcnRsIGZjLXVudGhlbWVkIHVpLXdpZGdldCIpLG4ub2ZmKCIuZmMiKSxKJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLEopfWZ1bmN0aW9uIHUoKXtyZXR1cm4gbi5pcygiOnZpc2libGUiKX1mdW5jdGlvbiBkKGUsbil7bHQrKyxLJiZlJiZLLnR5cGUhPT1lJiYoQSgpLGMoKSksIUsmJmUmJihLPWoudmlldz1vdFtlXXx8KG90W2VdPWouaW5zdGFudGlhdGVWaWV3KGUpKSxLLnNldEVsZW1lbnQodCgiPGRpdiBjbGFzcz0nZmMtdmlldyBmYy0iK2UrIi12aWV3JyAvPiIpLmFwcGVuZFRvKCQpKSxxLmFjdGl2YXRlQnV0dG9uKGUpKSxLJiYodHQ9Sy5tYXNzYWdlQ3VycmVudERhdGUodHQpLEsuZGlzcGxheWluZyYmdHQ+PUsuaW50ZXJ2YWxTdGFydCYmdHQ8Sy5pbnRlcnZhbEVuZHx8dSgpJiYoSy5kaXNwbGF5KHR0LG4pLE8oKSxIKCksVCgpLEUoKSkpLE8oKSxsdC0tfWZ1bmN0aW9uIGMoKXtxLmRlYWN0aXZhdGVCdXR0b24oSy50eXBlKSxLLnJlbW92ZUVsZW1lbnQoKSxLPWoudmlldz1udWxsfWZ1bmN0aW9uIGgoKXtsdCsrLEEoKTt2YXIgdD1LLnR5cGUsZT1LLnF1ZXJ5U2Nyb2xsKCk7YygpLGQodCxlKSxPKCksbHQtLX1mdW5jdGlvbiBmKHQpe2lmKHUoKSlyZXR1cm4gdCYmcCgpLGx0KyssSy51cGRhdGVTaXplKCEwKSxsdC0tLCEwfWZ1bmN0aW9uIGcoKXt1KCkmJnAoKX1mdW5jdGlvbiBwKCl7dmFyIHQ9ai5vcHRpb25zLmNvbnRlbnRIZWlnaHQsZT1qLm9wdGlvbnMuaGVpZ2h0O1E9Im51bWJlciI9PXR5cGVvZiB0P3Q6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOiJudW1iZXIiPT10eXBlb2YgZT9lLXYoKToiZnVuY3Rpb24iPT10eXBlb2YgZT9lKCktdigpOiJwYXJlbnQiPT09ZT9uLnBhcmVudCgpLmhlaWdodCgpLXYoKTpNYXRoLnJvdW5kKCQud2lkdGgoKS9NYXRoLm1heChqLm9wdGlvbnMuYXNwZWN0UmF0aW8sLjUpKX1mdW5jdGlvbiB2KCl7cmV0dXJuIHEuZWw/cS5lbC5vdXRlckhlaWdodCghMCk6MH1mdW5jdGlvbiBtKHQpeyFsdCYmdC50YXJnZXQ9PT13aW5kb3cmJksuc3RhcnQmJmYoITApJiZLLnRyaWdnZXIoIndpbmRvd1Jlc2l6ZSIsc3QpfWZ1bmN0aW9uIHkoKXtEKCl9ZnVuY3Rpb24gUyh0KXtpdChqLmdldEV2ZW50U291cmNlc0J5TWF0Y2hBcnJheSh0KSl9ZnVuY3Rpb24gdygpe3UoKSYmKEEoKSxLLmRpc3BsYXlFdmVudHModXQpLE8oKSl9ZnVuY3Rpb24gRSgpeyFqLm9wdGlvbnMubGF6eUZldGNoaW5nfHxldChLLnN0YXJ0LEsuZW5kKT9EKCk6dygpfWZ1bmN0aW9uIEQoKXtudChLLnN0YXJ0LEsuZW5kKX1mdW5jdGlvbiBiKHQpe3V0PXQsdygpfWZ1bmN0aW9uIEMoKXt3KCl9ZnVuY3Rpb24gSCgpe3EudXBkYXRlVGl0bGUoSy50aXRsZSl9ZnVuY3Rpb24gVCgpe3ZhciB0PWouZ2V0Tm93KCk7dD49Sy5pbnRlcnZhbFN0YXJ0JiZ0PEsuaW50ZXJ2YWxFbmQ/cS5kaXNhYmxlQnV0dG9uKCJ0b2RheSIpOnEuZW5hYmxlQnV0dG9uKCJ0b2RheSIpfWZ1bmN0aW9uIHgodCxlKXtLLnNlbGVjdChqLmJ1aWxkU2VsZWN0U3Bhbi5hcHBseShqLGFyZ3VtZW50cykpfWZ1bmN0aW9uIFIoKXtLJiZLLnVuc2VsZWN0KCl9ZnVuY3Rpb24gSSgpe3R0PUsuY29tcHV0ZVByZXZEYXRlKHR0KSxkKCl9ZnVuY3Rpb24gaygpe3R0PUsuY29tcHV0ZU5leHREYXRlKHR0KSxkKCl9ZnVuY3Rpb24gTSgpe3R0LmFkZCgtMSwieWVhcnMiKSxkKCl9ZnVuY3Rpb24gTCgpe3R0LmFkZCgxLCJ5ZWFycyIpLGQoKX1mdW5jdGlvbiBCKCl7dHQ9ai5nZXROb3coKSxkKCl9ZnVuY3Rpb24geih0KXt0dD1qLm1vbWVudCh0KS5zdHJpcFpvbmUoKSxkKCl9ZnVuY3Rpb24gRih0KXt0dC5hZGQoZS5kdXJhdGlvbih0KSksZCgpfWZ1bmN0aW9uIE4odCxlKXt2YXIgbjtlPWV8fCJkYXkiLG49ai5nZXRWaWV3U3BlYyhlKXx8ai5nZXRVbml0Vmlld1NwZWMoZSksdHQ9dC5jbG9uZSgpLGQobj9uLnR5cGU6bnVsbCl9ZnVuY3Rpb24gRygpe3JldHVybiBqLmFwcGx5VGltZXpvbmUodHQpfWZ1bmN0aW9uIEEoKXskLmNzcyh7d2lkdGg6IjEwMCUiLGhlaWdodDokLmhlaWdodCgpLG92ZXJmbG93OiJoaWRkZW4ifSl9ZnVuY3Rpb24gTygpeyQuY3NzKHt3aWR0aDoiIixoZWlnaHQ6IiIsb3ZlcmZsb3c6IiJ9KX1mdW5jdGlvbiBWKCl7cmV0dXJuIGp9ZnVuY3Rpb24gUCgpe3JldHVybiBLfWZ1bmN0aW9uIF8odCxlKXt2YXIgbjtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWUpcmV0dXJuIGoub3B0aW9uc1t0XTtuPXt9LG5bdF09ZSxZKG4pfWVsc2Uib2JqZWN0Ij09dHlwZW9mIHQmJlkodCl9ZnVuY3Rpb24gWSh0KXt2YXIgZSxuPTA7Zm9yKGUgaW4gdClqLmR5bmFtaWNPdmVycmlkZXNbZV09dFtlXTtqLnZpZXdTcGVjQ2FjaGU9e30sai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7Zm9yKGUgaW4gdClqLnRyaWdnZXJPcHRpb25IYW5kbGVycyhlKSxuKys7aWYoMT09PW4pe2lmKCJoZWlnaHQiPT09ZXx8ImNvbnRlbnRIZWlnaHQiPT09ZXx8ImFzcGVjdFJhdGlvIj09PWUpcmV0dXJuIHZvaWQgZighMCk7aWYoImRlZmF1bHREYXRlIj09PWUpcmV0dXJuO2lmKCJidXNpbmVzc0hvdXJzIj09PWUpcmV0dXJuIHZvaWQoSyYmKEsudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCksSy5yZW5kZXJCdXNpbmVzc0hvdXJzKCkpKTtpZigidGltZXpvbmUiPT09ZSlyZXR1cm4gai5yZXpvbmVBcnJheUV2ZW50U291cmNlcygpLHZvaWQgeSgpfWwoKSxvdD17fSxoKCl9ZnVuY3Rpb24gVyh0LGUpe3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtpZihlPWV8fHN0LHRoaXMudHJpZ2dlcldpdGgodCxlLG4pLGoub3B0aW9uc1t0XSlyZXR1cm4gai5vcHRpb25zW3RdLmFwcGx5KGUsbil9dmFyIGo9dGhpcztqLnJlbmRlcj1zLGouZGVzdHJveT1hLGoucmVmZXRjaEV2ZW50cz15LGoucmVmZXRjaEV2ZW50U291cmNlcz1TLGoucmVwb3J0RXZlbnRzPWIsai5yZXBvcnRFdmVudENoYW5nZT1DLGoucmVyZW5kZXJFdmVudHM9dyxqLmNoYW5nZVZpZXc9ZCxqLnNlbGVjdD14LGoudW5zZWxlY3Q9UixqLnByZXY9SSxqLm5leHQ9ayxqLnByZXZZZWFyPU0sai5uZXh0WWVhcj1MLGoudG9kYXk9QixqLmdvdG9EYXRlPXosai5pbmNyZW1lbnREYXRlPUYsai56b29tVG89TixqLmdldERhdGU9RyxqLmdldENhbGVuZGFyPVYsai5nZXRWaWV3PVAsai5vcHRpb249XyxqLnRyaWdnZXI9VyxqLmR5bmFtaWNPdmVycmlkZXM9e30sai52aWV3U3BlY0NhY2hlPXt9LGoub3B0aW9uSGFuZGxlcnM9e30sai5vdmVycmlkZXM9dC5leHRlbmQoe30saSksai5wb3B1bGF0ZU9wdGlvbnNIYXNoKCk7dmFyIFU7ai5iaW5kT3B0aW9ucyhbImxvY2FsZSIsIm1vbnRoTmFtZXMiLCJtb250aE5hbWVzU2hvcnQiLCJkYXlOYW1lcyIsImRheU5hbWVzU2hvcnQiLCJmaXJzdERheSIsIndlZWtOdW1iZXJDYWxjdWxhdGlvbiJdLGZ1bmN0aW9uKHQsZSxuLGkscyxvLGwpe2lmKCJpc28iPT09bCYmKGw9IklTTyIpLFU9WihQdCh0KSksZSYmKFUuX21vbnRocz1lKSxuJiYoVS5fbW9udGhzU2hvcnQ9biksaSYmKFUuX3dlZWtkYXlzPWkpLHMmJihVLl93ZWVrZGF5c1Nob3J0PXMpLG51bGw9PW8mJiJJU08iPT09bCYmKG89MSksbnVsbCE9byl7dmFyIGE9WihVLl93ZWVrKTthLmRvdz1vLFUuX3dlZWs9YX0iSVNPIiE9PWwmJiJsb2NhbCIhPT1sJiYiZnVuY3Rpb24iIT10eXBlb2YgbHx8KFUuX2Z1bGxDYWxlbmRhcl93ZWVrQ2FsYz1sKSx0dCYmcih0dCl9KSxqLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uPWUuZHVyYXRpb24oai5vcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uKSxqLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb249ZS5kdXJhdGlvbihqLm9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5tb21lbnQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4ibG9jYWwiPT09ai5vcHRpb25zLnRpbWV6b25lPyh0PWp0Lm1vbWVudC5hcHBseShudWxsLGFyZ3VtZW50cyksdC5oYXNUaW1lKCkmJnQubG9jYWwoKSk6dD0iVVRDIj09PWoub3B0aW9ucy50aW1lem9uZT9qdC5tb21lbnQudXRjLmFwcGx5KG51bGwsYXJndW1lbnRzKTpqdC5tb21lbnQucGFyc2Vab25lLmFwcGx5KG51bGwsYXJndW1lbnRzKSxyKHQpLHR9LGoubG9jYWxpemVNb21lbnQ9cixqLmdldElzQW1iaWdUaW1lem9uZT1mdW5jdGlvbigpe3JldHVybiJsb2NhbCIhPT1qLm9wdGlvbnMudGltZXpvbmUmJiJVVEMiIT09ai5vcHRpb25zLnRpbWV6b25lfSxqLmFwcGx5VGltZXpvbmU9ZnVuY3Rpb24odCl7aWYoIXQuaGFzVGltZSgpKXJldHVybiB0LmNsb25lKCk7dmFyIGUsbj1qLm1vbWVudCh0LnRvQXJyYXkoKSksaT10LnRpbWUoKS1uLnRpbWUoKTtyZXR1cm4gaSYmKGU9bi5jbG9uZSgpLmFkZChpKSx0LnRpbWUoKS1lLnRpbWUoKT09PTAmJihuPWUpKSxufSxqLmdldE5vdz1mdW5jdGlvbigpe3ZhciB0PWoub3B0aW9ucy5ub3c7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoKSksai5tb21lbnQodCkuc3RyaXBab25lKCl9LGouZ2V0RXZlbnRFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5kP3QuZW5kLmNsb25lKCk6ai5nZXREZWZhdWx0RXZlbnRFbmQodC5hbGxEYXksdC5zdGFydCl9LGouZ2V0RGVmYXVsdEV2ZW50RW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jbG9uZSgpO3JldHVybiB0P24uc3RyaXBUaW1lKCkuYWRkKGouZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pOm4uYWRkKGouZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiksai5nZXRJc0FtYmlnVGltZXpvbmUoKSYmbi5zdHJpcFpvbmUoKSxufSxqLmh1bWFuaXplRHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHQubG9jYWxlKGoub3B0aW9ucy5sb2NhbGUpLmh1bWFuaXplKCl9LFl0LmNhbGwoaik7dmFyIHEsJCxYLEssUSxKLHR0LGV0PWouaXNGZXRjaE5lZWRlZCxudD1qLmZldGNoRXZlbnRzLGl0PWouZmV0Y2hFdmVudFNvdXJjZXMsc3Q9blswXSxvdD17fSxsdD0wLHV0PVtdO3R0PW51bGwhPWoub3B0aW9ucy5kZWZhdWx0RGF0ZT9qLm1vbWVudChqLm9wdGlvbnMuZGVmYXVsdERhdGUpLnN0cmlwWm9uZSgpOmouZ2V0Tm93KCksai5nZXRTdWdnZXN0ZWRWaWV3SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVEmJmcoKSxRfSxqLmlzSGVpZ2h0QXV0bz1mdW5jdGlvbigpe3JldHVybiJhdXRvIj09PWoub3B0aW9ucy5jb250ZW50SGVpZ2h0fHwiYXV0byI9PT1qLm9wdGlvbnMuaGVpZ2h0fSxqLmZyZWV6ZUNvbnRlbnRIZWlnaHQ9QSxqLnVuZnJlZXplQ29udGVudEhlaWdodD1PLGouaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIFZ0KGUpe3QuZWFjaChIZSxmdW5jdGlvbih0LG4pe251bGw9PWVbdF0mJihlW3RdPW4oZSkpfSl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIGUubG9jYWxlRGF0YSh0KXx8ZS5sb2NhbGVEYXRhKCJlbiIpfWZ1bmN0aW9uIF90KGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj1lLm9wdGlvbnMscz1uLmhlYWRlcjtmPW4udGhlbWU/InVpIjoiZmMiLHM/KGg/aC5lbXB0eSgpOmg9dGhpcy5lbD10KCI8ZGl2IGNsYXNzPSdmYy10b29sYmFyJy8+IiksaC5hcHBlbmQocigibGVmdCIpKS5hcHBlbmQocigicmlnaHQiKSkuYXBwZW5kKHIoImNlbnRlciIpKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+JykpOmkoKX1mdW5jdGlvbiBpKCl7aCYmKGgucmVtb3ZlKCksaD1jLmVsPW51bGwpfWZ1bmN0aW9uIHIobil7dmFyIGk9dCgnPGRpdiBjbGFzcz0iZmMtJytuKyciLz4nKSxyPWUub3B0aW9ucyxzPXIuaGVhZGVyW25dO3JldHVybiBzJiZ0LmVhY2gocy5zcGxpdCgiICIpLGZ1bmN0aW9uKG4pe3ZhciBzLG89dCgpLGw9ITA7dC5lYWNoKHRoaXMuc3BsaXQoIiwiKSxmdW5jdGlvbihuLGkpe3ZhciBzLGEsdSxkLGMsaCxwLHYsbSx5OyJ0aXRsZSI9PWk/KG89by5hZGQodCgiPGgyPiZuYnNwOzwvaDI+IikpLGw9ITEpOigocz0oci5jdXN0b21CdXR0b25zfHx7fSlbaV0pPyh1PWZ1bmN0aW9uKHQpe3MuY2xpY2smJnMuY2xpY2suY2FsbCh5WzBdLHQpfSxkPSIiLGM9cy50ZXh0KTooYT1lLmdldFZpZXdTcGVjKGkpKT8odT1mdW5jdGlvbigpe2UuY2hhbmdlVmlldyhpKX0sZy5wdXNoKGkpLGQ9YS5idXR0b25UZXh0T3ZlcnJpZGUsYz1hLmJ1dHRvblRleHREZWZhdWx0KTplW2ldJiYodT1mdW5jdGlvbigpe2VbaV0oKX0sZD0oZS5vdmVycmlkZXMuYnV0dG9uVGV4dHx8e30pW2ldLGM9ci5idXR0b25UZXh0W2ldKSx1JiYoaD1zP3MudGhlbWVJY29uOnIudGhlbWVCdXR0b25JY29uc1tpXSxwPXM/cy5pY29uOnIuYnV0dG9uSWNvbnNbaV0sdj1kP3R0KGQpOmgmJnIudGhlbWU/IjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tIitoKyInPjwvc3Bhbj4iOnAmJiFyLnRoZW1lPyI8c3BhbiBjbGFzcz0nZmMtaWNvbiBmYy1pY29uLSIrcCsiJz48L3NwYW4+Ijp0dChjKSxtPVsiZmMtIitpKyItYnV0dG9uIixmKyItYnV0dG9uIixmKyItc3RhdGUtZGVmYXVsdCJdLHk9dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSInK20uam9pbigiICIpKyciPicrdisiPC9idXR0b24+IikuY2xpY2soZnVuY3Rpb24odCl7eS5oYXNDbGFzcyhmKyItc3RhdGUtZGlzYWJsZWQiKXx8KHUodCksKHkuaGFzQ2xhc3MoZisiLXN0YXRlLWFjdGl2ZSIpfHx5Lmhhc0NsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpKSYmeS5yZW1vdmVDbGFzcyhmKyItc3RhdGUtaG92ZXIiKSl9KS5tb3VzZWRvd24oZnVuY3Rpb24oKXt5Lm5vdCgiLiIrZisiLXN0YXRlLWFjdGl2ZSIpLm5vdCgiLiIrZisiLXN0YXRlLWRpc2FibGVkIikuYWRkQ2xhc3MoZisiLXN0YXRlLWRvd24iKX0pLm1vdXNldXAoZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KS5ob3ZlcihmdW5jdGlvbigpe3kubm90KCIuIitmKyItc3RhdGUtYWN0aXZlIikubm90KCIuIitmKyItc3RhdGUtZGlzYWJsZWQiKS5hZGRDbGFzcyhmKyItc3RhdGUtaG92ZXIiKX0sZnVuY3Rpb24oKXt5LnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1ob3ZlciIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kb3duIil9KSxvPW8uYWRkKHkpKSl9KSxsJiZvLmZpcnN0KCkuYWRkQ2xhc3MoZisiLWNvcm5lci1sZWZ0IikuZW5kKCkubGFzdCgpLmFkZENsYXNzKGYrIi1jb3JuZXItcmlnaHQiKS5lbmQoKSxvLmxlbmd0aD4xPyhzPXQoIjxkaXYvPiIpLGwmJnMuYWRkQ2xhc3MoImZjLWJ1dHRvbi1ncm91cCIpLHMuYXBwZW5kKG8pLGkuYXBwZW5kKHMpKTppLmFwcGVuZChvKX0pLGl9ZnVuY3Rpb24gcyh0KXtoJiZoLmZpbmQoImgyIikudGV4dCh0KX1mdW5jdGlvbiBvKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLmFkZENsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBsKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1hY3RpdmUiKX1mdW5jdGlvbiBhKHQpe2gmJmguZmluZCgiLmZjLSIrdCsiLWJ1dHRvbiIpLnByb3AoImRpc2FibGVkIiwhMCkuYWRkQ2xhc3MoZisiLXN0YXRlLWRpc2FibGVkIil9ZnVuY3Rpb24gdSh0KXtoJiZoLmZpbmQoIi5mYy0iK3QrIi1idXR0b24iKS5wcm9wKCJkaXNhYmxlZCIsITEpLnJlbW92ZUNsYXNzKGYrIi1zdGF0ZS1kaXNhYmxlZCIpfWZ1bmN0aW9uIGQoKXtyZXR1cm4gZ312YXIgYz10aGlzO2MucmVuZGVyPW4sYy5yZW1vdmVFbGVtZW50PWksYy51cGRhdGVUaXRsZT1zLGMuYWN0aXZhdGVCdXR0b249byxjLmRlYWN0aXZhdGVCdXR0b249bCxjLmRpc2FibGVCdXR0b249YSxjLmVuYWJsZUJ1dHRvbj11LGMuZ2V0Vmlld3NXaXRoQnV0dG9ucz1kLGMuZWw9bnVsbDt2YXIgaCxmLGc9W119ZnVuY3Rpb24gWXQoKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIU98fHQ8T3x8ZT5WfWZ1bmN0aW9uIGkodCxlKXtPPXQsVj1lLHIoWSwicmVzZXQiKX1mdW5jdGlvbiByKHQsZSl7dmFyIG4saTtmb3IoInJlc2V0Ij09PWU/aj1bXToiYWRkIiE9PWUmJihqPXcoaix0KSksbj0wO248dC5sZW5ndGg7bisrKWk9dFtuXSwicGVuZGluZyIhPT1pLl9zdGF0dXMmJlcrKyxpLl9mZXRjaElkPShpLl9mZXRjaElkfHwwKSsxLGkuX3N0YXR1cz0icGVuZGluZyI7Zm9yKG49MDtuPHQubGVuZ3RoO24rKylpPXRbbl0scyhpLGkuX2ZldGNoSWQpfWZ1bmN0aW9uIHMoZSxuKXthKGUsZnVuY3Rpb24oaSl7dmFyIHIscyxvLGE9dC5pc0FycmF5KGUuZXZlbnRzKTtpZihuPT09ZS5fZmV0Y2hJZCYmInJlamVjdGVkIiE9PWUuX3N0YXR1cyl7aWYoZS5fc3RhdHVzPSJyZXNvbHZlZCIsaSlmb3Iocj0wO3I8aS5sZW5ndGg7cisrKXM9aVtyXSxvPWE/czpSKHMsZSksbyYmai5wdXNoLmFwcGx5KGosTChvKSk7bCgpfX0pfWZ1bmN0aW9uIG8odCl7dmFyIGU9InBlbmRpbmciPT09dC5fc3RhdHVzO3QuX3N0YXR1cz0icmVqZWN0ZWQiLGUmJmwoKX1mdW5jdGlvbiBsKCl7Vy0tLFd8fFAoail9ZnVuY3Rpb24gYShlLG4pe3ZhciBpLHIscz1qdC5zb3VyY2VGZXRjaGVycztmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXtpZihyPXNbaV0uY2FsbChGLGUsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsbikscj09PSEwKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mIHIpcmV0dXJuIHZvaWQgYShyLG4pfXZhciBvPWUuZXZlbnRzO2lmKG8pdC5pc0Z1bmN0aW9uKG8pPyhGLnB1c2hMb2FkaW5nKCksby5jYWxsKEYsTy5jbG9uZSgpLFYuY2xvbmUoKSxGLm9wdGlvbnMudGltZXpvbmUsZnVuY3Rpb24odCl7bih0KSxGLnBvcExvYWRpbmcoKX0pKTp0LmlzQXJyYXkobyk/bihvKTpuKCk7ZWxzZXt2YXIgbD1lLnVybDtpZihsKXt2YXIgdSxkPWUuc3VjY2VzcyxjPWUuZXJyb3IsaD1lLmNvbXBsZXRlO3U9dC5pc0Z1bmN0aW9uKGUuZGF0YSk/ZS5kYXRhKCk6ZS5kYXRhO3ZhciBmPXQuZXh0ZW5kKHt9LHV8fHt9KSxnPUooZS5zdGFydFBhcmFtLEYub3B0aW9ucy5zdGFydFBhcmFtKSxwPUooZS5lbmRQYXJhbSxGLm9wdGlvbnMuZW5kUGFyYW0pLHY9SihlLnRpbWV6b25lUGFyYW0sRi5vcHRpb25zLnRpbWV6b25lUGFyYW0pO2cmJihmW2ddPU8uZm9ybWF0KCkpLHAmJihmW3BdPVYuZm9ybWF0KCkpLEYub3B0aW9ucy50aW1lem9uZSYmImxvY2FsIiE9Ri5vcHRpb25zLnRpbWV6b25lJiYoZlt2XT1GLm9wdGlvbnMudGltZXpvbmUpLEYucHVzaExvYWRpbmcoKSx0LmFqYXgodC5leHRlbmQoe30sVGUsZSx7ZGF0YTpmLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZT1lfHxbXTt2YXIgaT1RKGQsdGhpcyxhcmd1bWVudHMpO3QuaXNBcnJheShpKSYmKGU9aSksbihlKX0sZXJyb3I6ZnVuY3Rpb24oKXtRKGMsdGhpcyxhcmd1bWVudHMpLG4oKX0sY29tcGxldGU6ZnVuY3Rpb24oKXtRKGgsdGhpcyxhcmd1bWVudHMpLEYucG9wTG9hZGluZygpfX0pKX1lbHNlIG4oKX19ZnVuY3Rpb24gdSh0KXt2YXIgZT1kKHQpO2UmJihZLnB1c2goZSkscihbZV0sImFkZCIpKX1mdW5jdGlvbiBkKGUpe3ZhciBuLGkscj1qdC5zb3VyY2VOb3JtYWxpemVycztpZih0LmlzRnVuY3Rpb24oZSl8fHQuaXNBcnJheShlKT9uPXtldmVudHM6ZX06InN0cmluZyI9PXR5cGVvZiBlP249e3VybDplfToib2JqZWN0Ij09dHlwZW9mIGUmJihuPXQuZXh0ZW5kKHt9LGUpKSxuKXtmb3Iobi5jbGFzc05hbWU/InN0cmluZyI9PXR5cGVvZiBuLmNsYXNzTmFtZSYmKG4uY2xhc3NOYW1lPW4uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSk6bi5jbGFzc05hbWU9W10sdC5pc0FycmF5KG4uZXZlbnRzKSYmKG4ub3JpZ0FycmF5PW4uZXZlbnRzLG4uZXZlbnRzPXQubWFwKG4uZXZlbnRzLGZ1bmN0aW9uKHQpe3JldHVybiBSKHQsbil9KSksaT0wO2k8ci5sZW5ndGg7aSsrKXJbaV0uY2FsbChGLG4pO3JldHVybiBufX1mdW5jdGlvbiBjKHQpe2YobSh0KSl9ZnVuY3Rpb24gaCh0KXtudWxsPT10P2YoWSwhMCk6Zih2KHQpKX1mdW5jdGlvbiBmKGUsbil7dmFyIGk7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylvKGVbaV0pO24/KFk9W10saj1bXSk6KFk9dC5ncmVwKFksZnVuY3Rpb24odCl7Zm9yKGk9MDtpPGUubGVuZ3RoO2krKylpZih0PT09ZVtpXSlyZXR1cm4hMTtyZXR1cm4hMH0pLGo9dyhqLGUpKSxQKGopfWZ1bmN0aW9uIGcoKXtyZXR1cm4gWS5zbGljZSgxKX1mdW5jdGlvbiBwKGUpe3JldHVybiB0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4gdC5pZCYmdC5pZD09PWV9KVswXX1mdW5jdGlvbiB2KGUpe2U/dC5pc0FycmF5KGUpfHwoZT1bZV0pOmU9W107dmFyIG4saT1bXTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWkucHVzaC5hcHBseShpLG0oZVtuXSkpO3JldHVybiBpfWZ1bmN0aW9uIG0oZSl7dmFyIG4saTtmb3Iobj0wO248WS5sZW5ndGg7bisrKWlmKGk9WVtuXSxpPT09ZSlyZXR1cm5baV07cmV0dXJuIGk9cChlKSxpP1tpXTp0LmdyZXAoWSxmdW5jdGlvbih0KXtyZXR1cm4geShlLHQpfSl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiB0JiZlJiZTKHQpPT1TKGUpfWZ1bmN0aW9uIFModCl7cmV0dXJuKCJvYmplY3QiPT10eXBlb2YgdD90Lm9yaWdBcnJheXx8dC5nb29nbGVDYWxlbmRhcklkfHx0LnVybHx8dC5ldmVudHM6bnVsbCl8fHR9ZnVuY3Rpb24gdyhlLG4pe3JldHVybiB0LmdyZXAoZSxmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKylpZih0LnNvdXJjZT09PW5bZV0pcmV0dXJuITE7cmV0dXJuITB9KX1mdW5jdGlvbiBFKHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQ/dC5lbmQ9Ri5tb21lbnQodC5lbmQpOnQuZW5kPW51bGwsQih0LEQodCkpLFAoail9ZnVuY3Rpb24gRChlKXt2YXIgbj17fTtyZXR1cm4gdC5lYWNoKGUsZnVuY3Rpb24odCxlKXtiKHQpJiZ2b2lkIDAhPT1lJiZLKGUpJiYoblt0XT1lKX0pLG59ZnVuY3Rpb24gYih0KXtyZXR1cm4hL15ffF4oaWR8YWxsRGF5fHN0YXJ0fGVuZCkkLy50ZXN0KHQpfWZ1bmN0aW9uIEModCxlKXt2YXIgbixpLHIscz1SKHQpO2lmKHMpe2ZvcihuPUwocyksaT0wO2k8bi5sZW5ndGg7aSsrKXI9bltpXSxyLnNvdXJjZXx8KGUmJihfLmV2ZW50cy5wdXNoKHIpLHIuc291cmNlPV8pLGoucHVzaChyKSk7cmV0dXJuIFAoaiksbn1yZXR1cm5bXX1mdW5jdGlvbiBIKGUpe3ZhciBuLGk7Zm9yKG51bGw9PWU/ZT1mdW5jdGlvbigpe3JldHVybiEwfTp0LmlzRnVuY3Rpb24oZSl8fChuPWUrIiIsZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PW59KSxqPXQuZ3JlcChqLGUsITApLGk9MDtpPFkubGVuZ3RoO2krKyl0LmlzQXJyYXkoWVtpXS5ldmVudHMpJiYoWVtpXS5ldmVudHM9dC5ncmVwKFlbaV0uZXZlbnRzLGUsITApKTtQKGopfWZ1bmN0aW9uIFQoZSl7cmV0dXJuIHQuaXNGdW5jdGlvbihlKT90LmdyZXAoaixlKTpudWxsIT1lPyhlKz0iIix0LmdyZXAoaixmdW5jdGlvbih0KXtyZXR1cm4gdC5faWQ9PWV9KSk6an1mdW5jdGlvbiB4KHQpe3Quc3RhcnQ9Ri5tb21lbnQodC5zdGFydCksdC5lbmQmJih0LmVuZD1GLm1vbWVudCh0LmVuZCkpLFd0KHQpfWZ1bmN0aW9uIFIobixpKXt2YXIgcixzLG8sbD17fTtpZihGLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtJiYobj1GLm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtKG4pKSxpJiZpLmV2ZW50RGF0YVRyYW5zZm9ybSYmKG49aS5ldmVudERhdGFUcmFuc2Zvcm0obikpLHQuZXh0ZW5kKGwsbiksaSYmKGwuc291cmNlPWkpLGwuX2lkPW4uX2lkfHwodm9pZCAwPT09bi5pZD8iX2ZjIit4ZSsrOm4uaWQrIiIpLG4uY2xhc3NOYW1lPyJzdHJpbmciPT10eXBlb2Ygbi5jbGFzc05hbWU/bC5jbGFzc05hbWU9bi5jbGFzc05hbWUuc3BsaXQoL1xzKy8pOmwuY2xhc3NOYW1lPW4uY2xhc3NOYW1lOmwuY2xhc3NOYW1lPVtdLHI9bi5zdGFydHx8bi5kYXRlLHM9bi5lbmQsVShyKSYmKHI9ZS5kdXJhdGlvbihyKSksVShzKSYmKHM9ZS5kdXJhdGlvbihzKSksbi5kb3d8fGUuaXNEdXJhdGlvbihyKXx8ZS5pc0R1cmF0aW9uKHMpKWwuc3RhcnQ9cj9lLmR1cmF0aW9uKHIpOm51bGwsbC5lbmQ9cz9lLmR1cmF0aW9uKHMpOm51bGwsbC5fcmVjdXJyaW5nPSEwO2Vsc2V7aWYociYmKHI9Ri5tb21lbnQociksIXIuaXNWYWxpZCgpKSlyZXR1cm4hMTtzJiYocz1GLm1vbWVudChzKSxzLmlzVmFsaWQoKXx8KHM9bnVsbCkpLG89bi5hbGxEYXksdm9pZCAwPT09byYmKG89SihpP2kuYWxsRGF5RGVmYXVsdDp2b2lkIDAsRi5vcHRpb25zLmFsbERheURlZmF1bHQpKSxJKHIscyxvLGwpfXJldHVybiBGLm5vcm1hbGl6ZUV2ZW50KGwpLGx9ZnVuY3Rpb24gSSh0LGUsbixpKXtpLnN0YXJ0PXQsaS5lbmQ9ZSxpLmFsbERheT1uLGsoaSksV3QoaSl9ZnVuY3Rpb24gayh0KXtNKHQpLHQuZW5kJiYhdC5lbmQuaXNBZnRlcih0LnN0YXJ0KSYmKHQuZW5kPW51bGwpLHQuZW5kfHwoRi5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbj90LmVuZD1GLmdldERlZmF1bHRFdmVudEVuZCh0LmFsbERheSx0LnN0YXJ0KTp0LmVuZD1udWxsKX1mdW5jdGlvbiBNKHQpe251bGw9PXQuYWxsRGF5JiYodC5hbGxEYXk9ISh0LnN0YXJ0Lmhhc1RpbWUoKXx8dC5lbmQmJnQuZW5kLmhhc1RpbWUoKSkpLHQuYWxsRGF5Pyh0LnN0YXJ0LnN0cmlwVGltZSgpLHQuZW5kJiZ0LmVuZC5zdHJpcFRpbWUoKSk6KHQuc3RhcnQuaGFzVGltZSgpfHwodC5zdGFydD1GLmFwcGx5VGltZXpvbmUodC5zdGFydC50aW1lKDApKSksdC5lbmQmJiF0LmVuZC5oYXNUaW1lKCkmJih0LmVuZD1GLmFwcGx5VGltZXpvbmUodC5lbmQudGltZSgwKSkpKX1mdW5jdGlvbiBMKGUsbixpKXt2YXIgcixzLG8sbCxhLHUsZCxjLGgsZj1bXTtpZihuPW58fE8saT1pfHxWLGUpaWYoZS5fcmVjdXJyaW5nKXtpZihzPWUuZG93KWZvcihyPXt9LG89MDtvPHMubGVuZ3RoO28rKylyW3Nbb11dPSEwO2ZvcihsPW4uY2xvbmUoKS5zdHJpcFRpbWUoKTtsLmlzQmVmb3JlKGkpOylyJiYhcltsLmRheSgpXXx8KGE9ZS5zdGFydCx1PWUuZW5kLGQ9bC5jbG9uZSgpLGM9bnVsbCxhJiYoZD1kLnRpbWUoYSkpLHUmJihjPWwuY2xvbmUoKS50aW1lKHUpKSxoPXQuZXh0ZW5kKHt9LGUpLEkoZCxjLCFhJiYhdSxoKSxmLnB1c2goaCkpLGwuYWRkKDEsImRheXMiKX1lbHNlIGYucHVzaChlKTtyZXR1cm4gZn1mdW5jdGlvbiBCKGUsbixpKXtmdW5jdGlvbiByKHQsZSl7cmV0dXJuIGk/QSh0LGUsaSk6bi5hbGxEYXk/Ryh0LGUpOk4odCxlKX12YXIgcyxvLGwsYSx1LGQsYz17fTtyZXR1cm4gbj1ufHx7fSxuLnN0YXJ0fHwobi5zdGFydD1lLnN0YXJ0LmNsb25lKCkpLHZvaWQgMD09PW4uZW5kJiYobi5lbmQ9ZS5lbmQ/ZS5lbmQuY2xvbmUoKTpudWxsKSxudWxsPT1uLmFsbERheSYmKG4uYWxsRGF5PWUuYWxsRGF5KSxrKG4pLHM9e3N0YXJ0OmUuX3N0YXJ0LmNsb25lKCksZW5kOmUuX2VuZD9lLl9lbmQuY2xvbmUoKTpGLmdldERlZmF1bHRFdmVudEVuZChlLl9hbGxEYXksZS5fc3RhcnQpLGFsbERheTpuLmFsbERheX0sayhzKSxvPW51bGwhPT1lLl9lbmQmJm51bGw9PT1uLmVuZCxsPXIobi5zdGFydCxzLnN0YXJ0KSxuLmVuZD8oYT1yKG4uZW5kLHMuZW5kKSx1PWEuc3VidHJhY3QobCkpOnU9bnVsbCx0LmVhY2gobixmdW5jdGlvbih0LGUpe2IodCkmJnZvaWQgMCE9PWUmJihjW3RdPWUpfSksZD16KFQoZS5faWQpLG8sbi5hbGxEYXksbCx1LGMpLHtkYXRlRGVsdGE6bCxkdXJhdGlvbkRlbHRhOnUsdW5kbzpkfX1mdW5jdGlvbiB6KGUsbixpLHIscyxvKXt2YXIgbD1GLmdldElzQW1iaWdUaW1lem9uZSgpLGE9W107cmV0dXJuIHImJiFyLnZhbHVlT2YoKSYmKHI9bnVsbCkscyYmIXMudmFsdWVPZigpJiYocz1udWxsKSx0LmVhY2goZSxmdW5jdGlvbihlLHUpe3ZhciBkLGM7ZD17c3RhcnQ6dS5zdGFydC5jbG9uZSgpLGVuZDp1LmVuZD91LmVuZC5jbG9uZSgpOm51bGwsYWxsRGF5OnUuYWxsRGF5fSx0LmVhY2gobyxmdW5jdGlvbih0KXtkW3RdPXVbdF19KSxjPXtzdGFydDp1Ll9zdGFydCxlbmQ6dS5fZW5kLGFsbERheTppfSxrKGMpLG4/Yy5lbmQ9bnVsbDpzJiYhYy5lbmQmJihjLmVuZD1GLmdldERlZmF1bHRFdmVudEVuZChjLmFsbERheSxjLnN0YXJ0KSksciYmKGMuc3RhcnQuYWRkKHIpLGMuZW5kJiZjLmVuZC5hZGQocikpLHMmJmMuZW5kLmFkZChzKSxsJiYhYy5hbGxEYXkmJihyfHxzKSYmKGMuc3RhcnQuc3RyaXBab25lKCksYy5lbmQmJmMuZW5kLnN0cmlwWm9uZSgpKSx0LmV4dGVuZCh1LG8sYyksV3QodSksYS5wdXNoKGZ1bmN0aW9uKCl7dC5leHRlbmQodSxkKSxXdCh1KX0pfSksZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGEubGVuZ3RoO3QrKylhW3RdKCl9fXZhciBGPXRoaXM7Ri5pc0ZldGNoTmVlZGVkPW4sRi5mZXRjaEV2ZW50cz1pLEYuZmV0Y2hFdmVudFNvdXJjZXM9cixGLmdldEV2ZW50U291cmNlcz1nLEYuZ2V0RXZlbnRTb3VyY2VCeUlkPXAsRi5nZXRFdmVudFNvdXJjZXNCeU1hdGNoQXJyYXk9dixGLmdldEV2ZW50U291cmNlc0J5TWF0Y2g9bSxGLmFkZEV2ZW50U291cmNlPXUsRi5yZW1vdmVFdmVudFNvdXJjZT1jLEYucmVtb3ZlRXZlbnRTb3VyY2VzPWgsRi51cGRhdGVFdmVudD1FLEYucmVuZGVyRXZlbnQ9QyxGLnJlbW92ZUV2ZW50cz1ILEYuY2xpZW50RXZlbnRzPVQsRi5tdXRhdGVFdmVudD1CLEYubm9ybWFsaXplRXZlbnREYXRlcz1rLEYubm9ybWFsaXplRXZlbnRUaW1lcz1NO3ZhciBPLFYsUD1GLnJlcG9ydEV2ZW50cyxfPXtldmVudHM6W119LFk9W19dLFc9MCxqPVtdO3QuZWFjaCgoRi5vcHRpb25zLmV2ZW50cz9bRi5vcHRpb25zLmV2ZW50c106W10pLmNvbmNhdChGLm9wdGlvbnMuZXZlbnRTb3VyY2VzfHxbXSksZnVuY3Rpb24odCxlKXt2YXIgbj1kKGUpO24mJlkucHVzaChuKX0pLEYucmV6b25lQXJyYXlFdmVudFNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZSxuLGk7Zm9yKGU9MDtlPFkubGVuZ3RoO2UrKylpZihuPVlbZV0uZXZlbnRzLHQuaXNBcnJheShuKSlmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKXgobltpXSl9LEYuYnVpbGRFdmVudEZyb21JbnB1dD1SLEYuZXhwYW5kRXZlbnQ9TCxGLmdldEV2ZW50Q2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gan19ZnVuY3Rpb24gV3QodCl7dC5fYWxsRGF5PXQuYWxsRGF5LHQuX3N0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0Ll9lbmQ9dC5lbmQ/dC5lbmQuY2xvbmUoKTpudWxsfXZhciBqdD10LmZ1bGxDYWxlbmRhcj17dmVyc2lvbjoiMy4wLjEiLGludGVybmFsQXBpVmVyc2lvbjo2fSxVdD1qdC52aWV3cz17fTt0LmZuLmZ1bGxDYWxlbmRhcj1mdW5jdGlvbihlKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT10aGlzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocixzKXt2YXIgbyxsPXQocyksYT1sLmRhdGEoImZ1bGxDYWxlbmRhciIpOyJzdHJpbmciPT10eXBlb2YgZT9hJiZ0LmlzRnVuY3Rpb24oYVtlXSkmJihvPWFbZV0uYXBwbHkoYSxuKSxyfHwoaT1vKSwiZGVzdHJveSI9PT1lJiZsLnJlbW92ZURhdGEoImZ1bGxDYWxlbmRhciIpKTphfHwoYT1uZXcgRWUobCxlKSxsLmRhdGEoImZ1bGxDYWxlbmRhciIsYSksYS5yZW5kZXIoKSl9KSxpfTt2YXIgcXQ9WyJoZWFkZXIiLCJidXR0b25UZXh0IiwiYnV0dG9uSWNvbnMiLCJ0aGVtZUJ1dHRvbkljb25zIl07anQuaW50ZXJzZWN0UmFuZ2VzPUYsanQuYXBwbHlBbGw9USxqdC5kZWJvdW5jZT1hdCxqdC5pc0ludD1vdCxqdC5odG1sRXNjYXBlPXR0LGp0LmNzc1RvU3RyPW50LGp0LnByb3h5PWx0LGp0LmNhcGl0YWxpc2VGaXJzdExldHRlcj1ydCxqdC5nZXRPdXRlclJlY3Q9aCxqdC5nZXRDbGllbnRSZWN0PWYsanQuZ2V0Q29udGVudFJlY3Q9ZyxqdC5nZXRTY3JvbGxiYXJXaWR0aHM9cDt2YXIgWnQ9bnVsbDtqdC5wcmV2ZW50RGVmYXVsdD1DLGp0LmludGVyc2VjdFJlY3RzPXgsanQucGFyc2VGaWVsZFNwZWNzPU0sanQuY29tcGFyZUJ5RmllbGRTcGVjcz1MLGp0LmNvbXBhcmVCeUZpZWxkU3BlYz1CLGp0LmZsZXhpYmxlQ29tcGFyZT16LGp0LmNvbXB1dGVJbnRlcnZhbFVuaXQ9TyxqdC5kaXZpZGVSYW5nZUJ5RHVyYXRpb249UCxqdC5kaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb249XyxqdC5tdWx0aXBseUR1cmF0aW9uPVksanQuZHVyYXRpb25IYXNUaW1lPVc7dmFyICR0PVsic3VuIiwibW9uIiwidHVlIiwid2VkIiwidGh1IiwiZnJpIiwic2F0Il0sWHQ9WyJ5ZWFyIiwibW9udGgiLCJ3ZWVrIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl07anQubG9nPWZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LmNvbnNvbGU7aWYodCYmdC5sb2cpcmV0dXJuIHQubG9nLmFwcGx5KHQsYXJndW1lbnRzKX0sanQud2Fybj1mdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5jb25zb2xlO3JldHVybiB0JiZ0Lndhcm4/dC53YXJuLmFwcGx5KHQsYXJndW1lbnRzKTpqdC5sb2cuYXBwbHkoanQsYXJndW1lbnRzKX07dmFyIEt0PXt9Lmhhc093blByb3BlcnR5LFF0PS9eXHMqXGR7NH0tXGRcZCQvLEp0PS9eXHMqXGR7NH0tKD86KFxkXGQtXGRcZCl8KFdcZFxkJCl8KFdcZFxkLVxkKXwoXGRcZFxkKSkoKFR8ICkoXGRcZCg6XGRcZCg6XGRcZChcLlxkKyk/KT8pPyk/KT8kLyx0ZT1lLmZuLGVlPXQuZXh0ZW5kKHt9LHRlKSxuZT1lLm1vbWVudFByb3BlcnRpZXM7bmUucHVzaCgiX2Z1bGxDYWxlbmRhciIpLG5lLnB1c2goIl9hbWJpZ1RpbWUiKSxuZS5wdXNoKCJfYW1iaWdab25lIiksanQubW9tZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cyl9LGp0Lm1vbWVudC51dGM9ZnVuY3Rpb24oKXt2YXIgdD1kdChhcmd1bWVudHMsITApO3JldHVybiB0Lmhhc1RpbWUoKSYmdC51dGMoKSx0fSxqdC5tb21lbnQucGFyc2Vab25lPWZ1bmN0aW9uKCl7cmV0dXJuIGR0KGFyZ3VtZW50cywhMCwhMCl9LHRlLndlZWs9dGUud2Vla3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbG9jYWxlLl9mdWxsQ2FsZW5kYXJfd2Vla0NhbGM7cmV0dXJuIG51bGw9PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodGhpcyk6IklTTyI9PT1lP2VlLmlzb1dlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpOmVlLndlZWsuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50aW1lPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9mdWxsQ2FsZW5kYXIpcmV0dXJuIGVlLnRpbWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51bGw9PXQpcmV0dXJuIGUuZHVyYXRpb24oe2hvdXJzOnRoaXMuaG91cnMoKSxtaW51dGVzOnRoaXMubWludXRlcygpLHNlY29uZHM6dGhpcy5zZWNvbmRzKCksbWlsbGlzZWNvbmRzOnRoaXMubWlsbGlzZWNvbmRzKCl9KTt0aGlzLl9hbWJpZ1RpbWU9ITEsZS5pc0R1cmF0aW9uKHQpfHxlLmlzTW9tZW50KHQpfHwodD1lLmR1cmF0aW9uKHQpKTt2YXIgbj0wO3JldHVybiBlLmlzRHVyYXRpb24odCkmJihuPTI0Kk1hdGguZmxvb3IodC5hc0RheXMoKSkpLHRoaXMuaG91cnMobit0LmhvdXJzKCkpLm1pbnV0ZXModC5taW51dGVzKCkpLnNlY29uZHModC5zZWNvbmRzKCkpLm1pbGxpc2Vjb25kcyh0Lm1pbGxpc2Vjb25kcygpKX0sdGUuc3RyaXBUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FtYmlnVGltZXx8KHRoaXMudXRjKCEwKSx0aGlzLnNldCh7aG91cnM6MCxtaW51dGVzOjAsc2Vjb25kczowLG1zOjB9KSx0aGlzLl9hbWJpZ1RpbWU9ITAsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnVGltZX0sdGUuc3RyaXBab25lPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuX2FtYmlnWm9uZXx8KHQ9dGhpcy5fYW1iaWdUaW1lLHRoaXMudXRjKCEwKSx0aGlzLl9hbWJpZ1RpbWU9dHx8ITEsdGhpcy5fYW1iaWdab25lPSEwKSx0aGlzfSx0ZS5oYXNab25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2FtYmlnWm9uZX0sdGUubG9jYWw9ZnVuY3Rpb24odCl7cmV0dXJuIGVlLmxvY2FsLmNhbGwodGhpcyx0aGlzLl9hbWJpZ1pvbmV8fHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjPWZ1bmN0aW9uKHQpe3JldHVybiBlZS51dGMuY2FsbCh0aGlzLHQpLHRoaXMuX2FtYmlnVGltZT0hMSx0aGlzLl9hbWJpZ1pvbmU9ITEsdGhpc30sdGUudXRjT2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYodGhpcy5fYW1iaWdUaW1lPSExLHRoaXMuX2FtYmlnWm9uZT0hMSksZWUudXRjT2Zmc2V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGUuZm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Z1bGxDYWxlbmRhciYmYXJndW1lbnRzWzBdP2h0KHRoaXMsYXJndW1lbnRzWzBdKTp0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS5mb3JtYXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbWJpZ1RpbWU/Y3QodGhpcywiWVlZWS1NTS1ERCIpOnRoaXMuX2FtYmlnWm9uZT9jdCh0aGlzLCJZWVlZLU1NLUREW1RdSEg6bW06c3MiKTplZS50b0lTT1N0cmluZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3ZhciBpZT17dDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiYSIpLmNoYXJBdCgwKX0sVDpmdW5jdGlvbih0KXtyZXR1cm4gY3QodCwiQSIpLmNoYXJBdCgwKX19O2p0LmZvcm1hdFJhbmdlPXB0O3ZhciByZT17WToieWVhciIsTToibW9udGgiLEQ6ImRheSIsZDoiZGF5IixBOiJzZWNvbmQiLGE6InNlY29uZCIsVDoic2Vjb25kIix0OiJzZWNvbmQiLEg6InNlY29uZCIsaDoic2Vjb25kIixtOiJzZWNvbmQiLHM6InNlY29uZCJ9LHNlPXt9LG9lPXtZOnt2YWx1ZToxLHVuaXQ6InllYXIifSxNOnt2YWx1ZToyLHVuaXQ6Im1vbnRoIn0sVzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sdzp7dmFsdWU6Myx1bml0OiJ3ZWVrIn0sRDp7dmFsdWU6NCx1bml0OiJkYXkifSxkOnt2YWx1ZTo0LHVuaXQ6ImRheSJ9fTtqdC5xdWVyeU1vc3RHcmFudWxhckZvcm1hdFVuaXQ9ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscz15dCh0KTtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKW49c1tlXSxuLnRva2VuJiYoaT1vZVtuLnRva2VuLmNoYXJBdCgwKV0saSYmKCFyfHxpLnZhbHVlPnIudmFsdWUpJiYocj1pKSk7cmV0dXJuIHI/ci51bml0Om51bGx9LGp0LkNsYXNzPXd0LHd0LmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbj1hcmd1bWVudHMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKyllPWFyZ3VtZW50c1t0XSx0PG4tMSYmRHQodGhpcyxlKTtyZXR1cm4gRXQodGhpcyxlfHx7fSl9LHd0Lm1peGluPWZ1bmN0aW9uKHQpe0R0KHRoaXMsdCl9O3ZhciBsZT1qdC5FbWl0dGVyTWl4aW49e29uOmZ1bmN0aW9uKGUsbil7dmFyIGk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5hcHBseShlLmNvbnRleHR8fHRoaXMsZS5hcmdzfHxbXSl9O3JldHVybiBuLmd1aWR8fChuLmd1aWQ9dC5ndWlkKyspLGkuZ3VpZD1uLmd1aWQsdCh0aGlzKS5vbihlLGkpLHRoaXN9LG9mZjpmdW5jdGlvbihlLG4pe3JldHVybiB0KHRoaXMpLm9mZihlLG4pLHRoaXN9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0KHRoaXMpLnRyaWdnZXJIYW5kbGVyKGUse2FyZ3M6bn0pLHRoaXN9LHRyaWdnZXJXaXRoOmZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdCh0aGlzKS50cmlnZ2VySGFuZGxlcihlLHtjb250ZXh0Om4sYXJnczppfSksdGhpc319LGFlPWp0Lkxpc3RlbmVyTWl4aW49ZnVuY3Rpb24oKXt2YXIgZT0wLG49e2xpc3RlbmVySWQ6bnVsbCxsaXN0ZW5UbzpmdW5jdGlvbihlLG4saSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuKWZvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJnRoaXMubGlzdGVuVG8oZSxyLG5bcl0pO2Vsc2Uic3RyaW5nIj09dHlwZW9mIG4mJmUub24obisiLiIrdGhpcy5nZXRMaXN0ZW5lck5hbWVzcGFjZSgpLHQucHJveHkoaSx0aGlzKSl9LHN0b3BMaXN0ZW5pbmdUbzpmdW5jdGlvbih0LGUpe3Qub2ZmKChlfHwiIikrIi4iK3RoaXMuZ2V0TGlzdGVuZXJOYW1lc3BhY2UoKSl9LGdldExpc3RlbmVyTmFtZXNwYWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMubGlzdGVuZXJJZCYmKHRoaXMubGlzdGVuZXJJZD1lKyspLCJfbGlzdGVuZXIiK3RoaXMubGlzdGVuZXJJZH19O3JldHVybiBufSgpLHVlPXtpc0lnbm9yaW5nTW91c2U6ITEsZGVsYXlVbmlnbm9yZU1vdXNlOm51bGwsaW5pdE1vdXNlSWdub3Jpbmc6ZnVuY3Rpb24odCl7dGhpcy5kZWxheVVuaWdub3JlTW91c2U9YXQobHQodGhpcywidW5pZ25vcmVNb3VzZSIpLHR8fDFlMyl9LHRlbXBJZ25vcmVNb3VzZTpmdW5jdGlvbigpe3RoaXMuaXNJZ25vcmluZ01vdXNlPSEwLHRoaXMuZGVsYXlVbmlnbm9yZU1vdXNlKCl9LHVuaWdub3JlTW91c2U6ZnVuY3Rpb24oKXt0aGlzLmlzSWdub3JpbmdNb3VzZT0hMX19LGRlPXd0LmV4dGVuZChhZSx7aXNIaWRkZW46ITAsb3B0aW9uczpudWxsLGVsOm51bGwsbWFyZ2luOjEwLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fHx7fX0sc2hvdzpmdW5jdGlvbigpewp0aGlzLmlzSGlkZGVuJiYodGhpcy5lbHx8dGhpcy5yZW5kZXIoKSx0aGlzLmVsLnNob3coKSx0aGlzLnBvc2l0aW9uKCksdGhpcy5pc0hpZGRlbj0hMSx0aGlzLnRyaWdnZXIoInNob3ciKSl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5lbC5oaWRlKCksdGhpcy5pc0hpZGRlbj0hMCx0aGlzLnRyaWdnZXIoImhpZGUiKSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10aGlzLm9wdGlvbnM7dGhpcy5lbD10KCc8ZGl2IGNsYXNzPSJmYy1wb3BvdmVyIi8+JykuYWRkQ2xhc3Mobi5jbGFzc05hbWV8fCIiKS5jc3Moe3RvcDowLGxlZnQ6MH0pLmFwcGVuZChuLmNvbnRlbnQpLmFwcGVuZFRvKG4ucGFyZW50RWwpLHRoaXMuZWwub24oImNsaWNrIiwiLmZjLWNsb3NlIixmdW5jdGlvbigpe2UuaGlkZSgpfSksbi5hdXRvSGlkZSYmdGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSwibW91c2Vkb3duIix0aGlzLmRvY3VtZW50TW91c2Vkb3duKX0sZG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24oZSl7dGhpcy5lbCYmIXQoZS50YXJnZXQpLmNsb3Nlc3QodGhpcy5lbCkubGVuZ3RoJiZ0aGlzLmhpZGUoKX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuZWwmJih0aGlzLmVsLnJlbW92ZSgpLHRoaXMuZWw9bnVsbCksdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCksIm1vdXNlZG93biIpfSxwb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBlLG4saSxyLHMsbz10aGlzLm9wdGlvbnMsbD10aGlzLmVsLm9mZnNldFBhcmVudCgpLm9mZnNldCgpLGE9dGhpcy5lbC5vdXRlcldpZHRoKCksdT10aGlzLmVsLm91dGVySGVpZ2h0KCksZD10KHdpbmRvdyksaD1jKHRoaXMuZWwpO3I9by50b3B8fDAscz12b2lkIDAhPT1vLmxlZnQ/by5sZWZ0OnZvaWQgMCE9PW8ucmlnaHQ/by5yaWdodC1hOjAsaC5pcyh3aW5kb3cpfHxoLmlzKGRvY3VtZW50KT8oaD1kLGU9MCxuPTApOihpPWgub2Zmc2V0KCksZT1pLnRvcCxuPWkubGVmdCksZSs9ZC5zY3JvbGxUb3AoKSxuKz1kLnNjcm9sbExlZnQoKSxvLnZpZXdwb3J0Q29uc3RyYWluIT09ITEmJihyPU1hdGgubWluKHIsZStoLm91dGVySGVpZ2h0KCktdS10aGlzLm1hcmdpbikscj1NYXRoLm1heChyLGUrdGhpcy5tYXJnaW4pLHM9TWF0aC5taW4ocyxuK2gub3V0ZXJXaWR0aCgpLWEtdGhpcy5tYXJnaW4pLHM9TWF0aC5tYXgocyxuK3RoaXMubWFyZ2luKSksdGhpcy5lbC5jc3Moe3RvcDpyLWwudG9wLGxlZnQ6cy1sLmxlZnR9KX0sdHJpZ2dlcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnNbdF0mJnRoaXMub3B0aW9uc1t0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSksY2U9anQuQ29vcmRDYWNoZT13dC5leHRlbmQoe2VsczpudWxsLGZvcmNlZE9mZnNldFBhcmVudEVsOm51bGwsb3JpZ2luOm51bGwsYm91bmRpbmdSZWN0Om51bGwsaXNIb3Jpem9udGFsOiExLGlzVmVydGljYWw6ITEsbGVmdHM6bnVsbCxyaWdodHM6bnVsbCx0b3BzOm51bGwsYm90dG9tczpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMuZWxzPXQoZS5lbHMpLHRoaXMuaXNIb3Jpem9udGFsPWUuaXNIb3Jpem9udGFsLHRoaXMuaXNWZXJ0aWNhbD1lLmlzVmVydGljYWwsdGhpcy5mb3JjZWRPZmZzZXRQYXJlbnRFbD1lLm9mZnNldFBhcmVudD90KGUub2Zmc2V0UGFyZW50KTpudWxsfSxidWlsZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZm9yY2VkT2Zmc2V0UGFyZW50RWx8fHRoaXMuZWxzLmVxKDApLm9mZnNldFBhcmVudCgpO3RoaXMub3JpZ2luPXQub2Zmc2V0KCksdGhpcy5ib3VuZGluZ1JlY3Q9dGhpcy5xdWVyeUJvdW5kaW5nUmVjdCgpLHRoaXMuaXNIb3Jpem9udGFsJiZ0aGlzLmJ1aWxkRWxIb3Jpem9udGFscygpLHRoaXMuaXNWZXJ0aWNhbCYmdGhpcy5idWlsZEVsVmVydGljYWxzKCl9LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW49bnVsbCx0aGlzLmJvdW5kaW5nUmVjdD1udWxsLHRoaXMubGVmdHM9bnVsbCx0aGlzLnJpZ2h0cz1udWxsLHRoaXMudG9wcz1udWxsLHRoaXMuYm90dG9tcz1udWxsfSxlbnN1cmVCdWlsdDpmdW5jdGlvbigpe3RoaXMub3JpZ2lufHx0aGlzLmJ1aWxkKCl9LGJ1aWxkRWxIb3Jpem9udGFsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLmxlZnQsbD1zLm91dGVyV2lkdGgoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLmxlZnRzPWUsdGhpcy5yaWdodHM9bn0sYnVpbGRFbFZlcnRpY2FsczpmdW5jdGlvbigpe3ZhciBlPVtdLG49W107dGhpcy5lbHMuZWFjaChmdW5jdGlvbihpLHIpe3ZhciBzPXQociksbz1zLm9mZnNldCgpLnRvcCxsPXMub3V0ZXJIZWlnaHQoKTtlLnB1c2gobyksbi5wdXNoKG8rbCl9KSx0aGlzLnRvcHM9ZSx0aGlzLmJvdHRvbXM9bn0sZ2V0SG9yaXpvbnRhbEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuZW5zdXJlQnVpbHQoKTt2YXIgZSxuPXRoaXMubGVmdHMsaT10aGlzLnJpZ2h0cyxyPW4ubGVuZ3RoO2ZvcihlPTA7ZTxyO2UrKylpZih0Pj1uW2VdJiZ0PGlbZV0pcmV0dXJuIGV9LGdldFZlcnRpY2FsSW5kZXg6ZnVuY3Rpb24odCl7dGhpcy5lbnN1cmVCdWlsdCgpO3ZhciBlLG49dGhpcy50b3BzLGk9dGhpcy5ib3R0b21zLHI9bi5sZW5ndGg7Zm9yKGU9MDtlPHI7ZSsrKWlmKHQ+PW5bZV0mJnQ8aVtlXSlyZXR1cm4gZX0sZ2V0TGVmdE9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF19LGdldExlZnRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMubGVmdHNbdF0tdGhpcy5vcmlnaW4ubGVmdH0sZ2V0UmlnaHRPZmZzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLnJpZ2h0c1t0XX0sZ2V0UmlnaHRQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMucmlnaHRzW3RdLXRoaXMub3JpZ2luLmxlZnR9LGdldFdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy5yaWdodHNbdF0tdGhpcy5sZWZ0c1t0XX0sZ2V0VG9wT2Zmc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVuc3VyZUJ1aWx0KCksdGhpcy50b3BzW3RdfSxnZXRUb3BQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMudG9wc1t0XS10aGlzLm9yaWdpbi50b3B9LGdldEJvdHRvbU9mZnNldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbnN1cmVCdWlsdCgpLHRoaXMuYm90dG9tc1t0XX0sZ2V0Qm90dG9tUG9zaXRpb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy5vcmlnaW4udG9wfSxnZXRIZWlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW5zdXJlQnVpbHQoKSx0aGlzLmJvdHRvbXNbdF0tdGhpcy50b3BzW3RdfSxxdWVyeUJvdW5kaW5nUmVjdDpmdW5jdGlvbigpe3ZhciB0PWModGhpcy5lbHMuZXEoMCkpO2lmKCF0LmlzKGRvY3VtZW50KSlyZXR1cm4gZih0KX0saXNQb2ludEluQm91bmRzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMuaXNUb3BJbkJvdW5kcyhlKX0saXNMZWZ0SW5Cb3VuZHM6ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuYm91bmRpbmdSZWN0fHx0Pj10aGlzLmJvdW5kaW5nUmVjdC5sZWZ0JiZ0PHRoaXMuYm91bmRpbmdSZWN0LnJpZ2h0fSxpc1RvcEluQm91bmRzOmZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmJvdW5kaW5nUmVjdHx8dD49dGhpcy5ib3VuZGluZ1JlY3QudG9wJiZ0PHRoaXMuYm91bmRpbmdSZWN0LmJvdHRvbX19KSxoZT1qdC5EcmFnTGlzdGVuZXI9d3QuZXh0ZW5kKGFlLHVlLHtvcHRpb25zOm51bGwsc3ViamVjdEVsOm51bGwsb3JpZ2luWDpudWxsLG9yaWdpblk6bnVsbCxzY3JvbGxFbDpudWxsLGlzSW50ZXJhY3Rpbmc6ITEsaXNEaXN0YW5jZVN1cnBhc3NlZDohMSxpc0RlbGF5RW5kZWQ6ITEsaXNEcmFnZ2luZzohMSxpc1RvdWNoOiExLGRlbGF5Om51bGwsZGVsYXlUaW1lb3V0SWQ6bnVsbCxtaW5EaXN0YW5jZTpudWxsLGhhbmRsZVRvdWNoU2Nyb2xsUHJveHk6bnVsbCxjb25zdHJ1Y3RvcjpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dHx8e30sdGhpcy5oYW5kbGVUb3VjaFNjcm9sbFByb3h5PWx0KHRoaXMsImhhbmRsZVRvdWNoU2Nyb2xsIiksdGhpcy5pbml0TW91c2VJZ25vcmluZyg1MDApfSxzdGFydEludGVyYWN0aW9uOmZ1bmN0aW9uKGUsbil7dmFyIGk9RChlKTtpZigibW91c2Vkb3duIj09PWUudHlwZSl7aWYodGhpcy5pc0lnbm9yaW5nTW91c2UpcmV0dXJuO2lmKCFTKGUpKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCl9dGhpcy5pc0ludGVyYWN0aW5nfHwobj1ufHx7fSx0aGlzLmRlbGF5PUoobi5kZWxheSx0aGlzLm9wdGlvbnMuZGVsYXksMCksdGhpcy5taW5EaXN0YW5jZT1KKG4uZGlzdGFuY2UsdGhpcy5vcHRpb25zLmRpc3RhbmNlLDApLHRoaXMuc3ViamVjdEVsPXRoaXMub3B0aW9ucy5zdWJqZWN0RWwsdGhpcy5pc0ludGVyYWN0aW5nPSEwLHRoaXMuaXNUb3VjaD1pLHRoaXMuaXNEZWxheUVuZGVkPSExLHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZD0hMSx0aGlzLm9yaWdpblg9dyhlKSx0aGlzLm9yaWdpblk9RShlKSx0aGlzLnNjcm9sbEVsPWModChlLnRhcmdldCkpLHRoaXMuYmluZEhhbmRsZXJzKCksdGhpcy5pbml0QXV0b1Njcm9sbCgpLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25TdGFydChlKSx0aGlzLnN0YXJ0RGVsYXkoZSksdGhpcy5taW5EaXN0YW5jZXx8dGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChlKSl9LGhhbmRsZUludGVyYWN0aW9uU3RhcnQ6ZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJpbnRlcmFjdGlvblN0YXJ0Iix0KX0sZW5kSW50ZXJhY3Rpb246ZnVuY3Rpb24odCxlKXt0aGlzLmlzSW50ZXJhY3RpbmcmJih0aGlzLmVuZERyYWcodCksdGhpcy5kZWxheVRpbWVvdXRJZCYmKGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKSx0aGlzLmRlbGF5VGltZW91dElkPW51bGwpLHRoaXMuZGVzdHJveUF1dG9TY3JvbGwoKSx0aGlzLnVuYmluZEhhbmRsZXJzKCksdGhpcy5pc0ludGVyYWN0aW5nPSExLHRoaXMuaGFuZGxlSW50ZXJhY3Rpb25FbmQodCxlKSx0aGlzLmlzVG91Y2gmJnRoaXMudGVtcElnbm9yZU1vdXNlKCkpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0LGUpe3RoaXMudHJpZ2dlcigiaW50ZXJhY3Rpb25FbmQiLHQsZXx8ITEpfSxiaW5kSGFuZGxlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49MTt0aGlzLmlzVG91Y2g/KHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3RvdWNobW92ZTp0aGlzLmhhbmRsZVRvdWNoTW92ZSx0b3VjaGVuZDp0aGlzLmVuZEludGVyYWN0aW9uLHRvdWNoY2FuY2VsOnRoaXMuZW5kSW50ZXJhY3Rpb24sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtuP24tLTplLmVuZEludGVyYWN0aW9uKHQsITApfX0pLCFIKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSkmJnRoaXMuc2Nyb2xsRWwmJnRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIix0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsKSk6dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7bW91c2Vtb3ZlOnRoaXMuaGFuZGxlTW91c2VNb3ZlLG1vdXNldXA6dGhpcy5lbmRJbnRlcmFjdGlvbn0pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCkse3NlbGVjdHN0YXJ0OkMsY29udGV4dG1lbnU6Q30pfSx1bmJpbmRIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMuc3RvcExpc3RlbmluZ1RvKHQoZG9jdW1lbnQpKSxUKHRoaXMuaGFuZGxlVG91Y2hTY3JvbGxQcm94eSksdGhpcy5zY3JvbGxFbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LHN0YXJ0RHJhZzpmdW5jdGlvbih0LGUpe3RoaXMuc3RhcnRJbnRlcmFjdGlvbih0LGUpLHRoaXMuaXNEcmFnZ2luZ3x8KHRoaXMuaXNEcmFnZ2luZz0hMCx0aGlzLmhhbmRsZURyYWdTdGFydCh0KSl9LGhhbmRsZURyYWdTdGFydDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdTdGFydCIsdCl9LGhhbmRsZU1vdmU6ZnVuY3Rpb24odCl7dmFyIGUsbj13KHQpLXRoaXMub3JpZ2luWCxpPUUodCktdGhpcy5vcmlnaW5ZLHI9dGhpcy5taW5EaXN0YW5jZTt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWR8fChlPW4qbitpKmksZT49cipyJiZ0aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKHQpKSx0aGlzLmlzRHJhZ2dpbmcmJnRoaXMuaGFuZGxlRHJhZyhuLGksdCl9LGhhbmRsZURyYWc6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZHJhZyIsdCxlLG4pLHRoaXMudXBkYXRlQXV0b1Njcm9sbChuKX0sZW5kRHJhZzpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmcmJih0aGlzLmlzRHJhZ2dpbmc9ITEsdGhpcy5oYW5kbGVEcmFnRW5kKHQpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImRyYWdFbmQiLHQpfSxzdGFydERlbGF5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5kZWxheT90aGlzLmRlbGF5VGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmhhbmRsZURlbGF5RW5kKHQpfSx0aGlzLmRlbGF5KTp0aGlzLmhhbmRsZURlbGF5RW5kKHQpfSxoYW5kbGVEZWxheUVuZDpmdW5jdGlvbih0KXt0aGlzLmlzRGVsYXlFbmRlZD0hMCx0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVEaXN0YW5jZVN1cnBhc3NlZDpmdW5jdGlvbih0KXt0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQ9ITAsdGhpcy5pc0RlbGF5RW5kZWQmJnRoaXMuc3RhcnREcmFnKHQpfSxoYW5kbGVUb3VjaE1vdmU6ZnVuY3Rpb24odCl7dGhpcy5pc0RyYWdnaW5nJiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVNb3VzZU1vdmU6ZnVuY3Rpb24odCl7dGhpcy5oYW5kbGVNb3ZlKHQpfSxoYW5kbGVUb3VjaFNjcm9sbDpmdW5jdGlvbih0KXt0aGlzLmlzRHJhZ2dpbmd8fHRoaXMuZW5kSW50ZXJhY3Rpb24odCwhMCl9LHRyaWdnZXI6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zW3RdJiZ0aGlzLm9wdGlvbnNbdF0uYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpLHRoaXNbIl8iK3RdJiZ0aGlzWyJfIit0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSk7aGUubWl4aW4oe2lzQXV0b1Njcm9sbDohMSxzY3JvbGxCb3VuZHM6bnVsbCxzY3JvbGxUb3BWZWw6bnVsbCxzY3JvbGxMZWZ0VmVsOm51bGwsc2Nyb2xsSW50ZXJ2YWxJZDpudWxsLHNjcm9sbFNlbnNpdGl2aXR5OjMwLHNjcm9sbFNwZWVkOjIwMCxzY3JvbGxJbnRlcnZhbE1zOjUwLGluaXRBdXRvU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLmlzQXV0b1Njcm9sbD10aGlzLm9wdGlvbnMuc2Nyb2xsJiZ0JiYhdC5pcyh3aW5kb3cpJiYhdC5pcyhkb2N1bWVudCksdGhpcy5pc0F1dG9TY3JvbGwmJnRoaXMubGlzdGVuVG8odCwic2Nyb2xsIixhdCh0aGlzLmhhbmRsZURlYm91bmNlZFNjcm9sbCwxMDApKX0sZGVzdHJveUF1dG9TY3JvbGw6ZnVuY3Rpb24oKXt0aGlzLmVuZEF1dG9TY3JvbGwoKSx0aGlzLmlzQXV0b1Njcm9sbCYmdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCwic2Nyb2xsIil9LGNvbXB1dGVTY3JvbGxCb3VuZHM6ZnVuY3Rpb24oKXt0aGlzLmlzQXV0b1Njcm9sbCYmKHRoaXMuc2Nyb2xsQm91bmRzPWgodGhpcy5zY3JvbGxFbCkpfSx1cGRhdGVBdXRvU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyLHM9dGhpcy5zY3JvbGxTZW5zaXRpdml0eSxvPXRoaXMuc2Nyb2xsQm91bmRzLGw9MCxhPTA7byYmKGU9KHMtKEUodCktby50b3ApKS9zLG49KHMtKG8uYm90dG9tLUUodCkpKS9zLGk9KHMtKHcodCktby5sZWZ0KSkvcyxyPShzLShvLnJpZ2h0LXcodCkpKS9zLGU+PTAmJmU8PTE/bD1lKnRoaXMuc2Nyb2xsU3BlZWQqLTE6bj49MCYmbjw9MSYmKGw9bip0aGlzLnNjcm9sbFNwZWVkKSxpPj0wJiZpPD0xP2E9aSp0aGlzLnNjcm9sbFNwZWVkKi0xOnI+PTAmJnI8PTEmJihhPXIqdGhpcy5zY3JvbGxTcGVlZCkpLHRoaXMuc2V0U2Nyb2xsVmVsKGwsYSl9LHNldFNjcm9sbFZlbDpmdW5jdGlvbih0LGUpe3RoaXMuc2Nyb2xsVG9wVmVsPXQsdGhpcy5zY3JvbGxMZWZ0VmVsPWUsdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSwhdGhpcy5zY3JvbGxUb3BWZWwmJiF0aGlzLnNjcm9sbExlZnRWZWx8fHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZHx8KHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZD1zZXRJbnRlcnZhbChsdCh0aGlzLCJzY3JvbGxJbnRlcnZhbEZ1bmMiKSx0aGlzLnNjcm9sbEludGVydmFsTXMpKX0sY29uc3RyYWluU2Nyb2xsVmVsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxFbDt0aGlzLnNjcm9sbFRvcFZlbDwwP3Quc2Nyb2xsVG9wKCk8PTAmJih0aGlzLnNjcm9sbFRvcFZlbD0wKTp0aGlzLnNjcm9sbFRvcFZlbD4wJiZ0LnNjcm9sbFRvcCgpK3RbMF0uY2xpZW50SGVpZ2h0Pj10WzBdLnNjcm9sbEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9wVmVsPTApLHRoaXMuc2Nyb2xsTGVmdFZlbDwwP3Quc2Nyb2xsTGVmdCgpPD0wJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApOnRoaXMuc2Nyb2xsTGVmdFZlbD4wJiZ0LnNjcm9sbExlZnQoKSt0WzBdLmNsaWVudFdpZHRoPj10WzBdLnNjcm9sbFdpZHRoJiYodGhpcy5zY3JvbGxMZWZ0VmVsPTApfSxzY3JvbGxJbnRlcnZhbEZ1bmM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNjcm9sbEVsLGU9dGhpcy5zY3JvbGxJbnRlcnZhbE1zLzFlMzt0aGlzLnNjcm9sbFRvcFZlbCYmdC5zY3JvbGxUb3AodC5zY3JvbGxUb3AoKSt0aGlzLnNjcm9sbFRvcFZlbCplKSx0aGlzLnNjcm9sbExlZnRWZWwmJnQuc2Nyb2xsTGVmdCh0LnNjcm9sbExlZnQoKSt0aGlzLnNjcm9sbExlZnRWZWwqZSksdGhpcy5jb25zdHJhaW5TY3JvbGxWZWwoKSx0aGlzLnNjcm9sbFRvcFZlbHx8dGhpcy5zY3JvbGxMZWZ0VmVsfHx0aGlzLmVuZEF1dG9TY3JvbGwoKX0sZW5kQXV0b1Njcm9sbDpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSW50ZXJ2YWxJZCYmKGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxJbnRlcnZhbElkKSx0aGlzLnNjcm9sbEludGVydmFsSWQ9bnVsbCx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpKX0saGFuZGxlRGVib3VuY2VkU2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxJbnRlcnZhbElkfHx0aGlzLmhhbmRsZVNjcm9sbEVuZCgpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXt9fSk7dmFyIGZlPWhlLmV4dGVuZCh7Y29tcG9uZW50Om51bGwsb3JpZ0hpdDpudWxsLGhpdDpudWxsLGNvb3JkQWRqdXN0Om51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCxlKXtoZS5jYWxsKHRoaXMsZSksdGhpcy5jb21wb25lbnQ9dH0saGFuZGxlSW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj10aGlzLnN1YmplY3RFbDt0aGlzLmNvbXB1dGVDb29yZHMoKSx0PyhuPXtsZWZ0OncodCksdG9wOkUodCl9LGk9bixyJiYoZT1oKHIpLGk9UihpLGUpKSx0aGlzLm9yaWdIaXQ9dGhpcy5xdWVyeUhpdChpLmxlZnQsaS50b3ApLHImJnRoaXMub3B0aW9ucy5zdWJqZWN0Q2VudGVyJiYodGhpcy5vcmlnSGl0JiYoZT14KHRoaXMub3JpZ0hpdCxlKXx8ZSksaT1JKGUpKSx0aGlzLmNvb3JkQWRqdXN0PWsoaSxuKSk6KHRoaXMub3JpZ0hpdD1udWxsLHRoaXMuY29vcmRBZGp1c3Q9bnVsbCksaGUucHJvdG90eXBlLmhhbmRsZUludGVyYWN0aW9uU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjb21wdXRlQ29vcmRzOmZ1bmN0aW9uKCl7dGhpcy5jb21wb25lbnQucHJlcGFyZUhpdHMoKSx0aGlzLmNvbXB1dGVTY3JvbGxCb3VuZHMoKX0saGFuZGxlRHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBlO2hlLnByb3RvdHlwZS5oYW5kbGVEcmFnU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5xdWVyeUhpdCh3KHQpLEUodCkpLGUmJnRoaXMuaGFuZGxlSGl0T3ZlcihlKX0saGFuZGxlRHJhZzpmdW5jdGlvbih0LGUsbil7dmFyIGk7aGUucHJvdG90eXBlLmhhbmRsZURyYWcuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9dGhpcy5xdWVyeUhpdCh3KG4pLEUobikpLGJ0KGksdGhpcy5oaXQpfHwodGhpcy5oaXQmJnRoaXMuaGFuZGxlSGl0T3V0KCksaSYmdGhpcy5oYW5kbGVIaXRPdmVyKGkpKX0saGFuZGxlRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuaGFuZGxlSGl0RG9uZSgpLGhlLnByb3RvdHlwZS5oYW5kbGVEcmFnRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saGFuZGxlSGl0T3ZlcjpmdW5jdGlvbih0KXt2YXIgZT1idCh0LHRoaXMub3JpZ0hpdCk7dGhpcy5oaXQ9dCx0aGlzLnRyaWdnZXIoImhpdE92ZXIiLHRoaXMuaGl0LGUsdGhpcy5vcmlnSGl0KX0saGFuZGxlSGl0T3V0OmZ1bmN0aW9uKCl7dGhpcy5oaXQmJih0aGlzLnRyaWdnZXIoImhpdE91dCIsdGhpcy5oaXQpLHRoaXMuaGFuZGxlSGl0RG9uZSgpLHRoaXMuaGl0PW51bGwpfSxoYW5kbGVIaXREb25lOmZ1bmN0aW9uKCl7dGhpcy5oaXQmJnRoaXMudHJpZ2dlcigiaGl0RG9uZSIsdGhpcy5oaXQpfSxoYW5kbGVJbnRlcmFjdGlvbkVuZDpmdW5jdGlvbigpe2hlLnByb3RvdHlwZS5oYW5kbGVJbnRlcmFjdGlvbkVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5vcmlnSGl0PW51bGwsdGhpcy5oaXQ9bnVsbCx0aGlzLmNvbXBvbmVudC5yZWxlYXNlSGl0cygpfSxoYW5kbGVTY3JvbGxFbmQ6ZnVuY3Rpb24oKXtoZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsRW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNvbXB1dGVDb29yZHMoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb29yZEFkanVzdCYmKHQrPXRoaXMuY29vcmRBZGp1c3QubGVmdCxlKz10aGlzLmNvb3JkQWRqdXN0LnRvcCksdGhpcy5jb21wb25lbnQucXVlcnlIaXQodCxlKX19KSxnZT13dC5leHRlbmQoYWUse29wdGlvbnM6bnVsbCxzb3VyY2VFbDpudWxsLGVsOm51bGwscGFyZW50RWw6bnVsbCx0b3AwOm51bGwsbGVmdDA6bnVsbCx5MDpudWxsLHgwOm51bGwsdG9wRGVsdGE6bnVsbCxsZWZ0RGVsdGE6bnVsbCxpc0ZvbGxvd2luZzohMSxpc0hpZGRlbjohMSxpc0FuaW1hdGluZzohMSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLG4pe3RoaXMub3B0aW9ucz1uPW58fHt9LHRoaXMuc291cmNlRWw9ZSx0aGlzLnBhcmVudEVsPW4ucGFyZW50RWw/dChuLnBhcmVudEVsKTplLnBhcmVudCgpfSxzdGFydDpmdW5jdGlvbihlKXt0aGlzLmlzRm9sbG93aW5nfHwodGhpcy5pc0ZvbGxvd2luZz0hMCx0aGlzLnkwPUUoZSksdGhpcy54MD13KGUpLHRoaXMudG9wRGVsdGE9MCx0aGlzLmxlZnREZWx0YT0wLHRoaXMuaXNIaWRkZW58fHRoaXMudXBkYXRlUG9zaXRpb24oKSxEKGUpP3RoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNobW92ZSIsdGhpcy5oYW5kbGVNb3ZlKTp0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZW1vdmUiLHRoaXMuaGFuZGxlTW92ZSkpfSxzdG9wOmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3IuaXNBbmltYXRpbmc9ITEsci5yZW1vdmVFbGVtZW50KCksci50b3AwPXIubGVmdDA9bnVsbCxuJiZuKCl9dmFyIHI9dGhpcyxzPXRoaXMub3B0aW9ucy5yZXZlcnREdXJhdGlvbjt0aGlzLmlzRm9sbG93aW5nJiYhdGhpcy5pc0FuaW1hdGluZyYmKHRoaXMuaXNGb2xsb3dpbmc9ITEsdGhpcy5zdG9wTGlzdGVuaW5nVG8odChkb2N1bWVudCkpLGUmJnMmJiF0aGlzLmlzSGlkZGVuPyh0aGlzLmlzQW5pbWF0aW5nPSEwLHRoaXMuZWwuYW5pbWF0ZSh7dG9wOnRoaXMudG9wMCxsZWZ0OnRoaXMubGVmdDB9LHtkdXJhdGlvbjpzLGNvbXBsZXRlOml9KSk6aSgpKX0sZ2V0RWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsO3JldHVybiB0fHwodD10aGlzLmVsPXRoaXMuc291cmNlRWwuY2xvbmUoKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbENsYXNzfHwiIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6IiIsZGlzcGxheTp0aGlzLmlzSGlkZGVuPyJub25lIjoiIixtYXJnaW46MCxyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIix3aWR0aDp0aGlzLnNvdXJjZUVsLndpZHRoKCksaGVpZ2h0OnRoaXMuc291cmNlRWwuaGVpZ2h0KCksb3BhY2l0eTp0aGlzLm9wdGlvbnMub3BhY2l0eXx8IiIsekluZGV4OnRoaXMub3B0aW9ucy56SW5kZXh9KSx0LmFkZENsYXNzKCJmYy11bnNlbGVjdGFibGUiKSx0LmFwcGVuZFRvKHRoaXMucGFyZW50RWwpKSx0fSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5lbCYmKHRoaXMuZWwucmVtb3ZlKCksdGhpcy5lbD1udWxsKX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdCxlO3RoaXMuZ2V0RWwoKSxudWxsPT09dGhpcy50b3AwJiYodD10aGlzLnNvdXJjZUVsLm9mZnNldCgpLGU9dGhpcy5lbC5vZmZzZXRQYXJlbnQoKS5vZmZzZXQoKSx0aGlzLnRvcDA9dC50b3AtZS50b3AsdGhpcy5sZWZ0MD10LmxlZnQtZS5sZWZ0KSx0aGlzLmVsLmNzcyh7dG9wOnRoaXMudG9wMCt0aGlzLnRvcERlbHRhLGxlZnQ6dGhpcy5sZWZ0MCt0aGlzLmxlZnREZWx0YX0pfSxoYW5kbGVNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMudG9wRGVsdGE9RSh0KS10aGlzLnkwLHRoaXMubGVmdERlbHRhPXcodCktdGhpcy54MCx0aGlzLmlzSGlkZGVufHx0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVufHwodGhpcy5pc0hpZGRlbj0hMCx0aGlzLmVsJiZ0aGlzLmVsLmhpZGUoKSl9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLmlzSGlkZGVuJiYodGhpcy5pc0hpZGRlbj0hMSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCksdGhpcy5nZXRFbCgpLnNob3coKSl9fSkscGU9anQuR3JpZD13dC5leHRlbmQoYWUsdWUse2hhc0RheUludGVyYWN0aW9uczohMCx2aWV3Om51bGwsaXNSVEw6bnVsbCxzdGFydDpudWxsLGVuZDpudWxsLGVsOm51bGwsZWxzQnlGaWxsOm51bGwsZXZlbnRUaW1lRm9ybWF0Om51bGwsZGlzcGxheUV2ZW50VGltZTpudWxsLGRpc3BsYXlFdmVudEVuZDpudWxsLG1pblJlc2l6ZUR1cmF0aW9uOm51bGwsbGFyZ2VVbml0Om51bGwsZGF5RHJhZ0xpc3RlbmVyOm51bGwsc2VnRHJhZ0xpc3RlbmVyOm51bGwsc2VnUmVzaXplTGlzdGVuZXI6bnVsbCxleHRlcm5hbERyYWdMaXN0ZW5lcjpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQpe3RoaXMudmlldz10LHRoaXMuaXNSVEw9dC5vcHQoImlzUlRMIiksdGhpcy5lbHNCeUZpbGw9e30sdGhpcy5kYXlEcmFnTGlzdGVuZXI9dGhpcy5idWlsZERheURyYWdMaXN0ZW5lcigpLHRoaXMuaW5pdE1vdXNlSWdub3JpbmcoKX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJzbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZXRSYW5nZTpmdW5jdGlvbih0KXt0aGlzLnN0YXJ0PXQuc3RhcnQuY2xvbmUoKSx0aGlzLmVuZD10LmVuZC5jbG9uZSgpLHRoaXMucmFuZ2VVcGRhdGVkKCksdGhpcy5wcm9jZXNzUmFuZ2VPcHRpb25zKCl9LHJhbmdlVXBkYXRlZDpmdW5jdGlvbigpe30scHJvY2Vzc1JhbmdlT3B0aW9uczpmdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLnZpZXc7dGhpcy5ldmVudFRpbWVGb3JtYXQ9bi5vcHQoImV2ZW50VGltZUZvcm1hdCIpfHxuLm9wdCgidGltZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVFdmVudFRpbWVGb3JtYXQoKSx0PW4ub3B0KCJkaXNwbGF5RXZlbnRUaW1lIiksbnVsbD09dCYmKHQ9dGhpcy5jb21wdXRlRGlzcGxheUV2ZW50VGltZSgpKSxlPW4ub3B0KCJkaXNwbGF5RXZlbnRFbmQiKSxudWxsPT1lJiYoZT10aGlzLmNvbXB1dGVEaXNwbGF5RXZlbnRFbmQoKSksdGhpcy5kaXNwbGF5RXZlbnRUaW1lPXQsdGhpcy5kaXNwbGF5RXZlbnRFbmQ9ZX0sc3BhblRvU2VnczpmdW5jdGlvbih0KXt9LGRpZmZEYXRlczpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxhcmdlVW5pdD9BKHQsZSx0aGlzLmxhcmdlVW5pdCk6Tih0LGUpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe30sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7fSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmhhc0RheUludGVyYWN0aW9ucyYmKGIodCksdGhpcy5iaW5kRGF5SGFuZGxlcigidG91Y2hzdGFydCIsdGhpcy5kYXlUb3VjaFN0YXJ0KSx0aGlzLmJpbmREYXlIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMuZGF5TW91c2Vkb3duKSksdGhpcy5iaW5kU2VnSGFuZGxlcnMoKSx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxiaW5kRGF5SGFuZGxlcjpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXM7dGhpcy5lbC5vbihlLGZ1bmN0aW9uKGUpe2lmKCF0KGUudGFyZ2V0KS5pcyhpLnNlZ1NlbGVjdG9yKyIsIitpLnNlZ1NlbGVjdG9yKyIgKiwuZmMtbW9yZSxhW2RhdGEtZ290b10iKSlyZXR1cm4gbi5jYWxsKGksZSl9KX0scmVtb3ZlRWxlbWVudDpmdW5jdGlvbigpe3RoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMuZWwucmVtb3ZlKCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7fSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe30sdW5yZW5kZXJEYXRlczpmdW5jdGlvbigpe30sYmluZEdsb2JhbEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5Ubyh0KGRvY3VtZW50KSx7ZHJhZ3N0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnQsc29ydHN0YXJ0OnRoaXMuZXh0ZXJuYWxEcmFnU3RhcnR9KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGRheU1vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzSWdub3JpbmdNb3VzZXx8dGhpcy5kYXlEcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbih0LHt9KX0sZGF5VG91Y2hTdGFydDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXc7KGUuaXNTZWxlY3RlZHx8ZS5zZWxlY3RlZEV2ZW50KSYmdGhpcy50ZW1wSWdub3JlTW91c2UoKSx0aGlzLmRheURyYWdMaXN0ZW5lci5zdGFydEludGVyYWN0aW9uKHQse2RlbGF5OnRoaXMudmlldy5vcHQoImxvbmdQcmVzc0RlbGF5Iil9KX0sYnVpbGREYXlEcmFnTGlzdGVuZXI6ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxpPXRoaXMudmlldyxyPWkub3B0KCJzZWxlY3RhYmxlIiksbD1uZXcgZmUodGhpcyx7c2Nyb2xsOmkub3B0KCJkcmFnU2Nyb2xsIiksaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3Q9bC5vcmlnSGl0LGU9bnVsbH0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKCl7aS51bnNlbGVjdCgpfSxoaXRPdmVyOmZ1bmN0aW9uKGksbyxsKXtsJiYob3x8KHQ9bnVsbCksciYmKGU9bi5jb21wdXRlU2VsZWN0aW9uKG4uZ2V0SGl0U3BhbihsKSxuLmdldEhpdFNwYW4oaSkpLGU/bi5yZW5kZXJTZWxlY3Rpb24oZSk6ZT09PSExJiZzKCkpKX0saGl0T3V0OmZ1bmN0aW9uKCl7dD1udWxsLGU9bnVsbCxuLnVucmVuZGVyU2VsZWN0aW9uKCl9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCl9LGludGVyYWN0aW9uRW5kOmZ1bmN0aW9uKHIscyl7c3x8KHQmJiFuLmlzSWdub3JpbmdNb3VzZSYmaS50cmlnZ2VyRGF5Q2xpY2sobi5nZXRIaXRTcGFuKHQpLG4uZ2V0SGl0RWwodCksciksZSYmaS5yZXBvcnRTZWxlY3Rpb24oZSxyKSl9fSk7cmV0dXJuIGx9LGNsZWFyRHJhZ0xpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuZGF5RHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdEcmFnTGlzdGVuZXImJnRoaXMuc2VnRHJhZ0xpc3RlbmVyLmVuZEludGVyYWN0aW9uKCksdGhpcy5zZWdSZXNpemVMaXN0ZW5lciYmdGhpcy5zZWdSZXNpemVMaXN0ZW5lci5lbmRJbnRlcmFjdGlvbigpLHRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXImJnRoaXMuZXh0ZXJuYWxEcmFnTGlzdGVuZXIuZW5kSW50ZXJhY3Rpb24oKX0scmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmFicmljYXRlSGVscGVyRXZlbnQodCxlKTtyZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXIobixlKX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1lP1ooZS5ldmVudCk6e307cmV0dXJuIG4uc3RhcnQ9dC5zdGFydC5jbG9uZSgpLG4uZW5kPXQuZW5kP3QuZW5kLmNsb25lKCk6bnVsbCxuLmFsbERheT1udWxsLHRoaXMudmlldy5jYWxlbmRhci5ub3JtYWxpemVFdmVudERhdGVzKG4pLG4uY2xhc3NOYW1lPShuLmNsYXNzTmFtZXx8W10pLmNvbmNhdCgiZmMtaGVscGVyIiksZXx8KG4uZWRpdGFibGU9ITEpLG59LHJlbmRlckhlbHBlcjpmdW5jdGlvbih0LGUpe30sdW5yZW5kZXJIZWxwZXI6ZnVuY3Rpb24oKXt9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodCh0KX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LGNvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbXB1dGVTZWxlY3Rpb25TcGFuKHQsZSk7cmV0dXJuIShuJiYhdGhpcy52aWV3LmNhbGVuZGFyLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQobikpJiZufSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciBuPVt0LnN0YXJ0LHQuZW5kLGUuc3RhcnQsZS5lbmRdO3JldHVybiBuLnNvcnQoc3QpLHtzdGFydDpuWzBdLmNsb25lKCksZW5kOm5bM10uY2xvbmUoKX19LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckZpbGwoImhpZ2hsaWdodCIsdGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyRmlsbCgiaGlnaGxpZ2h0Iil9LGhpZ2hsaWdodFNlZ0NsYXNzZXM6ZnVuY3Rpb24oKXtyZXR1cm5bImZjLWhpZ2hsaWdodCJdfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7fSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LGdldE5vd0luZGljYXRvclVuaXQ6ZnVuY3Rpb24oKXt9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbih0KXt9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7fSxyZW5kZXJGaWxsOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckZpbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbHNCeUZpbGxbdF07ZSYmKGUucmVtb3ZlKCksZGVsZXRlIHRoaXMuZWxzQnlGaWxsW3RdKX0scmVuZGVyRmlsbFNlZ0VsczpmdW5jdGlvbihlLG4pe3ZhciBpLHI9dGhpcyxzPXRoaXNbZSsiU2VnRWwiXSxvPSIiLGw9W107aWYobi5sZW5ndGgpe2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspbys9dGhpcy5maWxsU2VnSHRtbChlLG5baV0pO3QobykuZWFjaChmdW5jdGlvbihlLGkpe3ZhciBvPW5bZV0sYT10KGkpO3MmJihhPXMuY2FsbChyLG8sYSkpLGEmJihhPXQoYSksYS5pcyhyLmZpbGxTZWdUYWcpJiYoby5lbD1hLGwucHVzaChvKSkpfSl9cmV0dXJuIGx9LGZpbGxTZWdUYWc6ImRpdiIsZmlsbFNlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzW3QrIlNlZ0NsYXNzZXMiXSxpPXRoaXNbdCsiU2VnQ3NzIl0scj1uP24uY2FsbCh0aGlzLGUpOltdLHM9bnQoaT9pLmNhbGwodGhpcyxlKTp7fSk7cmV0dXJuIjwiK3RoaXMuZmlsbFNlZ1RhZysoci5sZW5ndGg/JyBjbGFzcz0iJytyLmpvaW4oIiAiKSsnIic6IiIpKyhzPycgc3R5bGU9IicrcysnIic6IiIpKyIgLz4ifSxnZXREYXlDbGFzc2VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPWUuY2FsZW5kYXIuZ2V0Tm93KCksaT1bImZjLSIrJHRbdC5kYXkoKV1dO3JldHVybiAxPT1lLmludGVydmFsRHVyYXRpb24uYXMoIm1vbnRocyIpJiZ0Lm1vbnRoKCkhPWUuaW50ZXJ2YWxTdGFydC5tb250aCgpJiZpLnB1c2goImZjLW90aGVyLW1vbnRoIiksdC5pc1NhbWUobiwiZGF5Iik/aS5wdXNoKCJmYy10b2RheSIsZS5oaWdobGlnaHRTdGF0ZUNsYXNzKTp0PG4/aS5wdXNoKCJmYy1wYXN0Iik6aS5wdXNoKCJmYy1mdXR1cmUiKSxpfX0pO3BlLm1peGluKHtzZWdTZWxlY3RvcjoiLmZjLWV2ZW50LWNvbnRhaW5lciA+ICoiLG1vdXNlZE92ZXJTZWc6bnVsbCxpc0RyYWdnaW5nU2VnOiExLGlzUmVzaXppbmdTZWc6ITEsaXNEcmFnZ2luZ0V4dGVybmFsOiExLHNlZ3M6bnVsbCxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGUsbj1bXSxpPVtdO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspKFR0KHRbZV0pP246aSkucHVzaCh0W2VdKTt0aGlzLnNlZ3M9W10uY29uY2F0KHRoaXMucmVuZGVyQmdFdmVudHMobiksdGhpcy5yZW5kZXJGZ0V2ZW50cyhpKSl9LHJlbmRlckJnRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRzVG9TZWdzKHQpO3JldHVybiB0aGlzLnJlbmRlckJnU2VncyhlKXx8ZX0scmVuZGVyRmdFdmVudHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ldmVudHNUb1NlZ3ModCk7cmV0dXJuIHRoaXMucmVuZGVyRmdTZWdzKGUpfHxlfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuaGFuZGxlU2VnTW91c2VvdXQoKSx0aGlzLmNsZWFyRHJhZ0xpc3RlbmVycygpLHRoaXMudW5yZW5kZXJGZ1NlZ3MoKSx0aGlzLnVucmVuZGVyQmdTZWdzKCksdGhpcy5zZWdzPW51bGx9LGdldEV2ZW50U2VnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlZ3N8fFtdfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe30scmVuZGVyRmdTZWdFbHM6ZnVuY3Rpb24oZSxuKXt2YXIgaSxyPXRoaXMudmlldyxzPSIiLG89W107aWYoZS5sZW5ndGgpe2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspcys9dGhpcy5mZ1NlZ0h0bWwoZVtpXSxuKTt0KHMpLmVhY2goZnVuY3Rpb24obixpKXt2YXIgcz1lW25dLGw9ci5yZXNvbHZlRXZlbnRFbChzLmV2ZW50LHQoaSkpO2wmJihsLmRhdGEoImZjLXNlZyIscykscy5lbD1sLG8ucHVzaChzKSl9KX1yZXR1cm4gb30sZmdTZWdIdG1sOmZ1bmN0aW9uKHQsZSl7fSxyZW5kZXJCZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVyRmlsbCgiYmdFdmVudCIsdCl9LHVucmVuZGVyQmdTZWdzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckZpbGwoImJnRXZlbnQiKX0sYmdFdmVudFNlZ0VsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudmlldy5yZXNvbHZlRXZlbnRFbCh0LmV2ZW50LGUpfSxiZ0V2ZW50U2VnQ2xhc3NlczpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LG49ZS5zb3VyY2V8fHt9O3JldHVyblsiZmMtYmdldmVudCJdLmNvbmNhdChlLmNsYXNzTmFtZSxuLmNsYXNzTmFtZXx8W10pfSxiZ0V2ZW50U2VnQ3NzOmZ1bmN0aW9uKHQpe3JldHVybnsiYmFja2dyb3VuZC1jb2xvciI6dGhpcy5nZXRTZWdTa2luQ3NzKHQpWyJiYWNrZ3JvdW5kLWNvbG9yIl19fSxidXNpbmVzc0hvdXJzU2VnQ2xhc3NlczpmdW5jdGlvbih0KXtyZXR1cm5bImZjLW5vbmJ1c2luZXNzIiwiZmMtYmdldmVudCJdfSxidWlsZEJ1c2luZXNzSG91clNlZ3M6ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHMoZSk7cmV0dXJuIW4ubGVuZ3RoJiZ0aGlzLnZpZXcuY2FsZW5kYXIub3B0aW9ucy5idXNpbmVzc0hvdXJzJiYobj1bdC5leHRlbmQoe30sUmUse3N0YXJ0OnRoaXMudmlldy5lbmQsZW5kOnRoaXMudmlldy5lbmQsZG93Om51bGx9KV0pLHRoaXMuZXZlbnRzVG9TZWdzKG4pfSxiaW5kU2VnSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmJpbmRTZWdIYW5kbGVyc1RvRWwodGhpcy5lbCl9LGJpbmRTZWdIYW5kbGVyc1RvRWw6ZnVuY3Rpb24odCl7dGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwidG91Y2hzdGFydCIsdGhpcy5oYW5kbGVTZWdUb3VjaFN0YXJ0KSx0aGlzLmJpbmRTZWdIYW5kbGVyVG9FbCh0LCJ0b3VjaGVuZCIsdGhpcy5oYW5kbGVTZWdUb3VjaEVuZCksdGhpcy5iaW5kU2VnSGFuZGxlclRvRWwodCwibW91c2VlbnRlciIsdGhpcy5oYW5kbGVTZWdNb3VzZW92ZXIpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlbGVhdmUiLHRoaXMuaGFuZGxlU2VnTW91c2VvdXQpLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsIm1vdXNlZG93biIsdGhpcy5oYW5kbGVTZWdNb3VzZWRvd24pLHRoaXMuYmluZFNlZ0hhbmRsZXJUb0VsKHQsImNsaWNrIix0aGlzLmhhbmRsZVNlZ0NsaWNrKX0sYmluZFNlZ0hhbmRsZXJUb0VsOmZ1bmN0aW9uKGUsbixpKXt2YXIgcj10aGlzO2Uub24obix0aGlzLnNlZ1NlbGVjdG9yLGZ1bmN0aW9uKGUpe3ZhciBuPXQodGhpcykuZGF0YSgiZmMtc2VnIik7aWYobiYmIXIuaXNEcmFnZ2luZ1NlZyYmIXIuaXNSZXNpemluZ1NlZylyZXR1cm4gaS5jYWxsKHIsbixlKX0pfSxoYW5kbGVTZWdDbGljazpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy50cmlnZ2VyKCJldmVudENsaWNrIix0LmVsWzBdLHQuZXZlbnQsZSk7bj09PSExJiZlLnByZXZlbnREZWZhdWx0KCl9LGhhbmRsZVNlZ01vdXNlb3ZlcjpmdW5jdGlvbih0LGUpe3RoaXMuaXNJZ25vcmluZ01vdXNlfHx0aGlzLm1vdXNlZE92ZXJTZWd8fCh0aGlzLm1vdXNlZE92ZXJTZWc9dCx0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZSh0LmV2ZW50KSYmdC5lbC5hZGRDbGFzcygiZmMtYWxsb3ctbW91c2UtcmVzaXplIiksdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50TW91c2VvdmVyIix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZW91dDpmdW5jdGlvbih0LGUpe2U9ZXx8e30sdGhpcy5tb3VzZWRPdmVyU2VnJiYodD10fHx0aGlzLm1vdXNlZE92ZXJTZWcsdGhpcy5tb3VzZWRPdmVyU2VnPW51bGwsdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGUodC5ldmVudCkmJnQuZWwucmVtb3ZlQ2xhc3MoImZjLWFsbG93LW1vdXNlLXJlc2l6ZSIpLHRoaXMudmlldy50cmlnZ2VyKCJldmVudE1vdXNlb3V0Iix0LmVsWzBdLHQuZXZlbnQsZSkpfSxoYW5kbGVTZWdNb3VzZWRvd246ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnN0YXJ0U2VnUmVzaXplKHQsZSx7ZGlzdGFuY2U6NX0pOyFuJiZ0aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZSh0LmV2ZW50KSYmdGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KS5zdGFydEludGVyYWN0aW9uKGUse2Rpc3RhbmNlOjV9KX0saGFuZGxlU2VnVG91Y2hTdGFydDpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy52aWV3LHI9dC5ldmVudCxzPWkuaXNFdmVudFNlbGVjdGVkKHIpLG89aS5pc0V2ZW50RHJhZ2dhYmxlKHIpLGw9aS5pc0V2ZW50UmVzaXphYmxlKHIpLGE9ITE7cyYmbCYmKGE9dGhpcy5zdGFydFNlZ1Jlc2l6ZSh0LGUpKSxhfHwhbyYmIWx8fChuPW8/dGhpcy5idWlsZFNlZ0RyYWdMaXN0ZW5lcih0KTp0aGlzLmJ1aWxkU2VnU2VsZWN0TGlzdGVuZXIodCksbi5zdGFydEludGVyYWN0aW9uKGUse2RlbGF5OnM/MDp0aGlzLnZpZXcub3B0KCJsb25nUHJlc3NEZWxheSIpfSkpLHRoaXMudGVtcElnbm9yZU1vdXNlKCl9LGhhbmRsZVNlZ1RvdWNoRW5kOmZ1bmN0aW9uKHQsZSl7dGhpcy50ZW1wSWdub3JlTW91c2UoKX0sc3RhcnRTZWdSZXNpemU6ZnVuY3Rpb24oZSxuLGkpe3JldHVybiEhdChuLnRhcmdldCkuaXMoIi5mYy1yZXNpemVyIikmJih0aGlzLmJ1aWxkU2VnUmVzaXplTGlzdGVuZXIoZSx0KG4udGFyZ2V0KS5pcygiLmZjLXN0YXJ0LXJlc2l6ZXIiKSkuc3RhcnRJbnRlcmFjdGlvbihuLGkpLCEwKX0sYnVpbGRTZWdEcmFnTGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudDtpZih0aGlzLnNlZ0RyYWdMaXN0ZW5lcilyZXR1cm4gdGhpcy5zZWdEcmFnTGlzdGVuZXI7dmFyIGM9dGhpcy5zZWdEcmFnTGlzdGVuZXI9bmV3IGZlKGwse3Njcm9sbDpsLm9wdCgiZHJhZ1Njcm9sbCIpLHN1YmplY3RFbDp1LHN1YmplY3RDZW50ZXI6ITAsaW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbihpKXt0LmNvbXBvbmVudD1yLGU9ITEsbj1uZXcgZ2UodC5lbCx7YWRkaXRpb25hbENsYXNzOiJmYy1kcmFnZ2luZyIscGFyZW50RWw6bC5lbCxvcGFjaXR5OmMuaXNUb3VjaD9udWxsOmwub3B0KCJkcmFnT3BhY2l0eSIpLHJldmVydER1cmF0aW9uOmwub3B0KCJkcmFnUmV2ZXJ0RHVyYXRpb24iKSx6SW5kZXg6Mn0pLG4uaGlkZSgpLG4uc3RhcnQoaSl9LGRyYWdTdGFydDpmdW5jdGlvbihuKXtjLmlzVG91Y2gmJiFsLmlzRXZlbnRTZWxlY3RlZChkKSYmbC5zZWxlY3RFdmVudChkKSxlPSEwLHIuaGFuZGxlU2VnTW91c2VvdXQodCxuKSxyLnNlZ0RyYWdTdGFydCh0LG4pLGwuaGlkZUV2ZW50KGQpfSxoaXRPdmVyOmZ1bmN0aW9uKGUsbyx1KXt2YXIgaDt0LmhpdCYmKHU9dC5oaXQpLGk9ci5jb21wdXRlRXZlbnREcm9wKHUuY29tcG9uZW50LmdldEhpdFNwYW4odSksZS5jb21wb25lbnQuZ2V0SGl0U3BhbihlKSxkKSxpJiYhYS5pc0V2ZW50U3BhbkFsbG93ZWQoci5ldmVudFRvU3BhbihpKSxkKSYmKHMoKSxpPW51bGwpLGkmJihoPWwucmVuZGVyRHJhZyhpLHQpKT8oaC5hZGRDbGFzcygiZmMtZHJhZ2dpbmciKSxjLmlzVG91Y2h8fHIuYXBwbHlEcmFnT3BhY2l0eShoKSxuLmhpZGUoKSk6bi5zaG93KCksbyYmKGk9bnVsbCl9LGhpdE91dDpmdW5jdGlvbigpe2wudW5yZW5kZXJEcmFnKCksbi5zaG93KCksaT1udWxsfSxoaXREb25lOmZ1bmN0aW9uKCl7bygpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbihzKXtkZWxldGUgdC5jb21wb25lbnQsbi5zdG9wKCFpLGZ1bmN0aW9uKCl7ZSYmKGwudW5yZW5kZXJEcmFnKCksbC5zaG93RXZlbnQoZCksci5zZWdEcmFnU3RvcCh0LHMpKSxpJiZsLnJlcG9ydEV2ZW50RHJvcChkLGksdGhpcy5sYXJnZVVuaXQsdSxzKX0pLHIuc2VnRHJhZ0xpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGN9LGJ1aWxkU2VnU2VsZWN0TGlzdGVuZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMudmlldyxpPXQuZXZlbnQ7aWYodGhpcy5zZWdEcmFnTGlzdGVuZXIpcmV0dXJuIHRoaXMuc2VnRHJhZ0xpc3RlbmVyO3ZhciByPXRoaXMuc2VnRHJhZ0xpc3RlbmVyPW5ldyBoZSh7ZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQpe3IuaXNUb3VjaCYmIW4uaXNFdmVudFNlbGVjdGVkKGkpJiZuLnNlbGVjdEV2ZW50KGkpfSxpbnRlcmFjdGlvbkVuZDpmdW5jdGlvbih0KXtlLnNlZ0RyYWdMaXN0ZW5lcj1udWxsfX0pO3JldHVybiByfSxzZWdEcmFnU3RhcnQ6ZnVuY3Rpb24odCxlKXt0aGlzLmlzRHJhZ2dpbmdTZWc9ITAsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50RHJhZ1N0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ0RyYWdTdG9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc0RyYWdnaW5nU2VnPSExLHRoaXMudmlldy50cmlnZ2VyKCJldmVudERyYWdTdG9wIix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LGNvbXB1dGVFdmVudERyb3A6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIscz10aGlzLnZpZXcuY2FsZW5kYXIsbz10LnN0YXJ0LGw9ZS5zdGFydDtyZXR1cm4gby5oYXNUaW1lKCk9PT1sLmhhc1RpbWUoKT8oaT10aGlzLmRpZmZEYXRlcyhsLG8pLG4uYWxsRGF5JiZXKGkpPyhyPXtzdGFydDpuLnN0YXJ0LmNsb25lKCksZW5kOnMuZ2V0RXZlbnRFbmQobiksYWxsRGF5OiExfSxzLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpOnI9SHQobiksci5zdGFydC5hZGQoaSksci5lbmQmJnIuZW5kLmFkZChpKSk6cj17c3RhcnQ6bC5jbG9uZSgpLGVuZDpudWxsLGFsbERheTohbC5oYXNUaW1lKCl9LHJ9LGFwcGx5RHJhZ09wYWNpdHk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3Lm9wdCgiZHJhZ09wYWNpdHkiKTtudWxsIT1lJiZ0LmNzcygib3BhY2l0eSIsZSl9LGV4dGVybmFsRHJhZ1N0YXJ0OmZ1bmN0aW9uKGUsbil7dmFyIGkscixzPXRoaXMudmlldztzLm9wdCgiZHJvcHBhYmxlIikmJihpPXQoKG4/bi5pdGVtOm51bGwpfHxlLnRhcmdldCkscj1zLm9wdCgiZHJvcEFjY2VwdCIpLCh0LmlzRnVuY3Rpb24ocik/ci5jYWxsKGlbMF0saSk6aS5pcyhyKSkmJih0aGlzLmlzRHJhZ2dpbmdFeHRlcm5hbHx8dGhpcy5saXN0ZW5Ub0V4dGVybmFsRHJhZyhpLGUsbikpKX0sbGlzdGVuVG9FeHRlcm5hbERyYWc6ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI9dGhpcyxsPXRoaXMudmlldy5jYWxlbmRhcixhPU10KHQpLHU9ci5leHRlcm5hbERyYWdMaXN0ZW5lcj1uZXcgZmUodGhpcyx7aW50ZXJhY3Rpb25TdGFydDpmdW5jdGlvbigpe3IuaXNEcmFnZ2luZ0V4dGVybmFsPSEwfSxoaXRPdmVyOmZ1bmN0aW9uKHQpe2k9ci5jb21wdXRlRXh0ZXJuYWxEcm9wKHQuY29tcG9uZW50LmdldEhpdFNwYW4odCksYSksaSYmIWwuaXNFeHRlcm5hbFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksaSxhLmV2ZW50UHJvcHMpJiYocygpLGk9bnVsbCksaSYmci5yZW5kZXJEcmFnKGkpfSxoaXRPdXQ6ZnVuY3Rpb24oKXtpPW51bGx9LGhpdERvbmU6ZnVuY3Rpb24oKXtvKCksci51bnJlbmRlckRyYWcoKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7aSYmci52aWV3LnJlcG9ydEV4dGVybmFsRHJvcChhLGksdCxlLG4pLHIuaXNEcmFnZ2luZ0V4dGVybmFsPSExLHIuZXh0ZXJuYWxEcmFnTGlzdGVuZXI9bnVsbH19KTt1LnN0YXJ0RHJhZyhlKX0sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudmlldy5jYWxlbmRhcixpPXtzdGFydDpuLmFwcGx5VGltZXpvbmUodC5zdGFydCksZW5kOm51bGx9O3JldHVybiBlLnN0YXJ0VGltZSYmIWkuc3RhcnQuaGFzVGltZSgpJiZpLnN0YXJ0LnRpbWUoZS5zdGFydFRpbWUpLGUuZHVyYXRpb24mJihpLmVuZD1pLnN0YXJ0LmNsb25lKCkuYWRkKGUuZHVyYXRpb24pKSxpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGJ1aWxkU2VnUmVzaXplTGlzdGVuZXI6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcyxsPXRoaXMudmlldyxhPWwuY2FsZW5kYXIsdT10LmVsLGQ9dC5ldmVudCxjPWEuZ2V0RXZlbnRFbmQoZCksaD10aGlzLnNlZ1Jlc2l6ZUxpc3RlbmVyPW5ldyBmZSh0aGlzLHtzY3JvbGw6bC5vcHQoImRyYWdTY3JvbGwiKSxzdWJqZWN0RWw6dSxpbnRlcmFjdGlvblN0YXJ0OmZ1bmN0aW9uKCl7bj0hMX0sZHJhZ1N0YXJ0OmZ1bmN0aW9uKGUpe249ITAsci5oYW5kbGVTZWdNb3VzZW91dCh0LGUpLHIuc2VnUmVzaXplU3RhcnQodCxlKX0saGl0T3ZlcjpmdW5jdGlvbihuLG8sdSl7dmFyIGg9ci5nZXRIaXRTcGFuKHUpLGY9ci5nZXRIaXRTcGFuKG4pO2k9ZT9yLmNvbXB1dGVFdmVudFN0YXJ0UmVzaXplKGgsZixkKTpyLmNvbXB1dGVFdmVudEVuZFJlc2l6ZShoLGYsZCksaSYmKGEuaXNFdmVudFNwYW5BbGxvd2VkKHIuZXZlbnRUb1NwYW4oaSksZCk/aS5zdGFydC5pc1NhbWUoZC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpKSYmaS5lbmQuaXNTYW1lKGMuY2xvbmUoKS5zdHJpcFpvbmUoKSkmJihpPW51bGwpOihzKCksaT1udWxsKSksaSYmKGwuaGlkZUV2ZW50KGQpLHIucmVuZGVyRXZlbnRSZXNpemUoaSx0KSl9LGhpdE91dDpmdW5jdGlvbigpe2k9bnVsbH0saGl0RG9uZTpmdW5jdGlvbigpe3IudW5yZW5kZXJFdmVudFJlc2l6ZSgpLGwuc2hvd0V2ZW50KGQpLG8oKX0saW50ZXJhY3Rpb25FbmQ6ZnVuY3Rpb24oZSl7biYmci5zZWdSZXNpemVTdG9wKHQsZSksaSYmbC5yZXBvcnRFdmVudFJlc2l6ZShkLGksdGhpcy5sYXJnZVVuaXQsdSxlKSxyLnNlZ1Jlc2l6ZUxpc3RlbmVyPW51bGx9fSk7cmV0dXJuIGh9LHNlZ1Jlc2l6ZVN0YXJ0OmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1Jlc2l6aW5nU2VnPSEwLHRoaXMudmlldy50cmlnZ2VyKCJldmVudFJlc2l6ZVN0YXJ0Iix0LmVsWzBdLHQuZXZlbnQsZSx7fSl9LHNlZ1Jlc2l6ZVN0b3A6ZnVuY3Rpb24odCxlKXt0aGlzLmlzUmVzaXppbmdTZWc9ITEsdGhpcy52aWV3LnRyaWdnZXIoImV2ZW50UmVzaXplU3RvcCIsdC5lbFswXSx0LmV2ZW50LGUse30pfSxjb21wdXRlRXZlbnRTdGFydFJlc2l6ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuY29tcHV0ZUV2ZW50UmVzaXplKCJzdGFydCIsdCxlLG4pfSxjb21wdXRlRXZlbnRFbmRSZXNpemU6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLmNvbXB1dGVFdmVudFJlc2l6ZSgiZW5kIix0LGUsbil9LGNvbXB1dGVFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcy52aWV3LmNhbGVuZGFyLGw9dGhpcy5kaWZmRGF0ZXMoblt0XSxlW3RdKTtyZXR1cm4gcj17c3RhcnQ6aS5zdGFydC5jbG9uZSgpLGVuZDpvLmdldEV2ZW50RW5kKGkpLGFsbERheTppLmFsbERheX0sci5hbGxEYXkmJlcobCkmJihyLmFsbERheT0hMSxvLm5vcm1hbGl6ZUV2ZW50VGltZXMocikpLHJbdF0uYWRkKGwpLHIuc3RhcnQuaXNCZWZvcmUoci5lbmQpfHwocz10aGlzLm1pblJlc2l6ZUR1cmF0aW9ufHwoaS5hbGxEYXk/by5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjpvLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pLCJzdGFydCI9PXQ/ci5zdGFydD1yLmVuZC5jbG9uZSgpLnN1YnRyYWN0KHMpOnIuZW5kPXIuc3RhcnQuY2xvbmUoKS5hZGQocykpLHJ9LHJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckV2ZW50UmVzaXplOmZ1bmN0aW9uKCl7fSxnZXRFdmVudFRpbWVUZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5ldmVudFRpbWVGb3JtYXQpLG51bGw9PW4mJihuPXRoaXMuZGlzcGxheUV2ZW50RW5kKSx0aGlzLmRpc3BsYXlFdmVudFRpbWUmJnQuc3RhcnQuaGFzVGltZSgpP24mJnQuZW5kP3RoaXMudmlldy5mb3JtYXRSYW5nZSh0LGUpOnQuc3RhcnQuZm9ybWF0KGUpOiIifSxnZXRTZWdDbGFzc2VzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLnZpZXcscj1bImZjLWV2ZW50Iix0LmlzU3RhcnQ/ImZjLXN0YXJ0IjoiZmMtbm90LXN0YXJ0Iix0LmlzRW5kPyJmYy1lbmQiOiJmYy1ub3QtZW5kIl0uY29uY2F0KHRoaXMuZ2V0U2VnQ3VzdG9tQ2xhc3Nlcyh0KSk7cmV0dXJuIGUmJnIucHVzaCgiZmMtZHJhZ2dhYmxlIiksbiYmci5wdXNoKCJmYy1yZXNpemFibGUiKSxpLmlzRXZlbnRTZWxlY3RlZCh0LmV2ZW50KSYmci5wdXNoKCJmYy1zZWxlY3RlZCIpLHJ9LGdldFNlZ0N1c3RvbUNsYXNzZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudDtyZXR1cm5bXS5jb25jYXQoZS5jbGFzc05hbWUsZS5zb3VyY2U/ZS5zb3VyY2UuY2xhc3NOYW1lOltdKX0sZ2V0U2VnU2tpbkNzczpmdW5jdGlvbih0KXtyZXR1cm57ImJhY2tncm91bmQtY29sb3IiOnRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLCJib3JkZXItY29sb3IiOnRoaXMuZ2V0U2VnQm9yZGVyQ29sb3IodCksY29sb3I6dGhpcy5nZXRTZWdUZXh0Q29sb3IodCl9fSxnZXRTZWdCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQuYmFja2dyb3VuZENvbG9yfHx0LmV2ZW50LmNvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLmJhY2tncm91bmRDb2xvcnx8ZS5jb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRCYWNrZ3JvdW5kQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5ib3JkZXJDb2xvcnx8dC5ldmVudC5jb2xvcnx8dGhpcy5nZXRTZWdEZWZhdWx0Qm9yZGVyQ29sb3IodCl9LGdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcjpmdW5jdGlvbih0KXt2YXIgZT10LmV2ZW50LnNvdXJjZXx8e307cmV0dXJuIGUuYm9yZGVyQ29sb3J8fGUuY29sb3J8fHRoaXMudmlldy5vcHQoImV2ZW50Qm9yZGVyQ29sb3IiKXx8dGhpcy52aWV3Lm9wdCgiZXZlbnRDb2xvciIpfSxnZXRTZWdUZXh0Q29sb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZlbnQudGV4dENvbG9yfHx0aGlzLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3IodCl9LGdldFNlZ0RlZmF1bHRUZXh0Q29sb3I6ZnVuY3Rpb24odCl7dmFyIGU9dC5ldmVudC5zb3VyY2V8fHt9O3JldHVybiBlLnRleHRDb2xvcnx8dGhpcy52aWV3Lm9wdCgiZXZlbnRUZXh0Q29sb3IiKX0sZXZlbnRUb1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXZlbnRzVG9TZWdzKFt0XSl9LGV2ZW50VG9TcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV2ZW50VG9TcGFucyh0KVswXX0sZXZlbnRUb1NwYW5zOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZXZlbnRUb1JhbmdlKHQpO3JldHVybiB0aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKGUsdCl9LGV2ZW50c1RvU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMscj1JdChlKSxzPVtdO3JldHVybiB0LmVhY2gocixmdW5jdGlvbih0LGUpe3ZhciByLG89W107Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylvLnB1c2goaS5ldmVudFRvUmFuZ2UoZVtyXSkpO2lmKHh0KGVbMF0pKWZvcihvPWkuaW52ZXJ0UmFuZ2VzKG8pLHI9MDtyPG8ubGVuZ3RoO3IrKylzLnB1c2guYXBwbHkocyxpLmV2ZW50UmFuZ2VUb1NlZ3Mob1tyXSxlWzBdLG4pKTtlbHNlIGZvcihyPTA7cjxvLmxlbmd0aDtyKyspcy5wdXNoLmFwcGx5KHMsaS5ldmVudFJhbmdlVG9TZWdzKG9bcl0sZVtyXSxuKSl9KSxzfSxldmVudFRvUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3LmNhbGVuZGFyLG49dC5zdGFydC5jbG9uZSgpLnN0cmlwWm9uZSgpLGk9KHQuZW5kP3QuZW5kLmNsb25lKCk6ZS5nZXREZWZhdWx0RXZlbnRFbmQobnVsbCE9dC5hbGxEYXk/dC5hbGxEYXk6IXQuc3RhcnQuaGFzVGltZSgpLHQuc3RhcnQpKS5zdHJpcFpvbmUoKTtyZXR1cm4gZS5sb2NhbGl6ZU1vbWVudChuKSxlLmxvY2FsaXplTW9tZW50KGkpLHtzdGFydDpuLGVuZDppfX0sZXZlbnRSYW5nZVRvU2VnczpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10aGlzLmV2ZW50UmFuZ2VUb1NwYW5zKHQsZSkscz1bXTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKXMucHVzaC5hcHBseShzLHRoaXMuZXZlbnRTcGFuVG9TZWdzKHJbaV0sZSxuKSk7cmV0dXJuIHN9LGV2ZW50UmFuZ2VUb1NwYW5zOmZ1bmN0aW9uKGUsbil7cmV0dXJuW3QuZXh0ZW5kKHt9LGUpXX0sZXZlbnRTcGFuVG9TZWdzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaSxyLHM9bj9uKHQpOnRoaXMuc3BhblRvU2Vncyh0KTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXI9c1tpXSxyLmV2ZW50PWUsci5ldmVudFN0YXJ0TVM9K3Quc3RhcnQsci5ldmVudER1cmF0aW9uTVM9dC5lbmQtdC5zdGFydDtyZXR1cm4gc30saW52ZXJ0UmFuZ2VzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj1pLnN0YXJ0LmNsb25lKCkscz1pLmVuZC5jbG9uZSgpLG89W10sbD1yO2Zvcih0LnNvcnQoa3QpLGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi5zdGFydD5sJiZvLnB1c2goe3N0YXJ0OmwsZW5kOm4uc3RhcnR9KSxsPW4uZW5kO3JldHVybiBsPHMmJm8ucHVzaCh7c3RhcnQ6bCxlbmQ6c30pLG99LHNvcnRFdmVudFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVFdmVudFNlZ3MiKSl9LGNvbXBhcmVFdmVudFNlZ3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ldmVudFN0YXJ0TVMtZS5ldmVudFN0YXJ0TVN8fGUuZXZlbnREdXJhdGlvbk1TLXQuZXZlbnREdXJhdGlvbk1TfHxlLmV2ZW50LmFsbERheS10LmV2ZW50LmFsbERheXx8TCh0LmV2ZW50LGUuZXZlbnQsdGhpcy52aWV3LmV2ZW50T3JkZXJTcGVjcyl9fSksanQucGx1Y2tFdmVudERhdGVQcm9wcz1IdCxqdC5pc0JnRXZlbnQ9VHQsanQuZGF0YUF0dHJQcmVmaXg9IiI7dmFyIHZlPWp0LkRheVRhYmxlTWl4aW49e2JyZWFrT25XZWVrczohMSxkYXlEYXRlczpudWxsLGRheUluZGljZXM6bnVsbCxkYXlzUGVyUm93Om51bGwscm93Q250Om51bGwsY29sQ250Om51bGwsY29sSGVhZEZvcm1hdDpudWxsLHVwZGF0ZURheVRhYmxlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixpPXRoaXMudmlldyxyPXRoaXMuc3RhcnQuY2xvbmUoKSxzPS0xLG89W10sbD1bXTtyLmlzQmVmb3JlKHRoaXMuZW5kKTspaS5pc0hpZGRlbkRheShyKT9vLnB1c2gocysuNSk6KHMrKyxvLnB1c2gocyksbC5wdXNoKHIuY2xvbmUoKSkpLHIuYWRkKDEsImRheXMiKTtpZih0aGlzLmJyZWFrT25XZWVrcyl7Zm9yKGU9bFswXS5kYXkoKSx0PTE7dDxsLmxlbmd0aCYmbFt0XS5kYXkoKSE9ZTt0KyspO249TWF0aC5jZWlsKGwubGVuZ3RoL3QpfWVsc2Ugbj0xLHQ9bC5sZW5ndGg7dGhpcy5kYXlEYXRlcz1sLHRoaXMuZGF5SW5kaWNlcz1vLHRoaXMuZGF5c1BlclJvdz10LHRoaXMucm93Q250PW4sdGhpcy51cGRhdGVEYXlUYWJsZUNvbHMoKX0sdXBkYXRlRGF5VGFibGVDb2xzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDbnQ9dGhpcy5jb21wdXRlQ29sQ250KCksdGhpcy5jb2xIZWFkRm9ybWF0PXRoaXMudmlldy5vcHQoImNvbHVtbkZvcm1hdCIpfHx0aGlzLmNvbXB1dGVDb2xIZWFkRm9ybWF0KCl9LGNvbXB1dGVDb2xDbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXlzUGVyUm93fSxnZXRDZWxsRGF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheURhdGVzW3RoaXMuZ2V0Q2VsbERheUluZGV4KHQsZSldLmNsb25lKCl9LGdldENlbGxSYW5nZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxpPW4uY2xvbmUoKS5hZGQoMSwiZGF5cyIpO3JldHVybntzdGFydDpuLGVuZDppfX0sZ2V0Q2VsbERheUluZGV4OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqdGhpcy5kYXlzUGVyUm93K3RoaXMuZ2V0Q29sRGF5SW5kZXgoZSl9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3RoaXMuY29sQ250LTEtdDp0fSxnZXREYXRlRGF5SW5kZXg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kYXlJbmRpY2VzLG49dC5kaWZmKHRoaXMuc3RhcnQsImRheXMiKTtyZXR1cm4gbjwwP2VbMF0tMTpuPj1lLmxlbmd0aD9lW2UubGVuZ3RoLTFdKzE6ZVtuXX0sY29tcHV0ZUNvbEhlYWRGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnQ+MXx8dGhpcy5jb2xDbnQ+MTA/ImRkZCI6dGhpcy5jb2xDbnQ+MT90aGlzLnZpZXcub3B0KCJkYXlPZk1vbnRoRm9ybWF0Iik6ImRkZGQifSxzbGljZVJhbmdlQnlSb3c6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvPXRoaXMuZGF5c1BlclJvdyxsPXRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UodCksYT10aGlzLmdldERhdGVEYXlJbmRleChsLnN0YXJ0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGwuZW5kLmNsb25lKCkuc3VidHJhY3QoMSwiZGF5cyIpKSxkPVtdO2ZvcihlPTA7ZTx0aGlzLnJvd0NudDtlKyspbj1lKm8saT1uK28tMSxyPU1hdGgubWF4KGEsbikscz1NYXRoLm1pbih1LGkpLHI9TWF0aC5jZWlsKHIpLHM9TWF0aC5mbG9vcihzKSxyPD1zJiZkLnB1c2goe3JvdzplLGZpcnN0Um93RGF5SW5kZXg6ci1uLGxhc3RSb3dEYXlJbmRleDpzLW4saXNTdGFydDpyPT09YSxpc0VuZDpzPT09dX0pO3JldHVybiBkfSxzbGljZVJhbmdlQnlEYXk6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHIscyxvLGw9dGhpcy5kYXlzUGVyUm93LGE9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx1PXRoaXMuZ2V0RGF0ZURheUluZGV4KGEuc3RhcnQpLGQ9dGhpcy5nZXREYXRlRGF5SW5kZXgoYS5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxLCJkYXlzIikpLGM9W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKylmb3Iobj1lKmwsaT1uK2wtMSxyPW47cjw9aTtyKyspcz1NYXRoLm1heCh1LHIpLG89TWF0aC5taW4oZCxyKSxzPU1hdGguY2VpbChzKSxvPU1hdGguZmxvb3Iobyksczw9byYmYy5wdXNoKHtyb3c6ZSxmaXJzdFJvd0RheUluZGV4OnMtbixsYXN0Um93RGF5SW5kZXg6by1uLGlzU3RhcnQ6cz09PXUsaXNFbmQ6bz09PWR9KTtyZXR1cm4gYzsKfSxyZW5kZXJIZWFkSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPGRpdiBjbGFzcz0iZmMtcm93ICcrdC53aWRnZXRIZWFkZXJDbGFzcysnIj48dGFibGU+PHRoZWFkPicrdGhpcy5yZW5kZXJIZWFkVHJIdG1sKCkrIjwvdGhlYWQ+PC90YWJsZT48L2Rpdj4ifSxyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckhlYWRUckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHRyPiIrKHRoaXMuaXNSVEw/IiI6dGhpcy5yZW5kZXJIZWFkSW50cm9IdG1sKCkpK3RoaXMucmVuZGVySGVhZERhdGVDZWxsc0h0bWwoKSsodGhpcy5pc1JUTD90aGlzLnJlbmRlckhlYWRJbnRyb0h0bWwoKToiIikrIjwvdHI+In0scmVuZGVySGVhZERhdGVDZWxsc0h0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLG49W107Zm9yKHQ9MDt0PHRoaXMuY29sQ250O3QrKyllPXRoaXMuZ2V0Q2VsbERhdGUoMCx0KSxuLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGUpKTtyZXR1cm4gbi5qb2luKCIiKX0scmVuZGVySGVhZERhdGVDZWxsSHRtbDpmdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy52aWV3O3JldHVybic8dGggY2xhc3M9ImZjLWRheS1oZWFkZXIgJytpLndpZGdldEhlYWRlckNsYXNzKyIgZmMtIiskdFt0LmRheSgpXSsnIicrKDE9PT10aGlzLnJvd0NudD8nIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKGU+MT8nIGNvbHNwYW49IicrZSsnIic6IiIpKyhuPyIgIituOiIiKSsiPiIraS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsZm9yY2VPZmY6dGhpcy5yb3dDbnQ+MXx8MT09PXRoaXMuY29sQ250fSx0dCh0LmZvcm1hdCh0aGlzLmNvbEhlYWRGb3JtYXQpKSkrIjwvdGg+In0scmVuZGVyQmdUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyQmdJbnRyb0h0bWwodCkpK3RoaXMucmVuZGVyQmdDZWxsc0h0bWwodCkrKHRoaXMuaXNSVEw/dGhpcy5yZW5kZXJCZ0ludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVuZGVySW50cm9IdG1sKCl9LHJlbmRlckJnQ2VsbHNIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1bXTtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKW49dGhpcy5nZXRDZWxsRGF0ZSh0LGUpLGkucHVzaCh0aGlzLnJlbmRlckJnQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJCZ0NlbGxIdG1sOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy52aWV3LGk9dGhpcy5nZXREYXlDbGFzc2VzKHQpO3JldHVybiBpLnVuc2hpZnQoImZjLWRheSIsbi53aWRnZXRDb250ZW50Q2xhc3MpLCc8dGQgY2xhc3M9IicraS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCJZWVlZLU1NLUREIikrJyInKyhlPyIgIitlOiIiKSsiPjwvdGQ+In0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7fSxib29rZW5kQ2VsbHM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yZW5kZXJJbnRyb0h0bWwoKTtlJiYodGhpcy5pc1JUTD90LmFwcGVuZChlKTp0LnByZXBlbmQoZSkpfX0sbWU9anQuRGF5R3JpZD1wZS5leHRlbmQodmUse251bWJlcnNWaXNpYmxlOiExLGJvdHRvbUNvb3JkUGFkZGluZzowLHJvd0VsczpudWxsLGNlbGxFbHM6bnVsbCxoZWxwZXJFbHM6bnVsbCxyb3dDb29yZENhY2hlOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHJlbmRlckRhdGVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnZpZXcscj10aGlzLnJvd0NudCxzPXRoaXMuY29sQ250LG89IiI7Zm9yKGU9MDtlPHI7ZSsrKW8rPXRoaXMucmVuZGVyRGF5Um93SHRtbChlLHQpO2Zvcih0aGlzLmVsLmh0bWwobyksdGhpcy5yb3dFbHM9dGhpcy5lbC5maW5kKCIuZmMtcm93IiksdGhpcy5jZWxsRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRheSIpLHRoaXMucm93Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnJvd0Vscyxpc1ZlcnRpY2FsOiEwfSksdGhpcy5jb2xDb29yZENhY2hlPW5ldyBjZSh7ZWxzOnRoaXMuY2VsbEVscy5zbGljZSgwLHRoaXMuY29sQ250KSxpc0hvcml6b250YWw6ITB9KSxlPTA7ZTxyO2UrKylmb3Iobj0wO248cztuKyspaS50cmlnZ2VyKCJkYXlSZW5kZXIiLG51bGwsdGhpcy5nZXRDZWxsRGF0ZShlLG4pLHRoaXMuZ2V0Q2VsbEVsKGUsbikpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVTZWdQb3BvdmVyKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncyghMCk7dGhpcy5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIix0LCJiZ2V2ZW50Iil9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LHJlbmRlckRheVJvd0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnZpZXcsaT1bImZjLXJvdyIsImZjLXdlZWsiLG4ud2lkZ2V0Q29udGVudENsYXNzXTtyZXR1cm4gZSYmaS5wdXNoKCJmYy1yaWdpZCIpLCc8ZGl2IGNsYXNzPSInK2kuam9pbigiICIpKyciPjxkaXYgY2xhc3M9ImZjLWJnIj48dGFibGU+Jyt0aGlzLnJlbmRlckJnVHJIdG1sKHQpKyc8L3RhYmxlPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT4nKyh0aGlzLm51bWJlcnNWaXNpYmxlPyI8dGhlYWQ+Iit0aGlzLnJlbmRlck51bWJlclRySHRtbCh0KSsiPC90aGVhZD4iOiIiKSsiPC90YWJsZT48L2Rpdj48L2Rpdj4ifSxyZW5kZXJOdW1iZXJUckh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIjx0cj4iKyh0aGlzLmlzUlRMPyIiOnRoaXMucmVuZGVyTnVtYmVySW50cm9IdG1sKHQpKSt0aGlzLnJlbmRlck51bWJlckNlbGxzSHRtbCh0KSsodGhpcy5pc1JUTD90aGlzLnJlbmRlck51bWJlckludHJvSHRtbCh0KToiIikrIjwvdHI+In0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlbmRlckludHJvSHRtbCgpfSxyZW5kZXJOdW1iZXJDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbj10aGlzLmdldENlbGxEYXRlKHQsZSksaS5wdXNoKHRoaXMucmVuZGVyTnVtYmVyQ2VsbEh0bWwobikpO3JldHVybiBpLmpvaW4oIiIpfSxyZW5kZXJOdW1iZXJDZWxsSHRtbDpmdW5jdGlvbih0KXt2YXIgZSxuLGk9IiI7cmV0dXJuIHRoaXMudmlldy5kYXlOdW1iZXJzVmlzaWJsZXx8dGhpcy52aWV3LmNlbGxXZWVrTnVtYmVyc1Zpc2libGU/KGU9dGhpcy5nZXREYXlDbGFzc2VzKHQpLGUudW5zaGlmdCgiZmMtZGF5LXRvcCIpLHRoaXMudmlldy5jZWxsV2Vla051bWJlcnNWaXNpYmxlJiYobj0iSVNPIj09PXQuX2xvY2FsZS5fZnVsbENhbGVuZGFyX3dlZWtDYWxjPzE6dC5fbG9jYWxlLmZpcnN0RGF5T2ZXZWVrKCkpLGkrPSc8dGQgY2xhc3M9IicrZS5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+Jyx0aGlzLnZpZXcuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZSYmdC5kYXkoKT09biYmKGkrPXRoaXMudmlldy5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnQsdHlwZToid2VlayJ9LHtjbGFzczoiZmMtd2Vlay1udW1iZXIifSx0LmZvcm1hdCgidyIpKSksdGhpcy52aWV3LmRheU51bWJlcnNWaXNpYmxlJiYoaSs9dGhpcy52aWV3LmJ1aWxkR290b0FuY2hvckh0bWwodCx7Y2xhc3M6ImZjLWRheS1udW1iZXIifSx0LmRhdGUoKSkpLGkrPSI8L3RkPiIpOiI8dGQvPiJ9LGNvbXB1dGVFdmVudFRpbWVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3Lm9wdCgiZXh0cmFTbWFsbFRpbWVGb3JtYXQiKX0sY29tcHV0ZURpc3BsYXlFdmVudEVuZDpmdW5jdGlvbigpe3JldHVybiAxPT10aGlzLmNvbENudH0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnNsaWNlUmFuZ2VCeVJvdyh0KTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKW49aVtlXSx0aGlzLmlzUlRMPyhuLmxlZnRDb2w9dGhpcy5kYXlzUGVyUm93LTEtbi5sYXN0Um93RGF5SW5kZXgsbi5yaWdodENvbD10aGlzLmRheXNQZXJSb3ctMS1uLmZpcnN0Um93RGF5SW5kZXgpOihuLmxlZnRDb2w9bi5maXJzdFJvd0RheUluZGV4LG4ucmlnaHRDb2w9bi5sYXN0Um93RGF5SW5kZXgpO3JldHVybiBpfSxwcmVwYXJlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5idWlsZCgpLHRoaXMucm93Q29vcmRDYWNoZS5ib3R0b21zW3RoaXMucm93Q250LTFdKz10aGlzLmJvdHRvbUNvb3JkUGFkZGluZ30scmVsZWFzZUhpdHM6ZnVuY3Rpb24oKXt0aGlzLmNvbENvb3JkQ2FjaGUuY2xlYXIoKSx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0scXVlcnlIaXQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmNvbENvb3JkQ2FjaGUuaXNMZWZ0SW5Cb3VuZHModCkmJnRoaXMucm93Q29vcmRDYWNoZS5pc1RvcEluQm91bmRzKGUpKXt2YXIgbj10aGlzLmNvbENvb3JkQ2FjaGUuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLGk9dGhpcy5yb3dDb29yZENhY2hlLmdldFZlcnRpY2FsSW5kZXgoZSk7aWYobnVsbCE9aSYmbnVsbCE9bilyZXR1cm4gdGhpcy5nZXRDZWxsSGl0KGksbil9fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxSYW5nZSh0LnJvdyx0LmNvbCl9LGdldEhpdEVsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbGxFbCh0LnJvdyx0LmNvbCl9LGdldENlbGxIaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm57cm93OnQsY29sOmUsY29tcG9uZW50OnRoaXMsbGVmdDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChlKSxyaWdodDp0aGlzLmNvbENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoZSksdG9wOnRoaXMucm93Q29vcmRDYWNoZS5nZXRUb3BPZmZzZXQodCksYm90dG9tOnRoaXMucm93Q29vcmRDYWNoZS5nZXRCb3R0b21PZmZzZXQodCl9fSxnZXRDZWxsRWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jZWxsRWxzLmVxKHQqdGhpcy5jb2xDbnQrZSl9LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxlJiZlLmNvbXBvbmVudCE9PXRoaXMpcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCksdGhpcy51bnJlbmRlckhlbHBlcigpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSx0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIaWdobGlnaHQoKSx0aGlzLnVucmVuZGVySGVscGVyKCl9LHJlbmRlckhlbHBlcjpmdW5jdGlvbihlLG4pe3ZhciBpLHI9W10scz10aGlzLmV2ZW50VG9TZWdzKGUpO3JldHVybiBzPXRoaXMucmVuZGVyRmdTZWdFbHMocyksaT10aGlzLnJlbmRlclNlZ1Jvd3MocyksdGhpcy5yb3dFbHMuZWFjaChmdW5jdGlvbihlLHMpe3ZhciBvLGw9dChzKSxhPXQoJzxkaXYgY2xhc3M9ImZjLWhlbHBlci1za2VsZXRvbiI+PHRhYmxlLz48L2Rpdj4nKTtvPW4mJm4ucm93PT09ZT9uLmVsLnBvc2l0aW9uKCkudG9wOmwuZmluZCgiLmZjLWNvbnRlbnQtc2tlbGV0b24gdGJvZHkiKS5wb3NpdGlvbigpLnRvcCxhLmNzcygidG9wIixvKS5maW5kKCJ0YWJsZSIpLmFwcGVuZChpW2VdLnRib2R5RWwpLGwuYXBwZW5kKGEpLHIucHVzaChhWzBdKX0pLHRoaXMuaGVscGVyRWxzPXQocil9LHVucmVuZGVySGVscGVyOmZ1bmN0aW9uKCl7dGhpcy5oZWxwZXJFbHMmJih0aGlzLmhlbHBlckVscy5yZW1vdmUoKSx0aGlzLmhlbHBlckVscz1udWxsKX0sZmlsbFNlZ1RhZzoidGQiLHJlbmRlckZpbGw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsPVtdO2ZvcihuPXRoaXMucmVuZGVyRmlsbFNlZ0VscyhlLG4pLHI9MDtyPG4ubGVuZ3RoO3IrKylzPW5bcl0sbz10aGlzLnJlbmRlckZpbGxSb3coZSxzLGkpLHRoaXMucm93RWxzLmVxKHMucm93KS5hcHBlbmQobyksbC5wdXNoKG9bMF0pO3JldHVybiB0aGlzLmVsc0J5RmlsbFtlXT10KGwpLG59LHJlbmRlckZpbGxSb3c6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbz10aGlzLmNvbENudCxsPW4ubGVmdENvbCxhPW4ucmlnaHRDb2wrMTtyZXR1cm4gaT1pfHxlLnRvTG93ZXJDYXNlKCkscj10KCc8ZGl2IGNsYXNzPSJmYy0nK2krJy1za2VsZXRvbiI+PHRhYmxlPjx0ci8+PC90YWJsZT48L2Rpdj4nKSxzPXIuZmluZCgidHIiKSxsPjAmJnMuYXBwZW5kKCc8dGQgY29sc3Bhbj0iJytsKyciLz4nKSxzLmFwcGVuZChuLmVsLmF0dHIoImNvbHNwYW4iLGEtbCkpLGE8byYmcy5hcHBlbmQoJzx0ZCBjb2xzcGFuPSInKyhvLWEpKyciLz4nKSx0aGlzLmJvb2tlbmRDZWxscyhzKSxyfX0pO21lLm1peGluKHtyb3dTdHJ1Y3RzOm51bGwsdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZVNlZ1BvcG92ZXIoKSxwZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnZXRFdmVudFNlZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gcGUucHJvdG90eXBlLmdldEV2ZW50U2Vncy5jYWxsKHRoaXMpLmNvbmNhdCh0aGlzLnBvcG92ZXJTZWdzfHxbXSl9LHJlbmRlckJnU2VnczpmdW5jdGlvbihlKXt2YXIgbj10LmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmVudC5hbGxEYXl9KTtyZXR1cm4gcGUucHJvdG90eXBlLnJlbmRlckJnU2Vncy5jYWxsKHRoaXMsbil9LHJlbmRlckZnU2VnczpmdW5jdGlvbihlKXt2YXIgbjtyZXR1cm4gZT10aGlzLnJlbmRlckZnU2VnRWxzKGUpLG49dGhpcy5yb3dTdHJ1Y3RzPXRoaXMucmVuZGVyU2VnUm93cyhlKSx0aGlzLnJvd0Vscy5lYWNoKGZ1bmN0aW9uKGUsaSl7dChpKS5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiA+IHRhYmxlIikuYXBwZW5kKG5bZV0udGJvZHlFbCl9KSxlfSx1bnJlbmRlckZnU2VnczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMucm93U3RydWN0c3x8W107dD1lLnBvcCgpOyl0LnRib2R5RWwucmVtb3ZlKCk7dGhpcy5yb3dTdHJ1Y3RzPW51bGx9LHJlbmRlclNlZ1Jvd3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPVtdO2ZvcihlPXRoaXMuZ3JvdXBTZWdSb3dzKHQpLG49MDtuPGUubGVuZ3RoO24rKylpLnB1c2godGhpcy5yZW5kZXJTZWdSb3cobixlW25dKSk7cmV0dXJuIGl9LGZnU2VnSHRtbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscj10aGlzLnZpZXcscz10LmV2ZW50LG89ci5pc0V2ZW50RHJhZ2dhYmxlKHMpLGw9IWUmJnMuYWxsRGF5JiZ0LmlzU3RhcnQmJnIuaXNFdmVudFJlc2l6YWJsZUZyb21TdGFydChzKSxhPSFlJiZzLmFsbERheSYmdC5pc0VuZCYmci5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChzKSx1PXRoaXMuZ2V0U2VnQ2xhc3Nlcyh0LG8sbHx8YSksZD1udCh0aGlzLmdldFNlZ1NraW5Dc3ModCkpLGM9IiI7cmV0dXJuIHUudW5zaGlmdCgiZmMtZGF5LWdyaWQtZXZlbnQiLCJmYy1oLWV2ZW50IiksdC5pc1N0YXJ0JiYobj10aGlzLmdldEV2ZW50VGltZVRleHQocyksbiYmKGM9JzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nK3R0KG4pKyI8L3NwYW4+IikpLGk9JzxzcGFuIGNsYXNzPSJmYy10aXRsZSI+JysodHQocy50aXRsZXx8IiIpfHwiJm5ic3A7IikrIjwvc3Bhbj4iLCc8YSBjbGFzcz0iJyt1LmpvaW4oIiAiKSsnIicrKHMudXJsPycgaHJlZj0iJyt0dChzLnVybCkrJyInOiIiKSsoZD8nIHN0eWxlPSInK2QrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKHRoaXMuaXNSVEw/aSsiICIrYzpjKyIgIitpKSsiPC9kaXY+IisobD8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIiAvPic6IiIpKyhhPyc8ZGl2IGNsYXNzPSJmYy1yZXNpemVyIGZjLWVuZC1yZXNpemVyIiAvPic6IiIpKyI8L2E+In0scmVuZGVyU2VnUm93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShlKXtmb3IoO288ZTspZD0obVtyLTFdfHxbXSlbb10sZD9kLmF0dHIoInJvd3NwYW4iLHBhcnNlSW50KGQuYXR0cigicm93c3BhbiIpfHwxLDEwKSsxKTooZD10KCI8dGQvPiIpLGwuYXBwZW5kKGQpKSx2W3JdW29dPWQsbVtyXVtvXT1kLG8rK312YXIgcixzLG8sbCxhLHUsZCxjPXRoaXMuY29sQ250LGg9dGhpcy5idWlsZFNlZ0xldmVscyhuKSxmPU1hdGgubWF4KDEsaC5sZW5ndGgpLGc9dCgiPHRib2R5Lz4iKSxwPVtdLHY9W10sbT1bXTtmb3Iocj0wO3I8ZjtyKyspe2lmKHM9aFtyXSxvPTAsbD10KCI8dHIvPiIpLHAucHVzaChbXSksdi5wdXNoKFtdKSxtLnB1c2goW10pLHMpZm9yKGE9MDthPHMubGVuZ3RoO2ErKyl7Zm9yKHU9c1thXSxpKHUubGVmdENvbCksZD10KCc8dGQgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZCh1LmVsKSx1LmxlZnRDb2whPXUucmlnaHRDb2w/ZC5hdHRyKCJjb2xzcGFuIix1LnJpZ2h0Q29sLXUubGVmdENvbCsxKTptW3JdW29dPWQ7bzw9dS5yaWdodENvbDspdltyXVtvXT1kLHBbcl1bb109dSxvKys7bC5hcHBlbmQoZCl9aShjKSx0aGlzLmJvb2tlbmRDZWxscyhsKSxnLmFwcGVuZChsKX1yZXR1cm57cm93OmUsdGJvZHlFbDpnLGNlbGxNYXRyaXg6dixzZWdNYXRyaXg6cCxzZWdMZXZlbHM6aCxzZWdzOm59fSxidWlsZFNlZ0xldmVsczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscj1bXTtmb3IodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9MDtlPHQubGVuZ3RoO2UrKyl7Zm9yKG49dFtlXSxpPTA7aTxyLmxlbmd0aCYmTHQobixyW2ldKTtpKyspO24ubGV2ZWw9aSwocltpXXx8KHJbaV09W10pKS5wdXNoKG4pfWZvcihpPTA7aTxyLmxlbmd0aDtpKyspcltpXS5zb3J0KEJ0KTtyZXR1cm4gcn0sZ3JvdXBTZWdSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG49W107Zm9yKGU9MDtlPHRoaXMucm93Q250O2UrKyluLnB1c2goW10pO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspblt0W2VdLnJvd10ucHVzaCh0W2VdKTtyZXR1cm4gbn19KSxtZS5taXhpbih7c2VnUG9wb3ZlcjpudWxsLHBvcG92ZXJTZWdzOm51bGwscmVtb3ZlU2VnUG9wb3ZlcjpmdW5jdGlvbigpe3RoaXMuc2VnUG9wb3ZlciYmdGhpcy5zZWdQb3BvdmVyLmhpZGUoKX0sbGltaXRSb3dzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT10aGlzLnJvd1N0cnVjdHN8fFtdO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspdGhpcy51bmxpbWl0Um93KGUpLG49ISF0JiYoIm51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5jb21wdXRlUm93TGV2ZWxMaW1pdChlKSksbiE9PSExJiZ0aGlzLmxpbWl0Um93KGUsbil9LGNvbXB1dGVSb3dMZXZlbExpbWl0OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oZSxuKXtzPU1hdGgubWF4KHMsdChuKS5vdXRlckhlaWdodCgpKX12YXIgaSxyLHMsbz10aGlzLnJvd0Vscy5lcShlKSxsPW8uaGVpZ2h0KCksYT10aGlzLnJvd1N0cnVjdHNbZV0udGJvZHlFbC5jaGlsZHJlbigpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspaWYocj1hLmVxKGkpLnJlbW92ZUNsYXNzKCJmYy1saW1pdGVkIikscz0wLHIuZmluZCgiPiB0ZCA+IDpmaXJzdC1jaGlsZCIpLmVhY2gobiksci5wb3NpdGlvbigpLnRvcCtzPmwpcmV0dXJuIGk7cmV0dXJuITF9LGxpbWl0Um93OmZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaShpKXtmb3IoO0Q8aTspdT1TLmdldENlbGxTZWdzKGUsRCxuKSx1Lmxlbmd0aCYmKGg9c1tuLTFdW0RdLHk9Uy5yZW5kZXJNb3JlTGluayhlLEQsdSksbT10KCI8ZGl2Lz4iKS5hcHBlbmQoeSksaC5hcHBlbmQobSksRS5wdXNoKG1bMF0pKSxEKyt9dmFyIHIscyxvLGwsYSx1LGQsYyxoLGYsZyxwLHYsbSx5LFM9dGhpcyx3PXRoaXMucm93U3RydWN0c1tlXSxFPVtdLEQ9MDtpZihuJiZuPHcuc2VnTGV2ZWxzLmxlbmd0aCl7Zm9yKHI9dy5zZWdMZXZlbHNbbi0xXSxzPXcuY2VsbE1hdHJpeCxvPXcudGJvZHlFbC5jaGlsZHJlbigpLnNsaWNlKG4pLmFkZENsYXNzKCJmYy1saW1pdGVkIikuZ2V0KCksbD0wO2w8ci5sZW5ndGg7bCsrKXtmb3IoYT1yW2xdLGkoYS5sZWZ0Q29sKSxjPVtdLGQ9MDtEPD1hLnJpZ2h0Q29sOyl1PXRoaXMuZ2V0Q2VsbFNlZ3MoZSxELG4pLGMucHVzaCh1KSxkKz11Lmxlbmd0aCxEKys7aWYoZCl7Zm9yKGg9c1tuLTFdW2EubGVmdENvbF0sZj1oLmF0dHIoInJvd3NwYW4iKXx8MSxnPVtdLHA9MDtwPGMubGVuZ3RoO3ArKyl2PXQoJzx0ZCBjbGFzcz0iZmMtbW9yZS1jZWxsIi8+JykuYXR0cigicm93c3BhbiIsZiksdT1jW3BdLHk9dGhpcy5yZW5kZXJNb3JlTGluayhlLGEubGVmdENvbCtwLFthXS5jb25jYXQodSkpLG09dCgiPGRpdi8+IikuYXBwZW5kKHkpLHYuYXBwZW5kKG0pLGcucHVzaCh2WzBdKSxFLnB1c2godlswXSk7aC5hZGRDbGFzcygiZmMtbGltaXRlZCIpLmFmdGVyKHQoZykpLG8ucHVzaChoWzBdKX19aSh0aGlzLmNvbENudCksdy5tb3JlRWxzPXQoRSksdy5saW1pdGVkRWxzPXQobyl9fSx1bmxpbWl0Um93OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucm93U3RydWN0c1t0XTtlLm1vcmVFbHMmJihlLm1vcmVFbHMucmVtb3ZlKCksZS5tb3JlRWxzPW51bGwpLGUubGltaXRlZEVscyYmKGUubGltaXRlZEVscy5yZW1vdmVDbGFzcygiZmMtbGltaXRlZCIpLGUubGltaXRlZEVscz1udWxsKX0scmVuZGVyTW9yZUxpbms6ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXMscz10aGlzLnZpZXc7cmV0dXJuIHQoJzxhIGNsYXNzPSJmYy1tb3JlIi8+JykudGV4dCh0aGlzLmdldE1vcmVMaW5rVGV4dChpLmxlbmd0aCkpLm9uKCJjbGljayIsZnVuY3Rpb24obyl7dmFyIGw9cy5vcHQoImV2ZW50TGltaXRDbGljayIpLGE9ci5nZXRDZWxsRGF0ZShlLG4pLHU9dCh0aGlzKSxkPXIuZ2V0Q2VsbEVsKGUsbiksYz1yLmdldENlbGxTZWdzKGUsbiksaD1yLnJlc2xpY2VEYXlTZWdzKGMsYSksZj1yLnJlc2xpY2VEYXlTZWdzKGksYSk7ImZ1bmN0aW9uIj09dHlwZW9mIGwmJihsPXMudHJpZ2dlcigiZXZlbnRMaW1pdENsaWNrIixudWxsLHtkYXRlOmEsZGF5RWw6ZCxtb3JlRWw6dSxzZWdzOmgsaGlkZGVuU2VnczpmfSxvKSksInBvcG92ZXIiPT09bD9yLnNob3dTZWdQb3BvdmVyKGUsbix1LGgpOiJzdHJpbmciPT10eXBlb2YgbCYmcy5jYWxlbmRhci56b29tVG8oYSxsKX0pfSxzaG93U2VnUG9wb3ZlcjpmdW5jdGlvbih0LGUsbixpKXt2YXIgcixzLG89dGhpcyxsPXRoaXMudmlldyxhPW4ucGFyZW50KCk7cj0xPT10aGlzLnJvd0NudD9sLmVsOnRoaXMucm93RWxzLmVxKHQpLHM9e2NsYXNzTmFtZToiZmMtbW9yZS1wb3BvdmVyIixjb250ZW50OnRoaXMucmVuZGVyU2VnUG9wb3ZlckNvbnRlbnQodCxlLGkpLHBhcmVudEVsOnRoaXMudmlldy5lbCx0b3A6ci5vZmZzZXQoKS50b3AsYXV0b0hpZGU6ITAsdmlld3BvcnRDb25zdHJhaW46bC5vcHQoInBvcG92ZXJWaWV3cG9ydENvbnN0cmFpbiIpLGhpZGU6ZnVuY3Rpb24oKXtvLnNlZ1BvcG92ZXIucmVtb3ZlRWxlbWVudCgpLG8uc2VnUG9wb3Zlcj1udWxsLG8ucG9wb3ZlclNlZ3M9bnVsbH19LHRoaXMuaXNSVEw/cy5yaWdodD1hLm9mZnNldCgpLmxlZnQrYS5vdXRlcldpZHRoKCkrMTpzLmxlZnQ9YS5vZmZzZXQoKS5sZWZ0LTEsdGhpcy5zZWdQb3BvdmVyPW5ldyBkZShzKSx0aGlzLnNlZ1BvcG92ZXIuc2hvdygpLHRoaXMuYmluZFNlZ0hhbmRsZXJzVG9FbCh0aGlzLnNlZ1BvcG92ZXIuZWwpfSxyZW5kZXJTZWdQb3BvdmVyQ29udGVudDpmdW5jdGlvbihlLG4saSl7dmFyIHIscz10aGlzLnZpZXcsbz1zLm9wdCgidGhlbWUiKSxsPXRoaXMuZ2V0Q2VsbERhdGUoZSxuKS5mb3JtYXQocy5vcHQoImRheVBvcG92ZXJGb3JtYXQiKSksYT10KCc8ZGl2IGNsYXNzPSJmYy1oZWFkZXIgJytzLndpZGdldEhlYWRlckNsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1jbG9zZSAnKyhvPyJ1aS1pY29uIHVpLWljb24tY2xvc2V0aGljayI6ImZjLWljb24gZmMtaWNvbi14IikrJyI+PC9zcGFuPjxzcGFuIGNsYXNzPSJmYy10aXRsZSI+Jyt0dChsKSsnPC9zcGFuPjxkaXYgY2xhc3M9ImZjLWNsZWFyIi8+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYm9keSAnK3Mud2lkZ2V0Q29udGVudENsYXNzKyciPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciI+PC9kaXY+PC9kaXY+JyksdT1hLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKTtmb3IoaT10aGlzLnJlbmRlckZnU2VnRWxzKGksITApLHRoaXMucG9wb3ZlclNlZ3M9aSxyPTA7cjxpLmxlbmd0aDtyKyspdGhpcy5wcmVwYXJlSGl0cygpLGlbcl0uaGl0PXRoaXMuZ2V0Q2VsbEhpdChlLG4pLHRoaXMucmVsZWFzZUhpdHMoKSx1LmFwcGVuZChpW3JdLmVsKTtyZXR1cm4gYX0scmVzbGljZURheVNlZ3M6ZnVuY3Rpb24oZSxuKXt2YXIgaT10Lm1hcChlLGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZW50fSkscj1uLmNsb25lKCkscz1yLmNsb25lKCkuYWRkKDEsImRheXMiKSxvPXtzdGFydDpyLGVuZDpzfTtyZXR1cm4gZT10aGlzLmV2ZW50c1RvU2VncyhpLGZ1bmN0aW9uKHQpe3ZhciBlPUYodCxvKTtyZXR1cm4gZT9bZV06W119KSx0aGlzLnNvcnRFdmVudFNlZ3MoZSksZX0sZ2V0TW9yZUxpbmtUZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldy5vcHQoImV2ZW50TGltaXRUZXh0Iik7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh0KToiKyIrdCsiICIrZX0sZ2V0Q2VsbFNlZ3M6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyPXRoaXMucm93U3RydWN0c1t0XS5zZWdNYXRyaXgscz1ufHwwLG89W107czxyLmxlbmd0aDspaT1yW3NdW2VdLGkmJm8ucHVzaChpKSxzKys7cmV0dXJuIG99fSk7dmFyIHllPWp0LlRpbWVHcmlkPXBlLmV4dGVuZCh2ZSx7c2xvdER1cmF0aW9uOm51bGwsc25hcER1cmF0aW9uOm51bGwsc25hcHNQZXJTbG90Om51bGwsbWluVGltZTpudWxsLG1heFRpbWU6bnVsbCxsYWJlbEZvcm1hdDpudWxsLGxhYmVsSW50ZXJ2YWw6bnVsbCxjb2xFbHM6bnVsbCxzbGF0Q29udGFpbmVyRWw6bnVsbCxzbGF0RWxzOm51bGwsbm93SW5kaWNhdG9yRWxzOm51bGwsY29sQ29vcmRDYWNoZTpudWxsLHNsYXRDb29yZENhY2hlOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24oKXtwZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzT3B0aW9ucygpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuaHRtbCh0aGlzLnJlbmRlckh0bWwoKSksdGhpcy5jb2xFbHM9dGhpcy5lbC5maW5kKCIuZmMtZGF5IiksdGhpcy5zbGF0Q29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtc2xhdHMiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidHIiKSx0aGlzLmNvbENvb3JkQ2FjaGU9bmV3IGNlKHtlbHM6dGhpcy5jb2xFbHMsaXNIb3Jpem9udGFsOiEwfSksdGhpcy5zbGF0Q29vcmRDYWNoZT1uZXcgY2Uoe2Vsczp0aGlzLnNsYXRFbHMsaXNWZXJ0aWNhbDohMH0pLHRoaXMucmVuZGVyQ29udGVudFNrZWxldG9uKCl9LHJlbmRlckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPGRpdiBjbGFzcz0iZmMtYmciPjx0YWJsZT4nK3RoaXMucmVuZGVyQmdUckh0bWwoMCkrJzwvdGFibGU+PC9kaXY+PGRpdiBjbGFzcz0iZmMtc2xhdHMiPjx0YWJsZT4nK3RoaXMucmVuZGVyU2xhdFJvd0h0bWwoKSsiPC90YWJsZT48L2Rpdj4ifSxyZW5kZXJTbGF0Um93SHRtbDpmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGkscj10aGlzLnZpZXcscz10aGlzLmlzUlRMLG89IiIsbD1lLmR1cmF0aW9uKCt0aGlzLm1pblRpbWUpO2w8dGhpcy5tYXhUaW1lOyl0PXRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKGwpLG49b3QoXyhsLHRoaXMubGFiZWxJbnRlcnZhbCkpLGk9Jzx0ZCBjbGFzcz0iZmMtYXhpcyBmYy10aW1lICcrci53aWRnZXRDb250ZW50Q2xhc3MrJyIgJytyLmF4aXNTdHlsZUF0dHIoKSsiPiIrKG4/IjxzcGFuPiIrdHQodC5mb3JtYXQodGhpcy5sYWJlbEZvcm1hdCkpKyI8L3NwYW4+IjoiIikrIjwvdGQ+IixvKz0nPHRyIGRhdGEtdGltZT0iJyt0LmZvcm1hdCgiSEg6bW06c3MiKSsnIicrKG4/IiI6JyBjbGFzcz0iZmMtbWlub3IiJykrIj4iKyhzPyIiOmkpKyc8dGQgY2xhc3M9Iicrci53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicrKHM/aToiIikrIjwvdHI+IixsLmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIG99LHByb2Nlc3NPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIG4saT10aGlzLnZpZXcscj1pLm9wdCgic2xvdER1cmF0aW9uIikscz1pLm9wdCgic25hcER1cmF0aW9uIik7cj1lLmR1cmF0aW9uKHIpLHM9cz9lLmR1cmF0aW9uKHMpOnIsdGhpcy5zbG90RHVyYXRpb249cix0aGlzLnNuYXBEdXJhdGlvbj1zLHRoaXMuc25hcHNQZXJTbG90PXIvcyx0aGlzLm1pblJlc2l6ZUR1cmF0aW9uPXMsdGhpcy5taW5UaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1pblRpbWUiKSksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24oaS5vcHQoIm1heFRpbWUiKSksbj1pLm9wdCgic2xvdExhYmVsRm9ybWF0IiksdC5pc0FycmF5KG4pJiYobj1uW24ubGVuZ3RoLTFdKSx0aGlzLmxhYmVsRm9ybWF0PW58fGkub3B0KCJzbWFsbFRpbWVGb3JtYXQiKSxuPWkub3B0KCJzbG90TGFiZWxJbnRlcnZhbCIpLHRoaXMubGFiZWxJbnRlcnZhbD1uP2UuZHVyYXRpb24obik6dGhpcy5jb21wdXRlTGFiZWxJbnRlcnZhbChyKX0sY29tcHV0ZUxhYmVsSW50ZXJ2YWw6ZnVuY3Rpb24odCl7dmFyIG4saSxyO2ZvcihuPU5lLmxlbmd0aC0xO24+PTA7bi0tKWlmKGk9ZS5kdXJhdGlvbihOZVtuXSkscj1fKGksdCksb3QocikmJnI+MSlyZXR1cm4gaTtyZXR1cm4gZS5kdXJhdGlvbih0KX0sY29tcHV0ZUV2ZW50VGltZUZvcm1hdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcub3B0KCJub01lcmlkaWVtVGltZUZvcm1hdCIpfSxjb21wdXRlRGlzcGxheUV2ZW50RW5kOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5jb2xDb29yZENhY2hlLmJ1aWxkKCksdGhpcy5zbGF0Q29vcmRDYWNoZS5idWlsZCgpfSxyZWxlYXNlSGl0czpmdW5jdGlvbigpe3RoaXMuY29sQ29vcmRDYWNoZS5jbGVhcigpfSxxdWVyeUhpdDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc25hcHNQZXJTbG90LGk9dGhpcy5jb2xDb29yZENhY2hlLHI9dGhpcy5zbGF0Q29vcmRDYWNoZTtpZihpLmlzTGVmdEluQm91bmRzKHQpJiZyLmlzVG9wSW5Cb3VuZHMoZSkpe3ZhciBzPWkuZ2V0SG9yaXpvbnRhbEluZGV4KHQpLG89ci5nZXRWZXJ0aWNhbEluZGV4KGUpO2lmKG51bGwhPXMmJm51bGwhPW8pe3ZhciBsPXIuZ2V0VG9wT2Zmc2V0KG8pLGE9ci5nZXRIZWlnaHQobyksdT0oZS1sKS9hLGQ9TWF0aC5mbG9vcih1Km4pLGM9bypuK2QsaD1sK2QvbiphLGY9bCsoZCsxKS9uKmE7cmV0dXJue2NvbDpzLHNuYXA6Yyxjb21wb25lbnQ6dGhpcyxsZWZ0OmkuZ2V0TGVmdE9mZnNldChzKSxyaWdodDppLmdldFJpZ2h0T2Zmc2V0KHMpLHRvcDpoLGJvdHRvbTpmfX19fSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5nZXRDZWxsRGF0ZSgwLHQuY29sKSxpPXRoaXMuY29tcHV0ZVNuYXBUaW1lKHQuc25hcCk7cmV0dXJuIG4udGltZShpKSxlPW4uY2xvbmUoKS5hZGQodGhpcy5zbmFwRHVyYXRpb24pLHtzdGFydDpuLGVuZDplfX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sRWxzLmVxKHQuY29sKX0scmFuZ2VVcGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVEYXlUYWJsZSgpfSxjb21wdXRlU25hcFRpbWU6ZnVuY3Rpb24odCl7cmV0dXJuIGUuZHVyYXRpb24odGhpcy5taW5UaW1lK3RoaXMuc25hcER1cmF0aW9uKnQpfSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5zbGljZVJhbmdlQnlUaW1lcyh0KTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKXRoaXMuaXNSVEw/bltlXS5jb2w9dGhpcy5kYXlzUGVyUm93LTEtbltlXS5kYXlJbmRleDpuW2VdLmNvbD1uW2VdLmRheUluZGV4O3JldHVybiBufSxzbGljZVJhbmdlQnlUaW1lczpmdW5jdGlvbih0KXt2YXIgZSxuLGkscixzPVtdO2ZvcihuPTA7bjx0aGlzLmRheXNQZXJSb3c7bisrKWk9dGhpcy5kYXlEYXRlc1tuXS5jbG9uZSgpLHI9e3N0YXJ0OmkuY2xvbmUoKS50aW1lKHRoaXMubWluVGltZSksZW5kOmkuY2xvbmUoKS50aW1lKHRoaXMubWF4VGltZSl9LGU9Rih0LHIpLGUmJihlLmRheUluZGV4PW4scy5wdXNoKGUpKTtyZXR1cm4gc30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt0aGlzLnNsYXRDb29yZENhY2hlLmJ1aWxkKCksdCYmdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHMoW10uY29uY2F0KHRoaXMuZmdTZWdzfHxbXSx0aGlzLmJnU2Vnc3x8W10sdGhpcy5idXNpbmVzc1NlZ3N8fFtdKSl9LGdldFRvdGFsU2xhdEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsYXRDb250YWluZXJFbC5vdXRlckhlaWdodCgpfSxjb21wdXRlRGF0ZVRvcDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGUuZHVyYXRpb24odC1uLmNsb25lKCkuc3RyaXBUaW1lKCkpKX0sY29tcHV0ZVRpbWVUb3A6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMuc2xhdEVscy5sZW5ndGgscj0odC10aGlzLm1pblRpbWUpL3RoaXMuc2xvdER1cmF0aW9uO3JldHVybiByPU1hdGgubWF4KDAscikscj1NYXRoLm1pbihpLHIpLGU9TWF0aC5mbG9vcihyKSxlPU1hdGgubWluKGUsaS0xKSxuPXItZSx0aGlzLnNsYXRDb29yZENhY2hlLmdldFRvcFBvc2l0aW9uKGUpK3RoaXMuc2xhdENvb3JkQ2FjaGUuZ2V0SGVpZ2h0KGUpKm59LHJlbmRlckRyYWc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKTp2b2lkIHRoaXMucmVuZGVySGlnaGxpZ2h0KHRoaXMuZXZlbnRUb1NwYW4odCkpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGVscGVyKCksdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpfSxyZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbmRlckV2ZW50TG9jYXRpb25IZWxwZXIodCxlKX0sdW5yZW5kZXJFdmVudFJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKX0scmVuZGVySGVscGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGVscGVyU2Vncyh0aGlzLmV2ZW50VG9TZWdzKHQpLGUpfSx1bnJlbmRlckhlbHBlcjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXJTZWdzKCl9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlckJ1c2luZXNzU2Vncyh0aGlzLmJ1aWxkQnVzaW5lc3NIb3VyU2VncygpKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy51bnJlbmRlckJ1c2luZXNzU2VncygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIm1pbnV0ZSJ9LHJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbihlKXt2YXIgbixpPXRoaXMuc3BhblRvU2Vncyh7c3RhcnQ6ZSxlbmQ6ZX0pLHI9dGhpcy5jb21wdXRlRGF0ZVRvcChlLGUpLHM9W107Zm9yKG49MDtuPGkubGVuZ3RoO24rKylzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWxpbmUiPjwvZGl2PicpLmNzcygidG9wIixyKS5hcHBlbmRUbyh0aGlzLmNvbENvbnRhaW5lckVscy5lcShpW25dLmNvbCkpWzBdKTtpLmxlbmd0aD4wJiZzLnB1c2godCgnPGRpdiBjbGFzcz0iZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Ij48L2Rpdj4nKS5jc3MoInRvcCIscikuYXBwZW5kVG8odGhpcy5lbC5maW5kKCIuZmMtY29udGVudC1za2VsZXRvbiIpKVswXSksdGhpcy5ub3dJbmRpY2F0b3JFbHM9dChzKX0sdW5yZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLm5vd0luZGljYXRvckVscyYmKHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGwpfSxyZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24odCl7dGhpcy52aWV3Lm9wdCgic2VsZWN0SGVscGVyIik/dGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQpOnRoaXMucmVuZGVySGlnaGxpZ2h0KHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LHJlbmRlckhpZ2hsaWdodDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlckhpZ2hsaWdodFNlZ3ModGhpcy5zcGFuVG9TZWdzKHQpKX0sdW5yZW5kZXJIaWdobGlnaHQ6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVySGlnaGxpZ2h0U2VncygpfX0pO3llLm1peGluKHtjb2xDb250YWluZXJFbHM6bnVsbCxmZ0NvbnRhaW5lckVsczpudWxsLGJnQ29udGFpbmVyRWxzOm51bGwsaGVscGVyQ29udGFpbmVyRWxzOm51bGwsaGlnaGxpZ2h0Q29udGFpbmVyRWxzOm51bGwsYnVzaW5lc3NDb250YWluZXJFbHM6bnVsbCxmZ1NlZ3M6bnVsbCxiZ1NlZ3M6bnVsbCxoZWxwZXJTZWdzOm51bGwsaGlnaGxpZ2h0U2VnczpudWxsLGJ1c2luZXNzU2VnczpudWxsLHJlbmRlckNvbnRlbnRTa2VsZXRvbjpmdW5jdGlvbigpe3ZhciBlLG4saT0iIjtmb3IoZT0wO2U8dGhpcy5jb2xDbnQ7ZSsrKWkrPSc8dGQ+PGRpdiBjbGFzcz0iZmMtY29udGVudC1jb2wiPjxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWhpZ2hsaWdodC1jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9ImZjLWJnZXZlbnQtY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJmYy1idXNpbmVzcy1jb250YWluZXIiPjwvZGl2PjwvZGl2PjwvdGQ+JztuPXQoJzxkaXYgY2xhc3M9ImZjLWNvbnRlbnQtc2tlbGV0b24iPjx0YWJsZT48dHI+JytpKyI8L3RyPjwvdGFibGU+PC9kaXY+IiksdGhpcy5jb2xDb250YWluZXJFbHM9bi5maW5kKCIuZmMtY29udGVudC1jb2wiKSx0aGlzLmhlbHBlckNvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oZWxwZXItY29udGFpbmVyIiksdGhpcy5mZ0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1ldmVudC1jb250YWluZXI6bm90KC5mYy1oZWxwZXItY29udGFpbmVyKSIpLHRoaXMuYmdDb250YWluZXJFbHM9bi5maW5kKCIuZmMtYmdldmVudC1jb250YWluZXIiKSx0aGlzLmhpZ2hsaWdodENvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1oaWdobGlnaHQtY29udGFpbmVyIiksdGhpcy5idXNpbmVzc0NvbnRhaW5lckVscz1uLmZpbmQoIi5mYy1idXNpbmVzcy1jb250YWluZXIiKSx0aGlzLmJvb2tlbmRDZWxscyhuLmZpbmQoInRyIikpLHRoaXMuZWwuYXBwZW5kKG4pfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ3NJbnRvQ29udGFpbmVycyh0LHRoaXMuZmdDb250YWluZXJFbHMpLHRoaXMuZmdTZWdzPXQsdH0sdW5yZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJmZ1NlZ3MiKX0scmVuZGVySGVscGVyU2VnczpmdW5jdGlvbihlLG4pe3ZhciBpLHIscyxvPVtdO2ZvcihlPXRoaXMucmVuZGVyRmdTZWdzSW50b0NvbnRhaW5lcnMoZSx0aGlzLmhlbHBlckNvbnRhaW5lckVscyksaT0wO2k8ZS5sZW5ndGg7aSsrKXI9ZVtpXSxuJiZuLmNvbD09PXIuY29sJiYocz1uLmVsLHIuZWwuY3NzKHtsZWZ0OnMuY3NzKCJsZWZ0IikscmlnaHQ6cy5jc3MoInJpZ2h0IiksIm1hcmdpbi1sZWZ0IjpzLmNzcygibWFyZ2luLWxlZnQiKSwibWFyZ2luLXJpZ2h0IjpzLmNzcygibWFyZ2luLXJpZ2h0Iil9KSksby5wdXNoKHIuZWxbMF0pO3JldHVybiB0aGlzLmhlbHBlclNlZ3M9ZSx0KG8pfSx1bnJlbmRlckhlbHBlclNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoZWxwZXJTZWdzIil9LHJlbmRlckJnU2VnczpmdW5jdGlvbih0KXtyZXR1cm4gdD10aGlzLnJlbmRlckZpbGxTZWdFbHMoImJnRXZlbnQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5iZ0NvbnRhaW5lckVscyksdGhpcy5iZ1NlZ3M9dCx0fSx1bnJlbmRlckJnU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJnU2VncyIpfSxyZW5kZXJIaWdobGlnaHRTZWdzOmZ1bmN0aW9uKHQpe3Q9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJoaWdobGlnaHQiLHQpLHRoaXMudXBkYXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXR0YWNoU2Vnc0J5Q29sKHRoaXMuZ3JvdXBTZWdzQnlDb2wodCksdGhpcy5oaWdobGlnaHRDb250YWluZXJFbHMpLHRoaXMuaGlnaGxpZ2h0U2Vncz10fSx1bnJlbmRlckhpZ2hsaWdodFNlZ3M6ZnVuY3Rpb24oKXt0aGlzLnVucmVuZGVyTmFtZWRTZWdzKCJoaWdobGlnaHRTZWdzIil9LHJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbih0KXt0PXRoaXMucmVuZGVyRmlsbFNlZ0VscygiYnVzaW5lc3NIb3VycyIsdCksdGhpcy51cGRhdGVTZWdWZXJ0aWNhbHModCksdGhpcy5hdHRhY2hTZWdzQnlDb2wodGhpcy5ncm91cFNlZ3NCeUNvbCh0KSx0aGlzLmJ1c2luZXNzQ29udGFpbmVyRWxzKSx0aGlzLmJ1c2luZXNzU2Vncz10fSx1bnJlbmRlckJ1c2luZXNzU2VnczpmdW5jdGlvbigpe3RoaXMudW5yZW5kZXJOYW1lZFNlZ3MoImJ1c2luZXNzU2VncyIpfSxncm91cFNlZ3NCeUNvbDpmdW5jdGlvbih0KXt2YXIgZSxuPVtdO2ZvcihlPTA7ZTx0aGlzLmNvbENudDtlKyspbi5wdXNoKFtdKTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW5bdFtlXS5jb2xdLnB1c2godFtlXSk7cmV0dXJuIG59LGF0dGFjaFNlZ3NCeUNvbDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscjtmb3Iobj0wO248dGhpcy5jb2xDbnQ7bisrKWZvcihpPXRbbl0scj0wO3I8aS5sZW5ndGg7cisrKWUuZXEobikuYXBwZW5kKGlbcl0uZWwpfSx1bnJlbmRlck5hbWVkU2VnczpmdW5jdGlvbih0KXt2YXIgZSxuPXRoaXNbdF07aWYobil7Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdLmVsLnJlbW92ZSgpO3RoaXNbdF09bnVsbH19LHJlbmRlckZnU2Vnc0ludG9Db250YWluZXJzOmZ1bmN0aW9uKHQsZSl7dmFyIG4saTtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy5ncm91cFNlZ3NCeUNvbCh0KSxpPTA7aTx0aGlzLmNvbENudDtpKyspdGhpcy51cGRhdGVGZ1NlZ0Nvb3JkcyhuW2ldKTtyZXR1cm4gdGhpcy5hdHRhY2hTZWdzQnlDb2wobixlKSx0fSxmZ1NlZ0h0bWw6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIscz10aGlzLnZpZXcsbz10LmV2ZW50LGw9cy5pc0V2ZW50RHJhZ2dhYmxlKG8pLGE9IWUmJnQuaXNTdGFydCYmcy5pc0V2ZW50UmVzaXphYmxlRnJvbVN0YXJ0KG8pLHU9IWUmJnQuaXNFbmQmJnMuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobyksZD10aGlzLmdldFNlZ0NsYXNzZXModCxsLGF8fHUpLGM9bnQodGhpcy5nZXRTZWdTa2luQ3NzKHQpKTtyZXR1cm4gZC51bnNoaWZ0KCJmYy10aW1lLWdyaWQtZXZlbnQiLCJmYy12LWV2ZW50Iikscy5pc011bHRpRGF5RXZlbnQobyk/KHQuaXNTdGFydHx8dC5pc0VuZCkmJihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0KSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dCh0LCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KHQsbnVsbCwhMSkpOihuPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvKSxpPXRoaXMuZ2V0RXZlbnRUaW1lVGV4dChvLCJMVCIpLHI9dGhpcy5nZXRFdmVudFRpbWVUZXh0KG8sbnVsbCwhMSkpLCc8YSBjbGFzcz0iJytkLmpvaW4oIiAiKSsnIicrKG8udXJsPycgaHJlZj0iJyt0dChvLnVybCkrJyInOiIiKSsoYz8nIHN0eWxlPSInK2MrJyInOiIiKSsnPjxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPicrKG4/JzxkaXYgY2xhc3M9ImZjLXRpbWUiIGRhdGEtc3RhcnQ9IicrdHQocikrJyIgZGF0YS1mdWxsPSInK3R0KGkpKyciPjxzcGFuPicrdHQobikrIjwvc3Bhbj48L2Rpdj4iOiIiKSsoby50aXRsZT8nPGRpdiBjbGFzcz0iZmMtdGl0bGUiPicrdHQoby50aXRsZSkrIjwvZGl2PiI6IiIpKyc8L2Rpdj48ZGl2IGNsYXNzPSJmYy1iZyIvPicrKHU/JzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtZW5kLXJlc2l6ZXIiIC8+JzoiIikrIjwvYT4ifSx1cGRhdGVTZWdWZXJ0aWNhbHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuYXNzaWduU2VnVmVydGljYWxzKHQpfSxjb21wdXRlU2VnVmVydGljYWxzOmZ1bmN0aW9uKHQpe3ZhciBlLG47Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sbi50b3A9dGhpcy5jb21wdXRlRGF0ZVRvcChuLnN0YXJ0LG4uc3RhcnQpLG4uYm90dG9tPXRoaXMuY29tcHV0ZURhdGVUb3Aobi5lbmQsbi5zdGFydCl9LGFzc2lnblNlZ1ZlcnRpY2FsczpmdW5jdGlvbih0KXt2YXIgZSxuO2ZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspbj10W2VdLG4uZWwuY3NzKHRoaXMuZ2VuZXJhdGVTZWdWZXJ0aWNhbENzcyhuKSl9LGdlbmVyYXRlU2VnVmVydGljYWxDc3M6ZnVuY3Rpb24odCl7cmV0dXJue3RvcDp0LnRvcCxib3R0b206LXQuYm90dG9tfX0sdXBkYXRlRmdTZWdDb29yZHM6ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlU2VnVmVydGljYWxzKHQpLHRoaXMuY29tcHV0ZUZnU2VnSG9yaXpvbnRhbHModCksdGhpcy5hc3NpZ25TZWdWZXJ0aWNhbHModCksdGhpcy5hc3NpZ25GZ1NlZ0hvcml6b250YWxzKHQpfSxjb21wdXRlRmdTZWdIb3Jpem9udGFsczpmdW5jdGlvbih0KXt2YXIgZSxuLGk7aWYodGhpcy5zb3J0RXZlbnRTZWdzKHQpLGU9enQodCksRnQoZSksbj1lWzBdKXtmb3IoaT0wO2k8bi5sZW5ndGg7aSsrKU50KG5baV0pO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhuW2ldLDAsMCl9fSxjb21wdXRlRmdTZWdGb3J3YXJkQmFjazpmdW5jdGlvbih0LGUsbil7dmFyIGkscj10LmZvcndhcmRTZWdzO2lmKHZvaWQgMD09PXQuZm9yd2FyZENvb3JkKWZvcihyLmxlbmd0aD8odGhpcy5zb3J0Rm9yd2FyZFNlZ3MociksdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyWzBdLGUrMSxuKSx0LmZvcndhcmRDb29yZD1yWzBdLmJhY2t3YXJkQ29vcmQpOnQuZm9yd2FyZENvb3JkPTEsdC5iYWNrd2FyZENvb3JkPXQuZm9yd2FyZENvb3JkLSh0LmZvcndhcmRDb29yZC1uKS8oZSsxKSxpPTA7aTxyLmxlbmd0aDtpKyspdGhpcy5jb21wdXRlRmdTZWdGb3J3YXJkQmFjayhyW2ldLDAsdC5mb3J3YXJkQ29vcmQpfSxzb3J0Rm9yd2FyZFNlZ3M6ZnVuY3Rpb24odCl7dC5zb3J0KGx0KHRoaXMsImNvbXBhcmVGb3J3YXJkU2VncyIpKX0sY29tcGFyZUZvcndhcmRTZWdzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZm9yd2FyZFByZXNzdXJlLXQuZm9yd2FyZFByZXNzdXJlfHwodC5iYWNrd2FyZENvb3JkfHwwKS0oZS5iYWNrd2FyZENvb3JkfHwwKXx8dGhpcy5jb21wYXJlRXZlbnRTZWdzKHQsZSl9LGFzc2lnbkZnU2VnSG9yaXpvbnRhbHM6ZnVuY3Rpb24odCl7dmFyIGUsbjtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKW49dFtlXSxuLmVsLmNzcyh0aGlzLmdlbmVyYXRlRmdTZWdIb3Jpem9udGFsQ3NzKG4pKSxuLmJvdHRvbS1uLnRvcDwzMCYmbi5lbC5hZGRDbGFzcygiZmMtc2hvcnQiKX0sZ2VuZXJhdGVGZ1NlZ0hvcml6b250YWxDc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixpPXRoaXMudmlldy5vcHQoInNsb3RFdmVudE92ZXJsYXAiKSxyPXQuYmFja3dhcmRDb29yZCxzPXQuZm9yd2FyZENvb3JkLG89dGhpcy5nZW5lcmF0ZVNlZ1ZlcnRpY2FsQ3NzKHQpO3JldHVybiBpJiYocz1NYXRoLm1pbigxLHIrMioocy1yKSkpLHRoaXMuaXNSVEw/KGU9MS1zLG49cik6KGU9cixuPTEtcyksby56SW5kZXg9dC5sZXZlbCsxLG8ubGVmdD0xMDAqZSsiJSIsby5yaWdodD0xMDAqbisiJSIsaSYmdC5mb3J3YXJkUHJlc3N1cmUmJihvW3RoaXMuaXNSVEw/Im1hcmdpbkxlZnQiOiJtYXJnaW5SaWdodCJdPTIwKSxvfX0pO3ZhciBTZT1qdC5WaWV3PXd0LmV4dGVuZChsZSxhZSx7dHlwZTpudWxsLG5hbWU6bnVsbCx0aXRsZTpudWxsLGNhbGVuZGFyOm51bGwsb3B0aW9uczpudWxsLGVsOm51bGwsZGlzcGxheWluZzpudWxsLGlzU2tlbGV0b25SZW5kZXJlZDohMSxpc0V2ZW50c1JlbmRlcmVkOiExLHN0YXJ0Om51bGwsZW5kOm51bGwsaW50ZXJ2YWxTdGFydDpudWxsLGludGVydmFsRW5kOm51bGwsaW50ZXJ2YWxEdXJhdGlvbjpudWxsLGludGVydmFsVW5pdDpudWxsLGlzUlRMOiExLGlzU2VsZWN0ZWQ6ITEsc2VsZWN0ZWRFdmVudDpudWxsLGV2ZW50T3JkZXJTcGVjczpudWxsLHdpZGdldEhlYWRlckNsYXNzOm51bGwsd2lkZ2V0Q29udGVudENsYXNzOm51bGwsaGlnaGxpZ2h0U3RhdGVDbGFzczpudWxsLG5leHREYXlUaHJlc2hvbGQ6bnVsbCxpc0hpZGRlbkRheUhhc2g6bnVsbCxpc05vd0luZGljYXRvclJlbmRlcmVkOm51bGwsaW5pdGlhbE5vd0RhdGU6bnVsbCxpbml0aWFsTm93UXVlcmllZE1zOm51bGwsbm93SW5kaWNhdG9yVGltZW91dElEOm51bGwsbm93SW5kaWNhdG9ySW50ZXJ2YWxJRDpudWxsLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsbixpLHIpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLnR5cGU9dGhpcy5uYW1lPW4sdGhpcy5vcHRpb25zPWksdGhpcy5pbnRlcnZhbER1cmF0aW9uPXJ8fGUuZHVyYXRpb24oMSwiZGF5IiksdGhpcy5uZXh0RGF5VGhyZXNob2xkPWUuZHVyYXRpb24odGhpcy5vcHQoIm5leHREYXlUaHJlc2hvbGQiKSksdGhpcy5pbml0VGhlbWluZ1Byb3BzKCksdGhpcy5pbml0SGlkZGVuRGF5cygpLHRoaXMuaXNSVEw9dGhpcy5vcHQoImlzUlRMIiksdGhpcy5ldmVudE9yZGVyU3BlY3M9TSh0aGlzLm9wdCgiZXZlbnRPcmRlciIpKSx0aGlzLmluaXRpYWxpemUoKX0saW5pdGlhbGl6ZTpmdW5jdGlvbigpe30sb3B0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnNbdF19LHRyaWdnZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNhbGVuZGFyO3JldHVybiBuLnRyaWdnZXIuYXBwbHkobixbdCxlfHx0aGlzXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLFt0aGlzXSkpfSxzZXREYXRlOmZ1bmN0aW9uKHQpe3RoaXMuc2V0UmFuZ2UodGhpcy5jb21wdXRlUmFuZ2UodCkpfSxzZXRSYW5nZTpmdW5jdGlvbihlKXt0LmV4dGVuZCh0aGlzLGUpLHRoaXMudXBkYXRlVGl0bGUoKX0sY29tcHV0ZVJhbmdlOmZ1bmN0aW9uKHQpe3ZhciBlLG4saT1PKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikscj10LmNsb25lKCkuc3RhcnRPZihpKSxzPXIuY2xvbmUoKS5hZGQodGhpcy5pbnRlcnZhbER1cmF0aW9uKTtyZXR1cm4veWVhcnxtb250aHx3ZWVrfGRheS8udGVzdChpKT8oci5zdHJpcFRpbWUoKSxzLnN0cmlwVGltZSgpKTooci5oYXNUaW1lKCl8fChyPXRoaXMuY2FsZW5kYXIudGltZSgwKSkscy5oYXNUaW1lKCl8fChzPXRoaXMuY2FsZW5kYXIudGltZSgwKSkpLGU9ci5jbG9uZSgpLGU9dGhpcy5za2lwSGlkZGVuRGF5cyhlKSxuPXMuY2xvbmUoKSxuPXRoaXMuc2tpcEhpZGRlbkRheXMobiwtMSwhMCkse2ludGVydmFsVW5pdDppLGludGVydmFsU3RhcnQ6cixpbnRlcnZhbEVuZDpzLHN0YXJ0OmUsZW5kOm59fSxjb21wdXRlUHJldkRhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFzc2FnZUN1cnJlbnREYXRlKHQuY2xvbmUoKS5zdGFydE9mKHRoaXMuaW50ZXJ2YWxVbml0KS5zdWJ0cmFjdCh0aGlzLmludGVydmFsRHVyYXRpb24pLC0xKX0sY29tcHV0ZU5leHREYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hc3NhZ2VDdXJyZW50RGF0ZSh0LmNsb25lKCkuc3RhcnRPZih0aGlzLmludGVydmFsVW5pdCkuYWRkKHRoaXMuaW50ZXJ2YWxEdXJhdGlvbikpfSxtYXNzYWdlQ3VycmVudERhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik8PTEmJnRoaXMuaXNIaWRkZW5EYXkodCkmJih0PXRoaXMuc2tpcEhpZGRlbkRheXModCxlKSx0LnN0YXJ0T2YoImRheSIpKSx0fSx1cGRhdGVUaXRsZTpmdW5jdGlvbigpe3RoaXMudGl0bGU9dGhpcy5jb21wdXRlVGl0bGUoKX0sY29tcHV0ZVRpdGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZm9ybWF0UmFuZ2Uoe3N0YXJ0OnRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0aGlzLmludGVydmFsU3RhcnQpLGVuZDp0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodGhpcy5pbnRlcnZhbEVuZCl9LHRoaXMub3B0KCJ0aXRsZUZvcm1hdCIpfHx0aGlzLmNvbXB1dGVUaXRsZUZvcm1hdCgpLHRoaXMub3B0KCJ0aXRsZVJhbmdlU2VwYXJhdG9yIikpfSxjb21wdXRlVGl0bGVGb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4ieWVhciI9PXRoaXMuaW50ZXJ2YWxVbml0PyJZWVlZIjoibW9udGgiPT10aGlzLmludGVydmFsVW5pdD90aGlzLm9wdCgibW9udGhZZWFyRm9ybWF0Iik6dGhpcy5pbnRlcnZhbER1cmF0aW9uLmFzKCJkYXlzIik+MT8ibGwiOiJMTCJ9LGZvcm1hdFJhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmVuZDtyZXR1cm4gaS5oYXNUaW1lKCl8fChpPWkuY2xvbmUoKS5zdWJ0cmFjdCgxKSkscHQodC5zdGFydCxpLGUsbix0aGlzLm9wdCgiaXNSVEwiKSl9LGdldEFsbERheUh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHQoImFsbERheUh0bWwiKXx8dHQodGhpcy5vcHQoImFsbERheVRleHQiKSl9LGJ1aWxkR290b0FuY2hvckh0bWw6ZnVuY3Rpb24oZSxuLGkpe3ZhciByLHMsbyxsO3JldHVybiB0LmlzUGxhaW5PYmplY3QoZSk/KHI9ZS5kYXRlLHM9ZS50eXBlLG89ZS5mb3JjZU9mZik6cj1lLHI9anQubW9tZW50KHIpLGw9e2RhdGU6ci5mb3JtYXQoIllZWVktTU0tREQiKSx0eXBlOnN8fCJkYXkifSwic3RyaW5nIj09dHlwZW9mIG4mJihpPW4sbj1udWxsKSxuPW4/IiAiK2l0KG4pOiIiLGk9aXx8IiIsIW8mJnRoaXMub3B0KCJuYXZMaW5rcyIpPyI8YSIrbisnIGRhdGEtZ290bz0iJyt0dChKU09OLnN0cmluZ2lmeShsKSkrJyI+JytpKyI8L2E+IjoiPHNwYW4iK24rIj4iK2krIjwvc3Bhbj4ifSxzZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3RoaXMuZWw9dCx0aGlzLmJpbmRHbG9iYWxIYW5kbGVycygpfSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKCl7dGhpcy5jbGVhcigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkJiYodGhpcy51bnJlbmRlclNrZWxldG9uKCksdGhpcy5pc1NrZWxldG9uUmVuZGVyZWQ9ITEpLHRoaXMudW5iaW5kR2xvYmFsSGFuZGxlcnMoKSx0aGlzLmVsLnJlbW92ZSgpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPW51bGw7cmV0dXJuIG51bGwhPWUmJnRoaXMuZGlzcGxheWluZyYmKGk9dGhpcy5xdWVyeVNjcm9sbCgpKSx0aGlzLmNhbGVuZGFyLmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSx1dCh0aGlzLmNsZWFyKCksZnVuY3Rpb24oKXtyZXR1cm4gbi5kaXNwbGF5aW5nPXV0KG4uZGlzcGxheVZpZXcodCksZnVuY3Rpb24oKXtudWxsIT1lP24uc2V0U2Nyb2xsKGUpOm4uZm9yY2VTY3JvbGwobi5jb21wdXRlSW5pdGlhbFNjcm9sbChpKSksbi5jYWxlbmRhci51bmZyZWV6ZUNvbnRlbnRIZWlnaHQoKSxuLnRyaWdnZXJSZW5kZXIoKX0pfSl9LGNsZWFyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXRoaXMuZGlzcGxheWluZztyZXR1cm4gbj91dChuLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGlzcGxheWluZz1udWxsLGUuY2xlYXJFdmVudHMoKSxlLmNsZWFyVmlldygpfSk6dC53aGVuKCl9LGRpc3BsYXlWaWV3OmZ1bmN0aW9uKHQpe3RoaXMuaXNTa2VsZXRvblJlbmRlcmVkfHwodGhpcy5yZW5kZXJTa2VsZXRvbigpLHRoaXMuaXNTa2VsZXRvblJlbmRlcmVkPSEwKSx0JiZ0aGlzLnNldERhdGUodCksdGhpcy5yZW5kZXImJnRoaXMucmVuZGVyKCksdGhpcy5yZW5kZXJEYXRlcygpLHRoaXMudXBkYXRlU2l6ZSgpLHRoaXMucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuc3RhcnROb3dJbmRpY2F0b3IoKX0sY2xlYXJWaWV3OmZ1bmN0aW9uKCl7dGhpcy51bnNlbGVjdCgpLHRoaXMuc3RvcE5vd0luZGljYXRvcigpLHRoaXMudHJpZ2dlclVucmVuZGVyKCksdGhpcy51bnJlbmRlckJ1c2luZXNzSG91cnMoKSx0aGlzLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRlc3Ryb3kmJnRoaXMuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe30scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt9LHRyaWdnZXJSZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnRyaWdnZXIoInZpZXdSZW5kZXIiLHRoaXMsdGhpcyx0aGlzLmVsKX0sdHJpZ2dlclVucmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJ2aWV3RGVzdHJveSIsdGhpcyx0aGlzLHRoaXMuZWwpfSxiaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLmxpc3RlblRvKHQoZG9jdW1lbnQpLCJtb3VzZWRvd24iLHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZWRvd24pLHRoaXMubGlzdGVuVG8odChkb2N1bWVudCksInRvdWNoc3RhcnQiLHRoaXMucHJvY2Vzc1Vuc2VsZWN0KX0sdW5iaW5kR2xvYmFsSGFuZGxlcnM6ZnVuY3Rpb24oKXt0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0KGRvY3VtZW50KSl9LGluaXRUaGVtaW5nUHJvcHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdCgidGhlbWUiKT8idWkiOiJmYyI7dGhpcy53aWRnZXRIZWFkZXJDbGFzcz10KyItd2lkZ2V0LWhlYWRlciIsdGhpcy53aWRnZXRDb250ZW50Q2xhc3M9dCsiLXdpZGdldC1jb250ZW50Iix0aGlzLmhpZ2hsaWdodFN0YXRlQ2xhc3M9dCsiLXN0YXRlLWhpZ2hsaWdodCJ9LHJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt9LHVucmVuZGVyQnVzaW5lc3NIb3VyczpmdW5jdGlvbigpe30sc3RhcnROb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt2YXIgdCxuLGkscj10aGlzO3RoaXMub3B0KCJub3dJbmRpY2F0b3IiKSYmKHQ9dGhpcy5nZXROb3dJbmRpY2F0b3JVbml0KCksdCYmKG49bHQodGhpcywidXBkYXRlTm93SW5kaWNhdG9yIiksdGhpcy5pbml0aWFsTm93RGF0ZT10aGlzLmNhbGVuZGFyLmdldE5vdygpLHRoaXMuaW5pdGlhbE5vd1F1ZXJpZWRNcz0rbmV3IERhdGUsdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZSksdGhpcy5pc05vd0luZGljYXRvclJlbmRlcmVkPSEwLGk9dGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLnN0YXJ0T2YodCkuYWRkKDEsdCktdGhpcy5pbml0aWFsTm93RGF0ZSx0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCxuKCksaT0rZS5kdXJhdGlvbigxLHQpLGk9TWF0aC5tYXgoMTAwLGkpLHIubm93SW5kaWNhdG9ySW50ZXJ2YWxJRD1zZXRJbnRlcnZhbChuLGkpfSxpKSkpfSx1cGRhdGVOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLnVucmVuZGVyTm93SW5kaWNhdG9yKCksdGhpcy5yZW5kZXJOb3dJbmRpY2F0b3IodGhpcy5pbml0aWFsTm93RGF0ZS5jbG9uZSgpLmFkZChuZXcgRGF0ZS10aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpKSl9LHN0b3BOb3dJbmRpY2F0b3I6ZnVuY3Rpb24oKXt0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQmJih0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCYmKGNsZWFyVGltZW91dCh0aGlzLm5vd0luZGljYXRvclRpbWVvdXRJRCksdGhpcy5ub3dJbmRpY2F0b3JUaW1lb3V0SUQ9bnVsbCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEJiYoY2xlYXJUaW1lb3V0KHRoaXMubm93SW5kaWNhdG9ySW50ZXJ2YWxJRCksdGhpcy5ub3dJbmRpY2F0b3JJbnRlcnZhbElEPW51bGwpLHRoaXMudW5yZW5kZXJOb3dJbmRpY2F0b3IoKSx0aGlzLmlzTm93SW5kaWNhdG9yUmVuZGVyZWQ9ITEpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7fSx1bnJlbmRlck5vd0luZGljYXRvcjpmdW5jdGlvbigpe30sdXBkYXRlU2l6ZTpmdW5jdGlvbih0KXt2YXIgZTt0JiYoZT10aGlzLnF1ZXJ5U2Nyb2xsKCkpLHRoaXMudXBkYXRlSGVpZ2h0KHQpLHRoaXMudXBkYXRlV2lkdGgodCksdGhpcy51cGRhdGVOb3dJbmRpY2F0b3IoKSx0JiZ0aGlzLnNldFNjcm9sbChlKX0sdXBkYXRlV2lkdGg6ZnVuY3Rpb24odCl7fSx1cGRhdGVIZWlnaHQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYWxlbmRhcjt0aGlzLnNldEhlaWdodChlLmdldFN1Z2dlc3RlZFZpZXdIZWlnaHQoKSxlLmlzSGVpZ2h0QXV0bygpKX0sc2V0SGVpZ2h0OmZ1bmN0aW9uKHQsZSl7fSxjb21wdXRlSW5pdGlhbFNjcm9sbDpmdW5jdGlvbih0KXtyZXR1cm4gMH0scXVlcnlTY3JvbGw6ZnVuY3Rpb24oKXt9LHNldFNjcm9sbDpmdW5jdGlvbih0KXt9LGZvcmNlU2Nyb2xsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5zZXRTY3JvbGwodCksc2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0U2Nyb2xsKHQpfSwwKX0sZGlzcGxheUV2ZW50czpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnF1ZXJ5U2Nyb2xsKCk7dGhpcy5jbGVhckV2ZW50cygpLHRoaXMucmVuZGVyRXZlbnRzKHQpLHRoaXMuaXNFdmVudHNSZW5kZXJlZD0hMCx0aGlzLnNldFNjcm9sbChlKSx0aGlzLnRyaWdnZXJFdmVudFJlbmRlcigpfSxjbGVhckV2ZW50czpmdW5jdGlvbigpe3ZhciB0O3RoaXMuaXNFdmVudHNSZW5kZXJlZCYmKHQ9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudHJpZ2dlckV2ZW50VW5yZW5kZXIoKSx0aGlzLmRlc3Ryb3lFdmVudHMmJnRoaXMuZGVzdHJveUV2ZW50cygpLHRoaXMudW5yZW5kZXJFdmVudHMoKSx0aGlzLnNldFNjcm9sbCh0KSx0aGlzLmlzRXZlbnRzUmVuZGVyZWQ9ITEpfSxyZW5kZXJFdmVudHM6ZnVuY3Rpb24odCl7fSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe30sdHJpZ2dlckV2ZW50UmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0aGlzLnRyaWdnZXIoImV2ZW50QWZ0ZXJSZW5kZXIiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pLHRoaXMudHJpZ2dlcigiZXZlbnRBZnRlckFsbFJlbmRlciIpfSx0cmlnZ2VyRXZlbnRVbnJlbmRlcjpmdW5jdGlvbigpe3RoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dGhpcy50cmlnZ2VyKCJldmVudERlc3Ryb3kiLHQuZXZlbnQsdC5ldmVudCx0LmVsKX0pfSxyZXNvbHZlRXZlbnRFbDpmdW5jdGlvbihlLG4pe3ZhciBpPXRoaXMudHJpZ2dlcigiZXZlbnRSZW5kZXIiLGUsZSxuKTtyZXR1cm4gaT09PSExP249bnVsbDppJiZpIT09ITAmJihuPXQoaSkpLG59LHNob3dFdmVudDpmdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVkRXZlbnRTZWdFYWNoKGZ1bmN0aW9uKHQpe3QuZWwuY3NzKCJ2aXNpYmlsaXR5IiwiIil9LHQpfSxoaWRlRXZlbnQ6ZnVuY3Rpb24odCl7dGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpfSx0KX0scmVuZGVyZWRFdmVudFNlZ0VhY2g6ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuZ2V0RXZlbnRTZWdzKCk7Zm9yKG49MDtuPGkubGVuZ3RoO24rKyllJiZpW25dLmV2ZW50Ll9pZCE9PWUuX2lkfHxpW25dLmVsJiZ0LmNhbGwodGhpcyxpW25dKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFN0YXJ0RWRpdGFibGUodCl9LGlzRXZlbnRTdGFydEVkaXRhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiBKKHQuc3RhcnRFZGl0YWJsZSwodC5zb3VyY2V8fHt9KS5zdGFydEVkaXRhYmxlLHRoaXMub3B0KCJldmVudFN0YXJ0RWRpdGFibGUiKSx0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KSl9LGlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gSih0LmVkaXRhYmxlLCh0LnNvdXJjZXx8e30pLmVkaXRhYmxlLHRoaXMub3B0KCJlZGl0YWJsZSIpKX0scmVwb3J0RXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7CnZhciBzPXRoaXMuY2FsZW5kYXIsbz1zLm11dGF0ZUV2ZW50KHQsZSxuKSxsPWZ1bmN0aW9uKCl7by51bmRvKCkscy5yZXBvcnRFdmVudENoYW5nZSgpfTt0aGlzLnRyaWdnZXJFdmVudERyb3AodCxvLmRhdGVEZWx0YSxsLGkscikscy5yZXBvcnRFdmVudENoYW5nZSgpfSx0cmlnZ2VyRXZlbnREcm9wOmZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy50cmlnZ2VyKCJldmVudERyb3AiLGlbMF0sdCxlLG4scix7fSl9LHJlcG9ydEV4dGVybmFsRHJvcDpmdW5jdGlvbihlLG4saSxyLHMpe3ZhciBvLGwsYT1lLmV2ZW50UHJvcHM7YSYmKG89dC5leHRlbmQoe30sYSxuKSxsPXRoaXMuY2FsZW5kYXIucmVuZGVyRXZlbnQobyxlLnN0aWNrKVswXSksdGhpcy50cmlnZ2VyRXh0ZXJuYWxEcm9wKGwsbixpLHIscyl9LHRyaWdnZXJFeHRlcm5hbERyb3A6ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLnRyaWdnZXIoImRyb3AiLG5bMF0sZS5zdGFydCxpLHIpLHQmJnRoaXMudHJpZ2dlcigiZXZlbnRSZWNlaXZlIixudWxsLHQpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7fSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt9LGlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMub3B0KCJldmVudFJlc2l6YWJsZUZyb21TdGFydCIpJiZ0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGVGcm9tRW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzRXZlbnRSZXNpemFibGUodCl9LGlzRXZlbnRSZXNpemFibGU6ZnVuY3Rpb24odCl7dmFyIGU9dC5zb3VyY2V8fHt9O3JldHVybiBKKHQuZHVyYXRpb25FZGl0YWJsZSxlLmR1cmF0aW9uRWRpdGFibGUsdGhpcy5vcHQoImV2ZW50RHVyYXRpb25FZGl0YWJsZSIpLHQuZWRpdGFibGUsZS5lZGl0YWJsZSx0aGlzLm9wdCgiZWRpdGFibGUiKSl9LHJlcG9ydEV2ZW50UmVzaXplOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIHM9dGhpcy5jYWxlbmRhcixvPXMubXV0YXRlRXZlbnQodCxlLG4pLGw9ZnVuY3Rpb24oKXtvLnVuZG8oKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9O3RoaXMudHJpZ2dlckV2ZW50UmVzaXplKHQsby5kdXJhdGlvbkRlbHRhLGwsaSxyKSxzLnJlcG9ydEV2ZW50Q2hhbmdlKCl9LHRyaWdnZXJFdmVudFJlc2l6ZTpmdW5jdGlvbih0LGUsbixpLHIpe3RoaXMudHJpZ2dlcigiZXZlbnRSZXNpemUiLGlbMF0sdCxlLG4scix7fSl9LHNlbGVjdDpmdW5jdGlvbih0LGUpe3RoaXMudW5zZWxlY3QoZSksdGhpcy5yZW5kZXJTZWxlY3Rpb24odCksdGhpcy5yZXBvcnRTZWxlY3Rpb24odCxlKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe30scmVwb3J0U2VsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7dGhpcy5pc1NlbGVjdGVkPSEwLHRoaXMudHJpZ2dlclNlbGVjdCh0LGUpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSl9LHVuc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuaXNTZWxlY3RlZCYmKHRoaXMuaXNTZWxlY3RlZD0hMSx0aGlzLmRlc3Ryb3lTZWxlY3Rpb24mJnRoaXMuZGVzdHJveVNlbGVjdGlvbigpLHRoaXMudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLnRyaWdnZXIoInVuc2VsZWN0IixudWxsLHQpKX0sdW5yZW5kZXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt9LHNlbGVjdEV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0ZWRFdmVudCYmdGhpcy5zZWxlY3RlZEV2ZW50PT09dHx8KHRoaXMudW5zZWxlY3RFdmVudCgpLHRoaXMucmVuZGVyZWRFdmVudFNlZ0VhY2goZnVuY3Rpb24odCl7dC5lbC5hZGRDbGFzcygiZmMtc2VsZWN0ZWQiKX0sdCksdGhpcy5zZWxlY3RlZEV2ZW50PXQpfSx1bnNlbGVjdEV2ZW50OmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEV2ZW50JiYodGhpcy5yZW5kZXJlZEV2ZW50U2VnRWFjaChmdW5jdGlvbih0KXt0LmVsLnJlbW92ZUNsYXNzKCJmYy1zZWxlY3RlZCIpfSx0aGlzLnNlbGVjdGVkRXZlbnQpLHRoaXMuc2VsZWN0ZWRFdmVudD1udWxsKX0saXNFdmVudFNlbGVjdGVkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdGVkRXZlbnQmJnRoaXMuc2VsZWN0ZWRFdmVudC5faWQ9PT10Ll9pZH0saGFuZGxlRG9jdW1lbnRNb3VzZWRvd246ZnVuY3Rpb24odCl7Uyh0KSYmdGhpcy5wcm9jZXNzVW5zZWxlY3QodCl9LHByb2Nlc3NVbnNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnByb2Nlc3NSYW5nZVVuc2VsZWN0KHQpLHRoaXMucHJvY2Vzc0V2ZW50VW5zZWxlY3QodCl9LHByb2Nlc3NSYW5nZVVuc2VsZWN0OmZ1bmN0aW9uKGUpe3ZhciBuO3RoaXMuaXNTZWxlY3RlZCYmdGhpcy5vcHQoInVuc2VsZWN0QXV0byIpJiYobj10aGlzLm9wdCgidW5zZWxlY3RDYW5jZWwiKSxuJiZ0KGUudGFyZ2V0KS5jbG9zZXN0KG4pLmxlbmd0aHx8dGhpcy51bnNlbGVjdChlKSl9LHByb2Nlc3NFdmVudFVuc2VsZWN0OmZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0ZWRFdmVudCYmKHQoZS50YXJnZXQpLmNsb3Nlc3QoIi5mYy1zZWxlY3RlZCIpLmxlbmd0aHx8dGhpcy51bnNlbGVjdEV2ZW50KCkpfSx0cmlnZ2VyRGF5Q2xpY2s6ZnVuY3Rpb24odCxlLG4pe3RoaXMudHJpZ2dlcigiZGF5Q2xpY2siLGUsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLG4pfSxpbml0SGlkZGVuRGF5czpmdW5jdGlvbigpe3ZhciBlLG49dGhpcy5vcHQoImhpZGRlbkRheXMiKXx8W10saT1bXSxyPTA7Zm9yKHRoaXMub3B0KCJ3ZWVrZW5kcyIpPT09ITEmJm4ucHVzaCgwLDYpLGU9MDtlPDc7ZSsrKShpW2VdPXQuaW5BcnJheShlLG4pIT09LTEpfHxyKys7aWYoIXIpdGhyb3ciaW52YWxpZCBoaWRkZW5EYXlzIjt0aGlzLmlzSGlkZGVuRGF5SGFzaD1pfSxpc0hpZGRlbkRheTpmdW5jdGlvbih0KXtyZXR1cm4gZS5pc01vbWVudCh0KSYmKHQ9dC5kYXkoKSksdGhpcy5pc0hpZGRlbkRheUhhc2hbdF19LHNraXBIaWRkZW5EYXlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LmNsb25lKCk7Zm9yKGU9ZXx8MTt0aGlzLmlzSGlkZGVuRGF5SGFzaFsoaS5kYXkoKSsobj9lOjApKzcpJTddOylpLmFkZChlLCJkYXlzIik7cmV0dXJuIGl9LGNvbXB1dGVEYXlSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFRpbWUoKSxpPXQuZW5kLHI9bnVsbDtyZXR1cm4gaSYmKHI9aS5jbG9uZSgpLnN0cmlwVGltZSgpLGU9K2kudGltZSgpLGUmJmU+PXRoaXMubmV4dERheVRocmVzaG9sZCYmci5hZGQoMSwiZGF5cyIpKSwoIWl8fHI8PW4pJiYocj1uLmNsb25lKCkuYWRkKDEsImRheXMiKSkse3N0YXJ0Om4sZW5kOnJ9fSxpc011bHRpRGF5RXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb21wdXRlRGF5UmFuZ2UodCk7cmV0dXJuIGUuZW5kLmRpZmYoZS5zdGFydCwiZGF5cyIpPjF9fSksd2U9anQuU2Nyb2xsZXI9d3QuZXh0ZW5kKHtlbDpudWxsLHNjcm9sbEVsOm51bGwsb3ZlcmZsb3dYOm51bGwsb3ZlcmZsb3dZOm51bGwsY29uc3RydWN0b3I6ZnVuY3Rpb24odCl7dD10fHx7fSx0aGlzLm92ZXJmbG93WD10Lm92ZXJmbG93WHx8dC5vdmVyZmxvd3x8ImF1dG8iLHRoaXMub3ZlcmZsb3dZPXQub3ZlcmZsb3dZfHx0Lm92ZXJmbG93fHwiYXV0byJ9LHJlbmRlcjpmdW5jdGlvbigpe3RoaXMuZWw9dGhpcy5yZW5kZXJFbCgpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxyZW5kZXJFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyIj48L2Rpdj4nKX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLnNldEhlaWdodCgiYXV0byIpLHRoaXMuYXBwbHlPdmVyZmxvdygpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbC5yZW1vdmUoKX0sYXBwbHlPdmVyZmxvdzpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6dGhpcy5vdmVyZmxvd1gsIm92ZXJmbG93LXkiOnRoaXMub3ZlcmZsb3dZfSl9LGxvY2tPdmVyZmxvdzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm92ZXJmbG93WCxuPXRoaXMub3ZlcmZsb3dZO3Q9dHx8dGhpcy5nZXRTY3JvbGxiYXJXaWR0aHMoKSwiYXV0byI9PT1lJiYoZT10LnRvcHx8dC5ib3R0b218fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsV2lkdGgtMT50aGlzLnNjcm9sbEVsWzBdLmNsaWVudFdpZHRoPyJzY3JvbGwiOiJoaWRkZW4iKSwiYXV0byI9PT1uJiYobj10LmxlZnR8fHQucmlnaHR8fHRoaXMuc2Nyb2xsRWxbMF0uc2Nyb2xsSGVpZ2h0LTE+dGhpcy5zY3JvbGxFbFswXS5jbGllbnRIZWlnaHQ/InNjcm9sbCI6ImhpZGRlbiIpLHRoaXMuc2Nyb2xsRWwuY3NzKHsib3ZlcmZsb3cteCI6ZSwib3ZlcmZsb3cteSI6bn0pfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5oZWlnaHQodCl9LGdldFNjcm9sbFRvcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsLnNjcm9sbFRvcCgpfSxzZXRTY3JvbGxUb3A6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxFbC5zY3JvbGxUb3AodCl9LGdldENsaWVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsRWxbMF0uY2xpZW50V2lkdGh9LGdldENsaWVudEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLmNsaWVudEhlaWdodH0sZ2V0U2Nyb2xsYmFyV2lkdGhzOmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpcy5zY3JvbGxFbCl9fSksRWU9anQuQ2FsZW5kYXI9d3QuZXh0ZW5kKHtkaXJEZWZhdWx0czpudWxsLGxvY2FsZURlZmF1bHRzOm51bGwsb3ZlcnJpZGVzOm51bGwsZHluYW1pY092ZXJyaWRlczpudWxsLG9wdGlvbnM6bnVsbCx2aWV3U3BlY0NhY2hlOm51bGwsdmlldzpudWxsLGhlYWRlcjpudWxsLGxvYWRpbmdMZXZlbDowLGNvbnN0cnVjdG9yOk90LGluaXRpYWxpemU6ZnVuY3Rpb24oKXt9LHBvcHVsYXRlT3B0aW9uc0hhc2g6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscjt0PUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmxvY2FsZSx0aGlzLm92ZXJyaWRlcy5sb2NhbGUpLGU9RGVbdF0sZXx8KHQ9RWUuZGVmYXVsdHMubG9jYWxlLGU9RGVbdF18fHt9KSxpPUoodGhpcy5keW5hbWljT3ZlcnJpZGVzLmlzUlRMLHRoaXMub3ZlcnJpZGVzLmlzUlRMLGUuaXNSVEwsRWUuZGVmYXVsdHMuaXNSVEwpLHI9aT9FZS5ydGxEZWZhdWx0czp7fSx0aGlzLmRpckRlZmF1bHRzPXIsdGhpcy5sb2NhbGVEZWZhdWx0cz1lLHRoaXMub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyxyLGUsdGhpcy5vdmVycmlkZXMsdGhpcy5keW5hbWljT3ZlcnJpZGVzXSksVnQodGhpcy5vcHRpb25zKX0sZ2V0Vmlld1NwZWM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy52aWV3U3BlY0NhY2hlO3JldHVybiBlW3RdfHwoZVt0XT10aGlzLmJ1aWxkVmlld1NwZWModCkpfSxnZXRVbml0Vmlld1NwZWM6ZnVuY3Rpb24oZSl7dmFyIG4saSxyO2lmKHQuaW5BcnJheShlLFh0KSE9LTEpZm9yKG49dGhpcy5oZWFkZXIuZ2V0Vmlld3NXaXRoQnV0dG9ucygpLHQuZWFjaChqdC52aWV3cyxmdW5jdGlvbih0KXtuLnB1c2godCl9KSxpPTA7aTxuLmxlbmd0aDtpKyspaWYocj10aGlzLmdldFZpZXdTcGVjKG5baV0pLHImJnIuc2luZ2xlVW5pdD09ZSlyZXR1cm4gcn0sYnVpbGRWaWV3U3BlYzpmdW5jdGlvbih0KXtmb3IodmFyIGkscixzLG8sbD10aGlzLm92ZXJyaWRlcy52aWV3c3x8e30sYT1bXSx1PVtdLGQ9W10sYz10O2M7KWk9VXRbY10scj1sW2NdLGM9bnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGk9e2NsYXNzOml9KSxpJiYoYS51bnNoaWZ0KGkpLHUudW5zaGlmdChpLmRlZmF1bHRzfHx7fSkscz1zfHxpLmR1cmF0aW9uLGM9Y3x8aS50eXBlKSxyJiYoZC51bnNoaWZ0KHIpLHM9c3x8ci5kdXJhdGlvbixjPWN8fHIudHlwZSk7cmV0dXJuIGk9cShhKSxpLnR5cGU9dCwhIWkuY2xhc3MmJihzJiYocz1lLmR1cmF0aW9uKHMpLHMudmFsdWVPZigpJiYoaS5kdXJhdGlvbj1zLG89TyhzKSwxPT09cy5hcyhvKSYmKGkuc2luZ2xlVW5pdD1vLGQudW5zaGlmdChsW29dfHx7fSkpKSksaS5kZWZhdWx0cz1uKHUpLGkub3ZlcnJpZGVzPW4oZCksdGhpcy5idWlsZFZpZXdTcGVjT3B0aW9ucyhpKSx0aGlzLmJ1aWxkVmlld1NwZWNCdXR0b25UZXh0KGksdCksaSl9LGJ1aWxkVmlld1NwZWNPcHRpb25zOmZ1bmN0aW9uKHQpe3Qub3B0aW9ucz1uKFtFZS5kZWZhdWx0cyx0LmRlZmF1bHRzLHRoaXMuZGlyRGVmYXVsdHMsdGhpcy5sb2NhbGVEZWZhdWx0cyx0aGlzLm92ZXJyaWRlcyx0Lm92ZXJyaWRlcyx0aGlzLmR5bmFtaWNPdmVycmlkZXNdKSxWdCh0Lm9wdGlvbnMpfSxidWlsZFZpZXdTcGVjQnV0dG9uVGV4dDpmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4obil7dmFyIGk9bi5idXR0b25UZXh0fHx7fTtyZXR1cm4gaVtlXXx8KHQuYnV0dG9uVGV4dEtleT9pW3QuYnV0dG9uVGV4dEtleV06bnVsbCl8fCh0LnNpbmdsZVVuaXQ/aVt0LnNpbmdsZVVuaXRdOm51bGwpfXQuYnV0dG9uVGV4dE92ZXJyaWRlPW4odGhpcy5keW5hbWljT3ZlcnJpZGVzKXx8bih0aGlzLm92ZXJyaWRlcyl8fHQub3ZlcnJpZGVzLmJ1dHRvblRleHQsdC5idXR0b25UZXh0RGVmYXVsdD1uKHRoaXMubG9jYWxlRGVmYXVsdHMpfHxuKHRoaXMuZGlyRGVmYXVsdHMpfHx0LmRlZmF1bHRzLmJ1dHRvblRleHR8fG4oRWUuZGVmYXVsdHMpfHwodC5kdXJhdGlvbj90aGlzLmh1bWFuaXplRHVyYXRpb24odC5kdXJhdGlvbik6bnVsbCl8fGV9LGluc3RhbnRpYXRlVmlldzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldFZpZXdTcGVjKHQpO3JldHVybiBuZXcgZS5jbGFzcyh0aGlzLHQsZS5vcHRpb25zLGUuZHVyYXRpb24pfSxpc1ZhbGlkVmlld1R5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRWaWV3U3BlYyh0KSl9LHB1c2hMb2FkaW5nOmZ1bmN0aW9uKCl7dGhpcy5sb2FkaW5nTGV2ZWwrK3x8dGhpcy50cmlnZ2VyKCJsb2FkaW5nIixudWxsLCEwLHRoaXMudmlldyl9LHBvcExvYWRpbmc6ZnVuY3Rpb24oKXstLXRoaXMubG9hZGluZ0xldmVsfHx0aGlzLnRyaWdnZXIoImxvYWRpbmciLG51bGwsITEsdGhpcy52aWV3KX0sYnVpbGRTZWxlY3RTcGFuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLm1vbWVudCh0KS5zdHJpcFpvbmUoKTtyZXR1cm4gbj1lP3RoaXMubW9tZW50KGUpLnN0cmlwWm9uZSgpOmkuaGFzVGltZSgpP2kuY2xvbmUoKS5hZGQodGhpcy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTppLmNsb25lKCkuYWRkKHRoaXMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pLHtzdGFydDppLGVuZDpufX19KTtFZS5taXhpbihsZSksRWUubWl4aW4oe29wdGlvbkhhbmRsZXJzOm51bGwsYmluZE9wdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuYmluZE9wdGlvbnMoW3RdLGUpfSxiaW5kT3B0aW9uczpmdW5jdGlvbih0LGUpe3ZhciBuLGk9e2Z1bmM6ZSxuYW1lczp0fTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRoaXMucmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqKHRbbl0saSk7dGhpcy50cmlnZ2VyT3B0aW9uSGFuZGxlck9iaihpKX0scmVnaXN0ZXJPcHRpb25IYW5kbGVyT2JqOmZ1bmN0aW9uKHQsZSl7KHRoaXMub3B0aW9uSGFuZGxlcnNbdF18fCh0aGlzLm9wdGlvbkhhbmRsZXJzW3RdPVtdKSkucHVzaChlKX0sdHJpZ2dlck9wdGlvbkhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5vcHRpb25IYW5kbGVyc1t0XXx8W107Zm9yKGU9MDtlPG4ubGVuZ3RoO2UrKyl0aGlzLnRyaWdnZXJPcHRpb25IYW5kbGVyT2JqKG5bZV0pfSx0cmlnZ2VyT3B0aW9uSGFuZGxlck9iajpmdW5jdGlvbih0KXt2YXIgZSxuPXQubmFtZXMsaT1bXTtmb3IoZT0wO2U8bi5sZW5ndGg7ZSsrKWkucHVzaCh0aGlzLm9wdGlvbnNbbltlXV0pO3QuZnVuYy5hcHBseSh0aGlzLGkpfX0pLEVlLmRlZmF1bHRzPXt0aXRsZVJhbmdlU2VwYXJhdG9yOiIg4oCTICIsbW9udGhZZWFyRm9ybWF0OiJNTU1NIFlZWVkiLGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246IjAyOjAwOjAwIixkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjp7ZGF5czoxfSxmb3JjZUV2ZW50RHVyYXRpb246ITEsbmV4dERheVRocmVzaG9sZDoiMDk6MDA6MDAiLGRlZmF1bHRWaWV3OiJtb250aCIsYXNwZWN0UmF0aW86MS4zNSxoZWFkZXI6e2xlZnQ6InRpdGxlIixjZW50ZXI6IiIscmlnaHQ6InRvZGF5IHByZXYsbmV4dCJ9LHdlZWtlbmRzOiEwLHdlZWtOdW1iZXJzOiExLHdlZWtOdW1iZXJUaXRsZToiVyIsd2Vla051bWJlckNhbGN1bGF0aW9uOiJsb2NhbCIsc2Nyb2xsVGltZToiMDY6MDA6MDAiLGxhenlGZXRjaGluZzohMCxzdGFydFBhcmFtOiJzdGFydCIsZW5kUGFyYW06ImVuZCIsdGltZXpvbmVQYXJhbToidGltZXpvbmUiLHRpbWV6b25lOiExLGlzUlRMOiExLGJ1dHRvblRleHQ6e3ByZXY6InByZXYiLG5leHQ6Im5leHQiLHByZXZZZWFyOiJwcmV2IHllYXIiLG5leHRZZWFyOiJuZXh0IHllYXIiLHllYXI6InllYXIiLHRvZGF5OiJ0b2RheSIsbW9udGg6Im1vbnRoIix3ZWVrOiJ3ZWVrIixkYXk6ImRheSJ9LGJ1dHRvbkljb25zOntwcmV2OiJsZWZ0LXNpbmdsZS1hcnJvdyIsbmV4dDoicmlnaHQtc2luZ2xlLWFycm93IixwcmV2WWVhcjoibGVmdC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJyaWdodC1kb3VibGUtYXJyb3cifSxhbGxEYXlUZXh0OiJhbGwtZGF5Iix0aGVtZTohMSx0aGVtZUJ1dHRvbkljb25zOntwcmV2OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dDoiY2lyY2xlLXRyaWFuZ2xlLWUiLHByZXZZZWFyOiJzZWVrLXByZXYiLG5leHRZZWFyOiJzZWVrLW5leHQifSxkcmFnT3BhY2l0eTouNzUsZHJhZ1JldmVydER1cmF0aW9uOjUwMCxkcmFnU2Nyb2xsOiEwLHVuc2VsZWN0QXV0bzohMCxkcm9wQWNjZXB0OiIqIixldmVudE9yZGVyOiJ0aXRsZSIsZXZlbnRMaW1pdDohMSxldmVudExpbWl0VGV4dDoibW9yZSIsZXZlbnRMaW1pdENsaWNrOiJwb3BvdmVyIixkYXlQb3BvdmVyRm9ybWF0OiJMTCIsaGFuZGxlV2luZG93UmVzaXplOiEwLHdpbmRvd1Jlc2l6ZURlbGF5OjEwMCxsb25nUHJlc3NEZWxheToxZTN9LEVlLmVuZ2xpc2hEZWZhdWx0cz17ZGF5UG9wb3ZlckZvcm1hdDoiZGRkZCwgTU1NTSBEIn0sRWUucnRsRGVmYXVsdHM9e2hlYWRlcjp7bGVmdDoibmV4dCxwcmV2IHRvZGF5IixjZW50ZXI6IiIscmlnaHQ6InRpdGxlIn0sYnV0dG9uSWNvbnM6e3ByZXY6InJpZ2h0LXNpbmdsZS1hcnJvdyIsbmV4dDoibGVmdC1zaW5nbGUtYXJyb3ciLHByZXZZZWFyOiJyaWdodC1kb3VibGUtYXJyb3ciLG5leHRZZWFyOiJsZWZ0LWRvdWJsZS1hcnJvdyJ9LHRoZW1lQnV0dG9uSWNvbnM6e3ByZXY6ImNpcmNsZS10cmlhbmdsZS1lIixuZXh0OiJjaXJjbGUtdHJpYW5nbGUtdyIsbmV4dFllYXI6InNlZWstcHJldiIscHJldlllYXI6InNlZWstbmV4dCJ9fTt2YXIgRGU9anQubG9jYWxlcz17fTtqdC5kYXRlcGlja2VyTG9jYWxlPWZ1bmN0aW9uKGUsbixpKXt2YXIgcj1EZVtlXXx8KERlW2VdPXt9KTtyLmlzUlRMPWkuaXNSVEwsci53ZWVrTnVtYmVyVGl0bGU9aS53ZWVrSGVhZGVyLHQuZWFjaChiZSxmdW5jdGlvbih0LGUpe3JbdF09ZShpKX0pLHQuZGF0ZXBpY2tlciYmKHQuZGF0ZXBpY2tlci5yZWdpb25hbFtuXT10LmRhdGVwaWNrZXIucmVnaW9uYWxbZV09aSx0LmRhdGVwaWNrZXIucmVnaW9uYWwuZW49dC5kYXRlcGlja2VyLnJlZ2lvbmFsWyIiXSx0LmRhdGVwaWNrZXIuc2V0RGVmYXVsdHMoaSkpfSxqdC5sb2NhbGU9ZnVuY3Rpb24oZSxpKXt2YXIgcixzO3I9RGVbZV18fChEZVtlXT17fSksaSYmKHI9RGVbZV09bihbcixpXSkpLHM9UHQoZSksdC5lYWNoKENlLGZ1bmN0aW9uKHQsZSl7bnVsbD09clt0XSYmKHJbdF09ZShzLHIpKX0pLEVlLmRlZmF1bHRzLmxvY2FsZT1lfTt2YXIgYmU9e2J1dHRvblRleHQ6ZnVuY3Rpb24odCl7cmV0dXJue3ByZXY6ZXQodC5wcmV2VGV4dCksbmV4dDpldCh0Lm5leHRUZXh0KSx0b2RheTpldCh0LmN1cnJlbnRUZXh0KX19LG1vbnRoWWVhckZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5zaG93TW9udGhBZnRlclllYXI/IllZWVlbIit0LnllYXJTdWZmaXgrIl0gTU1NTSI6Ik1NTU0gWVlZWVsiK3QueWVhclN1ZmZpeCsiXSJ9fSxDZT17ZGF5T2ZNb250aEZvcm1hdDpmdW5jdGlvbih0LGUpe3ZhciBuPXQubG9uZ0RhdGVGb3JtYXQoImwiKTtyZXR1cm4gbj1uLnJlcGxhY2UoL15ZK1teXHdcc10qfFteXHdcc10qWSskL2csIiIpLGUuaXNSVEw/bis9IiBkZGQiOm49ImRkZCAiK24sbn0sbWVkaXVtVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LHNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwiYSIpfSxleHRyYVNtYWxsVGltZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5sb25nRGF0ZUZvcm1hdCgiTFQiKS5yZXBsYWNlKCI6bW0iLCIoOm1tKSIpLnJlcGxhY2UoLyhcV21tKSQvLCIoJDEpIikucmVwbGFjZSgvXHMqYSQvaSwidCIpfSxob3VyRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoIjptbSIsIiIpLnJlcGxhY2UoLyhcV21tKSQvLCIiKS5yZXBsYWNlKC9ccyphJC9pLCJhIil9LG5vTWVyaWRpZW1UaW1lRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmxvbmdEYXRlRm9ybWF0KCJMVCIpLnJlcGxhY2UoL1xzKmEkL2ksIiIpfX0sSGU9e3NtYWxsRGF5RGF0ZUZvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8iRCBkZCI6ImRkIEQifSx3ZWVrRm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzUlRMPyJ3WyAiK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIiBddyJ9LHNtYWxsV2Vla0Zvcm1hdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc1JUTD8id1siK3Qud2Vla051bWJlclRpdGxlKyJdIjoiWyIrdC53ZWVrTnVtYmVyVGl0bGUrIl13In19O2p0LmxvY2FsZSgiZW4iLEVlLmVuZ2xpc2hEZWZhdWx0cyksanQuc291cmNlTm9ybWFsaXplcnM9W10sanQuc291cmNlRmV0Y2hlcnM9W107dmFyIFRlPXtkYXRhVHlwZToianNvbiIsY2FjaGU6ITF9LHhlPTE7RWUucHJvdG90eXBlLm5vcm1hbGl6ZUV2ZW50PWZ1bmN0aW9uKHQpe30sRWUucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXt2YXIgbj10LnN0YXJ0LmNsb25lKCkuc3RyaXBab25lKCksaT10aGlzLmdldEV2ZW50RW5kKHQpLnN0cmlwWm9uZSgpO3JldHVybiBlLnN0YXJ0Pj1uJiZlLmVuZDw9aX0sRWUucHJvdG90eXBlLmdldFBlZXJFdmVudHM9ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcy5nZXRFdmVudENhY2hlKCkscz1bXTtmb3Iobj0wO248ci5sZW5ndGg7bisrKWk9cltuXSxlJiZlLl9pZD09PWkuX2lkfHxzLnB1c2goaSk7cmV0dXJuIHN9LEVlLnByb3RvdHlwZS5pc0V2ZW50U3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNvdXJjZXx8e30saT1KKGUuY29uc3RyYWludCxuLmNvbnN0cmFpbnQsdGhpcy5vcHRpb25zLmV2ZW50Q29uc3RyYWludCkscj1KKGUub3ZlcmxhcCxuLm92ZXJsYXAsdGhpcy5vcHRpb25zLmV2ZW50T3ZlcmxhcCk7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LGkscixlKSYmKCF0aGlzLm9wdGlvbnMuZXZlbnRBbGxvd3x8dGhpcy5vcHRpb25zLmV2ZW50QWxsb3codCxlKSE9PSExKX0sRWUucHJvdG90eXBlLmlzRXh0ZXJuYWxTcGFuQWxsb3dlZD1mdW5jdGlvbihlLG4saSl7dmFyIHIscztyZXR1cm4gaSYmKHI9dC5leHRlbmQoe30saSxuKSxzPXRoaXMuZXhwYW5kRXZlbnQodGhpcy5idWlsZEV2ZW50RnJvbUlucHV0KHIpKVswXSkscz90aGlzLmlzRXZlbnRTcGFuQWxsb3dlZChlLHMpOnRoaXMuaXNTZWxlY3Rpb25TcGFuQWxsb3dlZChlKX0sRWUucHJvdG90eXBlLmlzU2VsZWN0aW9uU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTcGFuQWxsb3dlZCh0LHRoaXMub3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LHRoaXMub3B0aW9ucy5zZWxlY3RPdmVybGFwKSYmKCF0aGlzLm9wdGlvbnMuc2VsZWN0QWxsb3d8fHRoaXMub3B0aW9ucy5zZWxlY3RBbGxvdyh0KSE9PSExKX0sRWUucHJvdG90eXBlLmlzU3BhbkFsbG93ZWQ9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHIscyxvLGwsYSx1O2lmKG51bGwhPWUmJihyPXRoaXMuY29uc3RyYWludFRvRXZlbnRzKGUpKSl7Zm9yKHM9ITEsbD0wO2w8ci5sZW5ndGg7bCsrKWlmKHRoaXMuc3BhbkNvbnRhaW5zU3BhbihyW2xdLHQpKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWZvcihvPXRoaXMuZ2V0UGVlckV2ZW50cyh0LGkpLGw9MDtsPG8ubGVuZ3RoO2wrKylpZihhPW9bbF0sdGhpcy5ldmVudEludGVyc2VjdHNSYW5nZShhLHQpKXtpZihuPT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4mJiFuKGEsaSkpcmV0dXJuITE7aWYoaSl7aWYodT1KKGEub3ZlcmxhcCwoYS5zb3VyY2V8fHt9KS5vdmVybGFwKSx1PT09ITEpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHUmJiF1KGksYSkpcmV0dXJuITF9fXJldHVybiEwfSxFZS5wcm90b3R5cGUuY29uc3RyYWludFRvRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiJidXNpbmVzc0hvdXJzIj09PXQ/dGhpcy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzKCk6Im9iamVjdCI9PXR5cGVvZiB0P251bGwhPXQuc3RhcnQ/dGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQodCkpOm51bGw6dGhpcy5jbGllbnRFdmVudHModCl9LEVlLnByb3RvdHlwZS5ldmVudEludGVyc2VjdHNSYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc3RhcnQuY2xvbmUoKS5zdHJpcFpvbmUoKSxpPXRoaXMuZ2V0RXZlbnRFbmQodCkuc3RyaXBab25lKCk7cmV0dXJuIGUuc3RhcnQ8aSYmZS5lbmQ+bn07dmFyIFJlPXtpZDoiX2ZjQnVzaW5lc3NIb3VycyIsc3RhcnQ6IjA5OjAwIixlbmQ6IjE3OjAwIixkb3c6WzEsMiwzLDQsNV0scmVuZGVyaW5nOiJpbnZlcnNlLWJhY2tncm91bmQifTtFZS5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsdGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpfSxFZS5wcm90b3R5cGUuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cz1mdW5jdGlvbihlLG4pe3JldHVybiBuPT09ITA/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbe31dKTp0LmlzUGxhaW5PYmplY3Qobik/dGhpcy5leHBhbmRCdXNpbmVzc0hvdXJFdmVudHMoZSxbbl0pOnQuaXNBcnJheShuKT90aGlzLmV4cGFuZEJ1c2luZXNzSG91ckV2ZW50cyhlLG4sITApOltdfSxFZS5wcm90b3R5cGUuZXhwYW5kQnVzaW5lc3NIb3VyRXZlbnRzPWZ1bmN0aW9uKGUsbixpKXt2YXIgcixzLG89dGhpcy5nZXRWaWV3KCksbD1bXTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXM9bltyXSxpJiYhcy5kb3d8fChzPXQuZXh0ZW5kKHt9LFJlLHMpLGUmJihzLnN0YXJ0PW51bGwscy5lbmQ9bnVsbCksbC5wdXNoLmFwcGx5KGwsdGhpcy5leHBhbmRFdmVudCh0aGlzLmJ1aWxkRXZlbnRGcm9tSW5wdXQocyksby5zdGFydCxvLmVuZCkpKTtyZXR1cm4gbH07dmFyIEllPWp0LkJhc2ljVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsZGF5R3JpZENsYXNzOm1lLGRheUdyaWQ6bnVsbCxkYXlOdW1iZXJzVmlzaWJsZTohMSxjb2xXZWVrTnVtYmVyc1Zpc2libGU6ITEsY2VsbFdlZWtOdW1iZXJzVmlzaWJsZTohMSx3ZWVrTnVtYmVyV2lkdGg6bnVsbCxoZWFkQ29udGFpbmVyRWw6bnVsbCxoZWFkUm93RWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCksdGhpcy5zY3JvbGxlcj1uZXcgd2Uoe292ZXJmbG93WDoiaGlkZGVuIixvdmVyZmxvd1k6ImF1dG8ifSl9LGluc3RhbnRpYXRlRGF5R3JpZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF5R3JpZENsYXNzLmV4dGVuZChrZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxzZXRSYW5nZTpmdW5jdGlvbih0KXtTZS5wcm90b3R5cGUuc2V0UmFuZ2UuY2FsbCh0aGlzLHQpLHRoaXMuZGF5R3JpZC5icmVha09uV2Vla3M9L3llYXJ8bW9udGh8d2Vlay8udGVzdCh0aGlzLmludGVydmFsVW5pdCksdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxjb21wdXRlUmFuZ2U6ZnVuY3Rpb24odCl7dmFyIGU9U2UucHJvdG90eXBlLmNvbXB1dGVSYW5nZS5jYWxsKHRoaXMsdCk7cmV0dXJuL3llYXJ8bW9udGgvLnRlc3QoZS5pbnRlcnZhbFVuaXQpJiYoZS5zdGFydC5zdGFydE9mKCJ3ZWVrIiksZS5zdGFydD10aGlzLnNraXBIaWRkZW5EYXlzKGUuc3RhcnQpLGUuZW5kLndlZWtkYXkoKSYmKGUuZW5kLmFkZCgxLCJ3ZWVrIikuc3RhcnRPZigid2VlayIpLGUuZW5kPXRoaXMuc2tpcEhpZGRlbkRheXMoZS5lbmQsLTEsITApKSksZX0scmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLmRheU51bWJlcnNWaXNpYmxlPXRoaXMuZGF5R3JpZC5yb3dDbnQ+MSx0aGlzLm9wdCgid2Vla051bWJlcnMiKSYmKHRoaXMub3B0KCJ3ZWVrTnVtYmVyc1dpdGhpbkRheXMiKT8odGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSEwLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSExKToodGhpcy5jZWxsV2Vla051bWJlcnNWaXNpYmxlPSExLHRoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlPSEwKSksdGhpcy5kYXlHcmlkLm51bWJlcnNWaXNpYmxlPXRoaXMuZGF5TnVtYmVyc1Zpc2libGV8fHRoaXMuY2VsbFdlZWtOdW1iZXJzVmlzaWJsZXx8dGhpcy5jb2xXZWVrTnVtYmVyc1Zpc2libGUsdGhpcy5lbC5hZGRDbGFzcygiZmMtYmFzaWMtdmlldyIpLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSksdGhpcy5yZW5kZXJIZWFkKCksdGhpcy5zY3JvbGxlci5yZW5kZXIoKTt2YXIgZT10aGlzLnNjcm9sbGVyLmVsLmFkZENsYXNzKCJmYy1kYXktZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIiAvPicpLmFwcGVuZFRvKGUpO3RoaXMuZWwuZmluZCgiLmZjLWJvZHkgPiB0ciA+IHRkIikuYXBwZW5kKGUpLHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KG4pLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcyh0aGlzLmhhc1JpZ2lkUm93cygpKX0scmVuZGVySGVhZDpmdW5jdGlvbigpe3RoaXMuaGVhZENvbnRhaW5lckVsPXRoaXMuZWwuZmluZCgiLmZjLWhlYWQtY29udGFpbmVyIikuaHRtbCh0aGlzLmRheUdyaWQucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkUm93RWw9dGhpcy5oZWFkQ29udGFpbmVyRWwuZmluZCgiLmZjLXJvdyIpfSx1bnJlbmRlckRhdGVzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLmRheUdyaWQucmVtb3ZlRWxlbWVudCgpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sdW5yZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPid9LHdlZWtOdW1iZXJTdHlsZUF0dHI6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMud2Vla051bWJlcldpZHRoPydzdHlsZT0id2lkdGg6Jyt0aGlzLndlZWtOdW1iZXJXaWR0aCsncHgiJzoiIn0saGFzUmlnaWRSb3dzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHQoImV2ZW50TGltaXQiKTtyZXR1cm4gdCYmIm51bWJlciIhPXR5cGVvZiB0fSx1cGRhdGVXaWR0aDpmdW5jdGlvbigpe3RoaXMuY29sV2Vla051bWJlcnNWaXNpYmxlJiYodGhpcy53ZWVrTnVtYmVyV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy13ZWVrLW51bWJlciIpKSl9LHNldEhlaWdodDpmdW5jdGlvbih0LGUpe3ZhciBuLHMsbz10aGlzLm9wdCgiZXZlbnRMaW1pdCIpO3RoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMuaGVhZFJvd0VsKSx0aGlzLmRheUdyaWQucmVtb3ZlU2VnUG9wb3ZlcigpLG8mJiJudW1iZXIiPT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2V0R3JpZEhlaWdodChuLGUpLG8mJiJudW1iZXIiIT10eXBlb2YgbyYmdGhpcy5kYXlHcmlkLmxpbWl0Um93cyhvKSxlfHwodGhpcy5zY3JvbGxlci5zZXRIZWlnaHQobikscz10aGlzLnNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpLChzLmxlZnR8fHMucmlnaHQpJiYoaSh0aGlzLmhlYWRSb3dFbCxzKSxuPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KG4pKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhzKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHNldEdyaWRIZWlnaHQ6ZnVuY3Rpb24odCxlKXtlP2EodGhpcy5kYXlHcmlkLnJvd0Vscyk6bCh0aGlzLmRheUdyaWQucm93RWxzLHQsITApfSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpfSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRheUdyaWQuZ2V0SGl0U3Bhbih0KX0sZ2V0SGl0RWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRIaXRFbCh0KX0scmVuZGVyRXZlbnRzOmZ1bmN0aW9uKHQpe3RoaXMuZGF5R3JpZC5yZW5kZXJFdmVudHModCksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5nZXRFdmVudFNlZ3MoKX0sdW5yZW5kZXJFdmVudHM6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJFdmVudHMoKX0scmVuZGVyRHJhZzpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpfSx1bnJlbmRlckRyYWc6ZnVuY3Rpb24oKXt0aGlzLmRheUdyaWQudW5yZW5kZXJEcmFnKCl9LHJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbih0KXt0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLGtlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRoIGNsYXNzPSJmYy13ZWVrLW51bWJlciAnK3Qud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdHQodC5vcHQoIndlZWtOdW1iZXJUaXRsZSIpKSsiPC9zcGFuPjwvdGg+IjoiIn0scmVuZGVyTnVtYmVySW50cm9IdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudmlldyxuPXRoaXMuZ2V0Q2VsbERhdGUodCwwKTtyZXR1cm4gZS5jb2xXZWVrTnVtYmVyc1Zpc2libGU/Jzx0ZCBjbGFzcz0iZmMtd2Vlay1udW1iZXIiICcrZS53ZWVrTnVtYmVyU3R5bGVBdHRyKCkrIj4iK2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh7ZGF0ZTpuLHR5cGU6IndlZWsiLGZvcmNlT2ZmOjE9PT10aGlzLmNvbENudH0sbi5mb3JtYXQoInciKSkrIjwvdGQ+IjoiIn0scmVuZGVyQmdJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuIHQuY29sV2Vla051bWJlcnNWaXNpYmxlPyc8dGQgY2xhc3M9ImZjLXdlZWstbnVtYmVyICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn0scmVuZGVySW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybiB0LmNvbFdlZWtOdW1iZXJzVmlzaWJsZT8nPHRkIGNsYXNzPSJmYy13ZWVrLW51bWJlciIgJyt0LndlZWtOdW1iZXJTdHlsZUF0dHIoKSsiPjwvdGQ+IjoiIn19LE1lPWp0Lk1vbnRoVmlldz1JZS5leHRlbmQoe2NvbXB1dGVSYW5nZTpmdW5jdGlvbih0KXt2YXIgZSxuPUllLnByb3RvdHlwZS5jb21wdXRlUmFuZ2UuY2FsbCh0aGlzLHQpO3JldHVybiB0aGlzLmlzRml4ZWRXZWVrcygpJiYoZT1NYXRoLmNlaWwobi5lbmQuZGlmZihuLnN0YXJ0LCJ3ZWVrcyIsITApKSxuLmVuZC5hZGQoNi1lLCJ3ZWVrcyIpKSxufSxzZXRHcmlkSGVpZ2h0OmZ1bmN0aW9uKHQsZSl7ZSYmKHQqPXRoaXMucm93Q250LzYpLGwodGhpcy5kYXlHcmlkLnJvd0Vscyx0LCFlKX0saXNGaXhlZFdlZWtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJmaXhlZFdlZWtDb3VudCIpfX0pO1V0LmJhc2ljPXtjbGFzczpJZX0sVXQuYmFzaWNEYXk9e3R5cGU6ImJhc2ljIixkdXJhdGlvbjp7ZGF5czoxfX0sVXQuYmFzaWNXZWVrPXt0eXBlOiJiYXNpYyIsZHVyYXRpb246e3dlZWtzOjF9fSxVdC5tb250aD17Y2xhc3M6TWUsZHVyYXRpb246e21vbnRoczoxfSxkZWZhdWx0czp7Zml4ZWRXZWVrQ291bnQ6ITB9fTt2YXIgTGU9anQuQWdlbmRhVmlldz1TZS5leHRlbmQoe3Njcm9sbGVyOm51bGwsdGltZUdyaWRDbGFzczp5ZSx0aW1lR3JpZDpudWxsLGRheUdyaWRDbGFzczptZSxkYXlHcmlkOm51bGwsYXhpc1dpZHRoOm51bGwsaGVhZENvbnRhaW5lckVsOm51bGwsbm9TY3JvbGxSb3dFbHM6bnVsbCxib3R0b21SdWxlRWw6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlVGltZUdyaWQoKSx0aGlzLm9wdCgiYWxsRGF5U2xvdCIpJiYodGhpcy5kYXlHcmlkPXRoaXMuaW5zdGFudGlhdGVEYXlHcmlkKCkpLHRoaXMuc2Nyb2xsZXI9bmV3IHdlKHtvdmVyZmxvd1g6ImhpZGRlbiIsb3ZlcmZsb3dZOiJhdXRvIn0pfSxpbnN0YW50aWF0ZVRpbWVHcmlkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aW1lR3JpZENsYXNzLmV4dGVuZChCZSk7cmV0dXJuIG5ldyB0KHRoaXMpfSxpbnN0YW50aWF0ZURheUdyaWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRheUdyaWRDbGFzcy5leHRlbmQoemUpO3JldHVybiBuZXcgdCh0aGlzKX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLnRpbWVHcmlkLnNldFJhbmdlKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJhbmdlKHQpfSxyZW5kZXJEYXRlczpmdW5jdGlvbigpe3RoaXMuZWwuYWRkQ2xhc3MoImZjLWFnZW5kYS12aWV3IikuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlckhlYWQoKSx0aGlzLnNjcm9sbGVyLnJlbmRlcigpO3ZhciBlPXRoaXMuc2Nyb2xsZXIuZWwuYWRkQ2xhc3MoImZjLXRpbWUtZ3JpZC1jb250YWluZXIiKSxuPXQoJzxkaXYgY2xhc3M9ImZjLXRpbWUtZ3JpZCIgLz4nKS5hcHBlbmRUbyhlKTt0aGlzLmVsLmZpbmQoIi5mYy1ib2R5ID4gdHIgPiB0ZCIpLmFwcGVuZChlKSx0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQobiksdGhpcy50aW1lR3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuYm90dG9tUnVsZUVsPXQoJzxociBjbGFzcz0iZmMtZGl2aWRlciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyIvPicpLmFwcGVuZFRvKHRoaXMudGltZUdyaWQuZWwpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5zZXRFbGVtZW50KHRoaXMuZWwuZmluZCgiLmZjLWRheS1ncmlkIikpLHRoaXMuZGF5R3JpZC5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5ib3R0b21Db29yZFBhZGRpbmc9dGhpcy5kYXlHcmlkLmVsLm5leHQoImhyIikub3V0ZXJIZWlnaHQoKSksdGhpcy5ub1Njcm9sbFJvd0Vscz10aGlzLmVsLmZpbmQoIi5mYy1yb3c6bm90KC5mYy1zY3JvbGxlciAqKSIpfSxyZW5kZXJIZWFkOmZ1bmN0aW9uKCl7dGhpcy5oZWFkQ29udGFpbmVyRWw9dGhpcy5lbC5maW5kKCIuZmMtaGVhZC1jb250YWluZXIiKS5odG1sKHRoaXMudGltZUdyaWQucmVuZGVySGVhZEh0bWwoKSl9LHVucmVuZGVyRGF0ZXM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKSx0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmRheUdyaWQmJih0aGlzLmRheUdyaWQudW5yZW5kZXJEYXRlcygpLHRoaXMuZGF5R3JpZC5yZW1vdmVFbGVtZW50KCkpLHRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxyZW5kZXJTa2VsZXRvbkh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4nPHRhYmxlPjx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+PHRyPjx0ZCBjbGFzcz0iZmMtaGVhZC1jb250YWluZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+PC90cj48L3RoZWFkPjx0Ym9keSBjbGFzcz0iZmMtYm9keSI+PHRyPjx0ZCBjbGFzcz0iJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyh0aGlzLmRheUdyaWQ/JzxkaXYgY2xhc3M9ImZjLWRheS1ncmlkIi8+PGhyIGNsYXNzPSJmYy1kaXZpZGVyICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIi8+JzoiIikrIjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+In0sYXhpc1N0eWxlQXR0cjpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5heGlzV2lkdGg/J3N0eWxlPSJ3aWR0aDonK3RoaXMuYXhpc1dpZHRoKydweCInOiIifSxyZW5kZXJCdXNpbmVzc0hvdXJzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCksdGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyQnVzaW5lc3NIb3VycygpfSx1bnJlbmRlckJ1c2luZXNzSG91cnM6ZnVuY3Rpb24oKXt0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpfSxnZXROb3dJbmRpY2F0b3JVbml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpfSxyZW5kZXJOb3dJbmRpY2F0b3I6ZnVuY3Rpb24odCl7dGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LHVucmVuZGVyTm93SW5kaWNhdG9yOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlck5vd0luZGljYXRvcigpfSx1cGRhdGVTaXplOmZ1bmN0aW9uKHQpe3RoaXMudGltZUdyaWQudXBkYXRlU2l6ZSh0KSxTZS5wcm90b3R5cGUudXBkYXRlU2l6ZS5jYWxsKHRoaXMsdCl9LHVwZGF0ZVdpZHRoOmZ1bmN0aW9uKCl7dGhpcy5heGlzV2lkdGg9dSh0aGlzLmVsLmZpbmQoIi5mYy1heGlzIikpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt2YXIgbixzLG87dGhpcy5ib3R0b21SdWxlRWwuaGlkZSgpLHRoaXMuc2Nyb2xsZXIuY2xlYXIoKSxyKHRoaXMubm9TY3JvbGxSb3dFbHMpLHRoaXMuZGF5R3JpZCYmKHRoaXMuZGF5R3JpZC5yZW1vdmVTZWdQb3BvdmVyKCksbj10aGlzLm9wdCgiZXZlbnRMaW1pdCIpLG4mJiJudW1iZXIiIT10eXBlb2YgbiYmKG49RmUpLG4mJnRoaXMuZGF5R3JpZC5saW1pdFJvd3MobikpLGV8fChzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpLG89dGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKSwoby5sZWZ0fHxvLnJpZ2h0KSYmKGkodGhpcy5ub1Njcm9sbFJvd0VscyxvKSxzPXRoaXMuY29tcHV0ZVNjcm9sbGVySGVpZ2h0KHQpLHRoaXMuc2Nyb2xsZXIuc2V0SGVpZ2h0KHMpKSx0aGlzLnNjcm9sbGVyLmxvY2tPdmVyZmxvdyhvKSx0aGlzLnRpbWVHcmlkLmdldFRvdGFsU2xhdEhlaWdodCgpPHMmJnRoaXMuYm90dG9tUnVsZUVsLnNob3coKSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LGNvbXB1dGVJbml0aWFsU2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIHQ9ZS5kdXJhdGlvbih0aGlzLm9wdCgic2Nyb2xsVGltZSIpKSxuPXRoaXMudGltZUdyaWQuY29tcHV0ZVRpbWVUb3AodCk7cmV0dXJuIG49TWF0aC5jZWlsKG4pLG4mJm4rKyxufSxxdWVyeVNjcm9sbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbGVyLmdldFNjcm9sbFRvcCgpfSxzZXRTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxlci5zZXRTY3JvbGxUb3AodCl9LHByZXBhcmVIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnByZXBhcmVIaXRzKCl9LHJlbGVhc2VIaXRzOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnJlbGVhc2VIaXRzKCl9LHF1ZXJ5SGl0OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50aW1lR3JpZC5xdWVyeUhpdCh0LGUpO3JldHVybiFuJiZ0aGlzLmRheUdyaWQmJihuPXRoaXMuZGF5R3JpZC5xdWVyeUhpdCh0LGUpKSxufSxnZXRIaXRTcGFuOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBvbmVudC5nZXRIaXRTcGFuKHQpfSxnZXRIaXRFbDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wb25lbnQuZ2V0SGl0RWwodCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W10scj1bXSxzPVtdO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXS5hbGxEYXk/aS5wdXNoKHRbbl0pOnIucHVzaCh0W25dKTtlPXRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHIpLHRoaXMuZGF5R3JpZCYmKHM9dGhpcy5kYXlHcmlkLnJlbmRlckV2ZW50cyhpKSksdGhpcy51cGRhdGVIZWlnaHQoKX0sZ2V0RXZlbnRTZWdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCkuY29uY2F0KHRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQuZ2V0RXZlbnRTZWdzKCk6W10pfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckV2ZW50cygpfSxyZW5kZXJEcmFnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQuaGFzVGltZSgpP3RoaXMudGltZUdyaWQucmVuZGVyRHJhZyh0LGUpOnRoaXMuZGF5R3JpZD90aGlzLmRheUdyaWQucmVuZGVyRHJhZyh0LGUpOnZvaWQgMH0sdW5yZW5kZXJEcmFnOmZ1bmN0aW9uKCl7dGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlckRyYWcoKX0scmVuZGVyU2VsZWN0aW9uOmZ1bmN0aW9uKHQpe3Quc3RhcnQuaGFzVGltZSgpfHx0LmVuZC5oYXNUaW1lKCk/dGhpcy50aW1lR3JpZC5yZW5kZXJTZWxlY3Rpb24odCk6dGhpcy5kYXlHcmlkJiZ0aGlzLmRheUdyaWQucmVuZGVyU2VsZWN0aW9uKHQpfSx1bnJlbmRlclNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMudGltZUdyaWQudW5yZW5kZXJTZWxlY3Rpb24oKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnJlbmRlclNlbGVjdGlvbigpfX0pLEJlPXtyZW5kZXJIZWFkSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnZpZXc7cmV0dXJuIGUub3B0KCJ3ZWVrTnVtYmVycyIpPyh0PXRoaXMuc3RhcnQuZm9ybWF0KGUub3B0KCJzbWFsbFdlZWtGb3JtYXQiKSksJzx0aCBjbGFzcz0iZmMtYXhpcyBmYy13ZWVrLW51bWJlciAnK2Uud2lkZ2V0SGVhZGVyQ2xhc3MrJyIgJytlLmF4aXNTdHlsZUF0dHIoKSsiPiIrZS5idWlsZEdvdG9BbmNob3JIdG1sKHtkYXRlOnRoaXMuc3RhcnQsdHlwZToid2VlayIsZm9yY2VPZmY6dGhpcy5jb2xDbnQ+MX0sdHQodCkpKyI8L3RoPiIpOic8dGggY2xhc3M9ImZjLWF4aXMgJytlLndpZGdldEhlYWRlckNsYXNzKyciICcrZS5heGlzU3R5bGVBdHRyKCkrIj48L3RoPiJ9LHJlbmRlckJnSW50cm9IdG1sOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3O3JldHVybic8dGQgY2xhc3M9ImZjLWF4aXMgJyt0LndpZGdldENvbnRlbnRDbGFzcysnIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifSxyZW5kZXJJbnRyb0h0bWw6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXc7cmV0dXJuJzx0ZCBjbGFzcz0iZmMtYXhpcyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjwvdGQ+In19LHplPXtyZW5kZXJCZ0ludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzICcrdC53aWRnZXRDb250ZW50Q2xhc3MrJyIgJyt0LmF4aXNTdHlsZUF0dHIoKSsiPjxzcGFuPiIrdC5nZXRBbGxEYXlIdG1sKCkrIjwvc3Bhbj48L3RkPiJ9LHJlbmRlckludHJvSHRtbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlldztyZXR1cm4nPHRkIGNsYXNzPSJmYy1heGlzIiAnK3QuYXhpc1N0eWxlQXR0cigpKyI+PC90ZD4ifX0sRmU9NSxOZT1be2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se3NlY29uZHM6MzB9LHtzZWNvbmRzOjE1fV07VXQuYWdlbmRhPXtjbGFzczpMZSxkZWZhdWx0czp7YWxsRGF5U2xvdDohMCxzbG90RHVyYXRpb246IjAwOjMwOjAwIixtaW5UaW1lOiIwMDowMDowMCIsbWF4VGltZToiMjQ6MDA6MDAiLHNsb3RFdmVudE92ZXJsYXA6ITB9fSxVdC5hZ2VuZGFEYXk9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e2RheXM6MX19LFV0LmFnZW5kYVdlZWs9e3R5cGU6ImFnZW5kYSIsZHVyYXRpb246e3dlZWtzOjF9fTt2YXIgR2U9U2UuZXh0ZW5kKHtncmlkOm51bGwsc2Nyb2xsZXI6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5ncmlkPW5ldyBBZSh0aGlzKSx0aGlzLnNjcm9sbGVyPW5ldyB3ZSh7b3ZlcmZsb3dYOiJoaWRkZW4iLG92ZXJmbG93WToiYXV0byJ9KX0sc2V0UmFuZ2U6ZnVuY3Rpb24odCl7U2UucHJvdG90eXBlLnNldFJhbmdlLmNhbGwodGhpcyx0KSx0aGlzLmdyaWQuc2V0UmFuZ2UodCl9LHJlbmRlclNrZWxldG9uOmZ1bmN0aW9uKCl7dGhpcy5lbC5hZGRDbGFzcygiZmMtbGlzdC12aWV3ICIrdGhpcy53aWRnZXRDb250ZW50Q2xhc3MpLHRoaXMuc2Nyb2xsZXIucmVuZGVyKCksdGhpcy5zY3JvbGxlci5lbC5hcHBlbmRUbyh0aGlzLmVsKSx0aGlzLmdyaWQuc2V0RWxlbWVudCh0aGlzLnNjcm9sbGVyLnNjcm9sbEVsKX0sdW5yZW5kZXJTa2VsZXRvbjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuZGVzdHJveSgpfSxzZXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXt0aGlzLnNjcm9sbGVyLnNldEhlaWdodCh0aGlzLmNvbXB1dGVTY3JvbGxlckhlaWdodCh0KSl9LGNvbXB1dGVTY3JvbGxlckhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdC1kKHRoaXMuZWwsdGhpcy5zY3JvbGxlci5lbCl9LHJlbmRlckV2ZW50czpmdW5jdGlvbih0KXt0aGlzLmdyaWQucmVuZGVyRXZlbnRzKHQpfSx1bnJlbmRlckV2ZW50czpmdW5jdGlvbigpe3RoaXMuZ3JpZC51bnJlbmRlckV2ZW50cygpfSxpc0V2ZW50UmVzaXphYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfSxpc0V2ZW50RHJhZ2dhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiExfX0pLEFlPXBlLmV4dGVuZCh7c2VnU2VsZWN0b3I6Ii5mYy1saXN0LWl0ZW0iLGhhc0RheUludGVyYWN0aW9uczohMSxzcGFuVG9TZWdzOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMudmlldyxpPW4uc3RhcnQuY2xvbmUoKS50aW1lKDApLHI9MCxzPVtdO2k8bi5lbmQ7KWlmKGU9Rih0LHtzdGFydDppLGVuZDppLmNsb25lKCkuYWRkKDEsImRheSIpfSksZSYmKGUuZGF5SW5kZXg9cixzLnB1c2goZSkpLGkuYWRkKDEsImRheSIpLHIrKyxlJiYhZS5pc0VuZCYmdC5lbmQuaGFzVGltZSgpJiZ0LmVuZDxpLmNsb25lKCkuYWRkKHRoaXMudmlldy5uZXh0RGF5VGhyZXNob2xkKSl7ZS5lbmQ9dC5lbmQuY2xvbmUoKSxlLmlzRW5kPSEwO2JyZWFrfXJldHVybiBzfSxjb21wdXRlRXZlbnRUaW1lRm9ybWF0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKX0saGFuZGxlU2VnQ2xpY2s6ZnVuY3Rpb24oZSxuKXt2YXIgaTtwZS5wcm90b3R5cGUuaGFuZGxlU2VnQ2xpY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLHQobi50YXJnZXQpLmNsb3Nlc3QoImFbaHJlZl0iKS5sZW5ndGh8fChpPWUuZXZlbnQudXJsLGkmJiFuLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYod2luZG93LmxvY2F0aW9uLmhyZWY9aSkpfSxyZW5kZXJGZ1NlZ3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5yZW5kZXJGZ1NlZ0Vscyh0KSx0Lmxlbmd0aD90aGlzLnJlbmRlclNlZ0xpc3QodCk6dGhpcy5yZW5kZXJFbXB0eU1lc3NhZ2UoKSx0fSxyZW5kZXJFbXB0eU1lc3NhZ2U6ZnVuY3Rpb24oKXt0aGlzLmVsLmh0bWwoJzxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDIiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHktd3JhcDEiPjxkaXYgY2xhc3M9ImZjLWxpc3QtZW1wdHkiPicrdHQodGhpcy52aWV3Lm9wdCgibm9FdmVudHNNZXNzYWdlIikpKyI8L2Rpdj48L2Rpdj48L2Rpdj4iKX0scmVuZGVyU2VnTGlzdDpmdW5jdGlvbihlKXt2YXIgbixpLHIscz10aGlzLmdyb3VwU2Vnc0J5RGF5KGUpLG89dCgnPHRhYmxlIGNsYXNzPSJmYy1saXN0LXRhYmxlIj48dGJvZHkvPjwvdGFibGU+JyksbD1vLmZpbmQoInRib2R5Iik7Zm9yKG49MDtuPHMubGVuZ3RoO24rKylpZihpPXNbbl0pZm9yKGwuYXBwZW5kKHRoaXMuZGF5SGVhZGVySHRtbCh0aGlzLnZpZXcuc3RhcnQuY2xvbmUoKS5hZGQobiwiZGF5cyIpKSksdGhpcy5zb3J0RXZlbnRTZWdzKGkpLHI9MDtyPGkubGVuZ3RoO3IrKylsLmFwcGVuZChpW3JdLmVsKTt0aGlzLmVsLmVtcHR5KCkuYXBwZW5kKG8pfSxncm91cFNlZ3NCeURheTpmdW5jdGlvbih0KXt2YXIgZSxuLGk9W107Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyluPXRbZV0sKGlbbi5kYXlJbmRleF18fChpW24uZGF5SW5kZXhdPVtdKSkucHVzaChuKTtyZXR1cm4gaX0sZGF5SGVhZGVySHRtbDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnZpZXcsbj1lLm9wdCgibGlzdERheUZvcm1hdCIpLGk9ZS5vcHQoImxpc3REYXlBbHRGb3JtYXQiKTtyZXR1cm4nPHRyIGNsYXNzPSJmYy1saXN0LWhlYWRpbmciIGRhdGEtZGF0ZT0iJyt0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciPjx0ZCBjbGFzcz0iJytlLndpZGdldEhlYWRlckNsYXNzKyciIGNvbHNwYW49IjMiPicrKG4/ZS5idWlsZEdvdG9BbmNob3JIdG1sKHQse2NsYXNzOiJmYy1saXN0LWhlYWRpbmctbWFpbiJ9LHR0KHQuZm9ybWF0KG4pKSk6IiIpKyhpP2UuYnVpbGRHb3RvQW5jaG9ySHRtbCh0LHtjbGFzczoiZmMtbGlzdC1oZWFkaW5nLWFsdCJ9LHR0KHQuZm9ybWF0KGkpKSk6IiIpKyI8L3RkPjwvdHI+In0sZmdTZWdIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy52aWV3LGk9WyJmYy1saXN0LWl0ZW0iXS5jb25jYXQodGhpcy5nZXRTZWdDdXN0b21DbGFzc2VzKHQpKSxyPXRoaXMuZ2V0U2VnQmFja2dyb3VuZENvbG9yKHQpLHM9dC5ldmVudCxvPXMudXJsO3JldHVybiBlPXMuYWxsRGF5P24uZ2V0QWxsRGF5SHRtbCgpOm4uaXNNdWx0aURheUV2ZW50KHMpP3QuaXNTdGFydHx8dC5pc0VuZD90dCh0aGlzLmdldEV2ZW50VGltZVRleHQodCkpOm4uZ2V0QWxsRGF5SHRtbCgpOnR0KHRoaXMuZ2V0RXZlbnRUaW1lVGV4dChzKSksbyYmaS5wdXNoKCJmYy1oYXMtdXJsIiksJzx0ciBjbGFzcz0iJytpLmpvaW4oIiAiKSsnIj4nKyh0aGlzLmRpc3BsYXlFdmVudFRpbWU/Jzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLXRpbWUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj4nKyhlfHwiIikrIjwvdGQ+IjoiIikrJzx0ZCBjbGFzcz0iZmMtbGlzdC1pdGVtLW1hcmtlciAnK24ud2lkZ2V0Q29udGVudENsYXNzKyciPjxzcGFuIGNsYXNzPSJmYy1ldmVudC1kb3QiJysocj8nIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicrcisnIic6IiIpKyc+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJmYy1saXN0LWl0ZW0tdGl0bGUgJytuLndpZGdldENvbnRlbnRDbGFzcysnIj48YScrKG8/JyBocmVmPSInK3R0KG8pKyciJzoiIikrIj4iK3R0KHQuZXZlbnQudGl0bGV8fCIiKSsiPC9hPjwvdGQ+PC90cj4ifX0pO3JldHVybiBVdC5saXN0PXtjbGFzczpHZSxidXR0b25UZXh0S2V5OiJsaXN0IixkZWZhdWx0czp7YnV0dG9uVGV4dDoibGlzdCIsbGlzdERheUZvcm1hdDoiTEwiLG5vRXZlbnRzTWVzc2FnZToiTm8gZXZlbnRzIHRvIGRpc3BsYXkifX0sVXQubGlzdERheT17dHlwZToibGlzdCIsZHVyYXRpb246e2RheXM6MX0sZGVmYXVsdHM6e2xpc3REYXlGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFdlZWs9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt3ZWVrczoxfSxkZWZhdWx0czp7bGlzdERheUZvcm1hdDoiZGRkZCIsbGlzdERheUFsdEZvcm1hdDoiTEwifX0sVXQubGlzdE1vbnRoPXt0eXBlOiJsaXN0IixkdXJhdGlvbjp7bW9udGg6MX0sZGVmYXVsdHM6e2xpc3REYXlBbHRGb3JtYXQ6ImRkZGQifX0sVXQubGlzdFllYXI9e3R5cGU6Imxpc3QiLGR1cmF0aW9uOnt5ZWFyOjF9LGRlZmF1bHRzOntsaXN0RGF5QWx0Rm9ybWF0OiJkZGRkIn19LGp0fSk7
Ci8qIQpGdWxsQ2FsZW5kYXIgU2NoZWR1bGVyIHYxLjQuMApEb2NzICYgTGljZW5zZTogaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zY2hlZHVsZXIvCihjKSAyMDE2IEFkYW0gU2hhdwogKi8KKGZ1bmN0aW9uKGZhY3RvcnkpIHsKCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKCQlkZWZpbmUoWyAnanF1ZXJ5JywgJ21vbWVudCcsICdmdWxsY2FsZW5kYXInIF0sIGZhY3RvcnkpOwoJfQoJZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7IC8vIE5vZGUvQ29tbW9uSlMKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoCgkJCXJlcXVpcmUoJ2pxdWVyeScpLAoJCQlyZXF1aXJlKCdtb21lbnQnKSwKCQkJcmVxdWlyZSgnZnVsbGNhbGVuZGFyJykKCQkpOwoJfQoJZWxzZSB7CgkJZmFjdG9yeShqUXVlcnksIG1vbWVudCk7Cgl9Cn0pKGZ1bmN0aW9uKCQsIG1vbWVudCkgezsKdmFyIENPTF9NSU5fV0lEVEgsIENhbGVuZGFyLCBDYWxlbmRhckV4dGVuc2lvbiwgQ2xhc3MsIENsaXBwZWRTY3JvbGxlciwgQ29vcmRDYWNoZSwgREVGQVVMVF9HUklEX0RVUkFUSU9OLCBEcmFnTGlzdGVuZXIsIEVtaXR0ZXJNaXhpbiwgRW5oYW5jZWRTY3JvbGxlciwgRXZlbnRSb3csIEZDLCBHcmlkLCBIUm93R3JvdXAsIExJQ0VOU0VfSU5GT19VUkwsIExpc3RlbmVyTWl4aW4sIE1BWF9BVVRPX0NFTExTLCBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwsIE1BWF9DRUxMUywgTUlOX0FVVE9fTEFCRUxTLCBQUkVTRVRfTElDRU5TRV9LRVlTLCBSRUxFQVNFX0RBVEUsIFJlc291cmNlQWdlbmRhVmlldywgUmVzb3VyY2VCYXNpY1ZpZXcsIFJlc291cmNlRGF5R3JpZCwgUmVzb3VyY2VEYXlUYWJsZU1peGluLCBSZXNvdXJjZUdyaWRNaXhpbiwgUmVzb3VyY2VNYW5hZ2VyLCBSZXNvdXJjZU1vbnRoVmlldywgUmVzb3VyY2VSb3csIFJlc291cmNlVGltZUdyaWQsIFJlc291cmNlVGltZWxpbmVHcmlkLCBSZXNvdXJjZVRpbWVsaW5lVmlldywgUmVzb3VyY2VWaWV3TWl4aW4sIFJvd0dyb3VwLCBSb3dQYXJlbnQsIFNUT0NLX1NVQl9EVVJBVElPTlMsIFNjcm9sbEZvbGxvd2VyLCBTY3JvbGxGb2xsb3dlclNwcml0ZSwgU2Nyb2xsSm9pbmVyLCBTY3JvbGxlckNhbnZhcywgU3ByZWFkc2hlZXQsIFRpbWVsaW5lR3JpZCwgVGltZWxpbmVWaWV3LCBVUEdSQURFX1dJTkRPVywgVlJvd0dyb3VwLCBWaWV3LCBhcHBseUFsbCwgY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCBjb21wYXJlQnlGaWVsZFNwZWNzLCBjb21wdXRlSW50ZXJ2YWxVbml0LCBjb21wdXRlT2Zmc2V0Rm9yU2VnLCBjb21wdXRlT2Zmc2V0Rm9yU2VncywgY29weVJlY3QsIGNzc1RvU3RyLCBkZWJvdW5jZSwgZGV0ZWN0V2FybmluZ0luQ29udGFpbmVyLCBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24sIGRpdmlkZVJhbmdlQnlEdXJhdGlvbiwgZHVyYXRpb25IYXNUaW1lLCBmbGV4aWJsZUNvbXBhcmUsIGdldENvbnRlbnRSZWN0LCBnZXRPdXRlclJlY3QsIGdldE93bkNlbGxzLCBnZXRSZWN0SGVpZ2h0LCBnZXRSZWN0V2lkdGgsIGdldFNjcm9sbGJhcldpZHRocywgaENvbnRhaW5SZWN0LCBodG1sRXNjYXBlLCBpbnRlcnNlY3RSYW5nZXMsIGludGVyc2VjdFJlY3RzLCBpc0ltbXVuZVVybCwgaXNJbnQsIGlzVmFsaWRLZXksIGpvaW5SZWN0cywgbXVsdGlwbHlEdXJhdGlvbiwgb3JpZ0Rpc3BsYXlFdmVudHMsIG9yaWdEaXNwbGF5Vmlldywgb3JpZ0dldFNlZ0N1c3RvbUNsYXNzZXMsIG9yaWdHZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yLCBvcmlnR2V0U2VnRGVmYXVsdFRleHRDb2xvciwgb3JpZ1JlbmRlclNrZWxldG9uLCBvcmlnVW5yZW5kZXJTa2VsZXRvbiwgcGFyc2VGaWVsZFNwZWNzLCBwcm9jZXNzTGljZW5zZUtleSwgcHJveHksIHJlbmRlcmluZ1dhcm5pbmdJbkNvbnRhaW5lciwgc3luY1RoZW4sIHRlc3RSZWN0Q29udGFpbnMsIHRlc3RSZWN0SENvbnRhaW5zLCB0ZXN0UmVjdFZDb250YWlucywgdGltZVJvd1NlZ3NDb2xsaWRlLCB2Q29udGFpblJlY3QsCiAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LAogIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSwKICBpbmRleE9mID0gW10uaW5kZXhPZiB8fCBmdW5jdGlvbihpdGVtKSB7IGZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsgfSByZXR1cm4gLTE7IH0sCiAgc2xpY2UgPSBbXS5zbGljZTsKCkZDID0gJC5mdWxsQ2FsZW5kYXI7CgpGQy5zY2hlZHVsZXJWZXJzaW9uID0gIjEuNC4wIjsKCmlmIChGQy5pbnRlcm5hbEFwaVZlcnNpb24gIT09IDYpIHsKICBGQy53YXJuKCd2JyArIEZDLnNjaGVkdWxlclZlcnNpb24gKyAnIG9mIEZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgJyArICdpcyBpbmNvbXBhdGlibGUgd2l0aCB2JyArIEZDLnZlcnNpb24gKyAnIG9mIHRoZSBjb3JlLlxuJyArICdQbGVhc2Ugc2VlIGh0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc3VwcG9ydC8gZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7CiAgcmV0dXJuOwp9CgpDYWxlbmRhciA9IEZDLkNhbGVuZGFyOwoKQ2xhc3MgPSBGQy5DbGFzczsKClZpZXcgPSBGQy5WaWV3OwoKR3JpZCA9IEZDLkdyaWQ7CgppbnRlcnNlY3RSYW5nZXMgPSBGQy5pbnRlcnNlY3RSYW5nZXM7CgpkZWJvdW5jZSA9IEZDLmRlYm91bmNlOwoKaXNJbnQgPSBGQy5pc0ludDsKCmdldFNjcm9sbGJhcldpZHRocyA9IEZDLmdldFNjcm9sbGJhcldpZHRoczsKCkRyYWdMaXN0ZW5lciA9IEZDLkRyYWdMaXN0ZW5lcjsKCmh0bWxFc2NhcGUgPSBGQy5odG1sRXNjYXBlOwoKY29tcHV0ZUludGVydmFsVW5pdCA9IEZDLmNvbXB1dGVJbnRlcnZhbFVuaXQ7Cgpwcm94eSA9IEZDLnByb3h5OwoKY2FwaXRhbGlzZUZpcnN0TGV0dGVyID0gRkMuY2FwaXRhbGlzZUZpcnN0TGV0dGVyOwoKYXBwbHlBbGwgPSBGQy5hcHBseUFsbDsKCkVtaXR0ZXJNaXhpbiA9IEZDLkVtaXR0ZXJNaXhpbjsKCkxpc3RlbmVyTWl4aW4gPSBGQy5MaXN0ZW5lck1peGluOwoKZHVyYXRpb25IYXNUaW1lID0gRkMuZHVyYXRpb25IYXNUaW1lOwoKZGl2aWRlUmFuZ2VCeUR1cmF0aW9uID0gRkMuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uOwoKZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uID0gRkMuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uOwoKbXVsdGlwbHlEdXJhdGlvbiA9IEZDLm11bHRpcGx5RHVyYXRpb247CgpwYXJzZUZpZWxkU3BlY3MgPSBGQy5wYXJzZUZpZWxkU3BlY3M7Cgpjb21wYXJlQnlGaWVsZFNwZWNzID0gRkMuY29tcGFyZUJ5RmllbGRTcGVjczsKCmZsZXhpYmxlQ29tcGFyZSA9IEZDLmZsZXhpYmxlQ29tcGFyZTsKCmludGVyc2VjdFJlY3RzID0gRkMuaW50ZXJzZWN0UmVjdHM7CgpDb29yZENhY2hlID0gRkMuQ29vcmRDYWNoZTsKCmdldENvbnRlbnRSZWN0ID0gRkMuZ2V0Q29udGVudFJlY3Q7CgpnZXRPdXRlclJlY3QgPSBGQy5nZXRPdXRlclJlY3Q7CgoKLyoKR2l2ZW4gYSBqUXVlcnkgPHRyPiBzZXQsIHJldHVybnMgdGhlIDx0ZD4ncyB0aGF0IGRvIG5vdCBoYXZlIG11bHRpLWxpbmUgcm93c3BhbnMuCldvdWxkIHVzZSB0aGUgW3Jvd3NwYW5dIHNlbGVjdG9yLCBidXQgbmV2ZXIgbm90IGRlZmluZWQgaW4gSUU4LgogKi8KCmdldE93bkNlbGxzID0gZnVuY3Rpb24odHJzKSB7CiAgcmV0dXJuIHRycy5maW5kKCc+IHRkJykuZmlsdGVyKGZ1bmN0aW9uKGksIHRkTm9kZSkgewogICAgcmV0dXJuIHRkTm9kZS5yb3dTcGFuIDw9IDE7CiAgfSk7Cn07CgoKLyoKSEFDSyB0byBjb21iYXQgalF1ZXJ5IDMgcHJvbWlzZXMgbm93IGFsd2F5cyBleGVjdXRlZCBkb25lIGhhbmRsZXJzIGFzeW5jaHJvbm91c2x5LgppZiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCwgb3Igbm90IGEgcHJvbWlzZSBhdCBhbGwsIGRvbmVGdW5jIGV4ZWN1dGVzIGltbWVkaWF0ZWx5LgppZiB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSBiZWVuIHJlamVjdGVkLCBmYWlsRnVuYyBleGVjdXRlcyBpbW1lZGlhdGVseS4KICovCgpzeW5jVGhlbiA9IGZ1bmN0aW9uKHByb21pc2UsIGRvbmVGdW5jLCBmYWlsRnVuYykgewogIGlmICghcHJvbWlzZSB8fCAhcHJvbWlzZS50aGVuIHx8IHByb21pc2Uuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJykgewogICAgaWYgKGRvbmVGdW5jKSB7CiAgICAgIHJldHVybiAkLndoZW4oZG9uZUZ1bmMoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJC53aGVuKCk7CiAgICB9CiAgfSBlbHNlIGlmIChwcm9taXNlLnN0YXRlKCkgPT09ICdyZWplY3RlZCcpIHsKICAgIGlmIChmYWlsRnVuYykgewogICAgICBmYWlsRnVuYygpOwogICAgfQogICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBwcm9taXNlLnRoZW4oZG9uZUZ1bmMsIGZhaWxGdW5jKTsKICB9Cn07CgoKLyoKQSBTY3JvbGxlciB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eToKLSBvcHRpb25hbCBTY3JvbGxlckNhbnZhcyBmb3IgY29udGVudAotIGZpcmVkIGV2ZW50cyBmb3Igc2Nyb2xsIHN0YXJ0L2VuZAotIGNyb3NzLWJyb3dzZXIgbm9ybWFsaXphdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbCBmb3IgUlRMCiAqLwoKRW5oYW5jZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgdmFyIGRldGVjdFJ0bFNjcm9sbFN5c3RlbSwgcnRsU2Nyb2xsU3lzdGVtOwoKICBleHRlbmQoRW5oYW5jZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIEVuaGFuY2VkU2Nyb2xsZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5taXhpbihMaXN0ZW5lck1peGluKTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuY2FudmFzID0gbnVsbDsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNTY3JvbGxpbmcgPSBmYWxzZTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUuaXNUb3VjaGluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc01vdmluZyA9IGZhbHNlOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IHRydWU7CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBFbmhhbmNlZFNjcm9sbGVyKCkgewogICAgRW5oYW5jZWRTY3JvbGxlci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVxdWVzdE1vdmluZ0VuZCA9IGRlYm91bmNlKHRoaXMucmVwb3J0TW92aW5nRW5kLCA1MDApOwogIH0KCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5yZW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmNhbnZhcykgewogICAgICB0aGlzLmNhbnZhcy5yZW5kZXIoKTsKICAgICAgdGhpcy5jYW52YXMuZWwuYXBwZW5kVG8odGhpcy5zY3JvbGxFbCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5iaW5kSGFuZGxlcnMoKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CiAgICBFbmhhbmNlZFNjcm9sbGVyLl9fc3VwZXJfXy5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy51bmJpbmRIYW5kbGVycygpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmRpc2FibGVUb3VjaFNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlzVG91Y2hTY3JvbGxFbmFibGVkID0gdHJ1ZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmJpbmRQcmV2ZW50VG91Y2hTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHJldHVybiB0aGlzLnNjcm9sbEVsLm9uKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIgPSBGQy5wcmV2ZW50RGVmYXVsdCk7CiAgICB9CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSB7CiAgICAgIHRoaXMuc2Nyb2xsRWwub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXIpOwogICAgICByZXR1cm4gdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyID0gbnVsbDsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxpc3RlblRvKHRoaXMuc2Nyb2xsRWwsIHsKICAgICAgc2Nyb2xsOiB0aGlzLnJlcG9ydFNjcm9sbCwKICAgICAgdG91Y2hzdGFydDogdGhpcy5yZXBvcnRUb3VjaFN0YXJ0LAogICAgICB0b3VjaGVuZDogdGhpcy5yZXBvcnRUb3VjaEVuZAogICAgfSk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLnNjcm9sbEVsKTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGwgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCk7CiAgICB9CiAgICB0aGlzLnRyaWdnZXIoJ3Njcm9sbCcpOwogICAgdGhpcy5pc01vdmluZyA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TW92aW5nRW5kKCk7CiAgfTsKCiAgRW5oYW5jZWRTY3JvbGxlci5wcm90b3R5cGUucmVwb3J0U2Nyb2xsU3RhcnQgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc1Njcm9sbGluZykgewogICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcignc2Nyb2xsU3RhcnQnLCB0aGlzLmlzVG91Y2hpbmcpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQgPSBudWxsOwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTsKICAgIGlmICghdGhpcy5pc1RvdWNoaW5nKSB7CiAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgfQogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNTY3JvbGxpbmcpIHsKICAgICAgdGhpcy50cmlnZ2VyKCdzY3JvbGxFbmQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsKICAgIH0KICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaFN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pc1RvdWNoaW5nID0gdHJ1ZTsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5yZXBvcnRUb3VjaEVuZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaXNUb3VjaGluZykgewogICAgICB0aGlzLmlzVG91Y2hpbmcgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQpIHsKICAgICAgICB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICAgIGlmICghdGhpcy5pc01vdmluZykgewogICAgICAgIHJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUlmIFJUTCwgYW5kIHNjcm9sbGVkIHRvIHRoZSBsZWZ0LCByZXR1cm5zIE5FR0FUSVZFIHZhbHVlIChsaWtlIEZpcmVmb3gpCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbExlZnQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXJlY3Rpb24sIG5vZGUsIHZhbDsKICAgIGRpcmVjdGlvbiA9IHRoaXMuc2Nyb2xsRWwuY3NzKCdkaXJlY3Rpb24nKTsKICAgIG5vZGUgPSB0aGlzLnNjcm9sbEVsWzBdOwogICAgdmFsID0gbm9kZS5zY3JvbGxMZWZ0OwogICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3J0bCcpIHsKICAgICAgc3dpdGNoIChydGxTY3JvbGxTeXN0ZW0pIHsKICAgICAgICBjYXNlICdwb3NpdGl2ZSc6CiAgICAgICAgICB2YWwgPSB2YWwgKyBub2RlLmNsaWVudFdpZHRoIC0gbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3JldmVyc2UnOgogICAgICAgICAgdmFsID0gLXZhbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKCiAgLyoKICAJQWNjZXB0cyBhIE5FR0FUSVZFIHZhbHVlIGZvciB3aGVuIHNjcm9sbGVkIGluIFJUTAogICAqLwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24odmFsKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlOwogICAgZGlyZWN0aW9uID0gdGhpcy5zY3JvbGxFbC5jc3MoJ2RpcmVjdGlvbicpOwogICAgbm9kZSA9IHRoaXMuc2Nyb2xsRWxbMF07CiAgICBpZiAoZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICBzd2l0Y2ggKHJ0bFNjcm9sbFN5c3RlbSkgewogICAgICAgIGNhc2UgJ3Bvc2l0aXZlJzoKICAgICAgICAgIHZhbCA9IHZhbCAtIG5vZGUuY2xpZW50V2lkdGggKyBub2RlLnNjcm9sbFdpZHRoOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncmV2ZXJzZSc6CiAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9kZS5zY3JvbGxMZWZ0ID0gdmFsOwogIH07CgoKICAvKgogIAlBbHdheXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBzY3JvbGxlZCBmcm9tIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiAoZXZlbiBpZiBSVEwpLgogIAlBbHdheXMgcG9zaXRpdmUuCiAgICovCgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbEZyb21MZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlyZWN0aW9uLCBub2RlLCB2YWw7CiAgICBkaXJlY3Rpb24gPSB0aGlzLnNjcm9sbEVsLmNzcygnZGlyZWN0aW9uJyk7CiAgICBub2RlID0gdGhpcy5zY3JvbGxFbFswXTsKICAgIHZhbCA9IG5vZGUuc2Nyb2xsTGVmdDsKICAgIGlmIChkaXJlY3Rpb24gPT09ICdydGwnKSB7CiAgICAgIHN3aXRjaCAocnRsU2Nyb2xsU3lzdGVtKSB7CiAgICAgICAgY2FzZSAnbmVnYXRpdmUnOgogICAgICAgICAgdmFsID0gdmFsIC0gbm9kZS5jbGllbnRXaWR0aCArIG5vZGUuc2Nyb2xsV2lkdGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyZXZlcnNlJzoKICAgICAgICAgIHZhbCA9IC12YWwgLSBub2RlLmNsaWVudFdpZHRoICsgbm9kZS5zY3JvbGxXaWR0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbDsKICB9OwoKICBFbmhhbmNlZFNjcm9sbGVyLnByb3RvdHlwZS5nZXROYXRpdmVTY3JvbGxMZWZ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0OwogIH07CgogIEVuaGFuY2VkU2Nyb2xsZXIucHJvdG90eXBlLnNldE5hdGl2ZVNjcm9sbExlZnQgPSBmdW5jdGlvbih2YWwpIHsKICAgIHJldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQgPSB2YWw7CiAgfTsKCiAgcnRsU2Nyb2xsU3lzdGVtID0gbnVsbDsKCiAgZGV0ZWN0UnRsU2Nyb2xsU3lzdGVtID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZWwsIG5vZGUsIHN5c3RlbTsKICAgIGVsID0gJCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpOwogICAgbm9kZSA9IGVsWzBdOwogICAgc3lzdGVtID0gbm9kZS5zY3JvbGxMZWZ0ID4gMCA/ICdwb3NpdGl2ZScgOiAobm9kZS5zY3JvbGxMZWZ0ID0gMSwgZWwuc2Nyb2xsTGVmdCA+IDAgPyAncmV2ZXJzZScgOiAnbmVnYXRpdmUnKTsKICAgIGVsLnJlbW92ZSgpOwogICAgcmV0dXJuIHN5c3RlbTsKICB9OwoKICAkKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJ0bFNjcm9sbFN5c3RlbSA9IGRldGVjdFJ0bFNjcm9sbFN5c3RlbSgpOwogIH0pOwoKICByZXR1cm4gRW5oYW5jZWRTY3JvbGxlcjsKCn0pKEZDLlNjcm9sbGVyKTsKCgovKgpBIFNjcm9sbGVyLCBidXQgd2l0aCBhIHdyYXBwaW5nIGRpdiB0aGF0IGFsbG93cyAiY2xpcHBpbmciIGF3YXkgb2YgbmF0aXZlIHNjcm9sbGJhcnMsCmdpdmluZyB0aGUgYXBwZWFyYW5jZSB0aGF0IHRoZXJlIGFyZSBubyBzY3JvbGxiYXJzLgogKi8KCkNsaXBwZWRTY3JvbGxlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENsaXBwZWRTY3JvbGxlciwgc3VwZXJDbGFzcyk7CgogIENsaXBwZWRTY3JvbGxlci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQgPSBmYWxzZTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlOwoKCiAgLyoKICAJUmVjZWl2ZWQgb3ZlcmZsb3dzIGNhbiBiZSBzZXQgdG8gJ2NsaXBwZWQnLCBtZWFuaW5nIHNjcm9sbGJhcnMgc2hvdWxkbid0IGJlIHZpc2libGUKICAJdG8gdGhlIHVzZXIsIGJ1dCB0aGUgYXJlYSBzaG91bGQgc3RpbGwgc2Nyb2xsLgogICAqLwoKICBmdW5jdGlvbiBDbGlwcGVkU2Nyb2xsZXIoKSB7CiAgICBDbGlwcGVkU2Nyb2xsZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5vdmVyZmxvd1ggPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1ggPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5vdmVyZmxvd1kgPT09ICdjbGlwcGVkLXNjcm9sbCcpIHsKICAgICAgdGhpcy5vdmVyZmxvd1kgPSAnc2Nyb2xsJzsKICAgICAgdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWU7CiAgICB9CiAgfQoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLnJlbmRlckVsID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2Nyb2xsRWw7CiAgICBzY3JvbGxFbCA9IENsaXBwZWRTY3JvbGxlci5fX3N1cGVyX18ucmVuZGVyRWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiAkKCc8ZGl2IGNsYXNzPSJmYy1zY3JvbGxlci1jbGlwIiAvPicpLmFwcGVuZChzY3JvbGxFbCk7CiAgfTsKCiAgQ2xpcHBlZFNjcm9sbGVyLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY3NzUHJvcHMsIHNjcm9sbEVsLCBzY3JvbGxiYXJXaWR0aHM7CiAgICBzY3JvbGxFbCA9IHRoaXMuc2Nyb2xsRWw7CiAgICBzY3JvbGxiYXJXaWR0aHMgPSBnZXRTY3JvbGxiYXJXaWR0aHMoc2Nyb2xsRWwpOwogICAgY3NzUHJvcHMgPSB7CiAgICAgIG1hcmdpbkxlZnQ6IDAsCiAgICAgIG1hcmdpblJpZ2h0OiAwLAogICAgICBtYXJnaW5Ub3A6IDAsCiAgICAgIG1hcmdpbkJvdHRvbTogMAogICAgfTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpblRvcCA9IC1zY3JvbGxiYXJXaWR0aHMudG9wOwogICAgICBjc3NQcm9wcy5tYXJnaW5Cb3R0b20gPSAtc2Nyb2xsYmFyV2lkdGhzLmJvdHRvbTsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIGNzc1Byb3BzLm1hcmdpbkxlZnQgPSAtc2Nyb2xsYmFyV2lkdGhzLmxlZnQ7CiAgICAgIGNzc1Byb3BzLm1hcmdpblJpZ2h0ID0gLXNjcm9sbGJhcldpZHRocy5yaWdodDsKICAgIH0KICAgIHNjcm9sbEVsLmNzcyhjc3NQcm9wcyk7CiAgICByZXR1cm4gc2Nyb2xsRWwudG9nZ2xlQ2xhc3MoJ2ZjLW5vLXNjcm9sbGJhcnMnLCAodGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZCB8fCB0aGlzLm92ZXJmbG93WCA9PT0gJ2hpZGRlbicpICYmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkIHx8IHRoaXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykgJiYgIShzY3JvbGxiYXJXaWR0aHMudG9wIHx8IHNjcm9sbGJhcldpZHRocy5ib3R0b20gfHwgc2Nyb2xsYmFyV2lkdGhzLmxlZnQgfHwgc2Nyb2xsYmFyV2lkdGhzLnJpZ2h0KSk7CiAgfTsKCgogIC8qCiAgCUFjY291bnRzIGZvciAnY2xpcHBlZCcgc2Nyb2xsYmFycwogICAqLwoKICBDbGlwcGVkU2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHdpZHRoczsKICAgIHdpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocyh0aGlzLnNjcm9sbEVsKTsKICAgIGlmICh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy50b3AgPSAwOwogICAgICB3aWR0aHMuYm90dG9tID0gMDsKICAgIH0KICAgIGlmICh0aGlzLmlzVlNjcm9sbGJhcnNDbGlwcGVkKSB7CiAgICAgIHdpZHRocy5sZWZ0ID0gMDsKICAgICAgd2lkdGhzLnJpZ2h0ID0gMDsKICAgIH0KICAgIHJldHVybiB3aWR0aHM7CiAgfTsKCiAgcmV0dXJuIENsaXBwZWRTY3JvbGxlcjsKCn0pKEVuaGFuY2VkU2Nyb2xsZXIpOwoKCi8qCkEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBjb250ZW50IHRoYXQgbGl2ZXMgd2l0aGluIGEgU2Nyb2xsZXIuCkNhbiBoYXZlICJndXR0ZXJzIiwgYXJlYXMgb2YgZGVhZCBzcGFjaW5nIGFyb3VuZCB0aGUgcGVyaW1ldGVyLgpBbHNvIHZlcnkgdXNlZnVsIGZvciBmb3JjaW5nIGEgd2lkdGgsIHdoaWNoIGEgU2Nyb2xsZXIgY2Fubm90IGRvIGFsb25lLgpIYXMgYSBjb250ZW50IGFyZWEgdGhhdCBsaXZlcyBhYm92ZSBhIGJhY2tncm91bmQgYXJlYS4KICovCgpTY3JvbGxlckNhbnZhcyA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuY29udGVudEVsID0gbnVsbDsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLmJnRWwgPSBudWxsOwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuZ3V0dGVycyA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS53aWR0aCA9IG51bGw7CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5taW5XaWR0aCA9IG51bGw7CgogIGZ1bmN0aW9uIFNjcm9sbGVyQ2FudmFzKCkgewogICAgdGhpcy5ndXR0ZXJzID0ge307CiAgfQoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsID0gJCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2FudmFzIj4gPGRpdiBjbGFzcz0iZmMtY29udGVudCI+PC9kaXY+IDxkaXYgY2xhc3M9ImZjLWJnIj48L2Rpdj4gPC9kaXY+Jyk7CiAgICB0aGlzLmNvbnRlbnRFbCA9IHRoaXMuZWwuZmluZCgnLmZjLWNvbnRlbnQnKTsKICAgIHJldHVybiB0aGlzLmJnRWwgPSB0aGlzLmVsLmZpbmQoJy5mYy1iZycpOwogIH07CgoKICAvKgogIAlJZiBmYWxzeSwgcmVzZXRzIGFsbCB0aGUgZ3V0dGVycyB0byAwCiAgICovCgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5zZXRHdXR0ZXJzID0gZnVuY3Rpb24oZ3V0dGVycykgewogICAgaWYgKCFndXR0ZXJzKSB7CiAgICAgIHRoaXMuZ3V0dGVycyA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgJC5leHRlbmQodGhpcy5ndXR0ZXJzLCBndXR0ZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpemUoKTsKICB9OwoKICBTY3JvbGxlckNhbnZhcy5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbih3aWR0aDEpIHsKICAgIHRoaXMud2lkdGggPSB3aWR0aDE7CiAgICByZXR1cm4gdGhpcy51cGRhdGVTaXplKCk7CiAgfTsKCiAgU2Nyb2xsZXJDYW52YXMucHJvdG90eXBlLnNldE1pbldpZHRoID0gZnVuY3Rpb24obWluV2lkdGgxKSB7CiAgICB0aGlzLm1pbldpZHRoID0gbWluV2lkdGgxOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS5jbGVhcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLndpZHRoID0gbnVsbDsKICAgIHRoaXMubWluV2lkdGggPSBudWxsOwogICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpOwogIH07CgogIFNjcm9sbGVyQ2FudmFzLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZ3V0dGVyczsKICAgIGd1dHRlcnMgPSB0aGlzLmd1dHRlcnM7CiAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItbGVmdCcsIEJvb2xlYW4oZ3V0dGVycy5sZWZ0KSkudG9nZ2xlQ2xhc3MoJ2ZjLWd1dHRlci1yaWdodCcsIEJvb2xlYW4oZ3V0dGVycy5yaWdodCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItdG9wJywgQm9vbGVhbihndXR0ZXJzLnRvcCkpLnRvZ2dsZUNsYXNzKCdmYy1ndXR0ZXItYm90dG9tJywgQm9vbGVhbihndXR0ZXJzLmJvdHRvbSkpLmNzcyh7CiAgICAgIHBhZGRpbmdMZWZ0OiBndXR0ZXJzLmxlZnQgfHwgJycsCiAgICAgIHBhZGRpbmdSaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgcGFkZGluZ1RvcDogZ3V0dGVycy50b3AgfHwgJycsCiAgICAgIHBhZGRpbmdCb3R0b206IGd1dHRlcnMuYm90dG9tIHx8ICcnLAogICAgICB3aWR0aDogdGhpcy53aWR0aCAhPSBudWxsID8gdGhpcy53aWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnLAogICAgICBtaW5XaWR0aDogdGhpcy5taW5XaWR0aCAhPSBudWxsID8gdGhpcy5taW5XaWR0aCArIChndXR0ZXJzLmxlZnQgfHwgMCkgKyAoZ3V0dGVycy5yaWdodCB8fCAwKSA6ICcnCiAgICB9KTsKICAgIHJldHVybiB0aGlzLmJnRWwuY3NzKHsKICAgICAgbGVmdDogZ3V0dGVycy5sZWZ0IHx8ICcnLAogICAgICByaWdodDogZ3V0dGVycy5yaWdodCB8fCAnJywKICAgICAgdG9wOiBndXR0ZXJzLnRvcCB8fCAnJywKICAgICAgYm90dG9tOiBndXR0ZXJzLmJvdHRvbSB8fCAnJwogICAgfSk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbGVyQ2FudmFzOwoKfSkoKTsKClNjcm9sbEpvaW5lciA9IChmdW5jdGlvbigpIHsKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLmF4aXMgPSBudWxsOwoKICBTY3JvbGxKb2luZXIucHJvdG90eXBlLnNjcm9sbGVycyA9IG51bGw7CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUubWFzdGVyU2Nyb2xsZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTY3JvbGxKb2luZXIoYXhpcywgc2Nyb2xsZXJzKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNjcm9sbGVyOwogICAgdGhpcy5heGlzID0gYXhpczsKICAgIHRoaXMuc2Nyb2xsZXJzID0gc2Nyb2xsZXJzOwogICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgIHRoaXMuaW5pdFNjcm9sbGVyKHNjcm9sbGVyKTsKICAgIH0KICAgIHJldHVybjsKICB9CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuaW5pdFNjcm9sbGVyID0gZnVuY3Rpb24oc2Nyb2xsZXIpIHsKICAgIHNjcm9sbGVyLnNjcm9sbEVsLm9uKCd3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmFzc2lnbk1hc3RlclNjcm9sbGVyKHNjcm9sbGVyKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBzY3JvbGxlci5vbignc2Nyb2xsU3RhcnQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5hc3NpZ25NYXN0ZXJTY3JvbGxlcihzY3JvbGxlcik7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGwnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIG90aGVyU2Nyb2xsZXIsIHJlZiwgcmVzdWx0czsKICAgICAgICBpZiAoc2Nyb2xsZXIgPT09IF90aGlzLm1hc3RlclNjcm9sbGVyKSB7CiAgICAgICAgICByZWYgPSBfdGhpcy5zY3JvbGxlcnM7CiAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICAgICAgaWYgKG90aGVyU2Nyb2xsZXIgIT09IHNjcm9sbGVyKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChfdGhpcy5heGlzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdob3Jpem9udGFsJzoKICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG90aGVyU2Nyb2xsZXIuc2V0TmF0aXZlU2Nyb2xsTGVmdChzY3JvbGxlci5nZXROYXRpdmVTY3JvbGxMZWZ0KCkpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbCc6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChvdGhlclNjcm9sbGVyLnNldFNjcm9sbFRvcChzY3JvbGxlci5nZXRTY3JvbGxUb3AoKSkpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpLm9uKCdzY3JvbGxFbmQnLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChzY3JvbGxlciA9PT0gX3RoaXMubWFzdGVyU2Nyb2xsZXIpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICAgICAgfQogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFNjcm9sbEpvaW5lci5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXIgPSBmdW5jdGlvbihzY3JvbGxlcikgewogICAgdmFyIGosIGxlbiwgb3RoZXJTY3JvbGxlciwgcmVmOwogICAgdGhpcy51bmFzc2lnbk1hc3RlclNjcm9sbGVyKCk7CiAgICB0aGlzLm1hc3RlclNjcm9sbGVyID0gc2Nyb2xsZXI7CiAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBvdGhlclNjcm9sbGVyID0gcmVmW2pdOwogICAgICBpZiAob3RoZXJTY3JvbGxlciAhPT0gc2Nyb2xsZXIpIHsKICAgICAgICBvdGhlclNjcm9sbGVyLmRpc2FibGVUb3VjaFNjcm9sbCgpOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBvdGhlclNjcm9sbGVyLCByZWY7CiAgICBpZiAodGhpcy5tYXN0ZXJTY3JvbGxlcikgewogICAgICByZWYgPSB0aGlzLnNjcm9sbGVyczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgb3RoZXJTY3JvbGxlciA9IHJlZltqXTsKICAgICAgICBvdGhlclNjcm9sbGVyLmVuYWJsZVRvdWNoU2Nyb2xsKCk7CiAgICAgIH0KICAgICAgdGhpcy5tYXN0ZXJTY3JvbGxlciA9IG51bGw7CiAgICB9CiAgfTsKCiAgU2Nyb2xsSm9pbmVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxXaWR0aHMsIGksIGosIGssIGxlbiwgbGVuMSwgbWF4Qm90dG9tLCBtYXhMZWZ0LCBtYXhSaWdodCwgbWF4VG9wLCByZWYsIHNjcm9sbGVyLCB3aWR0aHM7CiAgICBhbGxXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgICAgcmVmID0gdGhpcy5zY3JvbGxlcnM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2Nyb2xsZXIgPSByZWZbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHNjcm9sbGVyLmdldFNjcm9sbGJhcldpZHRocygpKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICBtYXhMZWZ0ID0gbWF4UmlnaHQgPSBtYXhUb3AgPSBtYXhCb3R0b20gPSAwOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsV2lkdGhzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHdpZHRocyA9IGFsbFdpZHRoc1tqXTsKICAgICAgbWF4TGVmdCA9IE1hdGgubWF4KG1heExlZnQsIHdpZHRocy5sZWZ0KTsKICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgd2lkdGhzLnJpZ2h0KTsKICAgICAgbWF4VG9wID0gTWF0aC5tYXgobWF4VG9wLCB3aWR0aHMudG9wKTsKICAgICAgbWF4Qm90dG9tID0gTWF0aC5tYXgobWF4Qm90dG9tLCB3aWR0aHMuYm90dG9tKTsKICAgIH0KICAgIHJlZiA9IHRoaXMuc2Nyb2xsZXJzOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICBzY3JvbGxlciA9IHJlZltpXTsKICAgICAgd2lkdGhzID0gYWxsV2lkdGhzW2ldOwogICAgICBzY3JvbGxlci5jYW52YXMuc2V0R3V0dGVycyh0aGlzLmF4aXMgPT09ICdob3Jpem9udGFsJyA/IHsKICAgICAgICBsZWZ0OiBtYXhMZWZ0IC0gd2lkdGhzLmxlZnQsCiAgICAgICAgcmlnaHQ6IG1heFJpZ2h0IC0gd2lkdGhzLnJpZ2h0CiAgICAgIH0gOiB7CiAgICAgICAgdG9wOiBtYXhUb3AgLSB3aWR0aHMudG9wLAogICAgICAgIGJvdHRvbTogbWF4Qm90dG9tIC0gd2lkdGhzLmJvdHRvbQogICAgICB9KTsKICAgIH0KICB9OwoKICByZXR1cm4gU2Nyb2xsSm9pbmVyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zY3JvbGxiYXJXaWR0aHMgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuc3ByaXRlcyA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS52aWV3cG9ydFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGVudE9mZnNldCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5pc0hGb2xsb3dpbmcgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNWRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5taW5UcmF2ZWwgPSAwOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNUb3VjaCA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwoKICBmdW5jdGlvbiBTY3JvbGxGb2xsb3dlcihzY3JvbGxlciwgaXNUb3VjaCkgewogICAgdGhpcy5pc1RvdWNoID0gaXNUb3VjaDsKICAgIHRoaXMuc2Nyb2xsZXIgPSBzY3JvbGxlcjsKICAgIHRoaXMuc3ByaXRlcyA9IFtdOwogICAgaWYgKHRoaXMuaXNUb3VjaCkgewogICAgICB0aGlzLmlzRm9yY2VkUmVsYXRpdmUgPSB0cnVlOwogICAgfQogICAgc2Nyb2xsZXIub24oKHRoaXMuaXNUb3VjaCA/ICdzY3JvbGxFbmQnIDogJ3Njcm9sbCcpLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVTY3JvbGwoKTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5zZXRTcHJpdGVzID0gZnVuY3Rpb24oc3ByaXRlcykgewogICAgdmFyIGosIGxlbiwgc3ByaXRlOwogICAgdGhpcy5jbGVhclNwcml0ZXMoKTsKICAgIGlmIChzcHJpdGVzIGluc3RhbmNlb2YgJCkgewogICAgICByZXR1cm4gdGhpcy5zcHJpdGVzID0gKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgICAgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIHNwcml0ZSA9IHNwcml0ZXNbal07CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKCQoc3ByaXRlKSwgdGhpcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfSkuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNwcml0ZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSBzcHJpdGVzW2pdOwogICAgICAgIHNwcml0ZS5mb2xsb3dlciA9IHRoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuc3ByaXRlcyA9IHNwcml0ZXM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyU3ByaXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzcHJpdGU7CiAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICBzcHJpdGUuY2xlYXIoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnNwcml0ZXMgPSBbXTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0KCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVQb3NpdGlvbnMoKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHNwcml0ZTsKICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTsKICAgIHRoaXMuc2Nyb2xsYmFyV2lkdGhzID0gdGhpcy5zY3JvbGxlci5nZXRTY3JvbGxiYXJXaWR0aHMoKTsKICAgIHRoaXMuY29udGVudE9mZnNldCA9IHRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLmNhY2hlRGltZW5zaW9ucygpOwogICAgfQogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVWaWV3cG9ydCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHNjcm9sbGVyLCB0b3A7CiAgICBzY3JvbGxlciA9IHRoaXMuc2Nyb2xsZXI7CiAgICBsZWZ0ID0gc2Nyb2xsZXIuZ2V0U2Nyb2xsRnJvbUxlZnQoKTsKICAgIHRvcCA9IHNjcm9sbGVyLmdldFNjcm9sbFRvcCgpOwogICAgcmV0dXJuIHRoaXMudmlld3BvcnRSZWN0ID0gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICByaWdodDogbGVmdCArIHNjcm9sbGVyLmdldENsaWVudFdpZHRoKCksCiAgICAgIHRvcDogdG9wLAogICAgICBib3R0b206IHRvcCArIHNjcm9sbGVyLmdldENsaWVudEhlaWdodCgpCiAgICB9OwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS5mb3JjZVJlbGF0aXZlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNwcml0ZTsKICAgIGlmICghdGhpcy5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IHRydWU7CiAgICAgIHJlZiA9IHRoaXMuc3ByaXRlczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzcHJpdGUgPSByZWZbal07CiAgICAgICAgaWYgKHNwcml0ZS5kb0Fic29sdXRlKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goc3ByaXRlLmFzc2lnblBvc2l0aW9uKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRzLnB1c2godm9pZCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmNsZWFyRm9yY2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgc3ByaXRlOwogICAgaWYgKHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSAmJiAhdGhpcy5pc1RvdWNoKSB7CiAgICAgIHRoaXMuaXNGb3JjZWRSZWxhdGl2ZSA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLnNwcml0ZXM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc3ByaXRlID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChzcHJpdGUuYXNzaWduUG9zaXRpb24oKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jYWNoZURpbWVuc2lvbnMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVBvc2l0aW9ucygpOwogIH07CgogIFNjcm9sbEZvbGxvd2VyLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgc3ByaXRlOwogICAgcmVmID0gdGhpcy5zcHJpdGVzOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNwcml0ZSA9IHJlZltqXTsKICAgICAgc3ByaXRlLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXIucHJvdG90eXBlLmdldENvbnRlbnRSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRDb250ZW50UmVjdChlbCwgdGhpcy5jb250ZW50T2Zmc2V0KTsKICB9OwoKICBTY3JvbGxGb2xsb3dlci5wcm90b3R5cGUuZ2V0Qm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBnZXRPdXRlclJlY3QoZWwsIHRoaXMuY29udGVudE9mZnNldCk7CiAgfTsKCiAgcmV0dXJuIFNjcm9sbEZvbGxvd2VyOwoKfSkoKTsKClNjcm9sbEZvbGxvd2VyU3ByaXRlID0gKGZ1bmN0aW9uKCkgewogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5lbCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hYnNvbHV0ZUVsID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLm5hdHVyYWxSZWN0ID0gbnVsbDsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnBhcmVudFJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuY29udGFpbmVyUmVjdCA9IG51bGw7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc0VuYWJsZWQgPSB0cnVlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nID0gZmFsc2U7CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5pc1ZGb2xsb3dpbmcgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRvQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQWJzb2x1dGUgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmlzQ2VudGVyZWQgPSBmYWxzZTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnJlY3QgPSBudWxsOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuaXNCbG9jayA9IGZhbHNlOwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUubmF0dXJhbFdpZHRoID0gbnVsbDsKCiAgZnVuY3Rpb24gU2Nyb2xsRm9sbG93ZXJTcHJpdGUoZWwxLCBmb2xsb3dlcjEpIHsKICAgIHRoaXMuZWwgPSBlbDE7CiAgICB0aGlzLmZvbGxvd2VyID0gZm9sbG93ZXIxICE9IG51bGwgPyBmb2xsb3dlcjEgOiBudWxsOwogICAgdGhpcy5pc0Jsb2NrID0gdGhpcy5lbC5jc3MoJ2Rpc3BsYXknKSA9PT0gJ2Jsb2NrJzsKICAgIHRoaXMuZWwuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwogIH0KCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IGZhbHNlOwogICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgICAgcmV0dXJuIHRoaXMudW5hYnNvbHV0aXplKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkgewogICAgICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzLmFzc2lnblBvc2l0aW9uKCk7CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRpc2FibGUoKTsKICAgIHRoaXMuZm9sbG93ZXIgPSBudWxsOwogICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbCA9IG51bGw7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmNhY2hlRGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRhaW5lclJlY3QsIGZvbGxvd2VyLCBpc0NlbnRlcmVkLCBpc0hGb2xsb3dpbmcsIGlzVkZvbGxvd2luZywgbWluVHJhdmVsLCBuYXR1cmFsUmVjdCwgcGFyZW50RWw7CiAgICBpc0hGb2xsb3dpbmcgPSBmYWxzZTsKICAgIGlzVkZvbGxvd2luZyA9IGZhbHNlOwogICAgaXNDZW50ZXJlZCA9IGZhbHNlOwogICAgdGhpcy5uYXR1cmFsV2lkdGggPSB0aGlzLmVsLndpZHRoKCk7CiAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTsKICAgIGZvbGxvd2VyID0gdGhpcy5mb2xsb3dlcjsKICAgIG5hdHVyYWxSZWN0ID0gdGhpcy5uYXR1cmFsUmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdCh0aGlzLmVsKTsKICAgIHBhcmVudEVsID0gdGhpcy5lbC5wYXJlbnQoKTsKICAgIHRoaXMucGFyZW50UmVjdCA9IGZvbGxvd2VyLmdldEJvdW5kaW5nUmVjdChwYXJlbnRFbCk7CiAgICBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXJSZWN0ID0gam9pblJlY3RzKGZvbGxvd2VyLmdldENvbnRlbnRSZWN0KHBhcmVudEVsKSwgbmF0dXJhbFJlY3QpOwogICAgbWluVHJhdmVsID0gZm9sbG93ZXIubWluVHJhdmVsOwogICAgaWYgKGZvbGxvd2VyLmNvbnRhaW5Pbk5hdHVyYWxMZWZ0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QubGVmdCA9IG5hdHVyYWxSZWN0LmxlZnQ7CiAgICB9CiAgICBpZiAoZm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0KSB7CiAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgPSBuYXR1cmFsUmVjdC5yaWdodDsKICAgIH0KICAgIGlmIChmb2xsb3dlci5pc0hGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RXaWR0aChjb250YWluZXJSZWN0KSAtIGdldFJlY3RXaWR0aChuYXR1cmFsUmVjdCkgPj0gbWluVHJhdmVsKSB7CiAgICAgICAgaXNDZW50ZXJlZCA9IHRoaXMuZWwuY3NzKCd0ZXh0LWFsaWduJykgPT09ICdjZW50ZXInOwogICAgICAgIGlzSEZvbGxvd2luZyA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChmb2xsb3dlci5pc1ZGb2xsb3dpbmcpIHsKICAgICAgaWYgKGdldFJlY3RIZWlnaHQoY29udGFpbmVyUmVjdCkgLSBnZXRSZWN0SGVpZ2h0KG5hdHVyYWxSZWN0KSA+PSBtaW5UcmF2ZWwpIHsKICAgICAgICBpc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICB0aGlzLmlzSEZvbGxvd2luZyA9IGlzSEZvbGxvd2luZzsKICAgIHRoaXMuaXNWRm9sbG93aW5nID0gaXNWRm9sbG93aW5nOwogICAgcmV0dXJuIHRoaXMuaXNDZW50ZXJlZCA9IGlzQ2VudGVyZWQ7CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbXB1dGVQb3NpdGlvbigpOwogICAgcmV0dXJuIHRoaXMuYXNzaWduUG9zaXRpb24oKTsKICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZWwuY3NzKHsKICAgICAgdG9wOiAnJywKICAgICAgbGVmdDogJycKICAgIH0pOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb250YWluZXJSZWN0LCBkb0Fic29sdXRlLCBwYXJlbnRSZWN0LCByZWN0LCByZWN0V2lkdGgsIHN1YmplY3RSZWN0LCB2aWV3cG9ydFJlY3QsIHZpc2libGVQYXJlbnRSZWN0OwogICAgdmlld3BvcnRSZWN0ID0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3Q7CiAgICBwYXJlbnRSZWN0ID0gdGhpcy5wYXJlbnRSZWN0OwogICAgY29udGFpbmVyUmVjdCA9IHRoaXMuY29udGFpbmVyUmVjdDsKICAgIHZpc2libGVQYXJlbnRSZWN0ID0gaW50ZXJzZWN0UmVjdHModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KTsKICAgIHJlY3QgPSBudWxsOwogICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgaWYgKHZpc2libGVQYXJlbnRSZWN0KSB7CiAgICAgIHJlY3QgPSBjb3B5UmVjdCh0aGlzLm5hdHVyYWxSZWN0KTsKICAgICAgc3ViamVjdFJlY3QgPSBpbnRlcnNlY3RSZWN0cyhyZWN0LCBwYXJlbnRSZWN0KTsKICAgICAgaWYgKCh0aGlzLmlzQ2VudGVyZWQgJiYgIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCBwYXJlbnRSZWN0KSkgfHwgKHN1YmplY3RSZWN0ICYmICF0ZXN0UmVjdENvbnRhaW5zKHZpZXdwb3J0UmVjdCwgc3ViamVjdFJlY3QpKSkgewogICAgICAgIGRvQWJzb2x1dGUgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLmlzSEZvbGxvd2luZykgewogICAgICAgICAgaWYgKHRoaXMuaXNDZW50ZXJlZCkgewogICAgICAgICAgICByZWN0V2lkdGggPSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICAgICAgICAgIHJlY3QubGVmdCA9ICh2aXNpYmxlUGFyZW50UmVjdC5sZWZ0ICsgdmlzaWJsZVBhcmVudFJlY3QucmlnaHQpIC8gMiAtIHJlY3RXaWR0aCAvIDI7CiAgICAgICAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyByZWN0V2lkdGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIWhDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaENvbnRhaW5SZWN0KHJlY3QsIGNvbnRhaW5lclJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNWRm9sbG93aW5nKSB7CiAgICAgICAgICBpZiAoIXZDb250YWluUmVjdChyZWN0LCB2aWV3cG9ydFJlY3QpKSB7CiAgICAgICAgICAgIGRvQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2Q29udGFpblJlY3QocmVjdCwgY29udGFpbmVyUmVjdCkpIHsKICAgICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXRlc3RSZWN0Q29udGFpbnModmlld3BvcnRSZWN0LCByZWN0KSkgewogICAgICAgICAgZG9BYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5yZWN0ID0gcmVjdDsKICAgIHJldHVybiB0aGlzLmRvQWJzb2x1dGUgPSBkb0Fic29sdXRlOwogIH07CgogIFNjcm9sbEZvbGxvd2VyU3ByaXRlLnByb3RvdHlwZS5hc3NpZ25Qb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlZnQsIHRvcDsKICAgIGlmICh0aGlzLmlzRW5hYmxlZCkgewogICAgICBpZiAoIXRoaXMucmVjdCkgewogICAgICAgIHJldHVybiB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZG9BYnNvbHV0ZSAmJiAhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0aXplKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGVFbC5jc3MoewogICAgICAgICAgdG9wOiB0aGlzLnJlY3QudG9wIC0gdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QudG9wICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLAogICAgICAgICAgbGVmdDogdGhpcy5yZWN0LmxlZnQgLSB0aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC5sZWZ0ICsgdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMubGVmdCwKICAgICAgICAgIHdpZHRoOiB0aGlzLmlzQmxvY2sgPyB0aGlzLm5hdHVyYWxXaWR0aCA6ICcnCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG9wID0gdGhpcy5yZWN0LnRvcCAtIHRoaXMubmF0dXJhbFJlY3QudG9wOwogICAgICAgIGxlZnQgPSB0aGlzLnJlY3QubGVmdCAtIHRoaXMubmF0dXJhbFJlY3QubGVmdDsKICAgICAgICB0aGlzLnVuYWJzb2x1dGl6ZSgpOwogICAgICAgIHJldHVybiB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mb2xsb3dpbmcnLCBCb29sZWFuKHRvcCB8fCBsZWZ0KSkuY3NzKHsKICAgICAgICAgIHRvcDogdG9wLAogICAgICAgICAgbGVmdDogbGVmdAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfTsKCiAgU2Nyb2xsRm9sbG93ZXJTcHJpdGUucHJvdG90eXBlLmFic29sdXRpemUgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIGlmICghdGhpcy5hYnNvbHV0ZUVsKSB7CiAgICAgICAgdGhpcy5hYnNvbHV0ZUVsID0gdGhpcy5idWlsZEFic29sdXRlRWwoKTsKICAgICAgfQogICAgICB0aGlzLmFic29sdXRlRWwuYXBwZW5kVG8odGhpcy5mb2xsb3dlci5zY3JvbGxlci5lbCk7CiAgICAgIHRoaXMuZWwuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOwogICAgICByZXR1cm4gdGhpcy5pc0Fic29sdXRlID0gdHJ1ZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUudW5hYnNvbHV0aXplID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5pc0Fic29sdXRlKSB7CiAgICAgIHRoaXMuYWJzb2x1dGVFbC5kZXRhY2goKTsKICAgICAgdGhpcy5lbC5jc3MoJ3Zpc2liaWxpdHknLCAnJyk7CiAgICAgIHJldHVybiB0aGlzLmlzQWJzb2x1dGUgPSBmYWxzZTsKICAgIH0KICB9OwoKICBTY3JvbGxGb2xsb3dlclNwcml0ZS5wcm90b3R5cGUuYnVpbGRBYnNvbHV0ZUVsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5jbG9uZSgpLmFkZENsYXNzKCdmYy1mb2xsb3dpbmcnKS5jc3MoewogICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLAogICAgICAnei1pbmRleCc6IDEwMDAsCiAgICAgICdmb250LXdlaWdodCc6IHRoaXMuZWwuY3NzKCdmb250LXdlaWdodCcpLAogICAgICAnZm9udC1zaXplJzogdGhpcy5lbC5jc3MoJ2ZvbnQtc2l6ZScpLAogICAgICAnZm9udC1mYW1pbHknOiB0aGlzLmVsLmNzcygnZm9udC1mYW1pbHknKSwKICAgICAgJ2NvbG9yJzogdGhpcy5lbC5jc3MoJ2NvbG9yJyksCiAgICAgICdwYWRkaW5nLXRvcCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLXRvcCcpLAogICAgICAncGFkZGluZy1ib3R0b20nOiB0aGlzLmVsLmNzcygncGFkZGluZy1ib3R0b20nKSwKICAgICAgJ3BhZGRpbmctbGVmdCc6IHRoaXMuZWwuY3NzKCdwYWRkaW5nLWxlZnQnKSwKICAgICAgJ3BhZGRpbmctcmlnaHQnOiB0aGlzLmVsLmNzcygncGFkZGluZy1yaWdodCcpLAogICAgICAncG9pbnRlci1ldmVudHMnOiAnbm9uZScKICAgIH0pOwogIH07CgogIHJldHVybiBTY3JvbGxGb2xsb3dlclNwcml0ZTsKCn0pKCk7Cgpjb3B5UmVjdCA9IGZ1bmN0aW9uKHJlY3QpIHsKICByZXR1cm4gewogICAgbGVmdDogcmVjdC5sZWZ0LAogICAgcmlnaHQ6IHJlY3QucmlnaHQsCiAgICB0b3A6IHJlY3QudG9wLAogICAgYm90dG9tOiByZWN0LmJvdHRvbQogIH07Cn07CgpnZXRSZWN0V2lkdGggPSBmdW5jdGlvbihyZWN0KSB7CiAgcmV0dXJuIHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7Cn07CgpnZXRSZWN0SGVpZ2h0ID0gZnVuY3Rpb24ocmVjdCkgewogIHJldHVybiByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwp9OwoKdGVzdFJlY3RDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiB0ZXN0UmVjdEhDb250YWlucyhyZWN0LCBpbm5lclJlY3QpICYmIHRlc3RSZWN0VkNvbnRhaW5zKHJlY3QsIGlubmVyUmVjdCk7Cn07Cgp0ZXN0UmVjdEhDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QubGVmdCA+PSByZWN0LmxlZnQgJiYgaW5uZXJSZWN0LnJpZ2h0IDw9IHJlY3QucmlnaHQ7Cn07Cgp0ZXN0UmVjdFZDb250YWlucyA9IGZ1bmN0aW9uKHJlY3QsIGlubmVyUmVjdCkgewogIHJldHVybiBpbm5lclJlY3QudG9wID49IHJlY3QudG9wICYmIGlubmVyUmVjdC5ib3R0b20gPD0gcmVjdC5ib3R0b207Cn07CgpoQ29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC5sZWZ0IDwgb3V0ZXJSZWN0LmxlZnQpIHsKICAgIHJlY3QucmlnaHQgPSBvdXRlclJlY3QubGVmdCArIGdldFJlY3RXaWR0aChyZWN0KTsKICAgIHJlY3QubGVmdCA9IG91dGVyUmVjdC5sZWZ0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gb3V0ZXJSZWN0LnJpZ2h0KSB7CiAgICByZWN0LmxlZnQgPSBvdXRlclJlY3QucmlnaHQgLSBnZXRSZWN0V2lkdGgocmVjdCk7CiAgICByZWN0LnJpZ2h0ID0gb3V0ZXJSZWN0LnJpZ2h0OwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07Cgp2Q29udGFpblJlY3QgPSBmdW5jdGlvbihyZWN0LCBvdXRlclJlY3QpIHsKICBpZiAocmVjdC50b3AgPCBvdXRlclJlY3QudG9wKSB7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC50b3AgKyBnZXRSZWN0SGVpZ2h0KHJlY3QpOwogICAgcmVjdC50b3AgPSBvdXRlclJlY3QudG9wOwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IG91dGVyUmVjdC5ib3R0b20pIHsKICAgIHJlY3QudG9wID0gb3V0ZXJSZWN0LmJvdHRvbSAtIGdldFJlY3RIZWlnaHQocmVjdCk7CiAgICByZWN0LmJvdHRvbSA9IG91dGVyUmVjdC5ib3R0b207CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfTsKCmpvaW5SZWN0cyA9IGZ1bmN0aW9uKHJlY3QxLCByZWN0MikgewogIHJldHVybiB7CiAgICBsZWZ0OiBNYXRoLm1pbihyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSwKICAgIHJpZ2h0OiBNYXRoLm1heChyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpLAogICAgdG9wOiBNYXRoLm1pbihyZWN0MS50b3AsIHJlY3QyLnRvcCksCiAgICBib3R0b206IE1hdGgubWF4KHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKQogIH07Cn07CgpDYWxlbmRhckV4dGVuc2lvbiA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKENhbGVuZGFyRXh0ZW5zaW9uLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gQ2FsZW5kYXJFeHRlbnNpb24oKSB7CiAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUucmVzb3VyY2VNYW5hZ2VyID0gbnVsbDsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlTWFuYWdlciA9IG5ldyBSZXNvdXJjZU1hbmFnZXIodGhpcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmluc3RhbnRpYXRlVmlldyA9IGZ1bmN0aW9uKHZpZXdUeXBlKSB7CiAgICB2YXIgc3BlYywgdmlld0NsYXNzOwogICAgc3BlYyA9IHRoaXMuZ2V0Vmlld1NwZWModmlld1R5cGUpOwogICAgdmlld0NsYXNzID0gc3BlY1snY2xhc3MnXTsKICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb3VyY2VzICYmIHNwZWMub3B0aW9ucy5yZXNvdXJjZXMgIT09IGZhbHNlKSB7CiAgICAgIGlmIChzcGVjLnF1ZXJ5UmVzb3VyY2VDbGFzcykgewogICAgICAgIHZpZXdDbGFzcyA9IHNwZWMucXVlcnlSZXNvdXJjZUNsYXNzKHNwZWMpIHx8IHZpZXdDbGFzczsKICAgICAgfSBlbHNlIGlmIChzcGVjLnJlc291cmNlQ2xhc3MpIHsKICAgICAgICB2aWV3Q2xhc3MgPSBzcGVjLnJlc291cmNlQ2xhc3M7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgdmlld0NsYXNzKHRoaXMsIHZpZXdUeXBlLCBzcGVjLm9wdGlvbnMsIHNwZWMuZHVyYXRpb24pOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2VJbnB1dCwgc2Nyb2xsKSB7CiAgICB2YXIgcHJvbWlzZTsKICAgIGlmIChzY3JvbGwgPT0gbnVsbCkgewogICAgICBzY3JvbGwgPSBmYWxzZTsKICAgIH0KICAgIHByb21pc2UgPSB0aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KTsKICAgIGlmIChzY3JvbGwgJiYgdGhpcy52aWV3LnNjcm9sbFRvUmVzb3VyY2UpIHsKICAgICAgcHJvbWlzZS5kb25lKChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIF90aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyLnJlbW92ZVJlc291cmNlKGlkT3JSZXNvdXJjZSk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlZmV0Y2hSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCk7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlc291cmNlTWFuYWdlci5yZXNldFJlc291cmNlcygpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5pc1NwYW5BbGxvd2VkID0gZnVuY3Rpb24oc3BhbiwgY29uc3RyYWludCkgewogICAgdmFyIGNvbnN0cmFpblRvUmVzb3VyY2VJZHMsIHJlZjsKICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ29iamVjdCcpIHsKICAgICAgY29uc3RyYWluVG9SZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhjb25zdHJhaW50KTsKICAgICAgaWYgKGNvbnN0cmFpblRvUmVzb3VyY2VJZHMubGVuZ3RoICYmICghc3Bhbi5yZXNvdXJjZUlkIHx8ICEocmVmID0gc3Bhbi5yZXNvdXJjZUlkLCBpbmRleE9mLmNhbGwoY29uc3RyYWluVG9SZXNvdXJjZUlkcywgcmVmKSA+PSAwKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uaXNTcGFuQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRQZWVyRXZlbnRzID0gZnVuY3Rpb24oc3BhbiwgZXZlbnQpIHsKICAgIHZhciBmaWx0ZXJlZFBlZXJFdmVudHMsIGlzUGVlciwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBuZXdSZXNvdXJjZUlkLCBuZXdSZXNvdXJjZUlkcywgcGVlckV2ZW50LCBwZWVyRXZlbnRzLCBwZWVyUmVzb3VyY2VJZCwgcGVlclJlc291cmNlSWRzOwogICAgcGVlckV2ZW50cyA9IENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRQZWVyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBuZXdSZXNvdXJjZUlkcyA9IHNwYW4ucmVzb3VyY2VJZCA/IFtzcGFuLnJlc291cmNlSWRdIDogZXZlbnQgPyB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpIDogW107CiAgICBmaWx0ZXJlZFBlZXJFdmVudHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHBlZXJFdmVudHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcGVlckV2ZW50ID0gcGVlckV2ZW50c1tqXTsKICAgICAgaXNQZWVyID0gZmFsc2U7CiAgICAgIHBlZXJSZXNvdXJjZUlkcyA9IHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhwZWVyRXZlbnQpOwogICAgICBpZiAoIXBlZXJSZXNvdXJjZUlkcy5sZW5ndGggfHwgIW5ld1Jlc291cmNlSWRzLmxlbmd0aCkgewogICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHBlZXJSZXNvdXJjZUlkcy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICAgIHBlZXJSZXNvdXJjZUlkID0gcGVlclJlc291cmNlSWRzW2tdOwogICAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IG5ld1Jlc291cmNlSWRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBuZXdSZXNvdXJjZUlkID0gbmV3UmVzb3VyY2VJZHNbbF07CiAgICAgICAgICAgIGlmIChuZXdSZXNvdXJjZUlkID09PSBwZWVyUmVzb3VyY2VJZCkgewogICAgICAgICAgICAgIGlzUGVlciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzUGVlcikgewogICAgICAgIGZpbHRlcmVkUGVlckV2ZW50cy5wdXNoKHBlZXJFdmVudCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWx0ZXJlZFBlZXJFdmVudHM7CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW4gPSBmdW5jdGlvbihvdXRlclNwYW4sIGlubmVyU3BhbikgewogICAgaWYgKG91dGVyU3Bhbi5yZXNvdXJjZUlkICYmIG91dGVyU3Bhbi5yZXNvdXJjZUlkICE9PSBpbm5lclNwYW4ucmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLnNwYW5Db250YWluc1NwYW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cyA9IGZ1bmN0aW9uKHdob2xlRGF5KSB7CiAgICB2YXIgYWxsRXZlbnRzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBmbGF0UmVzb3VyY2VzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlc291cmNlOwogICAgZmxhdFJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKTsKICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSBmYWxzZTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2pdOwogICAgICBpZiAocmVzb3VyY2UuYnVzaW5lc3NIb3VycykgewogICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICBhbGxFdmVudHMgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGZsYXRSZXNvdXJjZXMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSBmbGF0UmVzb3VyY2VzW2tdOwogICAgICAgIGV2ZW50cyA9IHRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLm9wdGlvbnMuYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGV2ZW50cy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgICAgIGV2ZW50ID0gZXZlbnRzW2xdOwogICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgYWxsRXZlbnRzLnB1c2goZXZlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYWxsRXZlbnRzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIENhbGVuZGFyRXh0ZW5zaW9uLl9fc3VwZXJfXy5nZXRDdXJyZW50QnVzaW5lc3NIb3VyRXZlbnRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3BhbiA9IGZ1bmN0aW9uKHN0YXJ0SW5wdXQsIGVuZElucHV0LCByZXNvdXJjZUlkKSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBDYWxlbmRhckV4dGVuc2lvbi5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgQ2FsZW5kYXJFeHRlbnNpb24ucHJvdG90eXBlLmdldFJlc291cmNlQnlJZCA9IGZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKGlkKTsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUubm9ybWFsaXplRXZlbnQgPSBmdW5jdGlvbihldmVudCkgewogICAgQ2FsZW5kYXJFeHRlbnNpb24uX19zdXBlcl9fLm5vcm1hbGl6ZUV2ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZXZlbnQucmVzb3VyY2VJZCA9PSBudWxsKSB7CiAgICAgIGV2ZW50LnJlc291cmNlSWQgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGV2ZW50LnJlc291cmNlSWRzICE9IG51bGwgPyBldmVudC5yZXNvdXJjZUlkcyA6IGV2ZW50LnJlc291cmNlSWRzID0gbnVsbDsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWRzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIG5vcm1hbFJlc291cmNlSWQsIG5vcm1hbFJlc291cmNlSWRzLCByZWYsIHJlZjEsIHJlZjIsIHJlc291cmNlSWQ7CiAgICByZXNvdXJjZUlkID0gU3RyaW5nKChyZWYgPSAocmVmMSA9IGV2ZW50W3RoaXMuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkKCldKSAhPSBudWxsID8gcmVmMSA6IGV2ZW50LnJlc291cmNlSWQpICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICByZXR1cm4gW3Jlc291cmNlSWRdOwogICAgfSBlbHNlIGlmIChldmVudC5yZXNvdXJjZUlkcykgewogICAgICBub3JtYWxSZXNvdXJjZUlkcyA9IFtdOwogICAgICByZWYyID0gZXZlbnQucmVzb3VyY2VJZHM7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZjIubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVmMltqXTsKICAgICAgICBub3JtYWxSZXNvdXJjZUlkID0gU3RyaW5nKHJlc291cmNlSWQgIT0gbnVsbCA/IHJlc291cmNlSWQgOiAnJyk7CiAgICAgICAgaWYgKG5vcm1hbFJlc291cmNlSWQpIHsKICAgICAgICAgIG5vcm1hbFJlc291cmNlSWRzLnB1c2gobm9ybWFsUmVzb3VyY2VJZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBub3JtYWxSZXNvdXJjZUlkczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuc2V0RXZlbnRSZXNvdXJjZUlkID0gZnVuY3Rpb24oZXZlbnQsIHJlc291cmNlSWQpIHsKICAgIHJldHVybiBldmVudFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXSA9IFN0cmluZyhyZXNvdXJjZUlkICE9IG51bGwgPyByZXNvdXJjZUlkIDogJycpOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlRmllbGQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm9wdGlvbnNbJ2V2ZW50UmVzb3VyY2VGaWVsZCddIHx8ICdyZXNvdXJjZUlkJzsKICB9OwoKICBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHMgPSBmdW5jdGlvbihpZE9yUmVzb3VyY2UpIHsKICAgIHZhciByZXNvdXJjZTsKICAgIHJlc291cmNlID0gdHlwZW9mIGlkT3JSZXNvdXJjZSA9PT0gJ29iamVjdCcgPyBpZE9yUmVzb3VyY2UgOiB0aGlzLmdldFJlc291cmNlQnlJZChpZE9yUmVzb3VyY2UpOwogICAgaWYgKHJlc291cmNlKSB7CiAgICAgIHJldHVybiB0aGlzLmNsaWVudEV2ZW50cygoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgIHJldHVybiAkLmluQXJyYXkocmVzb3VyY2UuaWQsIF90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZXZlbnQpKSAhPT0gLTE7CiAgICAgICAgfTsKICAgICAgfSkodGhpcykpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlID0gZnVuY3Rpb24oaWRPckV2ZW50KSB7CiAgICByZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyhpZE9yRXZlbnQpWzBdOwogIH07CgogIENhbGVuZGFyRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlcyA9IGZ1bmN0aW9uKGlkT3JFdmVudCkgewogICAgdmFyIGV2ZW50LCBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSWQsIHJlc291cmNlczsKICAgIGV2ZW50ID0gdHlwZW9mIGlkT3JFdmVudCA9PT0gJ29iamVjdCcgPyBpZE9yRXZlbnQgOiB0aGlzLmNsaWVudEV2ZW50cyhpZE9yRXZlbnQpWzBdOwogICAgcmVzb3VyY2VzID0gW107CiAgICBpZiAoZXZlbnQpIHsKICAgICAgcmVmID0gdGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGV2ZW50KTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2VJZCA9IHJlZltqXTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2VCeUlkKHJlc291cmNlSWQpOwogICAgICAgIGlmIChyZXNvdXJjZSkgewogICAgICAgICAgcmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc291cmNlczsKICB9OwoKICByZXR1cm4gQ2FsZW5kYXJFeHRlbnNpb247Cgp9KShDYWxlbmRhcik7CgpDYWxlbmRhci5wcm90b3R5cGUgPSBDYWxlbmRhckV4dGVuc2lvbi5wcm90b3R5cGU7CgpvcmlnRGlzcGxheVZpZXcgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldzsKCm9yaWdSZW5kZXJTa2VsZXRvbiA9IFZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uOwoKb3JpZ1VucmVuZGVyU2tlbGV0b24gPSBWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uOwoKb3JpZ0Rpc3BsYXlFdmVudHMgPSBWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzOwoKVmlldy5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZCA9IGZhbHNlOwoKVmlldy5wcm90b3R5cGUuc2V0dGluZ1Jlc291cmNlcyA9IG51bGw7CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5VmlldyA9IGZ1bmN0aW9uKCkgewogIG9yaWdEaXNwbGF5Vmlldy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIHByb2Nlc3NMaWNlbnNlS2V5KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LCB0aGlzLmVsKTsKICB0aGlzLmJpbmRSZXNvdXJjZXMoKTsKICByZXR1cm4gdGhpcy53aGVuUmVzb3VyY2VzKCk7Cn07CgpWaWV3LnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgb3JpZ1VucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICByZXR1cm4gdGhpcy51bmJpbmRSZXNvdXJjZXModHJ1ZSk7Cn07CgpWaWV3LnByb3RvdHlwZS5kaXNwbGF5RXZlbnRzID0gZnVuY3Rpb24oZXZlbnRzKSB7CiAgcmV0dXJuIHRoaXMud2hlblJlc291cmNlcygoZnVuY3Rpb24oX3RoaXMpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG9yaWdEaXNwbGF5RXZlbnRzLmNhbGwoX3RoaXMsIGV2ZW50cyk7CiAgICB9OwogIH0pKHRoaXMpKTsKfTsKClZpZXcucHJvdG90eXBlLmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHsKICB2YXIgc2V0UmVzb3VyY2VzOwogIGlmICghdGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSB0cnVlOwogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gJC5EZWZlcnJlZCgpOwogICAgc2V0UmVzb3VyY2VzID0gKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgICAgICBfdGhpcy5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgICAgICByZXR1cm4gX3RoaXMuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCk7CiAgICAgIH07CiAgICB9KSh0aGlzKTsKICAgIHRoaXMubGlzdGVuVG8odGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsIHsKICAgICAgc2V0OiBzZXRSZXNvdXJjZXMsCiAgICAgIHVuc2V0OiB0aGlzLnVuc2V0UmVzb3VyY2VzLAogICAgICByZXNldDogdGhpcy5yZXNldFJlc291cmNlcywKICAgICAgYWRkOiB0aGlzLmFkZFJlc291cmNlLAogICAgICByZW1vdmU6IHRoaXMucmVtb3ZlUmVzb3VyY2UKICAgIH0pOwogICAgaWYgKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLmhhc0ZldGNoZWQoKSkgewogICAgICByZXR1cm4gc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZXMoKTsKICAgIH0KICB9Cn07CgpWaWV3LnByb3RvdHlwZS51bmJpbmRSZXNvdXJjZXMgPSBmdW5jdGlvbihpc0Rlc3Ryb3lpbmcpIHsKICBpZiAodGhpcy5pc1Jlc291cmNlc0JvdW5kKSB7CiAgICB0aGlzLnN0b3BMaXN0ZW5pbmdUbyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcik7CiAgICBpZiAodGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkgPT09ICdyZXNvbHZlZCcpIHsKICAgICAgdGhpcy51bnNldFJlc291cmNlcyhpc0Rlc3Ryb3lpbmcpOwogICAgfQogICAgdGhpcy5zZXR0aW5nUmVzb3VyY2VzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2VzQm91bmQgPSBmYWxzZTsKICB9Cn07CgpWaWV3LnByb3RvdHlwZS53aGVuUmVzb3VyY2VzID0gZnVuY3Rpb24odGhlbkZ1bmMpIHsKICByZXR1cm4gc3luY1RoZW4odGhpcy5zZXR0aW5nUmVzb3VyY2VzLCB0aGVuRnVuYyk7Cn07CgpWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHt9OwoKVmlldy5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbigpIHt9OwoKVmlldy5wcm90b3R5cGUucmVzZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwp9OwoKVmlldy5wcm90b3R5cGUuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogIHJldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKTsKfTsKClZpZXcucHJvdG90eXBlLnJlbW92ZVJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICByZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk7Cn07CgpvcmlnR2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM7CgpvcmlnR2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvciA9IEdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3I7CgpvcmlnR2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yID0gR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yOwoKb3JpZ0dldFNlZ0RlZmF1bHRUZXh0Q29sb3IgPSBHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yOwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjbGFzc2VzLCBqLCBsZW4sIHJlZiwgcmVzb3VyY2U7CiAgY2xhc3NlcyA9IG9yaWdHZXRTZWdDdXN0b21DbGFzc2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgcmVmID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHJlc291cmNlID0gcmVmW2pdOwogICAgY2xhc3NlcyA9IGNsYXNzZXMuY29uY2F0KHJlc291cmNlLmV2ZW50Q2xhc3NOYW1lIHx8IFtdKTsKICB9CiAgcmV0dXJuIGNsYXNzZXM7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24oc2VnKSB7CiAgdmFyIGN1cnJlbnRSZXNvdXJjZSwgaiwgbGVuLCByZXNvdXJjZXMsIHZhbDsKICByZXNvdXJjZXMgPSB0aGlzLmdldFNlZ1Jlc291cmNlcyhzZWcpOwogIGZvciAoaiA9IDAsIGxlbiA9IHJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgY3VycmVudFJlc291cmNlID0gcmVzb3VyY2VzW2pdOwogICAgd2hpbGUgKGN1cnJlbnRSZXNvdXJjZSkgewogICAgICB2YWwgPSBjdXJyZW50UmVzb3VyY2UuZXZlbnRCYWNrZ3JvdW5kQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCYWNrZ3JvdW5kQ29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCkdyaWQucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50Qm9yZGVyQ29sb3IgfHwgY3VycmVudFJlc291cmNlLmV2ZW50Q29sb3I7CiAgICAgIGlmICh2YWwpIHsKICAgICAgICByZXR1cm4gdmFsOwogICAgICB9CiAgICAgIGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRSZXNvdXJjZS5fcGFyZW50OwogICAgfQogIH0KICByZXR1cm4gb3JpZ0dldFNlZ0RlZmF1bHRCb3JkZXJDb2xvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwp9OwoKR3JpZC5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdFRleHRDb2xvciA9IGZ1bmN0aW9uKHNlZykgewogIHZhciBjdXJyZW50UmVzb3VyY2UsIGosIGxlbiwgcmVzb3VyY2VzLCB2YWw7CiAgcmVzb3VyY2VzID0gdGhpcy5nZXRTZWdSZXNvdXJjZXMoc2VnKTsKICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIGN1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlc1tqXTsKICAgIHdoaWxlIChjdXJyZW50UmVzb3VyY2UpIHsKICAgICAgdmFsID0gY3VycmVudFJlc291cmNlLmV2ZW50VGV4dENvbG9yOwogICAgICBpZiAodmFsKSB7CiAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgfQogICAgICBjdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2UuX3BhcmVudDsKICAgIH0KICB9CiAgcmV0dXJuIG9yaWdHZXRTZWdEZWZhdWx0VGV4dENvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn07CgpHcmlkLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXMgPSBmdW5jdGlvbihzZWcpIHsKICBpZiAoc2VnLnJlc291cmNlKSB7CiAgICByZXR1cm4gW3NlZy5yZXNvdXJjZV07CiAgfSBlbHNlIHsKICAgIHJldHVybiB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZXMoc2VnLmV2ZW50KTsKICB9Cn07CgpSZXNvdXJjZU1hbmFnZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZU1hbmFnZXIsIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZU1hbmFnZXIubWl4aW4oRW1pdHRlck1peGluKTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCA9IDE7CgogIFJlc291cmNlTWFuYWdlci5hamF4RGVmYXVsdHMgPSB7CiAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgY2FjaGU6IGZhbHNlCiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5jYWxlbmRhciA9IG51bGw7CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUudG9wTGV2ZWxSZXNvdXJjZXMgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlc291cmNlc0J5SWQgPSBudWxsOwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmZldGNoaW5nID0gbnVsbDsKCiAgZnVuY3Rpb24gUmVzb3VyY2VNYW5hZ2VyKGNhbGVuZGFyMSkgewogICAgdGhpcy5jYWxlbmRhciA9IGNhbGVuZGFyMTsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgfQoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmhhc0ZldGNoZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmZldGNoaW5nICYmIHRoaXMuZmV0Y2hpbmcuc3RhdGUoKSA9PT0gJ3Jlc29sdmVkJzsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmdldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGdldHRpbmc7CiAgICBpZiAoIXRoaXMuZmV0Y2hpbmcpIHsKICAgICAgZ2V0dGluZyA9ICQuRGVmZXJyZWQoKTsKICAgICAgc3luY1RoZW4odGhpcy5mZXRjaFJlc291cmNlcygpLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9LCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2V0dGluZy5yZXNvbHZlKFtdKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBnZXR0aW5nLnByb21pc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5mZXRjaFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHByZXZGZXRjaGluZzsKICAgIHByZXZGZXRjaGluZyA9IHRoaXMuZmV0Y2hpbmc7CiAgICByZXR1cm4gc3luY1RoZW4ocHJldkZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIF90aGlzLmZldGNoaW5nID0gJC5EZWZlcnJlZCgpOwogICAgICAgIF90aGlzLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24ocmVzb3VyY2VJbnB1dHMpIHsKICAgICAgICAgIF90aGlzLnNldFJlc291cmNlcyhyZXNvdXJjZUlucHV0cywgQm9vbGVhbihwcmV2RmV0Y2hpbmcpKTsKICAgICAgICAgIHJldHVybiBfdGhpcy5mZXRjaGluZy5yZXNvbHZlKF90aGlzLnRvcExldmVsUmVzb3VyY2VzKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3RoaXMuZmV0Y2hpbmcucHJvbWlzZSgpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZmV0Y2hSZXNvdXJjZUlucHV0cyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB2YXIgc291cmNlOwogICAgc291cmNlID0gdGhpcy5jYWxlbmRhci5vcHRpb25zWydyZXNvdXJjZXMnXTsKICAgIGlmICgkLnR5cGUoc291cmNlKSA9PT0gJ3N0cmluZycpIHsKICAgICAgc291cmNlID0gewogICAgICAgIHVybDogc291cmNlCiAgICAgIH07CiAgICB9CiAgICBzd2l0Y2ggKCQudHlwZShzb3VyY2UpKSB7CiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuIHNvdXJjZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICB0aGlzLmNhbGVuZGFyLnB1c2hMb2FkaW5nKCk7CiAgICAgICAgcmV0dXJuICQuYWpheCgkLmV4dGVuZCh7fSwgUmVzb3VyY2VNYW5hZ2VyLmFqYXhEZWZhdWx0cywgc291cmNlKSkuZG9uZSgoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNvdXJjZUlucHV0cykgewogICAgICAgICAgICBfdGhpcy5jYWxlbmRhci5wb3BMb2FkaW5nKCk7CiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXNvdXJjZUlucHV0cyk7CiAgICAgICAgICB9OwogICAgICAgIH0pKHRoaXMpKTsKICAgICAgY2FzZSAnYXJyYXknOgogICAgICAgIHJldHVybiBjYWxsYmFjayhzb3VyY2UpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjYWxsYmFjayhbXSk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHN5bmNUaGVuKHRoaXMuZ2V0UmVzb3VyY2VzKCksIChmdW5jdGlvbihfdGhpcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIF90aGlzLnRyaWdnZXIoJ3Jlc2V0JywgX3RoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkID0gZnVuY3Rpb24oaWQpIHsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWRbaWRdOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuZ2V0RmxhdFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGlkLCByZXN1bHRzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChpZCBpbiB0aGlzLnJlc291cmNlc0J5SWQpIHsKICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucmVzb3VyY2VzQnlJZFtpZF0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMgPSBbXTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlc0J5SWQgPSB7fTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXRzLCBpc1Jlc2V0KSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZSwgcmVzb3VyY2VJbnB1dCwgcmVzb3VyY2VzLCB2YWxpZFJlc291cmNlczsKICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKCk7CiAgICByZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJbnB1dHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlucHV0ID0gcmVzb3VyY2VJbnB1dHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuYnVpbGRSZXNvdXJjZShyZXNvdXJjZUlucHV0KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdmFsaWRSZXNvdXJjZXMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgICAgaWYgKHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KHJlc291cmNlKSkgewogICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc291cmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgZm9yIChqID0gMCwgbGVuID0gdmFsaWRSZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSB2YWxpZFJlc291cmNlc1tqXTsKICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvVHJlZShyZXNvdXJjZSk7CiAgICB9CiAgICBpZiAoaXNSZXNldCkgewogICAgICB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRyaWdnZXIoJ3NldCcsIHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuY2FsZW5kYXIudHJpZ2dlcigncmVzb3VyY2VzU2V0JywgbnVsbCwgdGhpcy50b3BMZXZlbFJlc291cmNlcyk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5hZGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLmJ1aWxkUmVzb3VyY2UocmVzb3VyY2VJbnB1dCk7CiAgICAgICAgaWYgKF90aGlzLmFkZFJlc291cmNlVG9JbmRleChyZXNvdXJjZSkpIHsKICAgICAgICAgIF90aGlzLmFkZFJlc291cmNlVG9UcmVlKHJlc291cmNlKTsKICAgICAgICAgIF90aGlzLnRyaWdnZXIoJ2FkZCcsIHJlc291cmNlKTsKICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLmFkZFJlc291cmNlVG9JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmOwogICAgaWYgKHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZS5pZF0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZXNvdXJjZXNCeUlkW3Jlc291cmNlLmlkXSA9IHJlc291cmNlOwogICAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgoY2hpbGQpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb1RyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSkgewogICAgdmFyIHBhcmVudCwgcGFyZW50SWQsIHJlZiwgc2libGluZ3M7CiAgICBpZiAoIXJlc291cmNlLnBhcmVudCkgewogICAgICBwYXJlbnRJZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VbJ3BhcmVudElkJ10pICE9IG51bGwgPyByZWYgOiAnJyk7CiAgICAgIGlmIChwYXJlbnRJZCkgewogICAgICAgIHBhcmVudCA9IHRoaXMucmVzb3VyY2VzQnlJZFtwYXJlbnRJZF07CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgc2libGluZ3MgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZ3MgPSB0aGlzLnRvcExldmVsUmVzb3VyY2VzOwogICAgICB9CiAgICAgIHNpYmxpbmdzLnB1c2gocmVzb3VyY2UpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKGlkT3JSZXNvdXJjZSkgewogICAgdmFyIGlkOwogICAgaWQgPSB0eXBlb2YgaWRPclJlc291cmNlID09PSAnb2JqZWN0JyA/IGlkT3JSZXNvdXJjZS5pZCA6IGlkT3JSZXNvdXJjZTsKICAgIHJldHVybiBzeW5jVGhlbih0aGlzLmZldGNoaW5nLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZXNvdXJjZTsKICAgICAgICByZXNvdXJjZSA9IF90aGlzLnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGlkKTsKICAgICAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgICAgIF90aGlzLnJlbW92ZVJlc291cmNlRnJvbVRyZWUocmVzb3VyY2UpOwogICAgICAgICAgX3RoaXMudHJpZ2dlcigncmVtb3ZlJywgcmVzb3VyY2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgUmVzb3VyY2VNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleCA9IGZ1bmN0aW9uKHJlc291cmNlSWQpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlc0J5SWRbcmVzb3VyY2VJZF07CiAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgcmVmID0gcmVzb3VyY2UuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tSW5kZXgoY2hpbGQuaWQpOwogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBSZXNvdXJjZU1hbmFnZXIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlRnJvbVRyZWUgPSBmdW5jdGlvbihyZXNvdXJjZSwgc2libGluZ3MpIHsKICAgIHZhciBpLCBqLCBsZW4sIHNpYmxpbmc7CiAgICBpZiAoc2libGluZ3MgPT0gbnVsbCkgewogICAgICBzaWJsaW5ncyA9IHRoaXMudG9wTGV2ZWxSZXNvdXJjZXM7CiAgICB9CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gc2libGluZ3MubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHNpYmxpbmcgPSBzaWJsaW5nc1tpXTsKICAgICAgaWYgKHNpYmxpbmcgPT09IHJlc291cmNlKSB7CiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gbnVsbDsKICAgICAgICBzaWJsaW5ncy5zcGxpY2UoaSwgMSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZShyZXNvdXJjZSwgc2libGluZy5jaGlsZHJlbikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIFJlc291cmNlTWFuYWdlci5wcm90b3R5cGUuYnVpbGRSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlSW5wdXQpIHsKICAgIHZhciBjaGlsZCwgY2hpbGRJbnB1dCwgcmF3Q2xhc3NOYW1lLCByZWYsIHJlc291cmNlOwogICAgcmVzb3VyY2UgPSAkLmV4dGVuZCh7fSwgcmVzb3VyY2VJbnB1dCk7CiAgICByZXNvdXJjZS5pZCA9IFN0cmluZygocmVmID0gcmVzb3VyY2VJbnB1dC5pZCkgIT0gbnVsbCA/IHJlZiA6ICdfZmMnICsgUmVzb3VyY2VNYW5hZ2VyLnJlc291cmNlR3VpZCsrKTsKICAgIHJhd0NsYXNzTmFtZSA9IHJlc291cmNlSW5wdXQuZXZlbnRDbGFzc05hbWU7CiAgICByZXNvdXJjZS5ldmVudENsYXNzTmFtZSA9IChmdW5jdGlvbigpIHsKICAgICAgc3dpdGNoICgkLnR5cGUocmF3Q2xhc3NOYW1lKSkgewogICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lLnNwbGl0KC9ccysvKTsKICAgICAgICBjYXNlICdhcnJheSc6CiAgICAgICAgICByZXR1cm4gcmF3Q2xhc3NOYW1lOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH0pKCk7CiAgICByZXNvdXJjZS5jaGlsZHJlbiA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmMSwgcmVmMiwgcmVzdWx0czsKICAgICAgcmVmMiA9IChyZWYxID0gcmVzb3VyY2VJbnB1dC5jaGlsZHJlbikgIT0gbnVsbCA/IHJlZjEgOiBbXTsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYyLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGRJbnB1dCA9IHJlZjJbal07CiAgICAgICAgY2hpbGQgPSB0aGlzLmJ1aWxkUmVzb3VyY2UoY2hpbGRJbnB1dCk7CiAgICAgICAgY2hpbGQucGFyZW50ID0gcmVzb3VyY2U7CiAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICByZXR1cm4gcmVzb3VyY2U7CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlTWFuYWdlcjsKCn0pKENsYXNzKTsKCgovKgpBIHZpZXcgdGhhdCBzdHJ1Y3R1cmFsbHkgZGlzdGluZ3Vpc2hlcyBldmVudHMgYnkgcmVzb3VyY2UKICovCgpSZXNvdXJjZVZpZXdNaXhpbiA9IHsKICByZXNvdXJjZVRleHRGdW5jOiBudWxsLAogIHVuc2V0UmVzb3VyY2VzOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgfSwKICByZXNldFJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgc2Nyb2xsU3RhdGU7CiAgICBzY3JvbGxTdGF0ZSA9IHRoaXMucXVlcnlTY3JvbGwoKTsKICAgIHRoaXMudW5zZXRSZXNvdXJjZXMoKTsKICAgIHRoaXMuc2V0UmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnNldFNjcm9sbChzY3JvbGxTdGF0ZSk7CiAgICByZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpOwogIH0sCiAgaXNFdmVudERyYWdnYWJsZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHJldHVybiB0aGlzLmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKGV2ZW50KSB8fCBWaWV3LnByb3RvdHlwZS5pc0V2ZW50RHJhZ2dhYmxlLmNhbGwodGhpcywgZXZlbnQpOwogIH0sCiAgaXNFdmVudFJlc291cmNlRWRpdGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICB2YXIgcmVmLCByZWYxLCByZWYyOwogICAgcmV0dXJuIChyZWYgPSAocmVmMSA9IChyZWYyID0gZXZlbnQucmVzb3VyY2VFZGl0YWJsZSkgIT0gbnVsbCA/IHJlZjIgOiAoZXZlbnQuc291cmNlIHx8IHt9KS5yZXNvdXJjZUVkaXRhYmxlKSAhPSBudWxsID8gcmVmMSA6IHRoaXMub3B0KCdldmVudFJlc291cmNlRWRpdGFibGUnKSkgIT0gbnVsbCA/IHJlZiA6IHRoaXMuaXNFdmVudEdlbmVyYWxseUVkaXRhYmxlKGV2ZW50KTsKICB9LAogIGdldFJlc291cmNlVGV4dDogZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKShyZXNvdXJjZSk7CiAgfSwKICBnZXRSZXNvdXJjZVRleHRGdW5jOiBmdW5jdGlvbigpIHsKICAgIHZhciBmdW5jOwogICAgaWYgKHRoaXMucmVzb3VyY2VUZXh0RnVuYykgewogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jOwogICAgfSBlbHNlIHsKICAgICAgZnVuYyA9IHRoaXMub3B0KCdyZXNvdXJjZVRleHQnKTsKICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZnVuYyA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2UudGl0bGUgfHwgcmVzb3VyY2UuaWQ7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVRleHRGdW5jID0gZnVuYzsKICAgIH0KICB9LAogIHRyaWdnZXJEYXlDbGljazogZnVuY3Rpb24oc3BhbiwgZGF5RWwsIGV2KSB7CiAgICB2YXIgcmVzb3VyY2VNYW5hZ2VyOwogICAgcmVzb3VyY2VNYW5hZ2VyID0gdGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXI7CiAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdkYXlDbGljaycsIGRheUVsLCB0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUoc3Bhbi5zdGFydCksIGV2LCB0aGlzLCByZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHNwYW4ucmVzb3VyY2VJZCkpOwogIH0sCiAgdHJpZ2dlclNlbGVjdDogZnVuY3Rpb24oc3BhbiwgZXYpIHsKICAgIHZhciByZXNvdXJjZU1hbmFnZXI7CiAgICByZXNvdXJjZU1hbmFnZXIgPSB0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlcjsKICAgIHJldHVybiB0aGlzLnRyaWdnZXIoJ3NlbGVjdCcsIG51bGwsIHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZShzcGFuLnN0YXJ0KSwgdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHNwYW4uZW5kKSwgZXYsIHRoaXMsIHJlc291cmNlTWFuYWdlci5nZXRSZXNvdXJjZUJ5SWQoc3Bhbi5yZXNvdXJjZUlkKSk7CiAgfSwKICB0cmlnZ2VyRXh0ZXJuYWxEcm9wOiBmdW5jdGlvbihldmVudCwgZHJvcExvY2F0aW9uLCBlbCwgZXYsIHVpKSB7CiAgICB0aGlzLnRyaWdnZXIoJ2Ryb3AnLCBlbFswXSwgZHJvcExvY2F0aW9uLnN0YXJ0LCBldiwgdWksIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIGlmIChldmVudCkgewogICAgICByZXR1cm4gdGhpcy50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCBudWxsLCBldmVudCk7CiAgICB9CiAgfSwKCiAgLyogSGFja3MKICAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgCVRoZXNlIHRyaWdnZXJzIHVzdWFsbHkgY2FsbCBtdXRhdGVFdmVudCB3aXRoIGRyb3BMb2NhdGlvbiwgd2hpY2ggY2F1c2VzIGFuIGV2ZW50IG1vZGlmaWNhdGlvbiBhbmQgcmVyZW5kZXIuCiAgCUJ1dCBtdXRhdGVFdmVudCBpc24ndCBhd2FyZSBvZiBldmVudFJlc291cmNlRmllbGQsIHNvIGl0IG1pZ2h0IGJlIHNldHRpbmcgdGhlIHdyb25nIHByb3BlcnR5LiBXb3JrYXJvdW5kLgogIAlUT0RPOiBub3JtYWxpemUgc29tZXdoZXJlIGVsc2UuIG1heWJlIG1ha2UgYSBob29rIGluIGNvcmUuCiAgICovCiAgcmVwb3J0RXZlbnREcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIGV2ZW50LCBvdGhlckFyZ3MsIHJlZjsKICAgIGV2ZW50ID0gYXJndW1lbnRzWzBdLCBkcm9wTG9jYXRpb24gPSBhcmd1bWVudHNbMV0sIG90aGVyQXJncyA9IDMgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IFtdOwogICAgZHJvcExvY2F0aW9uID0gdGhpcy5ub3JtYWxpemVEcm9wTG9jYXRpb24oZHJvcExvY2F0aW9uKTsKICAgIGlmIChkcm9wTG9jYXRpb24ucmVzb3VyY2VJZCAmJiBldmVudC5yZXNvdXJjZUlkcykgewogICAgICBkcm9wTG9jYXRpb24ucmVzb3VyY2VJZHMgPSBudWxsOwogICAgfQogICAgcmV0dXJuIChyZWYgPSBWaWV3LnByb3RvdHlwZS5yZXBvcnRFdmVudERyb3ApLmNhbGwuYXBwbHkocmVmLCBbdGhpcywgZXZlbnQsIGRyb3BMb2NhdGlvbl0uY29uY2F0KHNsaWNlLmNhbGwob3RoZXJBcmdzKSkpOwogIH0sCiAgcmVwb3J0RXh0ZXJuYWxEcm9wOiBmdW5jdGlvbigpIHsKICAgIHZhciBkcm9wTG9jYXRpb24sIG1ldGEsIG90aGVyQXJncywgcmVmOwogICAgbWV0YSA9IGFyZ3VtZW50c1swXSwgZHJvcExvY2F0aW9uID0gYXJndW1lbnRzWzFdLCBvdGhlckFyZ3MgPSAzIDw9IGFyZ3VtZW50cy5sZW5ndGggPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBbXTsKICAgIGRyb3BMb2NhdGlvbiA9IHRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKGRyb3BMb2NhdGlvbik7CiAgICByZXR1cm4gKHJlZiA9IFZpZXcucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShyZWYsIFt0aGlzLCBtZXRhLCBkcm9wTG9jYXRpb25dLmNvbmNhdChzbGljZS5jYWxsKG90aGVyQXJncykpKTsKICB9LAogIG5vcm1hbGl6ZURyb3BMb2NhdGlvbjogZnVuY3Rpb24oZHJvcExvY2F0aW9uKSB7CiAgICB2YXIgb3V0OwogICAgb3V0ID0gJC5leHRlbmQoe30sIGRyb3BMb2NhdGlvbik7CiAgICBkZWxldGUgb3V0LnJlc291cmNlSWQ7CiAgICB0aGlzLmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChvdXQsIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkKTsKICAgIHJldHVybiBvdXQ7CiAgfQp9OwoKUmVzb3VyY2VHcmlkTWl4aW4gPSB7CiAgYWxsb3dDcm9zc1Jlc291cmNlOiB0cnVlLAogIGV2ZW50UmFuZ2VUb1NwYW5zOiBmdW5jdGlvbihyYW5nZSwgZXZlbnQpIHsKICAgIHZhciBqLCBsZW4sIHJlc291cmNlSWQsIHJlc291cmNlSWRzLCByZXN1bHRzOwogICAgcmVzb3VyY2VJZHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuZ2V0RXZlbnRSZXNvdXJjZUlkcyhldmVudCk7CiAgICBpZiAocmVzb3VyY2VJZHMubGVuZ3RoKSB7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVzb3VyY2VJZHMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByZXNvdXJjZUlkID0gcmVzb3VyY2VJZHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKCQuZXh0ZW5kKHt9LCByYW5nZSwgewogICAgICAgICAgcmVzb3VyY2VJZDogcmVzb3VyY2VJZAogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0gZWxzZSBpZiAoRkMuaXNCZ0V2ZW50KGV2ZW50KSkgewogICAgICByZXR1cm4gR3JpZC5wcm90b3R5cGUuZXZlbnRSYW5nZVRvU3BhbnMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICB9LAogIGZhYnJpY2F0ZUhlbHBlckV2ZW50OiBmdW5jdGlvbihldmVudExvY2F0aW9uLCBzZWcpIHsKICAgIHZhciBldmVudDsKICAgIGV2ZW50ID0gR3JpZC5wcm90b3R5cGUuZmFicmljYXRlSGVscGVyRXZlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMudmlldy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQoZXZlbnQsIGV2ZW50TG9jYXRpb24ucmVzb3VyY2VJZCk7CiAgICByZXR1cm4gZXZlbnQ7CiAgfSwKICBjb21wdXRlRXZlbnREcm9wOiBmdW5jdGlvbihzdGFydFNwYW4sIGVuZFNwYW4sIGV2ZW50KSB7CiAgICB2YXIgZHJvcExvY2F0aW9uOwogICAgaWYgKHRoaXMudmlldy5pc0V2ZW50U3RhcnRFZGl0YWJsZShldmVudCkpIHsKICAgICAgZHJvcExvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50RHJvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgZHJvcExvY2F0aW9uID0gRkMucGx1Y2tFdmVudERhdGVQcm9wcyhldmVudCk7CiAgICB9CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGlmICh0aGlzLnZpZXcuaXNFdmVudFJlc291cmNlRWRpdGFibGUoZXZlbnQpKSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBlbmRTcGFuLnJlc291cmNlSWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHJvcExvY2F0aW9uLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFeHRlcm5hbERyb3A6IGZ1bmN0aW9uKHNwYW4sIG1ldGEpIHsKICAgIHZhciBkcm9wTG9jYXRpb247CiAgICBkcm9wTG9jYXRpb24gPSBHcmlkLnByb3RvdHlwZS5jb21wdXRlRXh0ZXJuYWxEcm9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoZHJvcExvY2F0aW9uKSB7CiAgICAgIGRyb3BMb2NhdGlvbi5yZXNvdXJjZUlkID0gc3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIGRyb3BMb2NhdGlvbjsKICB9LAogIGNvbXB1dGVFdmVudFJlc2l6ZTogZnVuY3Rpb24odHlwZSwgc3RhcnRTcGFuLCBlbmRTcGFuLCBldmVudCkgewogICAgdmFyIHJlc2l6ZUxvY2F0aW9uOwogICAgaWYgKCF0aGlzLmFsbG93Q3Jvc3NSZXNvdXJjZSAmJiBzdGFydFNwYW4ucmVzb3VyY2VJZCAhPT0gZW5kU3Bhbi5yZXNvdXJjZUlkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHJlc2l6ZUxvY2F0aW9uID0gR3JpZC5wcm90b3R5cGUuY29tcHV0ZUV2ZW50UmVzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzaXplTG9jYXRpb24pIHsKICAgICAgcmVzaXplTG9jYXRpb24ucmVzb3VyY2VJZCA9IHN0YXJ0U3Bhbi5yZXNvdXJjZUlkOwogICAgfQogICAgcmV0dXJuIHJlc2l6ZUxvY2F0aW9uOwogIH0sCiAgY29tcHV0ZVNlbGVjdGlvblNwYW46IGZ1bmN0aW9uKHN0YXJ0U3BhbiwgZW5kU3BhbikgewogICAgdmFyIHNlbGVjdGlvblNwYW47CiAgICBpZiAoIXRoaXMuYWxsb3dDcm9zc1Jlc291cmNlICYmIHN0YXJ0U3Bhbi5yZXNvdXJjZUlkICE9PSBlbmRTcGFuLnJlc291cmNlSWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2VsZWN0aW9uU3BhbiA9IEdyaWQucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Rpb25TcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoc2VsZWN0aW9uU3BhbikgewogICAgICBzZWxlY3Rpb25TcGFuLnJlc291cmNlSWQgPSBzdGFydFNwYW4ucmVzb3VyY2VJZDsKICAgIH0KICAgIHJldHVybiBzZWxlY3Rpb25TcGFuOwogIH0KfTsKCgovKgpSZXF1aXJlbWVudHM6Ci0gbXVzdCBiZSBhIEdyaWQKLSBncmlkIG11c3QgaGF2ZSBhIHZpZXcgdGhhdCdzIGEgUmVzb3VyY2VWaWV3Ci0gRGF5VGFibGVNaXhpbiBtdXN0IGFscmVhZHkgYmUgbWl4ZWQgaW4KICovCgpSZXNvdXJjZURheVRhYmxlTWl4aW4gPSB7CiAgZmxhdHRlbmVkUmVzb3VyY2VzOiBudWxsLAogIHJlc291cmNlQ250OiAwLAogIGRhdGVzQWJvdmVSZXNvdXJjZXM6IGZhbHNlLAogIGFsbG93Q3Jvc3NSZXNvdXJjZTogZmFsc2UsCiAgc2V0UmVzb3VyY2VzOiBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzID0gdGhpcy5mbGF0dGVuUmVzb3VyY2VzKHJlc291cmNlcyk7CiAgICB0aGlzLnJlc291cmNlQ250ID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoOwogICAgcmV0dXJuIHRoaXMudXBkYXRlRGF5VGFibGVDb2xzKCk7CiAgfSwKICB1bnNldFJlc291cmNlczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyA9IG51bGw7CiAgICB0aGlzLnJlc291cmNlQ250ID0gMDsKICAgIHJldHVybiB0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpOwogIH0sCiAgZmxhdHRlblJlc291cmNlczogZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgb3JkZXJTcGVjcywgb3JkZXJWYWwsIHJlcywgc29ydEZ1bmM7CiAgICBvcmRlclZhbCA9IHRoaXMudmlldy5vcHQoJ3Jlc291cmNlT3JkZXInKTsKICAgIGlmIChvcmRlclZhbCkgewogICAgICBvcmRlclNwZWNzID0gcGFyc2VGaWVsZFNwZWNzKG9yZGVyVmFsKTsKICAgICAgc29ydEZ1bmMgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgb3JkZXJTcGVjcyk7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBzb3J0RnVuYyA9IG51bGw7CiAgICB9CiAgICByZXMgPSBbXTsKICAgIHRoaXMuYWNjdW11bGF0ZVJlc291cmNlcyhyZXNvdXJjZXMsIHNvcnRGdW5jLCByZXMpOwogICAgcmV0dXJuIHJlczsKICB9LAogIGFjY3VtdWxhdGVSZXNvdXJjZXM6IGZ1bmN0aW9uKHJlc291cmNlcywgc29ydEZ1bmMsIHJlcykgewogICAgdmFyIGosIGxlbiwgcmVzb3VyY2UsIHJlc3VsdHMsIHNvcnRlZFJlc291cmNlczsKICAgIGlmIChzb3J0RnVuYykgewogICAgICBzb3J0ZWRSZXNvdXJjZXMgPSByZXNvdXJjZXMuc2xpY2UoMCk7CiAgICAgIHNvcnRlZFJlc291cmNlcy5zb3J0KHNvcnRGdW5jKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvcnRlZFJlc291cmNlcyA9IHJlc291cmNlczsKICAgIH0KICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNvcnRlZFJlc291cmNlcy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHNvcnRlZFJlc291cmNlc1tqXTsKICAgICAgcmVzLnB1c2gocmVzb3VyY2UpOwogICAgICByZXN1bHRzLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKHJlc291cmNlLmNoaWxkcmVuLCBzb3J0RnVuYywgcmVzKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9LAogIHVwZGF0ZURheVRhYmxlQ29sczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMgPSB0aGlzLnZpZXcub3B0KCdncm91cEJ5RGF0ZUFuZFJlc291cmNlJyk7CiAgICByZXR1cm4gRkMuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKTsKICB9LAogIGNvbXB1dGVDb2xDbnQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICh0aGlzLnJlc291cmNlQ250IHx8IDEpICogdGhpcy5kYXlzUGVyUm93OwogIH0sCiAgZ2V0Q29sRGF5SW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyAodGhpcy5yZXNvdXJjZUNudCB8fCAxKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29sICUgdGhpcy5kYXlzUGVyUm93OwogICAgfQogIH0sCiAgZ2V0Q29sUmVzb3VyY2U6IGZ1bmN0aW9uKGNvbCkgewogICAgcmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleChjb2wpXTsKICB9LAogIGdldENvbFJlc291cmNlSW5kZXg6IGZ1bmN0aW9uKGNvbCkgewogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICByZXR1cm4gY29sICUgKHRoaXMucmVzb3VyY2VDbnQgfHwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTWF0aC5mbG9vcihjb2wgLyB0aGlzLmRheXNQZXJSb3cpOwogICAgfQogIH0sCiAgaW5kaWNlc1RvQ29sOiBmdW5jdGlvbihyZXNvdXJjZUluZGV4LCBkYXlJbmRleCkgewogICAgdmFyIGNvbDsKICAgIGNvbCA9IHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcyA/IGRheUluZGV4ICogKHRoaXMucmVzb3VyY2VDbnQgfHwgMSkgKyByZXNvdXJjZUluZGV4IDogcmVzb3VyY2VJbmRleCAqIHRoaXMuZGF5c1BlclJvdyArIGRheUluZGV4OwogICAgaWYgKHRoaXMuaXNSVEwpIHsKICAgICAgY29sID0gdGhpcy5jb2xDbnQgLSAxIC0gY29sOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9LAogIHJlbmRlckhlYWRUckh0bWw6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLnJlc291cmNlQ250KSB7CiAgICAgIHJldHVybiBGQy5EYXlUYWJsZU1peGluLnJlbmRlckhlYWRUckh0bWwuY2FsbCh0aGlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0aGlzLmRheXNQZXJSb3cgPiAxKSB7CiAgICAgICAgaWYgKHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcykgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZERhdGVBbmRSZXNvdXJjZUh0bWwoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWwoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOwogICAgICB9CiAgICB9CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICByZXNvdXJjZUh0bWxzID0gW107CiAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZXNvdXJjZSA9IHJlZltqXTsKICAgICAgcmVzb3VyY2VIdG1scy5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwocmVzb3VyY2UpKTsKICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQW5kRGF0ZUh0bWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGRhdGVIdG1scywgZGF5SW5kZXgsIGosIGssIGxlbiwgcmVmLCByZWYxLCByZXNvdXJjZSwgcmVzb3VyY2VIdG1sczsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGRhdGVIdG1scyA9IFtdOwogICAgcmVmID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBudWxsLCB0aGlzLmRheXNQZXJSb3cpKTsKICAgICAgZm9yIChkYXlJbmRleCA9IGsgPSAwLCByZWYxID0gdGhpcy5kYXlzUGVyUm93OyBrIDwgcmVmMTsgZGF5SW5kZXggPSBrICs9IDEpIHsKICAgICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgICBkYXRlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZURhdGVDZWxsSHRtbChkYXRlLCByZXNvdXJjZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy53cmFwVHIocmVzb3VyY2VIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKSArIHRoaXMud3JhcFRyKGRhdGVIdG1scywgJ3JlbmRlckhlYWRJbnRyb0h0bWwnKTsKICB9LAogIHJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRlLCBkYXRlSHRtbHMsIGRheUluZGV4LCBqLCBrLCBsZW4sIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHJlc291cmNlSHRtbHM7CiAgICBkYXRlSHRtbHMgPSBbXTsKICAgIHJlc291cmNlSHRtbHMgPSBbXTsKICAgIGZvciAoZGF5SW5kZXggPSBqID0gMCwgcmVmID0gdGhpcy5kYXlzUGVyUm93OyBqIDwgcmVmOyBkYXlJbmRleCA9IGogKz0gMSkgewogICAgICBkYXRlID0gdGhpcy5kYXlEYXRlc1tkYXlJbmRleF0uY2xvbmUoKTsKICAgICAgZGF0ZUh0bWxzLnB1c2godGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIHRoaXMucmVzb3VyY2VDbnQpKTsKICAgICAgcmVmMSA9IHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzOwogICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWYxW2tdOwogICAgICAgIHJlc291cmNlSHRtbHMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHJlc291cmNlLCBkYXRlKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLndyYXBUcihkYXRlSHRtbHMsICdyZW5kZXJIZWFkSW50cm9IdG1sJykgKyB0aGlzLndyYXBUcihyZXNvdXJjZUh0bWxzLCAncmVuZGVySGVhZEludHJvSHRtbCcpOwogIH0sCiAgcmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWw6IGZ1bmN0aW9uKHJlc291cmNlLCBkYXRlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCInICsgJyBkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicgKyAoZGF0ZSA/ICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSArICciJyA6ICcnKSArIChjb2xzcGFuID4gMSA/ICcgY29sc3Bhbj0iJyArIGNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyBodG1sRXNjYXBlKHRoaXMudmlldy5nZXRSZXNvdXJjZVRleHQocmVzb3VyY2UpKSArICc8L3RoPic7CiAgfSwKICByZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6IGZ1bmN0aW9uKGRhdGUsIHJlc291cmNlLCBjb2xzcGFuKSB7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWFkRGF0ZUNlbGxIdG1sKGRhdGUsIGNvbHNwYW4sICdkYXRhLXJlc291cmNlLWlkPSInICsgcmVzb3VyY2UuaWQgKyAnIicpOwogIH0sCiAgcHJvY2Vzc0hlYWRSZXNvdXJjZUVsczogZnVuY3Rpb24oY29udGFpbmVyRWwpIHsKICAgIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtcmVzb3VyY2UtY2VsbCcpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2wsIG5vZGUpIHsKICAgICAgICB2YXIgcmVzb3VyY2U7CiAgICAgICAgaWYgKF90aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXMpIHsKICAgICAgICAgIHJlc291cmNlID0gX3RoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzb3VyY2UgPSBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXNbX3RoaXMuaXNSVEwgPyBfdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMubGVuZ3RoIC0gMSAtIGNvbCA6IGNvbF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBfdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgcmVzb3VyY2UsIHJlc291cmNlLCAkKG5vZGUpLCAkKCkpOwogICAgICB9OwogICAgfSkodGhpcykpOwogIH0sCiAgcmVuZGVyQmdDZWxsc0h0bWw6IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGNvbCwgZGF0ZSwgaHRtbHMsIGosIHJlZiwgcmVzb3VyY2U7CiAgICBpZiAoIXRoaXMucmVzb3VyY2VDbnQpIHsKICAgICAgcmV0dXJuIEZDLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLCByb3cpOwogICAgfSBlbHNlIHsKICAgICAgaHRtbHMgPSBbXTsKICAgICAgZm9yIChjb2wgPSBqID0gMCwgcmVmID0gdGhpcy5jb2xDbnQ7IGogPCByZWY7IGNvbCA9IGogKz0gMSkgewogICAgICAgIGRhdGUgPSB0aGlzLmdldENlbGxEYXRlKHJvdywgY29sKTsKICAgICAgICByZXNvdXJjZSA9IHRoaXMuZ2V0Q29sUmVzb3VyY2UoY29sKTsKICAgICAgICBodG1scy5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKGRhdGUsIHJlc291cmNlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGh0bWxzLmpvaW4oJycpOwogICAgfQogIH0sCiAgcmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sOiBmdW5jdGlvbihkYXRlLCByZXNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMucmVuZGVyQmdDZWxsSHRtbChkYXRlLCAnZGF0YS1yZXNvdXJjZS1pZD0iJyArIHJlc291cmNlLmlkICsgJyInKTsKICB9LAogIHdyYXBUcjogZnVuY3Rpb24oY2VsbEh0bWxzLCBpbnRyb01ldGhvZE5hbWUpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIGNlbGxIdG1scy5yZXZlcnNlKCk7CiAgICAgIHJldHVybiAnPHRyPicgKyBjZWxsSHRtbHMuam9pbignJykgKyB0aGlzW2ludHJvTWV0aG9kTmFtZV0oKSArICc8L3RyPic7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJzx0cj4nICsgdGhpc1tpbnRyb01ldGhvZE5hbWVdKCkgKyBjZWxsSHRtbHMuam9pbignJykgKyAnPC90cj4nOwogICAgfQogIH0sCgogIC8qCiAgCUlmIHRoZXJlIGFyZSBubyBwZXItcmVzb3VyY2UgYnVzaW5lc3MgaG91ciBkZWZpbml0aW9ucywgcmV0dXJucyBudWxsLgogIAlPdGhlcndpc2UsIHJldHVybnMgYSBsaXN0IG9mIGJ1c2luZXNzIGhvdXJzIHNlZ3MgZm9yICpldmVyeSogcmVzb3VyY2UuCiAgICovCiAgY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VnczogZnVuY3Rpb24od2hvbGVEYXkpIHsKICAgIHZhciBhbGxTZWdzLCBhbnlDdXN0b21CdXNpbmVzc0hvdXJzLCBidXNpbmVzc0hvdXJzLCBldmVudCwgZXZlbnRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHJlZiwgcmVmMSwgcmVzb3VyY2UsIHNlZ3M7CiAgICBpZiAodGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMpIHsKICAgICAgYW55Q3VzdG9tQnVzaW5lc3NIb3VycyA9IGZhbHNlOwogICAgICByZWYgPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgcmVzb3VyY2UgPSByZWZbal07CiAgICAgICAgaWYgKHJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgICAgIGFueUN1c3RvbUJ1c2luZXNzSG91cnMgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW55Q3VzdG9tQnVzaW5lc3NIb3VycykgewogICAgICAgIGFsbFNlZ3MgPSBbXTsKICAgICAgICByZWYxID0gdGhpcy5mbGF0dGVuZWRSZXNvdXJjZXM7CiAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgICByZXNvdXJjZSA9IHJlZjFba107CiAgICAgICAgICBidXNpbmVzc0hvdXJzID0gcmVzb3VyY2UuYnVzaW5lc3NIb3VycyB8fCB0aGlzLnZpZXcub3B0KCdidXNpbmVzc0hvdXJzJyk7CiAgICAgICAgICBldmVudHMgPSB0aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh3aG9sZURheSwgYnVzaW5lc3NIb3Vycyk7CiAgICAgICAgICBmb3IgKGwgPSAwLCBsZW4yID0gZXZlbnRzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgICBldmVudCA9IGV2ZW50c1tsXTsKICAgICAgICAgICAgZXZlbnQucmVzb3VyY2VJZCA9IHJlc291cmNlLmlkOwogICAgICAgICAgfQogICAgICAgICAgc2VncyA9IHRoaXMuZXZlbnRzVG9TZWdzKGV2ZW50cyk7CiAgICAgICAgICBhbGxTZWdzLnB1c2guYXBwbHkoYWxsU2Vncywgc2Vncyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGxTZWdzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn07CgpSZXNvdXJjZURheUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZURheUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZURheUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VEYXlHcmlkLm1peGluKFJlc291cmNlRGF5VGFibGVNaXhpbik7CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgdmFyIHNwYW47CiAgICBzcGFuID0gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VEYXlHcmlkLnByb3RvdHlwZS5zcGFuVG9TZWdzID0gZnVuY3Rpb24oc3BhbikgewogICAgdmFyIGNvcHksIGdlbmVyaWNTZWdzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIHJlZiwgcmVzb3VyY2VDbnQsIHJlc291cmNlSW5kZXgsIHJlc291cmNlT2JqLCByZXNvdXJjZVNlZ3MsIHNlZzsKICAgIHJlc291cmNlQ250ID0gdGhpcy5yZXNvdXJjZUNudDsKICAgIGdlbmVyaWNTZWdzID0gdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzID8gdGhpcy5zbGljZVJhbmdlQnlEYXkoc3BhbikgOiB0aGlzLnNsaWNlUmFuZ2VCeVJvdyhzcGFuKTsKICAgIGlmICghcmVzb3VyY2VDbnQpIHsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZ2VuZXJpY1NlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBnZW5lcmljU2Vnc1tqXTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2VnLmxlZnRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgICAgc2VnLnJpZ2h0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5sZWZ0Q29sID0gc2VnLmZpcnN0Um93RGF5SW5kZXg7CiAgICAgICAgICBzZWcucmlnaHRDb2wgPSBzZWcubGFzdFJvd0RheUluZGV4OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgICAgICAgY29weS5sZWZ0Q29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmxhc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5maXJzdFJvd0RheUluZGV4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb3B5LmxlZnRDb2wgPSB0aGlzLmluZGljZXNUb0NvbChyZXNvdXJjZUluZGV4LCBzZWcuZmlyc3RSb3dEYXlJbmRleCk7CiAgICAgICAgICAgICAgY29weS5yaWdodENvbCA9IHRoaXMuaW5kaWNlc1RvQ29sKHJlc291cmNlSW5kZXgsIHNlZy5sYXN0Um93RGF5SW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc291cmNlU2Vncy5wdXNoKGNvcHkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzb3VyY2VTZWdzOwogICAgfQogIH07CgogIFJlc291cmNlRGF5R3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKHRydWUpOwogICAgaWYgKHNlZ3MpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRmlsbCgnYnVzaW5lc3NIb3VycycsIHNlZ3MsICdiZ2V2ZW50Jyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gUmVzb3VyY2VEYXlHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlRGF5R3JpZDsKCn0pKEZDLkRheUdyaWQpOwoKUmVzb3VyY2VUaW1lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVHcmlkKCkgewogICAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVHcmlkLm1peGluKFJlc291cmNlR3JpZE1peGluKTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5taXhpbihSZXNvdXJjZURheVRhYmxlTWl4aW4pOwoKICBSZXNvdXJjZVRpbWVHcmlkLnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICB2YXIgc3BhbjsKICAgIHNwYW4gPSBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5nZXRIaXRTcGFuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5yZXNvdXJjZUNudCkgewogICAgICBzcGFuLnJlc291cmNlSWQgPSB0aGlzLmdldENvbFJlc291cmNlKGhpdC5jb2wpLmlkOwogICAgfQogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBjb3B5LCBnZW5lcmljU2VncywgaiwgaywgbCwgbGVuLCBsZW4xLCByZWYsIHJlc291cmNlQ250LCByZXNvdXJjZUluZGV4LCByZXNvdXJjZU9iaiwgcmVzb3VyY2VTZWdzLCBzZWc7CiAgICByZXNvdXJjZUNudCA9IHRoaXMucmVzb3VyY2VDbnQ7CiAgICBnZW5lcmljU2VncyA9IHRoaXMuc2xpY2VSYW5nZUJ5VGltZXMoc3Bhbik7CiAgICBpZiAoIXJlc291cmNlQ250KSB7CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gZ2VuZXJpY1NlZ3Nbal07CiAgICAgICAgc2VnLmNvbCA9IHNlZy5kYXlJbmRleDsKICAgICAgfQogICAgICByZXR1cm4gZ2VuZXJpY1NlZ3M7CiAgICB9IGVsc2UgewogICAgICByZXNvdXJjZVNlZ3MgPSBbXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IGdlbmVyaWNTZWdzLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgIHNlZyA9IGdlbmVyaWNTZWdzW2tdOwogICAgICAgIGZvciAocmVzb3VyY2VJbmRleCA9IGwgPSAwLCByZWYgPSByZXNvdXJjZUNudDsgbCA8IHJlZjsgcmVzb3VyY2VJbmRleCA9IGwgKz0gMSkgewogICAgICAgICAgcmVzb3VyY2VPYmogPSB0aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tyZXNvdXJjZUluZGV4XTsKICAgICAgICAgIGlmICghc3Bhbi5yZXNvdXJjZUlkIHx8IHNwYW4ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VPYmouaWQpIHsKICAgICAgICAgICAgY29weSA9ICQuZXh0ZW5kKHt9LCBzZWcpOwogICAgICAgICAgICBjb3B5LnJlc291cmNlID0gcmVzb3VyY2VPYmo7CiAgICAgICAgICAgIGNvcHkuY29sID0gdGhpcy5pbmRpY2VzVG9Db2wocmVzb3VyY2VJbmRleCwgc2VnLmRheUluZGV4KTsKICAgICAgICAgICAgcmVzb3VyY2VTZWdzLnB1c2goY29weSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXNvdXJjZVNlZ3M7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5jb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzKGZhbHNlKTsKICAgIGlmIChzZWdzKSB7CiAgICAgIHJldHVybiB0aGlzLnJlbmRlckJ1c2luZXNzU2VncyhzZWdzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVHcmlkLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlVGltZUdyaWQ7Cgp9KShGQy5UaW1lR3JpZCk7CgpUaW1lbGluZVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBUaW1lbGluZVZpZXcoKSB7CiAgICByZXR1cm4gVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS50aW1lR3JpZCA9IG51bGw7CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNTY3JvbGxlZCA9IGZhbHNlOwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQgPSB0aGlzLmluc3RhbnRpYXRlR3JpZCgpOwogICAgcmV0dXJuIHRoaXMuaW50ZXJ2YWxEdXJhdGlvbiA9IHRoaXMudGltZUdyaWQuZHVyYXRpb247CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgVGltZWxpbmVHcmlkKHRoaXMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkgewogICAgVGltZWxpbmVWaWV3Ll9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmFuZ2UocmFuZ2UpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuYWRkQ2xhc3MoJ2ZjLXRpbWVsaW5lJyk7CiAgICBpZiAodGhpcy5vcHQoJ2V2ZW50T3ZlcmxhcCcpID09PSBmYWxzZSkgewogICAgICB0aGlzLmVsLmFkZENsYXNzKCdmYy1uby1vdmVybGFwJyk7CiAgICB9CiAgICB0aGlzLmVsLmh0bWwodGhpcy5yZW5kZXJTa2VsZXRvbkh0bWwoKSk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJUaW1lR3JpZFNrZWxldG9uKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbkh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnPHRhYmxlPiA8dGhlYWQgY2xhc3M9ImZjLWhlYWQiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldEhlYWRlckNsYXNzICsgJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRDb250ZW50Q2xhc3MgKyAnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJUaW1lR3JpZFNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtdGltZS1hcmVhJykpOwogICAgdGhpcy50aW1lR3JpZC5oZWFkRWwgPSB0aGlzLmVsLmZpbmQoJ3RoZWFkIC5mYy10aW1lLWFyZWEnKTsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKTsKICAgIHRoaXMuaXNTY3JvbGxlZCA9IGZhbHNlOwogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLm9uKCdzY3JvbGwnLCBwcm94eSh0aGlzLCAnaGFuZGxlQm9keVNjcm9sbCcpKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmhhbmRsZUJvZHlTY3JvbGwgPSBmdW5jdGlvbih0b3AsIGxlZnQpIHsKICAgIGlmICh0b3ApIHsKICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsZWQpIHsKICAgICAgICB0aGlzLmlzU2Nyb2xsZWQgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLmVsLmFkZENsYXNzKCdmYy1zY3JvbGxlZCcpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAodGhpcy5pc1Njcm9sbGVkKSB7CiAgICAgICAgdGhpcy5pc1Njcm9sbGVkID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRoaXMuZWwucmVtb3ZlQ2xhc3MoJ2ZjLXNjcm9sbGVkJyk7CiAgICAgIH0KICAgIH0KICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQucmVtb3ZlRWxlbWVudCgpOwogICAgdGhpcy5oYW5kbGVCb2R5U2Nyb2xsKDApOwogICAgcmV0dXJuIFRpbWVsaW5lVmlldy5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyRGF0ZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckRhdGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRhdGVzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJCdXNpbmVzc0hvdXJzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyQnVzaW5lc3NIb3VycygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0Tm93SW5kaWNhdG9yVW5pdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0Tm93SW5kaWNhdG9yVW5pdCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yID0gZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyTm93SW5kaWNhdG9yKGRhdGUpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyTm93SW5kaWNhdG9yKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5wcmVwYXJlSGl0cyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucHJlcGFyZUhpdHMoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5yZWxlYXNlSGl0cygpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbihsZWZ0T2Zmc2V0LCB0b3BPZmZzZXQpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnF1ZXJ5SGl0KGxlZnRPZmZzZXQsIHRvcE9mZnNldCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRTcGFuID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKGhpdCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXRIaXRFbCA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0SGl0RWwoaGl0KTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVwZGF0ZVdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24odG90YWxIZWlnaHQsIGlzQXV0bykgewogICAgdmFyIGJvZHlIZWlnaHQ7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSAtIHRoaXMucXVlcnlNaXNjSGVpZ2h0KCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpIC0gdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSAtIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTY3JvbGxTdGF0ZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwocHJldlNjcm9sbFN0YXRlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5xdWVyeVNjcm9sbCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbChzdGF0ZSk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMpIHsKICAgIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKGV2ZW50cyk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJFdmVudHMgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIHJldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckRyYWcoZHJvcExvY2F0aW9uLCBzZWcpOwogIH07CgogIFRpbWVsaW5lVmlldy5wcm90b3R5cGUudW5yZW5kZXJEcmFnID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlckRyYWcoKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldEV2ZW50U2VncyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQuZ2V0RXZlbnRTZWdzKCk7CiAgfTsKCiAgVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW5kZXJTZWxlY3Rpb24gPSBmdW5jdGlvbihyYW5nZSkgewogICAgcmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyU2VsZWN0aW9uKHJhbmdlKTsKICB9OwoKICBUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyU2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpOwogIH07CgogIHJldHVybiBUaW1lbGluZVZpZXc7Cgp9KShWaWV3KTsKCmNzc1RvU3RyID0gRkMuY3NzVG9TdHI7CgpUaW1lbGluZUdyaWQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChUaW1lbGluZUdyaWQsIHN1cGVyQ2xhc3MpOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REYXRlcyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2xvdENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcENudCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcHNQZXJTbG90ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbmFwRGlmZlRvSW5kZXggPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNuYXBJbmRleFRvRGlmZiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29udGFpbmVyRWwgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0SW5uZXJDb29yZENhY2hlID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXIgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5mb2xsb3dlciA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZXZlbnRUaXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5taW5UaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5tYXhUaW1lID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aW1lV2luZG93TXMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsb3REdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc25hcER1cmF0aW9uID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kdXJhdGlvbiA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUubGFiZWxJbnRlcnZhbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cyA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNUaW1lU2NhbGUgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmxhcmdlVW5pdCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW1waGFzaXplV2Vla3MgPSBmYWxzZTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS50aXRsZUZvbGxvd2VyID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZWdDb250YWluZXJFbCA9IG51bGw7CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5iZ1NlZ0NvbnRhaW5lckVsID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWxwZXJFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBmdW5jdGlvbiBUaW1lbGluZUdyaWQoKSB7CiAgICB2YXIgaW5wdXQ7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLmluaXRTY2FsZVByb3BzKCk7CiAgICB0aGlzLm1pblRpbWUgPSBtb21lbnQuZHVyYXRpb24odGhpcy5vcHQoJ21pblRpbWUnKSB8fCAnMDA6MDAnKTsKICAgIHRoaXMubWF4VGltZSA9IG1vbWVudC5kdXJhdGlvbih0aGlzLm9wdCgnbWF4VGltZScpIHx8ICcyNDowMCcpOwogICAgdGhpcy50aW1lV2luZG93TXMgPSB0aGlzLm1heFRpbWUgLSB0aGlzLm1pblRpbWU7CiAgICB0aGlzLnNuYXBEdXJhdGlvbiA9IChpbnB1dCA9IHRoaXMub3B0KCdzbmFwRHVyYXRpb24nKSkgPyBtb21lbnQuZHVyYXRpb24oaW5wdXQpIDogdGhpcy5zbG90RHVyYXRpb247CiAgICB0aGlzLm1pblJlc2l6ZUR1cmF0aW9uID0gdGhpcy5zbmFwRHVyYXRpb247CiAgICB0aGlzLnNuYXBzUGVyU2xvdCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbih0aGlzLnNsb3REdXJhdGlvbiwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgdGhpcy5zbG90V2lkdGggPSB0aGlzLm9wdCgnc2xvdFdpZHRoJyk7CiAgfQoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm9wdCA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLnZpZXcub3B0KG5hbWUpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaXNWYWxpZERhdGUgPSBmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgbXM7CiAgICBpZiAodGhpcy52aWV3LmlzSGlkZGVuRGF5KGRhdGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBtcyA9IGRhdGUudGltZSgpIC0gdGhpcy5taW5UaW1lOwogICAgICBtcyA9ICgobXMgJSA4NjQwMDAwMCkgKyA4NjQwMDAwMCkgJSA4NjQwMDAwMDsKICAgICAgcmV0dXJuIG1zIDwgdGhpcy50aW1lV2luZG93TXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEaXNwbGF5RXZlbnRUaW1lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gIXRoaXMuaXNUaW1lU2NhbGU7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRGlzcGxheUV2ZW50RW5kID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5vcHQoJ2V4dHJhU21hbGxUaW1lRm9ybWF0Jyk7CiAgfTsKCgogIC8qCiAgCU1ha2VzIHRoZSBnaXZlbiBkYXRlIGNvbnNpc3RlbnQgd2l0aCBpc1RpbWVTY2FsZS9sYXJnZVVuaXQsCiAgCXNvLCBlaXRoZXIgcmVtb3ZlcyB0aGUgdGltZXMsIGVuc3VyZXMgYSB0aW1lLCBvciBtYWtlcyBpdCB0aGUgc3RhcnRPZiBsYXJnZVVuaXQuCiAgCVN0cmlwcyBhbGwgdGltZXpvbmVzLiBSZXR1cm5zIG5ldyBjb3B5LgogIAlUT0RPOiBzaG91bGQgbWF5YmUgYmUgY2FsbGVkICJub3JtYWxpemVSYW5nZURhdGUiLgogICAqLwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWREYXRlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIG5vcm1hbERhdGU7CiAgICBpZiAodGhpcy5pc1RpbWVTY2FsZSkgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpOwogICAgICBpZiAoIW5vcm1hbERhdGUuaGFzVGltZSgpKSB7CiAgICAgICAgbm9ybWFsRGF0ZS50aW1lKDApOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBub3JtYWxEYXRlID0gZGF0ZS5jbG9uZSgpLnN0cmlwVGltZSgpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxEYXRlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9ybWFsRGF0ZTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLm5vcm1hbGl6ZUdyaWRSYW5nZSA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICB2YXIgYWRqdXN0ZWRFbmQsIG5vcm1hbFJhbmdlOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgbm9ybWFsUmFuZ2UgPSB7CiAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplR3JpZERhdGUocmFuZ2Uuc3RhcnQpLAogICAgICAgIGVuZDogdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBub3JtYWxSYW5nZSA9IHRoaXMudmlldy5jb21wdXRlRGF5UmFuZ2UocmFuZ2UpOwogICAgICBpZiAodGhpcy5sYXJnZVVuaXQpIHsKICAgICAgICBub3JtYWxSYW5nZS5zdGFydC5zdGFydE9mKHRoaXMubGFyZ2VVbml0KTsKICAgICAgICBhZGp1c3RlZEVuZCA9IG5vcm1hbFJhbmdlLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpOwogICAgICAgIGlmICghYWRqdXN0ZWRFbmQuaXNTYW1lKG5vcm1hbFJhbmdlLmVuZCkgfHwgIWFkanVzdGVkRW5kLmlzQWZ0ZXIobm9ybWFsUmFuZ2Uuc3RhcnQpKSB7CiAgICAgICAgICBhZGp1c3RlZEVuZC5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBub3JtYWxSYW5nZS5lbmQgPSBhZGp1c3RlZEVuZDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5vcm1hbFJhbmdlOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmFuZ2VVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGF0ZSwgc2xvdERhdGVzOwogICAgdGhpcy5zdGFydCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5zdGFydCk7CiAgICB0aGlzLmVuZCA9IHRoaXMubm9ybWFsaXplR3JpZERhdGUodGhpcy5lbmQpOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgdGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKTsKICAgICAgdGhpcy5lbmQuc3VidHJhY3QoMSwgJ2RheScpLmFkZCh0aGlzLm1heFRpbWUpOwogICAgfQogICAgc2xvdERhdGVzID0gW107CiAgICBkYXRlID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgd2hpbGUgKGRhdGUgPCB0aGlzLmVuZCkgewogICAgICBpZiAodGhpcy5pc1ZhbGlkRGF0ZShkYXRlKSkgewogICAgICAgIHNsb3REYXRlcy5wdXNoKGRhdGUuY2xvbmUoKSk7CiAgICAgIH0KICAgICAgZGF0ZS5hZGQodGhpcy5zbG90RHVyYXRpb24pOwogICAgfQogICAgdGhpcy5zbG90RGF0ZXMgPSBzbG90RGF0ZXM7CiAgICByZXR1cm4gdGhpcy51cGRhdGVHcmlkRGF0ZXMoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZUdyaWREYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIHNuYXBEaWZmLCBzbmFwRGlmZlRvSW5kZXgsIHNuYXBJbmRleCwgc25hcEluZGV4VG9EaWZmOwogICAgc25hcEluZGV4ID0gLTE7CiAgICBzbmFwRGlmZiA9IDA7CiAgICBzbmFwRGlmZlRvSW5kZXggPSBbXTsKICAgIHNuYXBJbmRleFRvRGlmZiA9IFtdOwogICAgZGF0ZSA9IHRoaXMuc3RhcnQuY2xvbmUoKTsKICAgIHdoaWxlIChkYXRlIDwgdGhpcy5lbmQpIHsKICAgICAgaWYgKHRoaXMuaXNWYWxpZERhdGUoZGF0ZSkpIHsKICAgICAgICBzbmFwSW5kZXgrKzsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXgpOwogICAgICAgIHNuYXBJbmRleFRvRGlmZi5wdXNoKHNuYXBEaWZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbmFwRGlmZlRvSW5kZXgucHVzaChzbmFwSW5kZXggKyAwLjUpOwogICAgICB9CiAgICAgIGRhdGUuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgICAgc25hcERpZmYrKzsKICAgIH0KICAgIHRoaXMuc25hcERpZmZUb0luZGV4ID0gc25hcERpZmZUb0luZGV4OwogICAgdGhpcy5zbmFwSW5kZXhUb0RpZmYgPSBzbmFwSW5kZXhUb0RpZmY7CiAgICB0aGlzLnNuYXBDbnQgPSBzbmFwSW5kZXggKyAxOwogICAgcmV0dXJuIHRoaXMuc2xvdENudCA9IHRoaXMuc25hcENudCAvIHRoaXMuc25hcHNQZXJTbG90OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc3BhblRvU2VncyA9IGZ1bmN0aW9uKHNwYW4pIHsKICAgIHZhciBub3JtYWxSYW5nZSwgc2VnOwogICAgbm9ybWFsUmFuZ2UgPSB0aGlzLm5vcm1hbGl6ZUdyaWRSYW5nZShzcGFuKTsKICAgIGlmICh0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKHNwYW4uc3RhcnQpIDwgdGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZShzcGFuLmVuZCkpIHsKICAgICAgc2VnID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCB0aGlzKTsKICAgICAgaWYgKHNlZykgewogICAgICAgIGlmIChzZWcuaXNTdGFydCAmJiAhdGhpcy5pc1ZhbGlkRGF0ZShzZWcuc3RhcnQpKSB7CiAgICAgICAgICBzZWcuaXNTdGFydCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoc2VnLmlzRW5kICYmIHNlZy5lbmQgJiYgIXRoaXMuaXNWYWxpZERhdGUoc2VnLmVuZC5jbG9uZSgpLnN1YnRyYWN0KDEpKSkgewogICAgICAgICAgc2VnLmlzRW5kID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbc2VnXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFtdOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIGNvbnRhaW5lckNvb3JkQ2FjaGUsIGxvY2FsU25hcEluZGV4LCBwYXJ0aWFsLCBzbGF0Q29vcmRDYWNoZSwgc2xhdEluZGV4LCBzbGF0TGVmdCwgc2xhdFJpZ2h0LCBzbGF0V2lkdGgsIHNuYXBJbmRleCwgc25hcExlZnQsIHNuYXBSaWdodCwgc25hcHNQZXJTbG90OwogICAgc25hcHNQZXJTbG90ID0gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbGF0Q29vcmRDYWNoZSA9IHRoaXMuc2xhdENvb3JkQ2FjaGU7CiAgICBjb250YWluZXJDb29yZENhY2hlID0gdGhpcy5jb250YWluZXJDb29yZENhY2hlOwogICAgaWYgKGNvbnRhaW5lckNvb3JkQ2FjaGUuaXNUb3BJbkJvdW5kcyh0b3BPZmZzZXQpKSB7CiAgICAgIHNsYXRJbmRleCA9IHNsYXRDb29yZENhY2hlLmdldEhvcml6b250YWxJbmRleChsZWZ0T2Zmc2V0KTsKICAgICAgaWYgKHNsYXRJbmRleCAhPSBudWxsKSB7CiAgICAgICAgc2xhdFdpZHRoID0gc2xhdENvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xhdEluZGV4KTsKICAgICAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICAgICAgc2xhdFJpZ2h0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0UmlnaHRPZmZzZXQoc2xhdEluZGV4KTsKICAgICAgICAgIHBhcnRpYWwgPSAoc2xhdFJpZ2h0IC0gbGVmdE9mZnNldCkgLyBzbGF0V2lkdGg7CiAgICAgICAgICBsb2NhbFNuYXBJbmRleCA9IE1hdGguZmxvb3IocGFydGlhbCAqIHNuYXBzUGVyU2xvdCk7CiAgICAgICAgICBzbmFwSW5kZXggPSBzbGF0SW5kZXggKiBzbmFwc1BlclNsb3QgKyBsb2NhbFNuYXBJbmRleDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRSaWdodCAtIChsb2NhbFNuYXBJbmRleCAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNuYXBSaWdodCAtICgobG9jYWxTbmFwSW5kZXggKyAxKSAvIHNuYXBzUGVyU2xvdCkgKiBzbGF0V2lkdGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNsYXRMZWZ0ID0gc2xhdENvb3JkQ2FjaGUuZ2V0TGVmdE9mZnNldChzbGF0SW5kZXgpOwogICAgICAgICAgcGFydGlhbCA9IChsZWZ0T2Zmc2V0IC0gc2xhdExlZnQpIC8gc2xhdFdpZHRoOwogICAgICAgICAgbG9jYWxTbmFwSW5kZXggPSBNYXRoLmZsb29yKHBhcnRpYWwgKiBzbmFwc1BlclNsb3QpOwogICAgICAgICAgc25hcEluZGV4ID0gc2xhdEluZGV4ICogc25hcHNQZXJTbG90ICsgbG9jYWxTbmFwSW5kZXg7CiAgICAgICAgICBzbmFwTGVmdCA9IHNsYXRMZWZ0ICsgKGxvY2FsU25hcEluZGV4IC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICAgIHNuYXBSaWdodCA9IHNsYXRMZWZ0ICsgKChsb2NhbFNuYXBJbmRleCArIDEpIC8gc25hcHNQZXJTbG90KSAqIHNsYXRXaWR0aDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNuYXA6IHNuYXBJbmRleCwKICAgICAgICAgIGNvbXBvbmVudDogdGhpcywKICAgICAgICAgIGxlZnQ6IHNuYXBMZWZ0LAogICAgICAgICAgcmlnaHQ6IHNuYXBSaWdodCwKICAgICAgICAgIHRvcDogY29udGFpbmVyQ29vcmRDYWNoZS5nZXRUb3BPZmZzZXQoMCksCiAgICAgICAgICBib3R0b206IGNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0Qm90dG9tT2Zmc2V0KDApCiAgICAgICAgfTsKICAgICAgfQogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0SGl0U3BhbiA9IGZ1bmN0aW9uKGhpdCkgewogICAgcmV0dXJuIHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZ2V0U25hcFJhbmdlID0gZnVuY3Rpb24oc25hcEluZGV4KSB7CiAgICB2YXIgZW5kLCBzdGFydDsKICAgIHN0YXJ0ID0gdGhpcy5zdGFydC5jbG9uZSgpOwogICAgc3RhcnQuYWRkKG11bHRpcGx5RHVyYXRpb24odGhpcy5zbmFwRHVyYXRpb24sIHRoaXMuc25hcEluZGV4VG9EaWZmW3NuYXBJbmRleF0pKTsKICAgIGVuZCA9IHN0YXJ0LmNsb25lKCkuYWRkKHRoaXMuc25hcER1cmF0aW9uKTsKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgZW5kOiBlbmQKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5nZXRTbmFwRWwgPSBmdW5jdGlvbihzbmFwSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnNsYXRFbHMuZXEoTWF0aC5mbG9vcihzbmFwSW5kZXggLyB0aGlzLnNuYXBzUGVyU2xvdCkpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcih7CiAgICAgIG92ZXJmbG93WDogJ2NsaXBwZWQtc2Nyb2xsJywKICAgICAgb3ZlcmZsb3dZOiAnaGlkZGVuJwogICAgfSk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMgPSBuZXcgU2Nyb2xsZXJDYW52YXMoKTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpOwogICAgdGhpcy5oZWFkRWwuYXBwZW5kKHRoaXMuaGVhZFNjcm9sbGVyLmVsKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyID0gbmV3IENsaXBwZWRTY3JvbGxlcigpOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWw7CiAgICB0aGlzLnNsYXRDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXNsYXRzIi8+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpOwogICAgdGhpcy5iZ1NlZ0NvbnRhaW5lckVsID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWw7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLAogICAgICBpc0hvcml6b250YWw6IHRydWUsCiAgICAgIGlzVmVydGljYWw6IHRydWUKICAgIH0pOwogICAgdGhpcy5qb2luZXIgPSBuZXcgU2Nyb2xsSm9pbmVyKCdob3Jpem9udGFsJywgW3RoaXMuaGVhZFNjcm9sbGVyLCB0aGlzLmJvZHlTY3JvbGxlcl0pOwogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5mb2xsb3dlciA9IG5ldyBTY3JvbGxGb2xsb3dlcih0aGlzLmhlYWRTY3JvbGxlciwgdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpOwogICAgfQogICAgaWYgKHRydWUpIHsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5ib2R5U2Nyb2xsZXIsIHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKTsKICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIubWluVHJhdmVsID0gNTA7CiAgICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgICAgdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbFJpZ2h0ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsTGVmdCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkQ29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zbGF0Q29sRWxzID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGRhdGUsIGksIGosIGxlbiwgcmVmOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ2NvbCcpOwogICAgdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpOwogICAgdGhpcy5zbGF0Q29sRWxzID0gdGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgnY29sJyk7CiAgICB0aGlzLnNsYXRFbHMgPSB0aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCd0ZCcpOwogICAgdGhpcy5zbGF0Q29vcmRDYWNoZSA9IG5ldyBDb29yZENhY2hlKHsKICAgICAgZWxzOiB0aGlzLnNsYXRFbHMsCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZQogICAgfSk7CiAgICB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdGhpcy5zbGF0RWxzLmZpbmQoJz4gZGl2JyksCiAgICAgIGlzSG9yaXpvbnRhbDogdHJ1ZSwKICAgICAgb2Zmc2V0UGFyZW50OiB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwKICAgIH0pOwogICAgcmVmID0gdGhpcy5zbG90RGF0ZXM7CiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikgewogICAgICBkYXRlID0gcmVmW2ldOwogICAgICB0aGlzLnZpZXcudHJpZ2dlcignZGF5UmVuZGVyJywgbnVsbCwgZGF0ZSwgdGhpcy5zbGF0RWxzLmVxKGkpKTsKICAgIH0KICAgIGlmICh0aGlzLmZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmZvbGxvd2VyLnNldFNwcml0ZXModGhpcy5oZWFkRWwuZmluZCgndHI6bm90KDpsYXN0LWNoaWxkKSBzcGFuJykpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJEYXRlcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgdGhpcy5mb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKTsKICAgIHRoaXMuc2xhdENvbnRhaW5lckVsLmVtcHR5KCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY2xlYXJXaWR0aCgpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWFkSHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNlbGwsIGNlbGxSb3dzLCBkYXRlLCBkYXRlRGF0YSwgZm9ybWF0LCBmb3JtYXRzLCBodG1sLCBpLCBpc0Nocm9ubywgaXNMYXN0LCBpc1N1cGVyUm93LCBpc1dlZWtTdGFydCwgaiwgaywgbCwgbGFiZWxJbnRlcnZhbCwgbGVhZGluZ0NlbGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbGVuNSwgbGVuNiwgbSwgbiwgbmV3Q2VsbCwgcCwgcHJldldlZWtOdW1iZXIsIHEsIHJvdywgcm93Q2VsbHMsIHNsYXRIdG1sLCBzbG90Q2VsbHMsIHNsb3REYXRlcywgdGV4dCwgd2Vla051bWJlcjsKICAgIGxhYmVsSW50ZXJ2YWwgPSB0aGlzLmxhYmVsSW50ZXJ2YWw7CiAgICBmb3JtYXRzID0gdGhpcy5oZWFkZXJGb3JtYXRzOwogICAgY2VsbFJvd3MgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBqLCBsZW4sIHJlc3VsdHM7CiAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gZm9ybWF0cy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGZvcm1hdCA9IGZvcm1hdHNbal07CiAgICAgICAgcmVzdWx0cy5wdXNoKFtdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICBsZWFkaW5nQ2VsbCA9IG51bGw7CiAgICBwcmV2V2Vla051bWJlciA9IG51bGw7CiAgICBzbG90RGF0ZXMgPSB0aGlzLnNsb3REYXRlczsKICAgIHNsb3RDZWxscyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gc2xvdERhdGVzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbal07CiAgICAgIHdlZWtOdW1iZXIgPSBkYXRlLndlZWsoKTsKICAgICAgaXNXZWVrU3RhcnQgPSB0aGlzLmVtcGhhc2l6ZVdlZWtzICYmIHByZXZXZWVrTnVtYmVyICE9PSBudWxsICYmIHByZXZXZWVrTnVtYmVyICE9PSB3ZWVrTnVtYmVyOwogICAgICBmb3IgKHJvdyA9IGsgPSAwLCBsZW4xID0gZm9ybWF0cy5sZW5ndGg7IGsgPCBsZW4xOyByb3cgPSArK2spIHsKICAgICAgICBmb3JtYXQgPSBmb3JtYXRzW3Jvd107CiAgICAgICAgcm93Q2VsbHMgPSBjZWxsUm93c1tyb3ddOwogICAgICAgIGxlYWRpbmdDZWxsID0gcm93Q2VsbHNbcm93Q2VsbHMubGVuZ3RoIC0gMV07CiAgICAgICAgaXNTdXBlclJvdyA9IGZvcm1hdHMubGVuZ3RoID4gMSAmJiByb3cgPCBmb3JtYXRzLmxlbmd0aCAtIDE7CiAgICAgICAgbmV3Q2VsbCA9IG51bGw7CiAgICAgICAgaWYgKGlzU3VwZXJSb3cpIHsKICAgICAgICAgIHRleHQgPSBkYXRlLmZvcm1hdChmb3JtYXQpOwogICAgICAgICAgZGF0ZURhdGEgPSBkYXRlLmZvcm1hdCgpOwogICAgICAgICAgaWYgKCFsZWFkaW5nQ2VsbCB8fCBsZWFkaW5nQ2VsbC50ZXh0ICE9PSB0ZXh0KSB7CiAgICAgICAgICAgIG5ld0NlbGwgPSB7CiAgICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgICBkYXRlRGF0YTogZGF0ZURhdGEsCiAgICAgICAgICAgICAgY29sc3BhbjogMQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGVhZGluZ0NlbGwuY29sc3BhbiArPSAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWxlYWRpbmdDZWxsIHx8IGlzSW50KGRpdmlkZVJhbmdlQnlEdXJhdGlvbih0aGlzLnN0YXJ0LCBkYXRlLCBsYWJlbEludGVydmFsKSkpIHsKICAgICAgICAgICAgdGV4dCA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7CiAgICAgICAgICAgIGRhdGVEYXRhID0gZGF0ZS5mb3JtYXQoKTsKICAgICAgICAgICAgbmV3Q2VsbCA9IHsKICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgIGRhdGVEYXRhOiBkYXRlRGF0YSwKICAgICAgICAgICAgICBjb2xzcGFuOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZWFkaW5nQ2VsbC5jb2xzcGFuICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChuZXdDZWxsKSB7CiAgICAgICAgICBuZXdDZWxsLndlZWtTdGFydCA9IGlzV2Vla1N0YXJ0OwogICAgICAgICAgcm93Q2VsbHMucHVzaChuZXdDZWxsKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2xvdENlbGxzLnB1c2goewogICAgICAgIHdlZWtTdGFydDogaXNXZWVrU3RhcnQKICAgICAgfSk7CiAgICAgIHByZXZXZWVrTnVtYmVyID0gd2Vla051bWJlcjsKICAgIH0KICAgIGlzQ2hyb25vID0gbGFiZWxJbnRlcnZhbCA+IHRoaXMuc2xvdER1cmF0aW9uOwogICAgaHRtbCA9ICc8dGFibGU+JzsKICAgIGh0bWwgKz0gJzxjb2xncm91cD4nOwogICAgZm9yIChsID0gMCwgbGVuMiA9IHNsb3REYXRlcy5sZW5ndGg7IGwgPCBsZW4yOyBsKyspIHsKICAgICAgZGF0ZSA9IHNsb3REYXRlc1tsXTsKICAgICAgaHRtbCArPSAnPGNvbC8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgZm9yIChpID0gbSA9IDAsIGxlbjMgPSBjZWxsUm93cy5sZW5ndGg7IG0gPCBsZW4zOyBpID0gKyttKSB7CiAgICAgIHJvd0NlbGxzID0gY2VsbFJvd3NbaV07CiAgICAgIGlzTGFzdCA9IGkgPT09IGNlbGxSb3dzLmxlbmd0aCAtIDE7CiAgICAgIGh0bWwgKz0gJzx0cicgKyAoaXNDaHJvbm8gJiYgaXNMYXN0ID8gJyBjbGFzcz0iZmMtY2hyb25vIicgOiAnJykgKyAnPic7CiAgICAgIGZvciAobiA9IDAsIGxlbjQgPSByb3dDZWxscy5sZW5ndGg7IG4gPCBsZW40OyBuKyspIHsKICAgICAgICBjZWxsID0gcm93Q2VsbHNbbl07CiAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyAnICsgKGNlbGwud2Vla1N0YXJ0ID8gJ2ZjLWVtLWNlbGwnIDogJycpICsgJyInICsgJyBkYXRhLWRhdGU9IicgKyBjZWxsLmRhdGVEYXRhICsgJyInICsgKGNlbGwuY29sc3BhbiA+IDEgPyAnIGNvbHNwYW49IicgKyBjZWxsLmNvbHNwYW4gKyAnIicgOiAnJykgKyAnPicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicgKyBodG1sRXNjYXBlKGNlbGwudGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPic7CiAgICAgIH0KICAgICAgaHRtbCArPSAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CiAgICBzbGF0SHRtbCA9ICc8dGFibGU+JzsKICAgIHNsYXRIdG1sICs9ICc8Y29sZ3JvdXA+JzsKICAgIGZvciAocCA9IDAsIGxlbjUgPSBzbG90Q2VsbHMubGVuZ3RoOyBwIDwgbGVuNTsgcCsrKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbcF07CiAgICAgIHNsYXRIdG1sICs9ICc8Y29sLz4nOwogICAgfQogICAgc2xhdEh0bWwgKz0gJzwvY29sZ3JvdXA+JzsKICAgIHNsYXRIdG1sICs9ICc8dGJvZHk+PHRyPic7CiAgICBmb3IgKGkgPSBxID0gMCwgbGVuNiA9IHNsb3RDZWxscy5sZW5ndGg7IHEgPCBsZW42OyBpID0gKytxKSB7CiAgICAgIGNlbGwgPSBzbG90Q2VsbHNbaV07CiAgICAgIGRhdGUgPSBzbG90RGF0ZXNbaV07CiAgICAgIHNsYXRIdG1sICs9IHRoaXMuc2xhdENlbGxIdG1sKGRhdGUsIGNlbGwud2Vla1N0YXJ0KTsKICAgIH0KICAgIHNsYXRIdG1sICs9ICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOwogICAgdGhpcy5fc2xhdEh0bWwgPSBzbGF0SHRtbDsKICAgIHJldHVybiBodG1sOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyU2xhdEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9zbGF0SHRtbDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNsYXRDZWxsSHRtbCA9IGZ1bmN0aW9uKGRhdGUsIGlzRW0pIHsKICAgIHZhciBjbGFzc2VzOwogICAgaWYgKHRoaXMuaXNUaW1lU2NhbGUpIHsKICAgICAgY2xhc3NlcyA9IFtdOwogICAgICBjbGFzc2VzLnB1c2goaXNJbnQoZGl2aWRlUmFuZ2VCeUR1cmF0aW9uKHRoaXMuc3RhcnQsIGRhdGUsIHRoaXMubGFiZWxJbnRlcnZhbCkpID8gJ2ZjLW1ham9yJyA6ICdmYy1taW5vcicpOwogICAgfSBlbHNlIHsKICAgICAgY2xhc3NlcyA9IHRoaXMuZ2V0RGF5Q2xhc3NlcyhkYXRlKTsKICAgICAgY2xhc3Nlcy5wdXNoKCdmYy1kYXknKTsKICAgIH0KICAgIGNsYXNzZXMudW5zaGlmdCh0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzKTsKICAgIGlmIChpc0VtKSB7CiAgICAgIGNsYXNzZXMucHVzaCgnZmMtZW0tY2VsbCcpOwogICAgfQogICAgcmV0dXJuICc8dGQgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciJyArICcgZGF0YS1kYXRlPSInICsgZGF0ZS5mb3JtYXQoKSArICciJyArICc+PGRpdiAvPjwvdGQ+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBzZWdzOwogICAgaWYgKCF0aGlzLmxhcmdlVW5pdCkgewogICAgICBzZWdzID0gdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gdGhpcy5idWlsZEJ1c2luZXNzSG91clNlZ3MoIXRoaXMuaXNUaW1lU2NhbGUpOwogICAgICByZXR1cm4gdGhpcy5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJywgc2VncywgJ2JnZXZlbnQnKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCdidXNpbmVzc0hvdXJzJyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ub3dJbmRpY2F0b3JFbHMgPSBudWxsOwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHJldHVybiBjb21wdXRlSW50ZXJ2YWxVbml0KHRoaXMuc2xvdER1cmF0aW9uKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvciA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBjb29yZCwgY3NzLCBub2RlczsKICAgIG5vZGVzID0gW107CiAgICBkYXRlID0gdGhpcy5ub3JtYWxpemVHcmlkRGF0ZShkYXRlKTsKICAgIGlmIChkYXRlID49IHRoaXMuc3RhcnQgJiYgZGF0ZSA8IHRoaXMuZW5kKSB7CiAgICAgIGNvb3JkID0gdGhpcy5kYXRlVG9Db29yZChkYXRlKTsKICAgICAgY3NzID0gdGhpcy5pc1JUTCA/IHsKICAgICAgICByaWdodDogLWNvb3JkCiAgICAgIH0gOiB7CiAgICAgICAgbGVmdDogY29vcmQKICAgICAgfTsKICAgICAgbm9kZXMucHVzaCgkKCI8ZGl2IGNsYXNzPSdmYy1ub3ctaW5kaWNhdG9yIGZjLW5vdy1pbmRpY2F0b3ItYXJyb3cnPjwvZGl2PiIpLmNzcyhjc3MpLmFwcGVuZFRvKHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5lbClbMF0pOwogICAgICBub2Rlcy5wdXNoKCQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MoY3NzKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwpWzBdKTsKICAgIH0KICAgIHJldHVybiB0aGlzLm5vd0luZGljYXRvckVscyA9ICQobm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJOb3dJbmRpY2F0b3IgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLm5vd0luZGljYXRvckVscykgewogICAgICB0aGlzLm5vd0luZGljYXRvckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5kZWZhdWx0U2xvdFdpZHRoID0gbnVsbDsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGF2YWlsYWJsZVdpZHRoLCBjb250YWluZXJNaW5XaWR0aCwgY29udGFpbmVyV2lkdGgsIG5vbkxhc3RTbG90V2lkdGgsIHNsb3RXaWR0aDsKICAgIHNsb3RXaWR0aCA9IE1hdGgucm91bmQodGhpcy5zbG90V2lkdGggfHwgKHRoaXMuc2xvdFdpZHRoID0gdGhpcy5jb21wdXRlU2xvdFdpZHRoKCkpKTsKICAgIGNvbnRhaW5lcldpZHRoID0gc2xvdFdpZHRoICogdGhpcy5zbG90RGF0ZXMubGVuZ3RoOwogICAgY29udGFpbmVyTWluV2lkdGggPSAnJzsKICAgIG5vbkxhc3RTbG90V2lkdGggPSBzbG90V2lkdGg7CiAgICBhdmFpbGFibGVXaWR0aCA9IHRoaXMuYm9keVNjcm9sbGVyLmdldENsaWVudFdpZHRoKCk7CiAgICBpZiAoYXZhaWxhYmxlV2lkdGggPiBjb250YWluZXJXaWR0aCkgewogICAgICBjb250YWluZXJNaW5XaWR0aCA9IGF2YWlsYWJsZVdpZHRoOwogICAgICBjb250YWluZXJXaWR0aCA9ICcnOwogICAgICBub25MYXN0U2xvdFdpZHRoID0gTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIHRoaXMuc2xvdERhdGVzLmxlbmd0aCk7CiAgICB9CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0V2lkdGgoY29udGFpbmVyV2lkdGgpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGNvbnRhaW5lck1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChjb250YWluZXJXaWR0aCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoY29udGFpbmVyTWluV2lkdGgpOwogICAgdGhpcy5oZWFkQ29sRWxzLnNsaWNlKDAsIC0xKS5hZGQodGhpcy5zbGF0Q29sRWxzLnNsaWNlKDAsIC0xKSkud2lkdGgobm9uTGFzdFNsb3RXaWR0aCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCk7CiAgICB0aGlzLmpvaW5lci51cGRhdGUoKTsKICAgIHRoaXMuYnVpbGRDb29yZHMoKTsKICAgIHRoaXMudXBkYXRlU2VnUG9zaXRpb25zKCk7CiAgICB0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCk7CiAgICBpZiAodGhpcy5mb2xsb3dlcikgewogICAgICB0aGlzLmZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci51cGRhdGUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHZhciBoZWFkZXJXaWR0aCwgaW5uZXJFbHMsIG1heElubmVyV2lkdGgsIG1pbldpZHRoLCBzbG90V2lkdGgsIHNsb3RzUGVyTGFiZWw7CiAgICBtYXhJbm5lcldpZHRoID0gMDsKICAgIGlubmVyRWxzID0gdGhpcy5oZWFkRWwuZmluZCgndHI6bGFzdC1jaGlsZCB0aCBzcGFuJyk7CiAgICBpbm5lckVscy5lYWNoKGZ1bmN0aW9uKGksIG5vZGUpIHsKICAgICAgdmFyIGlubmVyV2lkdGg7CiAgICAgIGlubmVyV2lkdGggPSAkKG5vZGUpLm91dGVyV2lkdGgoKTsKICAgICAgcmV0dXJuIG1heElubmVyV2lkdGggPSBNYXRoLm1heChtYXhJbm5lcldpZHRoLCBpbm5lcldpZHRoKTsKICAgIH0pOwogICAgaGVhZGVyV2lkdGggPSBtYXhJbm5lcldpZHRoICsgMTsKICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5sYWJlbEludGVydmFsLCB0aGlzLnNsb3REdXJhdGlvbik7CiAgICBzbG90V2lkdGggPSBNYXRoLmNlaWwoaGVhZGVyV2lkdGggLyBzbG90c1BlckxhYmVsKTsKICAgIG1pbldpZHRoID0gdGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygnbWluLXdpZHRoJyk7CiAgICBpZiAobWluV2lkdGgpIHsKICAgICAgbWluV2lkdGggPSBwYXJzZUludChtaW5XaWR0aCwgMTApOwogICAgICBpZiAobWluV2lkdGgpIHsKICAgICAgICBzbG90V2lkdGggPSBNYXRoLm1heChzbG90V2lkdGgsIG1pbldpZHRoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNsb3RXaWR0aDsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmJ1aWxkQ29vcmRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKTsKICAgIHJldHVybiB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIHNuYXBDb3ZlcmFnZSwgc25hcERpZmYsIHNuYXBEaWZmSW50OwogICAgc25hcERpZmYgPSBkaXZpZGVSYW5nZUJ5RHVyYXRpb24odGhpcy5zdGFydCwgZGF0ZSwgdGhpcy5zbmFwRHVyYXRpb24pOwogICAgaWYgKHNuYXBEaWZmIDwgMCkgewogICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSBpZiAoc25hcERpZmYgPj0gdGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnNuYXBDbnQ7CiAgICB9IGVsc2UgewogICAgICBzbmFwRGlmZkludCA9IE1hdGguZmxvb3Ioc25hcERpZmYpOwogICAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLnNuYXBEaWZmVG9JbmRleFtzbmFwRGlmZkludF07CiAgICAgIGlmIChpc0ludChzbmFwQ292ZXJhZ2UpKSB7CiAgICAgICAgc25hcENvdmVyYWdlICs9IHNuYXBEaWZmIC0gc25hcERpZmZJbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc25hcENvdmVyYWdlID0gTWF0aC5jZWlsKHNuYXBDb3ZlcmFnZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNuYXBDb3ZlcmFnZTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLmRhdGVUb0Nvb3JkID0gZnVuY3Rpb24oZGF0ZSkgewogICAgdmFyIGNvb3JkQ2FjaGUsIHBhcnRpYWwsIHNsb3RDb3ZlcmFnZSwgc2xvdEluZGV4LCBzbmFwQ292ZXJhZ2U7CiAgICBzbmFwQ292ZXJhZ2UgPSB0aGlzLmNvbXB1dGVEYXRlU25hcENvdmVyYWdlKGRhdGUpOwogICAgc2xvdENvdmVyYWdlID0gc25hcENvdmVyYWdlIC8gdGhpcy5zbmFwc1BlclNsb3Q7CiAgICBzbG90SW5kZXggPSBNYXRoLmZsb29yKHNsb3RDb3ZlcmFnZSk7CiAgICBzbG90SW5kZXggPSBNYXRoLm1pbihzbG90SW5kZXgsIHRoaXMuc2xvdENudCAtIDEpOwogICAgcGFydGlhbCA9IHNsb3RDb3ZlcmFnZSAtIHNsb3RJbmRleDsKICAgIGNvb3JkQ2FjaGUgPSB0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGU7CiAgICBpZiAodGhpcy5pc1JUTCkgewogICAgICByZXR1cm4gKGNvb3JkQ2FjaGUuZ2V0UmlnaHRQb3NpdGlvbihzbG90SW5kZXgpIC0gY29vcmRDYWNoZS5nZXRXaWR0aChzbG90SW5kZXgpICogcGFydGlhbCkgLSB0aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29vcmRDYWNoZS5nZXRMZWZ0UG9zaXRpb24oc2xvdEluZGV4KSArIGNvb3JkQ2FjaGUuZ2V0V2lkdGgoc2xvdEluZGV4KSAqIHBhcnRpYWw7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzID0gZnVuY3Rpb24ocmFuZ2UpIHsKICAgIGlmICh0aGlzLmlzUlRMKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcmlnaHQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2Uuc3RhcnQpLAogICAgICAgIGxlZnQ6IHRoaXMuZGF0ZVRvQ29vcmQocmFuZ2UuZW5kKQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsZWZ0OiB0aGlzLmRhdGVUb0Nvb3JkKHJhbmdlLnN0YXJ0KSwKICAgICAgICByaWdodDogdGhpcy5kYXRlVG9Db29yZChyYW5nZS5lbmQpCiAgICAgIH07CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5oZWFkSGVpZ2h0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgdGFibGU7CiAgICB0YWJsZSA9IHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgndGFibGUnKTsKICAgIHJldHVybiB0YWJsZS5oZWlnaHQuYXBwbHkodGFibGUsIGFyZ3VtZW50cyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51cGRhdGVTZWdQb3NpdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb29yZHMsIGosIGxlbiwgc2VnLCBzZWdzOwogICAgc2VncyA9ICh0aGlzLnNlZ3MgfHwgW10pLmNvbmNhdCh0aGlzLmJ1c2luZXNzSG91clNlZ3MgfHwgW10pOwogICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBzZWcgPSBzZWdzW2pdOwogICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIGxlZnQsIHNjcm9sbFRpbWU7CiAgICBsZWZ0ID0gMDsKICAgIGlmICh0aGlzLmlzVGltZVNjYWxlKSB7CiAgICAgIHNjcm9sbFRpbWUgPSB0aGlzLm9wdCgnc2Nyb2xsVGltZScpOwogICAgICBpZiAoc2Nyb2xsVGltZSkgewogICAgICAgIHNjcm9sbFRpbWUgPSBtb21lbnQuZHVyYXRpb24oc2Nyb2xsVGltZSk7CiAgICAgICAgbGVmdCA9IHRoaXMuZGF0ZVRvQ29vcmQodGhpcy5zdGFydC5jbG9uZSgpLnRpbWUoc2Nyb2xsVGltZSkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZWZ0OiBsZWZ0LAogICAgICB0b3A6IDAKICAgIH07CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgbGVmdDogdGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsTGVmdCgpLAogICAgICB0b3A6IHRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbFRvcCgpCiAgICB9OwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2V0U2Nyb2xsID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQoc3RhdGUubGVmdCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHN0YXRlLmxlZnQpOwogICAgcmV0dXJuIHRoaXMuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhbW3RoaXMsIHNlZ3NdXSk7CiAgICB0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2VycyhzZWdzKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3MgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2xlYXJTZWdGb2xsb3dlcnMoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKFt0aGlzXSk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMgPSBmdW5jdGlvbihwYWlycykgewogICAgdmFyIGNvbnRhaW5lciwgY29vcmRzLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQsIGxlbjUsIGxlbjYsIGxlbjcsIG0sIG4sIHAsIHEsIHIsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVzdWx0cywgc2VnLCBzZWdzOwogICAgZm9yIChqID0gMCwgbGVuID0gcGFpcnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVmID0gcGFpcnNbal0sIGNvbnRhaW5lciA9IHJlZlswXSwgc2VncyA9IHJlZlsxXTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHNlZ3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgICAgc2VnID0gc2Vnc1trXTsKICAgICAgICBjb29yZHMgPSB0aGlzLnJhbmdlVG9Db29yZHMoc2VnKTsKICAgICAgICBzZWcuZWwuY3NzKHsKICAgICAgICAgIGxlZnQ6IChzZWcubGVmdCA9IGNvb3Jkcy5sZWZ0KSwKICAgICAgICAgIHJpZ2h0OiAtKHNlZy5yaWdodCA9IGNvb3Jkcy5yaWdodCkKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYxID0gcGFpcnNbbF0sIGNvbnRhaW5lciA9IHJlZjFbMF0sIHNlZ3MgPSByZWYxWzFdOwogICAgICBmb3IgKG0gPSAwLCBsZW4zID0gc2Vncy5sZW5ndGg7IG0gPCBsZW4zOyBtKyspIHsKICAgICAgICBzZWcgPSBzZWdzW21dOwogICAgICAgIHNlZy5lbC5hcHBlbmRUbyhjb250YWluZXIuc2VnQ29udGFpbmVyRWwpOwogICAgICB9CiAgICB9CiAgICBmb3IgKG4gPSAwLCBsZW40ID0gcGFpcnMubGVuZ3RoOyBuIDwgbGVuNDsgbisrKSB7CiAgICAgIHJlZjIgPSBwYWlyc1tuXSwgY29udGFpbmVyID0gcmVmMlswXSwgc2VncyA9IHJlZjJbMV07CiAgICAgIGZvciAocCA9IDAsIGxlbjUgPSBzZWdzLmxlbmd0aDsgcCA8IGxlbjU7IHArKykgewogICAgICAgIHNlZyA9IHNlZ3NbcF07CiAgICAgICAgc2VnLmhlaWdodCA9IHNlZy5lbC5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgfQogICAgICB0aGlzLmJ1aWxkU2VnTGV2ZWxzKHNlZ3MpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZU9mZnNldEZvclNlZ3Moc2Vncyk7CiAgICB9CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKHEgPSAwLCBsZW42ID0gcGFpcnMubGVuZ3RoOyBxIDwgbGVuNjsgcSsrKSB7CiAgICAgIHJlZjMgPSBwYWlyc1txXSwgY29udGFpbmVyID0gcmVmM1swXSwgc2VncyA9IHJlZjNbMV07CiAgICAgIGZvciAociA9IDAsIGxlbjcgPSBzZWdzLmxlbmd0aDsgciA8IGxlbjc7IHIrKykgewogICAgICAgIHNlZyA9IHNlZ3Nbcl07CiAgICAgICAgc2VnLmVsLmNzcygndG9wJywgc2VnLnRvcCk7CiAgICAgIH0KICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5oZWlnaHQoY29udGFpbmVyLnNlZ0NvbnRhaW5lckhlaWdodCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBiZWxvd1NlZywgaXNMZXZlbENvbGxpc2lvbiwgaiwgaywgbCwgbGVuLCBsZW4xLCBsZW4yLCBsZXZlbCwgcGxhY2VkU2VnLCByZWYsIHJlZjEsIHNlZ0xldmVscywgdW5wbGFjZWRTZWc7CiAgICBzZWdMZXZlbHMgPSBbXTsKICAgIHRoaXMuc29ydEV2ZW50U2VncyhzZWdzKTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgdW5wbGFjZWRTZWcgPSBzZWdzW2pdOwogICAgICB1bnBsYWNlZFNlZy5hYm92ZSA9IFtdOwogICAgICBsZXZlbCA9IDA7CiAgICAgIHdoaWxlIChsZXZlbCA8IHNlZ0xldmVscy5sZW5ndGgpIHsKICAgICAgICBpc0xldmVsQ29sbGlzaW9uID0gZmFsc2U7CiAgICAgICAgcmVmID0gc2VnTGV2ZWxzW2xldmVsXTsKICAgICAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmLmxlbmd0aDsgayA8IGxlbjE7IGsrKykgewogICAgICAgICAgcGxhY2VkU2VnID0gcmVmW2tdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgcGxhY2VkU2VnKSkgewogICAgICAgICAgICB1bnBsYWNlZFNlZy5hYm92ZS5wdXNoKHBsYWNlZFNlZyk7CiAgICAgICAgICAgIGlzTGV2ZWxDb2xsaXNpb24gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNMZXZlbENvbGxpc2lvbikgewogICAgICAgICAgbGV2ZWwgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIChzZWdMZXZlbHNbbGV2ZWxdIHx8IChzZWdMZXZlbHNbbGV2ZWxdID0gW10pKS5wdXNoKHVucGxhY2VkU2VnKTsKICAgICAgbGV2ZWwgKz0gMTsKICAgICAgd2hpbGUgKGxldmVsIDwgc2VnTGV2ZWxzLmxlbmd0aCkgewogICAgICAgIHJlZjEgPSBzZWdMZXZlbHNbbGV2ZWxdOwogICAgICAgIGZvciAobCA9IDAsIGxlbjIgPSByZWYxLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICAgICAgYmVsb3dTZWcgPSByZWYxW2xdOwogICAgICAgICAgaWYgKHRpbWVSb3dTZWdzQ29sbGlkZSh1bnBsYWNlZFNlZywgYmVsb3dTZWcpKSB7CiAgICAgICAgICAgIGJlbG93U2VnLmFib3ZlLnB1c2godW5wbGFjZWRTZWcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXZlbCArPSAxOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnTGV2ZWxzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJGZ0NvbnRhaW5lcnMgPSBmdW5jdGlvbihjb250YWluZXJzKSB7CiAgICB2YXIgY29udGFpbmVyLCBqLCBsZW4sIHJlc3VsdHM7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBjb250YWluZXJzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lcnNbal07CiAgICAgIGNvbnRhaW5lci5zZWdDb250YWluZXJFbC5lbXB0eSgpOwogICAgICBjb250YWluZXIuc2VnQ29udGFpbmVyRWwuaGVpZ2h0KCcnKTsKICAgICAgcmVzdWx0cy5wdXNoKGNvbnRhaW5lci5zZWdDb250YWluZXJIZWlnaHQgPSBudWxsKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZmdTZWdIdG1sID0gZnVuY3Rpb24oc2VnLCBkaXNhYmxlUmVzaXppbmcpIHsKICAgIHZhciBjbGFzc2VzLCBldmVudCwgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbUVuZCwgaXNSZXNpemFibGVGcm9tU3RhcnQsIHRpbWVUZXh0OwogICAgZXZlbnQgPSBzZWcuZXZlbnQ7CiAgICBpc0RyYWdnYWJsZSA9IHRoaXMudmlldy5pc0V2ZW50RHJhZ2dhYmxlKGV2ZW50KTsKICAgIGlzUmVzaXphYmxlRnJvbVN0YXJ0ID0gc2VnLmlzU3RhcnQgJiYgdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQoZXZlbnQpOwogICAgaXNSZXNpemFibGVGcm9tRW5kID0gc2VnLmlzRW5kICYmIHRoaXMudmlldy5pc0V2ZW50UmVzaXphYmxlRnJvbUVuZChldmVudCk7CiAgICBjbGFzc2VzID0gdGhpcy5nZXRTZWdDbGFzc2VzKHNlZywgaXNEcmFnZ2FibGUsIGlzUmVzaXphYmxlRnJvbVN0YXJ0IHx8IGlzUmVzaXphYmxlRnJvbUVuZCk7CiAgICBjbGFzc2VzLnVuc2hpZnQoJ2ZjLXRpbWVsaW5lLWV2ZW50JywgJ2ZjLWgtZXZlbnQnKTsKICAgIHRpbWVUZXh0ID0gdGhpcy5nZXRFdmVudFRpbWVUZXh0KGV2ZW50KTsKICAgIHJldHVybiAnPGEgY2xhc3M9IicgKyBjbGFzc2VzLmpvaW4oJyAnKSArICciIHN0eWxlPSInICsgY3NzVG9TdHIodGhpcy5nZXRTZWdTa2luQ3NzKHNlZykpICsgJyInICsgKGV2ZW50LnVybCA/ICcgaHJlZj0iJyArIGh0bWxFc2NhcGUoZXZlbnQudXJsKSArICciJyA6ICcnKSArICc+JyArICc8ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nICsgKHRpbWVUZXh0ID8gJzxzcGFuIGNsYXNzPSJmYy10aW1lIj4nICsgaHRtbEVzY2FwZSh0aW1lVGV4dCkgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLXRpdGxlIj4nICsgKGV2ZW50LnRpdGxlID8gaHRtbEVzY2FwZShldmVudC50aXRsZSkgOiAnJm5ic3A7JykgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8ZGl2IGNsYXNzPSJmYy1iZyIgLz4nICsgKGlzUmVzaXphYmxlRnJvbVN0YXJ0ID8gJzxkaXYgY2xhc3M9ImZjLXJlc2l6ZXIgZmMtc3RhcnQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArIChpc1Jlc2l6YWJsZUZyb21FbmQgPyAnPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2E+JzsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVwZGF0ZVNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICAgIHZhciBqLCBsZW4sIHNlZywgc3ByaXRlcywgdGl0bGVFbDsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICBzcHJpdGVzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2pdOwogICAgICAgIHRpdGxlRWwgPSBzZWcuZWwuZmluZCgnLmZjLXRpdGxlJyk7CiAgICAgICAgaWYgKHRpdGxlRWwubGVuZ3RoKSB7CiAgICAgICAgICBzcHJpdGVzLnB1c2gobmV3IFNjcm9sbEZvbGxvd2VyU3ByaXRlKHRpdGxlRWwpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLnNldFNwcml0ZXMoc3ByaXRlcyk7CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jbGVhclNlZ0ZvbGxvd2VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhclNwcml0ZXMoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ0RyYWdTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnU3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuZm9yY2VSZWxhdGl2ZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2VnRHJhZ0VuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdEcmFnRW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBUaW1lbGluZUdyaWQuX19zdXBlcl9fLnNlZ1Jlc2l6ZVN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAodGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKTsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZCA9IGZ1bmN0aW9uKCkgewogICAgVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zZWdSZXNpemVFbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmICh0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcikgewogICAgICByZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJGb3JjZSgpOwogICAgfQogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVySGVscGVyID0gZnVuY3Rpb24oZXZlbnQsIHNvdXJjZVNlZykgewogICAgdmFyIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHJldHVybiB0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLCBzZWdzXV0sIHNvdXJjZVNlZyk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzID0gZnVuY3Rpb24ocGFpcnMsIHNvdXJjZVNlZykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29vcmRzLCBoZWxwZXJDb250YWluZXJFbCwgaGVscGVyTm9kZXMsIGosIGssIGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbSwgcmVmLCByZWYxLCByZWYyLCBzZWcsIHNlZ05vZGVzLCBzZWdzOwogICAgaGVscGVyTm9kZXMgPSBbXTsKICAgIHNlZ05vZGVzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gc2Vncy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBzZWcgPSBzZWdzW2tdOwogICAgICAgIGNvb3JkcyA9IHRoaXMucmFuZ2VUb0Nvb3JkcyhzZWcpOwogICAgICAgIHNlZy5lbC5jc3MoewogICAgICAgICAgbGVmdDogKHNlZy5sZWZ0ID0gY29vcmRzLmxlZnQpLAogICAgICAgICAgcmlnaHQ6IC0oc2VnLnJpZ2h0ID0gY29vcmRzLnJpZ2h0KQogICAgICAgIH0pOwogICAgICAgIGlmIChzb3VyY2VTZWcgJiYgc291cmNlU2VnLnJlc291cmNlSWQgPT09ICgocmVmMSA9IGNvbnRhaW5lck9iai5yZXNvdXJjZSkgIT0gbnVsbCA/IHJlZjEuaWQgOiB2b2lkIDApKSB7CiAgICAgICAgICBzZWcuZWwuY3NzKCd0b3AnLCBzb3VyY2VTZWcuZWwuY3NzKCd0b3AnKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZy5lbC5jc3MoJ3RvcCcsIDApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChsID0gMCwgbGVuMiA9IHBhaXJzLmxlbmd0aDsgbCA8IGxlbjI7IGwrKykgewogICAgICByZWYyID0gcGFpcnNbbF0sIGNvbnRhaW5lck9iaiA9IHJlZjJbMF0sIHNlZ3MgPSByZWYyWzFdOwogICAgICBoZWxwZXJDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciBmYy1oZWxwZXItY29udGFpbmVyIi8+JykuYXBwZW5kVG8oY29udGFpbmVyT2JqLmlubmVyRWwpOwogICAgICBoZWxwZXJOb2Rlcy5wdXNoKGhlbHBlckNvbnRhaW5lckVsWzBdKTsKICAgICAgZm9yIChtID0gMCwgbGVuMyA9IHNlZ3MubGVuZ3RoOyBtIDwgbGVuMzsgbSsrKSB7CiAgICAgICAgc2VnID0gc2Vnc1ttXTsKICAgICAgICBoZWxwZXJDb250YWluZXJFbC5hcHBlbmQoc2VnLmVsKTsKICAgICAgICBzZWdOb2Rlcy5wdXNoKHNlZy5lbFswXSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscyA9IHRoaXMuaGVscGVyRWxzLmFkZCgkKGhlbHBlck5vZGVzKSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhlbHBlckVscyA9ICQoaGVscGVyTm9kZXMpOwogICAgfQogICAgcmV0dXJuICQoc2VnTm9kZXMpOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhlbHBlckVscykgewogICAgICB0aGlzLmhlbHBlckVscy5yZW1vdmUoKTsKICAgICAgcmV0dXJuIHRoaXMuaGVscGVyRWxzID0gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbmRlckV2ZW50UmVzaXplID0gZnVuY3Rpb24ocmVzaXplTG9jYXRpb24sIHNlZykgewogICAgdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3BhbihyZXNpemVMb2NhdGlvbikpOwogICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihyZXNpemVMb2NhdGlvbiwgc2VnKTsKICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICAgIHJldHVybiB0aGlzLnVucmVuZGVySGVscGVyKCk7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsID0gZnVuY3Rpb24odHlwZSwgc2VncywgY2xhc3NOYW1lKSB7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGaWxsU2VnRWxzKHR5cGUsIHNlZ3MpOwogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIFtbdGhpcywgc2Vnc11dLCBjbGFzc05hbWUpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzID0gZnVuY3Rpb24odHlwZSwgcGFpcnMsIGNsYXNzTmFtZSkgewogICAgdmFyIGNvbnRhaW5lck9iaiwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHNlZ3M7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByZWYgPSBwYWlyc1tqXSwgY29udGFpbmVyT2JqID0gcmVmWzBdLCBzZWdzID0gcmVmWzFdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbEluQ29udGFpbmVyID0gZnVuY3Rpb24odHlwZSwgY29udGFpbmVyT2JqLCBzZWdzLCBjbGFzc05hbWUpIHsKICAgIHZhciBjb250YWluZXJFbCwgY29vcmRzLCBqLCBsZW4sIHNlZzsKICAgIGlmIChzZWdzLmxlbmd0aCkgewogICAgICBjbGFzc05hbWUgfHwgKGNsYXNzTmFtZSA9IHR5cGUudG9Mb3dlckNhc2UoKSk7CiAgICAgIGNvbnRhaW5lckVsID0gJCgnPGRpdiBjbGFzcz0iZmMtJyArIGNsYXNzTmFtZSArICctY29udGFpbmVyIiAvPicpLmFwcGVuZFRvKGNvbnRhaW5lck9iai5iZ1NlZ0NvbnRhaW5lckVsKTsKICAgICAgZm9yIChqID0gMCwgbGVuID0gc2Vncy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgICAgY29vcmRzID0gdGhpcy5yYW5nZVRvQ29vcmRzKHNlZyk7CiAgICAgICAgc2VnLmVsLmNzcyh7CiAgICAgICAgICBsZWZ0OiAoc2VnLmxlZnQgPSBjb29yZHMubGVmdCksCiAgICAgICAgICByaWdodDogLShzZWcucmlnaHQgPSBjb29yZHMucmlnaHQpCiAgICAgICAgfSk7CiAgICAgICAgc2VnLmVsLmFwcGVuZFRvKGNvbnRhaW5lckVsKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lbHNCeUZpbGxbdHlwZV0pIHsKICAgICAgICByZXR1cm4gdGhpcy5lbHNCeUZpbGxbdHlwZV0gPSB0aGlzLmVsc0J5RmlsbFt0eXBlXS5hZGQoY29udGFpbmVyRWwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLmVsc0J5RmlsbFt0eXBlXSA9IGNvbnRhaW5lckVsOwogICAgICB9CiAgICB9CiAgfTsKCiAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJEcmFnID0gZnVuY3Rpb24oZHJvcExvY2F0aW9uLCBzZWcpIHsKICAgIGlmIChzZWcpIHsKICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcihkcm9wTG9jYXRpb24sIHNlZyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKGRyb3BMb2NhdGlvbikpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKICBUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRHJhZyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy51bnJlbmRlckhlbHBlcigpOwogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJIaWdobGlnaHQoKTsKICB9OwoKICByZXR1cm4gVGltZWxpbmVHcmlkOwoKfSkoR3JpZCk7Cgpjb21wdXRlT2Zmc2V0Rm9yU2VncyA9IGZ1bmN0aW9uKHNlZ3MpIHsKICB2YXIgaiwgbGVuLCBtYXgsIHNlZzsKICBtYXggPSAwOwogIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgIHNlZyA9IHNlZ3Nbal07CiAgICBtYXggPSBNYXRoLm1heChtYXgsIGNvbXB1dGVPZmZzZXRGb3JTZWcoc2VnKSk7CiAgfQogIHJldHVybiBtYXg7Cn07Cgpjb21wdXRlT2Zmc2V0Rm9yU2VnID0gZnVuY3Rpb24oc2VnKSB7CiAgaWYgKHNlZy50b3AgPT0gbnVsbCkgewogICAgc2VnLnRvcCA9IGNvbXB1dGVPZmZzZXRGb3JTZWdzKHNlZy5hYm92ZSk7CiAgfQogIHJldHVybiBzZWcudG9wICsgc2VnLmhlaWdodDsKfTsKCnRpbWVSb3dTZWdzQ29sbGlkZSA9IGZ1bmN0aW9uKHNlZzAsIHNlZzEpIHsKICByZXR1cm4gc2VnMC5sZWZ0IDwgc2VnMS5yaWdodCAmJiBzZWcwLnJpZ2h0ID4gc2VnMS5sZWZ0Owp9OwoKTUlOX0FVVE9fTEFCRUxTID0gMTg7CgpNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwgPSA2OwoKTUFYX0FVVE9fQ0VMTFMgPSAyMDA7CgpNQVhfQ0VMTFMgPSAxMDAwOwoKREVGQVVMVF9HUklEX0RVUkFUSU9OID0gewogIG1vbnRoczogMQp9OwoKU1RPQ0tfU1VCX0RVUkFUSU9OUyA9IFsKICB7CiAgICB5ZWFyczogMQogIH0sIHsKICAgIG1vbnRoczogMQogIH0sIHsKICAgIGRheXM6IDEKICB9LCB7CiAgICBob3VyczogMQogIH0sIHsKICAgIG1pbnV0ZXM6IDMwCiAgfSwgewogICAgbWludXRlczogMTUKICB9LCB7CiAgICBtaW51dGVzOiAxMAogIH0sIHsKICAgIG1pbnV0ZXM6IDUKICB9LCB7CiAgICBtaW51dGVzOiAxCiAgfSwgewogICAgc2Vjb25kczogMzAKICB9LCB7CiAgICBzZWNvbmRzOiAxNQogIH0sIHsKICAgIHNlY29uZHM6IDEwCiAgfSwgewogICAgc2Vjb25kczogNQogIH0sIHsKICAgIHNlY29uZHM6IDEKICB9LCB7CiAgICBtaWxsaXNlY29uZHM6IDUwMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMTAwCiAgfSwgewogICAgbWlsbGlzZWNvbmRzOiAxMAogIH0sIHsKICAgIG1pbGxpc2Vjb25kczogMQogIH0KXTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHMgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIHNsb3RVbml0LCB0eXBlOwogIHRoaXMubGFiZWxJbnRlcnZhbCA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdExhYmVsSW50ZXJ2YWwnKTsKICB0aGlzLnNsb3REdXJhdGlvbiA9IHRoaXMucXVlcnlEdXJhdGlvbk9wdGlvbignc2xvdER1cmF0aW9uJyk7CiAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICB0aGlzLnZhbGlkYXRlTGFiZWxBbmRTbG90KCk7CiAgdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgdGhpcy5lbnN1cmVTbG90RHVyYXRpb24oKTsKICBpbnB1dCA9IHRoaXMub3B0KCdzbG90TGFiZWxGb3JtYXQnKTsKICB0eXBlID0gJC50eXBlKGlucHV0KTsKICB0aGlzLmhlYWRlckZvcm1hdHMgPSB0eXBlID09PSAnYXJyYXknID8gaW5wdXQgOiB0eXBlID09PSAnc3RyaW5nJyA/IFtpbnB1dF0gOiB0aGlzLmNvbXB1dGVIZWFkZXJGb3JtYXRzKCk7CiAgdGhpcy5pc1RpbWVTY2FsZSA9IGR1cmF0aW9uSGFzVGltZSh0aGlzLnNsb3REdXJhdGlvbik7CiAgdGhpcy5sYXJnZVVuaXQgPSAhdGhpcy5pc1RpbWVTY2FsZSA/IChzbG90VW5pdCA9IGNvbXB1dGVJbnRlcnZhbFVuaXQodGhpcy5zbG90RHVyYXRpb24pLCAveWVhcnxtb250aHx3ZWVrLy50ZXN0KHNsb3RVbml0KSA/IHNsb3RVbml0IDogdm9pZCAwKSA6IHZvaWQgMDsKICByZXR1cm4gdGhpcy5lbXBoYXNpemVXZWVrcyA9IHRoaXMuc2xvdER1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEgJiYgdGhpcy5kdXJhdGlvbi5hcygnd2Vla3MnKSA+PSAyICYmICF0aGlzLm9wdCgnYnVzaW5lc3NIb3VycycpOwoKICAvKgogIAljb25zb2xlLmxvZygndmlldyBkdXJhdGlvbiA9JywgQGR1cmF0aW9uLmh1bWFuaXplKCkpCiAgCWNvbnNvbGUubG9nKCdsYWJlbCBpbnRlcnZhbCA9JywgQGxhYmVsSW50ZXJ2YWwuaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ3Nsb3QgZHVyYXRpb24gPScsIEBzbG90RHVyYXRpb24uaHVtYW5pemUoKSkKICAJY29uc29sZS5sb2coJ2hlYWRlciBmb3JtYXRzID0nLCBAaGVhZGVyRm9ybWF0cykKICAJY29uc29sZS5sb2coJ2lzVGltZVNjYWxlJywgQGlzVGltZVNjYWxlKQogIAljb25zb2xlLmxvZygnbGFyZ2VVbml0JywgQGxhcmdlVW5pdCkKICAgKi8KfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUucXVlcnlEdXJhdGlvbk9wdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgZHVyLCBpbnB1dDsKICBpbnB1dCA9IHRoaXMub3B0KG5hbWUpOwogIGlmIChpbnB1dCAhPSBudWxsKSB7CiAgICBkdXIgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgaWYgKCtkdXIpIHsKICAgICAgcmV0dXJuIGR1cjsKICAgIH0KICB9Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLnZhbGlkYXRlTGFiZWxBbmRTbG90ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGxhYmVsQ250LCBzbG90Q250LCBzbG90c1BlckxhYmVsOwogIGlmICh0aGlzLmxhYmVsSW50ZXJ2YWwpIHsKICAgIGxhYmVsQ250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHRoaXMubGFiZWxJbnRlcnZhbCk7CiAgICBpZiAobGFiZWxDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdExhYmVsSW50ZXJ2YWwgcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscycpOwogICAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5zbG90RHVyYXRpb24pIHsKICAgIHNsb3RDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKHNsb3RDbnQgPiBNQVhfQ0VMTFMpIHsKICAgICAgRkMud2Fybignc2xvdER1cmF0aW9uIHJlc3VsdHMgaW4gdG9vIG1hbnkgY2VsbHMnKTsKICAgICAgdGhpcy5zbG90RHVyYXRpb24gPSBudWxsOwogICAgfQogIH0KICBpZiAodGhpcy5sYWJlbEludGVydmFsICYmIHRoaXMuc2xvdER1cmF0aW9uKSB7CiAgICBzbG90c1BlckxhYmVsID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMubGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgaWYgKCFpc0ludChzbG90c1BlckxhYmVsKSB8fCBzbG90c1BlckxhYmVsIDwgMSkgewogICAgICBGQy53YXJuKCdzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uJyk7CiAgICAgIHJldHVybiB0aGlzLnNsb3REdXJhdGlvbiA9IG51bGw7CiAgICB9CiAgfQp9OwoKVGltZWxpbmVHcmlkLnByb3RvdHlwZS5lbnN1cmVHcmlkRHVyYXRpb24gPSBmdW5jdGlvbigpIHsKICB2YXIgZ3JpZER1cmF0aW9uLCBpbnB1dCwgaiwgbGFiZWxDbnQsIGxhYmVsSW50ZXJ2YWw7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgZ3JpZER1cmF0aW9uID0gdGhpcy52aWV3LmludGVydmFsRHVyYXRpb247CiAgICBpZiAoIWdyaWREdXJhdGlvbikgewogICAgICBpZiAoIXRoaXMubGFiZWxJbnRlcnZhbCAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgICBncmlkRHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24oREVGQVVMVF9HUklEX0RVUkFUSU9OKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICAgICAgZm9yIChqID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBqID49IDA7IGogKz0gLTEpIHsKICAgICAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgICAgIGdyaWREdXJhdGlvbiA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgICBsYWJlbENudCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihncmlkRHVyYXRpb24sIGxhYmVsSW50ZXJ2YWwpOwogICAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZHVyYXRpb24gPSBncmlkRHVyYXRpb247CiAgfQogIHJldHVybiBncmlkRHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsKICB2YXIgaW5wdXQsIGosIGssIGxhYmVsQ250LCBsYWJlbEludGVydmFsLCBsZW4sIGxlbjEsIHNsb3RzUGVyTGFiZWwsIHRyeUxhYmVsSW50ZXJ2YWw7CiAgbGFiZWxJbnRlcnZhbCA9IHRoaXMubGFiZWxJbnRlcnZhbDsKICBpZiAoIWxhYmVsSW50ZXJ2YWwpIHsKICAgIGlmICghdGhpcy5kdXJhdGlvbiAmJiAhdGhpcy5zbG90RHVyYXRpb24pIHsKICAgICAgdGhpcy5lbnN1cmVHcmlkRHVyYXRpb24oKTsKICAgIH0KICAgIGlmICh0aGlzLnNsb3REdXJhdGlvbikgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgaW5wdXQgPSBTVE9DS19TVUJfRFVSQVRJT05TW2pdOwogICAgICAgIHRyeUxhYmVsSW50ZXJ2YWwgPSBtb21lbnQuZHVyYXRpb24oaW5wdXQpOwogICAgICAgIHNsb3RzUGVyTGFiZWwgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odHJ5TGFiZWxJbnRlcnZhbCwgdGhpcy5zbG90RHVyYXRpb24pOwogICAgICAgIGlmIChpc0ludChzbG90c1BlckxhYmVsKSAmJiBzbG90c1BlckxhYmVsIDw9IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRyeUxhYmVsSW50ZXJ2YWw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFsYWJlbEludGVydmFsKSB7CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IHRoaXMuc2xvdER1cmF0aW9uOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGsgPSAwLCBsZW4xID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICBpbnB1dCA9IFNUT0NLX1NVQl9EVVJBVElPTlNba107CiAgICAgICAgbGFiZWxJbnRlcnZhbCA9IG1vbWVudC5kdXJhdGlvbihpbnB1dCk7CiAgICAgICAgbGFiZWxDbnQgPSBkaXZpZGVEdXJhdGlvbkJ5RHVyYXRpb24odGhpcy5kdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCk7CiAgICAgICAgaWYgKGxhYmVsQ250ID49IE1JTl9BVVRPX0xBQkVMUykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmxhYmVsSW50ZXJ2YWwgPSBsYWJlbEludGVydmFsOwogIH0KICByZXR1cm4gbGFiZWxJbnRlcnZhbDsKfTsKClRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uID0gZnVuY3Rpb24oKSB7CiAgdmFyIGlucHV0LCBqLCBsYWJlbEludGVydmFsLCBsZW4sIHNsb3RDbnQsIHNsb3REdXJhdGlvbiwgc2xvdHNQZXJMYWJlbCwgdHJ5U2xvdER1cmF0aW9uOwogIHNsb3REdXJhdGlvbiA9IHRoaXMuc2xvdER1cmF0aW9uOwogIGlmICghc2xvdER1cmF0aW9uKSB7CiAgICBsYWJlbEludGVydmFsID0gdGhpcy5lbnN1cmVMYWJlbEludGVydmFsKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSBTVE9DS19TVUJfRFVSQVRJT05TLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGlucHV0ID0gU1RPQ0tfU1VCX0RVUkFUSU9OU1tqXTsKICAgICAgdHJ5U2xvdER1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKGlucHV0KTsKICAgICAgc2xvdHNQZXJMYWJlbCA9IGRpdmlkZUR1cmF0aW9uQnlEdXJhdGlvbihsYWJlbEludGVydmFsLCB0cnlTbG90RHVyYXRpb24pOwogICAgICBpZiAoaXNJbnQoc2xvdHNQZXJMYWJlbCkgJiYgc2xvdHNQZXJMYWJlbCA+IDEgJiYgc2xvdHNQZXJMYWJlbCA8PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSB0cnlTbG90RHVyYXRpb247CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChzbG90RHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbikgewogICAgICBzbG90Q250ID0gZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uKHRoaXMuZHVyYXRpb24sIHNsb3REdXJhdGlvbik7CiAgICAgIGlmIChzbG90Q250ID4gTUFYX0FVVE9fQ0VMTFMpIHsKICAgICAgICBzbG90RHVyYXRpb24gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNsb3REdXJhdGlvbikgewogICAgICBzbG90RHVyYXRpb24gPSBsYWJlbEludGVydmFsOwogICAgfQogICAgdGhpcy5zbG90RHVyYXRpb24gPSBzbG90RHVyYXRpb247CiAgfQogIHJldHVybiBzbG90RHVyYXRpb247Cn07CgpUaW1lbGluZUdyaWQucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZvcm1hdDAsIGZvcm1hdDEsIGZvcm1hdDIsIGdyaWREdXJhdGlvbiwgbGFiZWxJbnRlcnZhbCwgdW5pdCwgdmlldywgd2Vla051bWJlcnNWaXNpYmxlOwogIHZpZXcgPSB0aGlzLnZpZXc7CiAgZ3JpZER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbjsKICBsYWJlbEludGVydmFsID0gdGhpcy5sYWJlbEludGVydmFsOwogIHVuaXQgPSBjb21wdXRlSW50ZXJ2YWxVbml0KGxhYmVsSW50ZXJ2YWwpOwogIHdlZWtOdW1iZXJzVmlzaWJsZSA9IHRoaXMub3B0KCd3ZWVrTnVtYmVycycpOwogIGZvcm1hdDAgPSBmb3JtYXQxID0gZm9ybWF0MiA9IG51bGw7CiAgaWYgKHVuaXQgPT09ICd3ZWVrJyAmJiAhd2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICB1bml0ID0gJ2RheSc7CiAgfQogIHN3aXRjaCAodW5pdCkgewogICAgY2FzZSAneWVhcic6CiAgICAgIGZvcm1hdDAgPSAnWVlZWSc7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnbW9udGgnOgogICAgICBpZiAoZ3JpZER1cmF0aW9uLmFzWWVhcnMoKSA+IDEpIHsKICAgICAgICBmb3JtYXQwID0gJ1lZWVknOwogICAgICB9CiAgICAgIGZvcm1hdDEgPSAnTU1NJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICd3ZWVrJzoKICAgICAgaWYgKGdyaWREdXJhdGlvbi5hc1llYXJzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdZWVlZJzsKICAgICAgfQogICAgICBmb3JtYXQxID0gdGhpcy5vcHQoJ3Nob3J0V2Vla0Zvcm1hdCcpOwogICAgICBicmVhazsKICAgIGNhc2UgJ2RheSc6CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNZZWFycygpID4gMSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbW9udGhZZWFyRm9ybWF0Jyk7CiAgICAgIH0gZWxzZSBpZiAoZ3JpZER1cmF0aW9uLmFzTW9udGhzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MCA9ICdNTU1NJzsKICAgICAgfQogICAgICBpZiAod2Vla051bWJlcnNWaXNpYmxlKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCd3ZWVrRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9ICdkZCBEJzsKICAgICAgYnJlYWs7CiAgICBjYXNlICdob3VyJzoKICAgICAgaWYgKHdlZWtOdW1iZXJzVmlzaWJsZSkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnd2Vla0Zvcm1hdCcpOwogICAgICB9CiAgICAgIGlmIChncmlkRHVyYXRpb24uYXNEYXlzKCkgPiAxKSB7CiAgICAgICAgZm9ybWF0MSA9IHRoaXMub3B0KCdkYXlPZk1vbnRoRm9ybWF0Jyk7CiAgICAgIH0KICAgICAgZm9ybWF0MiA9IHRoaXMub3B0KCdzbWFsbFRpbWVGb3JtYXQnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdtaW51dGUnOgogICAgICBpZiAobGFiZWxJbnRlcnZhbC5hc01pbnV0ZXMoKSAvIDYwID49IE1BWF9BVVRPX1NMT1RTX1BFUl9MQUJFTCkgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnaG91ckZvcm1hdCcpOwogICAgICAgIGZvcm1hdDEgPSAnWzpdbW0nOwogICAgICB9IGVsc2UgewogICAgICAgIGZvcm1hdDAgPSB0aGlzLm9wdCgnbWVkaXVtVGltZUZvcm1hdCcpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAnc2Vjb25kJzoKICAgICAgaWYgKGxhYmVsSW50ZXJ2YWwuYXNTZWNvbmRzKCkgLyA2MCA+PSBNQVhfQVVUT19TTE9UU19QRVJfTEFCRUwpIHsKICAgICAgICBmb3JtYXQwID0gJ0xUJzsKICAgICAgICBmb3JtYXQxID0gJ1s6XXNzJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtYXQwID0gJ0xUUyc7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICdtaWxsaXNlY29uZCc6CiAgICAgIGZvcm1hdDAgPSAnTFRTJzsKICAgICAgZm9ybWF0MSA9ICdbLl1TU1MnOwogIH0KICByZXR1cm4gW10uY29uY2F0KGZvcm1hdDAgfHwgW10sIGZvcm1hdDEgfHwgW10sIGZvcm1hdDIgfHwgW10pOwp9OwoKRkMudmlld3MudGltZWxpbmUgPSB7CiAgImNsYXNzIjogVGltZWxpbmVWaWV3LAogIGRlZmF1bHRzOiB7CiAgICBldmVudFJlc2l6YWJsZUZyb21TdGFydDogdHJ1ZQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lRGF5ID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIGRheXM6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZVdlZWsgPSB7CiAgdHlwZTogJ3RpbWVsaW5lJywKICBkdXJhdGlvbjogewogICAgd2Vla3M6IDEKICB9Cn07CgpGQy52aWV3cy50aW1lbGluZU1vbnRoID0gewogIHR5cGU6ICd0aW1lbGluZScsCiAgZHVyYXRpb246IHsKICAgIG1vbnRoczogMQogIH0KfTsKCkZDLnZpZXdzLnRpbWVsaW5lWWVhciA9IHsKICB0eXBlOiAndGltZWxpbmUnLAogIGR1cmF0aW9uOiB7CiAgICB5ZWFyczogMQogIH0KfTsKClJlc291cmNlVGltZWxpbmVWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VUaW1lbGluZVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZVRpbWVsaW5lVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlVGltZWxpbmVWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlc291cmNlR3JpZCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS50Ym9keUhhc2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuam9pbmVyID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJFbHMgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc3VwZXJIZWFkZXJUZXh0ID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzVkdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmlzSEdyb3VwaW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdyb3VwU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuY29sU3BlY3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUub3JkZXJTcGVjcyA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yb3dIaWVyYXJjaHkgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLm5lc3RpbmdDbnQgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaXNOZXN0aW5nID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmRpdmlkZXJXaWR0aCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCk7CiAgICB0aGlzLnJlc291cmNlR3JpZCA9IG5ldyBTcHJlYWRzaGVldCh0aGlzKTsKICAgIHRoaXMucm93SGllcmFyY2h5ID0gbmV3IFJvd1BhcmVudCh0aGlzKTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlUm93SGFzaCA9IHt9OwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBuZXcgUmVzb3VyY2VUaW1lbGluZUdyaWQodGhpcyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnByb2Nlc3NSZXNvdXJjZU9wdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhbGxDb2xTcGVjcywgYWxsT3JkZXJTcGVjcywgY29sU3BlYywgZGVmYXVsdExhYmVsVGV4dCwgZ3JvdXBDb2xTcGVjcywgZ3JvdXBTcGVjLCBncm91cFNwZWNzLCBoR3JvdXBGaWVsZCwgaXNHcm91cCwgaXNIR3JvdXBpbmcsIGlzVkdyb3VwaW5nLCBqLCBrLCBsLCBsYWJlbFRleHQsIGxlbiwgbGVuMSwgbGVuMiwgb3JkZXJTcGVjLCBwbGFpbkNvbFNwZWNzLCBwbGFpbk9yZGVyU3BlY3MsIHN1cGVySGVhZGVyVGV4dDsKICAgIGFsbENvbFNwZWNzID0gdGhpcy5vcHQoJ3Jlc291cmNlQ29sdW1ucycpIHx8IFtdOwogICAgbGFiZWxUZXh0ID0gdGhpcy5vcHQoJ3Jlc291cmNlTGFiZWxUZXh0Jyk7CiAgICBkZWZhdWx0TGFiZWxUZXh0ID0gJ1Jlc291cmNlcyc7CiAgICBzdXBlckhlYWRlclRleHQgPSBudWxsOwogICAgaWYgKCFhbGxDb2xTcGVjcy5sZW5ndGgpIHsKICAgICAgYWxsQ29sU3BlY3MucHVzaCh7CiAgICAgICAgbGFiZWxUZXh0OiBsYWJlbFRleHQgfHwgZGVmYXVsdExhYmVsVGV4dCwKICAgICAgICB0ZXh0OiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHN1cGVySGVhZGVyVGV4dCA9IGxhYmVsVGV4dDsKICAgIH0KICAgIHBsYWluQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwQ29sU3BlY3MgPSBbXTsKICAgIGdyb3VwU3BlY3MgPSBbXTsKICAgIGlzVkdyb3VwaW5nID0gZmFsc2U7CiAgICBpc0hHcm91cGluZyA9IGZhbHNlOwogICAgZm9yIChqID0gMCwgbGVuID0gYWxsQ29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IGFsbENvbFNwZWNzW2pdOwogICAgICBpZiAoY29sU3BlYy5ncm91cCkgewogICAgICAgIGdyb3VwQ29sU3BlY3MucHVzaChjb2xTcGVjKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwbGFpbkNvbFNwZWNzLnB1c2goY29sU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHBsYWluQ29sU3BlY3NbMF0uaXNNYWluID0gdHJ1ZTsKICAgIGlmIChncm91cENvbFNwZWNzLmxlbmd0aCkgewogICAgICBncm91cFNwZWNzID0gZ3JvdXBDb2xTcGVjczsKICAgICAgaXNWR3JvdXBpbmcgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaEdyb3VwRmllbGQgPSB0aGlzLm9wdCgncmVzb3VyY2VHcm91cEZpZWxkJyk7CiAgICAgIGlmIChoR3JvdXBGaWVsZCkgewogICAgICAgIGlzSEdyb3VwaW5nID0gdHJ1ZTsKICAgICAgICBncm91cFNwZWNzLnB1c2goewogICAgICAgICAgZmllbGQ6IGhHcm91cEZpZWxkLAogICAgICAgICAgdGV4dDogdGhpcy5vcHQoJ3Jlc291cmNlR3JvdXBUZXh0JyksCiAgICAgICAgICByZW5kZXI6IHRoaXMub3B0KCdyZXNvdXJjZUdyb3VwUmVuZGVyJykKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgYWxsT3JkZXJTcGVjcyA9IHBhcnNlRmllbGRTcGVjcyh0aGlzLm9wdCgncmVzb3VyY2VPcmRlcicpKTsKICAgIHBsYWluT3JkZXJTcGVjcyA9IFtdOwogICAgZm9yIChrID0gMCwgbGVuMSA9IGFsbE9yZGVyU3BlY3MubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIG9yZGVyU3BlYyA9IGFsbE9yZGVyU3BlY3Nba107CiAgICAgIGlzR3JvdXAgPSBmYWxzZTsKICAgICAgZm9yIChsID0gMCwgbGVuMiA9IGdyb3VwU3BlY3MubGVuZ3RoOyBsIDwgbGVuMjsgbCsrKSB7CiAgICAgICAgZ3JvdXBTcGVjID0gZ3JvdXBTcGVjc1tsXTsKICAgICAgICBpZiAoZ3JvdXBTcGVjLmZpZWxkID09PSBvcmRlclNwZWMuZmllbGQpIHsKICAgICAgICAgIGdyb3VwU3BlYy5vcmRlciA9IG9yZGVyU3BlYy5vcmRlcjsKICAgICAgICAgIGlzR3JvdXAgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaXNHcm91cCkgewogICAgICAgIHBsYWluT3JkZXJTcGVjcy5wdXNoKG9yZGVyU3BlYyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuc3VwZXJIZWFkZXJUZXh0ID0gc3VwZXJIZWFkZXJUZXh0OwogICAgdGhpcy5pc1ZHcm91cGluZyA9IGlzVkdyb3VwaW5nOwogICAgdGhpcy5pc0hHcm91cGluZyA9IGlzSEdyb3VwaW5nOwogICAgdGhpcy5ncm91cFNwZWNzID0gZ3JvdXBTcGVjczsKICAgIHRoaXMuY29sU3BlY3MgPSBncm91cENvbFNwZWNzLmNvbmNhdChwbGFpbkNvbFNwZWNzKTsKICAgIHJldHVybiB0aGlzLm9yZGVyU3BlY3MgPSBwbGFpbk9yZGVyU3BlY3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlclNrZWxldG9uID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24oKTsKICAgIHRoaXMudGJvZHlIYXNoID0gewogICAgICBzcHJlYWRzaGVldDogdGhpcy5yZXNvdXJjZUdyaWQudGJvZHlFbCwKICAgICAgZXZlbnQ6IHRoaXMudGltZUdyaWQudGJvZHlFbAogICAgfTsKICAgIHRoaXMuam9pbmVyID0gbmV3IFNjcm9sbEpvaW5lcigndmVydGljYWwnLCBbdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlcl0pOwogICAgcmV0dXJuIHRoaXMuaW5pdERpdmlkZXJNb3ZpbmcoKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXJlc291cmNlLWFyZWEgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyArIHRoaXMud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIj48L3RkPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGhlYWQ+IDx0Ym9keSBjbGFzcz0iZmMtYm9keSI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnICsgdGhpcy53aWRnZXRIZWFkZXJDbGFzcyArICciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcgKyB0aGlzLndpZGdldENvbnRlbnRDbGFzcyArICciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+JzsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b24gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmVsID0gdGhpcy5lbC5maW5kKCd0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEVsID0gdGhpcy5lbC5maW5kKCd0aGVhZCAuZmMtcmVzb3VyY2UtYXJlYScpOwogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLnJlbmRlclNrZWxldG9uKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluaXREaXZpZGVyTW92aW5nID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmOwogICAgdGhpcy5kaXZpZGVyRWxzID0gdGhpcy5lbC5maW5kKCcuZmMtZGl2aWRlcicpOwogICAgdGhpcy5kaXZpZGVyV2lkdGggPSAocmVmID0gdGhpcy5vcHQoJ3Jlc291cmNlQXJlYVdpZHRoJykpICE9IG51bGwgPyByZWYgOiB0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoOwogICAgaWYgKHRoaXMuZGl2aWRlcldpZHRoICE9IG51bGwpIHsKICAgICAgdGhpcy5wb3NpdGlvbkRpdmlkZXIodGhpcy5kaXZpZGVyV2lkdGgpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGl2aWRlckVscy5vbignbW91c2Vkb3duJywgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihldikgewogICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyTW91c2Vkb3duKGV2KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZGl2aWRlck1vdXNlZG93biA9IGZ1bmN0aW9uKGV2KSB7CiAgICB2YXIgZHJhZ0xpc3RlbmVyLCBpc1JUTCwgbWF4V2lkdGgsIG1pbldpZHRoLCBvcmlnV2lkdGg7CiAgICBpc1JUTCA9IHRoaXMub3B0KCdpc1JUTCcpOwogICAgbWluV2lkdGggPSAzMDsKICAgIG1heFdpZHRoID0gdGhpcy5lbC53aWR0aCgpIC0gMzA7CiAgICBvcmlnV2lkdGggPSB0aGlzLmdldE5hdHVyYWxEaXZpZGVyV2lkdGgoKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLmFkZENsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKSwKICAgICAgZHJhZzogKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGR4LCBkeSkgewogICAgICAgICAgdmFyIHdpZHRoOwogICAgICAgICAgaWYgKGlzUlRMKSB7CiAgICAgICAgICAgIHdpZHRoID0gb3JpZ1dpZHRoIC0gZHg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aWR0aCA9IG9yaWdXaWR0aCArIGR4OwogICAgICAgICAgfQogICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluV2lkdGgpOwogICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpOwogICAgICAgICAgX3RoaXMuZGl2aWRlcldpZHRoID0gd2lkdGg7CiAgICAgICAgICBfdGhpcy5wb3NpdGlvbkRpdmlkZXIod2lkdGgpOwogICAgICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZVdpZHRoKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5kaXZpZGVyRWxzLnJlbW92ZUNsYXNzKCdmYy1hY3RpdmUnKTsKICAgICAgICB9OwogICAgICB9KSh0aGlzKQogICAgfSk7CiAgICByZXR1cm4gZHJhZ0xpc3RlbmVyLnN0YXJ0SW50ZXJhY3Rpb24oZXYpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5nZXROYXR1cmFsRGl2aWRlcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lbC5maW5kKCcuZmMtcmVzb3VyY2UtYXJlYScpLndpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlciA9IGZ1bmN0aW9uKHcpIHsKICAgIHJldHVybiB0aGlzLmVsLmZpbmQoJy5mYy1yZXNvdXJjZS1hcmVhJykud2lkdGgodyk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJlbmRlckV2ZW50cyA9IGZ1bmN0aW9uKGV2ZW50cykgewogICAgdGhpcy50aW1lR3JpZC5yZW5kZXJFdmVudHMoZXZlbnRzKTsKICAgIHRoaXMuc3luY1Jvd0hlaWdodHMoKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRXZlbnRzKCk7CiAgICB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpOwogICAgdGhpcy5qb2luZXIudXBkYXRlKCk7CiAgICBpZiAodGhpcy5jZWxsRm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuY2VsbEZvbGxvd2VyLnVwZGF0ZSgpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbihpc1Jlc2l6ZSkgewogICAgUmVzb3VyY2VUaW1lbGluZVZpZXcuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGlzUmVzaXplKSB7CiAgICAgIHJldHVybiB0aGlzLnN5bmNSb3dIZWlnaHRzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKHRvdGFsSGVpZ2h0LCBpc0F1dG8pIHsKICAgIHZhciBib2R5SGVpZ2h0LCBoZWFkSGVpZ2h0OwogICAgaGVhZEhlaWdodCA9IHRoaXMuc3luY0hlYWRIZWlnaHRzKCk7CiAgICBpZiAoaXNBdXRvKSB7CiAgICAgIGJvZHlIZWlnaHQgPSAnYXV0byc7CiAgICB9IGVsc2UgewogICAgICBib2R5SGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gdGhpcy5xdWVyeU1pc2NIZWlnaHQoKTsKICAgIH0KICAgIHRoaXMudGltZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChib2R5SGVpZ2h0KTsKICAgIHJldHVybiB0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KGJvZHlIZWlnaHQpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmVsLm91dGVySGVpZ2h0KCkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSkgLSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSwgdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnN5bmNIZWFkSGVpZ2h0cyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGhlYWRIZWlnaHQ7CiAgICB0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCdhdXRvJyk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoJ2F1dG8nKTsKICAgIGhlYWRIZWlnaHQgPSBNYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkSGVpZ2h0KCksIHRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpKTsKICAgIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICB0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoaGVhZEhlaWdodCk7CiAgICByZXR1cm4gaGVhZEhlaWdodDsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHJlc291cmNlKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24ocmVzb3VyY2VzKSB7CiAgICB2YXIgaiwgbGVuLCByZXNvdXJjZTsKICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZXNvdXJjZXMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZXNbal07CiAgICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgfQogICAgdGhpcy5yb3dIaWVyYXJjaHkuc2hvdygpOwogICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5iYXRjaFJvd3MoKTsKICAgIHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCk7CiAgICB0aGlzLnVuYmF0Y2hSb3dzKCk7CiAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgfTsKCgogIC8qCiAgCVRPRE86IHRoZSBzY2VuYXJpbyB3aGVyZSB0aGVyZSB3ZXJlIHByZXZpb3VzbHkgdW5hc3NvY2lhdGVkIGV2ZW50cyB0aGF0IGFyZSBub3cKICAJIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UuIHNob3VsZCByZW5kZXIgdGhvc2UgZXZlbnRzIGltbWVkaWF0ZWx5LgogIAogIAlSZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHRoZSBuZXcgcmVzb3VyY2UKICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmFkZFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHRoaXMuaW5zZXJ0UmVzb3VyY2UocmVzb3VyY2UpOwogICAgcmV0dXJuIHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZSA9IGZ1bmN0aW9uKHJlc291cmNlKSB7CiAgICB2YXIgcm93OwogICAgcm93ID0gdGhpcy5nZXRSZXNvdXJjZVJvdyhyZXNvdXJjZS5pZCk7CiAgICBpZiAocm93KSB7CiAgICAgIHRoaXMuYmF0Y2hSb3dzKCk7CiAgICAgIHJvdy5yZW1vdmUoKTsKICAgICAgdGhpcy51bmJhdGNoUm93cygpOwogICAgICByZXR1cm4gdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCk7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNlbGxGb2xsb3dlciA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2VsbENvbnRlbnQsIGosIGxlbiwgbm9kZXMsIHJlZiwgcm93OwogICAgaWYgKHRoaXMuY2VsbEZvbGxvd2VyKSB7CiAgICAgIHRoaXMuY2VsbEZvbGxvd2VyLmNsZWFyU3ByaXRlcygpOwogICAgfQogICAgdGhpcy5jZWxsRm9sbG93ZXIgPSBuZXcgU2Nyb2xsRm9sbG93ZXIodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLCB0aGlzLmNhbGVuZGFyLmlzVG91Y2gpOwogICAgdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nID0gZmFsc2U7CiAgICB0aGlzLmNlbGxGb2xsb3dlci5pc1ZGb2xsb3dpbmcgPSB0cnVlOwogICAgbm9kZXMgPSBbXTsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldE5vZGVzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICBpZiAocm93IGluc3RhbmNlb2YgVlJvd0dyb3VwKSB7CiAgICAgICAgaWYgKHJvdy5ncm91cFRkKSB7CiAgICAgICAgICBjZWxsQ29udGVudCA9IHJvdy5ncm91cFRkLmZpbmQoJy5mYy1jZWxsLWNvbnRlbnQnKTsKICAgICAgICAgIGlmIChjZWxsQ29udGVudC5sZW5ndGgpIHsKICAgICAgICAgICAgbm9kZXMucHVzaChjZWxsQ29udGVudFswXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jZWxsRm9sbG93ZXIuc2V0U3ByaXRlcygkKG5vZGVzKSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmluc2VydFJlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UsIHBhcmVudFJlc291cmNlUm93KSB7CiAgICB2YXIgY2hpbGRSZXNvdXJjZSwgaiwgbGVuLCBwYXJlbnRJZCwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByb3cgPSBuZXcgUmVzb3VyY2VSb3codGhpcywgcmVzb3VyY2UpOwogICAgaWYgKHBhcmVudFJlc291cmNlUm93ID09IG51bGwpIHsKICAgICAgcGFyZW50SWQgPSByZXNvdXJjZS5wYXJlbnRJZDsKICAgICAgaWYgKHBhcmVudElkKSB7CiAgICAgICAgcGFyZW50UmVzb3VyY2VSb3cgPSB0aGlzLmdldFJlc291cmNlUm93KHBhcmVudElkKTsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIHBhcmVudFJlc291cmNlUm93KTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaW5zZXJ0Um93KHJvdyk7CiAgICB9CiAgICByZWYgPSByZXNvdXJjZS5jaGlsZHJlbjsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZFJlc291cmNlID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShjaGlsZFJlc291cmNlLCByb3cpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3cgPSBmdW5jdGlvbihyb3csIHBhcmVudCwgZ3JvdXBTcGVjcykgewogICAgdmFyIGdyb3VwOwogICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CiAgICAgIHBhcmVudCA9IHRoaXMucm93SGllcmFyY2h5OwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MgPT0gbnVsbCkgewogICAgICBncm91cFNwZWNzID0gdGhpcy5ncm91cFNwZWNzOwogICAgfQogICAgaWYgKGdyb3VwU3BlY3MubGVuZ3RoKSB7CiAgICAgIGdyb3VwID0gdGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHJvdywgcGFyZW50LCBncm91cFNwZWNzWzBdKTsKICAgICAgaWYgKGdyb3VwIGluc3RhbmNlb2YgSFJvd0dyb3VwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0Um93QXNDaGlsZChyb3csIGdyb3VwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRSb3cocm93LCBncm91cCwgZ3JvdXBTcGVjcy5zbGljZSgxKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydFJvd0FzQ2hpbGQocm93LCBwYXJlbnQpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkID0gZnVuY3Rpb24ocm93LCBwYXJlbnQpIHsKICAgIHJldHVybiBwYXJlbnQuYWRkQ2hpbGQocm93LCB0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHJvdywgcGFyZW50KSk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgewogICAgdmFyIGNtcCwgaSwgaiwgbGVuLCByZWYsIHNpYmxpbmc7CiAgICBpZiAodGhpcy5vcmRlclNwZWNzLmxlbmd0aCkgewogICAgICByZWYgPSBwYXJlbnQuY2hpbGRyZW47CiAgICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgICAgc2libGluZyA9IHJlZltpXTsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmVSZXNvdXJjZXMoc2libGluZy5yZXNvdXJjZSB8fCB7fSwgY2hpbGQucmVzb3VyY2UgfHwge30pOwogICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5jb21wYXJlUmVzb3VyY2VzID0gZnVuY3Rpb24oYSwgYikgewogICAgcmV0dXJuIGNvbXBhcmVCeUZpZWxkU3BlY3MoYSwgYiwgdGhpcy5vcmRlclNwZWNzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cCA9IGZ1bmN0aW9uKHJvdywgcGFyZW50LCBzcGVjKSB7CiAgICB2YXIgY21wLCBncm91cCwgZ3JvdXBWYWx1ZSwgaSwgaiwgaywgbGVuLCBsZW4xLCByZWYsIHJlZjEsIHRlc3RHcm91cDsKICAgIGdyb3VwVmFsdWUgPSAocm93LnJlc291cmNlIHx8IHt9KVtzcGVjLmZpZWxkXTsKICAgIGdyb3VwID0gbnVsbDsKICAgIGlmIChzcGVjLm9yZGVyKSB7CiAgICAgIHJlZiA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWZbaV07CiAgICAgICAgY21wID0gZmxleGlibGVDb21wYXJlKHRlc3RHcm91cC5ncm91cFZhbHVlLCBncm91cFZhbHVlKSAqIHNwZWMub3JkZXI7CiAgICAgICAgaWYgKGNtcCA9PT0gMCkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVmMSA9IHBhcmVudC5jaGlsZHJlbjsKICAgICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSByZWYxLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICB0ZXN0R3JvdXAgPSByZWYxW2ldOwogICAgICAgIGlmICh0ZXN0R3JvdXAuZ3JvdXBWYWx1ZSA9PT0gZ3JvdXBWYWx1ZSkgewogICAgICAgICAgZ3JvdXAgPSB0ZXN0R3JvdXA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghZ3JvdXApIHsKICAgICAgaWYgKHRoaXMuaXNWR3JvdXBpbmcpIHsKICAgICAgICBncm91cCA9IG5ldyBWUm93R3JvdXAodGhpcywgc3BlYywgZ3JvdXBWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ3JvdXAgPSBuZXcgSFJvd0dyb3VwKHRoaXMsIHNwZWMsIGdyb3VwVmFsdWUpOwogICAgICB9CiAgICAgIHBhcmVudC5hZGRDaGlsZChncm91cCwgaSk7CiAgICB9CiAgICByZXR1cm4gZ3JvdXA7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3MgPSBmdW5jdGlvbihzZWdzKSB7CiAgICB2YXIgaiwgbGVuLCBwYWlyLCBwYWlycywgcGFpcnNCeUlkLCByZXNvdXJjZUlkLCByb3dPYmosIHNlZzsKICAgIHBhaXJzID0gW107CiAgICBwYWlyc0J5SWQgPSB7fTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHNlZ3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgcmVzb3VyY2VJZCA9IHNlZy5yZXNvdXJjZUlkOwogICAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICAgIHJvd09iaiA9IHRoaXMuZ2V0UmVzb3VyY2VSb3cocmVzb3VyY2VJZCk7CiAgICAgICAgaWYgKHJvd09iaikgewogICAgICAgICAgcGFpciA9IHBhaXJzQnlJZFtyZXNvdXJjZUlkXTsKICAgICAgICAgIGlmICghcGFpcikgewogICAgICAgICAgICBwYWlyID0gW3Jvd09iaiwgW11dOwogICAgICAgICAgICBwYWlycy5wdXNoKHBhaXIpOwogICAgICAgICAgICBwYWlyc0J5SWRbcmVzb3VyY2VJZF0gPSBwYWlyOwogICAgICAgICAgfQogICAgICAgICAgcGFpclsxXS5wdXNoKHNlZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFpcnM7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICB2YXIgaXNOZXN0aW5nLCB3YXNOZXN0aW5nOwogICAgaWYgKHJvdyBpbnN0YW5jZW9mIFJlc291cmNlUm93KSB7CiAgICAgIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF0gPSByb3c7CiAgICAgIHRoaXMudGltZUdyaWQuYXNzaWduUm93QnVzaW5lc3NIb3VyU2Vncyhyb3cpOwogICAgfQogICAgd2FzTmVzdGluZyA9IHRoaXMuaXNOZXN0aW5nOwogICAgaXNOZXN0aW5nID0gQm9vbGVhbih0aGlzLm5lc3RpbmdDbnQgKz0gcm93LmRlcHRoID8gMSA6IDApOwogICAgaWYgKHdhc05lc3RpbmcgIT09IGlzTmVzdGluZykgewogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1uZXN0ZWQnLCBpc05lc3RpbmcpOwogICAgICB0aGlzLmVsLnRvZ2dsZUNsYXNzKCdmYy1mbGF0JywgIWlzTmVzdGluZyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5pc05lc3RpbmcgPSBpc05lc3Rpbmc7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHZhciBpc05lc3RpbmcsIHdhc05lc3Rpbmc7CiAgICBpZiAocm93IGluc3RhbmNlb2YgUmVzb3VyY2VSb3cpIHsKICAgICAgZGVsZXRlIHRoaXMucmVzb3VyY2VSb3dIYXNoW3Jvdy5yZXNvdXJjZS5pZF07CiAgICAgIHRoaXMudGltZUdyaWQuZGVzdHJveVJvd0J1c2luZXNzSG91clNlZ3Mocm93KTsKICAgIH0KICAgIHdhc05lc3RpbmcgPSB0aGlzLmlzTmVzdGluZzsKICAgIGlzTmVzdGluZyA9IEJvb2xlYW4odGhpcy5uZXN0aW5nQ250IC09IHJvdy5kZXB0aCA/IDEgOiAwKTsKICAgIGlmICh3YXNOZXN0aW5nICE9PSBpc05lc3RpbmcpIHsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtbmVzdGVkJywgaXNOZXN0aW5nKTsKICAgICAgdGhpcy5lbC50b2dnbGVDbGFzcygnZmMtZmxhdCcsICFpc05lc3RpbmcpOwogICAgfQogICAgcmV0dXJuIHRoaXMuaXNOZXN0aW5nID0gaXNOZXN0aW5nOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5iYXRjaFJvd0RlcHRoID0gMDsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNob3duUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuaGlkZGVuUm93QmF0Y2ggPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISh0aGlzLmJhdGNoUm93RGVwdGgrKykpIHsKICAgICAgdGhpcy5zaG93blJvd0JhdGNoID0gW107CiAgICAgIHJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoID0gW107CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnVuYmF0Y2hSb3dzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoISgtLXRoaXMuYmF0Y2hSb3dEZXB0aCkpIHsKICAgICAgaWYgKHRoaXMuaGlkZGVuUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNob3duUm93QmF0Y2gubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5yb3dzU2hvd24odGhpcy5zaG93blJvd0JhdGNoKTsKICAgICAgfQogICAgICB0aGlzLmhpZGRlblJvd0JhdGNoID0gbnVsbDsKICAgICAgcmV0dXJuIHRoaXMuc2hvd25Sb3dCYXRjaCA9IG51bGw7CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd1Nob3duID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5zaG93blJvd0JhdGNoKSB7CiAgICAgIHJldHVybiB0aGlzLnNob3duUm93QmF0Y2gucHVzaChyb3cpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMucm93c1Nob3duKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93SGlkZGVuID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAodGhpcy5oaWRkZW5Sb3dCYXRjaCkgewogICAgICByZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaC5wdXNoKHJvdyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5yb3dzSGlkZGVuKFtyb3ddKTsKICAgIH0KICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUucm93c1Nob3duID0gZnVuY3Rpb24ocm93cykgewogICAgdGhpcy5zeW5jUm93SGVpZ2h0cyhyb3dzKTsKICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpZHRoKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnJvd3NIaWRkZW4gPSBmdW5jdGlvbihyb3dzKSB7CiAgICByZXR1cm4gdGhpcy51cGRhdGVXaWR0aCgpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVWaWV3LnByb3RvdHlwZS5zeW5jUm93SGVpZ2h0cyA9IGZ1bmN0aW9uKHZpc2libGVSb3dzLCBzYWZlKSB7CiAgICB2YXIgaCwgaDEsIGgyLCBpLCBpbm5lckhlaWdodHMsIGosIGssIGxlbiwgbGVuMSwgcm93OwogICAgaWYgKHNhZmUgPT0gbnVsbCkgewogICAgICBzYWZlID0gZmFsc2U7CiAgICB9CiAgICBpZiAodmlzaWJsZVJvd3MgPT0gbnVsbCkgewogICAgICB2aXNpYmxlUm93cyA9IHRoaXMuZ2V0VmlzaWJsZVJvd3MoKTsKICAgIH0KICAgIGZvciAoaiA9IDAsIGxlbiA9IHZpc2libGVSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHZpc2libGVSb3dzW2pdOwogICAgICByb3cuc2V0VHJJbm5lckhlaWdodCgnJyk7CiAgICB9CiAgICBpbm5lckhlaWdodHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoayA9IDAsIGxlbjEgPSB2aXNpYmxlUm93cy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSB2aXNpYmxlUm93c1trXTsKICAgICAgICBoID0gcm93LmdldE1heFRySW5uZXJIZWlnaHQoKTsKICAgICAgICBpZiAoc2FmZSkgewogICAgICAgICAgaCArPSBoICUgMjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGgpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfSkoKTsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gdmlzaWJsZVJvd3MubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykgewogICAgICByb3cgPSB2aXNpYmxlUm93c1tpXTsKICAgICAgcm93LnNldFRySW5uZXJIZWlnaHQoaW5uZXJIZWlnaHRzW2ldKTsKICAgIH0KICAgIGlmICghc2FmZSkgewogICAgICBoMSA9IHRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwuaGVpZ2h0KCk7CiAgICAgIGgyID0gdGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpOwogICAgICBpZiAoTWF0aC5hYnMoaDEgLSBoMikgPiAxKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModmlzaWJsZVJvd3MsIHRydWUpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLmdldFZpc2libGVSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHJvdzsKICAgIHJlZiA9IHRoaXMucm93SGllcmFyY2h5LmdldFJvd3MoKTsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICByb3cgPSByZWZbal07CiAgICAgIGlmIChyb3cgaW5zdGFuY2VvZiBFdmVudFJvdykgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lVmlldy5wcm90b3R5cGUuZ2V0UmVzb3VyY2VSb3cgPSBmdW5jdGlvbihyZXNvdXJjZUlkKSB7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbcmVzb3VyY2VJZF07CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZVZpZXcucHJvdG90eXBlLnNldFNjcm9sbCA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lVmlldy5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldFNjcm9sbFRvcChzdGF0ZS50b3ApOwogIH07CgogIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lVmlldzsKCn0pKFRpbWVsaW5lVmlldyk7CgpSZXNvdXJjZVRpbWVsaW5lR3JpZCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJlc291cmNlVGltZWxpbmVHcmlkLCBzdXBlckNsYXNzKTsKCiAgZnVuY3Rpb24gUmVzb3VyY2VUaW1lbGluZUdyaWQoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5taXhpbihSZXNvdXJjZUdyaWRNaXhpbik7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5ldmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuc2hvd25FdmVudFJvd3MgPSBudWxsOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUudGJvZHlFbCA9IG51bGw7CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yb3dDb29yZENhY2hlID0gbnVsbDsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnNwYW5Ub1NlZ3MgPSBmdW5jdGlvbihzcGFuKSB7CiAgICB2YXIgY2FsZW5kYXIsIGosIGxlbiwgcmVzb3VyY2VJZCwgc2VnLCBzZWdzOwogICAgc2VncyA9IFJlc291cmNlVGltZWxpbmVHcmlkLl9fc3VwZXJfXy5zcGFuVG9TZWdzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBjYWxlbmRhciA9IHRoaXMudmlldy5jYWxlbmRhcjsKICAgIHJlc291cmNlSWQgPSBzcGFuLnJlc291cmNlSWQ7CiAgICBpZiAocmVzb3VyY2VJZCkgewogICAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gc2Vnc1tqXTsKICAgICAgICBzZWcucmVzb3VyY2UgPSBjYWxlbmRhci5nZXRSZXNvdXJjZUJ5SWQocmVzb3VyY2VJZCk7CiAgICAgICAgc2VnLnJlc291cmNlSWQgPSByZXNvdXJjZUlkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciByb3csIHRyQXJyYXk7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucHJlcGFyZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgdGhpcy5zaG93bkV2ZW50Um93cyA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLmV2ZW50Um93czsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICByb3cgPSByZWZbal07CiAgICAgICAgaWYgKHJvdy5pc1Nob3duKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9KS5jYWxsKHRoaXMpOwogICAgdHJBcnJheSA9IChmdW5jdGlvbigpIHsKICAgICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgICByZWYgPSB0aGlzLnNob3duRXZlbnRSb3dzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgICByZXN1bHRzLnB1c2gocm93LmdldFRyKCdldmVudCcpWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgICB0aGlzLnJvd0Nvb3JkQ2FjaGUgPSBuZXcgQ29vcmRDYWNoZSh7CiAgICAgIGVsczogdHJBcnJheSwKICAgICAgaXNWZXJ0aWNhbDogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCk7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnJlbGVhc2VIaXRzID0gZnVuY3Rpb24oKSB7CiAgICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVsZWFzZUhpdHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHRoaXMuZXZlbnRSb3dzID0gbnVsbDsKICAgIHRoaXMuc2hvd25FdmVudFJvd3MgPSBudWxsOwogICAgcmV0dXJuIHRoaXMucm93Q29vcmRDYWNoZS5jbGVhcigpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeUhpdCA9IGZ1bmN0aW9uKGxlZnRPZmZzZXQsIHRvcE9mZnNldCkgewogICAgdmFyIHJvd0luZGV4LCBzaW1wbGVIaXQ7CiAgICBzaW1wbGVIaXQgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChzaW1wbGVIaXQpIHsKICAgICAgcm93SW5kZXggPSB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VmVydGljYWxJbmRleCh0b3BPZmZzZXQpOwogICAgICBpZiAocm93SW5kZXggIT0gbnVsbCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICByZXNvdXJjZUlkOiB0aGlzLnNob3duRXZlbnRSb3dzW3Jvd0luZGV4XS5yZXNvdXJjZS5pZCwKICAgICAgICAgIHNuYXA6IHNpbXBsZUhpdC5zbmFwLAogICAgICAgICAgY29tcG9uZW50OiB0aGlzLAogICAgICAgICAgbGVmdDogc2ltcGxlSGl0LmxlZnQsCiAgICAgICAgICByaWdodDogc2ltcGxlSGl0LnJpZ2h0LAogICAgICAgICAgdG9wOiB0aGlzLnJvd0Nvb3JkQ2FjaGUuZ2V0VG9wT2Zmc2V0KHJvd0luZGV4KSwKICAgICAgICAgIGJvdHRvbTogdGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChyb3dJbmRleCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdFNwYW4gPSBmdW5jdGlvbihoaXQpIHsKICAgIHZhciBzcGFuOwogICAgc3BhbiA9IHRoaXMuZ2V0U25hcFJhbmdlKGhpdC5zbmFwKTsKICAgIHNwYW4ucmVzb3VyY2VJZCA9IGhpdC5yZXNvdXJjZUlkOwogICAgcmV0dXJuIHNwYW47CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmdldEhpdEVsID0gZnVuY3Rpb24oaGl0KSB7CiAgICByZXR1cm4gdGhpcy5nZXRTbmFwRWwoaGl0LnNuYXApOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJvd0NvbnRhaW5lckVsOwogICAgUmVzb3VyY2VUaW1lbGluZUdyaWQuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB0aGlzLnNlZ0NvbnRhaW5lckVsLnJlbW92ZSgpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IG51bGw7CiAgICByb3dDb250YWluZXJFbCA9ICQoJzxkaXYgY2xhc3M9ImZjLXJvd3MiPjx0YWJsZT48dGJvZHkvPjwvdGFibGU+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbCk7CiAgICByZXR1cm4gdGhpcy50Ym9keUVsID0gcm93Q29udGFpbmVyRWwuZmluZCgndGJvZHknKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oc2VncykgewogICAgdmFyIGNvbnRhaW5lck9iaiwgY29udGFpbmVyU2VncywgaiwgbGVuLCBwYWlyLCBwYWlycywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmdTZWdFbHMoc2Vncyk7CiAgICBwYWlycyA9IHRoaXMudmlldy5wYWlyU2Vnc1dpdGhSb3dzKHNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBwYWlycy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBwYWlyID0gcGFpcnNbal07CiAgICAgIGNvbnRhaW5lck9iaiA9IHBhaXJbMF0sIGNvbnRhaW5lclNlZ3MgPSBwYWlyWzFdOwogICAgICBjb250YWluZXJPYmouZmdTZWdzID0gY29udGFpbmVyU2VnczsKICAgICAgaWYgKGNvbnRhaW5lck9iai5pc1Nob3duKSB7CiAgICAgICAgY29udGFpbmVyT2JqLmlzU2Vnc1JlbmRlcmVkID0gdHJ1ZTsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnModmlzaWJsZVBhaXJzKTsKICAgIHRoaXMudXBkYXRlU2VnRm9sbG93ZXJzKHNlZ3MpOwogICAgcmV0dXJuIHNlZ3M7CiAgfTsKCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLnVucmVuZGVyRmdTZWdzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZXZlbnRSb3csIGV2ZW50Um93cywgaiwgbGVuOwogICAgdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpOwogICAgZXZlbnRSb3dzID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgZm9yIChqID0gMCwgbGVuID0gZXZlbnRSb3dzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGV2ZW50Um93ID0gZXZlbnRSb3dzW2pdOwogICAgICBldmVudFJvdy5mZ1NlZ3MgPSBudWxsOwogICAgICBldmVudFJvdy5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoZXZlbnRSb3dzKTsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMgPSAwOwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgIHJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18udW5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUVuc3VyZXMgdGhhdCBhbGwgcm93cyBoYXZlIHRoZWlyIGluZGl2aWR1YWwgYnVzaW5lc3MgaG91cnMgRElTUExBWUVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cywgcm93OwogICAgcmVmID0gdGhpcy52aWV3LmdldEV2ZW50Um93cygpOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHJvdyA9IHJlZltqXTsKICAgICAgaWYgKCFyb3cuYnVzaW5lc3NIb3VyU2VncykgewogICAgICAgIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgICB9CiAgICAgIGlmIChyb3cuaXNTaG93bikgewogICAgICAgIHJlc3VsdHMucHVzaChyb3cuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKCiAgLyoKICAJRW5zdXJlcyB0aGF0IGFsbCByb3dzIGhhdmUgdGhlaXIgaW5kaXZpZHVhbCBidXNpbmVzcyBob3VycyBDTEVBUkVELgogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCByZXN1bHRzLCByb3c7CiAgICByZWYgPSB0aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCk7CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93ID0gcmVmW2pdOwogICAgICByZXN1bHRzLnB1c2gocm93LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZSwgYnV0IGJlZm9yZSBpdCdzIHJlbmRlcmVkLgogIAlDb21wdXRlcyBhbmQgYXNzaWducyBidXNpbmVzcyBob3VyIGRhdGEgKmlmIG5lY2Vzc2FyeSouIFRvIGJlIHJlbmRlcmVkIHNvb24gYWZ0ZXIuCiAgICovCgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5hc3NpZ25Sb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgaWYgKCF0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzKSB7CiAgICAgICAgVGltZWxpbmVHcmlkLnByb3RvdHlwZS51bnJlbmRlckJ1c2luZXNzSG91cnMuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk7CiAgICAgIH0KICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyArPSAxOwogICAgfQogICAgaWYgKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgcmV0dXJuIHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2Vncyhyb3cpOwogICAgfQogIH07CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuCiAgCVVucmVuZGVycyB0aGUgcm93J3Mgc2VncyBhbmQsIGlmIG5lY2Vzc2FyeSwgZm9yY2VzIGJ1c2luZXNzSG91cnMgYmFjayB0byBnZW5lcmljIHJlbmRlcmluZy4KICAgKi8KCiAgUmVzb3VyY2VUaW1lbGluZUdyaWQucHJvdG90eXBlLmRlc3Ryb3lSb3dCdXNpbmVzc0hvdXJTZWdzID0gZnVuY3Rpb24ocm93KSB7CiAgICByb3cuY2xlYXJCdXNpbmVzc0hvdXJTZWdzKCk7CiAgICBpZiAocm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMpIHsKICAgICAgdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycyAtPSAxOwogICAgICBpZiAoIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpIHsKICAgICAgICB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKTsKICAgICAgICByZXR1cm4gVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoKICAJQ29tcHV0ZSBhbmQgYXNzaWduIHRvIHJvdy5idXNpbmVzc0hvdXJTZWdzIHVuY29uZGl0aW9uYWxseQogICAqLwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyA9IGZ1bmN0aW9uKHJvdykgewogICAgdmFyIGJ1c2luZXNzSG91clNlZ3MsIGJ1c2luZXNzSG91cnMsIGJ1c2luZXNzSG91cnNFdmVudHM7CiAgICBidXNpbmVzc0hvdXJzID0gcm93LnJlc291cmNlLmJ1c2luZXNzSG91cnMgfHwgdGhpcy52aWV3Lm9wdCgnYnVzaW5lc3NIb3VycycpOwogICAgYnVzaW5lc3NIb3Vyc0V2ZW50cyA9IHRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKCF0aGlzLmlzVGltZVNjYWxlLCBidXNpbmVzc0hvdXJzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLmV2ZW50c1RvU2VncyhidXNpbmVzc0hvdXJzRXZlbnRzKTsKICAgIGJ1c2luZXNzSG91clNlZ3MgPSB0aGlzLnJlbmRlckZpbGxTZWdFbHMoJ2J1c2luZXNzSG91cnMnLCBidXNpbmVzc0hvdXJTZWdzKTsKICAgIHJvdy5idXNpbmVzc0hvdXJTZWdzID0gYnVzaW5lc3NIb3VyU2VnczsKICB9OwoKICBSZXNvdXJjZVRpbWVsaW5lR3JpZC5wcm90b3R5cGUucmVuZGVyRmlsbCA9IGZ1bmN0aW9uKHR5cGUsIHNlZ3MsIGNsYXNzTmFtZSkgewogICAgdmFyIGosIGssIGxlbiwgbGVuMSwgbm9uUmVzb3VyY2VTZWdzLCBwYWlyLCBwYWlycywgcmVzb3VyY2VTZWdzLCByb3dPYmosIHJvd1NlZ3MsIHNlZywgdmlzaWJsZVBhaXJzOwogICAgc2VncyA9IHRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0eXBlLCBzZWdzKTsKICAgIHJlc291cmNlU2VncyA9IFtdOwogICAgbm9uUmVzb3VyY2VTZWdzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSBzZWdzLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIHNlZyA9IHNlZ3Nbal07CiAgICAgIGlmIChzZWcucmVzb3VyY2VJZCkgewogICAgICAgIHJlc291cmNlU2Vncy5wdXNoKHNlZyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9uUmVzb3VyY2VTZWdzLnB1c2goc2VnKTsKICAgICAgfQogICAgfQogICAgcGFpcnMgPSB0aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhyZXNvdXJjZVNlZ3MpOwogICAgdmlzaWJsZVBhaXJzID0gW107CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcGFpcnMubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7CiAgICAgIHBhaXIgPSBwYWlyc1trXTsKICAgICAgcm93T2JqID0gcGFpclswXSwgcm93U2VncyA9IHBhaXJbMV07CiAgICAgIGlmICh0eXBlID09PSAnYmdFdmVudCcpIHsKICAgICAgICByb3dPYmouYmdTZWdzID0gcm93U2VnczsKICAgICAgfQogICAgICBpZiAocm93T2JqLmlzU2hvd24pIHsKICAgICAgICB2aXNpYmxlUGFpcnMucHVzaChwYWlyKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vblJlc291cmNlU2Vncy5sZW5ndGgpIHsKICAgICAgdmlzaWJsZVBhaXJzLnVuc2hpZnQoW3RoaXMsIG5vblJlc291cmNlU2Vnc10pOwogICAgfQogICAgdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHR5cGUsIHZpc2libGVQYWlycywgY2xhc3NOYW1lKTsKICAgIHJldHVybiBzZWdzOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5yZW5kZXJIZWxwZXIgPSBmdW5jdGlvbihldmVudCwgc291cmNlU2VnKSB7CiAgICB2YXIgcGFpcnMsIHNlZ3M7CiAgICBzZWdzID0gdGhpcy5ldmVudFRvU2VncyhldmVudCk7CiAgICBzZWdzID0gdGhpcy5yZW5kZXJGZ1NlZ0VscyhzZWdzKTsKICAgIHBhaXJzID0gdGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3Moc2Vncyk7CiAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKHBhaXJzLCBzb3VyY2VTZWcpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5jb21wdXRlSW5pdGlhbFNjcm9sbCA9IGZ1bmN0aW9uKHByZXZTdGF0ZSkgewogICAgdmFyIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChwcmV2U3RhdGUpIHsKICAgICAgc3RhdGUucmVzb3VyY2VJZCA9IHByZXZTdGF0ZS5yZXNvdXJjZUlkOwogICAgICBzdGF0ZS5ib3R0b20gPSBwcmV2U3RhdGUuYm90dG9tOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5xdWVyeVNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaiwgbGVuLCByZWYsIHJvd09iaiwgc2Nyb2xsZXJUb3AsIHN0YXRlOwogICAgc3RhdGUgPSBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHNjcm9sbGVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wOwogICAgcmVmID0gdGhpcy52aWV3LmdldFZpc2libGVSb3dzKCk7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgcm93T2JqID0gcmVmW2pdOwogICAgICBpZiAocm93T2JqLnJlc291cmNlKSB7CiAgICAgICAgZWwgPSByb3dPYmouZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgIGlmIChlbEJvdHRvbSA+IHNjcm9sbGVyVG9wKSB7CiAgICAgICAgICBzdGF0ZS5yZXNvdXJjZUlkID0gcm93T2JqLnJlc291cmNlLmlkOwogICAgICAgICAgc3RhdGUuYm90dG9tID0gZWxCb3R0b20gLSBzY3JvbGxlclRvcDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zZXRTY3JvbGwgPSBmdW5jdGlvbihzdGF0ZSkgewogICAgdmFyIGVsLCBlbEJvdHRvbSwgaW5uZXJUb3AsIHJvdzsKICAgIGlmIChzdGF0ZS5yZXNvdXJjZUlkKSB7CiAgICAgIHJvdyA9IHRoaXMudmlldy5nZXRSZXNvdXJjZVJvdyhzdGF0ZS5yZXNvdXJjZUlkKTsKICAgICAgaWYgKHJvdykgewogICAgICAgIGVsID0gcm93LmdldFRyKCdldmVudCcpOwogICAgICAgIGlmIChlbCkgewogICAgICAgICAgaW5uZXJUb3AgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuZWwub2Zmc2V0KCkudG9wOwogICAgICAgICAgZWxCb3R0b20gPSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpOwogICAgICAgICAgc3RhdGUudG9wID0gZWxCb3R0b20gLSBzdGF0ZS5ib3R0b20gLSBpbm5lclRvcDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBSZXNvdXJjZVRpbWVsaW5lR3JpZC5fX3N1cGVyX18uc2V0U2Nyb2xsLmNhbGwodGhpcywgc3RhdGUpOwogIH07CgogIFJlc291cmNlVGltZWxpbmVHcmlkLnByb3RvdHlwZS5zY3JvbGxUb1Jlc291cmNlID0gZnVuY3Rpb24ocmVzb3VyY2UpIHsKICAgIHZhciBlbCwgaW5uZXJUb3AsIHJvdywgc2Nyb2xsVG9wOwogICAgcm93ID0gdGhpcy52aWV3LmdldFJlc291cmNlUm93KHJlc291cmNlLmlkKTsKICAgIGlmIChyb3cpIHsKICAgICAgZWwgPSByb3cuZ2V0VHIoJ2V2ZW50Jyk7CiAgICAgIGlmIChlbCkgewogICAgICAgIGlubmVyVG9wID0gdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcDsKICAgICAgICBzY3JvbGxUb3AgPSBlbC5vZmZzZXQoKS50b3AgLSBpbm5lclRvcDsKICAgICAgICByZXR1cm4gdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHNjcm9sbFRvcCk7CiAgICAgIH0KICAgIH0KICB9OwoKICByZXR1cm4gUmVzb3VyY2VUaW1lbGluZUdyaWQ7Cgp9KShUaW1lbGluZUdyaWQpOwoKQ09MX01JTl9XSURUSCA9IDMwOwoKU3ByZWFkc2hlZXQgPSAoZnVuY3Rpb24oKSB7CiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnZpZXcgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZEVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmVsID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnRib2R5RWwgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZFNjcm9sbGVyID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlTY3JvbGxlciA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5qb2luZXIgPSBudWxsOwoKICBmdW5jdGlvbiBTcHJlYWRzaGVldCh2aWV3MSkgewogICAgdmFyIGNvbFNwZWM7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuaXNSVEwgPSB0aGlzLnZpZXcub3B0KCdpc1JUTCcpOwogICAgdGhpcy5naXZlbkNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICAgIHJlZiA9IHRoaXMudmlldy5jb2xTcGVjczsKICAgICAgcmVzdWx0cyA9IFtdOwogICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICBjb2xTcGVjID0gcmVmW2pdOwogICAgICAgIHJlc3VsdHMucHVzaChjb2xTcGVjLndpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pLmNhbGwodGhpcyk7CiAgfQoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuY29sR3JvdXBIdG1sID0gJyc7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkVGFibGUgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUuaGVhZENvbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5oZWFkQ2VsbEVscyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5ib2R5Q29sRWxzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmJvZHlUYWJsZSA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbiA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oZWFkU2Nyb2xsZXIgPSBuZXcgQ2xpcHBlZFNjcm9sbGVyKHsKICAgICAgb3ZlcmZsb3dYOiAnY2xpcHBlZC1zY3JvbGwnLAogICAgICBvdmVyZmxvd1k6ICdoaWRkZW4nCiAgICB9KTsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcyA9IG5ldyBTY3JvbGxlckNhbnZhcygpOwogICAgdGhpcy5oZWFkU2Nyb2xsZXIucmVuZGVyKCk7CiAgICB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmh0bWwodGhpcy5yZW5kZXJIZWFkSHRtbCgpKTsKICAgIHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlciA9IG5ldyBDbGlwcGVkU2Nyb2xsZXIoewogICAgICBvdmVyZmxvd1k6ICdjbGlwcGVkLXNjcm9sbCcKICAgIH0pOwogICAgdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzID0gbmV3IFNjcm9sbGVyQ2FudmFzKCk7CiAgICB0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgnPHRhYmxlPicgKyB0aGlzLmNvbEdyb3VwSHRtbCArICc8dGJvZHkvPjwvdGFibGU+Jyk7CiAgICB0aGlzLnRib2R5RWwgPSB0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3Rib2R5Jyk7CiAgICB0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCk7CiAgICB0aGlzLmpvaW5lciA9IG5ldyBTY3JvbGxKb2luZXIoJ2hvcml6b250YWwnLCBbdGhpcy5oZWFkU2Nyb2xsZXIsIHRoaXMuYm9keVNjcm9sbGVyXSk7CiAgICB0aGlzLmhlYWRUYWJsZSA9IHRoaXMuaGVhZEVsLmZpbmQoJ3RhYmxlJyk7CiAgICB0aGlzLmhlYWRDb2xFbHMgPSB0aGlzLmhlYWRFbC5maW5kKCdjb2wnKTsKICAgIHRoaXMuaGVhZENlbGxFbHMgPSB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoJ3RyOmxhc3QtY2hpbGQgdGgnKTsKICAgIHRoaXMuYm9keUNvbEVscyA9IHRoaXMuZWwuZmluZCgnY29sJyk7CiAgICB0aGlzLmJvZHlUYWJsZSA9IHRoaXMuZWwuZmluZCgndGFibGUnKTsKICAgIHRoaXMuY29sTWluV2lkdGhzID0gdGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCk7CiAgICB0aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICByZXR1cm4gdGhpcy5pbml0Q29sUmVzaXppbmcoKTsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUucmVuZGVySGVhZEh0bWwgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjb2xHcm91cEh0bWwsIGNvbFNwZWNzLCBodG1sLCBpLCBpc0xhc3QsIGlzTWFpbkNvbCwgaiwgaywgbGVuLCBsZW4xLCBvOwogICAgY29sU3BlY3MgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBodG1sID0gJzx0YWJsZT4nOwogICAgY29sR3JvdXBIdG1sID0gJzxjb2xncm91cD4nOwogICAgZm9yIChqID0gMCwgbGVuID0gY29sU3BlY3MubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgbyA9IGNvbFNwZWNzW2pdOwogICAgICBpZiAoby5pc01haW4pIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xHcm91cEh0bWwgKz0gJzxjb2wvPic7CiAgICAgIH0KICAgIH0KICAgIGNvbEdyb3VwSHRtbCArPSAnPC9jb2xncm91cD4nOwogICAgdGhpcy5jb2xHcm91cEh0bWwgPSBjb2xHcm91cEh0bWw7CiAgICBodG1sICs9IGNvbEdyb3VwSHRtbDsKICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgaWYgKHRoaXMudmlldy5zdXBlckhlYWRlclRleHQpIHsKICAgICAgaHRtbCArPSAnPHRyIGNsYXNzPSJmYy1zdXBlciI+JyArICc8dGggY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0SGVhZGVyQ2xhc3MgKyAnIiBjb2xzcGFuPSInICsgY29sU3BlY3MubGVuZ3RoICsgJyI+JyArICc8ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPicgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUodGhpcy52aWV3LnN1cGVySGVhZGVyVGV4dCkgKyAnPC9zcGFuPicgKyAnPC9kaXY+JyArICc8L3RoPicgKyAnPC90cj4nOwogICAgfQogICAgaHRtbCArPSAnPHRyPic7CiAgICBpc01haW5Db2wgPSB0cnVlOwogICAgZm9yIChpID0gayA9IDAsIGxlbjEgPSBjb2xTcGVjcy5sZW5ndGg7IGsgPCBsZW4xOyBpID0gKytrKSB7CiAgICAgIG8gPSBjb2xTcGVjc1tpXTsKICAgICAgaXNMYXN0ID0gaSA9PT0gY29sU3BlY3MubGVuZ3RoIC0gMTsKICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldEhlYWRlckNsYXNzICsgJyI+JyArICc8ZGl2PicgKyAnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKG8uaXNNYWluID8gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArIGh0bWxFc2NhcGUoby5sYWJlbFRleHQgfHwgJycpICsgJzwvc3Bhbj4nICsgJzwvZGl2PicgKyAoIWlzTGFzdCA/ICc8ZGl2IGNsYXNzPSJmYy1jb2wtcmVzaXplciI+PC9kaXY+JyA6ICcnKSArICc8L2Rpdj4nICsgJzwvdGg+JzsKICAgIH0KICAgIGh0bWwgKz0gJzwvdHI+JzsKICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwogICAgcmV0dXJuIGh0bWw7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmdpdmVuQ29sV2lkdGhzID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFdpZHRocyA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb2xNaW5XaWR0aHMgPSBudWxsOwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudGFibGVXaWR0aCA9IG51bGw7CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS50YWJsZU1pbldpZHRoID0gbnVsbDsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmluaXRDb2xSZXNpemluZyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaGVhZEVsLmZpbmQoJ3RoIC5mYy1jb2wtcmVzaXplcicpLmVhY2goKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihpLCByZXNpemVyRWwpIHsKICAgICAgICByZXNpemVyRWwgPSAkKHJlc2l6ZXJFbCk7CiAgICAgICAgcmV0dXJuIHJlc2l6ZXJFbC5vbignbW91c2Vkb3duJywgZnVuY3Rpb24oZXYpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5jb2xSZXNpemVNb3VzZWRvd24oaSwgZXYsIHJlc2l6ZXJFbCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93biA9IGZ1bmN0aW9uKGksIGV2LCByZXNpemVyRWwpIHsKICAgIHZhciBjb2xXaWR0aHMsIGRyYWdMaXN0ZW5lciwgbWluV2lkdGgsIG9yaWdDb2xXaWR0aDsKICAgIGNvbFdpZHRocyA9IHRoaXMuY29sV2lkdGhzID0gdGhpcy5xdWVyeUNvbFdpZHRocygpOwogICAgY29sV2lkdGhzLnBvcCgpOwogICAgY29sV2lkdGhzLnB1c2gobnVsbCk7CiAgICBvcmlnQ29sV2lkdGggPSBjb2xXaWR0aHNbaV07CiAgICBtaW5XaWR0aCA9IE1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW2ldLCBDT0xfTUlOX1dJRFRIKTsKICAgIGRyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIoewogICAgICBkcmFnU3RhcnQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwuYWRkQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpLAogICAgICBkcmFnOiAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZHgsIGR5KSB7CiAgICAgICAgICB2YXIgd2lkdGg7CiAgICAgICAgICB3aWR0aCA9IG9yaWdDb2xXaWR0aCArIChfdGhpcy5pc1JUTCA/IC1keCA6IGR4KTsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIG1pbldpZHRoKTsKICAgICAgICAgIGNvbFdpZHRoc1tpXSA9IHdpZHRoOwogICAgICAgICAgcmV0dXJuIF90aGlzLmFwcGx5Q29sV2lkdGhzKCk7CiAgICAgICAgfTsKICAgICAgfSkodGhpcyksCiAgICAgIGRyYWdFbmQ6IChmdW5jdGlvbihfdGhpcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByZXNpemVyRWwucmVtb3ZlQ2xhc3MoJ2ZjLWFjdGl2ZScpOwogICAgICAgIH07CiAgICAgIH0pKHRoaXMpCiAgICB9KTsKICAgIHJldHVybiBkcmFnTGlzdGVuZXIuc3RhcnRJbnRlcmFjdGlvbihldik7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmFwcGx5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYWxsTnVtYmVycywgYW55UGVyY2VudGFnZXMsIGNvbE1pbldpZHRocywgY29sV2lkdGgsIGNvbFdpZHRocywgY3NzV2lkdGgsIGNzc1dpZHRocywgZGVmYXVsdENzc1dpZHRoLCBpLCBqLCBrLCBsLCBsZW4sIGxlbjEsIGxlbjIsIHRhYmxlTWluV2lkdGgsIHRvdGFsOwogICAgY29sTWluV2lkdGhzID0gdGhpcy5jb2xNaW5XaWR0aHM7CiAgICBjb2xXaWR0aHMgPSB0aGlzLmNvbFdpZHRoczsKICAgIGFsbE51bWJlcnMgPSB0cnVlOwogICAgYW55UGVyY2VudGFnZXMgPSBmYWxzZTsKICAgIHRvdGFsID0gMDsKICAgIGZvciAoaiA9IDAsIGxlbiA9IGNvbFdpZHRocy5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tqXTsKICAgICAgaWYgKHR5cGVvZiBjb2xXaWR0aCA9PT0gJ251bWJlcicpIHsKICAgICAgICB0b3RhbCArPSBjb2xXaWR0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGxOdW1iZXJzID0gZmFsc2U7CiAgICAgICAgaWYgKGNvbFdpZHRoKSB7CiAgICAgICAgICBhbnlQZXJjZW50YWdlcyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkZWZhdWx0Q3NzV2lkdGggPSBhbnlQZXJjZW50YWdlcyAmJiAhdGhpcy52aWV3LmlzSEdyb3VwaW5nID8gJ2F1dG8nIDogJyc7CiAgICBjc3NXaWR0aHMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBrLCBsZW4xLCByZXN1bHRzOwogICAgICByZXN1bHRzID0gW107CiAgICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY29sV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgICBjb2xXaWR0aCA9IGNvbFdpZHRoc1tpXTsKICAgICAgICByZXN1bHRzLnB1c2goY29sV2lkdGggIT0gbnVsbCA/IGNvbFdpZHRoIDogZGVmYXVsdENzc1dpZHRoKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0pKCk7CiAgICB0YWJsZU1pbldpZHRoID0gMDsKICAgIGZvciAoaSA9IGsgPSAwLCBsZW4xID0gY3NzV2lkdGhzLmxlbmd0aDsgayA8IGxlbjE7IGkgPSArK2spIHsKICAgICAgY3NzV2lkdGggPSBjc3NXaWR0aHNbaV07CiAgICAgIHRhYmxlTWluV2lkdGggKz0gdHlwZW9mIGNzc1dpZHRoID09PSAnbnVtYmVyJyA/IGNzc1dpZHRoIDogY29sTWluV2lkdGhzW2ldOwogICAgfQogICAgZm9yIChpID0gbCA9IDAsIGxlbjIgPSBjc3NXaWR0aHMubGVuZ3RoOyBsIDwgbGVuMjsgaSA9ICsrbCkgewogICAgICBjc3NXaWR0aCA9IGNzc1dpZHRoc1tpXTsKICAgICAgdGhpcy5oZWFkQ29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgICAgdGhpcy5ib2R5Q29sRWxzLmVxKGkpLndpZHRoKGNzc1dpZHRoKTsKICAgIH0KICAgIHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aCh0YWJsZU1pbldpZHRoKTsKICAgIHRoaXMudGFibGVNaW5XaWR0aCA9IHRhYmxlTWluV2lkdGg7CiAgICByZXR1cm4gdGhpcy50YWJsZVdpZHRoID0gYWxsTnVtYmVycyA/IHRvdGFsIDogdm9pZCAwOwogIH07CgogIFNwcmVhZHNoZWV0LnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSwgaiwgbGVuLCByZWYsIHJlc3VsdHMsIHdpZHRoOwogICAgcmVmID0gdGhpcy5naXZlbkNvbFdpZHRoczsKICAgIHJlc3VsdHMgPSBbXTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7CiAgICAgIHdpZHRoID0gcmVmW2ldOwogICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJykgewogICAgICAgIHJlc3VsdHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50KHRoaXMuaGVhZENvbEVscy5lcShpKS5jc3MoJ21pbi13aWR0aCcpKSB8fCBDT0xfTUlOX1dJRFRIKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLnF1ZXJ5Q29sV2lkdGhzID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaiwgbGVuLCBub2RlLCByZWYsIHJlc3VsdHM7CiAgICByZWYgPSB0aGlzLmhlYWRDZWxsRWxzOwogICAgcmVzdWx0cyA9IFtdOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaCgkKG5vZGUpLm91dGVyV2lkdGgoKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICBTcHJlYWRzaGVldC5wcm90b3R5cGUudXBkYXRlV2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKTsKICAgIHRoaXMuam9pbmVyLnVwZGF0ZSgpOwogICAgaWYgKHRoaXMuZm9sbG93ZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZm9sbG93ZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgU3ByZWFkc2hlZXQucHJvdG90eXBlLmhlYWRIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0YWJsZTsKICAgIHRhYmxlID0gdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCd0YWJsZScpOwogICAgcmV0dXJuIHRhYmxlLmhlaWdodC5hcHBseSh0YWJsZSwgYXJndW1lbnRzKTsKICB9OwoKICByZXR1cm4gU3ByZWFkc2hlZXQ7Cgp9KSgpOwoKCi8qCkFuIGFic3RyYWN0IG5vZGUgaW4gYSByb3ctaGllcmFyY2h5IHRyZWUuCk1heSBiZSBhIHNlbGYtY29udGFpbmVkIHNpbmdsZSByb3csIGEgcm93IHdpdGggc3Vicm93cywKT1IgYSBncm91cGluZyBvZiByb3dzIHdpdGhvdXQgaXRzIG93biBkaXN0aW5jdCByb3cuCiAqLwoKUm93UGFyZW50ID0gKGZ1bmN0aW9uKCkgewogIFJvd1BhcmVudC5wcm90b3R5cGUudmlldyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5wcmV2U2libGluZyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuY2hpbGRyZW4gPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmRlcHRoID0gMDsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5oYXNPd25Sb3cgPSBmYWxzZTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS50ckhhc2ggPSBudWxsOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnRycyA9IG51bGw7CgogIFJvd1BhcmVudC5wcm90b3R5cGUuaXNSZW5kZXJlZCA9IGZhbHNlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzRXhwYW5kZWQgPSB0cnVlOwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmlzU2hvd24gPSBmYWxzZTsKCiAgZnVuY3Rpb24gUm93UGFyZW50KHZpZXcxKSB7CiAgICB0aGlzLnZpZXcgPSB2aWV3MTsKICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0aGlzLnRycyA9ICQoKTsKICB9CgoKICAvKgogIAlBZGRzIHRoZSBnaXZlbiBub2RlIGFzIGEgY2hpbGQuCiAgCVdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGBpbmRleGAuIElmIG5vdCBnaXZlbiwgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oY2hpbGQsIGluZGV4KSB7CiAgICB2YXIgY2hpbGRyZW4sIGosIGxlbiwgbm9kZSwgcmVmOwogICAgY2hpbGQucmVtb3ZlKCk7CiAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTsKICAgIH0KICAgIGNoaWxkLnByZXZTaWJsaW5nID0gaW5kZXggPiAwID8gY2hpbGRyZW5baW5kZXggLSAxXSA6IG51bGw7CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggLSAxKSB7CiAgICAgIGNoaWxkcmVuW2luZGV4ICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZDsKICAgIH0KICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7CiAgICBjaGlsZC5kZXB0aCA9IHRoaXMuZGVwdGggKyAodGhpcy5oYXNPd25Sb3cgPyAxIDogMCk7CiAgICByZWYgPSBjaGlsZC5nZXROb2RlcygpOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIG5vZGUgPSByZWZbal07CiAgICAgIG5vZGUuYWRkZWQoKTsKICAgIH0KICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHJldHVybiBjaGlsZC5zaG93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCVJlbW92ZXMgdGhlIGdpdmVuIGNoaWxkIGZyb20gdGhlIG5vZGUuIEFzc3VtZXMgaXQgaXMgYSBkaXJlY3QgY2hpbGQuCiAgCUlmIG5vdCBhIGRpcmVjdCBjaGlsZCwgcmV0dXJucyBmYWxzZSBhbmQgbm90aGluZyBoYXBwZW5zLgogIAlVbnJlbmRlcnMgdGhlIGNoaWxkIGFuZCB0cmlnZ2VycyBoYW5kbGVycy4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGNoaWxkKSB7CiAgICB2YXIgY2hpbGRyZW4sIGksIGlzRm91bmQsIGosIGssIGxlbiwgbGVuMSwgcmVmLCByb3csIHRlc3RDaGlsZDsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIGlzRm91bmQgPSBmYWxzZTsKICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHsKICAgICAgdGVzdENoaWxkID0gY2hpbGRyZW5baV07CiAgICAgIGlmICh0ZXN0Q2hpbGQgPT09IGNoaWxkKSB7CiAgICAgICAgaXNGb3VuZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNGb3VuZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDEpIHsKICAgICAgICBjaGlsZHJlbltpICsgMV0ucHJldlNpYmxpbmcgPSBjaGlsZC5wcmV2U2libGluZzsKICAgICAgfQogICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgICAgcmVmID0gY2hpbGQuZ2V0Tm9kZXMoKTsKICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZi5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgICByb3cgPSByZWZba107CiAgICAgICAgcm93LnJlbW92ZWQoKTsKICAgICAgfQogICAgICBjaGlsZC5wYXJlbnQgPSBudWxsOwogICAgICBjaGlsZC5wcmV2U2libGluZyA9IG51bGw7CiAgICAgIHJldHVybiBjaGlsZDsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVtb3ZlcyBhbGwgb2YgdGhlIG5vZGUncyBjaGlsZHJlbiBmcm9tIHRoZSBoaWVyYXJjaHkuIFVucmVuZGVycyB0aGVtIGFuZCB0cmlnZ2VycyBjYWxsYmFja3MuCiAgCU5PVEU6IGJhdGNoUm93cy91bmJhdGNoUm93cyBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIGhhcHBlbnMgOigKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBrLCBsZW4sIGxlbjEsIHJlZiwgcmVmMTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIGNoaWxkLnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKTsKICAgIH0KICAgIHJlZjEgPSB0aGlzLmdldERlc2NlbmRhbnRzKCk7CiAgICBmb3IgKGsgPSAwLCBsZW4xID0gcmVmMS5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHsKICAgICAgY2hpbGQgPSByZWYxW2tdOwogICAgICBjaGlsZC5yZW1vdmVkKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbiA9IFtdOwogIH07CgoKICAvKgogIAlSZW1vdmVzIHRoaXMgbm9kZSBmcm9tIGl0cyBwYXJlbnQKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhcmVudCkgewogICAgICByZXR1cm4gdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdldHMgdGhlIGxhc3QgZGlyZWN0IGNoaWxkIG5vZGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgIHJldHVybiBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKICB9OwoKCiAgLyoKICAJV2Fsa3MgYmFja3dhcmQgaW4gdGhlIGhpZXJhcmNoeSB0byBmaW5kIHRoZSBwcmV2aW91cyByb3cgbGVhZiBub2RlLgogIAlXaGVuIGxvb2tpbmcgYXQgdGhlIGhpZXJhcmNoeSBpbiBhIGZsYXQgbGluZWFyIGZhc2hpb24sIHRoaXMgaXMgdGhlIHJldmVhbGVkIHJvdyBqdXN0IGJlZm9yZSB0aGUgY3VycmVudC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRQcmV2Um93ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbGFzdENoaWxkLCBub2RlOwogICAgbm9kZSA9IHRoaXM7CiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5wcmV2U2libGluZykgewogICAgICAgIG5vZGUgPSBub2RlLnByZXZTaWJsaW5nOwogICAgICAgIHdoaWxlICgobGFzdENoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkpIHsKICAgICAgICAgIG5vZGUgPSBsYXN0Q2hpbGQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgfQogICAgICBpZiAobm9kZSAmJiBub2RlLmhhc093blJvdyAmJiBub2RlLmlzU2hvd24pIHsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKCgogIC8qCiAgCVJldHVybnMgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHN1YnRyZWUgdGhhdCBoYXMgYSByZXZlYWxlZCByb3cKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRMZWFkaW5nUm93ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHJvdy1ub2RlcyBvZiB0aGUgc3VidHJlZS4gRGVzY2VuZGFudHMgKyBzZWxmCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0Um93cyA9IGZ1bmN0aW9uKGJhdGNoQXJyYXkpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAoYmF0Y2hBcnJheSA9PSBudWxsKSB7CiAgICAgIGJhdGNoQXJyYXkgPSBbXTsKICAgIH0KICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICBiYXRjaEFycmF5LnB1c2godGhpcyk7CiAgICB9CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXRSb3dzKGJhdGNoQXJyYXkpOwogICAgfQogICAgcmV0dXJuIGJhdGNoQXJyYXk7CiAgfTsKCgogIC8qCiAgCUdlbmVyYXRlcyBhIGZsYXQgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIG5vZGVzIChyb3cvbm9uLXJvdykgb2YgdGhlIHN1YnRyZWUuIERlc2NlbmRhbnRzICsgc2VsZgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE5vZGVzID0gZnVuY3Rpb24oYmF0Y2hBcnJheSkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmIChiYXRjaEFycmF5ID09IG51bGwpIHsKICAgICAgYmF0Y2hBcnJheSA9IFtdOwogICAgfQogICAgYmF0Y2hBcnJheS5wdXNoKHRoaXMpOwogICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgY2hpbGQuZ2V0Tm9kZXMoYmF0Y2hBcnJheSk7CiAgICB9CiAgICByZXR1cm4gYmF0Y2hBcnJheTsKICB9OwoKCiAgLyoKICAJR2VuZXJhdGVzIGEgZmxhdCBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyB0aGUgY3VycmVudCBub2RlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiYXRjaEFycmF5LCBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBiYXRjaEFycmF5ID0gW107CiAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICBjaGlsZC5nZXROb2RlcyhiYXRjaEFycmF5KTsKICAgIH0KICAgIHJldHVybiBiYXRjaEFycmF5OwogIH07CgoKICAvKgogIAlCdWlsZHMgYW5kIHBvcHVsYXRlcyB0aGUgVFJzIGZvciBlYWNoIHJvdyB0eXBlLiBJbnNlcnRzIHRoZW0gaW50byB0aGUgRE9NLgogIAlEb2VzIHRoaXMgb25seSBmb3IgdGhpcyBzaW5nbGUgcm93LiBOb3QgcmVjdXJzaXZlLiBJZiBub3QgYSByb3cgKGhhc093blJvdz1mYWxzZSksIGRvZXMgbm90IHJlbmRlciBhbnl0aGluZy4KICAJUFJFQ09ORElUSU9OOiBhc3N1bWVzIHRoZSBwYXJlbnQgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwcmV2Um93LCByZWYsIHJlbmRlck1ldGhvZE5hbWUsIHRib2R5LCB0ciwgdHJOb2RlcywgdHlwZTsKICAgIHRoaXMudHJIYXNoID0ge307CiAgICB0ck5vZGVzID0gW107CiAgICBpZiAodGhpcy5oYXNPd25Sb3cpIHsKICAgICAgcHJldlJvdyA9IHRoaXMuZ2V0UHJldlJvdygpOwogICAgICByZWYgPSB0aGlzLnZpZXcudGJvZHlIYXNoOwogICAgICBmb3IgKHR5cGUgaW4gcmVmKSB7CiAgICAgICAgdGJvZHkgPSByZWZbdHlwZV07CiAgICAgICAgdHIgPSAkKCc8dHIvPicpOwogICAgICAgIHRoaXMudHJIYXNoW3R5cGVdID0gdHI7CiAgICAgICAgdHJOb2Rlcy5wdXNoKHRyWzBdKTsKICAgICAgICByZW5kZXJNZXRob2ROYW1lID0gJ3JlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0pIHsKICAgICAgICAgIHRoaXNbcmVuZGVyTWV0aG9kTmFtZV0odHIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJldlJvdykgewogICAgICAgICAgcHJldlJvdy50ckhhc2hbdHlwZV0uYWZ0ZXIodHIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0Ym9keS5wcmVwZW5kKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMudHJzID0gJCh0ck5vZGVzKS5vbignY2xpY2snLCAnLmZjLWV4cGFuZGVyJywgcHJveHkodGhpcywgJ3RvZ2dsZUV4cGFuZGVkJykpOwogICAgcmV0dXJuIHRoaXMuaXNSZW5kZXJlZCA9IHRydWU7CiAgfTsKCgogIC8qCiAgCVVucG9wdWxhdGVzIGFuZCByZW1vdmVzIGFsbCBvZiB0aGlzIHJvdydzIFRScyBmcm9tIHRoZSBET00uIE9ubHkgZm9yIHRoaXMgc2luZ2xlIHJvdy4gTm90IHJlY3Vyc2l2ZS4KICAJV2lsbCB0cmlnZ2VyICJoaWRkZW4iLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnVucmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcmVmLCB0ciwgdHlwZSwgdW5yZW5kZXJNZXRob2ROYW1lOwogICAgaWYgKHRoaXMuaXNSZW5kZXJlZCkgewogICAgICByZWYgPSB0aGlzLnRySGFzaDsKICAgICAgZm9yICh0eXBlIGluIHJlZikgewogICAgICAgIHRyID0gcmVmW3R5cGVdOwogICAgICAgIHVucmVuZGVyTWV0aG9kTmFtZSA9ICd1bnJlbmRlcicgKyBjYXBpdGFsaXNlRmlyc3RMZXR0ZXIodHlwZSkgKyAnQ29udGVudCc7CiAgICAgICAgaWYgKHRoaXNbdW5yZW5kZXJNZXRob2ROYW1lXSkgewogICAgICAgICAgdGhpc1t1bnJlbmRlck1ldGhvZE5hbWVdKHRyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50ckhhc2ggPSB7fTsKICAgICAgdGhpcy50cnMucmVtb3ZlKCk7CiAgICAgIHRoaXMudHJzID0gJCgpOwogICAgICB0aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pc1Nob3duID0gZmFsc2U7CiAgICAgIHJldHVybiB0aGlzLmhpZGRlbigpOwogICAgfQogIH07CgoKICAvKgogIAlMaWtlIHVucmVuZGVyKCksIGJ1dCBkb2VzIGl0IGZvciB0aGlzIHJvdyBBTkQgYWxsIGRlc2NlbmRhbnRzLgogIAlOT1RFOiBiYXRjaFJvd3MvdW5iYXRjaFJvd3Mgc2hvdWxkIHByb2JhYmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBoYXBwZW5zIDooCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucmVjdXJzaXZlbHlVbnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZiwgcmVzdWx0czsKICAgIHRoaXMudW5yZW5kZXIoKTsKICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICByZXN1bHRzID0gW107CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5yZWN1cnNpdmVseVVucmVuZGVyKCkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCgogIC8qCiAgCUEgc2ltcGxlIGdldHRlciBmb3IgcmV0cmlldmluZyBhIFRSIGpRdWVyeSBvYmplY3Qgb2YgYSBjZXJ0YWluIHJvdyB0eXBlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuZ2V0VHIgPSBmdW5jdGlvbih0eXBlKSB7CiAgICByZXR1cm4gdGhpcy50ckhhc2hbdHlwZV07CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cgaWYgbm90IGFscmVhZHkgcmVuZGVyZWQsIG1ha2luZyBzdXJlIGl0IGlzIHZpc2libGUuCiAgCUFsc28gcmVuZGVycyBkZXNjZW5kYW50cyBvZiB0aGlzIHN1YnRyZWUsIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgZXhwYW5kZWQgb3Igbm90LgogIAlOT1RFOiBJZiBjYWxsZWQgZXh0ZXJuYWxseSwgYmF0Y2hSb3dzL3VuYmF0Y2hSb3dzIHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgaGFwcGVucyA6KAogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICBpZiAoIXRoaXMuaXNTaG93bikgewogICAgICBpZiAoIXRoaXMuaXNSZW5kZXJlZCkgewogICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cnMuY3NzKCdkaXNwbGF5JywgJycpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCkgewogICAgICAgIHRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaXNFeHBhbmRlZCkgewogICAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKTsKICAgICAgfQogICAgICB0aGlzLmlzU2hvd24gPSB0cnVlOwogICAgICB0aGlzLnNob3duKCk7CiAgICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgICByZWYgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgICAgcmVzdWx0cy5wdXNoKGNoaWxkLnNob3coKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCVRlbXBvcmFyaWx5IGhpZGVzIHRoaXMgbm9kZSdzIFRScyAoaWYgYXBwbGljYWJsZSkgYXMgd2VsbCBhcyBhbGwgbm9kZXMgaW4gdGhlIHN1YnRyZWUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY2hpbGQsIGosIGxlbiwgcmVmLCByZXN1bHRzOwogICAgaWYgKHRoaXMuaXNTaG93bikgewogICAgICBpZiAodGhpcy5pc1JlbmRlcmVkKSB7CiAgICAgICAgdGhpcy50cnMuaGlkZSgpOwogICAgICB9CiAgICAgIHRoaXMuaXNTaG93biA9IGZhbHNlOwogICAgICB0aGlzLmhpZGRlbigpOwogICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBjaGlsZCA9IHJlZltqXTsKICAgICAgICAgIHJlc3VsdHMucHVzaChjaGlsZC5oaWRlKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgfQogICAgfQogIH07CgoKICAvKgogIAlSZXZlYWxzIHRoaXMgbm9kZSdzIGNoaWxkcmVuIGlmIHRoZXkgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldmVhbGVkLiBDaGFuZ2VzIGFueSBleHBhbmRlciBpY29uLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkLCBqLCBsZW4sIHJlZjsKICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7CiAgICAgIHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOwogICAgICB0aGlzLnZpZXcuYmF0Y2hSb3dzKCk7CiAgICAgIHJlZiA9IHRoaXMuY2hpbGRyZW47CiAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykgewogICAgICAgIGNoaWxkID0gcmVmW2pdOwogICAgICAgIGNoaWxkLnNob3coKTsKICAgICAgfQogICAgICB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlIaWRlcyB0aGlzIG5vZGUncyBjaGlsZHJlbiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBoaWRkZW4uIENoYW5nZXMgYW55IGV4cGFuZGVyIGljb24uCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuY29sbGFwc2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjaGlsZCwgaiwgbGVuLCByZWY7CiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlOwogICAgICB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgIHRoaXMudmlldy5iYXRjaFJvd3MoKTsKICAgICAgcmVmID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgY2hpbGQgPSByZWZbal07CiAgICAgICAgY2hpbGQuaGlkZSgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnZpZXcudW5iYXRjaFJvd3MoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJU3dpdGNoZXMgYmV0d2VlbiBleHBhbmRlZC9jb2xsYXBzZWQgc3RhdGVzCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2UoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmV4cGFuZCgpOwogICAgfQogIH07CgoKICAvKgogIAlDaGFuZ2VzIHRoZSBleHBhbmRlciBpY29uIHRvIHRoZSAiZXhwYW5kZWQiIHN0YXRlCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuaW5kaWNhdGVFeHBhbmRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKTsKICB9OwoKCiAgLyoKICAJQ2hhbmdlcyB0aGUgZXhwYW5kZXIgaWNvbiB0byB0aGUgImNvbGxhcHNlZCIgc3RhdGUKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5pbmRpY2F0ZUNvbGxhcHNlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMudHJzLmZpbmQoJy5mYy1leHBhbmRlciAuZmMtaWNvbicpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0RXhwYW5kZWRJY29uKCkpLmFkZENsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnRycy5maW5kKCcuZmMtZXhwYW5kZXItc3BhY2UnKS5hZGRDbGFzcygnZmMtZXhwYW5kZXInKTsKICB9OwoKCiAgLyoKICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5kaXNhYmxlRXhwYW5kaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy50cnMuZmluZCgnLmZjLWV4cGFuZGVyLXNwYWNlJykucmVtb3ZlQ2xhc3MoJ2ZjLWV4cGFuZGVyJykuZmluZCgnLmZjLWljb24nKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSk7CiAgfTsKCiAgUm93UGFyZW50LnByb3RvdHlwZS5nZXRFeHBhbmRlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiAnZmMtaWNvbi1kb3duLXRyaWFuZ2xlJzsKICB9OwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldENvbGxhcHNlZEljb24gPSBmdW5jdGlvbigpIHsKICAgIHZhciBkaXI7CiAgICBkaXIgPSB0aGlzLnZpZXcuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnOwogICAgcmV0dXJuICdmYy1pY29uLScgKyBkaXIgKyAnLXRyaWFuZ2xlJzsKICB9OwoKCiAgLyoKICAJQ2F1c2VzIGEgc2xpZGUtZG93biBDU1MgdHJhbnNpdGlvbiB0byBkZW1vbnN0cmF0ZSB0aGF0IHRoZSBleHBhbmQgaGFzIGhhcHBlbmVkCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHJlZiwgcmVmMSwgdHJzOwogICAgdHJzID0gKHJlZiA9IHRoaXMuY2hpbGRyZW5bMF0pICE9IG51bGwgPyAocmVmMSA9IHJlZi5nZXRMZWFkaW5nUm93KCkpICE9IG51bGwgPyByZWYxLnRycyA6IHZvaWQgMCA6IHZvaWQgMDsKICAgIGlmICh0cnMpIHsKICAgICAgdHJzLmFkZENsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0cnMuYWRkQ2xhc3MoJ2ZjLXRyYW5zaXRpb25pbmcnKTsKICAgICAgICByZXR1cm4gdHJzLnJlbW92ZUNsYXNzKCdmYy1jb2xsYXBzZWQnKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnMub25lKCd3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRycy5yZW1vdmVDbGFzcygnZmMtdHJhbnNpdGlvbmluZycpOwogICAgICB9KTsKICAgIH0KICB9OwoKCiAgLyoKICAJRmluZCBlYWNoIFRScyAiaW5uZXIgZGl2IiAoZGl2IHdpdGhpbiBmaXJzdCBjZWxsKS4gVGhpcyBkaXYgY29udHJvbHMgZWFjaCBUUnMgaGVpZ2h0LgogIAlSZXR1cm5zIHRoZSBtYXggcGl4ZWwgaGVpZ2h0LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLmdldE1heFRySW5uZXJIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBtYXg7CiAgICBtYXggPSAwOwogICAgJC5lYWNoKHRoaXMudHJIYXNoLCAoZnVuY3Rpb24oX3RoaXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUsIHRyKSB7CiAgICAgICAgdmFyIGlubmVyRWw7CiAgICAgICAgaW5uZXJFbCA9IGdldE93bkNlbGxzKHRyKS5maW5kKCc+IGRpdjpub3QoLmZjLWNlbGwtY29udGVudCk6Zmlyc3QnKTsKICAgICAgICByZXR1cm4gbWF4ID0gTWF0aC5tYXgoaW5uZXJFbC5oZWlnaHQoKSwgbWF4KTsKICAgICAgfTsKICAgIH0pKHRoaXMpKTsKICAgIHJldHVybiBtYXg7CiAgfTsKCgogIC8qCiAgCUZpbmQgZWFjaCBUUnMgImlubmVyIGRpdiIgYW5kIHNldHMgYWxsIG9mIHRoZWlyIGhlaWdodHMgdG8gdGhlIHNhbWUgdmFsdWUuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2V0VHJJbm5lckhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCkgewogICAgcmV0dXJuICQuZWFjaCh0aGlzLnRySGFzaCwgKGZ1bmN0aW9uKF90aGlzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB0cikgewogICAgICAgIHJldHVybiBnZXRPd25DZWxscyh0cikuZmluZCgnPiBkaXY6bm90KC5mYy1jZWxsLWNvbnRlbnQpOmZpcnN0JykuaGVpZ2h0KGhlaWdodCk7CiAgICAgIH07CiAgICB9KSh0aGlzKSk7CiAgfTsKCgogIC8qCiAgCVRyaWdnZXJlZCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaGFzIGJlZW4gc2hvd24gKGVpdGhlciBmcmVzaGx5IHJlbmRlcmVkIG9yIHJlLXNob3duKQogIAl3aGVuIGl0IGhhZCBwcmV2aW91c2x5IGJlZW4gdW5yZW5kZXJlZCBvciBoaWRkZW4uIGBzaG93bmAgZG9lcyBub3QgYnViYmxlIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUuc2hvd24gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKTsKICAgIH0KICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBoaWRkZW4gKGVpdGhlciB0ZW1wb3JhcmlseSBvciBwZXJtYW5lbnRseSkKICAJd2hlbiBpdCBoYWQgcHJldmlvdXNseSBiZWVuIHNob3duLiBgaGlkZGVuYCBkb2VzIG5vdCBidWJibGUgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5oaWRkZW4gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dIaWRkZW4odGhpcyk7CiAgICB9CiAgfTsKCgogIC8qCiAgCUp1c3QgbGlrZSBgc2hvd25gLCBidXQgb25seSB0cmlnZ2VyZWQgZm9yIG5vZGVzIHRoYXQgYXJlIGFjdHVhbCByb3dzLiBCdWJibGVzIHVwIHRoZSBoaWVyYXJjaHkuCiAgICovCgogIFJvd1BhcmVudC5wcm90b3R5cGUucm93U2hvd24gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dTaG93bihyb3cpOwogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGhpZGRlbmAsIGJ1dCBvbmx5IHRyaWdnZXJlZCBmb3Igbm9kZXMgdGhhdCBhcmUgYWN0dWFsIHJvd3MuIEJ1YmJsZXMgdXAgdGhlIGhpZXJhcmNoeS4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5yb3dIaWRkZW4gPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dIaWRkZW4ocm93KTsKICB9OwoKCiAgLyoKICAJVHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaGllcmFyY2h5LiBgYWRkZWRgIGRvZXMgbm90IGJ1YmJsZSB1cC4KICAgKi8KCiAgUm93UGFyZW50LnByb3RvdHlwZS5hZGRlZCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuaGFzT3duUm93KSB7CiAgICAgIHJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlUcmlnZ2VyZWQgd2hlbiB0aGUgY3VycmVudCBub2RlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgaGllcmFyY2h5LiBgcmVtb3ZlZGAgZG9lcyBub3QgYnViYmxlIHVwLgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJlbW92ZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmhhc093blJvdykgewogICAgICByZXR1cm4gdGhpcy5yb3dSZW1vdmVkKHRoaXMpOwogICAgfQogIH07CgoKICAvKgogIAlKdXN0IGxpa2UgYGFkZGVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd0FkZGVkID0gZnVuY3Rpb24ocm93KSB7CiAgICByZXR1cm4gKHRoaXMucGFyZW50IHx8IHRoaXMudmlldykucm93QWRkZWQocm93KTsKICB9OwoKCiAgLyoKICAJSnVzdCBsaWtlIGByZW1vdmVkYCwgYnV0IG9ubHkgdHJpZ2dlcmVkIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWwgcm93cy4gQnViYmxlcyB1cCB0aGUgaGllcmFyY2h5LgogICAqLwoKICBSb3dQYXJlbnQucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcy52aWV3KS5yb3dSZW1vdmVkKHJvdyk7CiAgfTsKCiAgcmV0dXJuIFJvd1BhcmVudDsKCn0pKCk7CgoKLyoKQW4gYWJzdHJhY3Qgbm9kZSBpbiBhIHJvdy1oaWVyYXJjaHkgdHJlZSB0aGF0IGNvbnRhaW5zIG90aGVyIG5vZGVzLgpXaWxsIGhhdmUgc29tZSBzb3J0IG9mIHJlbmRlcmVkIGxhYmVsIGluZGljYXRpbmcgdGhlIGdyb3VwaW5nLAp1cCB0byB0aGUgc3ViY2xhc3MgZm9yIGRldGVybWluaW5nIHdoYXQgdG8gZG8gd2l0aCBpdC4KICovCgpSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKFJvd0dyb3VwLCBzdXBlckNsYXNzKTsKCiAgUm93R3JvdXAucHJvdG90eXBlLmdyb3VwU3BlYyA9IG51bGw7CgogIFJvd0dyb3VwLnByb3RvdHlwZS5ncm91cFZhbHVlID0gbnVsbDsKCiAgZnVuY3Rpb24gUm93R3JvdXAodmlldywgZ3JvdXBTcGVjMSwgZ3JvdXBWYWx1ZTEpIHsKICAgIHRoaXMuZ3JvdXBTcGVjID0gZ3JvdXBTcGVjMTsKICAgIHRoaXMuZ3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWUxOwogICAgUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gdGhpcyByb3cgKGlmIGl0IHJlbmRlcnMgYSByb3cpIG9yIGEgc3Vicm93IGlzIHJlbW92ZWQKICAgKi8KCiAgUm93R3JvdXAucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJvd0dyb3VwLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmICF0aGlzLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5yZW1vdmUoKTsKICAgIH0KICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgY29udGVudCB3cmFwcGVyIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhpcyByb3cncyBURCBjZWxsCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cENvbnRlbnRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGNvbnRlbnRFbCwgZmlsdGVyOwogICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50IiAvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwVGV4dEVsKCkpOwogICAgZmlsdGVyID0gdGhpcy5ncm91cFNwZWMucmVuZGVyOwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgY29udGVudEVsID0gZmlsdGVyKGNvbnRlbnRFbCwgdGhpcy5ncm91cFZhbHVlKSB8fCBjb250ZW50RWw7CiAgICB9CiAgICByZXR1cm4gY29udGVudEVsOwogIH07CgoKICAvKgogIAlSZW5kZXJzIHRoZSB0ZXh0IHNwYW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGlzIHJvdydzIFREIGNlbGwuCiAgCUdvZXMgd2l0aGluIHRoZSBjb250ZW50IGVsZW1lbnQuCiAgICovCgogIFJvd0dyb3VwLnByb3RvdHlwZS5yZW5kZXJHcm91cFRleHRFbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGZpbHRlciwgdGV4dDsKICAgIHRleHQgPSB0aGlzLmdyb3VwVmFsdWUgfHwgJyc7CiAgICBmaWx0ZXIgPSB0aGlzLmdyb3VwU3BlYy50ZXh0OwogICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdGV4dCA9IGZpbHRlcih0ZXh0KSB8fCB0ZXh0OwogICAgfQogICAgcmV0dXJuICQoJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiIC8+JykudGV4dCh0ZXh0KTsKICB9OwoKICByZXR1cm4gUm93R3JvdXA7Cgp9KShSb3dQYXJlbnQpOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHNpbmdsZSBzb2xpZCByb3cgdGhhdCBzcGFucyB3aWR0aC13aXNlIChsaWtlIGEgaG9yaXpvbnRhbCBydWxlKQogKi8KCkhSb3dHcm91cCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7CiAgZXh0ZW5kKEhSb3dHcm91cCwgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIEhSb3dHcm91cCgpIHsKICAgIHJldHVybiBIUm93R3JvdXAuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfQoKICBIUm93R3JvdXAucHJvdG90eXBlLmhhc093blJvdyA9IHRydWU7CgoKICAvKgogIAlSZW5kZXJzIHRoaXMgcm93J3MgVFIgZm9yIHRoZSAic3ByZWFkc2hlZXQiIHF1YWRyYW50LCB0aGUgYXJlYSB3aXRoIGluZm8gYWJvdXQgZWFjaCByZXNvdXJjZQogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclNwcmVhZHNoZWV0Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICB2YXIgY29udGVudEVsOwogICAgY29udGVudEVsID0gdGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpOwogICAgY29udGVudEVsLnByZXBlbmQoJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlciI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPicpOwogICAgcmV0dXJuICQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciIgLz4nKS5hdHRyKCdjb2xzcGFuJywgdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKCQoJzxkaXYvPicpLmFwcGVuZChjb250ZW50RWwpKS5hcHBlbmRUbyh0cik7CiAgfTsKCgogIC8qCiAgCVJlbmRlcnMgdGhpcyByb3cncyBUUiBmb3IgdGhlIHF1YWRyYW50IHRoYXQgY29udGFpbnMgYSByZXNvdXJjZSdzIGV2ZW50cwogICAqLwoKICBIUm93R3JvdXAucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKHRyKSB7CiAgICByZXR1cm4gdHIuYXBwZW5kKCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiPiA8ZGl2Lz4gPC90ZD4nKTsKICB9OwoKICByZXR1cm4gSFJvd0dyb3VwOwoKfSkoUm93R3JvdXApOwoKCi8qCkEgcm93IGdyb3VwaW5nIHRoYXQgcmVuZGVycyBhcyBhIHRhbGwgbXVsdGktY2VsbCB2ZXJ0aWNhbCBzcGFuIGluIHRoZSAic3ByZWFkc2hlZXQiIGFyZWEKICovCgpWUm93R3JvdXAgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChWUm93R3JvdXAsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBWUm93R3JvdXAoKSB7CiAgICByZXR1cm4gVlJvd0dyb3VwLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dzcGFuID0gMDsKCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5sZWFkaW5nVHIgPSBudWxsOwoKICBWUm93R3JvdXAucHJvdG90eXBlLmdyb3VwVGQgPSBudWxsOwoKCiAgLyoKICAJQ2FsbGVkIHdoZW4gYSByb3cgc29tZXdoZXJlIHdpdGhpbiB0aGUgZ3JvdXBpbmcgaXMgc2hvd24KICAgKi8KCiAgVlJvd0dyb3VwLnByb3RvdHlwZS5yb3dTaG93biA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuICs9IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd1Nob3duLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IHNvbWV3aGVyZSB3aXRoaW4gdGhlIGdyb3VwaW5nIGlzIGhpZGRlbgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJvd0hpZGRlbiA9IGZ1bmN0aW9uKHJvdykgewogICAgdGhpcy5yb3dzcGFuIC09IDE7CiAgICB0aGlzLnJlbmRlclJvd3NwYW4oKTsKICAgIHJldHVybiBWUm93R3JvdXAuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH07CgoKICAvKgogIAlNYWtlcyBzdXJlIHRoZSBncm91cFRkIGhhcyB0aGUgY29ycmVjdCByb3dzcGFuIC8gcGxhY2UgaW4gdGhlIERPTS4KICAJUFJFQ09ORElUSU9OOiBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBncm91cCBuZXN0aW5nLCBhIGNoaWxkJ3MgcmVuZGVyUm93c3BhbigpCiAgCXdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgcGFyZW50J3MgcmVuZGVyUm93c3BhbigpLgogICAqLwoKICBWUm93R3JvdXAucHJvdG90eXBlLnJlbmRlclJvd3NwYW4gPSBmdW5jdGlvbigpIHsKICAgIHZhciBsZWFkaW5nVHI7CiAgICBpZiAodGhpcy5yb3dzcGFuKSB7CiAgICAgIGlmICghdGhpcy5ncm91cFRkKSB7CiAgICAgICAgdGhpcy5ncm91cFRkID0gJCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpKTsKICAgICAgfQogICAgICB0aGlzLmdyb3VwVGQuYXR0cigncm93c3BhbicsIHRoaXMucm93c3Bhbik7CiAgICAgIGxlYWRpbmdUciA9IHRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCdzcHJlYWRzaGVldCcpOwogICAgICBpZiAobGVhZGluZ1RyICE9PSB0aGlzLmxlYWRpbmdUcikgewogICAgICAgIGlmIChsZWFkaW5nVHIpIHsKICAgICAgICAgIGxlYWRpbmdUci5wcmVwZW5kKHRoaXMuZ3JvdXBUZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IGxlYWRpbmdUcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHRoaXMuZ3JvdXBUZCkgewogICAgICAgIHRoaXMuZ3JvdXBUZC5yZW1vdmUoKTsKICAgICAgICB0aGlzLmdyb3VwVGQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLmxlYWRpbmdUciA9IG51bGw7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFZSb3dHcm91cDsKCn0pKFJvd0dyb3VwKTsKCkV2ZW50Um93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoRXZlbnRSb3csIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBFdmVudFJvdygpIHsKICAgIHJldHVybiBFdmVudFJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIEV2ZW50Um93LnByb3RvdHlwZS5oYXNPd25Sb3cgPSB0cnVlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0ID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmlubmVyRWwgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbCA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5pc1NlZ3NSZW5kZXJlZCA9IGZhbHNlOwoKICBFdmVudFJvdy5wcm90b3R5cGUuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmYWxzZTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3MgPSBudWxsOwoKICBFdmVudFJvdy5wcm90b3R5cGUuYmdTZWdzID0gbnVsbDsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmZnU2VncyA9IG51bGw7CgogIEV2ZW50Um93LnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdHIuaHRtbCgnPHRkIGNsYXNzPSInICsgdGhpcy52aWV3LndpZGdldENvbnRlbnRDbGFzcyArICciPiA8ZGl2PiA8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiIC8+IDwvZGl2PiA8L3RkPicpOwogICAgdGhpcy5zZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJy5mYy1ldmVudC1jb250YWluZXInKTsKICAgIHRoaXMuaW5uZXJFbCA9IHRoaXMuYmdTZWdDb250YWluZXJFbCA9IHRyLmZpbmQoJ3RkID4gZGl2Jyk7CiAgICByZXR1cm4gdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQoKTsKICB9OwoKICBFdmVudFJvdy5wcm90b3R5cGUuZW5zdXJlU2Vnc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuaXNTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKTsKICAgICAgaWYgKHRoaXMuYmdTZWdzKSB7CiAgICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYmdFdmVudCcsIHRoaXMsIHRoaXMuYmdTZWdzKTsKICAgICAgfQogICAgICBpZiAodGhpcy5mZ1NlZ3MpIHsKICAgICAgICB0aGlzLnZpZXcudGltZUdyaWQucmVuZGVyRmdTZWdzSW5Db250YWluZXJzKFtbdGhpcywgdGhpcy5mZ1NlZ3NdXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuaXNTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmJ1c2luZXNzSG91clNlZ3MgJiYgIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpIHsKICAgICAgdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcignYnVzaW5lc3NIb3VycycsIHRoaXMsIHRoaXMuYnVzaW5lc3NIb3VyU2VncywgJ2JnZXZlbnQnKTsKICAgICAgcmV0dXJuIHRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQgPSB0cnVlOwogICAgfQogIH07CgogIEV2ZW50Um93LnByb3RvdHlwZS51bnJlbmRlckV2ZW50Q29udGVudCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKTsKICAgIHRoaXMuYmdTZWdzID0gbnVsbDsKICAgIHRoaXMuZmdTZWdzID0gbnVsbDsKICAgIHJldHVybiB0aGlzLmlzU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgRXZlbnRSb3cucHJvdG90eXBlLmNsZWFyQnVzaW5lc3NIb3VyU2VncyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGosIGxlbiwgcmVmLCBzZWc7CiAgICBpZiAodGhpcy5idXNpbmVzc0hvdXJTZWdzKSB7CiAgICAgIHJlZiA9IHRoaXMuYnVzaW5lc3NIb3VyU2VnczsKICAgICAgZm9yIChqID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgc2VnID0gcmVmW2pdOwogICAgICAgIGlmIChzZWcuZWwpIHsKICAgICAgICAgIHNlZy5lbC5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5idXNpbmVzc0hvdXJTZWdzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkID0gZmFsc2U7CiAgfTsKCiAgcmV0dXJuIEV2ZW50Um93OwoKfSkoUm93UGFyZW50KTsKCgovKgpBIHJvdyB0aGF0IHJlbmRlcnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhcyB3ZWxsIGFzIGl0IGV2ZW50cyAoaGFuZGxlZCBieSBzdXBlcmNsYXNzKQogKi8KClJlc291cmNlUm93ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VSb3csIHN1cGVyQ2xhc3MpOwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVzb3VyY2UgPSBudWxsOwoKICBmdW5jdGlvbiBSZXNvdXJjZVJvdyh2aWV3LCByZXNvdXJjZTEpIHsKICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTE7CiAgICBSZXNvdXJjZVJvdy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgoKICAvKgogIAlDYWxsZWQgd2hlbiBhIHJvdyBpbiB0aGUgdHJlZSBoYXMgYmVlbiBhZGRlZAogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucm93QWRkZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dBZGRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHJvdyAhPT0gdGhpcyAmJiB0aGlzLmlzUmVuZGVyZWQpIHsKICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5lbmFibGVFeHBhbmRpbmcoKTsKICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbmRpY2F0ZUV4cGFuZGVkKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLmluZGljYXRlQ29sbGFwc2VkKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCgogIC8qCiAgCUNhbGxlZCB3aGVuIGEgcm93IGluIHRoZSB0cmVlIGhhcyBiZWVuIHJlbW92ZWQKICAgKi8KCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJvd1JlbW92ZWQgPSBmdW5jdGlvbihyb3cpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAocm93ICE9PSB0aGlzICYmIHRoaXMuaXNSZW5kZXJlZCkgewogICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpOwogICAgICB9CiAgICB9CiAgfTsKCiAgUmVzb3VyY2VSb3cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VSb3cuX19zdXBlcl9fLnJlbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICB0aGlzLmVuYWJsZUV4cGFuZGluZygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kaXNhYmxlRXhwYW5kaW5nKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy52aWV3LnRyaWdnZXIoJ3Jlc291cmNlUmVuZGVyJywgdGhpcy5yZXNvdXJjZSwgdGhpcy5yZXNvdXJjZSwgdGhpcy5nZXRUcignc3ByZWFkc2hlZXQnKS5maW5kKCc+IHRkJyksIHRoaXMuZ2V0VHIoJ2V2ZW50JykuZmluZCgnPiB0ZCcpKTsKICB9OwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyRXZlbnRDb250ZW50ID0gZnVuY3Rpb24odHIpIHsKICAgIFJlc291cmNlUm93Ll9fc3VwZXJfXy5yZW5kZXJFdmVudENvbnRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0ci5hdHRyKCdkYXRhLXJlc291cmNlLWlkJywgdGhpcy5yZXNvdXJjZS5pZCk7CiAgfTsKCgogIC8qCiAgCVBvcHVsYXRlcyB0aGUgVFIgd2l0aCBjZWxscyBjb250YWluaW5nIGRhdGEgYWJvdXQgdGhlIHJlc291cmNlCiAgICovCgogIFJlc291cmNlUm93LnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQgPSBmdW5jdGlvbih0cikgewogICAgdmFyIGNvbFNwZWMsIGNvbnRlbnRFbCwgaW5wdXQsIGosIGxlbiwgcmVmLCByZXNvdXJjZSwgdGQsIHRleHQ7CiAgICByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7CiAgICByZWYgPSB0aGlzLnZpZXcuY29sU3BlY3M7CiAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHsKICAgICAgY29sU3BlYyA9IHJlZltqXTsKICAgICAgaWYgKGNvbFNwZWMuZ3JvdXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbnB1dCA9IGNvbFNwZWMuZmllbGQgPyByZXNvdXJjZVtjb2xTcGVjLmZpZWxkXSB8fCBudWxsIDogcmVzb3VyY2U7CiAgICAgIHRleHQgPSB0eXBlb2YgY29sU3BlYy50ZXh0ID09PSAnZnVuY3Rpb24nID8gY29sU3BlYy50ZXh0KHJlc291cmNlLCBpbnB1dCkgOiBpbnB1dDsKICAgICAgY29udGVudEVsID0gJCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nICsgKGNvbFNwZWMuaXNNYWluID8gdGhpcy5yZW5kZXJHdXR0ZXJIdG1sKCkgOiAnJykgKyAnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+JyArICh0ZXh0ID8gaHRtbEVzY2FwZSh0ZXh0KSA6ICcmbmJzcDsnKSArICc8L3NwYW4+JyArICc8L2Rpdj4nKTsKICAgICAgaWYgKHR5cGVvZiBjb2xTcGVjLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGNvbnRlbnRFbCA9IGNvbFNwZWMucmVuZGVyKHJlc291cmNlLCBjb250ZW50RWwsIGlucHV0KSB8fCBjb250ZW50RWw7CiAgICAgIH0KICAgICAgdGQgPSAkKCc8dGQgY2xhc3M9IicgKyB0aGlzLnZpZXcud2lkZ2V0Q29udGVudENsYXNzICsgJyIvPicpLmFwcGVuZChjb250ZW50RWwpOwogICAgICBpZiAoY29sU3BlYy5pc01haW4pIHsKICAgICAgICB0ZC53cmFwSW5uZXIoJzxkaXYvPicpOwogICAgICB9CiAgICAgIHRyLmFwcGVuZCh0ZCk7CiAgICB9CiAgICByZXR1cm4gdHIuYXR0cignZGF0YS1yZXNvdXJjZS1pZCcsIHJlc291cmNlLmlkKTsKICB9OwoKCiAgLyoKICAJUmVuZGVycyB0aGUgSFRNTCByZXNwb25zaWJsZSBmb3IgdGhlIHN1YnJvdyBleHBhbmRlciBhcmVhLAogIAlhcyB3ZWxsIGFzIHRoZSBzcGFjZSBiZWZvcmUgaXQgKHVzZWQgdG8gYWxpZ24gZXhwYW5kZXJzIG9mIHNpbWlsYXIgZGVwdGhzKQogICAqLwoKICBSZXNvdXJjZVJvdy5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGh0bWwsIGksIGosIHJlZjsKICAgIGh0bWwgPSAnJzsKICAgIGZvciAoaSA9IGogPSAwLCByZWYgPSB0aGlzLmRlcHRoOyBqIDwgcmVmOyBpID0gaiArPSAxKSB7CiAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1pY29uIi8+JzsKICAgIH0KICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+JyArICc8c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPicgKyAnPC9zcGFuPic7CiAgICByZXR1cm4gaHRtbDsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VSb3c7Cgp9KShFdmVudFJvdyk7CgpGQy52aWV3cy50aW1lbGluZS5yZXNvdXJjZUNsYXNzID0gUmVzb3VyY2VUaW1lbGluZVZpZXc7CgpSZXNvdXJjZUFnZW5kYVZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUFnZW5kYVZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZUFnZW5kYVZpZXcoKSB7CiAgICByZXR1cm4gUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VBZ2VuZGFWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS50aW1lR3JpZENsYXNzID0gUmVzb3VyY2VUaW1lR3JpZDsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS5kYXlHcmlkQ2xhc3MgPSBSZXNvdXJjZURheUdyaWQ7CgogIFJlc291cmNlQWdlbmRhVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VBZ2VuZGFWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy50aW1lR3JpZC5wcm9jZXNzSGVhZFJlc291cmNlRWxzKHRoaXMuaGVhZENvbnRhaW5lckVsKTsKICB9OwoKICBSZXNvdXJjZUFnZW5kYVZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy50aW1lR3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIGlmICh0aGlzLmRheUdyaWQpIHsKICAgICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgfQogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VBZ2VuZGFWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKGlzRGVzdHJveWluZykgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy50aW1lR3JpZC51bnNldFJlc291cmNlcygpOwogICAgaWYgKHRoaXMuZGF5R3JpZCkgewogICAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIH0KICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQWdlbmRhVmlldzsKCn0pKEZDLkFnZW5kYVZpZXcpOwoKRkMudmlld3MuYWdlbmRhLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgdmFyIHJlZjsKICBpZiAoKHJlZiA9IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgIT0gbnVsbCA/IHJlZiA6IHZpZXdTcGVjLmR1cmF0aW9uLmFzKCdkYXlzJykgPT09IDEpIHsKICAgIHJldHVybiBSZXNvdXJjZUFnZW5kYVZpZXc7CiAgfQp9OwoKUmVzb3VyY2VCYXNpY1ZpZXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykgewogIGV4dGVuZChSZXNvdXJjZUJhc2ljVmlldywgc3VwZXJDbGFzcyk7CgogIGZ1bmN0aW9uIFJlc291cmNlQmFzaWNWaWV3KCkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIH0KCiAgUmVzb3VyY2VCYXNpY1ZpZXcubWl4aW4oUmVzb3VyY2VWaWV3TWl4aW4pOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUuZGF5R3JpZENsYXNzID0gUmVzb3VyY2VEYXlHcmlkOwoKICBSZXNvdXJjZUJhc2ljVmlldy5wcm90b3R5cGUucmVuZGVySGVhZCA9IGZ1bmN0aW9uKCkgewogICAgUmVzb3VyY2VCYXNpY1ZpZXcuX19zdXBlcl9fLnJlbmRlckhlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKHJlc291cmNlcykgewogICAgdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyhyZXNvdXJjZXMpOwogICAgdGhpcy5jbGVhclZpZXcoKTsKICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgfTsKCiAgUmVzb3VyY2VCYXNpY1ZpZXcucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzID0gZnVuY3Rpb24oaXNEZXN0cm95aW5nKSB7CiAgICB0aGlzLmNsZWFyRXZlbnRzKCk7CiAgICB0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKTsKICAgIGlmICghaXNEZXN0cm95aW5nKSB7CiAgICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlWaWV3KCk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwoKfSkoRkMuQmFzaWNWaWV3KTsKClJlc291cmNlTW9udGhWaWV3ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHsKICBleHRlbmQoUmVzb3VyY2VNb250aFZpZXcsIHN1cGVyQ2xhc3MpOwoKICBmdW5jdGlvbiBSZXNvdXJjZU1vbnRoVmlldygpIHsKICAgIHJldHVybiBSZXNvdXJjZU1vbnRoVmlldy5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9CgogIFJlc291cmNlTW9udGhWaWV3Lm1peGluKFJlc291cmNlVmlld01peGluKTsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLmRheUdyaWRDbGFzcyA9IFJlc291cmNlRGF5R3JpZDsKCiAgUmVzb3VyY2VNb250aFZpZXcucHJvdG90eXBlLnJlbmRlckhlYWQgPSBmdW5jdGlvbigpIHsKICAgIFJlc291cmNlTW9udGhWaWV3Ll9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS5zZXRSZXNvdXJjZXMgPSBmdW5jdGlvbihyZXNvdXJjZXMpIHsKICAgIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXMocmVzb3VyY2VzKTsKICAgIHRoaXMuY2xlYXJWaWV3KCk7CiAgICByZXR1cm4gdGhpcy5kaXNwbGF5VmlldygpOwogIH07CgogIFJlc291cmNlTW9udGhWaWV3LnByb3RvdHlwZS51bnNldFJlc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhckV2ZW50cygpOwogICAgdGhpcy5kYXlHcmlkLnVuc2V0UmVzb3VyY2VzKCk7CiAgICB0aGlzLmNsZWFyVmlldygpOwogICAgcmV0dXJuIHRoaXMuZGlzcGxheVZpZXcoKTsKICB9OwoKICByZXR1cm4gUmVzb3VyY2VNb250aFZpZXc7Cgp9KShGQy5Nb250aFZpZXcpOwoKRkMudmlld3MuYmFzaWMucXVlcnlSZXNvdXJjZUNsYXNzID0gZnVuY3Rpb24odmlld1NwZWMpIHsKICB2YXIgcmVmOwogIGlmICgocmVmID0gdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5UmVzb3VyY2UgfHwgdmlld1NwZWMub3B0aW9ucy5ncm91cEJ5RGF0ZUFuZFJlc291cmNlKSAhPSBudWxsID8gcmVmIDogdmlld1NwZWMuZHVyYXRpb24uYXMoJ2RheXMnKSA9PT0gMSkgewogICAgcmV0dXJuIFJlc291cmNlQmFzaWNWaWV3OwogIH0KfTsKCkZDLnZpZXdzLm1vbnRoLnF1ZXJ5UmVzb3VyY2VDbGFzcyA9IGZ1bmN0aW9uKHZpZXdTcGVjKSB7CiAgaWYgKHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeVJlc291cmNlIHx8IHZpZXdTcGVjLm9wdGlvbnMuZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSkgewogICAgcmV0dXJuIFJlc291cmNlTW9udGhWaWV3OwogIH0KfTsKClJFTEVBU0VfREFURSA9ICcyMDE2LTA5LTA0JzsKClVQR1JBREVfV0lORE9XID0gewogIHllYXJzOiAxLAogIHdlZWtzOiAxCn07CgpMSUNFTlNFX0lORk9fVVJMID0gJ2h0dHA6Ly9mdWxsY2FsZW5kYXIuaW8vc2NoZWR1bGVyL2xpY2Vuc2UvJzsKClBSRVNFVF9MSUNFTlNFX0tFWVMgPSBbJ0dQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlJywgJ0NDLUF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtTm9EZXJpdmF0aXZlcyddOwoKcHJvY2Vzc0xpY2Vuc2VLZXkgPSBmdW5jdGlvbihrZXksIGNvbnRhaW5lckVsKSB7CiAgaWYgKCFpc0ltbXVuZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZikgJiYgIWlzVmFsaWRLZXkoa2V5KSkgewogICAgaWYgKCFkZXRlY3RXYXJuaW5nSW5Db250YWluZXIoY29udGFpbmVyRWwpKSB7CiAgICAgIHJldHVybiByZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyArIExJQ0VOU0VfSU5GT19VUkwgKyAnIj5Nb3JlIEluZm88L2E+JywgY29udGFpbmVyRWwpOwogICAgfQogIH0KfTsKCgovKgpUaGlzIGRlY3J5cHRpb24gaXMgbm90IG1lYW50IHRvIGJlIGJ1bGxldHByb29mLiBKdXN0IGEgd2F5IHRvIHJlbWluZCBhYm91dCBhbiB1cGdyYWRlLgogKi8KCmlzVmFsaWRLZXkgPSBmdW5jdGlvbihrZXkpIHsKICB2YXIgbWluUHVyY2hhc2VEYXRlLCBwYXJ0cywgcHVyY2hhc2VEYXRlLCByZWxlYXNlRGF0ZTsKICBpZiAoJC5pbkFycmF5KGtleSwgUFJFU0VUX0xJQ0VOU0VfS0VZUykgIT09IC0xKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcGFydHMgPSAoa2V5IHx8ICcnKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pOwogIGlmIChwYXJ0cyAmJiBwYXJ0c1sxXS5sZW5ndGggPT09IDEwKSB7CiAgICBwdXJjaGFzZURhdGUgPSBtb21lbnQudXRjKHBhcnNlSW50KHBhcnRzWzJdKSAqIDEwMDApOwogICAgcmVsZWFzZURhdGUgPSBtb21lbnQudXRjKEZDLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZSB8fCBSRUxFQVNFX0RBVEUpOwogICAgaWYgKHJlbGVhc2VEYXRlLmlzVmFsaWQoKSkgewogICAgICBtaW5QdXJjaGFzZURhdGUgPSByZWxlYXNlRGF0ZS5jbG9uZSgpLnN1YnRyYWN0KFVQR1JBREVfV0lORE9XKTsKICAgICAgaWYgKHB1cmNoYXNlRGF0ZS5pc0FmdGVyKG1pblB1cmNoYXNlRGF0ZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn07Cgppc0ltbXVuZVVybCA9IGZ1bmN0aW9uKHVybCkgewogIHJldHVybiBCb29sZWFuKHVybC5tYXRjaCgvXHcrXDpcL1wvZnVsbGNhbGVuZGFyXC5pb1wvfFwvZGVtb3NcL1tcdy1dK1wuaHRtbCQvKSk7Cn07CgpyZW5kZXJpbmdXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihtZXNzYWdlSHRtbCwgY29udGFpbmVyRWwpIHsKICByZXR1cm4gY29udGFpbmVyRWwuYXBwZW5kKCQoJzxkaXYgY2xhc3M9ImZjLWxpY2Vuc2UtbWVzc2FnZSIgLz4nKS5odG1sKG1lc3NhZ2VIdG1sKSk7Cn07CgpkZXRlY3RXYXJuaW5nSW5Db250YWluZXIgPSBmdW5jdGlvbihjb250YWluZXJFbCkgewogIHJldHVybiBjb250YWluZXJFbC5maW5kKCcuZmMtbGljZW5zZS1tZXNzYWdlJykubGVuZ3RoID49IDE7Cn07Cgp9KTsK
LyohCkZ1bGxDYWxlbmRhciBTY2hlZHVsZXIgdjEuNC4wCkRvY3MgJiBMaWNlbnNlOiBodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci8KKGMpIDIwMTYgQWRhbSBTaGF3CiAqLwohZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiLCJtb21lbnQiLCJmdWxsY2FsZW5kYXIiXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dChyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJtb21lbnQiKSxyZXF1aXJlKCJmdWxsY2FsZW5kYXIiKSk6dChqUXVlcnksbW9tZW50KX0oZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSLGIsQyxFLEgsVCxfLEksRCx4LEIsRixHLE0sVyxMLHosayxWLFAsQSxPLHEsTixqLFksVSxYLCQsSyxRLEosWix0dCxldCxydCxvdCxzdCxpdCxudCxsdCx1dCxodCxhdCxjdCxwdCxkdCxmdCxndCx5dCx2dCx3dCxtdCxTdCxSdCxidCxDdCxFdCxIdCxUdCxfdCxJdCxEdCx4dCxCdCxGdCxHdCxNdCxXdCxMdCx6dCxrdCxWdCxQdCxBdCxPdD1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBvIGluIGUpcXQuY2FsbChlLG8pJiYodFtvXT1lW29dKTtyZXR1cm4gci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5fX3N1cGVyX189ZS5wcm90b3R5cGUsdH0scXQ9e30uaGFzT3duUHJvcGVydHksTnQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aDtlPHI7ZSsrKWlmKGUgaW4gdGhpcyYmdGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LGp0PVtdLnNsaWNlO3JldHVybiBkPXQuZnVsbENhbGVuZGFyLGQuc2NoZWR1bGVyVmVyc2lvbj0iMS40LjAiLDYhPT1kLmludGVybmFsQXBpVmVyc2lvbj92b2lkIGQud2FybigidiIrZC5zY2hlZHVsZXJWZXJzaW9uKyIgb2YgRnVsbENhbGVuZGFyIFNjaGVkdWxlciBpcyBpbmNvbXBhdGlibGUgd2l0aCB2IitkLnZlcnNpb24rIiBvZiB0aGUgY29yZS5cblBsZWFzZSBzZWUgaHR0cDovL2Z1bGxjYWxlbmRhci5pby9zdXBwb3J0LyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKToobz1kLkNhbGVuZGFyLGk9ZC5DbGFzcyxYPWQuVmlldyxmPWQuR3JpZCx2dD1kLmludGVyc2VjdFJhbmdlcyxvdD1kLmRlYm91bmNlLFN0PWQuaXNJbnQsZnQ9ZC5nZXRTY3JvbGxiYXJXaWR0aHMsaD1kLkRyYWdMaXN0ZW5lcix5dD1kLmh0bWxFc2NhcGUsSj1kLmNvbXB1dGVJbnRlcnZhbFVuaXQsTXQ9ZC5wcm94eSxLPWQuY2FwaXRhbGlzZUZpcnN0TGV0dGVyLCQ9ZC5hcHBseUFsbCxhPWQuRW1pdHRlck1peGluLHY9ZC5MaXN0ZW5lck1peGluLGx0PWQuZHVyYXRpb25IYXNUaW1lLG50PWQuZGl2aWRlUmFuZ2VCeUR1cmF0aW9uLGl0PWQuZGl2aWRlRHVyYXRpb25CeUR1cmF0aW9uLEN0PWQubXVsdGlwbHlEdXJhdGlvbixGdD1kLnBhcnNlRmllbGRTcGVjcyxRPWQuY29tcGFyZUJ5RmllbGRTcGVjcyx1dD1kLmZsZXhpYmxlQ29tcGFyZSx3dD1kLmludGVyc2VjdFJlY3RzLGw9ZC5Db29yZENhY2hlLGh0PWQuZ2V0Q29udGVudFJlY3QsYXQ9ZC5nZXRPdXRlclJlY3QsY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZmluZCgiPiB0ZCIpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlLnJvd1NwYW48PTF9KX0sTHQ9ZnVuY3Rpb24oZSxyLG8pe3JldHVybiBlJiZlLnRoZW4mJiJyZXNvbHZlZCIhPT1lLnN0YXRlKCk/InJlamVjdGVkIj09PWUuc3RhdGUoKT8obyYmbygpLHQuRGVmZXJyZWQoKS5yZWplY3QoKS5wcm9taXNlKCkpOmUudGhlbihyLG8pOnI/dC53aGVuKHIoKSk6dC53aGVuKCl9LGM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3IuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlcXVlc3RNb3ZpbmdFbmQ9b3QodGhpcy5yZXBvcnRNb3ZpbmdFbmQsNTAwKX12YXIgbyxzO3JldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5taXhpbih2KSxyLnByb3RvdHlwZS5jYW52YXM9bnVsbCxyLnByb3RvdHlwZS5pc1Njcm9sbGluZz0hMSxyLnByb3RvdHlwZS5pc1RvdWNoaW5nPSExLHIucHJvdG90eXBlLmlzTW92aW5nPSExLHIucHJvdG90eXBlLmlzVG91Y2hTY3JvbGxFbmFibGVkPSEwLHIucHJvdG90eXBlLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbCxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNhbnZhcyYmKHRoaXMuY2FudmFzLnJlbmRlcigpLHRoaXMuY2FudmFzLmVsLmFwcGVuZFRvKHRoaXMuc2Nyb2xsRWwpKSx0aGlzLmJpbmRIYW5kbGVycygpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudW5iaW5kSGFuZGxlcnMoKX0sci5wcm90b3R5cGUuZGlzYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQ9ITEsdGhpcy5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCl9LHIucHJvdG90eXBlLmVuYWJsZVRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoU2Nyb2xsRW5hYmxlZD0hMCwhdGhpcy5pc1RvdWNoaW5nKXJldHVybiB0aGlzLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbCgpfSxyLnByb3RvdHlwZS5iaW5kUHJldmVudFRvdWNoU2Nyb2xsPWZ1bmN0aW9uKCl7aWYoIXRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vbigidG91Y2htb3ZlIix0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9ZC5wcmV2ZW50RGVmYXVsdCl9LHIucHJvdG90eXBlLnVuYmluZFByZXZlbnRUb3VjaFNjcm9sbD1mdW5jdGlvbigpe2lmKHRoaXMucHJldmVudFRvdWNoU2Nyb2xsSGFuZGxlcilyZXR1cm4gdGhpcy5zY3JvbGxFbC5vZmYoInRvdWNobW92ZSIsdGhpcy5wcmV2ZW50VG91Y2hTY3JvbGxIYW5kbGVyKSx0aGlzLnByZXZlbnRUb3VjaFNjcm9sbEhhbmRsZXI9bnVsbH0sci5wcm90b3R5cGUuYmluZEhhbmRsZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdGVuVG8odGhpcy5zY3JvbGxFbCx7c2Nyb2xsOnRoaXMucmVwb3J0U2Nyb2xsLHRvdWNoc3RhcnQ6dGhpcy5yZXBvcnRUb3VjaFN0YXJ0LHRvdWNoZW5kOnRoaXMucmVwb3J0VG91Y2hFbmR9KX0sci5wcm90b3R5cGUudW5iaW5kSGFuZGxlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wTGlzdGVuaW5nVG8odGhpcy5zY3JvbGxFbCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzU2Nyb2xsaW5nfHx0aGlzLnJlcG9ydFNjcm9sbFN0YXJ0KCksdGhpcy50cmlnZ2VyKCJzY3JvbGwiKSx0aGlzLmlzTW92aW5nPSEwLHRoaXMucmVxdWVzdE1vdmluZ0VuZCgpfSxyLnByb3RvdHlwZS5yZXBvcnRTY3JvbGxTdGFydD1mdW5jdGlvbigpe2lmKCF0aGlzLmlzU2Nyb2xsaW5nKXJldHVybiB0aGlzLmlzU2Nyb2xsaW5nPSEwLHRoaXMudHJpZ2dlcigic2Nyb2xsU3RhcnQiLHRoaXMuaXNUb3VjaGluZyl9LHIucHJvdG90eXBlLnJlcXVlc3RNb3ZpbmdFbmQ9bnVsbCxyLnByb3RvdHlwZS5yZXBvcnRNb3ZpbmdFbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTW92aW5nPSExLCF0aGlzLmlzVG91Y2hpbmcpcmV0dXJuIHRoaXMucmVwb3J0U2Nyb2xsRW5kKCl9LHIucHJvdG90eXBlLnJlcG9ydFNjcm9sbEVuZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNTY3JvbGxpbmcpcmV0dXJuIHRoaXMudHJpZ2dlcigic2Nyb2xsRW5kIiksdGhpcy5pc1Njcm9sbGluZz0hMX0sci5wcm90b3R5cGUucmVwb3J0VG91Y2hTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVG91Y2hpbmc9ITB9LHIucHJvdG90eXBlLnJlcG9ydFRvdWNoRW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1RvdWNoaW5nJiYodGhpcy5pc1RvdWNoaW5nPSExLHRoaXMuaXNUb3VjaFNjcm9sbEVuYWJsZWQmJnRoaXMudW5iaW5kUHJldmVudFRvdWNoU2Nyb2xsKCksIXRoaXMuaXNNb3ZpbmcpKXJldHVybiB0aGlzLnJlcG9ydFNjcm9sbEVuZCgpfSxyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO2lmKHQ9dGhpcy5zY3JvbGxFbC5jc3MoImRpcmVjdGlvbiIpLGU9dGhpcy5zY3JvbGxFbFswXSxyPWUuc2Nyb2xsTGVmdCwicnRsIj09PXQpc3dpdGNoKHMpe2Nhc2UicG9zaXRpdmUiOnI9citlLmNsaWVudFdpZHRoLWUuc2Nyb2xsV2lkdGg7YnJlYWs7Y2FzZSJyZXZlcnNlIjpyPS1yfXJldHVybiByfSxyLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoZT10aGlzLnNjcm9sbEVsLmNzcygiZGlyZWN0aW9uIikscj10aGlzLnNjcm9sbEVsWzBdLCJydGwiPT09ZSlzd2l0Y2gocyl7Y2FzZSJwb3NpdGl2ZSI6dD10LXIuY2xpZW50V2lkdGgrci5zY3JvbGxXaWR0aDticmVhaztjYXNlInJldmVyc2UiOnQ9LXR9cmV0dXJuIHIuc2Nyb2xsTGVmdD10fSxyLnByb3RvdHlwZS5nZXRTY3JvbGxGcm9tTGVmdD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZih0PXRoaXMuc2Nyb2xsRWwuY3NzKCJkaXJlY3Rpb24iKSxlPXRoaXMuc2Nyb2xsRWxbMF0scj1lLnNjcm9sbExlZnQsInJ0bCI9PT10KXN3aXRjaChzKXtjYXNlIm5lZ2F0aXZlIjpyPXItZS5jbGllbnRXaWR0aCtlLnNjcm9sbFdpZHRoO2JyZWFrO2Nhc2UicmV2ZXJzZSI6cj0tci1lLmNsaWVudFdpZHRoK2Uuc2Nyb2xsV2lkdGh9cmV0dXJuIHJ9LHIucHJvdG90eXBlLmdldE5hdGl2ZVNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxFbFswXS5zY3JvbGxMZWZ0fSxyLnByb3RvdHlwZS5zZXROYXRpdmVTY3JvbGxMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjcm9sbEVsWzBdLnNjcm9sbExlZnQ9dH0scz1udWxsLG89ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIGU9dCgnPGRpdiBzdHlsZT0iIHBvc2l0aW9uOiBhYnNvbHV0ZSB0b3A6IC0xMDAwcHg7IHdpZHRoOiAxcHg7IGhlaWdodDogMXB4OyBvdmVyZmxvdzogc2Nyb2xsOyBkaXJlY3Rpb246IHJ0bDsgZm9udC1zaXplOiAxNHB4OyAiPkE8L2Rpdj4nKS5hcHBlbmRUbygiYm9keSIpLHI9ZVswXSxvPXIuc2Nyb2xsTGVmdD4wPyJwb3NpdGl2ZSI6KHIuc2Nyb2xsTGVmdD0xLGUuc2Nyb2xsTGVmdD4wPyJyZXZlcnNlIjoibmVnYXRpdmUiKSxlLnJlbW92ZSgpLG99LHQoZnVuY3Rpb24oKXtyZXR1cm4gcz1vKCl9KSxyfShkLlNjcm9sbGVyKSxuPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dYJiYodGhpcy5vdmVyZmxvd1g9InNjcm9sbCIsdGhpcy5pc0hTY3JvbGxiYXJzQ2xpcHBlZD0hMCksImNsaXBwZWQtc2Nyb2xsIj09PXRoaXMub3ZlcmZsb3dZJiYodGhpcy5vdmVyZmxvd1k9InNjcm9sbCIsdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZD0hMCl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuaXNIU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUuaXNWU2Nyb2xsYmFyc0NsaXBwZWQ9ITEsci5wcm90b3R5cGUucmVuZGVyRWw9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT1yLl9fc3VwZXJfXy5yZW5kZXJFbC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCgnPGRpdiBjbGFzcz0iZmMtc2Nyb2xsZXItY2xpcCIgLz4nKS5hcHBlbmQoZSl9LHIucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7cmV0dXJuIGU9dGhpcy5zY3JvbGxFbCxyPWZ0KGUpLHQ9e21hcmdpbkxlZnQ6MCxtYXJnaW5SaWdodDowLG1hcmdpblRvcDowLG1hcmdpbkJvdHRvbTowfSx0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkJiYodC5tYXJnaW5Ub3A9LXIudG9wLHQubWFyZ2luQm90dG9tPS1yLmJvdHRvbSksdGhpcy5pc1ZTY3JvbGxiYXJzQ2xpcHBlZCYmKHQubWFyZ2luTGVmdD0tci5sZWZ0LHQubWFyZ2luUmlnaHQ9LXIucmlnaHQpLGUuY3NzKHQpLGUudG9nZ2xlQ2xhc3MoImZjLW5vLXNjcm9sbGJhcnMiLCh0aGlzLmlzSFNjcm9sbGJhcnNDbGlwcGVkfHwiaGlkZGVuIj09PXRoaXMub3ZlcmZsb3dYKSYmKHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWR8fCJoaWRkZW4iPT09dGhpcy5vdmVyZmxvd1kpJiYhKHIudG9wfHxyLmJvdHRvbXx8ci5sZWZ0fHxyLnJpZ2h0KSl9LHIucHJvdG90eXBlLmdldFNjcm9sbGJhcldpZHRocz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PWZ0KHRoaXMuc2Nyb2xsRWwpLHRoaXMuaXNIU2Nyb2xsYmFyc0NsaXBwZWQmJih0LnRvcD0wLHQuYm90dG9tPTApLHRoaXMuaXNWU2Nyb2xsYmFyc0NsaXBwZWQmJih0LmxlZnQ9MCx0LnJpZ2h0PTApLHR9LHJ9KGMpLE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5ndXR0ZXJzPXt9fXJldHVybiBlLnByb3RvdHlwZS5lbD1udWxsLGUucHJvdG90eXBlLmNvbnRlbnRFbD1udWxsLGUucHJvdG90eXBlLmJnRWw9bnVsbCxlLnByb3RvdHlwZS5ndXR0ZXJzPW51bGwsZS5wcm90b3R5cGUud2lkdGg9bnVsbCxlLnByb3RvdHlwZS5taW5XaWR0aD1udWxsLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsPXQoJzxkaXYgY2xhc3M9ImZjLXNjcm9sbGVyLWNhbnZhcyI+IDxkaXYgY2xhc3M9ImZjLWNvbnRlbnQiPjwvZGl2PiA8ZGl2IGNsYXNzPSJmYy1iZyI+PC9kaXY+IDwvZGl2PicpLHRoaXMuY29udGVudEVsPXRoaXMuZWwuZmluZCgiLmZjLWNvbnRlbnQiKSx0aGlzLmJnRWw9dGhpcy5lbC5maW5kKCIuZmMtYmciKX0sZS5wcm90b3R5cGUuc2V0R3V0dGVycz1mdW5jdGlvbihlKXtyZXR1cm4gZT90LmV4dGVuZCh0aGlzLmd1dHRlcnMsZSk6dGhpcy5ndXR0ZXJzPXt9LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53aWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5zZXRNaW5XaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5taW5XaWR0aD10LHRoaXMudXBkYXRlU2l6ZSgpfSxlLnByb3RvdHlwZS5jbGVhcldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2lkdGg9bnVsbCx0aGlzLm1pbldpZHRoPW51bGwsdGhpcy51cGRhdGVTaXplKCl9LGUucHJvdG90eXBlLnVwZGF0ZVNpemU9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmd1dHRlcnMsdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWxlZnQiLEJvb2xlYW4odC5sZWZ0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci1yaWdodCIsQm9vbGVhbih0LnJpZ2h0KSkudG9nZ2xlQ2xhc3MoImZjLWd1dHRlci10b3AiLEJvb2xlYW4odC50b3ApKS50b2dnbGVDbGFzcygiZmMtZ3V0dGVyLWJvdHRvbSIsQm9vbGVhbih0LmJvdHRvbSkpLmNzcyh7cGFkZGluZ0xlZnQ6dC5sZWZ0fHwiIixwYWRkaW5nUmlnaHQ6dC5yaWdodHx8IiIscGFkZGluZ1RvcDp0LnRvcHx8IiIscGFkZGluZ0JvdHRvbTp0LmJvdHRvbXx8IiIsd2lkdGg6bnVsbCE9dGhpcy53aWR0aD90aGlzLndpZHRoKyh0LmxlZnR8fDApKyh0LnJpZ2h0fHwwKToiIixtaW5XaWR0aDpudWxsIT10aGlzLm1pbldpZHRoP3RoaXMubWluV2lkdGgrKHQubGVmdHx8MCkrKHQucmlnaHR8fDApOiIifSksdGhpcy5iZ0VsLmNzcyh7bGVmdDp0LmxlZnR8fCIiLHJpZ2h0OnQucmlnaHR8fCIiLHRvcDp0LnRvcHx8IiIsYm90dG9tOnQuYm90dG9tfHwiIn0pfSxlfSgpLEE9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIHIsbyxzLGk7Zm9yKHRoaXMuYXhpcz10LHRoaXMuc2Nyb2xsZXJzPWUscz10aGlzLnNjcm9sbGVycyxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSx0aGlzLmluaXRTY3JvbGxlcihpKX1yZXR1cm4gdC5wcm90b3R5cGUuYXhpcz1udWxsLHQucHJvdG90eXBlLnNjcm9sbGVycz1udWxsLHQucHJvdG90eXBlLm1hc3RlclNjcm9sbGVyPW51bGwsdC5wcm90b3R5cGUuaW5pdFNjcm9sbGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNjcm9sbEVsLm9uKCJ3aGVlbCBtb3VzZXdoZWVsIERvbU1vdXNlU2Nyb2xsIE1vek1vdXNlUGl4ZWxTY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2UuYXNzaWduTWFzdGVyU2Nyb2xsZXIodCl9fSh0aGlzKSksdC5vbigic2Nyb2xsU3RhcnQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCFlLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLmFzc2lnbk1hc3RlclNjcm9sbGVyKHQpfX0odGhpcykpLm9uKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByLG8scyxpLG47aWYodD09PWUubWFzdGVyU2Nyb2xsZXIpe2ZvcihpPWUuc2Nyb2xsZXJzLG49W10scj0wLG89aS5sZW5ndGg7cjxvO3IrKylpZihzPWlbcl0scyE9PXQpc3dpdGNoKGUuYXhpcyl7Y2FzZSJob3Jpem9udGFsIjpuLnB1c2gocy5zZXROYXRpdmVTY3JvbGxMZWZ0KHQuZ2V0TmF0aXZlU2Nyb2xsTGVmdCgpKSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbCI6bi5wdXNoKHMuc2V0U2Nyb2xsVG9wKHQuZ2V0U2Nyb2xsVG9wKCkpKTticmVhaztkZWZhdWx0Om4ucHVzaCh2b2lkIDApfWVsc2Ugbi5wdXNoKHZvaWQgMCk7cmV0dXJuIG59fX0odGhpcykpLm9uKCJzY3JvbGxFbmQiLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2lmKHQ9PT1lLm1hc3RlclNjcm9sbGVyKXJldHVybiBlLnVuYXNzaWduTWFzdGVyU2Nyb2xsZXIoKX19KHRoaXMpKX0sdC5wcm90b3R5cGUuYXNzaWduTWFzdGVyU2Nyb2xsZXI9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7Zm9yKHRoaXMudW5hc3NpZ25NYXN0ZXJTY3JvbGxlcigpLHRoaXMubWFzdGVyU2Nyb2xsZXI9dCxzPXRoaXMuc2Nyb2xsZXJzLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLG8hPT10JiZvLmRpc2FibGVUb3VjaFNjcm9sbCgpfSx0LnByb3RvdHlwZS51bmFzc2lnbk1hc3RlclNjcm9sbGVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5tYXN0ZXJTY3JvbGxlcil7Zm9yKG89dGhpcy5zY3JvbGxlcnMsdD0wLGU9by5sZW5ndGg7dDxlO3QrKylyPW9bdF0sci5lbmFibGVUb3VjaFNjcm9sbCgpO3RoaXMubWFzdGVyU2Nyb2xsZXI9bnVsbH19LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwO2Zvcih0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87Zm9yKHI9dGhpcy5zY3JvbGxlcnMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKWM9clt0XSxvLnB1c2goYy5nZXRTY3JvbGxiYXJXaWR0aHMoKSk7cmV0dXJuIG99LmNhbGwodGhpcyksbD11PWg9bj0wLHI9MCxzPXQubGVuZ3RoO3I8cztyKyspcD10W3JdLGw9TWF0aC5tYXgobCxwLmxlZnQpLHU9TWF0aC5tYXgodSxwLnJpZ2h0KSxoPU1hdGgubWF4KGgscC50b3ApLG49TWF0aC5tYXgobixwLmJvdHRvbSk7Zm9yKGE9dGhpcy5zY3JvbGxlcnMsZT1vPTAsaT1hLmxlbmd0aDtvPGk7ZT0rK28pYz1hW2VdLHA9dFtlXSxjLmNhbnZhcy5zZXRHdXR0ZXJzKCJob3Jpem9udGFsIj09PXRoaXMuYXhpcz97bGVmdDpsLXAubGVmdCxyaWdodDp1LXAucmlnaHR9Ont0b3A6aC1wLnRvcCxib3R0b206bi1wLmJvdHRvbX0pfSx0fSgpLFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5pc1RvdWNoPWUsdGhpcy5zY3JvbGxlcj10LHRoaXMuc3ByaXRlcz1bXSx0aGlzLmlzVG91Y2gmJih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITApLHQub24odGhpcy5pc1RvdWNoPyJzY3JvbGxFbmQiOiJzY3JvbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmhhbmRsZVNjcm9sbCgpfX0odGhpcykpfXJldHVybiBlLnByb3RvdHlwZS5zY3JvbGxlcj1udWxsLGUucHJvdG90eXBlLnNjcm9sbGJhcldpZHRocz1udWxsLGUucHJvdG90eXBlLnNwcml0ZXM9bnVsbCxlLnByb3RvdHlwZS52aWV3cG9ydFJlY3Q9bnVsbCxlLnByb3RvdHlwZS5jb250ZW50T2Zmc2V0PW51bGwsZS5wcm90b3R5cGUuaXNIRm9sbG93aW5nPSEwLGUucHJvdG90eXBlLmlzVkZvbGxvd2luZz0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsTGVmdD0hMSxlLnByb3RvdHlwZS5jb250YWluT25OYXR1cmFsUmlnaHQ9ITEsZS5wcm90b3R5cGUubWluVHJhdmVsPTAsZS5wcm90b3R5cGUuaXNUb3VjaD0hMSxlLnByb3RvdHlwZS5pc0ZvcmNlZFJlbGF0aXZlPSExLGUucHJvdG90eXBlLnNldFNwcml0ZXM9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzO2lmKHRoaXMuY2xlYXJTcHJpdGVzKCksZSBpbnN0YW5jZW9mIHQpcmV0dXJuIHRoaXMuc3ByaXRlcz1mdW5jdGlvbigpe3ZhciByLG8saTtmb3IoaT1bXSxyPTAsbz1lLmxlbmd0aDtyPG87cisrKXM9ZVtyXSxpLnB1c2gobmV3IFAodChzKSx0aGlzKSk7cmV0dXJuIGl9LmNhbGwodGhpcyk7Zm9yKHI9MCxvPWUubGVuZ3RoO3I8bztyKyspcz1lW3JdLHMuZm9sbG93ZXI9dGhpcztyZXR1cm4gdGhpcy5zcHJpdGVzPWV9LGUucHJvdG90eXBlLmNsZWFyU3ByaXRlcz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLmNsZWFyKCk7cmV0dXJuIHRoaXMuc3ByaXRlcz1bXX0sZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlVmlld3BvcnQoKSx0aGlzLnVwZGF0ZVBvc2l0aW9ucygpfSxlLnByb3RvdHlwZS5jYWNoZURpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztmb3IodGhpcy51cGRhdGVWaWV3cG9ydCgpLHRoaXMuc2Nyb2xsYmFyV2lkdGhzPXRoaXMuc2Nyb2xsZXIuZ2V0U2Nyb2xsYmFyV2lkdGhzKCksdGhpcy5jb250ZW50T2Zmc2V0PXRoaXMuc2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLHI9dGhpcy5zcHJpdGVzLHQ9MCxlPXIubGVuZ3RoO3Q8ZTt0Kyspbz1yW3RdLG8uY2FjaGVEaW1lbnNpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVZpZXdwb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxyO3JldHVybiBlPXRoaXMuc2Nyb2xsZXIsdD1lLmdldFNjcm9sbEZyb21MZWZ0KCkscj1lLmdldFNjcm9sbFRvcCgpLHRoaXMudmlld3BvcnRSZWN0PXtsZWZ0OnQscmlnaHQ6dCtlLmdldENsaWVudFdpZHRoKCksdG9wOnIsYm90dG9tOnIrZS5nZXRDbGllbnRIZWlnaHQoKX19LGUucHJvdG90eXBlLmZvcmNlUmVsYXRpdmU9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2lmKCF0aGlzLmlzRm9yY2VkUmVsYXRpdmUpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITAscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmRvQWJzb2x1dGU/by5wdXNoKHMuYXNzaWduUG9zaXRpb24oKSk6by5wdXNoKHZvaWQgMCk7cmV0dXJuIG99fSxlLnByb3RvdHlwZS5jbGVhckZvcmNlPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZih0aGlzLmlzRm9yY2VkUmVsYXRpdmUmJiF0aGlzLmlzVG91Y2gpe2Zvcih0aGlzLmlzRm9yY2VkUmVsYXRpdmU9ITEscj10aGlzLnNwcml0ZXMsbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5hc3NpZ25Qb3NpdGlvbigpKTtyZXR1cm4gb319LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlRGltZW5zaW9ucygpLHRoaXMudXBkYXRlUG9zaXRpb25zKCl9LGUucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2ZvcihyPXRoaXMuc3ByaXRlcyx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKW89clt0XSxvLnVwZGF0ZVBvc2l0aW9uKCl9LGUucHJvdG90eXBlLmdldENvbnRlbnRSZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBodCh0LHRoaXMuY29udGVudE9mZnNldCl9LGUucHJvdG90eXBlLmdldEJvdW5kaW5nUmVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXQodCx0aGlzLmNvbnRlbnRPZmZzZXQpfSxlfSgpLFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5lbD10LHRoaXMuZm9sbG93ZXI9bnVsbCE9ZT9lOm51bGwsdGhpcy5pc0Jsb2NrPSJibG9jayI9PT10aGlzLmVsLmNzcygiZGlzcGxheSIpLHRoaXMuZWwuY3NzKCJwb3NpdGlvbiIsInJlbGF0aXZlIil9cmV0dXJuIHQucHJvdG90eXBlLmZvbGxvd2VyPW51bGwsdC5wcm90b3R5cGUuZWw9bnVsbCx0LnByb3RvdHlwZS5hYnNvbHV0ZUVsPW51bGwsdC5wcm90b3R5cGUubmF0dXJhbFJlY3Q9bnVsbCx0LnByb3RvdHlwZS5wYXJlbnRSZWN0PW51bGwsdC5wcm90b3R5cGUuY29udGFpbmVyUmVjdD1udWxsLHQucHJvdG90eXBlLmlzRW5hYmxlZD0hMCx0LnByb3RvdHlwZS5pc0hGb2xsb3dpbmc9ITEsdC5wcm90b3R5cGUuaXNWRm9sbG93aW5nPSExLHQucHJvdG90eXBlLmRvQWJzb2x1dGU9ITEsdC5wcm90b3R5cGUuaXNBYnNvbHV0ZT0hMSx0LnByb3RvdHlwZS5pc0NlbnRlcmVkPSExLHQucHJvdG90eXBlLnJlY3Q9bnVsbCx0LnByb3RvdHlwZS5pc0Jsb2NrPSExLHQucHJvdG90eXBlLm5hdHVyYWxXaWR0aD1udWxsLHQucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZClyZXR1cm4gdGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5yZXNldFBvc2l0aW9uKCksdGhpcy51bmFic29sdXRpemUoKX0sdC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLmlzRW5hYmxlZD0hMCx0aGlzLmFzc2lnblBvc2l0aW9uKCl9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZSgpLHRoaXMuZm9sbG93ZXI9bnVsbCx0aGlzLmFic29sdXRlRWw9bnVsbH0sdC5wcm90b3R5cGUuY2FjaGVEaW1lbnNpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtyZXR1cm4gbz0hMSxzPSExLHI9ITEsdGhpcy5uYXR1cmFsV2lkdGg9dGhpcy5lbC53aWR0aCgpLHRoaXMucmVzZXRQb3NpdGlvbigpLGU9dGhpcy5mb2xsb3dlcixuPXRoaXMubmF0dXJhbFJlY3Q9ZS5nZXRCb3VuZGluZ1JlY3QodGhpcy5lbCksbD10aGlzLmVsLnBhcmVudCgpLHRoaXMucGFyZW50UmVjdD1lLmdldEJvdW5kaW5nUmVjdChsKSx0PXRoaXMuY29udGFpbmVyUmVjdD1idChlLmdldENvbnRlbnRSZWN0KGwpLG4pLGk9ZS5taW5UcmF2ZWwsZS5jb250YWluT25OYXR1cmFsTGVmdCYmKHQubGVmdD1uLmxlZnQpLGUuY29udGFpbk9uTmF0dXJhbFJpZ2h0JiYodC5yaWdodD1uLnJpZ2h0KSxlLmlzSEZvbGxvd2luZyYmZHQodCktZHQobik+PWkmJihyPSJjZW50ZXIiPT09dGhpcy5lbC5jc3MoInRleHQtYWxpZ24iKSxvPSEwKSxlLmlzVkZvbGxvd2luZyYmcHQodCktcHQobik+PWkmJihzPSEwKSx0aGlzLmlzSEZvbGxvd2luZz1vLHRoaXMuaXNWRm9sbG93aW5nPXMsdGhpcy5pc0NlbnRlcmVkPXJ9LHQucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvc2l0aW9uKCksdGhpcy5hc3NpZ25Qb3NpdGlvbigpfSx0LnByb3RvdHlwZS5yZXNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwuY3NzKHt0b3A6IiIsbGVmdDoiIn0pfSx0LnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsO3JldHVybiBuPXRoaXMuZm9sbG93ZXIudmlld3BvcnRSZWN0LHI9dGhpcy5wYXJlbnRSZWN0LHQ9dGhpcy5jb250YWluZXJSZWN0LGw9d3QobixyKSxvPW51bGwsZT0hMSxsJiYobz1ldCh0aGlzLm5hdHVyYWxSZWN0KSxpPXd0KG8sciksKHRoaXMuaXNDZW50ZXJlZCYmIXp0KG4scil8fGkmJiF6dChuLGkpKSYmKGU9ITAsdGhpcy5pc0hGb2xsb3dpbmcmJih0aGlzLmlzQ2VudGVyZWQ/KHM9ZHQobyksby5sZWZ0PShsLmxlZnQrbC5yaWdodCkvMi1zLzIsby5yaWdodD1vLmxlZnQrcyk6Z3QobyxuKXx8KGU9ITEpLGd0KG8sdCkmJihlPSExKSksdGhpcy5pc1ZGb2xsb3dpbmcmJihBdChvLG4pfHwoZT0hMSksQXQobyx0KSYmKGU9ITEpKSx6dChuLG8pfHwoZT0hMSkpKSx0aGlzLnJlY3Q9byx0aGlzLmRvQWJzb2x1dGU9ZX0sdC5wcm90b3R5cGUuYXNzaWduUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlO2lmKHRoaXMuaXNFbmFibGVkKXJldHVybiB0aGlzLnJlY3Q/dGhpcy5kb0Fic29sdXRlJiYhdGhpcy5mb2xsb3dlci5pc0ZvcmNlZFJlbGF0aXZlPyh0aGlzLmFic29sdXRpemUoKSx0aGlzLmFic29sdXRlRWwuY3NzKHt0b3A6dGhpcy5yZWN0LnRvcC10aGlzLmZvbGxvd2VyLnZpZXdwb3J0UmVjdC50b3ArdGhpcy5mb2xsb3dlci5zY3JvbGxiYXJXaWR0aHMudG9wLGxlZnQ6dGhpcy5yZWN0LmxlZnQtdGhpcy5mb2xsb3dlci52aWV3cG9ydFJlY3QubGVmdCt0aGlzLmZvbGxvd2VyLnNjcm9sbGJhcldpZHRocy5sZWZ0LHdpZHRoOnRoaXMuaXNCbG9jaz90aGlzLm5hdHVyYWxXaWR0aDoiIn0pKTooZT10aGlzLnJlY3QudG9wLXRoaXMubmF0dXJhbFJlY3QudG9wLHQ9dGhpcy5yZWN0LmxlZnQtdGhpcy5uYXR1cmFsUmVjdC5sZWZ0LHRoaXMudW5hYnNvbHV0aXplKCksdGhpcy5lbC50b2dnbGVDbGFzcygiZmMtZm9sbG93aW5nIixCb29sZWFuKGV8fHQpKS5jc3Moe3RvcDplLGxlZnQ6dH0pKTp0aGlzLnVuYWJzb2x1dGl6ZSgpfSx0LnByb3RvdHlwZS5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNBYnNvbHV0ZSlyZXR1cm4gdGhpcy5hYnNvbHV0ZUVsfHwodGhpcy5hYnNvbHV0ZUVsPXRoaXMuYnVpbGRBYnNvbHV0ZUVsKCkpLHRoaXMuYWJzb2x1dGVFbC5hcHBlbmRUbyh0aGlzLmZvbGxvd2VyLnNjcm9sbGVyLmVsKSx0aGlzLmVsLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLHRoaXMuaXNBYnNvbHV0ZT0hMH0sdC5wcm90b3R5cGUudW5hYnNvbHV0aXplPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0Fic29sdXRlKXJldHVybiB0aGlzLmFic29sdXRlRWwuZGV0YWNoKCksdGhpcy5lbC5jc3MoInZpc2liaWxpdHkiLCIiKSx0aGlzLmlzQWJzb2x1dGU9ITF9LHQucHJvdG90eXBlLmJ1aWxkQWJzb2x1dGVFbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVsLmNsb25lKCkuYWRkQ2xhc3MoImZjLWZvbGxvd2luZyIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIiwiei1pbmRleCI6MWUzLCJmb250LXdlaWdodCI6dGhpcy5lbC5jc3MoImZvbnQtd2VpZ2h0IiksImZvbnQtc2l6ZSI6dGhpcy5lbC5jc3MoImZvbnQtc2l6ZSIpLCJmb250LWZhbWlseSI6dGhpcy5lbC5jc3MoImZvbnQtZmFtaWx5IiksY29sb3I6dGhpcy5lbC5jc3MoImNvbG9yIiksInBhZGRpbmctdG9wIjp0aGlzLmVsLmNzcygicGFkZGluZy10b3AiKSwicGFkZGluZy1ib3R0b20iOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWJvdHRvbSIpLCJwYWRkaW5nLWxlZnQiOnRoaXMuZWwuY3NzKCJwYWRkaW5nLWxlZnQiKSwicGFkZGluZy1yaWdodCI6dGhpcy5lbC5jc3MoInBhZGRpbmctcmlnaHQiKSwicG9pbnRlci1ldmVudHMiOiJub25lIn0pfSx0fSgpLGV0PWZ1bmN0aW9uKHQpe3JldHVybntsZWZ0OnQubGVmdCxyaWdodDp0LnJpZ2h0LHRvcDp0LnRvcCxib3R0b206dC5ib3R0b219fSxkdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodC10LmxlZnR9LHB0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmJvdHRvbS10LnRvcH0senQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3QodCxlKSYmVnQodCxlKX0sa3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5sZWZ0Pj10LmxlZnQmJmUucmlnaHQ8PXQucmlnaHR9LFZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9wPj10LnRvcCYmZS5ib3R0b208PXQuYm90dG9tfSxndD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmxlZnQ8ZS5sZWZ0Pyh0LnJpZ2h0PWUubGVmdCtkdCh0KSx0LmxlZnQ9ZS5sZWZ0LCEwKTp0LnJpZ2h0PmUucmlnaHQmJih0LmxlZnQ9ZS5yaWdodC1kdCh0KSx0LnJpZ2h0PWUucmlnaHQsITApfSxBdD1mdW5jdGlvbih0LGUpe3JldHVybiB0LnRvcDxlLnRvcD8odC5ib3R0b209ZS50b3ArcHQodCksdC50b3A9ZS50b3AsITApOnQuYm90dG9tPmUuYm90dG9tJiYodC50b3A9ZS5ib3R0b20tcHQodCksdC5ib3R0b209ZS5ib3R0b20sITApfSxidD1mdW5jdGlvbih0LGUpe3JldHVybntsZWZ0Ok1hdGgubWluKHQubGVmdCxlLmxlZnQpLHJpZ2h0Ok1hdGgubWF4KHQucmlnaHQsZS5yaWdodCksdG9wOk1hdGgubWluKHQudG9wLGUudG9wKSxib3R0b206TWF0aC5tYXgodC5ib3R0b20sZS5ib3R0b20pfX0scz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZU1hbmFnZXI9bnVsbCxyLnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzb3VyY2VNYW5hZ2VyPW5ldyBEKHRoaXMpfSxyLnByb3RvdHlwZS5pbnN0YW50aWF0ZVZpZXc9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gZT10aGlzLmdldFZpZXdTcGVjKHQpLHI9ZVsiY2xhc3MiXSx0aGlzLm9wdGlvbnMucmVzb3VyY2VzJiZlLm9wdGlvbnMucmVzb3VyY2VzIT09ITEmJihlLnF1ZXJ5UmVzb3VyY2VDbGFzcz9yPWUucXVlcnlSZXNvdXJjZUNsYXNzKGUpfHxyOmUucmVzb3VyY2VDbGFzcyYmKHI9ZS5yZXNvdXJjZUNsYXNzKSksbmV3IHIodGhpcyx0LGUub3B0aW9ucyxlLmR1cmF0aW9uKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCxlKXt2YXIgcjtudWxsPT1lJiYoZT0hMSkscj10aGlzLnJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZSh0KSxlJiZ0aGlzLnZpZXcuc2Nyb2xsVG9SZXNvdXJjZSYmci5kb25lKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC52aWV3LnNjcm9sbFRvUmVzb3VyY2UoZSl9fSh0aGlzKSl9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlTWFuYWdlci5yZW1vdmVSZXNvdXJjZSh0KX0sci5wcm90b3R5cGUucmVmZXRjaFJlc291cmNlcz1mdW5jdGlvbigpe3RoaXMucmVzb3VyY2VNYW5hZ2VyLmZldGNoUmVzb3VyY2VzKCl9LHIucHJvdG90eXBlLnJlcmVuZGVyUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dGhpcy5yZXNvdXJjZU1hbmFnZXIucmVzZXRSZXNvdXJjZXMoKX0sci5wcm90b3R5cGUuaXNTcGFuQWxsb3dlZD1mdW5jdGlvbih0LGUpe3ZhciBvLHM7cmV0dXJuISgib2JqZWN0Ij09dHlwZW9mIGUmJihvPXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhlKSxvLmxlbmd0aCYmISh0LnJlc291cmNlSWQmJihzPXQucmVzb3VyY2VJZCxOdC5jYWxsKG8scyk+PTApKSkpJiZyLl9fc3VwZXJfXy5pc1NwYW5BbGxvd2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sci5wcm90b3R5cGUuZ2V0UGVlckV2ZW50cz1mdW5jdGlvbih0LGUpe3ZhciBvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKGY9ci5fX3N1cGVyX18uZ2V0UGVlckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cykscD10LnJlc291cmNlSWQ/W3QucmVzb3VyY2VJZF06ZT90aGlzLmdldEV2ZW50UmVzb3VyY2VJZHMoZSk6W10sbz1bXSxpPTAsdT1mLmxlbmd0aDtpPHU7aSsrKXtpZihkPWZbaV0scz0hMSx5PXRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyhkKSx5Lmxlbmd0aCYmcC5sZW5ndGgpe2ZvcihuPTAsaD15Lmxlbmd0aDtuPGg7bisrKWZvcihnPXlbbl0sbD0wLGE9cC5sZW5ndGg7bDxhO2wrKylpZihjPXBbbF0sYz09PWcpe3M9ITA7YnJlYWt9fWVsc2Ugcz0hMDtzJiZvLnB1c2goZCl9cmV0dXJuIG99LHIucHJvdG90eXBlLnNwYW5Db250YWluc1NwYW49ZnVuY3Rpb24odCxlKXtyZXR1cm4oIXQucmVzb3VyY2VJZHx8dC5yZXNvdXJjZUlkPT09ZS5yZXNvdXJjZUlkKSYmci5fX3N1cGVyX18uc3BhbkNvbnRhaW5zU3Bhbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmdldEN1cnJlbnRCdXNpbmVzc0hvdXJFdmVudHM9ZnVuY3Rpb24odCl7dmFyIGUsbyxzLGksbixsLHUsaCxhLGMscCxkO2ZvcihuPXRoaXMucmVzb3VyY2VNYW5hZ2VyLmdldEZsYXRSZXNvdXJjZXMoKSxvPSExLGw9MCxhPW4ubGVuZ3RoO2w8YTtsKyspZD1uW2xdLGQuYnVzaW5lc3NIb3VycyYmKG89ITApO2lmKG8pe2ZvcihlPVtdLHU9MCxjPW4ubGVuZ3RoO3U8Yzt1KyspZm9yKGQ9blt1XSxpPXRoaXMuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyh0LGQuYnVzaW5lc3NIb3Vyc3x8dGhpcy5vcHRpb25zLmJ1c2luZXNzSG91cnMpLGg9MCxwPWkubGVuZ3RoO2g8cDtoKyspcz1pW2hdLHMucmVzb3VyY2VJZD1kLmlkLGUucHVzaChzKTtyZXR1cm4gZX1yZXR1cm4gci5fX3N1cGVyX18uZ2V0Q3VycmVudEJ1c2luZXNzSG91ckV2ZW50cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmJ1aWxkU2VsZWN0U3Bhbj1mdW5jdGlvbih0LGUsbyl7dmFyIHM7cmV0dXJuIHM9ci5fX3N1cGVyX18uYnVpbGRTZWxlY3RTcGFuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvJiYocy5yZXNvdXJjZUlkPW8pLHN9LHIucHJvdG90eXBlLmdldFJlc291cmNlQnlJZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VCeUlkKHQpfSxyLnByb3RvdHlwZS5ub3JtYWxpemVFdmVudD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18ubm9ybWFsaXplRXZlbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLG51bGw9PXQucmVzb3VyY2VJZCYmKHQucmVzb3VyY2VJZD1udWxsKSxudWxsIT10LnJlc291cmNlSWRzP3QucmVzb3VyY2VJZHM6dC5yZXNvdXJjZUlkcz1udWxsfSxyLnByb3RvdHlwZS5nZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRSZXNvdXJjZUlkcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUlkcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1O2lmKHU9U3RyaW5nKG51bGwhPShpPW51bGwhPShuPXRbdGhpcy5nZXRFdmVudFJlc291cmNlRmllbGQoKV0pP246dC5yZXNvdXJjZUlkKT9pOiIiKSlyZXR1cm5bdV07aWYodC5yZXNvdXJjZUlkcyl7Zm9yKHM9W10sbD10LnJlc291cmNlSWRzLGU9MCxyPWwubGVuZ3RoO2U8cjtlKyspdT1sW2VdLG89U3RyaW5nKG51bGwhPXU/dToiIiksbyYmcy5wdXNoKG8pO3JldHVybiBzfXJldHVybltdfSxyLnByb3RvdHlwZS5zZXRFdmVudFJlc291cmNlSWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFt0aGlzLmdldEV2ZW50UmVzb3VyY2VGaWVsZCgpXT1TdHJpbmcobnVsbCE9ZT9lOiIiKX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZUZpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5ldmVudFJlc291cmNlRmllbGR8fCJyZXNvdXJjZUlkIn0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9Im9iamVjdCI9PXR5cGVvZiBlP2U6dGhpcy5nZXRSZXNvdXJjZUJ5SWQoZSkscj90aGlzLmNsaWVudEV2ZW50cyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIHQuaW5BcnJheShyLmlkLGUuZ2V0RXZlbnRSZXNvdXJjZUlkcyhvKSkhPT0tMX19KHRoaXMpKTpbXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRFdmVudFJlc291cmNlcyh0KVswXX0sci5wcm90b3R5cGUuZ2V0RXZlbnRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGw7aWYoZT0ib2JqZWN0Ij09dHlwZW9mIHQ/dDp0aGlzLmNsaWVudEV2ZW50cyh0KVswXSxsPVtdLGUpZm9yKHM9dGhpcy5nZXRFdmVudFJlc291cmNlSWRzKGUpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspbj1zW3JdLGk9dGhpcy5nZXRSZXNvdXJjZUJ5SWQobiksaSYmbC5wdXNoKGkpO3JldHVybiBsfSxyfShvKSxvLnByb3RvdHlwZT1zLnByb3RvdHlwZSxIdD1YLnByb3RvdHlwZS5kaXNwbGF5Vmlldyx4dD1YLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbixCdD1YLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uLEV0PVgucHJvdG90eXBlLmRpc3BsYXlFdmVudHMsWC5wcm90b3R5cGUuaXNSZXNvdXJjZXNCb3VuZD0hMSxYLnByb3RvdHlwZS5zZXR0aW5nUmVzb3VyY2VzPW51bGwsWC5wcm90b3R5cGUuZGlzcGxheVZpZXc9ZnVuY3Rpb24oKXtyZXR1cm4gSHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEd0KHRoaXMuY2FsZW5kYXIub3B0aW9ucy5zY2hlZHVsZXJMaWNlbnNlS2V5LHRoaXMuZWwpLHRoaXMuYmluZFJlc291cmNlcygpLHRoaXMud2hlblJlc291cmNlcygpfSxYLnByb3RvdHlwZS51bnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIEJ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnVuYmluZFJlc291cmNlcyghMCl9LFgucHJvdG90eXBlLmRpc3BsYXlFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud2hlblJlc291cmNlcyhmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRXQuY2FsbChlLHQpfX0odGhpcykpfSxYLnByb3RvdHlwZS5iaW5kUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIXRoaXMuaXNSZXNvdXJjZXNCb3VuZClyZXR1cm4gdGhpcy5pc1Jlc291cmNlc0JvdW5kPSEwLHRoaXMuc2V0dGluZ1Jlc291cmNlcz10LkRlZmVycmVkKCksZT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0UmVzb3VyY2VzKGUpLHQuc2V0dGluZ1Jlc291cmNlcy5yZXNvbHZlKCl9fSh0aGlzKSx0aGlzLmxpc3RlblRvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLHtzZXQ6ZSx1bnNldDp0aGlzLnVuc2V0UmVzb3VyY2VzLHJlc2V0OnRoaXMucmVzZXRSZXNvdXJjZXMsYWRkOnRoaXMuYWRkUmVzb3VyY2UscmVtb3ZlOnRoaXMucmVtb3ZlUmVzb3VyY2V9KSx0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci5oYXNGZXRjaGVkKCk/ZSh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyk6dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIuZ2V0UmVzb3VyY2VzKCl9LFgucHJvdG90eXBlLnVuYmluZFJlc291cmNlcz1mdW5jdGlvbih0KXtpZih0aGlzLmlzUmVzb3VyY2VzQm91bmQpcmV0dXJuIHRoaXMuc3RvcExpc3RlbmluZ1RvKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyKSwicmVzb2x2ZWQiPT09dGhpcy5zZXR0aW5nUmVzb3VyY2VzLnN0YXRlKCkmJnRoaXMudW5zZXRSZXNvdXJjZXModCksdGhpcy5zZXR0aW5nUmVzb3VyY2VzPW51bGwsdGhpcy5pc1Jlc291cmNlc0JvdW5kPSExfSxYLnByb3RvdHlwZS53aGVuUmVzb3VyY2VzPWZ1bmN0aW9uKHQpe3JldHVybiBMdCh0aGlzLnNldHRpbmdSZXNvdXJjZXMsdCl9LFgucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXt9LFgucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7fSxYLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWxlbmRhci5yZXJlbmRlckV2ZW50cygpfSxYLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNldFJlc291cmNlcyh0aGlzLmNhbGVuZGFyLnJlc291cmNlTWFuYWdlci50b3BMZXZlbFJlc291cmNlcyl9LFgucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc2V0UmVzb3VyY2VzKHRoaXMuY2FsZW5kYXIucmVzb3VyY2VNYW5hZ2VyLnRvcExldmVsUmVzb3VyY2VzKX0sVHQ9Zi5wcm90b3R5cGUuZ2V0U2VnQ3VzdG9tQ2xhc3NlcyxfdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0QmFja2dyb3VuZENvbG9yLEl0PWYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRCb3JkZXJDb2xvcixEdD1mLnByb3RvdHlwZS5nZXRTZWdEZWZhdWx0VGV4dENvbG9yLGYucHJvdG90eXBlLmdldFNlZ0N1c3RvbUNsYXNzZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3IoZT1UdC5hcHBseSh0aGlzLGFyZ3VtZW50cykscz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWk9c1tyXSxlPWUuY29uY2F0KGkuZXZlbnRDbGFzc05hbWV8fFtdKTtyZXR1cm4gZX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuZ2V0U2VnUmVzb3VyY2VzKHQpLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZm9yKGU9c1tyXTtlOyl7aWYoaT1lLmV2ZW50QmFja2dyb3VuZENvbG9yfHxlLmV2ZW50Q29sb3IpcmV0dXJuIGk7ZT1lLl9wYXJlbnR9cmV0dXJuIF90LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZi5wcm90b3R5cGUuZ2V0U2VnRGVmYXVsdEJvcmRlckNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7Zm9yKHM9dGhpcy5nZXRTZWdSZXNvdXJjZXModCkscj0wLG89cy5sZW5ndGg7cjxvO3IrKylmb3IoZT1zW3JdO2U7KXtpZihpPWUuZXZlbnRCb3JkZXJDb2xvcnx8ZS5ldmVudENvbG9yKXJldHVybiBpO2U9ZS5fcGFyZW50fXJldHVybiBJdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGYucHJvdG90eXBlLmdldFNlZ0RlZmF1bHRUZXh0Q29sb3I9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtmb3Iocz10aGlzLmdldFNlZ1Jlc291cmNlcyh0KSxyPTAsbz1zLmxlbmd0aDtyPG87cisrKWZvcihlPXNbcl07ZTspe2lmKGk9ZS5ldmVudFRleHRDb2xvcilyZXR1cm4gaTtlPWUuX3BhcmVudH1yZXR1cm4gRHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmLnByb3RvdHlwZS5nZXRTZWdSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzb3VyY2U/W3QucmVzb3VyY2VdOnRoaXMudmlldy5jYWxlbmRhci5nZXRFdmVudFJlc291cmNlcyh0LmV2ZW50KX0sRD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe3RoaXMuY2FsZW5kYXI9dCx0aGlzLmluaXRpYWxpemVDYWNoZSgpfXJldHVybiBPdChyLGUpLHIubWl4aW4oYSksci5yZXNvdXJjZUd1aWQ9MSxyLmFqYXhEZWZhdWx0cz17ZGF0YVR5cGU6Impzb24iLGNhY2hlOiExfSxyLnByb3RvdHlwZS5jYWxlbmRhcj1udWxsLHIucHJvdG90eXBlLnRvcExldmVsUmVzb3VyY2VzPW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VzQnlJZD1udWxsLHIucHJvdG90eXBlLmZldGNoaW5nPW51bGwsci5wcm90b3R5cGUuaGFzRmV0Y2hlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZldGNoaW5nJiYicmVzb2x2ZWQiPT09dGhpcy5mZXRjaGluZy5zdGF0ZSgpfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5mZXRjaGluZz90LkRlZmVycmVkKCkucmVzb2x2ZSh0aGlzLnRvcExldmVsUmVzb3VyY2VzKS5wcm9taXNlKCk6KGU9dC5EZWZlcnJlZCgpLEx0KHRoaXMuZmV0Y2hSZXNvdXJjZXMoKSxmdW5jdGlvbigpe3JldHVybiBlLnJlc29sdmUodGhpcy50b3BMZXZlbFJlc291cmNlcyl9LGZ1bmN0aW9uKCl7cmV0dXJuIGUucmVzb2x2ZShbXSl9KSxlLnByb21pc2UoKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5mZXRjaGluZyxMdChlLGZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByLmZldGNoaW5nPXQuRGVmZXJyZWQoKSxyLmZldGNoUmVzb3VyY2VJbnB1dHMoZnVuY3Rpb24odCl7cmV0dXJuIHIuc2V0UmVzb3VyY2VzKHQsQm9vbGVhbihlKSksci5mZXRjaGluZy5yZXNvbHZlKHIudG9wTGV2ZWxSZXNvdXJjZXMpfSksci5mZXRjaGluZy5wcm9taXNlKCl9fSh0aGlzKSl9LHIucHJvdG90eXBlLmZldGNoUmVzb3VyY2VJbnB1dHM9ZnVuY3Rpb24oZSl7dmFyIG87c3dpdGNoKG89dGhpcy5jYWxlbmRhci5vcHRpb25zLnJlc291cmNlcywic3RyaW5nIj09PXQudHlwZShvKSYmKG89e3VybDpvfSksdC50eXBlKG8pKXtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLG8oZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGVuZGFyLnBvcExvYWRpbmcoKSxlKHIpfX0odGhpcykpO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5jYWxlbmRhci5wdXNoTG9hZGluZygpLHQuYWpheCh0LmV4dGVuZCh7fSxyLmFqYXhEZWZhdWx0cyxvKSkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsZW5kYXIucG9wTG9hZGluZygpLGUocil9fSh0aGlzKSk7Y2FzZSJhcnJheSI6cmV0dXJuIGUobyk7ZGVmYXVsdDpyZXR1cm4gZShbXSl9fSxyLnByb3RvdHlwZS5yZXNldFJlc291cmNlcz1mdW5jdGlvbigpe3JldHVybiBMdCh0aGlzLmdldFJlc291cmNlcygpLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnRyaWdnZXIoInJlc2V0Iix0LnRvcExldmVsUmVzb3VyY2VzKX19KHRoaXMpKX0sci5wcm90b3R5cGUuZ2V0UmVzb3VyY2VCeUlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlc291cmNlc0J5SWRbdF19LHIucHJvdG90eXBlLmdldEZsYXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgdCxlO2U9W107Zm9yKHQgaW4gdGhpcy5yZXNvdXJjZXNCeUlkKWUucHVzaCh0aGlzLnJlc291cmNlc0J5SWRbdF0pO3JldHVybiBlfSxyLnByb3RvdHlwZS5pbml0aWFsaXplQ2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3BMZXZlbFJlc291cmNlcz1bXSx0aGlzLnJlc291cmNlc0J5SWQ9e319LHIucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtmb3IodGhpcy5pbml0aWFsaXplQ2FjaGUoKSxuPWZ1bmN0aW9uKCl7dmFyIGUscixvO2ZvcihvPVtdLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspaT10W2VdLG8ucHVzaCh0aGlzLmJ1aWxkUmVzb3VyY2UoaSkpO3JldHVybiBvfS5jYWxsKHRoaXMpLGw9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7Zm9yKHI9W10sdD0wLGU9bi5sZW5ndGg7dDxlO3QrKylzPW5bdF0sdGhpcy5hZGRSZXNvdXJjZVRvSW5kZXgocykmJnIucHVzaChzKTtyZXR1cm4gcn0uY2FsbCh0aGlzKSxyPTAsbz1sLmxlbmd0aDtyPG87cisrKXM9bFtyXSx0aGlzLmFkZFJlc291cmNlVG9UcmVlKHMpO3JldHVybiBlP3RoaXMudHJpZ2dlcigicmVzZXQiLHRoaXMudG9wTGV2ZWxSZXNvdXJjZXMpOnRoaXMudHJpZ2dlcigic2V0Iix0aGlzLnRvcExldmVsUmVzb3VyY2VzKSx0aGlzLmNhbGVuZGFyLnRyaWdnZXIoInJlc291cmNlc1NldCIsbnVsbCx0aGlzLnRvcExldmVsUmVzb3VyY2VzKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEx0KHRoaXMuZmV0Y2hpbmcsZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI7cmV0dXJuIHI9ZS5idWlsZFJlc291cmNlKHQpLCEhZS5hZGRSZXNvdXJjZVRvSW5kZXgocikmJihlLmFkZFJlc291cmNlVG9UcmVlKHIpLGUudHJpZ2dlcigiYWRkIixyKSxyKX19KHRoaXMpKX0sci5wcm90b3R5cGUuYWRkUmVzb3VyY2VUb0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2lmKHRoaXMucmVzb3VyY2VzQnlJZFt0LmlkXSlyZXR1cm4hMTtmb3IodGhpcy5yZXNvdXJjZXNCeUlkW3QuaWRdPXQscz10LmNoaWxkcmVuLHI9MCxvPXMubGVuZ3RoO3I8bztyKyspZT1zW3JdLHRoaXMuYWRkUmVzb3VyY2VUb0luZGV4KGUpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZVRvVHJlZT1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztpZighdC5wYXJlbnQpe2lmKHI9U3RyaW5nKG51bGwhPShvPXQucGFyZW50SWQpP286IiIpKXtpZihlPXRoaXMucmVzb3VyY2VzQnlJZFtyXSwhZSlyZXR1cm4hMTt0LnBhcmVudD1lLHM9ZS5jaGlsZHJlbn1lbHNlIHM9dGhpcy50b3BMZXZlbFJlc291cmNlcztzLnB1c2godCl9cmV0dXJuITB9LHIucHJvdG90eXBlLnJlbW92ZVJlc291cmNlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPSJvYmplY3QiPT10eXBlb2YgdD90LmlkOnQsTHQodGhpcy5mZXRjaGluZyxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcjtyZXR1cm4gcj10LnJlbW92ZVJlc291cmNlRnJvbUluZGV4KGUpLHImJih0LnJlbW92ZVJlc291cmNlRnJvbVRyZWUociksdC50cmlnZ2VyKCJyZW1vdmUiLHIpKSxyfX0odGhpcykpfSxyLnByb3RvdHlwZS5yZW1vdmVSZXNvdXJjZUZyb21JbmRleD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO2lmKGk9dGhpcy5yZXNvdXJjZXNCeUlkW3RdKXtmb3IoZGVsZXRlIHRoaXMucmVzb3VyY2VzQnlJZFt0XSxzPWkuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sdGhpcy5yZW1vdmVSZXNvdXJjZUZyb21JbmRleChlLmlkKTtyZXR1cm4gaX1yZXR1cm4hMX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2VGcm9tVHJlZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpO2ZvcihudWxsPT1lJiYoZT10aGlzLnRvcExldmVsUmVzb3VyY2VzKSxyPW89MCxzPWUubGVuZ3RoO288cztyPSsrbyl7aWYoaT1lW3JdLGk9PT10KXJldHVybiB0LnBhcmVudD1udWxsLGUuc3BsaWNlKHIsMSksITA7aWYodGhpcy5yZW1vdmVSZXNvdXJjZUZyb21UcmVlKHQsaS5jaGlsZHJlbikpcmV0dXJuITB9cmV0dXJuITF9LHIucHJvdG90eXBlLmJ1aWxkUmVzb3VyY2U9ZnVuY3Rpb24oZSl7dmFyIG8scyxpLG4sbDtyZXR1cm4gbD10LmV4dGVuZCh7fSxlKSxsLmlkPVN0cmluZyhudWxsIT0obj1lLmlkKT9uOiJfZmMiK3IucmVzb3VyY2VHdWlkKyspLGk9ZS5ldmVudENsYXNzTmFtZSxsLmV2ZW50Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7c3dpdGNoKHQudHlwZShpKSl7Y2FzZSJzdHJpbmciOnJldHVybiBpLnNwbGl0KC9ccysvKTtjYXNlImFycmF5IjpyZXR1cm4gaTtkZWZhdWx0OnJldHVybltdfX0oKSxsLmNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIHQscixpLG4sdTtmb3Iobj1udWxsIT0oaT1lLmNoaWxkcmVuKT9pOltdLHU9W10sdD0wLHI9bi5sZW5ndGg7dDxyO3QrKylzPW5bdF0sbz10aGlzLmJ1aWxkUmVzb3VyY2Uocyksby5wYXJlbnQ9bCx1LnB1c2gobyk7cmV0dXJuIHV9LmNhbGwodGhpcyksbH0scn0oaSksVz17cmVzb3VyY2VUZXh0RnVuYzpudWxsLHVuc2V0UmVzb3VyY2VzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKX0scmVzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5xdWVyeVNjcm9sbCgpLHRoaXMudW5zZXRSZXNvdXJjZXMoKSx0aGlzLnNldFJlc291cmNlcyh0KSx0aGlzLnNldFNjcm9sbChlKSx0aGlzLmNhbGVuZGFyLnJlcmVuZGVyRXZlbnRzKCl9LGlzRXZlbnREcmFnZ2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNFdmVudFJlc291cmNlRWRpdGFibGUodCl8fFgucHJvdG90eXBlLmlzRXZlbnREcmFnZ2FibGUuY2FsbCh0aGlzLHQpfSxpc0V2ZW50UmVzb3VyY2VFZGl0YWJsZTpmdW5jdGlvbih0KXt2YXIgZSxyLG87cmV0dXJuIG51bGwhPShlPW51bGwhPShyPW51bGwhPShvPXQucmVzb3VyY2VFZGl0YWJsZSk/bzoodC5zb3VyY2V8fHt9KS5yZXNvdXJjZUVkaXRhYmxlKT9yOnRoaXMub3B0KCJldmVudFJlc291cmNlRWRpdGFibGUiKSk/ZTp0aGlzLmlzRXZlbnRHZW5lcmFsbHlFZGl0YWJsZSh0KX0sZ2V0UmVzb3VyY2VUZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFJlc291cmNlVGV4dEZ1bmMoKSh0KX0sZ2V0UmVzb3VyY2VUZXh0RnVuYzpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnJlc291cmNlVGV4dEZ1bmM/dGhpcy5yZXNvdXJjZVRleHRGdW5jOih0PXRoaXMub3B0KCJyZXNvdXJjZVRleHQiKSwiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudGl0bGV8fHQuaWR9KSx0aGlzLnJlc291cmNlVGV4dEZ1bmM9dCl9LHRyaWdnZXJEYXlDbGljazpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJkYXlDbGljayIsZSx0aGlzLmNhbGVuZGFyLmFwcGx5VGltZXpvbmUodC5zdGFydCkscix0aGlzLG8uZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyU2VsZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5jYWxlbmRhci5yZXNvdXJjZU1hbmFnZXIsdGhpcy50cmlnZ2VyKCJzZWxlY3QiLG51bGwsdGhpcy5jYWxlbmRhci5hcHBseVRpbWV6b25lKHQuc3RhcnQpLHRoaXMuY2FsZW5kYXIuYXBwbHlUaW1lem9uZSh0LmVuZCksZSx0aGlzLHIuZ2V0UmVzb3VyY2VCeUlkKHQucmVzb3VyY2VJZCkpfSx0cmlnZ2VyRXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKHQsZSxyLG8scyl7aWYodGhpcy50cmlnZ2VyKCJkcm9wIixyWzBdLGUuc3RhcnQsbyxzLGUucmVzb3VyY2VJZCksdClyZXR1cm4gdGhpcy50cmlnZ2VyKCJldmVudFJlY2VpdmUiLG51bGwsdCl9LHJlcG9ydEV2ZW50RHJvcDpmdW5jdGlvbigpe3ZhciB0LGUscixvO3JldHVybiBlPWFyZ3VtZW50c1swXSx0PWFyZ3VtZW50c1sxXSxyPTM8PWFyZ3VtZW50cy5sZW5ndGg/anQuY2FsbChhcmd1bWVudHMsMik6W10sdD10aGlzLm5vcm1hbGl6ZURyb3BMb2NhdGlvbih0KSx0LnJlc291cmNlSWQmJmUucmVzb3VyY2VJZHMmJih0LnJlc291cmNlSWRzPW51bGwpLChvPVgucHJvdG90eXBlLnJlcG9ydEV2ZW50RHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0scmVwb3J0RXh0ZXJuYWxEcm9wOmZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87cmV0dXJuIGU9YXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzWzFdLHI9Mzw9YXJndW1lbnRzLmxlbmd0aD9qdC5jYWxsKGFyZ3VtZW50cywyKTpbXSx0PXRoaXMubm9ybWFsaXplRHJvcExvY2F0aW9uKHQpLChvPVgucHJvdG90eXBlLnJlcG9ydEV4dGVybmFsRHJvcCkuY2FsbC5hcHBseShvLFt0aGlzLGUsdF0uY29uY2F0KGp0LmNhbGwocikpKX0sbm9ybWFsaXplRHJvcExvY2F0aW9uOmZ1bmN0aW9uKGUpe3ZhciByO3JldHVybiByPXQuZXh0ZW5kKHt9LGUpLGRlbGV0ZSByLnJlc291cmNlSWQsdGhpcy5jYWxlbmRhci5zZXRFdmVudFJlc291cmNlSWQocixlLnJlc291cmNlSWQpLHJ9fSxJPXthbGxvd0Nyb3NzUmVzb3VyY2U6ITAsZXZlbnRSYW5nZVRvU3BhbnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsO2lmKG49dGhpcy52aWV3LmNhbGVuZGFyLmdldEV2ZW50UmVzb3VyY2VJZHMociksbi5sZW5ndGgpe2ZvcihsPVtdLG89MCxzPW4ubGVuZ3RoO288cztvKyspaT1uW29dLGwucHVzaCh0LmV4dGVuZCh7fSxlLHtyZXNvdXJjZUlkOml9KSk7cmV0dXJuIGx9cmV0dXJuIGQuaXNCZ0V2ZW50KHIpP2YucHJvdG90eXBlLmV2ZW50UmFuZ2VUb1NwYW5zLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpbXX0sZmFicmljYXRlSGVscGVyRXZlbnQ6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1mLnByb3RvdHlwZS5mYWJyaWNhdGVIZWxwZXJFdmVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy52aWV3LmNhbGVuZGFyLnNldEV2ZW50UmVzb3VyY2VJZChyLHQucmVzb3VyY2VJZCkscn0sY29tcHV0ZUV2ZW50RHJvcDpmdW5jdGlvbih0LGUscil7dmFyIG87cmV0dXJuIG89dGhpcy52aWV3LmlzRXZlbnRTdGFydEVkaXRhYmxlKHIpP2YucHJvdG90eXBlLmNvbXB1dGVFdmVudERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpOmQucGx1Y2tFdmVudERhdGVQcm9wcyhyKSxvJiYodGhpcy52aWV3LmlzRXZlbnRSZXNvdXJjZUVkaXRhYmxlKHIpP28ucmVzb3VyY2VJZD1lLnJlc291cmNlSWQ6by5yZXNvdXJjZUlkPXQucmVzb3VyY2VJZCksb30sY29tcHV0ZUV4dGVybmFsRHJvcDpmdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiByPWYucHJvdG90eXBlLmNvbXB1dGVFeHRlcm5hbERyb3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfSxjb21wdXRlRXZlbnRSZXNpemU6ZnVuY3Rpb24odCxlLHIsbyl7dmFyIHM7aWYodGhpcy5hbGxvd0Nyb3NzUmVzb3VyY2V8fGUucmVzb3VyY2VJZD09PXIucmVzb3VyY2VJZClyZXR1cm4gcz1mLnByb3RvdHlwZS5jb21wdXRlRXZlbnRSZXNpemUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihzLnJlc291cmNlSWQ9ZS5yZXNvdXJjZUlkKSxzfSxjb21wdXRlU2VsZWN0aW9uU3BhbjpmdW5jdGlvbih0LGUpe3ZhciByO2lmKHRoaXMuYWxsb3dDcm9zc1Jlc291cmNlfHx0LnJlc291cmNlSWQ9PT1lLnJlc291cmNlSWQpcmV0dXJuIHI9Zi5wcm90b3R5cGUuY29tcHV0ZVNlbGVjdGlvblNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJihyLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkKSxyfX0sXz17ZmxhdHRlbmVkUmVzb3VyY2VzOm51bGwscmVzb3VyY2VDbnQ6MCxkYXRlc0Fib3ZlUmVzb3VyY2VzOiExLGFsbG93Q3Jvc3NSZXNvdXJjZTohMSxzZXRSZXNvdXJjZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzPXRoaXMuZmxhdHRlblJlc291cmNlcyh0KSx0aGlzLnJlc291cmNlQ250PXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLmxlbmd0aCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSx1bnNldFJlc291cmNlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZsYXR0ZW5lZFJlc291cmNlcz1udWxsLHRoaXMucmVzb3VyY2VDbnQ9MCx0aGlzLnVwZGF0ZURheVRhYmxlQ29scygpfSxmbGF0dGVuUmVzb3VyY2VzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO3JldHVybiByPXRoaXMudmlldy5vcHQoInJlc291cmNlT3JkZXIiKSxyPyhlPUZ0KHIpLHM9ZnVuY3Rpb24odCxyKXtyZXR1cm4gUSh0LHIsZSl9KTpzPW51bGwsbz1bXSx0aGlzLmFjY3VtdWxhdGVSZXNvdXJjZXModCxzLG8pLG99LGFjY3VtdWxhdGVSZXNvdXJjZXM6ZnVuY3Rpb24odCxlLHIpe3ZhciBvLHMsaSxuLGw7Zm9yKGU/KGw9dC5zbGljZSgwKSxsLnNvcnQoZSkpOmw9dCxuPVtdLG89MCxzPWwubGVuZ3RoO288cztvKyspaT1sW29dLHIucHVzaChpKSxuLnB1c2godGhpcy5hY2N1bXVsYXRlUmVzb3VyY2VzKGkuY2hpbGRyZW4sZSxyKSk7cmV0dXJuIG59LHVwZGF0ZURheVRhYmxlQ29sczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM9dGhpcy52aWV3Lm9wdCgiZ3JvdXBCeURhdGVBbmRSZXNvdXJjZSIpLGQuRGF5VGFibGVNaXhpbi51cGRhdGVEYXlUYWJsZUNvbHMuY2FsbCh0aGlzKX0sY29tcHV0ZUNvbENudDpmdW5jdGlvbigpe3JldHVybih0aGlzLnJlc291cmNlQ250fHwxKSp0aGlzLmRheXNQZXJSb3d9LGdldENvbERheUluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMJiYodD10aGlzLmNvbENudC0xLXQpLHRoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz9NYXRoLmZsb29yKHQvKHRoaXMucmVzb3VyY2VDbnR8fDEpKTp0JXRoaXMuZGF5c1BlclJvd30sZ2V0Q29sUmVzb3VyY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW3RoaXMuZ2V0Q29sUmVzb3VyY2VJbmRleCh0KV19LGdldENvbFJlc291cmNlSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNSVEwmJih0PXRoaXMuY29sQ250LTEtdCksdGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3QlKHRoaXMucmVzb3VyY2VDbnR8fDEpOk1hdGguZmxvb3IodC90aGlzLmRheXNQZXJSb3cpfSxpbmRpY2VzVG9Db2w6ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj10aGlzLmRhdGVzQWJvdmVSZXNvdXJjZXM/ZSoodGhpcy5yZXNvdXJjZUNudHx8MSkrdDp0KnRoaXMuZGF5c1BlclJvdytlLHRoaXMuaXNSVEwmJihyPXRoaXMuY29sQ250LTEtcikscn0scmVuZGVySGVhZFRySHRtbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc291cmNlQ250P3RoaXMuZGF5c1BlclJvdz4xP3RoaXMuZGF0ZXNBYm92ZVJlc291cmNlcz90aGlzLnJlbmRlckhlYWREYXRlQW5kUmVzb3VyY2VIdG1sKCk6dGhpcy5yZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbCgpOnRoaXMucmVuZGVySGVhZFJlc291cmNlSHRtbCgpOmQuRGF5VGFibGVNaXhpbi5yZW5kZXJIZWFkVHJIdG1sLmNhbGwodGhpcyl9LHJlbmRlckhlYWRSZXNvdXJjZUh0bWw6ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2ZvcihzPVtdLHI9dGhpcy5mbGF0dGVuZWRSZXNvdXJjZXMsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sCnMucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKG8pKTtyZXR1cm4gdGhpcy53cmFwVHIocywicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VBbmREYXRlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihoPVtdLGU9W10sbj10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxvPTAsaT1uLmxlbmd0aDtvPGk7bysrKWZvcih1PW5bb10saC5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlQ2VsbEh0bWwodSxudWxsLHRoaXMuZGF5c1BlclJvdykpLHI9cz0wLGw9dGhpcy5kYXlzUGVyUm93O3M8bDtyPXMrPTEpdD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZFJlc291cmNlRGF0ZUNlbGxIdG1sKHQsdSkpO3JldHVybiB0aGlzLndyYXBUcihoLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoZSwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkRGF0ZUFuZFJlc291cmNlSHRtbDpmdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoO2ZvcihlPVtdLGg9W10scj1vPTAsbj10aGlzLmRheXNQZXJSb3c7bzxuO3I9bys9MSlmb3IodD10aGlzLmRheURhdGVzW3JdLmNsb25lKCksZS5wdXNoKHRoaXMucmVuZGVySGVhZERhdGVDZWxsSHRtbCh0LHRoaXMucmVzb3VyY2VDbnQpKSxsPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLHM9MCxpPWwubGVuZ3RoO3M8aTtzKyspdT1sW3NdLGgucHVzaCh0aGlzLnJlbmRlckhlYWRSZXNvdXJjZUNlbGxIdG1sKHUsdCkpO3JldHVybiB0aGlzLndyYXBUcihlLCJyZW5kZXJIZWFkSW50cm9IdG1sIikrdGhpcy53cmFwVHIoaCwicmVuZGVySGVhZEludHJvSHRtbCIpfSxyZW5kZXJIZWFkUmVzb3VyY2VDZWxsSHRtbDpmdW5jdGlvbih0LGUscil7cmV0dXJuJzx0aCBjbGFzcz0iZmMtcmVzb3VyY2UtY2VsbCIgZGF0YS1yZXNvdXJjZS1pZD0iJyt0LmlkKyciJysoZT8nIGRhdGEtZGF0ZT0iJytlLmZvcm1hdCgiWVlZWS1NTS1ERCIpKyciJzoiIikrKHI+MT8nIGNvbHNwYW49IicrcisnIic6IiIpKyI+Iit5dCh0aGlzLnZpZXcuZ2V0UmVzb3VyY2VUZXh0KHQpKSsiPC90aD4ifSxyZW5kZXJIZWFkUmVzb3VyY2VEYXRlQ2VsbEh0bWw6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLnJlbmRlckhlYWREYXRlQ2VsbEh0bWwodCxyLCdkYXRhLXJlc291cmNlLWlkPSInK2UuaWQrJyInKX0scHJvY2Vzc0hlYWRSZXNvdXJjZUVsczpmdW5jdGlvbihlKXtyZXR1cm4gZS5maW5kKCIuZmMtcmVzb3VyY2UtY2VsbCIpLmVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7dmFyIHM7cmV0dXJuIHM9ZS5kYXRlc0Fib3ZlUmVzb3VyY2VzP2UuZ2V0Q29sUmVzb3VyY2Uocik6ZS5mbGF0dGVuZWRSZXNvdXJjZXNbZS5pc1JUTD9lLmZsYXR0ZW5lZFJlc291cmNlcy5sZW5ndGgtMS1yOnJdLGUudmlldy50cmlnZ2VyKCJyZXNvdXJjZVJlbmRlciIscyxzLHQobyksdCgpKX19KHRoaXMpKX0scmVuZGVyQmdDZWxsc0h0bWw6ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuO2lmKHRoaXMucmVzb3VyY2VDbnQpe2ZvcihvPVtdLGU9cz0wLGk9dGhpcy5jb2xDbnQ7czxpO2U9cys9MSlyPXRoaXMuZ2V0Q2VsbERhdGUodCxlKSxuPXRoaXMuZ2V0Q29sUmVzb3VyY2UoZSksby5wdXNoKHRoaXMucmVuZGVyUmVzb3VyY2VCZ0NlbGxIdG1sKHIsbikpO3JldHVybiBvLmpvaW4oIiIpfXJldHVybiBkLkRheVRhYmxlTWl4aW4ucmVuZGVyQmdDZWxsc0h0bWwuY2FsbCh0aGlzLHQpfSxyZW5kZXJSZXNvdXJjZUJnQ2VsbEh0bWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJCZ0NlbGxIdG1sKHQsJ2RhdGEtcmVzb3VyY2UtaWQ9IicrZS5pZCsnIicpfSx3cmFwVHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pc1JUTD8odC5yZXZlcnNlKCksIjx0cj4iK3Quam9pbigiIikrdGhpc1tlXSgpKyI8L3RyPiIpOiI8dHI+Iit0aGlzW2VdKCkrdC5qb2luKCIiKSsiPC90cj4ifSxjb21wdXRlUGVyUmVzb3VyY2VCdXNpbmVzc0hvdXJTZWdzOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZztpZih0aGlzLmZsYXR0ZW5lZFJlc291cmNlcyl7Zm9yKHI9ITEscD10aGlzLmZsYXR0ZW5lZFJlc291cmNlcyxuPTAsaD1wLmxlbmd0aDtuPGg7bisrKWY9cFtuXSxmLmJ1c2luZXNzSG91cnMmJihyPSEwKTtpZihyKXtmb3IoZT1bXSxkPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzLGw9MCxhPWQubGVuZ3RoO2w8YTtsKyspe2ZvcihmPWRbbF0sbz1mLmJ1c2luZXNzSG91cnN8fHRoaXMudmlldy5vcHQoImJ1c2luZXNzSG91cnMiKSxpPXRoaXMudmlldy5jYWxlbmRhci5jb21wdXRlQnVzaW5lc3NIb3VyRXZlbnRzKHQsbyksdT0wLGM9aS5sZW5ndGg7dTxjO3UrKylzPWlbdV0scy5yZXNvdXJjZUlkPWYuaWQ7Zz10aGlzLmV2ZW50c1RvU2VncyhpKSxlLnB1c2guYXBwbHkoZSxnKX1yZXR1cm4gZX19cmV0dXJuIG51bGx9fSxUPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5kYXRlc0Fib3ZlUmVzb3VyY2VzP3RoaXMuc2xpY2VSYW5nZUJ5RGF5KGUpOnRoaXMuc2xpY2VSYW5nZUJ5Um93KGUpLGEpe2ZvcihkPVtdLGk9MCx1PW8ubGVuZ3RoO2k8dTtpKyspZm9yKGY9b1tpXSxjPW49MCxoPWE7bjxoO2M9bis9MSlwPXRoaXMuZmxhdHRlbmVkUmVzb3VyY2VzW2NdLGUucmVzb3VyY2VJZCYmZS5yZXNvdXJjZUlkIT09cC5pZHx8KHI9dC5leHRlbmQoe30sZiksci5yZXNvdXJjZT1wLHRoaXMuaXNSVEw/KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSxyLnJpZ2h0Q29sPXRoaXMuaW5kaWNlc1RvQ29sKGMsZi5maXJzdFJvd0RheUluZGV4KSk6KHIubGVmdENvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZmlyc3RSb3dEYXlJbmRleCksci5yaWdodENvbD10aGlzLmluZGljZXNUb0NvbChjLGYubGFzdFJvd0RheUluZGV4KSksZC5wdXNoKHIpKTtyZXR1cm4gZH1mb3Iocz0wLGw9by5sZW5ndGg7czxsO3MrKylmPW9bc10sdGhpcy5pc1JUTD8oZi5sZWZ0Q29sPWYubGFzdFJvd0RheUluZGV4LGYucmlnaHRDb2w9Zi5maXJzdFJvd0RheUluZGV4KTooZi5sZWZ0Q29sPWYuZmlyc3RSb3dEYXlJbmRleCxmLnJpZ2h0Q29sPWYubGFzdFJvd0RheUluZGV4KTtyZXR1cm4gb30sci5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuY29tcHV0ZVBlclJlc291cmNlQnVzaW5lc3NIb3VyU2VncyghMCksdD90aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKTpyLl9fc3VwZXJfXy5yZW5kZXJCdXNpbmVzc0hvdXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scn0oZC5EYXlHcmlkKSxGPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oSSksci5taXhpbihfKSxyLnByb3RvdHlwZS5nZXRIaXRTcGFuPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXIuX19zdXBlcl9fLmdldEhpdFNwYW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzb3VyY2VDbnQmJihlLnJlc291cmNlSWQ9dGhpcy5nZXRDb2xSZXNvdXJjZSh0LmNvbCkuaWQpLGV9LHIucHJvdG90eXBlLnNwYW5Ub1NlZ3M9ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGY7aWYoYT10aGlzLnJlc291cmNlQ250LG89dGhpcy5zbGljZVJhbmdlQnlUaW1lcyhlKSxhKXtmb3IoZD1bXSxpPTAsdT1vLmxlbmd0aDtpPHU7aSsrKWZvcihmPW9baV0sYz1uPTAsaD1hO248aDtjPW4rPTEpcD10aGlzLmZsYXR0ZW5lZFJlc291cmNlc1tjXSxlLnJlc291cmNlSWQmJmUucmVzb3VyY2VJZCE9PXAuaWR8fChyPXQuZXh0ZW5kKHt9LGYpLHIucmVzb3VyY2U9cCxyLmNvbD10aGlzLmluZGljZXNUb0NvbChjLGYuZGF5SW5kZXgpLGQucHVzaChyKSk7cmV0dXJuIGR9Zm9yKHM9MCxsPW8ubGVuZ3RoO3M8bDtzKyspZj1vW3NdLGYuY29sPWYuZGF5SW5kZXg7cmV0dXJuIG99LHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNvbXB1dGVQZXJSZXNvdXJjZUJ1c2luZXNzSG91clNlZ3MoITEpLHQ/dGhpcy5yZW5kZXJCdXNpbmVzc1NlZ3ModCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHJ9KGQuVGltZUdyaWQpLGo9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5wcm90b3R5cGUudGltZUdyaWQ9bnVsbCxlLnByb3RvdHlwZS5pc1Njcm9sbGVkPSExLGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZD10aGlzLmluc3RhbnRpYXRlR3JpZCgpLHRoaXMuaW50ZXJ2YWxEdXJhdGlvbj10aGlzLnRpbWVHcmlkLmR1cmF0aW9ufSxlLnByb3RvdHlwZS5pbnN0YW50aWF0ZUdyaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE4odGhpcyl9LGUucHJvdG90eXBlLnNldFJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9fc3VwZXJfXy5zZXRSYW5nZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50aW1lR3JpZC5zZXRSYW5nZSh0KX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5hZGRDbGFzcygiZmMtdGltZWxpbmUiKSx0aGlzLm9wdCgiZXZlbnRPdmVybGFwIik9PT0hMSYmdGhpcy5lbC5hZGRDbGFzcygiZmMtbm8tb3ZlcmxhcCIpLHRoaXMuZWwuaHRtbCh0aGlzLnJlbmRlclNrZWxldG9uSHRtbCgpKSx0aGlzLnJlbmRlclRpbWVHcmlkU2tlbGV0b24oKX0sZS5wcm90b3R5cGUucmVuZGVyU2tlbGV0b25IdG1sPWZ1bmN0aW9uKCl7cmV0dXJuJzx0YWJsZT4gPHRoZWFkIGNsYXNzPSJmYy1oZWFkIj4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPC90cj4gPC90aGVhZD4gPHRib2R5IGNsYXNzPSJmYy1ib2R5Ij4gPHRyPiA8dGQgY2xhc3M9ImZjLXRpbWUtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDwvdHI+IDwvdGJvZHk+IDwvdGFibGU+J30sZS5wcm90b3R5cGUucmVuZGVyVGltZUdyaWRTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldEVsZW1lbnQodGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtdGltZS1hcmVhIikpLHRoaXMudGltZUdyaWQuaGVhZEVsPXRoaXMuZWwuZmluZCgidGhlYWQgLmZjLXRpbWUtYXJlYSIpLHRoaXMudGltZUdyaWQucmVuZGVyU2tlbGV0b24oKSx0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIub24oInNjcm9sbCIsTXQodGhpcywiaGFuZGxlQm9keVNjcm9sbCIpKX0sZS5wcm90b3R5cGUuaGFuZGxlQm9keVNjcm9sbD1mdW5jdGlvbih0LGUpe2lmKHQpe2lmKCF0aGlzLmlzU2Nyb2xsZWQpcmV0dXJuIHRoaXMuaXNTY3JvbGxlZD0hMCx0aGlzLmVsLmFkZENsYXNzKCJmYy1zY3JvbGxlZCIpfWVsc2UgaWYodGhpcy5pc1Njcm9sbGVkKXJldHVybiB0aGlzLmlzU2Nyb2xsZWQ9ITEsdGhpcy5lbC5yZW1vdmVDbGFzcygiZmMtc2Nyb2xsZWQiKX0sZS5wcm90b3R5cGUudW5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbW92ZUVsZW1lbnQoKSx0aGlzLmhhbmRsZUJvZHlTY3JvbGwoMCksZS5fX3N1cGVyX18udW5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRGF0ZXMoKX0sZS5wcm90b3R5cGUucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckJ1c2luZXNzSG91cnMoKX0sZS5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJCdXNpbmVzc0hvdXJzKCl9LGUucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXROb3dJbmRpY2F0b3JVbml0KCl9LGUucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJOb3dJbmRpY2F0b3IodCl9LGUucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJOb3dJbmRpY2F0b3IoKX0sZS5wcm90b3R5cGUucHJlcGFyZUhpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5wcmVwYXJlSGl0cygpfSxlLnByb3RvdHlwZS5yZWxlYXNlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbGVhc2VIaXRzKCl9LGUucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlIaXQodCxlKX0sZS5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRTcGFuKHQpfSxlLnByb3RvdHlwZS5nZXRIaXRFbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRIaXRFbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51cGRhdGVXaWR0aCgpfSxlLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gcj1lPyJhdXRvIjp0LXRoaXMudGltZUdyaWQuaGVhZEhlaWdodCgpLXRoaXMucXVlcnlNaXNjSGVpZ2h0KCksdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuc2V0SGVpZ2h0KHIpfSxlLnByb3RvdHlwZS5xdWVyeU1pc2NIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5vdXRlckhlaWdodCgpLXRoaXMudGltZUdyaWQuaGVhZFNjcm9sbGVyLmVsLm91dGVySGVpZ2h0KCktdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKX0sZS5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuY29tcHV0ZUluaXRpYWxTY3JvbGwodCl9LGUucHJvdG90eXBlLnF1ZXJ5U2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQucXVlcnlTY3JvbGwoKX0sZS5wcm90b3R5cGUuc2V0U2Nyb2xsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnNldFNjcm9sbCh0KX0sZS5wcm90b3R5cGUucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlckV2ZW50cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LGUucHJvdG90eXBlLnJlbmRlckRyYWc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5yZW5kZXJEcmFnKHQsZSl9LGUucHJvdG90eXBlLnVucmVuZGVyRHJhZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVHcmlkLnVucmVuZGVyRHJhZygpfSxlLnByb3RvdHlwZS5nZXRFdmVudFNlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC5nZXRFdmVudFNlZ3MoKX0sZS5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVHcmlkLnJlbmRlclNlbGVjdGlvbih0KX0sZS5wcm90b3R5cGUudW5yZW5kZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50aW1lR3JpZC51bnJlbmRlclNlbGVjdGlvbigpfSxlfShYKSxydD1kLmNzc1RvU3RyLE49ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbygpe3ZhciB0O28uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmluaXRTY2FsZVByb3BzKCksdGhpcy5taW5UaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1pblRpbWUiKXx8IjAwOjAwIiksdGhpcy5tYXhUaW1lPWUuZHVyYXRpb24odGhpcy5vcHQoIm1heFRpbWUiKXx8IjI0OjAwIiksdGhpcy50aW1lV2luZG93TXM9dGhpcy5tYXhUaW1lLXRoaXMubWluVGltZSx0aGlzLnNuYXBEdXJhdGlvbj0odD10aGlzLm9wdCgic25hcER1cmF0aW9uIikpP2UuZHVyYXRpb24odCk6dGhpcy5zbG90RHVyYXRpb24sdGhpcy5taW5SZXNpemVEdXJhdGlvbj10aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBzUGVyU2xvdD1pdCh0aGlzLnNsb3REdXJhdGlvbix0aGlzLnNuYXBEdXJhdGlvbiksdGhpcy5zbG90V2lkdGg9dGhpcy5vcHQoInNsb3RXaWR0aCIpfXJldHVybiBPdChvLHIpLG8ucHJvdG90eXBlLnNsb3REYXRlcz1udWxsLG8ucHJvdG90eXBlLnNsb3RDbnQ9bnVsbCxvLnByb3RvdHlwZS5zbmFwQ250PW51bGwsby5wcm90b3R5cGUuc25hcHNQZXJTbG90PW51bGwsby5wcm90b3R5cGUuc25hcERpZmZUb0luZGV4PW51bGwsby5wcm90b3R5cGUuc25hcEluZGV4VG9EaWZmPW51bGwsby5wcm90b3R5cGUuaGVhZEVsPW51bGwsby5wcm90b3R5cGUuc2xhdENvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2xhdEVscz1udWxsLG8ucHJvdG90eXBlLmNvbnRhaW5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5zbGF0Q29vcmRDYWNoZT1udWxsLG8ucHJvdG90eXBlLnNsYXRJbm5lckNvb3JkQ2FjaGU9bnVsbCxvLnByb3RvdHlwZS5oZWFkU2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5ib2R5U2Nyb2xsZXI9bnVsbCxvLnByb3RvdHlwZS5qb2luZXI9bnVsbCxvLnByb3RvdHlwZS5mb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLmV2ZW50VGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLm1pblRpbWU9bnVsbCxvLnByb3RvdHlwZS5tYXhUaW1lPW51bGwsby5wcm90b3R5cGUudGltZVdpbmRvd01zPW51bGwsby5wcm90b3R5cGUuc2xvdER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuc25hcER1cmF0aW9uPW51bGwsby5wcm90b3R5cGUuZHVyYXRpb249bnVsbCxvLnByb3RvdHlwZS5sYWJlbEludGVydmFsPW51bGwsby5wcm90b3R5cGUuaGVhZGVyRm9ybWF0cz1udWxsLG8ucHJvdG90eXBlLmlzVGltZVNjYWxlPW51bGwsby5wcm90b3R5cGUubGFyZ2VVbml0PW51bGwsby5wcm90b3R5cGUuZW1waGFzaXplV2Vla3M9ITEsby5wcm90b3R5cGUudGl0bGVGb2xsb3dlcj1udWxsLG8ucHJvdG90eXBlLnNlZ0NvbnRhaW5lckVsPW51bGwsby5wcm90b3R5cGUuc2VnQ29udGFpbmVySGVpZ2h0PW51bGwsby5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLG8ucHJvdG90eXBlLmhlbHBlckVscz1udWxsLG8ucHJvdG90eXBlLmlubmVyRWw9bnVsbCxvLnByb3RvdHlwZS5vcHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmlldy5vcHQodCl9LG8ucHJvdG90eXBlLmlzVmFsaWREYXRlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiF0aGlzLnZpZXcuaXNIaWRkZW5EYXkodCkmJighdGhpcy5pc1RpbWVTY2FsZXx8KGU9dC50aW1lKCktdGhpcy5taW5UaW1lLGU9KGUlODY0ZTUrODY0ZTUpJTg2NGU1LGU8dGhpcy50aW1lV2luZG93TXMpKX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1RpbWVTY2FsZX0sby5wcm90b3R5cGUuY29tcHV0ZURpc3BsYXlFdmVudEVuZD1mdW5jdGlvbigpe3JldHVybiExfSxvLnByb3RvdHlwZS5jb21wdXRlRXZlbnRUaW1lRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0KCJleHRyYVNtYWxsVGltZUZvcm1hdCIpfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkRGF0ZT1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT8oZT10LmNsb25lKCksZS5oYXNUaW1lKCl8fGUudGltZSgwKSk6KGU9dC5jbG9uZSgpLnN0cmlwVGltZSgpLHRoaXMubGFyZ2VVbml0JiZlLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpKSxlfSxvLnByb3RvdHlwZS5ub3JtYWxpemVHcmlkUmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdGhpcy5pc1RpbWVTY2FsZT9yPXtzdGFydDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuc3RhcnQpLGVuZDp0aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHQuZW5kKX06KHI9dGhpcy52aWV3LmNvbXB1dGVEYXlSYW5nZSh0KSx0aGlzLmxhcmdlVW5pdCYmKHIuc3RhcnQuc3RhcnRPZih0aGlzLmxhcmdlVW5pdCksZT1yLmVuZC5jbG9uZSgpLnN0YXJ0T2YodGhpcy5sYXJnZVVuaXQpLGUuaXNTYW1lKHIuZW5kKSYmZS5pc0FmdGVyKHIuc3RhcnQpfHxlLmFkZCh0aGlzLnNsb3REdXJhdGlvbiksci5lbmQ9ZSkpLHJ9LG8ucHJvdG90eXBlLnJhbmdlVXBkYXRlZD1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKHRoaXMuc3RhcnQ9dGhpcy5ub3JtYWxpemVHcmlkRGF0ZSh0aGlzLnN0YXJ0KSx0aGlzLmVuZD10aGlzLm5vcm1hbGl6ZUdyaWREYXRlKHRoaXMuZW5kKSx0aGlzLmlzVGltZVNjYWxlJiYodGhpcy5zdGFydC5hZGQodGhpcy5taW5UaW1lKSx0aGlzLmVuZC5zdWJ0cmFjdCgxLCJkYXkiKS5hZGQodGhpcy5tYXhUaW1lKSksZT1bXSx0PXRoaXMuc3RhcnQuY2xvbmUoKTt0PHRoaXMuZW5kOyl0aGlzLmlzVmFsaWREYXRlKHQpJiZlLnB1c2godC5jbG9uZSgpKSx0LmFkZCh0aGlzLnNsb3REdXJhdGlvbik7cmV0dXJuIHRoaXMuc2xvdERhdGVzPWUsdGhpcy51cGRhdGVHcmlkRGF0ZXMoKX0sby5wcm90b3R5cGUudXBkYXRlR3JpZERhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iobz0tMSxlPTAscj1bXSxzPVtdLHQ9dGhpcy5zdGFydC5jbG9uZSgpO3Q8dGhpcy5lbmQ7KXRoaXMuaXNWYWxpZERhdGUodCk/KG8rKyxyLnB1c2gobykscy5wdXNoKGUpKTpyLnB1c2gobysuNSksdC5hZGQodGhpcy5zbmFwRHVyYXRpb24pLGUrKztyZXR1cm4gdGhpcy5zbmFwRGlmZlRvSW5kZXg9cix0aGlzLnNuYXBJbmRleFRvRGlmZj1zLHRoaXMuc25hcENudD1vKzEsdGhpcy5zbG90Q250PXRoaXMuc25hcENudC90aGlzLnNuYXBzUGVyU2xvdH0sby5wcm90b3R5cGUuc3BhblRvU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPXRoaXMubm9ybWFsaXplR3JpZFJhbmdlKHQpLHRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodC5zdGFydCk8dGhpcy5jb21wdXRlRGF0ZVNuYXBDb3ZlcmFnZSh0LmVuZCkmJihyPXZ0KGUsdGhpcykpPyhyLmlzU3RhcnQmJiF0aGlzLmlzVmFsaWREYXRlKHIuc3RhcnQpJiYoci5pc1N0YXJ0PSExKSxyLmlzRW5kJiZyLmVuZCYmIXRoaXMuaXNWYWxpZERhdGUoci5lbmQuY2xvbmUoKS5zdWJ0cmFjdCgxKSkmJihyLmlzRW5kPSExKSxbcl0pOltdfSxvLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1aWxkQ29vcmRzKCl9LG8ucHJvdG90eXBlLnF1ZXJ5SGl0PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsLHUsaCxhLGMscCxkO2lmKGQ9dGhpcy5zbmFwc1BlclNsb3QsaT10aGlzLnNsYXRDb29yZENhY2hlLHI9dGhpcy5jb250YWluZXJDb29yZENhY2hlLHIuaXNUb3BJbkJvdW5kcyhlKSYmKG49aS5nZXRIb3Jpem9udGFsSW5kZXgodCksbnVsbCE9bikpcmV0dXJuIGg9aS5nZXRXaWR0aChuKSx0aGlzLmlzUlRMPyh1PWkuZ2V0UmlnaHRPZmZzZXQobikscz0odS10KS9oLG89TWF0aC5mbG9vcihzKmQpLGE9bipkK28scD11LW8vZCpoLGM9cC0obysxKS9kKmgpOihsPWkuZ2V0TGVmdE9mZnNldChuKSxzPSh0LWwpL2gsbz1NYXRoLmZsb29yKHMqZCksYT1uKmQrbyxjPWwrby9kKmgscD1sKyhvKzEpL2QqaCkse3NuYXA6YSxjb21wb25lbnQ6dGhpcyxsZWZ0OmMscmlnaHQ6cCx0b3A6ci5nZXRUb3BPZmZzZXQoMCksYm90dG9tOnIuZ2V0Qm90dG9tT2Zmc2V0KDApfX0sby5wcm90b3R5cGUuZ2V0SGl0U3Bhbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKX0sby5wcm90b3R5cGUuZ2V0SGl0RWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0U25hcEVsKHQuc25hcCl9LG8ucHJvdG90eXBlLmdldFNuYXBSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiByPXRoaXMuc3RhcnQuY2xvbmUoKSxyLmFkZChDdCh0aGlzLnNuYXBEdXJhdGlvbix0aGlzLnNuYXBJbmRleFRvRGlmZlt0XSkpLGU9ci5jbG9uZSgpLmFkZCh0aGlzLnNuYXBEdXJhdGlvbikse3N0YXJ0OnIsZW5kOmV9fSxvLnByb3RvdHlwZS5nZXRTbmFwRWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2xhdEVscy5lcShNYXRoLmZsb29yKHQvdGhpcy5zbmFwc1BlclNsb3QpKX0sby5wcm90b3R5cGUucmVuZGVyU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oZWFkU2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WDoiY2xpcHBlZC1zY3JvbGwiLG92ZXJmbG93WToiaGlkZGVuIn0pLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmhlYWRTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmhlYWRFbC5hcHBlbmQodGhpcy5oZWFkU2Nyb2xsZXIuZWwpLHRoaXMuYm9keVNjcm9sbGVyPW5ldyBuLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcz1uZXcgTyx0aGlzLmJvZHlTY3JvbGxlci5yZW5kZXIoKSx0aGlzLmVsLmFwcGVuZCh0aGlzLmJvZHlTY3JvbGxlci5lbCksdGhpcy5pbm5lckVsPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwsdGhpcy5zbGF0Q29udGFpbmVyRWw9dCgnPGRpdiBjbGFzcz0iZmMtc2xhdHMiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuYmdFbCksdGhpcy5zZWdDb250YWluZXJFbD10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIiLz4nKS5hcHBlbmRUbyh0aGlzLmJvZHlTY3JvbGxlci5jYW52YXMuY29udGVudEVsKSx0aGlzLmJnU2VnQ29udGFpbmVyRWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmJnRWwsdGhpcy5jb250YWluZXJDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLGlzSG9yaXpvbnRhbDohMCxpc1ZlcnRpY2FsOiEwfSksdGhpcy5qb2luZXI9bmV3IEEoImhvcml6b250YWwiLFt0aGlzLmhlYWRTY3JvbGxlcix0aGlzLmJvZHlTY3JvbGxlcl0pLHRoaXMuZm9sbG93ZXI9bmV3IFYodGhpcy5oZWFkU2Nyb2xsZXIsdGhpcy52aWV3LmNhbGVuZGFyLmlzVG91Y2gpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyPW5ldyBWKHRoaXMuYm9keVNjcm9sbGVyLHRoaXMudmlldy5jYWxlbmRhci5pc1RvdWNoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5taW5UcmF2ZWw9NTAsdGhpcy5pc1JUTD90aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jb250YWluT25OYXR1cmFsUmlnaHQ9ITA6dGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY29udGFpbk9uTmF0dXJhbExlZnQ9ITAsby5fX3N1cGVyX18ucmVuZGVyU2tlbGV0b24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5oZWFkQ29sRWxzPW51bGwsby5wcm90b3R5cGUuc2xhdENvbEVscz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckRhdGVzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3IodGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5odG1sKHRoaXMucmVuZGVySGVhZEh0bWwoKSksdGhpcy5oZWFkQ29sRWxzPXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgiY29sIiksdGhpcy5zbGF0Q29udGFpbmVyRWwuaHRtbCh0aGlzLnJlbmRlclNsYXRIdG1sKCkpLHRoaXMuc2xhdENvbEVscz10aGlzLnNsYXRDb250YWluZXJFbC5maW5kKCJjb2wiKSx0aGlzLnNsYXRFbHM9dGhpcy5zbGF0Q29udGFpbmVyRWwuZmluZCgidGQiKSx0aGlzLnNsYXRDb29yZENhY2hlPW5ldyBsKHtlbHM6dGhpcy5zbGF0RWxzLGlzSG9yaXpvbnRhbDohMH0pLHRoaXMuc2xhdElubmVyQ29vcmRDYWNoZT1uZXcgbCh7ZWxzOnRoaXMuc2xhdEVscy5maW5kKCI+IGRpdiIpLGlzSG9yaXpvbnRhbDohMCxvZmZzZXRQYXJlbnQ6dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsfSkscz10aGlzLnNsb3REYXRlcyxlPXI9MCxvPXMubGVuZ3RoO3I8bztlPSsrcil0PXNbZV0sdGhpcy52aWV3LnRyaWdnZXIoImRheVJlbmRlciIsbnVsbCx0LHRoaXMuc2xhdEVscy5lcShlKSk7aWYodGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci5zZXRTcHJpdGVzKHRoaXMuaGVhZEVsLmZpbmQoInRyOm5vdCg6bGFzdC1jaGlsZCkgc3BhbiIpKX0sby5wcm90b3R5cGUudW5yZW5kZXJEYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZvbGxvd2VyJiZ0aGlzLmZvbGxvd2VyLmNsZWFyU3ByaXRlcygpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZW1wdHkoKSx0aGlzLnNsYXRDb250YWluZXJFbC5lbXB0eSgpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jbGVhcldpZHRoKCksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNsZWFyV2lkdGgoKX0sby5wcm90b3R5cGUucmVuZGVySGVhZEh0bWw9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxILFQsXyxJLEQseCxCLEYsRyxNLFcsTDtmb3IoZz10aGlzLmxhYmVsSW50ZXJ2YWwsaT10aGlzLmhlYWRlckZvcm1hdHMsZT1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXM9aVt0XSxyLnB1c2goW10pO3JldHVybiByfSgpLHk9bnVsbCxJPW51bGwsTT10aGlzLnNsb3REYXRlcyxHPVtdLHA9MCx2PU0ubGVuZ3RoO3A8djtwKyspe2ZvcihyPU1bcF0sTD1yLndlZWsoKSxjPXRoaXMuZW1waGFzaXplV2Vla3MmJm51bGwhPT1JJiZJIT09TCx4PWQ9MCx3PWkubGVuZ3RoO2Q8dzt4PSsrZClzPWlbeF0sQj1lW3hdLHk9QltCLmxlbmd0aC0xXSxhPWkubGVuZ3RoPjEmJng8aS5sZW5ndGgtMSxUPW51bGwsYT8oVz1yLmZvcm1hdChzKSxvPXIuZm9ybWF0KCkseSYmeS50ZXh0PT09Vz95LmNvbHNwYW4rPTE6VD17dGV4dDpXLGRhdGVEYXRhOm8sY29sc3BhbjoxfSk6IXl8fFN0KG50KHRoaXMuc3RhcnQscixnKSk/KFc9ci5mb3JtYXQocyksbz1yLmZvcm1hdCgpLFQ9e3RleHQ6VyxkYXRlRGF0YTpvLGNvbHNwYW46MX0pOnkuY29sc3Bhbis9MSxUJiYoVC53ZWVrU3RhcnQ9YyxCLnB1c2goVCkpO0cucHVzaCh7d2Vla1N0YXJ0OmN9KSxJPUx9Zm9yKHU9Zz50aGlzLnNsb3REdXJhdGlvbixuPSI8dGFibGU+IixuKz0iPGNvbGdyb3VwPiIsZj0wLG09TS5sZW5ndGg7ZjxtO2YrKylyPU1bZl0sbis9Ijxjb2wvPiI7Zm9yKG4rPSI8L2NvbGdyb3VwPiIsbis9Ijx0Ym9keT4iLGw9RT0wLFM9ZS5sZW5ndGg7RTxTO2w9KytFKXtmb3IoQj1lW2xdLGg9bD09PWUubGVuZ3RoLTEsbis9Ijx0ciIrKHUmJmg/JyBjbGFzcz0iZmMtY2hyb25vIic6IiIpKyI+IixIPTAsUj1CLmxlbmd0aDtIPFI7SCsrKXQ9QltIXSxuKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysiICIrKHQud2Vla1N0YXJ0PyJmYy1lbS1jZWxsIjoiIikrJyIgZGF0YS1kYXRlPSInK3QuZGF0ZURhdGErJyInKyh0LmNvbHNwYW4+MT8nIGNvbHNwYW49IicrdC5jb2xzcGFuKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jZWxsLWNvbnRlbnQiPjxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQodC50ZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+IjtuKz0iPC90cj4ifWZvcihuKz0iPC90Ym9keT48L3RhYmxlPiIsRj0iPHRhYmxlPiIsRis9Ijxjb2xncm91cD4iLF89MCxiPUcubGVuZ3RoO188YjtfKyspdD1HW19dLEYrPSI8Y29sLz4iO2ZvcihGKz0iPC9jb2xncm91cD4iLEYrPSI8dGJvZHk+PHRyPiIsbD1EPTAsQz1HLmxlbmd0aDtEPEM7bD0rK0QpdD1HW2xdLHI9TVtsXSxGKz10aGlzLnNsYXRDZWxsSHRtbChyLHQud2Vla1N0YXJ0KTtyZXR1cm4gRis9IjwvdHI+PC90Ym9keT48L3RhYmxlPiIsdGhpcy5fc2xhdEh0bWw9RixufSxvLnByb3RvdHlwZS5yZW5kZXJTbGF0SHRtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zbGF0SHRtbH0sby5wcm90b3R5cGUuc2xhdENlbGxIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHRoaXMuaXNUaW1lU2NhbGU/KHI9W10sci5wdXNoKFN0KG50KHRoaXMuc3RhcnQsdCx0aGlzLmxhYmVsSW50ZXJ2YWwpKT8iZmMtbWFqb3IiOiJmYy1taW5vciIpKToocj10aGlzLmdldERheUNsYXNzZXModCksci5wdXNoKCJmYy1kYXkiKSksci51bnNoaWZ0KHRoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MpLGUmJnIucHVzaCgiZmMtZW0tY2VsbCIpLCc8dGQgY2xhc3M9Iicrci5qb2luKCIgIikrJyIgZGF0YS1kYXRlPSInK3QuZm9ybWF0KCkrJyI+PGRpdiAvPjwvdGQ+J30sby5wcm90b3R5cGUuYnVzaW5lc3NIb3VyU2Vncz1udWxsLG8ucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXt2YXIgdDtpZighdGhpcy5sYXJnZVVuaXQpcmV0dXJuIHQ9dGhpcy5idXNpbmVzc0hvdXJTZWdzPXRoaXMuYnVpbGRCdXNpbmVzc0hvdXJTZWdzKCF0aGlzLmlzVGltZVNjYWxlKSx0aGlzLnJlbmRlckZpbGwoImJ1c2luZXNzSG91cnMiLHQsImJnZXZlbnQiKX0sby5wcm90b3R5cGUudW5yZW5kZXJCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJGaWxsKCJidXNpbmVzc0hvdXJzIil9LG8ucHJvdG90eXBlLm5vd0luZGljYXRvckVscz1udWxsLG8ucHJvdG90eXBlLmdldE5vd0luZGljYXRvclVuaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzVGltZVNjYWxlKXJldHVybiBKKHRoaXMuc2xvdER1cmF0aW9uKX0sby5wcm90b3R5cGUucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKGUpe3ZhciByLG8scztyZXR1cm4gcz1bXSxlPXRoaXMubm9ybWFsaXplR3JpZERhdGUoZSksZT49dGhpcy5zdGFydCYmZTx0aGlzLmVuZCYmKHI9dGhpcy5kYXRlVG9Db29yZChlKSxvPXRoaXMuaXNSVEw/e3JpZ2h0Oi1yfTp7bGVmdDpyfSxzLnB1c2godCgiPGRpdiBjbGFzcz0nZmMtbm93LWluZGljYXRvciBmYy1ub3ctaW5kaWNhdG9yLWFycm93Jz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmVsKVswXSkscy5wdXNoKHQoIjxkaXYgY2xhc3M9J2ZjLW5vdy1pbmRpY2F0b3IgZmMtbm93LWluZGljYXRvci1saW5lJz48L2Rpdj4iKS5jc3MobykuYXBwZW5kVG8odGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsKVswXSkpLHRoaXMubm93SW5kaWNhdG9yRWxzPXQocyl9LG8ucHJvdG90eXBlLnVucmVuZGVyTm93SW5kaWNhdG9yPWZ1bmN0aW9uKCl7aWYodGhpcy5ub3dJbmRpY2F0b3JFbHMpcmV0dXJuIHRoaXMubm93SW5kaWNhdG9yRWxzLnJlbW92ZSgpLHRoaXMubm93SW5kaWNhdG9yRWxzPW51bGx9LG8ucHJvdG90eXBlLmV4cGxpY2l0U2xvdFdpZHRoPW51bGwsby5wcm90b3R5cGUuZGVmYXVsdFNsb3RXaWR0aD1udWxsLG8ucHJvdG90eXBlLnVwZGF0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZihzPU1hdGgucm91bmQodGhpcy5zbG90V2lkdGh8fCh0aGlzLnNsb3RXaWR0aD10aGlzLmNvbXB1dGVTbG90V2lkdGgoKSkpLHI9cyp0aGlzLnNsb3REYXRlcy5sZW5ndGgsZT0iIixvPXMsdD10aGlzLmJvZHlTY3JvbGxlci5nZXRDbGllbnRXaWR0aCgpLHQ+ciYmKGU9dCxyPSIiLG89TWF0aC5mbG9vcih0L3RoaXMuc2xvdERhdGVzLmxlbmd0aCkpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5zZXRXaWR0aChyKSx0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldFdpZHRoKHIpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5zZXRNaW5XaWR0aChlKSx0aGlzLmhlYWRDb2xFbHMuc2xpY2UoMCwtMSkuYWRkKHRoaXMuc2xhdENvbEVscy5zbGljZSgwLC0xKSkud2lkdGgobyksdGhpcy5oZWFkU2Nyb2xsZXIudXBkYXRlU2l6ZSgpLHRoaXMuYm9keVNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmpvaW5lci51cGRhdGUoKSx0aGlzLmJ1aWxkQ29vcmRzKCksdGhpcy51cGRhdGVTZWdQb3NpdGlvbnMoKSx0aGlzLnZpZXcudXBkYXRlTm93SW5kaWNhdG9yKCksdGhpcy5mb2xsb3dlciYmdGhpcy5mb2xsb3dlci51cGRhdGUoKSx0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIudXBkYXRlKCl9LG8ucHJvdG90eXBlLmNvbXB1dGVTbG90V2lkdGg9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG47cmV0dXJuIG89MCxyPXRoaXMuaGVhZEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGggc3BhbiIpLHIuZWFjaChmdW5jdGlvbihlLHIpe3ZhciBzO3JldHVybiBzPXQocikub3V0ZXJXaWR0aCgpLG89TWF0aC5tYXgobyxzKX0pLGU9bysxLG49aXQodGhpcy5sYWJlbEludGVydmFsLHRoaXMuc2xvdER1cmF0aW9uKSxpPU1hdGguY2VpbChlL24pLHM9dGhpcy5oZWFkQ29sRWxzLmVxKDApLmNzcygibWluLXdpZHRoIikscyYmKHM9cGFyc2VJbnQocywxMCkscyYmKGk9TWF0aC5tYXgoaSxzKSkpLGl9LG8ucHJvdG90eXBlLmJ1aWxkQ29vcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyQ29vcmRDYWNoZS5idWlsZCgpLHRoaXMuc2xhdENvb3JkQ2FjaGUuYnVpbGQoKSx0aGlzLnNsYXRJbm5lckNvb3JkQ2FjaGUuYnVpbGQoKX0sby5wcm90b3R5cGUuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2U9ZnVuY3Rpb24odCl7dmFyIGUscixvO3JldHVybiByPW50KHRoaXMuc3RhcnQsdCx0aGlzLnNuYXBEdXJhdGlvbikscjwwPzA6cj49dGhpcy5zbmFwRGlmZlRvSW5kZXgubGVuZ3RoP3RoaXMuc25hcENudDoobz1NYXRoLmZsb29yKHIpLGU9dGhpcy5zbmFwRGlmZlRvSW5kZXhbb10sU3QoZSk/ZSs9ci1vOmU9TWF0aC5jZWlsKGUpLGUpfSxvLnByb3RvdHlwZS5kYXRlVG9Db29yZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpO3JldHVybiBpPXRoaXMuY29tcHV0ZURhdGVTbmFwQ292ZXJhZ2UodCksbz1pL3RoaXMuc25hcHNQZXJTbG90LHM9TWF0aC5mbG9vcihvKSxzPU1hdGgubWluKHMsdGhpcy5zbG90Q250LTEpLHI9by1zLGU9dGhpcy5zbGF0SW5uZXJDb29yZENhY2hlLHRoaXMuaXNSVEw/ZS5nZXRSaWdodFBvc2l0aW9uKHMpLWUuZ2V0V2lkdGgocykqci10aGlzLmNvbnRhaW5lckNvb3JkQ2FjaGUuZ2V0V2lkdGgoMCk6ZS5nZXRMZWZ0UG9zaXRpb24ocykrZS5nZXRXaWR0aChzKSpyfSxvLnByb3RvdHlwZS5yYW5nZVRvQ29vcmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzUlRMP3tyaWdodDp0aGlzLmRhdGVUb0Nvb3JkKHQuc3RhcnQpLGxlZnQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9OntsZWZ0OnRoaXMuZGF0ZVRvQ29vcmQodC5zdGFydCkscmlnaHQ6dGhpcy5kYXRlVG9Db29yZCh0LmVuZCl9fSxvLnByb3RvdHlwZS5oZWFkSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0YWJsZSIpLHQuaGVpZ2h0LmFwcGx5KHQsYXJndW1lbnRzKX0sby5wcm90b3R5cGUudXBkYXRlU2VnUG9zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocz0odGhpcy5zZWdzfHxbXSkuY29uY2F0KHRoaXMuYnVzaW5lc3NIb3VyU2Vnc3x8W10pLGU9MCxyPXMubGVuZ3RoO2U8cjtlKyspbz1zW2VdLHQ9dGhpcy5yYW5nZVRvQ29vcmRzKG8pLG8uZWwuY3NzKHtsZWZ0Om8ubGVmdD10LmxlZnQscmlnaHQ6LShvLnJpZ2h0PXQucmlnaHQpfSl9LG8ucHJvdG90eXBlLmNvbXB1dGVJbml0aWFsU2Nyb2xsPWZ1bmN0aW9uKHQpe3ZhciByLG87cmV0dXJuIHI9MCx0aGlzLmlzVGltZVNjYWxlJiYobz10aGlzLm9wdCgic2Nyb2xsVGltZSIpLG8mJihvPWUuZHVyYXRpb24obykscj10aGlzLmRhdGVUb0Nvb3JkKHRoaXMuc3RhcnQuY2xvbmUoKS50aW1lKG8pKSkpLHtsZWZ0OnIsdG9wOjB9fSxvLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3JldHVybntsZWZ0OnRoaXMuYm9keVNjcm9sbGVyLmdldFNjcm9sbExlZnQoKSx0b3A6dGhpcy5ib2R5U2Nyb2xsZXIuZ2V0U2Nyb2xsVG9wKCl9fSxvLnByb3RvdHlwZS5zZXRTY3JvbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGVhZFNjcm9sbGVyLnNldFNjcm9sbExlZnQodC5sZWZ0KSx0aGlzLmhlYWRTY3JvbGxlci5zZXRTY3JvbGxMZWZ0KHQubGVmdCksdGhpcy5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMucmVuZGVyRmdTZWdFbHModCksdGhpcy5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRdXSksdGhpcy51cGRhdGVTZWdGb2xsb3dlcnModCksdH0sby5wcm90b3R5cGUudW5yZW5kZXJGZ1NlZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhclNlZ0ZvbGxvd2VycygpLHRoaXMudW5yZW5kZXJGZ0NvbnRhaW5lcnMoW3RoaXNdKX0sby5wcm90b3R5cGUucmVuZGVyRmdTZWdzSW5Db250YWluZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFMsUixiLEMsRSxIO2ZvcihvPTAsbj10Lmxlbmd0aDtvPG47bysrKWZvcihtPXRbb10sZT1tWzBdLEg9bVsxXSxzPTAsbD1ILmxlbmd0aDtzPGw7cysrKUU9SFtzXSxyPXRoaXMucmFuZ2VUb0Nvb3JkcyhFKSxFLmVsLmNzcyh7bGVmdDpFLmxlZnQ9ci5sZWZ0LHJpZ2h0Oi0oRS5yaWdodD1yLnJpZ2h0KX0pO2ZvcihpPTAsdT10Lmxlbmd0aDtpPHU7aSsrKWZvcihTPXRbaV0sZT1TWzBdLEg9U1sxXSxmPTAsaD1ILmxlbmd0aDtmPGg7ZisrKUU9SFtmXSxFLmVsLmFwcGVuZFRvKGUuc2VnQ29udGFpbmVyRWwpO2ZvcihnPTAsYT10Lmxlbmd0aDtnPGE7ZysrKXtmb3IoUj10W2ddLGU9UlswXSxIPVJbMV0seT0wLGM9SC5sZW5ndGg7eTxjO3krKylFPUhbeV0sRS5oZWlnaHQ9RS5lbC5vdXRlckhlaWdodCghMCk7dGhpcy5idWlsZFNlZ0xldmVscyhIKSxlLnNlZ0NvbnRhaW5lckhlaWdodD10dChIKX1mb3IoQz1bXSx2PTAscD10Lmxlbmd0aDt2PHA7disrKXtmb3IoYj10W3ZdLGU9YlswXSxIPWJbMV0sdz0wLGQ9SC5sZW5ndGg7dzxkO3crKylFPUhbd10sRS5lbC5jc3MoInRvcCIsRS50b3ApO0MucHVzaChlLnNlZ0NvbnRhaW5lckVsLmhlaWdodChlLnNlZ0NvbnRhaW5lckhlaWdodCkpfXJldHVybiBDfSxvLnByb3RvdHlwZS5idWlsZFNlZ0xldmVscz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihkPVtdLHRoaXMuc29ydEV2ZW50U2Vncyh0KSxvPTAsbj10Lmxlbmd0aDtvPG47bysrKXtmb3IoZj10W29dLGYuYWJvdmU9W10saD0wO2g8ZC5sZW5ndGg7KXtmb3Iocj0hMSxjPWRbaF0scz0wLGw9Yy5sZW5ndGg7czxsO3MrKylhPWNbc10sUHQoZixhKSYmKGYuYWJvdmUucHVzaChhKSxyPSEwKTtpZighcilicmVhaztoKz0xfWZvcigoZFtoXXx8KGRbaF09W10pKS5wdXNoKGYpLGgrPTE7aDxkLmxlbmd0aDspe2ZvcihwPWRbaF0saT0wLHU9cC5sZW5ndGg7aTx1O2krKyllPXBbaV0sUHQoZixlKSYmZS5hYm92ZS5wdXNoKGYpO2grPTF9fXJldHVybiBkfSxvLnByb3RvdHlwZS51bnJlbmRlckZnQ29udGFpbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3Iocz1bXSxyPTAsbz10Lmxlbmd0aDtyPG87cisrKWU9dFtyXSxlLnNlZ0NvbnRhaW5lckVsLmVtcHR5KCksZS5zZWdDb250YWluZXJFbC5oZWlnaHQoIiIpLHMucHVzaChlLnNlZ0NvbnRhaW5lckhlaWdodD1udWxsKTtyZXR1cm4gc30sby5wcm90b3R5cGUuZmdTZWdIdG1sPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbyxzLGksbixsO3JldHVybiBvPXQuZXZlbnQscz10aGlzLnZpZXcuaXNFdmVudERyYWdnYWJsZShvKSxuPXQuaXNTdGFydCYmdGhpcy52aWV3LmlzRXZlbnRSZXNpemFibGVGcm9tU3RhcnQobyksaT10LmlzRW5kJiZ0aGlzLnZpZXcuaXNFdmVudFJlc2l6YWJsZUZyb21FbmQobykscj10aGlzLmdldFNlZ0NsYXNzZXModCxzLG58fGkpLHIudW5zaGlmdCgiZmMtdGltZWxpbmUtZXZlbnQiLCJmYy1oLWV2ZW50IiksbD10aGlzLmdldEV2ZW50VGltZVRleHQobyksJzxhIGNsYXNzPSInK3Iuam9pbigiICIpKyciIHN0eWxlPSInK3J0KHRoaXMuZ2V0U2VnU2tpbkNzcyh0KSkrJyInKyhvLnVybD8nIGhyZWY9IicreXQoby51cmwpKyciJzoiIikrJz48ZGl2IGNsYXNzPSJmYy1jb250ZW50Ij4nKyhsPyc8c3BhbiBjbGFzcz0iZmMtdGltZSI+Jyt5dChsKSsiPC9zcGFuPiI6IiIpKyc8c3BhbiBjbGFzcz0iZmMtdGl0bGUiPicrKG8udGl0bGU/eXQoby50aXRsZSk6IiZuYnNwOyIpKyc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0iZmMtYmciIC8+Jysobj8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1zdGFydC1yZXNpemVyIj48L2Rpdj4nOiIiKSsoaT8nPGRpdiBjbGFzcz0iZmMtcmVzaXplciBmYy1lbmQtcmVzaXplciI+PC9kaXY+JzoiIikrIjwvYT4ifSxvLnByb3RvdHlwZS51cGRhdGVTZWdGb2xsb3dlcnM9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaTtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcil7Zm9yKHM9W10sZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylvPXRbZV0saT1vLmVsLmZpbmQoIi5mYy10aXRsZSIpLGkubGVuZ3RoJiZzLnB1c2gobmV3IFAoaSkpO3JldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5zZXRTcHJpdGVzKHMpfX0sby5wcm90b3R5cGUuY2xlYXJTZWdGb2xsb3dlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLmV2ZW50VGl0bGVGb2xsb3dlcilyZXR1cm4gdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCl9LG8ucHJvdG90eXBlLnNlZ0RyYWdTdGFydD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdTdGFydC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmZvcmNlUmVsYXRpdmUoKX0sby5wcm90b3R5cGUuc2VnRHJhZ0VuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ0RyYWdFbmQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5jbGVhckZvcmNlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZVN0YXJ0PWZ1bmN0aW9uKCl7aWYoby5fX3N1cGVyX18uc2VnUmVzaXplU3RhcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyKXJldHVybiB0aGlzLmV2ZW50VGl0bGVGb2xsb3dlci5mb3JjZVJlbGF0aXZlKCl9LG8ucHJvdG90eXBlLnNlZ1Jlc2l6ZUVuZD1mdW5jdGlvbigpe2lmKG8uX19zdXBlcl9fLnNlZ1Jlc2l6ZUVuZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5ldmVudFRpdGxlRm9sbG93ZXIpcmV0dXJuIHRoaXMuZXZlbnRUaXRsZUZvbGxvd2VyLmNsZWFyRm9yY2UoKX0sby5wcm90b3R5cGUucmVuZGVySGVscGVyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5ldmVudFRvU2Vncyh0KSxyPXRoaXMucmVuZGVyRmdTZWdFbHMociksdGhpcy5yZW5kZXJIZWxwZXJTZWdzSW5Db250YWluZXJzKFtbdGhpcyxyXV0sZSl9LG8ucHJvdG90eXBlLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnM9ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGksbixsLHUsaCxhLGMscCxkLGYsZyx5LHYsdyxtLFM7Zm9yKG49W10sbT1bXSxsPTAsYT1lLmxlbmd0aDtsPGE7bCsrKWZvcihnPWVbbF0sbz1nWzBdLFM9Z1sxXSx1PTAsYz1TLmxlbmd0aDt1PGM7dSsrKXc9U1t1XSxzPXRoaXMucmFuZ2VUb0Nvb3Jkcyh3KSx3LmVsLmNzcyh7bGVmdDp3LmxlZnQ9cy5sZWZ0LHJpZ2h0Oi0ody5yaWdodD1zLnJpZ2h0KX0pLHImJnIucmVzb3VyY2VJZD09PShudWxsIT0oeT1vLnJlc291cmNlKT95LmlkOnZvaWQgMCk/dy5lbC5jc3MoInRvcCIsci5lbC5jc3MoInRvcCIpKTp3LmVsLmNzcygidG9wIiwwKTtmb3IoaD0wLHA9ZS5sZW5ndGg7aDxwO2grKylmb3Iodj1lW2hdLG89dlswXSxTPXZbMV0saT10KCc8ZGl2IGNsYXNzPSJmYy1ldmVudC1jb250YWluZXIgZmMtaGVscGVyLWNvbnRhaW5lciIvPicpLmFwcGVuZFRvKG8uaW5uZXJFbCksbi5wdXNoKGlbMF0pLGY9MCxkPVMubGVuZ3RoO2Y8ZDtmKyspdz1TW2ZdLGkuYXBwZW5kKHcuZWwpLG0ucHVzaCh3LmVsWzBdKTtyZXR1cm4gdGhpcy5oZWxwZXJFbHM/dGhpcy5oZWxwZXJFbHM9dGhpcy5oZWxwZXJFbHMuYWRkKHQobikpOnRoaXMuaGVscGVyRWxzPXQobiksdChtKX0sby5wcm90b3R5cGUudW5yZW5kZXJIZWxwZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmhlbHBlckVscylyZXR1cm4gdGhpcy5oZWxwZXJFbHMucmVtb3ZlKCksdGhpcy5oZWxwZXJFbHM9bnVsbH0sby5wcm90b3R5cGUucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWdobGlnaHQodGhpcy5ldmVudFRvU3Bhbih0KSksdGhpcy5yZW5kZXJFdmVudExvY2F0aW9uSGVscGVyKHQsZSl9LG8ucHJvdG90eXBlLnVucmVuZGVyRXZlbnRSZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnJlbmRlckhpZ2hsaWdodCgpLHRoaXMudW5yZW5kZXJIZWxwZXIoKX0sby5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKHQsZSksdGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXJzKHQsW1t0aGlzLGVdXSxyKSxlfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXJzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxzLGksbixsLHU7Zm9yKGw9W10scz0wLGk9ZS5sZW5ndGg7czxpO3MrKyluPWVbc10sbz1uWzBdLHU9blsxXSxsLnB1c2godGhpcy5yZW5kZXJGaWxsSW5Db250YWluZXIodCxvLHUscikpO3JldHVybiBsfSxvLnByb3RvdHlwZS5yZW5kZXJGaWxsSW5Db250YWluZXI9ZnVuY3Rpb24oZSxyLG8scyl7dmFyIGksbixsLHUsaDtpZihvLmxlbmd0aCl7Zm9yKHN8fChzPWUudG9Mb3dlckNhc2UoKSksaT10KCc8ZGl2IGNsYXNzPSJmYy0nK3MrJy1jb250YWluZXIiIC8+JykuYXBwZW5kVG8oci5iZ1NlZ0NvbnRhaW5lckVsKSxsPTAsdT1vLmxlbmd0aDtsPHU7bCsrKWg9b1tsXSxuPXRoaXMucmFuZ2VUb0Nvb3JkcyhoKSxoLmVsLmNzcyh7bGVmdDpoLmxlZnQ9bi5sZWZ0LHJpZ2h0Oi0oaC5yaWdodD1uLnJpZ2h0KX0pLGguZWwuYXBwZW5kVG8oaSk7cmV0dXJuIHRoaXMuZWxzQnlGaWxsW2VdP3RoaXMuZWxzQnlGaWxsW2VdPXRoaXMuZWxzQnlGaWxsW2VdLmFkZChpKTp0aGlzLmVsc0J5RmlsbFtlXT1pfX0sby5wcm90b3R5cGUucmVuZGVyRHJhZz1mdW5jdGlvbih0LGUpe3JldHVybiBlP3RoaXMucmVuZGVyRXZlbnRMb2NhdGlvbkhlbHBlcih0LGUpOih0aGlzLnJlbmRlckhpZ2hsaWdodCh0aGlzLmV2ZW50VG9TcGFuKHQpKSxudWxsKX0sby5wcm90b3R5cGUudW5yZW5kZXJEcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5yZW5kZXJIZWxwZXIoKSx0aGlzLnVucmVuZGVySGlnaGxpZ2h0KCl9LG99KGYpLHR0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihvPTAsZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylzPXRbZV0sbz1NYXRoLm1heChvLFoocykpO3JldHVybiBvfSxaPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LnRvcCYmKHQudG9wPXR0KHQuYWJvdmUpKSx0LnRvcCt0LmhlaWdodH0sUHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZWZ0PGUucmlnaHQmJnQucmlnaHQ+ZS5sZWZ0fSxSPTE4LG09Nix3PTIwMCxTPTFlMyx1PXttb250aHM6MX0saz1be3llYXJzOjF9LHttb250aHM6MX0se2RheXM6MX0se2hvdXJzOjF9LHttaW51dGVzOjMwfSx7bWludXRlczoxNX0se21pbnV0ZXM6MTB9LHttaW51dGVzOjV9LHttaW51dGVzOjF9LHtzZWNvbmRzOjMwfSx7c2Vjb25kczoxNX0se3NlY29uZHM6MTB9LHtzZWNvbmRzOjV9LHtzZWNvbmRzOjF9LHttaWxsaXNlY29uZHM6NTAwfSx7bWlsbGlzZWNvbmRzOjEwMH0se21pbGxpc2Vjb25kczoxMH0se21pbGxpc2Vjb25kczoxfV0sTi5wcm90b3R5cGUuaW5pdFNjYWxlUHJvcHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG87cmV0dXJuIHRoaXMubGFiZWxJbnRlcnZhbD10aGlzLnF1ZXJ5RHVyYXRpb25PcHRpb24oInNsb3RMYWJlbEludGVydmFsIiksdGhpcy5zbG90RHVyYXRpb249dGhpcy5xdWVyeUR1cmF0aW9uT3B0aW9uKCJzbG90RHVyYXRpb24iKSx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMudmFsaWRhdGVMYWJlbEFuZFNsb3QoKSx0aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSx0aGlzLmVuc3VyZVNsb3REdXJhdGlvbigpLGU9dGhpcy5vcHQoInNsb3RMYWJlbEZvcm1hdCIpLG89dC50eXBlKGUpLHRoaXMuaGVhZGVyRm9ybWF0cz0iYXJyYXkiPT09bz9lOiJzdHJpbmciPT09bz9bZV06dGhpcy5jb21wdXRlSGVhZGVyRm9ybWF0cygpLHRoaXMuaXNUaW1lU2NhbGU9bHQodGhpcy5zbG90RHVyYXRpb24pLHRoaXMubGFyZ2VVbml0PXRoaXMuaXNUaW1lU2NhbGU/dm9pZCAwOihyPUoodGhpcy5zbG90RHVyYXRpb24pLC95ZWFyfG1vbnRofHdlZWsvLnRlc3Qocik/cjp2b2lkIDApLHRoaXMuZW1waGFzaXplV2Vla3M9MT09PXRoaXMuc2xvdER1cmF0aW9uLmFzKCJkYXlzIikmJnRoaXMuZHVyYXRpb24uYXMoIndlZWtzIik+PTImJiF0aGlzLm9wdCgiYnVzaW5lc3NIb3VycyIpfSxOLnByb3RvdHlwZS5xdWVyeUR1cmF0aW9uT3B0aW9uPWZ1bmN0aW9uKHQpe3ZhciByLG87aWYobz10aGlzLm9wdCh0KSxudWxsIT1vJiYocj1lLmR1cmF0aW9uKG8pLCtyKSlyZXR1cm4gcn0sTi5wcm90b3R5cGUudmFsaWRhdGVMYWJlbEFuZFNsb3Q9ZnVuY3Rpb24oKXt2YXIgdCxlLHI7aWYodGhpcy5sYWJlbEludGVydmFsJiYodD1pdCh0aGlzLmR1cmF0aW9uLHRoaXMubGFiZWxJbnRlcnZhbCksdD5TJiYoZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCByZXN1bHRzIGluIHRvbyBtYW55IGNlbGxzIiksdGhpcy5sYWJlbEludGVydmFsPW51bGwpKSx0aGlzLnNsb3REdXJhdGlvbiYmKGU9aXQodGhpcy5kdXJhdGlvbix0aGlzLnNsb3REdXJhdGlvbiksZT5TJiYoZC53YXJuKCJzbG90RHVyYXRpb24gcmVzdWx0cyBpbiB0b28gbWFueSBjZWxscyIpLHRoaXMuc2xvdER1cmF0aW9uPW51bGwpKSx0aGlzLmxhYmVsSW50ZXJ2YWwmJnRoaXMuc2xvdER1cmF0aW9uJiYocj1pdCh0aGlzLmxhYmVsSW50ZXJ2YWwsdGhpcy5zbG90RHVyYXRpb24pLCFTdChyKXx8cjwxKSlyZXR1cm4gZC53YXJuKCJzbG90TGFiZWxJbnRlcnZhbCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2xvdER1cmF0aW9uIiksdGhpcy5zbG90RHVyYXRpb249bnVsbH0sTi5wcm90b3R5cGUuZW5zdXJlR3JpZER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaTtpZih0PXRoaXMuZHVyYXRpb24sIXQpe2lmKHQ9dGhpcy52aWV3LmludGVydmFsRHVyYXRpb24sIXQpaWYodGhpcy5sYWJlbEludGVydmFsfHx0aGlzLnNsb3REdXJhdGlvbilmb3IoaT10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxvPWsubGVuZ3RoLTE7bz49MCYmKHI9a1tvXSx0PWUuZHVyYXRpb24ocikscz1pdCh0LGkpLCEocz49UikpO28rPS0xKTtlbHNlIHQ9ZS5kdXJhdGlvbih1KTt0aGlzLmR1cmF0aW9uPXR9cmV0dXJuIHR9LE4ucHJvdG90eXBlLmVuc3VyZUxhYmVsSW50ZXJ2YWw9ZnVuY3Rpb24oKXt2YXIgdCxyLG8scyxpLG4sbCx1LGg7aWYoaT10aGlzLmxhYmVsSW50ZXJ2YWwsIWkpe2lmKHRoaXMuZHVyYXRpb258fHRoaXMuc2xvdER1cmF0aW9ufHx0aGlzLmVuc3VyZUdyaWREdXJhdGlvbigpLHRoaXMuc2xvdER1cmF0aW9uKXtmb3Iocj0wLG49ay5sZW5ndGg7cjxuO3IrKylpZih0PWtbcl0saD1lLmR1cmF0aW9uKHQpLHU9aXQoaCx0aGlzLnNsb3REdXJhdGlvbiksU3QodSkmJnU8PW0pe2k9aDticmVha31pfHwoaT10aGlzLnNsb3REdXJhdGlvbil9ZWxzZSBmb3Iobz0wLGw9ay5sZW5ndGg7bzxsJiYodD1rW29dLGk9ZS5kdXJhdGlvbih0KSxzPWl0KHRoaXMuZHVyYXRpb24saSksIShzPj1SKSk7bysrKTt0aGlzLmxhYmVsSW50ZXJ2YWw9aX1yZXR1cm4gaX0sTi5wcm90b3R5cGUuZW5zdXJlU2xvdER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQscixvLHMsaSxuLGwsdTtpZihuPXRoaXMuc2xvdER1cmF0aW9uLCFuKXtmb3Iobz10aGlzLmVuc3VyZUxhYmVsSW50ZXJ2YWwoKSxyPTAscz1rLmxlbmd0aDtyPHM7cisrKWlmKHQ9a1tyXSx1PWUuZHVyYXRpb24odCksbD1pdChvLHUpLFN0KGwpJiZsPjEmJmw8PW0pe249dTticmVha31uJiZ0aGlzLmR1cmF0aW9uJiYoaT1pdCh0aGlzLmR1cmF0aW9uLG4pLGk+dyYmKG49bnVsbCkpLG58fChuPW8pLHRoaXMuc2xvdER1cmF0aW9uPW59cmV0dXJuIG59LE4ucHJvdG90eXBlLmNvbXB1dGVIZWFkZXJGb3JtYXRzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbDtzd2l0Y2gobj10aGlzLnZpZXcsbz10aGlzLmR1cmF0aW9uLHM9dGhpcy5sYWJlbEludGVydmFsLGk9SihzKSxsPXRoaXMub3B0KCJ3ZWVrTnVtYmVycyIpLHQ9ZT1yPW51bGwsIndlZWsiIT09aXx8bHx8KGk9ImRheSIpLGkpe2Nhc2UieWVhciI6dD0iWVlZWSI7YnJlYWs7Y2FzZSJtb250aCI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPSJNTU0iO2JyZWFrO2Nhc2Uid2VlayI6by5hc1llYXJzKCk+MSYmKHQ9IllZWVkiKSxlPXRoaXMub3B0KCJzaG9ydFdlZWtGb3JtYXQiKTticmVhaztjYXNlImRheSI6by5hc1llYXJzKCk+MT90PXRoaXMub3B0KCJtb250aFllYXJGb3JtYXQiKTpvLmFzTW9udGhzKCk+MSYmKHQ9Ik1NTU0iKSxsJiYoZT10aGlzLm9wdCgid2Vla0Zvcm1hdCIpKSxyPSJkZCBEIjticmVhaztjYXNlImhvdXIiOmwmJih0PXRoaXMub3B0KCJ3ZWVrRm9ybWF0IikpLG8uYXNEYXlzKCk+MSYmKGU9dGhpcy5vcHQoImRheU9mTW9udGhGb3JtYXQiKSkscj10aGlzLm9wdCgic21hbGxUaW1lRm9ybWF0Iik7YnJlYWs7Y2FzZSJtaW51dGUiOnMuYXNNaW51dGVzKCkvNjA+PW0/KHQ9dGhpcy5vcHQoImhvdXJGb3JtYXQiKSxlPSJbOl1tbSIpOnQ9dGhpcy5vcHQoIm1lZGl1bVRpbWVGb3JtYXQiKTticmVhaztjYXNlInNlY29uZCI6cy5hc1NlY29uZHMoKS82MD49bT8odD0iTFQiLGU9Ils6XXNzIik6dD0iTFRTIjticmVhaztjYXNlIm1pbGxpc2Vjb25kIjp0PSJMVFMiLGU9IlsuXVNTUyJ9cmV0dXJuW10uY29uY2F0KHR8fFtdLGV8fFtdLHJ8fFtdKX0sZC52aWV3cy50aW1lbGluZT17ImNsYXNzIjpqLGRlZmF1bHRzOntldmVudFJlc2l6YWJsZUZyb21TdGFydDohMH19LGQudmlld3MudGltZWxpbmVEYXk9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7ZGF5czoxfX0sZC52aWV3cy50aW1lbGluZVdlZWs9e3R5cGU6InRpbWVsaW5lIixkdXJhdGlvbjp7d2Vla3M6MX19LGQudmlld3MudGltZWxpbmVNb250aD17dHlwZToidGltZWxpbmUiLGR1cmF0aW9uOnttb250aHM6MX19LGQudmlld3MudGltZWxpbmVZZWFyPXt0eXBlOiJ0aW1lbGluZSIsZHVyYXRpb246e3llYXJzOjF9fSxNPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIubWl4aW4oVyksci5wcm90b3R5cGUucmVzb3VyY2VHcmlkPW51bGwsci5wcm90b3R5cGUudGJvZHlIYXNoPW51bGwsci5wcm90b3R5cGUuam9pbmVyPW51bGwsci5wcm90b3R5cGUuZGl2aWRlckVscz1udWxsLHIucHJvdG90eXBlLnN1cGVySGVhZGVyVGV4dD1udWxsLHIucHJvdG90eXBlLmlzVkdyb3VwaW5nPW51bGwsci5wcm90b3R5cGUuaXNIR3JvdXBpbmc9bnVsbCxyLnByb3RvdHlwZS5ncm91cFNwZWNzPW51bGwsci5wcm90b3R5cGUuY29sU3BlY3M9bnVsbCxyLnByb3RvdHlwZS5vcmRlclNwZWNzPW51bGwsci5wcm90b3R5cGUucm93SGllcmFyY2h5PW51bGwsci5wcm90b3R5cGUucmVzb3VyY2VSb3dIYXNoPW51bGwsci5wcm90b3R5cGUubmVzdGluZ0NudD0wLHIucHJvdG90eXBlLmlzTmVzdGluZz1udWxsLHIucHJvdG90eXBlLmRpdmlkZXJXaWR0aD1udWxsLHIucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wcm9jZXNzUmVzb3VyY2VPcHRpb25zKCksdGhpcy5yZXNvdXJjZUdyaWQ9bmV3IHEodGhpcyksdGhpcy5yb3dIaWVyYXJjaHk9bmV3IHoodGhpcyksdGhpcy5yZXNvdXJjZVJvd0hhc2g9e319LHIucHJvdG90eXBlLmluc3RhbnRpYXRlR3JpZD1mdW5jdGlvbigpe3JldHVybiBuZXcgRyh0aGlzKX0sci5wcm90b3R5cGUucHJvY2Vzc1Jlc291cmNlT3B0aW9ucz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHksdix3LG0sUyxSO2Zvcih0PXRoaXMub3B0KCJyZXNvdXJjZUNvbHVtbnMiKXx8W10sZj10aGlzLm9wdCgicmVzb3VyY2VMYWJlbFRleHQiKSxvPSJSZXNvdXJjZXMiLFI9bnVsbCx0Lmxlbmd0aD9SPWY6dC5wdXNoKHtsYWJlbFRleHQ6Znx8byx0ZXh0OnRoaXMuZ2V0UmVzb3VyY2VUZXh0RnVuYygpfSksbT1bXSxzPVtdLG49W10sYT0hMSxoPSExLGM9MCxnPXQubGVuZ3RoO2M8ZztjKyspcj10W2NdLHIuZ3JvdXA/cy5wdXNoKHIpOm0ucHVzaChyKTtmb3IobVswXS5pc01haW49ITAscy5sZW5ndGg/KG49cyxhPSEwKToobD10aGlzLm9wdCgicmVzb3VyY2VHcm91cEZpZWxkIiksbCYmKGg9ITAsbi5wdXNoKHtmaWVsZDpsLHRleHQ6dGhpcy5vcHQoInJlc291cmNlR3JvdXBUZXh0IikscmVuZGVyOnRoaXMub3B0KCJyZXNvdXJjZUdyb3VwUmVuZGVyIil9KSkpLGU9RnQodGhpcy5vcHQoInJlc291cmNlT3JkZXIiKSksUz1bXSxwPTAseT1lLmxlbmd0aDtwPHk7cCsrKXtmb3Iodz1lW3BdLHU9ITEsZD0wLHY9bi5sZW5ndGg7ZDx2O2QrKylpZihpPW5bZF0saS5maWVsZD09PXcuZmllbGQpe2kub3JkZXI9dy5vcmRlcix1PSEwO2JyZWFrfXV8fFMucHVzaCh3KX1yZXR1cm4gdGhpcy5zdXBlckhlYWRlclRleHQ9Uix0aGlzLmlzVkdyb3VwaW5nPWEsdGhpcy5pc0hHcm91cGluZz1oLHRoaXMuZ3JvdXBTcGVjcz1uLHRoaXMuY29sU3BlY3M9cy5jb25jYXQobSksdGhpcy5vcmRlclNwZWNzPVN9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlclNrZWxldG9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlbmRlclJlc291cmNlR3JpZFNrZWxldG9uKCksdGhpcy50Ym9keUhhc2g9e3NwcmVhZHNoZWV0OnRoaXMucmVzb3VyY2VHcmlkLnRib2R5RWwsZXZlbnQ6dGhpcy50aW1lR3JpZC50Ym9keUVsfSx0aGlzLmpvaW5lcj1uZXcgQSgidmVydGljYWwiLFt0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIsdGhpcy50aW1lR3JpZC5ib2R5U2Nyb2xsZXJdKSx0aGlzLmluaXREaXZpZGVyTW92aW5nKCl9LHIucHJvdG90eXBlLnJlbmRlclNrZWxldG9uSHRtbD1mdW5jdGlvbigpe3JldHVybic8dGFibGU+IDx0aGVhZCBjbGFzcz0iZmMtaGVhZCI+IDx0cj4gPHRkIGNsYXNzPSJmYy1yZXNvdXJjZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8dGQgY2xhc3M9ImZjLWRpdmlkZXIgZmMtY29sLXJlc2l6ZXIgJyt0aGlzLndpZGdldEhlYWRlckNsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtdGltZS1hcmVhICcrdGhpcy53aWRnZXRIZWFkZXJDbGFzcysnIj48L3RkPiA8L3RyPiA8L3RoZWFkPiA8dGJvZHkgY2xhc3M9ImZjLWJvZHkiPiA8dHI+IDx0ZCBjbGFzcz0iZmMtcmVzb3VyY2UtYXJlYSAnK3RoaXMud2lkZ2V0Q29udGVudENsYXNzKyciPjwvdGQ+IDx0ZCBjbGFzcz0iZmMtZGl2aWRlciBmYy1jb2wtcmVzaXplciAnK3RoaXMud2lkZ2V0SGVhZGVyQ2xhc3MrJyI+PC90ZD4gPHRkIGNsYXNzPSJmYy10aW1lLWFyZWEgJyt0aGlzLndpZGdldENvbnRlbnRDbGFzcysnIj48L3RkPiA8L3RyPiA8L3Rib2R5PiA8L3RhYmxlPic7Cn0sci5wcm90b3R5cGUucmVuZGVyUmVzb3VyY2VHcmlkU2tlbGV0b249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNvdXJjZUdyaWQuZWw9dGhpcy5lbC5maW5kKCJ0Ym9keSAuZmMtcmVzb3VyY2UtYXJlYSIpLHRoaXMucmVzb3VyY2VHcmlkLmhlYWRFbD10aGlzLmVsLmZpbmQoInRoZWFkIC5mYy1yZXNvdXJjZS1hcmVhIiksdGhpcy5yZXNvdXJjZUdyaWQucmVuZGVyU2tlbGV0b24oKX0sci5wcm90b3R5cGUuaW5pdERpdmlkZXJNb3Zpbmc9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5kaXZpZGVyRWxzPXRoaXMuZWwuZmluZCgiLmZjLWRpdmlkZXIiKSx0aGlzLmRpdmlkZXJXaWR0aD1udWxsIT0odD10aGlzLm9wdCgicmVzb3VyY2VBcmVhV2lkdGgiKSk/dDp0aGlzLnJlc291cmNlR3JpZC50YWJsZVdpZHRoLG51bGwhPXRoaXMuZGl2aWRlcldpZHRoJiZ0aGlzLnBvc2l0aW9uRGl2aWRlcih0aGlzLmRpdmlkZXJXaWR0aCksdGhpcy5kaXZpZGVyRWxzLm9uKCJtb3VzZWRvd24iLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5kaXZpZGVyTW91c2Vkb3duKGUpfX0odGhpcykpfSxyLnByb3RvdHlwZS5kaXZpZGVyTW91c2Vkb3duPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzLGk7cmV0dXJuIHI9dGhpcy5vcHQoImlzUlRMIikscz0zMCxvPXRoaXMuZWwud2lkdGgoKS0zMCxpPXRoaXMuZ2V0TmF0dXJhbERpdmlkZXJXaWR0aCgpLGU9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5kaXZpZGVyRWxzLmFkZENsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpLGRyYWc6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGw7cmV0dXJuIGw9cj9pLWU6aStlLGw9TWF0aC5tYXgobCxzKSxsPU1hdGgubWluKGwsbyksdC5kaXZpZGVyV2lkdGg9bCx0LnBvc2l0aW9uRGl2aWRlcihsKSx0LnVwZGF0ZVdpZHRoKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmRpdmlkZXJFbHMucmVtb3ZlQ2xhc3MoImZjLWFjdGl2ZSIpfX0odGhpcyl9KSxlLnN0YXJ0SW50ZXJhY3Rpb24odCl9LHIucHJvdG90eXBlLmdldE5hdHVyYWxEaXZpZGVyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKCl9LHIucHJvdG90eXBlLnBvc2l0aW9uRGl2aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbC5maW5kKCIuZmMtcmVzb3VyY2UtYXJlYSIpLndpZHRoKHQpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQucmVuZGVyRXZlbnRzKHQpLHRoaXMuc3luY1Jvd0hlaWdodHMoKSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnVucmVuZGVyRXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZUdyaWQudW5yZW5kZXJFdmVudHMoKSx0aGlzLnN5bmNSb3dIZWlnaHRzKCksdGhpcy51cGRhdGVXaWR0aCgpfSxyLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZVdpZHRoLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC51cGRhdGVXaWR0aCgpLHRoaXMuam9pbmVyLnVwZGF0ZSgpLHRoaXMuY2VsbEZvbGxvd2VyKXJldHVybiB0aGlzLmNlbGxGb2xsb3dlci51cGRhdGUoKX0sci5wcm90b3R5cGUudXBkYXRlSGVpZ2h0PWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnVwZGF0ZUhlaWdodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdClyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cygpfSxyLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvO3JldHVybiBvPXRoaXMuc3luY0hlYWRIZWlnaHRzKCkscj1lPyJhdXRvIjp0LW8tdGhpcy5xdWVyeU1pc2NIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5zZXRIZWlnaHQociksdGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLnNldEhlaWdodChyKX0sci5wcm90b3R5cGUucXVlcnlNaXNjSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwub3V0ZXJIZWlnaHQoKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5oZWFkU2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKS1NYXRoLm1heCh0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuZWwub3V0ZXJIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmJvZHlTY3JvbGxlci5lbC5vdXRlckhlaWdodCgpKX0sci5wcm90b3R5cGUuc3luY0hlYWRIZWlnaHRzPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoImF1dG8iKSx0PU1hdGgubWF4KHRoaXMucmVzb3VyY2VHcmlkLmhlYWRIZWlnaHQoKSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQoKSksdGhpcy5yZXNvdXJjZUdyaWQuaGVhZEhlaWdodCh0KSx0aGlzLnRpbWVHcmlkLmhlYWRIZWlnaHQodCksdH0sci5wcm90b3R5cGUuc2Nyb2xsVG9SZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aW1lR3JpZC5zY3JvbGxUb1Jlc291cmNlKHQpfSxyLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7dmFyIGUscixvO2Zvcih0aGlzLmJhdGNoUm93cygpLGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspbz10W2VdLHRoaXMuaW5zZXJ0UmVzb3VyY2Uobyk7cmV0dXJuIHRoaXMucm93SGllcmFyY2h5LnNob3coKSx0aGlzLnVuYmF0Y2hSb3dzKCksdGhpcy5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzKCl9LHIucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmJhdGNoUm93cygpLHRoaXMucm93SGllcmFyY2h5LnJlbW92ZUNoaWxkcmVuKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5hZGRSZXNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnNlcnRSZXNvdXJjZSh0KSx0aGlzLnJlaW5pdGlhbGl6ZUNlbGxGb2xsb3dlcnMoKX0sci5wcm90b3R5cGUucmVtb3ZlUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGU7aWYoZT10aGlzLmdldFJlc291cmNlUm93KHQuaWQpKXJldHVybiB0aGlzLmJhdGNoUm93cygpLGUucmVtb3ZlKCksdGhpcy51bmJhdGNoUm93cygpLHRoaXMucmVpbml0aWFsaXplQ2VsbEZvbGxvd2VycygpfSxyLnByb3RvdHlwZS5jZWxsRm9sbG93ZXI9bnVsbCxyLnByb3RvdHlwZS5yZWluaXRpYWxpemVDZWxsRm9sbG93ZXJzPWZ1bmN0aW9uKCl7dmFyIGUscixvLHMsaSxuO2Zvcih0aGlzLmNlbGxGb2xsb3dlciYmdGhpcy5jZWxsRm9sbG93ZXIuY2xlYXJTcHJpdGVzKCksdGhpcy5jZWxsRm9sbG93ZXI9bmV3IFYodGhpcy5yZXNvdXJjZUdyaWQuYm9keVNjcm9sbGVyLHRoaXMuY2FsZW5kYXIuaXNUb3VjaCksdGhpcy5jZWxsRm9sbG93ZXIuaXNIRm9sbG93aW5nPSExLHRoaXMuY2VsbEZvbGxvd2VyLmlzVkZvbGxvd2luZz0hMCxzPVtdLGk9dGhpcy5yb3dIaWVyYXJjaHkuZ2V0Tm9kZXMoKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKW49aVtyXSxuIGluc3RhbmNlb2YgVSYmbi5ncm91cFRkJiYoZT1uLmdyb3VwVGQuZmluZCgiLmZjLWNlbGwtY29udGVudCIpLGUubGVuZ3RoJiZzLnB1c2goZVswXSkpO3JldHVybiB0aGlzLmNlbGxGb2xsb3dlci5zZXRTcHJpdGVzKHQocykpfSxyLnByb3RvdHlwZS5pbnNlcnRSZXNvdXJjZT1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbCx1O2Zvcih1PW5ldyBCKHRoaXMsdCksbnVsbD09ZSYmKGk9dC5wYXJlbnRJZCxpJiYoZT10aGlzLmdldFJlc291cmNlUm93KGkpKSksZT90aGlzLmluc2VydFJvd0FzQ2hpbGQodSxlKTp0aGlzLmluc2VydFJvdyh1KSxuPXQuY2hpbGRyZW4sbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKXI9bltvXSxsLnB1c2godGhpcy5pbnNlcnRSZXNvdXJjZShyLHUpKTtyZXR1cm4gbH0sci5wcm90b3R5cGUuaW5zZXJ0Um93PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbztyZXR1cm4gbnVsbD09ZSYmKGU9dGhpcy5yb3dIaWVyYXJjaHkpLG51bGw9PXImJihyPXRoaXMuZ3JvdXBTcGVjcyksci5sZW5ndGg/KG89dGhpcy5lbnN1cmVSZXNvdXJjZUdyb3VwKHQsZSxyWzBdKSxvIGluc3RhbmNlb2YgZz90aGlzLmluc2VydFJvd0FzQ2hpbGQodCxvKTp0aGlzLmluc2VydFJvdyh0LG8sci5zbGljZSgxKSkpOnRoaXMuaW5zZXJ0Um93QXNDaGlsZCh0LGUpfSxyLnByb3RvdHlwZS5pbnNlcnRSb3dBc0NoaWxkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuYWRkQ2hpbGQodCx0aGlzLmNvbXB1dGVDaGlsZFJvd1Bvc2l0aW9uKHQsZSkpfSxyLnByb3RvdHlwZS5jb21wdXRlQ2hpbGRSb3dQb3NpdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByLG8scyxpLG4sbDtpZih0aGlzLm9yZGVyU3BlY3MubGVuZ3RoKWZvcihuPWUuY2hpbGRyZW4sbz1zPTAsaT1uLmxlbmd0aDtzPGk7bz0rK3MpaWYobD1uW29dLHI9dGhpcy5jb21wYXJlUmVzb3VyY2VzKGwucmVzb3VyY2V8fHt9LHQucmVzb3VyY2V8fHt9KSxyPjApcmV0dXJuIG87cmV0dXJuIG51bGx9LHIucHJvdG90eXBlLmNvbXBhcmVSZXNvdXJjZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUSh0LGUsdGhpcy5vcmRlclNwZWNzKX0sci5wcm90b3R5cGUuZW5zdXJlUmVzb3VyY2VHcm91cD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZDtpZihpPSh0LnJlc291cmNlfHx7fSlbci5maWVsZF0scz1udWxsLHIub3JkZXIpZm9yKGM9ZS5jaGlsZHJlbixuPWw9MCxoPWMubGVuZ3RoO2w8aDtuPSsrbCl7aWYoZD1jW25dLG89dXQoZC5ncm91cFZhbHVlLGkpKnIub3JkZXIsMD09PW8pe3M9ZDticmVha31pZihvPjApYnJlYWt9ZWxzZSBmb3IocD1lLmNoaWxkcmVuLG49dT0wLGE9cC5sZW5ndGg7dTxhO249Kyt1KWlmKGQ9cFtuXSxkLmdyb3VwVmFsdWU9PT1pKXtzPWQ7YnJlYWt9cmV0dXJuIHN8fChzPXRoaXMuaXNWR3JvdXBpbmc/bmV3IFUodGhpcyxyLGkpOm5ldyBnKHRoaXMscixpKSxlLmFkZENoaWxkKHMsbikpLHN9LHIucHJvdG90eXBlLnBhaXJTZWdzV2l0aFJvd3M9ZnVuY3Rpb24odCl7dmFyIGUscixvLHMsaSxuLGwsdTtmb3Iocz1bXSxpPXt9LGU9MCxyPXQubGVuZ3RoO2U8cjtlKyspdT10W2VdLG49dS5yZXNvdXJjZUlkLG4mJihsPXRoaXMuZ2V0UmVzb3VyY2VSb3cobiksbCYmKG89aVtuXSxvfHwobz1bbCxbXV0scy5wdXNoKG8pLGlbbl09byksb1sxXS5wdXNoKHUpKSk7cmV0dXJuIHN9LHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe3ZhciBlLHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBCJiYodGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF09dCx0aGlzLnRpbWVHcmlkLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3ModCkpLHI9dGhpcy5pc05lc3RpbmcsZT1Cb29sZWFuKHRoaXMubmVzdGluZ0NudCs9dC5kZXB0aD8xOjApLHIhPT1lJiYodGhpcy5lbC50b2dnbGVDbGFzcygiZmMtbmVzdGVkIixlKSx0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1mbGF0IiwhZSkpLHRoaXMuaXNOZXN0aW5nPWV9LHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7dmFyIGUscjtyZXR1cm4gdCBpbnN0YW5jZW9mIEImJihkZWxldGUgdGhpcy5yZXNvdXJjZVJvd0hhc2hbdC5yZXNvdXJjZS5pZF0sdGhpcy50aW1lR3JpZC5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncyh0KSkscj10aGlzLmlzTmVzdGluZyxlPUJvb2xlYW4odGhpcy5uZXN0aW5nQ250LT10LmRlcHRoPzE6MCksciE9PWUmJih0aGlzLmVsLnRvZ2dsZUNsYXNzKCJmYy1uZXN0ZWQiLGUpLHRoaXMuZWwudG9nZ2xlQ2xhc3MoImZjLWZsYXQiLCFlKSksdGhpcy5pc05lc3Rpbmc9ZX0sci5wcm90b3R5cGUuYmF0Y2hSb3dEZXB0aD0wLHIucHJvdG90eXBlLnNob3duUm93QmF0Y2g9bnVsbCxyLnByb3RvdHlwZS5oaWRkZW5Sb3dCYXRjaD1udWxsLHIucHJvdG90eXBlLmJhdGNoUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLmJhdGNoUm93RGVwdGgrKylyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoPVtdLHRoaXMuaGlkZGVuUm93QmF0Y2g9W119LHIucHJvdG90eXBlLnVuYmF0Y2hSb3dzPWZ1bmN0aW9uKCl7aWYoIS0tdGhpcy5iYXRjaFJvd0RlcHRoKXJldHVybiB0aGlzLmhpZGRlblJvd0JhdGNoLmxlbmd0aCYmdGhpcy5yb3dzSGlkZGVuKHRoaXMuaGlkZGVuUm93QmF0Y2gpLHRoaXMuc2hvd25Sb3dCYXRjaC5sZW5ndGgmJnRoaXMucm93c1Nob3duKHRoaXMuc2hvd25Sb3dCYXRjaCksdGhpcy5oaWRkZW5Sb3dCYXRjaD1udWxsLHRoaXMuc2hvd25Sb3dCYXRjaD1udWxsfSxyLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zaG93blJvd0JhdGNoP3RoaXMuc2hvd25Sb3dCYXRjaC5wdXNoKHQpOnRoaXMucm93c1Nob3duKFt0XSl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oaWRkZW5Sb3dCYXRjaD90aGlzLmhpZGRlblJvd0JhdGNoLnB1c2godCk6dGhpcy5yb3dzSGlkZGVuKFt0XSl9LHIucHJvdG90eXBlLnJvd3NTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zeW5jUm93SGVpZ2h0cyh0KSx0aGlzLnVwZGF0ZVdpZHRoKCl9LHIucHJvdG90eXBlLnJvd3NIaWRkZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV2lkdGgoKX0sci5wcm90b3R5cGUuc3luY1Jvd0hlaWdodHM9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuLGwsdSxoLGEsYztmb3IobnVsbD09ZSYmKGU9ITEpLG51bGw9PXQmJih0PXRoaXMuZ2V0VmlzaWJsZVJvd3MoKSksbD0wLGg9dC5sZW5ndGg7bDxoO2wrKyljPXRbbF0sYy5zZXRUcklubmVySGVpZ2h0KCIiKTtmb3Iobj1mdW5jdGlvbigpe3ZhciBvLHMsaTtmb3IoaT1bXSxvPTAscz10Lmxlbmd0aDtvPHM7bysrKWM9dFtvXSxyPWMuZ2V0TWF4VHJJbm5lckhlaWdodCgpLGUmJihyKz1yJTIpLGkucHVzaChyKTtyZXR1cm4gaX0oKSxpPXU9MCxhPXQubGVuZ3RoO3U8YTtpPSsrdSljPXRbaV0sYy5zZXRUcklubmVySGVpZ2h0KG5baV0pO2lmKCFlJiYobz10aGlzLnJlc291cmNlR3JpZC50Ym9keUVsLmhlaWdodCgpLHM9dGhpcy50aW1lR3JpZC50Ym9keUVsLmhlaWdodCgpLE1hdGguYWJzKG8tcyk+MSkpcmV0dXJuIHRoaXMuc3luY1Jvd0hlaWdodHModCwhMCl9LHIucHJvdG90eXBlLmdldFZpc2libGVSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmlzU2hvd24mJm8ucHVzaChzKTtyZXR1cm4gb30sci5wcm90b3R5cGUuZ2V0RXZlbnRSb3dzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnJvd0hpZXJhcmNoeS5nZXRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzIGluc3RhbmNlb2YgcCYmby5wdXNoKHMpO3JldHVybiBvfSxyLnByb3RvdHlwZS5nZXRSZXNvdXJjZVJvdz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVJvd0hhc2hbdF19LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXtyZXR1cm4gci5fX3N1cGVyX18uc2V0U2Nyb2xsLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnJlc291cmNlR3JpZC5ib2R5U2Nyb2xsZXIuc2V0U2Nyb2xsVG9wKHQudG9wKX0scn0oaiksRz1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7cmV0dXJuIHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLm1peGluKEkpLHIucHJvdG90eXBlLmV2ZW50Um93cz1udWxsLHIucHJvdG90eXBlLnNob3duRXZlbnRSb3dzPW51bGwsci5wcm90b3R5cGUudGJvZHlFbD1udWxsLHIucHJvdG90eXBlLnJvd0Nvb3JkQ2FjaGU9bnVsbCxyLnByb3RvdHlwZS5zcGFuVG9TZWdzPWZ1bmN0aW9uKHQpe3ZhciBlLG8scyxpLG4sbDtpZihsPXIuX19zdXBlcl9fLnNwYW5Ub1NlZ3MuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy52aWV3LmNhbGVuZGFyLGk9dC5yZXNvdXJjZUlkKWZvcihvPTAscz1sLmxlbmd0aDtvPHM7bysrKW49bFtvXSxuLnJlc291cmNlPWUuZ2V0UmVzb3VyY2VCeUlkKGkpLG4ucmVzb3VyY2VJZD1pO3JldHVybiBsfSxyLnByb3RvdHlwZS5wcmVwYXJlSGl0cz1mdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIHIuX19zdXBlcl9fLnByZXBhcmVIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksdGhpcy5zaG93bkV2ZW50Um93cz1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuZXZlbnRSb3dzLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5pc1Nob3duJiZzLnB1c2godCk7cmV0dXJuIHN9LmNhbGwodGhpcyksZT1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2ZvcihvPXRoaXMuc2hvd25FdmVudFJvd3Mscz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5nZXRUcigiZXZlbnQiKVswXSk7cmV0dXJuIHN9LmNhbGwodGhpcyksdGhpcy5yb3dDb29yZENhY2hlPW5ldyBsKHtlbHM6ZSxpc1ZlcnRpY2FsOiEwfSksdGhpcy5yb3dDb29yZENhY2hlLmJ1aWxkKCl9LHIucHJvdG90eXBlLnJlbGVhc2VIaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbGVhc2VIaXRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmV2ZW50Um93cz1udWxsLHRoaXMuc2hvd25FdmVudFJvd3M9bnVsbCx0aGlzLnJvd0Nvb3JkQ2FjaGUuY2xlYXIoKX0sci5wcm90b3R5cGUucXVlcnlIaXQ9ZnVuY3Rpb24odCxlKXt2YXIgbyxzO2lmKHM9ci5fX3N1cGVyX18ucXVlcnlIaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHMmJihvPXRoaXMucm93Q29vcmRDYWNoZS5nZXRWZXJ0aWNhbEluZGV4KGUpLG51bGwhPW8pKXJldHVybntyZXNvdXJjZUlkOnRoaXMuc2hvd25FdmVudFJvd3Nbb10ucmVzb3VyY2UuaWQsc25hcDpzLnNuYXAsY29tcG9uZW50OnRoaXMsbGVmdDpzLmxlZnQscmlnaHQ6cy5yaWdodCx0b3A6dGhpcy5yb3dDb29yZENhY2hlLmdldFRvcE9mZnNldChvKSxib3R0b206dGhpcy5yb3dDb29yZENhY2hlLmdldEJvdHRvbU9mZnNldChvKX19LHIucHJvdG90eXBlLmdldEhpdFNwYW49ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9dGhpcy5nZXRTbmFwUmFuZ2UodC5zbmFwKSxlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGV9LHIucHJvdG90eXBlLmdldEhpdEVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldFNuYXBFbCh0LnNuYXApfSxyLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3ZhciBlO3JldHVybiByLl9fc3VwZXJfXy5yZW5kZXJTa2VsZXRvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zZWdDb250YWluZXJFbC5yZW1vdmUoKSx0aGlzLnNlZ0NvbnRhaW5lckVsPW51bGwsZT10KCc8ZGl2IGNsYXNzPSJmYy1yb3dzIj48dGFibGU+PHRib2R5Lz48L3RhYmxlPjwvZGl2PicpLmFwcGVuZFRvKHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwpLHRoaXMudGJvZHlFbD1lLmZpbmQoInRib2R5Iil9LHIucHJvdG90eXBlLnJlbmRlckZnU2Vncz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbDtmb3IodD10aGlzLnJlbmRlckZnU2VnRWxzKHQpLG49dGhpcy52aWV3LnBhaXJTZWdzV2l0aFJvd3ModCksbD1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxlPWlbMF0scj1pWzFdLGUuZmdTZWdzPXIsZS5pc1Nob3duJiYoZS5pc1NlZ3NSZW5kZXJlZD0hMCxsLnB1c2goaSkpO3JldHVybiB0aGlzLnJlbmRlckZnU2Vnc0luQ29udGFpbmVycyhsKSx0aGlzLnVwZGF0ZVNlZ0ZvbGxvd2Vycyh0KSx0fSxyLnByb3RvdHlwZS51bnJlbmRlckZnU2Vncz1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0aGlzLmNsZWFyU2VnRm9sbG93ZXJzKCksZT10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCkscj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl0PWVbcl0sdC5mZ1NlZ3M9bnVsbCx0LmlzU2Vnc1JlbmRlcmVkPSExO3JldHVybiB0aGlzLnVucmVuZGVyRmdDb250YWluZXJzKGUpfSxyLnByb3RvdHlwZS5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz0wLHIucHJvdG90eXBlLnJlbmRlckJ1c2luZXNzSG91cnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycz90aGlzLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzKCk6ci5fX3N1cGVyX18ucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvd0NudFdpdGhDdXN0b21CdXNpbmVzc0hvdXJzP3RoaXMuY2xlYXJJbmRpdmlkdWFsQnVzaW5lc3NIb3VycygpOnIuX19zdXBlcl9fLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLmVuc3VyZUluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxzLmJ1c2luZXNzSG91clNlZ3N8fHRoaXMucG9wdWxhdGVSb3dCdXNpbmVzc0hvdXJzU2VncyhzKSxzLmlzU2hvd24/by5wdXNoKHMuZW5zdXJlQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkKCkpOm8ucHVzaCh2b2lkIDApO3JldHVybiBvfSxyLnByb3RvdHlwZS5jbGVhckluZGl2aWR1YWxCdXNpbmVzc0hvdXJzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztmb3Iocj10aGlzLnZpZXcuZ2V0RXZlbnRSb3dzKCksbz1bXSx0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXM9clt0XSxvLnB1c2gocy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSk7cmV0dXJuIG99LHIucHJvdG90eXBlLmFzc2lnblJvd0J1c2luZXNzSG91clNlZ3M9ZnVuY3Rpb24odCl7aWYodC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzJiYodGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vyc3x8KE4ucHJvdG90eXBlLnVucmVuZGVyQnVzaW5lc3NIb3Vycy5jYWxsKHRoaXMpLHRoaXMuZW5zdXJlSW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3Vycys9MSksdGhpcy5yb3dDbnRXaXRoQ3VzdG9tQnVzaW5lc3NIb3VycylyZXR1cm4gdGhpcy5wb3B1bGF0ZVJvd0J1c2luZXNzSG91cnNTZWdzKHQpfSxyLnByb3RvdHlwZS5kZXN0cm95Um93QnVzaW5lc3NIb3VyU2Vncz1mdW5jdGlvbih0KXtpZih0LmNsZWFyQnVzaW5lc3NIb3VyU2VncygpLHQucmVzb3VyY2UuYnVzaW5lc3NIb3VycyYmKHRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMtPTEsIXRoaXMucm93Q250V2l0aEN1c3RvbUJ1c2luZXNzSG91cnMpKXJldHVybiB0aGlzLmNsZWFySW5kaXZpZHVhbEJ1c2luZXNzSG91cnMoKSxOLnByb3RvdHlwZS5yZW5kZXJCdXNpbmVzc0hvdXJzLmNhbGwodGhpcyl9LHIucHJvdG90eXBlLnBvcHVsYXRlUm93QnVzaW5lc3NIb3Vyc1NlZ3M9ZnVuY3Rpb24odCl7dmFyIGUscixvO3I9dC5yZXNvdXJjZS5idXNpbmVzc0hvdXJzfHx0aGlzLnZpZXcub3B0KCJidXNpbmVzc0hvdXJzIiksbz10aGlzLnZpZXcuY2FsZW5kYXIuY29tcHV0ZUJ1c2luZXNzSG91ckV2ZW50cyghdGhpcy5pc1RpbWVTY2FsZSxyKSxlPXRoaXMuZXZlbnRzVG9TZWdzKG8pLGU9dGhpcy5yZW5kZXJGaWxsU2VnRWxzKCJidXNpbmVzc0hvdXJzIixlKSx0LmJ1c2luZXNzSG91clNlZ3M9ZX0sci5wcm90b3R5cGUucmVuZGVyRmlsbD1mdW5jdGlvbih0LGUscil7dmFyIG8scyxpLG4sbCx1LGgsYSxjLHAsZCxmO2ZvcihlPXRoaXMucmVuZGVyRmlsbFNlZ0Vscyh0LGUpLGE9W10sbD1bXSxvPTAsaT1lLmxlbmd0aDtvPGk7bysrKWQ9ZVtvXSxkLnJlc291cmNlSWQ/YS5wdXNoKGQpOmwucHVzaChkKTtmb3IoaD10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhhKSxmPVtdLHM9MCxuPWgubGVuZ3RoO3M8bjtzKyspdT1oW3NdLGM9dVswXSxwPXVbMV0sImJnRXZlbnQiPT09dCYmKGMuYmdTZWdzPXApLGMuaXNTaG93biYmZi5wdXNoKHUpO3JldHVybiBsLmxlbmd0aCYmZi51bnNoaWZ0KFt0aGlzLGxdKSx0aGlzLnJlbmRlckZpbGxJbkNvbnRhaW5lcnModCxmLHIpLGV9LHIucHJvdG90eXBlLnJlbmRlckhlbHBlcj1mdW5jdGlvbih0LGUpe3ZhciByLG87cmV0dXJuIG89dGhpcy5ldmVudFRvU2Vncyh0KSxvPXRoaXMucmVuZGVyRmdTZWdFbHMobykscj10aGlzLnZpZXcucGFpclNlZ3NXaXRoUm93cyhvKSx0aGlzLnJlbmRlckhlbHBlclNlZ3NJbkNvbnRhaW5lcnMocixlKX0sci5wcm90b3R5cGUuY29tcHV0ZUluaXRpYWxTY3JvbGw9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIGU9ci5fX3N1cGVyX18uY29tcHV0ZUluaXRpYWxTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQmJihlLnJlc291cmNlSWQ9dC5yZXNvdXJjZUlkLGUuYm90dG9tPXQuYm90dG9tKSxlfSxyLnByb3RvdHlwZS5xdWVyeVNjcm9sbD1mdW5jdGlvbigpe3ZhciB0LGUsbyxzLGksbixsLHU7Zm9yKHU9ci5fX3N1cGVyX18ucXVlcnlTY3JvbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLGw9dGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwub2Zmc2V0KCkudG9wLGk9dGhpcy52aWV3LmdldFZpc2libGVSb3dzKCksbz0wLHM9aS5sZW5ndGg7bzxzO28rKylpZihuPWlbb10sbi5yZXNvdXJjZSYmKHQ9bi5nZXRUcigiZXZlbnQiKSxlPXQub2Zmc2V0KCkudG9wK3Qub3V0ZXJIZWlnaHQoKSxlPmwpKXt1LnJlc291cmNlSWQ9bi5yZXNvdXJjZS5pZCx1LmJvdHRvbT1lLWw7YnJlYWt9cmV0dXJuIHV9LHIucHJvdG90eXBlLnNldFNjcm9sbD1mdW5jdGlvbih0KXt2YXIgZSxvLHMsaTtyZXR1cm4gdC5yZXNvdXJjZUlkJiYoaT10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5yZXNvdXJjZUlkKSxpJiYoZT1pLmdldFRyKCJldmVudCIpLGUmJihzPXRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5lbC5vZmZzZXQoKS50b3Asbz1lLm9mZnNldCgpLnRvcCtlLm91dGVySGVpZ2h0KCksdC50b3A9by10LmJvdHRvbS1zKSkpLHIuX19zdXBlcl9fLnNldFNjcm9sbC5jYWxsKHRoaXMsdCl9LHIucHJvdG90eXBlLnNjcm9sbFRvUmVzb3VyY2U9ZnVuY3Rpb24odCl7dmFyIGUscixvLHM7aWYobz10aGlzLnZpZXcuZ2V0UmVzb3VyY2VSb3codC5pZCksbyYmKGU9by5nZXRUcigiZXZlbnQiKSkpcmV0dXJuIHI9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmVsLm9mZnNldCgpLnRvcCxzPWUub2Zmc2V0KCkudG9wLXIsdGhpcy5ib2R5U2Nyb2xsZXIuc2Nyb2xsRWwuc2Nyb2xsVG9wKHMpfSxyfShOKSxyPTMwLHE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3ZhciBlO3RoaXMudmlldz10LHRoaXMuaXNSVEw9dGhpcy52aWV3Lm9wdCgiaXNSVEwiKSx0aGlzLmdpdmVuQ29sV2lkdGhzPXRoaXMuY29sV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQscixvLHM7Zm9yKG89dGhpcy52aWV3LmNvbFNwZWNzLHM9W10sdD0wLHI9by5sZW5ndGg7dDxyO3QrKyllPW9bdF0scy5wdXNoKGUud2lkdGgpO3JldHVybiBzfS5jYWxsKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS52aWV3PW51bGwsZS5wcm90b3R5cGUuaGVhZEVsPW51bGwsZS5wcm90b3R5cGUuZWw9bnVsbCxlLnByb3RvdHlwZS50Ym9keUVsPW51bGwsZS5wcm90b3R5cGUuaGVhZFNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuYm9keVNjcm9sbGVyPW51bGwsZS5wcm90b3R5cGUuam9pbmVyPW51bGwsZS5wcm90b3R5cGUuY29sR3JvdXBIdG1sPSIiLGUucHJvdG90eXBlLmhlYWRUYWJsZT1udWxsLGUucHJvdG90eXBlLmhlYWRDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5oZWFkQ2VsbEVscz1udWxsLGUucHJvdG90eXBlLmJvZHlDb2xFbHM9bnVsbCxlLnByb3RvdHlwZS5ib2R5VGFibGU9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJTa2VsZXRvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRTY3JvbGxlcj1uZXcgbih7b3ZlcmZsb3dYOiJjbGlwcGVkLXNjcm9sbCIsb3ZlcmZsb3dZOiJoaWRkZW4ifSksdGhpcy5oZWFkU2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuaGVhZFNjcm9sbGVyLnJlbmRlcigpLHRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCh0aGlzLnJlbmRlckhlYWRIdG1sKCkpLHRoaXMuaGVhZEVsLmFwcGVuZCh0aGlzLmhlYWRTY3JvbGxlci5lbCksdGhpcy5ib2R5U2Nyb2xsZXI9bmV3IG4oe292ZXJmbG93WToiY2xpcHBlZC1zY3JvbGwifSksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzPW5ldyBPLHRoaXMuYm9keVNjcm9sbGVyLnJlbmRlcigpLHRoaXMuYm9keVNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuaHRtbCgiPHRhYmxlPiIrdGhpcy5jb2xHcm91cEh0bWwrIjx0Ym9keS8+PC90YWJsZT4iKSx0aGlzLnRib2R5RWw9dGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLmNvbnRlbnRFbC5maW5kKCJ0Ym9keSIpLHRoaXMuZWwuYXBwZW5kKHRoaXMuYm9keVNjcm9sbGVyLmVsKSx0aGlzLmpvaW5lcj1uZXcgQSgiaG9yaXpvbnRhbCIsW3RoaXMuaGVhZFNjcm9sbGVyLHRoaXMuYm9keVNjcm9sbGVyXSksdGhpcy5oZWFkVGFibGU9dGhpcy5oZWFkRWwuZmluZCgidGFibGUiKSx0aGlzLmhlYWRDb2xFbHM9dGhpcy5oZWFkRWwuZmluZCgiY29sIiksdGhpcy5oZWFkQ2VsbEVscz10aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuY29udGVudEVsLmZpbmQoInRyOmxhc3QtY2hpbGQgdGgiKSx0aGlzLmJvZHlDb2xFbHM9dGhpcy5lbC5maW5kKCJjb2wiKSx0aGlzLmJvZHlUYWJsZT10aGlzLmVsLmZpbmQoInRhYmxlIiksdGhpcy5jb2xNaW5XaWR0aHM9dGhpcy5jb21wdXRlQ29sTWluV2lkdGhzKCksdGhpcy5hcHBseUNvbFdpZHRocygpLHRoaXMuaW5pdENvbFJlc2l6aW5nKCl9LGUucHJvdG90eXBlLnJlbmRlckhlYWRIdG1sPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLnZpZXcuY29sU3BlY3Mscj0iPHRhYmxlPiIsdD0iPGNvbGdyb3VwPiIsbj0wLHU9ZS5sZW5ndGg7bjx1O24rKylhPWVbbl0sdCs9YS5pc01haW4/Jzxjb2wgY2xhc3M9ImZjLW1haW4tY29sIi8+JzoiPGNvbC8+Ijtmb3IodCs9IjwvY29sZ3JvdXA+Iix0aGlzLmNvbEdyb3VwSHRtbD10LHIrPXQscis9Ijx0Ym9keT4iLHRoaXMudmlldy5zdXBlckhlYWRlclRleHQmJihyKz0nPHRyIGNsYXNzPSJmYy1zdXBlciI+PHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIiBjb2xzcGFuPSInK2UubGVuZ3RoKyciPjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+PHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCI+Jyt5dCh0aGlzLnZpZXcuc3VwZXJIZWFkZXJUZXh0KSsiPC9zcGFuPjwvZGl2PjwvdGg+PC90cj4iKSxyKz0iPHRyPiIsaT0hMCxvPWw9MCxoPWUubGVuZ3RoO2w8aDtvPSsrbClhPWVbb10scz1vPT09ZS5sZW5ndGgtMSxyKz0nPHRoIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRIZWFkZXJDbGFzcysnIj48ZGl2PjxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCI+JysoYS5pc01haW4/JzxzcGFuIGNsYXNzPSJmYy1leHBhbmRlci1zcGFjZSI+PHNwYW4gY2xhc3M9ImZjLWljb24iPjwvc3Bhbj48L3NwYW4+JzoiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicreXQoYS5sYWJlbFRleHR8fCIiKSsiPC9zcGFuPjwvZGl2PiIrKHM/IiI6JzxkaXYgY2xhc3M9ImZjLWNvbC1yZXNpemVyIj48L2Rpdj4nKSsiPC9kaXY+PC90aD4iO3JldHVybiByKz0iPC90cj4iLHIrPSI8L3Rib2R5PjwvdGFibGU+In0sZS5wcm90b3R5cGUuZ2l2ZW5Db2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xXaWR0aHM9bnVsbCxlLnByb3RvdHlwZS5jb2xNaW5XaWR0aHM9bnVsbCxlLnByb3RvdHlwZS50YWJsZVdpZHRoPW51bGwsZS5wcm90b3R5cGUudGFibGVNaW5XaWR0aD1udWxsLGUucHJvdG90eXBlLmluaXRDb2xSZXNpemluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWRFbC5maW5kKCJ0aCAuZmMtY29sLXJlc2l6ZXIiKS5lYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3JldHVybiBvPXQobyksby5vbigibW91c2Vkb3duIixmdW5jdGlvbih0KXtyZXR1cm4gZS5jb2xSZXNpemVNb3VzZWRvd24ocix0LG8pfSl9fSh0aGlzKSl9LGUucHJvdG90eXBlLmNvbFJlc2l6ZU1vdXNlZG93bj1mdW5jdGlvbih0LGUsbyl7dmFyIHMsaSxuLGw7cmV0dXJuIHM9dGhpcy5jb2xXaWR0aHM9dGhpcy5xdWVyeUNvbFdpZHRocygpLHMucG9wKCkscy5wdXNoKG51bGwpLGw9c1t0XSxuPU1hdGgubWluKHRoaXMuY29sTWluV2lkdGhzW3RdLHIpLGk9bmV3IGgoe2RyYWdTdGFydDpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5hZGRDbGFzcygiZmMtYWN0aXZlIil9fSh0aGlzKSxkcmFnOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLG8pe3ZhciBpO3JldHVybiBpPWwrKGUuaXNSVEw/LXI6ciksaT1NYXRoLm1heChpLG4pLHNbdF09aSxlLmFwcGx5Q29sV2lkdGhzKCl9fSh0aGlzKSxkcmFnRW5kOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvLnJlbW92ZUNsYXNzKCJmYy1hY3RpdmUiKX19KHRoaXMpfSksaS5zdGFydEludGVyYWN0aW9uKGUpfSxlLnByb3RvdHlwZS5hcHBseUNvbFdpZHRocz1mdW5jdGlvbigpe3ZhciB0LGUscixvLHMsaSxuLGwsdSxoLGEsYyxwLGQsZixnLHk7Zm9yKHI9dGhpcy5jb2xNaW5XaWR0aHMscz10aGlzLmNvbFdpZHRocyx0PSEwLGU9ITEseT0wLGg9MCxwPXMubGVuZ3RoO2g8cDtoKyspbz1zW2hdLCJudW1iZXIiPT10eXBlb2Ygbz95Kz1vOih0PSExLG8mJihlPSEwKSk7Zm9yKGw9ZSYmIXRoaXMudmlldy5pc0hHcm91cGluZz8iYXV0byI6IiIsbj1mdW5jdGlvbigpe3ZhciB0LGUscjtmb3Iocj1bXSx1PXQ9MCxlPXMubGVuZ3RoO3Q8ZTt1PSsrdClvPXNbdV0sci5wdXNoKG51bGwhPW8/bzpsKTtyZXR1cm4gcn0oKSxnPTAsdT1hPTAsZD1uLmxlbmd0aDthPGQ7dT0rK2EpaT1uW3VdLGcrPSJudW1iZXIiPT10eXBlb2YgaT9pOnJbdV07Zm9yKHU9Yz0wLGY9bi5sZW5ndGg7YzxmO3U9KytjKWk9blt1XSx0aGlzLmhlYWRDb2xFbHMuZXEodSkud2lkdGgoaSksdGhpcy5ib2R5Q29sRWxzLmVxKHUpLndpZHRoKGkpO3JldHVybiB0aGlzLmhlYWRTY3JvbGxlci5jYW52YXMuc2V0TWluV2lkdGgoZyksdGhpcy5ib2R5U2Nyb2xsZXIuY2FudmFzLnNldE1pbldpZHRoKGcpLHRoaXMudGFibGVNaW5XaWR0aD1nLHRoaXMudGFibGVXaWR0aD10P3k6dm9pZCAwfSxlLnByb3RvdHlwZS5jb21wdXRlQ29sTWluV2lkdGhzPWZ1bmN0aW9uKCl7dmFyIHQsZSxvLHMsaSxuO2ZvcihzPXRoaXMuZ2l2ZW5Db2xXaWR0aHMsaT1bXSx0PWU9MCxvPXMubGVuZ3RoO2U8bzt0PSsrZSluPXNbdF0sIm51bWJlciI9PXR5cGVvZiBuP2kucHVzaChuKTppLnB1c2gocGFyc2VJbnQodGhpcy5oZWFkQ29sRWxzLmVxKHQpLmNzcygibWluLXdpZHRoIikpfHxyKTtyZXR1cm4gaX0sZS5wcm90b3R5cGUucXVlcnlDb2xXaWR0aHM9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpO2ZvcihzPXRoaXMuaGVhZENlbGxFbHMsaT1bXSxlPTAscj1zLmxlbmd0aDtlPHI7ZSsrKW89c1tlXSxpLnB1c2godChvKS5vdXRlcldpZHRoKCkpO3JldHVybiBpfSxlLnByb3RvdHlwZS51cGRhdGVXaWR0aD1mdW5jdGlvbigpe2lmKHRoaXMuaGVhZFNjcm9sbGVyLnVwZGF0ZVNpemUoKSx0aGlzLmJvZHlTY3JvbGxlci51cGRhdGVTaXplKCksdGhpcy5qb2luZXIudXBkYXRlKCksdGhpcy5mb2xsb3dlcilyZXR1cm4gdGhpcy5mb2xsb3dlci51cGRhdGUoKX0sZS5wcm90b3R5cGUuaGVhZEhlaWdodD1mdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PXRoaXMuaGVhZFNjcm9sbGVyLmNhbnZhcy5jb250ZW50RWwuZmluZCgidGFibGUiKSx0LmhlaWdodC5hcHBseSh0LGFyZ3VtZW50cyl9LGV9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy52aWV3PWUsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnRySGFzaD17fSx0aGlzLnRycz10KCl9cmV0dXJuIGUucHJvdG90eXBlLnZpZXc9bnVsbCxlLnByb3RvdHlwZS5wYXJlbnQ9bnVsbCxlLnByb3RvdHlwZS5wcmV2U2libGluZz1udWxsLGUucHJvdG90eXBlLmNoaWxkcmVuPW51bGwsZS5wcm90b3R5cGUuZGVwdGg9MCxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITEsZS5wcm90b3R5cGUudHJIYXNoPW51bGwsZS5wcm90b3R5cGUudHJzPW51bGwsZS5wcm90b3R5cGUuaXNSZW5kZXJlZD0hMSxlLnByb3RvdHlwZS5pc0V4cGFuZGVkPSEwLGUucHJvdG90eXBlLmlzU2hvd249ITEsZS5wcm90b3R5cGUuYWRkQ2hpbGQ9ZnVuY3Rpb24odCxlKXt2YXIgcixvLHMsaSxuO2Zvcih0LnJlbW92ZSgpLHI9dGhpcy5jaGlsZHJlbixudWxsIT1lP3Iuc3BsaWNlKGUsMCx0KTooZT1yLmxlbmd0aCxyLnB1c2godCkpLHQucHJldlNpYmxpbmc9ZT4wP3JbZS0xXTpudWxsLGU8ci5sZW5ndGgtMSYmKHJbZSsxXS5wcmV2U2libGluZz10KSx0LnBhcmVudD10aGlzLHQuZGVwdGg9dGhpcy5kZXB0aCsodGhpcy5oYXNPd25Sb3c/MTowKSxuPXQuZ2V0Tm9kZXMoKSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKWk9bltvXSxpLmFkZGVkKCk7aWYodGhpcy5pc1Nob3duJiZ0aGlzLmlzRXhwYW5kZWQpcmV0dXJuIHQuc2hvdygpfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbih0KXt2YXIgZSxyLG8scyxpLG4sbCx1LGgsYTtmb3IoZT10aGlzLmNoaWxkcmVuLG89ITEscj1zPTAsbj1lLmxlbmd0aDtzPG47cj0rK3MpaWYoYT1lW3JdLGE9PT10KXtvPSEwO2JyZWFrfWlmKG8pe2ZvcihyPGUubGVuZ3RoLTEmJihlW3IrMV0ucHJldlNpYmxpbmc9dC5wcmV2U2libGluZyksZS5zcGxpY2UociwxKSx0LnJlY3Vyc2l2ZWx5VW5yZW5kZXIoKSx1PXQuZ2V0Tm9kZXMoKSxpPTAsbD11Lmxlbmd0aDtpPGw7aSsrKWg9dVtpXSxoLnJlbW92ZWQoKTtyZXR1cm4gdC5wYXJlbnQ9bnVsbCx0LnByZXZTaWJsaW5nPW51bGwsdH1yZXR1cm4hMX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzLGksbjtmb3IoaT10aGlzLmNoaWxkcmVuLGU9MCxvPWkubGVuZ3RoO2U8bztlKyspdD1pW2VdLHQucmVjdXJzaXZlbHlVbnJlbmRlcigpO2ZvcihuPXRoaXMuZ2V0RGVzY2VuZGFudHMoKSxyPTAscz1uLmxlbmd0aDtyPHM7cisrKXQ9bltyXSx0LnJlbW92ZWQoKTtyZXR1cm4gdGhpcy5jaGlsZHJlbj1bXX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYodGhpcy5wYXJlbnQpcmV0dXJuIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpfSxlLnByb3RvdHlwZS5nZXRMYXN0Q2hpbGQ9ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdD10aGlzLmNoaWxkcmVuLHRbdC5sZW5ndGgtMV19LGUucHJvdG90eXBlLmdldFByZXZSb3c9ZnVuY3Rpb24oKXt2YXIgdCxlO2ZvcihlPXRoaXM7ZTspe2lmKGUucHJldlNpYmxpbmcpZm9yKGU9ZS5wcmV2U2libGluZzt0PWUuZ2V0TGFzdENoaWxkKCk7KWU9dDtlbHNlIGU9ZS5wYXJlbnQ7aWYoZSYmZS5oYXNPd25Sb3cmJmUuaXNTaG93bilyZXR1cm4gZX1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZ2V0TGVhZGluZ1Jvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc093blJvdz90aGlzOnRoaXMuaXNFeHBhbmRlZCYmdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblswXS5nZXRMZWFkaW5nUm93KCk6dm9pZCAwfSxlLnByb3RvdHlwZS5nZXRSb3dzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbyxzO2ZvcihudWxsPT10JiYodD1bXSksdGhpcy5oYXNPd25Sb3cmJnQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXRSb3dzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROb2Rlcz1mdW5jdGlvbih0KXt2YXIgZSxyLG8scztmb3IobnVsbD09dCYmKHQ9W10pLHQucHVzaCh0aGlzKSxzPXRoaXMuY2hpbGRyZW4scj0wLG89cy5sZW5ndGg7cjxvO3IrKyllPXNbcl0sZS5nZXROb2Rlcyh0KTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHM9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0PVtdLHM9dGhpcy5jaGlsZHJlbixyPTAsbz1zLmxlbmd0aDtyPG87cisrKWU9c1tyXSxlLmdldE5vZGVzKHQpO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyLG8scyxpLG4sbDtpZih0aGlzLnRySGFzaD17fSxuPVtdLHRoaXMuaGFzT3duUm93KXtlPXRoaXMuZ2V0UHJldlJvdygpLHI9dGhpcy52aWV3LnRib2R5SGFzaDtmb3IobCBpbiByKXM9cltsXSxpPXQoIjx0ci8+IiksdGhpcy50ckhhc2hbbF09aSxuLnB1c2goaVswXSksbz0icmVuZGVyIitLKGwpKyJDb250ZW50Iix0aGlzW29dJiZ0aGlzW29dKGkpLGU/ZS50ckhhc2hbbF0uYWZ0ZXIoaSk6cy5wcmVwZW5kKGkpfXJldHVybiB0aGlzLnRycz10KG4pLm9uKCJjbGljayIsIi5mYy1leHBhbmRlciIsTXQodGhpcywidG9nZ2xlRXhwYW5kZWQiKSksdGhpcy5pc1JlbmRlcmVkPSEwfSxlLnByb3RvdHlwZS51bnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHIsbyxzO2lmKHRoaXMuaXNSZW5kZXJlZCl7ZT10aGlzLnRySGFzaDtmb3IobyBpbiBlKXI9ZVtvXSxzPSJ1bnJlbmRlciIrSyhvKSsiQ29udGVudCIsdGhpc1tzXSYmdGhpc1tzXShyKTtyZXR1cm4gdGhpcy50ckhhc2g9e30sdGhpcy50cnMucmVtb3ZlKCksdGhpcy50cnM9dCgpLHRoaXMuaXNSZW5kZXJlZD0hMSx0aGlzLmlzU2hvd249ITEsdGhpcy5oaWRkZW4oKX19LGUucHJvdG90eXBlLnJlY3Vyc2l2ZWx5VW5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbyxzO2Zvcih0aGlzLnVucmVuZGVyKCksbz10aGlzLmNoaWxkcmVuLHM9W10sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0scy5wdXNoKHQucmVjdXJzaXZlbHlVbnJlbmRlcigpKTtyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0VHI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudHJIYXNoW3RdfSxlLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG8scztpZighdGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkP3RoaXMudHJzLmNzcygiZGlzcGxheSIsIiIpOnRoaXMucmVuZGVyKCksdGhpcy5lbnN1cmVTZWdzUmVuZGVyZWQmJnRoaXMuZW5zdXJlU2Vnc1JlbmRlcmVkKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKSx0aGlzLmlzU2hvd249ITAsdGhpcy5zaG93bigpLHRoaXMuaXNFeHBhbmRlZCkpe2ZvcihvPXRoaXMuY2hpbGRyZW4scz1bXSxlPTAscj1vLmxlbmd0aDtlPHI7ZSsrKXQ9b1tlXSxzLnB1c2godC5zaG93KCkpO3JldHVybiBzfX0sZS5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0LGUscixvLHM7aWYodGhpcy5pc1Nob3duJiYodGhpcy5pc1JlbmRlcmVkJiZ0aGlzLnRycy5oaWRlKCksdGhpcy5pc1Nob3duPSExLHRoaXMuaGlkZGVuKCksdGhpcy5pc0V4cGFuZGVkKSl7Zm9yKG89dGhpcy5jaGlsZHJlbixzPVtdLGU9MCxyPW8ubGVuZ3RoO2U8cjtlKyspdD1vW2VdLHMucHVzaCh0LmhpZGUoKSk7cmV0dXJuIHN9fSxlLnByb3RvdHlwZS5leHBhbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZighdGhpcy5pc0V4cGFuZGVkKXtmb3IodGhpcy5pc0V4cGFuZGVkPSEwLHRoaXMuaW5kaWNhdGVFeHBhbmRlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5zaG93KCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpLHRoaXMuYW5pbWF0ZUV4cGFuZCgpfX0sZS5wcm90b3R5cGUuY29sbGFwc2U9ZnVuY3Rpb24oKXt2YXIgdCxlLHIsbztpZih0aGlzLmlzRXhwYW5kZWQpe2Zvcih0aGlzLmlzRXhwYW5kZWQ9ITEsdGhpcy5pbmRpY2F0ZUNvbGxhcHNlZCgpLHRoaXMudmlldy5iYXRjaFJvd3MoKSxvPXRoaXMuY2hpbGRyZW4sZT0wLHI9by5sZW5ndGg7ZTxyO2UrKyl0PW9bZV0sdC5oaWRlKCk7cmV0dXJuIHRoaXMudmlldy51bmJhdGNoUm93cygpfX0sZS5wcm90b3R5cGUudG9nZ2xlRXhwYW5kZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0V4cGFuZGVkP3RoaXMuY29sbGFwc2UoKTp0aGlzLmV4cGFuZCgpfSxlLnByb3RvdHlwZS5pbmRpY2F0ZUV4cGFuZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJzLmZpbmQoIi5mYy1leHBhbmRlciAuZmMtaWNvbiIpLnJlbW92ZUNsYXNzKHRoaXMuZ2V0Q29sbGFwc2VkSWNvbigpKS5hZGRDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKX0sZS5wcm90b3R5cGUuaW5kaWNhdGVDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyIC5mYy1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5nZXRFeHBhbmRlZEljb24oKSkuYWRkQ2xhc3ModGhpcy5nZXRDb2xsYXBzZWRJY29uKCkpfSxlLnByb3RvdHlwZS5lbmFibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikuYWRkQ2xhc3MoImZjLWV4cGFuZGVyIil9LGUucHJvdG90eXBlLmRpc2FibGVFeHBhbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cnMuZmluZCgiLmZjLWV4cGFuZGVyLXNwYWNlIikucmVtb3ZlQ2xhc3MoImZjLWV4cGFuZGVyIikuZmluZCgiLmZjLWljb24iKS5yZW1vdmVDbGFzcyh0aGlzLmdldEV4cGFuZGVkSWNvbigpKS5yZW1vdmVDbGFzcyh0aGlzLmdldENvbGxhcHNlZEljb24oKSl9LGUucHJvdG90eXBlLmdldEV4cGFuZGVkSWNvbj1mdW5jdGlvbigpe3JldHVybiJmYy1pY29uLWRvd24tdHJpYW5nbGUifSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRJY29uPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHQ9dGhpcy52aWV3LmlzUlRMPyJsZWZ0IjoicmlnaHQiLCJmYy1pY29uLSIrdCsiLXRyaWFuZ2xlIn0sZS5wcm90b3R5cGUuYW5pbWF0ZUV4cGFuZD1mdW5jdGlvbigpe3ZhciB0LGUscjtpZihyPW51bGwhPSh0PXRoaXMuY2hpbGRyZW5bMF0pJiZudWxsIT0oZT10LmdldExlYWRpbmdSb3coKSk/ZS50cnM6dm9pZCAwKXJldHVybiByLmFkZENsYXNzKCJmYy1jb2xsYXBzZWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHIuYWRkQ2xhc3MoImZjLXRyYW5zaXRpb25pbmciKSxyLnJlbW92ZUNsYXNzKCJmYy1jb2xsYXBzZWQiKX0pLHIub25lKCJ3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kIixmdW5jdGlvbigpe3JldHVybiByLnJlbW92ZUNsYXNzKCJmYy10cmFuc2l0aW9uaW5nIil9KX0sZS5wcm90b3R5cGUuZ2V0TWF4VHJJbm5lckhlaWdodD1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBlPTAsdC5lYWNoKHRoaXMudHJIYXNoLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0LHIpe3ZhciBvO3JldHVybiBvPWN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLGU9TWF0aC5tYXgoby5oZWlnaHQoKSxlKX19KHRoaXMpKSxlfSxlLnByb3RvdHlwZS5zZXRUcklubmVySGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmVhY2godGhpcy50ckhhc2gsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIGN0KHIpLmZpbmQoIj4gZGl2Om5vdCguZmMtY2VsbC1jb250ZW50KTpmaXJzdCIpLmhlaWdodChlKX19KHRoaXMpKX0sZS5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtpZih0aGlzLmhhc093blJvdylyZXR1cm4gdGhpcy5yb3dTaG93bih0aGlzKX0sZS5wcm90b3R5cGUuaGlkZGVuPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93SGlkZGVuKHRoaXMpfSxlLnByb3RvdHlwZS5yb3dTaG93bj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93U2hvd24odCl9LGUucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5wYXJlbnR8fHRoaXMudmlldykucm93SGlkZGVuKHQpfSxlLnByb3RvdHlwZS5hZGRlZD1mdW5jdGlvbigpe2lmKHRoaXMuaGFzT3duUm93KXJldHVybiB0aGlzLnJvd0FkZGVkKHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmVkPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNPd25Sb3cpcmV0dXJuIHRoaXMucm93UmVtb3ZlZCh0aGlzKX0sZS5wcm90b3R5cGUucm93QWRkZWQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMucGFyZW50fHx0aGlzLnZpZXcpLnJvd0FkZGVkKHQpfSxlLnByb3RvdHlwZS5yb3dSZW1vdmVkPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLnBhcmVudHx8dGhpcy52aWV3KS5yb3dSZW1vdmVkKHQpfSxlfSgpLEw9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcih0LGUsbyl7dGhpcy5ncm91cFNwZWM9ZSx0aGlzLmdyb3VwVmFsdWU9byxyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KHIsZSksci5wcm90b3R5cGUuZ3JvdXBTcGVjPW51bGwsci5wcm90b3R5cGUuZ3JvdXBWYWx1ZT1udWxsLHIucHJvdG90eXBlLnJvd1JlbW92ZWQ9ZnVuY3Rpb24odCl7aWYoci5fX3N1cGVyX18ucm93UmVtb3ZlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCE9PXRoaXMmJiF0aGlzLmNoaWxkcmVuLmxlbmd0aClyZXR1cm4gdGhpcy5yZW1vdmUoKX0sci5wcm90b3R5cGUucmVuZGVyR3JvdXBDb250ZW50RWw9ZnVuY3Rpb24oKXt2YXIgZSxyO3JldHVybiBlPXQoJzxkaXYgY2xhc3M9ImZjLWNlbGwtY29udGVudCIgLz4nKS5hcHBlbmQodGhpcy5yZW5kZXJHcm91cFRleHRFbCgpKSxyPXRoaXMuZ3JvdXBTcGVjLnJlbmRlciwiZnVuY3Rpb24iPT10eXBlb2YgciYmKGU9cihlLHRoaXMuZ3JvdXBWYWx1ZSl8fGUpLGV9LHIucHJvdG90eXBlLnJlbmRlckdyb3VwVGV4dEVsPWZ1bmN0aW9uKCl7dmFyIGUscjtyZXR1cm4gcj10aGlzLmdyb3VwVmFsdWV8fCIiLGU9dGhpcy5ncm91cFNwZWMudGV4dCwiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZShyKXx8ciksdCgnPHNwYW4gY2xhc3M9ImZjLWNlbGwtdGV4dCIgLz4nKS50ZXh0KHIpfSxyfSh6KSxnPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLmhhc093blJvdz0hMCxyLnByb3RvdHlwZS5yZW5kZXJTcHJlYWRzaGVldENvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5yZW5kZXJHcm91cENvbnRlbnRFbCgpLHIucHJlcGVuZCgnPHNwYW4gY2xhc3M9ImZjLWV4cGFuZGVyIj48c3BhbiBjbGFzcz0iZmMtaWNvbiI+PC9zcGFuPjwvc3Bhbj4nKSx0KCc8dGQgY2xhc3M9ImZjLWRpdmlkZXIiIC8+JykuYXR0cigiY29sc3BhbiIsdGhpcy52aWV3LmNvbFNwZWNzLmxlbmd0aCkuYXBwZW5kKHQoIjxkaXYvPiIpLmFwcGVuZChyKSkuYXBwZW5kVG8oZSl9LHIucHJvdG90eXBlLnJlbmRlckV2ZW50Q29udGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5hcHBlbmQoJzx0ZCBjbGFzcz0iZmMtZGl2aWRlciI+IDxkaXYvPiA8L3RkPicpfSxyfShMKSxVPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXtyZXR1cm4gci5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChyLGUpLHIucHJvdG90eXBlLnJvd3NwYW49MCxyLnByb3RvdHlwZS5sZWFkaW5nVHI9bnVsbCxyLnByb3RvdHlwZS5ncm91cFRkPW51bGwsci5wcm90b3R5cGUucm93U2hvd249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucm93c3Bhbis9MSx0aGlzLnJlbmRlclJvd3NwYW4oKSxyLl9fc3VwZXJfXy5yb3dTaG93bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJvd0hpZGRlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yb3dzcGFuLT0xLHRoaXMucmVuZGVyUm93c3BhbigpLHIuX19zdXBlcl9fLnJvd0hpZGRlbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHIucHJvdG90eXBlLnJlbmRlclJvd3NwYW49ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gdGhpcy5yb3dzcGFuPyh0aGlzLmdyb3VwVGR8fCh0aGlzLmdyb3VwVGQ9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZCh0aGlzLnJlbmRlckdyb3VwQ29udGVudEVsKCkpKSx0aGlzLmdyb3VwVGQuYXR0cigicm93c3BhbiIsdGhpcy5yb3dzcGFuKSxlPXRoaXMuZ2V0TGVhZGluZ1JvdygpLmdldFRyKCJzcHJlYWRzaGVldCIpLGUhPT10aGlzLmxlYWRpbmdUcj8oZSYmZS5wcmVwZW5kKHRoaXMuZ3JvdXBUZCksdGhpcy5sZWFkaW5nVHI9ZSk6dm9pZCAwKToodGhpcy5ncm91cFRkJiYodGhpcy5ncm91cFRkLnJlbW92ZSgpLHRoaXMuZ3JvdXBUZD1udWxsKSx0aGlzLmxlYWRpbmdUcj1udWxsKX0scn0oTCkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLnByb3RvdHlwZS5oYXNPd25Sb3c9ITAsZS5wcm90b3R5cGUuc2VnQ29udGFpbmVyRWw9bnVsbCxlLnByb3RvdHlwZS5zZWdDb250YWluZXJIZWlnaHQ9bnVsbCxlLnByb3RvdHlwZS5pbm5lckVsPW51bGwsZS5wcm90b3R5cGUuYmdTZWdDb250YWluZXJFbD1udWxsLGUucHJvdG90eXBlLmlzU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmlzQnVzaW5lc3NIb3VyU2Vnc1JlbmRlcmVkPSExLGUucHJvdG90eXBlLmJ1c2luZXNzSG91clNlZ3M9bnVsbCxlLnByb3RvdHlwZS5iZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5mZ1NlZ3M9bnVsbCxlLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaHRtbCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyI+IDxkaXY+IDxkaXYgY2xhc3M9ImZjLWV2ZW50LWNvbnRhaW5lciIgLz4gPC9kaXY+IDwvdGQ+JyksdGhpcy5zZWdDb250YWluZXJFbD10LmZpbmQoIi5mYy1ldmVudC1jb250YWluZXIiKSx0aGlzLmlubmVyRWw9dGhpcy5iZ1NlZ0NvbnRhaW5lckVsPXQuZmluZCgidGQgPiBkaXYiKSx0aGlzLmVuc3VyZVNlZ3NSZW5kZXJlZCgpfSxlLnByb3RvdHlwZS5lbnN1cmVTZWdzUmVuZGVyZWQ9ZnVuY3Rpb24oKXtpZighdGhpcy5pc1NlZ3NSZW5kZXJlZClyZXR1cm4gdGhpcy5lbnN1cmVCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQoKSx0aGlzLmJnU2VncyYmdGhpcy52aWV3LnRpbWVHcmlkLnJlbmRlckZpbGxJbkNvbnRhaW5lcigiYmdFdmVudCIsdGhpcyx0aGlzLmJnU2VncyksdGhpcy5mZ1NlZ3MmJnRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGZ1NlZ3NJbkNvbnRhaW5lcnMoW1t0aGlzLHRoaXMuZmdTZWdzXV0pLHRoaXMuaXNTZWdzUmVuZGVyZWQ9ITB9LGUucHJvdG90eXBlLmVuc3VyZUJ1c2luZXNzSG91clNlZ3NSZW5kZXJlZD1mdW5jdGlvbigpe2lmKHRoaXMuYnVzaW5lc3NIb3VyU2VncyYmIXRoaXMuaXNCdXNpbmVzc0hvdXJTZWdzUmVuZGVyZWQpcmV0dXJuIHRoaXMudmlldy50aW1lR3JpZC5yZW5kZXJGaWxsSW5Db250YWluZXIoImJ1c2luZXNzSG91cnMiLHRoaXMsdGhpcy5idXNpbmVzc0hvdXJTZWdzLCJiZ2V2ZW50IiksdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMH0sZS5wcm90b3R5cGUudW5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckJ1c2luZXNzSG91clNlZ3MoKSx0aGlzLmJnU2Vncz1udWxsLHRoaXMuZmdTZWdzPW51bGwsdGhpcy5pc1NlZ3NSZW5kZXJlZD0hMX0sZS5wcm90b3R5cGUuY2xlYXJCdXNpbmVzc0hvdXJTZWdzPWZ1bmN0aW9uKCl7dmFyIHQsZSxyLG87aWYodGhpcy5idXNpbmVzc0hvdXJTZWdzKXtmb3Iocj10aGlzLmJ1c2luZXNzSG91clNlZ3MsdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylvPXJbdF0sby5lbCYmby5lbC5yZW1vdmUoKTt0aGlzLmJ1c2luZXNzSG91clNlZ3M9bnVsbH1yZXR1cm4gdGhpcy5pc0J1c2luZXNzSG91clNlZ3NSZW5kZXJlZD0hMX0sZX0oeiksQj1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5yZXNvdXJjZT1lLHIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QocixlKSxyLnByb3RvdHlwZS5yZXNvdXJjZT1udWxsLHIucHJvdG90eXBlLnJvd0FkZGVkPWZ1bmN0aW9uKHQpe2lmKHIuX19zdXBlcl9fLnJvd0FkZGVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYxPT09dGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZW5hYmxlRXhwYW5kaW5nKCksdGhpcy5pc0V4cGFuZGVkP3RoaXMuaW5kaWNhdGVFeHBhbmRlZCgpOnRoaXMuaW5kaWNhdGVDb2xsYXBzZWQoKX0sci5wcm90b3R5cGUucm93UmVtb3ZlZD1mdW5jdGlvbih0KXtpZihyLl9fc3VwZXJfXy5yb3dSZW1vdmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0IT09dGhpcyYmdGhpcy5pc1JlbmRlcmVkJiYhdGhpcy5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXMuZGlzYWJsZUV4cGFuZGluZygpfSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fX3N1cGVyX18ucmVuZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmNoaWxkcmVuLmxlbmd0aD4wP3RoaXMuZW5hYmxlRXhwYW5kaW5nKCk6dGhpcy5kaXNhYmxlRXhwYW5kaW5nKCksdGhpcy52aWV3LnRyaWdnZXIoInJlc291cmNlUmVuZGVyIix0aGlzLnJlc291cmNlLHRoaXMucmVzb3VyY2UsdGhpcy5nZXRUcigic3ByZWFkc2hlZXQiKS5maW5kKCI+IHRkIiksdGhpcy5nZXRUcigiZXZlbnQiKS5maW5kKCI+IHRkIikpfSxyLnByb3RvdHlwZS5yZW5kZXJFdmVudENvbnRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIuX19zdXBlcl9fLnJlbmRlckV2ZW50Q29udGVudC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix0aGlzLnJlc291cmNlLmlkKX0sci5wcm90b3R5cGUucmVuZGVyU3ByZWFkc2hlZXRDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciByLG8scyxpLG4sbCx1LGgsYTtmb3IodT10aGlzLnJlc291cmNlLGw9dGhpcy52aWV3LmNvbFNwZWNzLGk9MCxuPWwubGVuZ3RoO2k8bjtpKyspcj1sW2ldLHIuZ3JvdXB8fChzPXIuZmllbGQ/dVtyLmZpZWxkXXx8bnVsbDp1LGE9ImZ1bmN0aW9uIj09dHlwZW9mIHIudGV4dD9yLnRleHQodSxzKTpzLG89dCgnPGRpdiBjbGFzcz0iZmMtY2VsbC1jb250ZW50Ij4nKyhyLmlzTWFpbj90aGlzLnJlbmRlckd1dHRlckh0bWwoKToiIikrJzxzcGFuIGNsYXNzPSJmYy1jZWxsLXRleHQiPicrKGE/eXQoYSk6IiZuYnNwOyIpKyI8L3NwYW4+PC9kaXY+IiksImZ1bmN0aW9uIj09dHlwZW9mIHIucmVuZGVyJiYobz1yLnJlbmRlcih1LG8scyl8fG8pLGg9dCgnPHRkIGNsYXNzPSInK3RoaXMudmlldy53aWRnZXRDb250ZW50Q2xhc3MrJyIvPicpLmFwcGVuZChvKSxyLmlzTWFpbiYmaC53cmFwSW5uZXIoIjxkaXYvPiIpLGUuYXBwZW5kKGgpKTtyZXR1cm4gZS5hdHRyKCJkYXRhLXJlc291cmNlLWlkIix1LmlkKX0sci5wcm90b3R5cGUucmVuZGVyR3V0dGVySHRtbD1mdW5jdGlvbigpe3ZhciB0LGUscixvO2Zvcih0PSIiLGU9cj0wLG89dGhpcy5kZXB0aDtyPG87ZT1yKz0xKXQrPSc8c3BhbiBjbGFzcz0iZmMtaWNvbiIvPic7cmV0dXJuIHQrPSc8c3BhbiBjbGFzcz0iZmMtZXhwYW5kZXItc3BhY2UiPjxzcGFuIGNsYXNzPSJmYy1pY29uIj48L3NwYW4+PC9zcGFuPid9LHJ9KHApLGQudmlld3MudGltZWxpbmUucmVzb3VyY2VDbGFzcz1NLEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiBlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIE90KGUsdCksZS5taXhpbihXKSxlLnByb3RvdHlwZS50aW1lR3JpZENsYXNzPUYsZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRpbWVHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZUdyaWQuc2V0UmVzb3VyY2VzKHQpLHRoaXMuZGF5R3JpZCYmdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7aWYodGhpcy5jbGVhckV2ZW50cygpLHRoaXMudGltZUdyaWQudW5zZXRSZXNvdXJjZXMoKSx0aGlzLmRheUdyaWQmJnRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLCF0KXJldHVybiB0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZX0oZC5BZ2VuZGFWaWV3KSxkLnZpZXdzLmFnZW5kYS5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gRX0sSD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gT3QoZSx0KSxlLm1peGluKFcpLGUucHJvdG90eXBlLmRheUdyaWRDbGFzcz1ULGUucHJvdG90eXBlLnJlbmRlckhlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZS5fX3N1cGVyX18ucmVuZGVySGVhZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5kYXlHcmlkLnByb2Nlc3NIZWFkUmVzb3VyY2VFbHModGhpcy5oZWFkQ29udGFpbmVyRWwpfSxlLnByb3RvdHlwZS5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF5R3JpZC5zZXRSZXNvdXJjZXModCksdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGUucHJvdG90eXBlLnVuc2V0UmVzb3VyY2VzPWZ1bmN0aW9uKHQpe2lmKHRoaXMuY2xlYXJFdmVudHMoKSx0aGlzLmRheUdyaWQudW5zZXRSZXNvdXJjZXMoKSwhdClyZXR1cm4gdGhpcy5jbGVhclZpZXcoKSx0aGlzLmRpc3BsYXlWaWV3KCl9LGV9KGQuQmFzaWNWaWV3KSx4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gZS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBPdChlLHQpLGUubWl4aW4oVyksZS5wcm90b3R5cGUuZGF5R3JpZENsYXNzPVQsZS5wcm90b3R5cGUucmVuZGVySGVhZD1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5yZW5kZXJIZWFkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLmRheUdyaWQucHJvY2Vzc0hlYWRSZXNvdXJjZUVscyh0aGlzLmhlYWRDb250YWluZXJFbCl9LGUucHJvdG90eXBlLnNldFJlc291cmNlcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXlHcmlkLnNldFJlc291cmNlcyh0KSx0aGlzLmNsZWFyVmlldygpLHRoaXMuZGlzcGxheVZpZXcoKX0sZS5wcm90b3R5cGUudW5zZXRSZXNvdXJjZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbGVhckV2ZW50cygpLHRoaXMuZGF5R3JpZC51bnNldFJlc291cmNlcygpLHRoaXMuY2xlYXJWaWV3KCksdGhpcy5kaXNwbGF5VmlldygpfSxlfShkLk1vbnRoVmlldyksZC52aWV3cy5iYXNpYy5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7dmFyIGU7aWYobnVsbCE9KGU9dC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpP2U6MT09PXQuZHVyYXRpb24uYXMoImRheXMiKSlyZXR1cm4gSH0sZC52aWV3cy5tb250aC5xdWVyeVJlc291cmNlQ2xhc3M9ZnVuY3Rpb24odCl7aWYodC5vcHRpb25zLmdyb3VwQnlSZXNvdXJjZXx8dC5vcHRpb25zLmdyb3VwQnlEYXRlQW5kUmVzb3VyY2UpcmV0dXJuIHg7Cn0sQz0iMjAxNi0wOS0wNCIsWT17eWVhcnM6MSx3ZWVrczoxfSx5PSJodHRwOi8vZnVsbGNhbGVuZGFyLmlvL3NjaGVkdWxlci9saWNlbnNlLyIsYj1bIkdQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlIiwiQ0MtQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1Ob0Rlcml2YXRpdmVzIl0sR3Q9ZnVuY3Rpb24odCxlKXtpZighbXQod2luZG93LmxvY2F0aW9uLmhyZWYpJiYhUnQodCkmJiFzdChlKSlyZXR1cm4gV3QoJ1BsZWFzZSB1c2UgYSB2YWxpZCBsaWNlbnNlIGtleS4gPGEgaHJlZj0iJyt5KyciPk1vcmUgSW5mbzwvYT4nLGUpfSxSdD1mdW5jdGlvbihyKXt2YXIgbyxzLGksbjtyZXR1cm4gdC5pbkFycmF5KHIsYikhPT0tMXx8KHM9KHJ8fCIiKS5tYXRjaCgvXihcZCspXC1mY3NcLShcZCspJC8pLCEhKHMmJjEwPT09c1sxXS5sZW5ndGgmJihpPWUudXRjKDFlMypwYXJzZUludChzWzJdKSksbj1lLnV0YyhkLm1vY2tTY2hlZHVsZXJSZWxlYXNlRGF0ZXx8Qyksbi5pc1ZhbGlkKCkmJihvPW4uY2xvbmUoKS5zdWJ0cmFjdChZKSxpLmlzQWZ0ZXIobykpKSkpfSxtdD1mdW5jdGlvbih0KXtyZXR1cm4gQm9vbGVhbih0Lm1hdGNoKC9cdytcOlwvXC9mdWxsY2FsZW5kYXJcLmlvXC98XC9kZW1vc1wvW1x3LV0rXC5odG1sJC8pKX0sV3Q9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gci5hcHBlbmQodCgnPGRpdiBjbGFzcz0iZmMtbGljZW5zZS1tZXNzYWdlIiAvPicpLmh0bWwoZSkpfSx2b2lkKHN0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbmQoIi5mYy1saWNlbnNlLW1lc3NhZ2UiKS5sZW5ndGg+PTF9KSl9KTs=
Ly8hIG1vbWVudC5qcwovLyEgdmVyc2lvbiA6IDIuMTMuMAovLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9ycwovLyEgbGljZW5zZSA6IE1JVAovLyEgbW9tZW50anMuY29tCiFmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YigpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGIpOmEubW9tZW50PWIoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7cmV0dXJuIGZkLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBiKGEpe2ZkPWF9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlfHwiW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjLGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2goYihhW2NdLGMpKTtyZXR1cm4gZH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpfWZ1bmN0aW9uIGcoYSxiKXtmb3IodmFyIGMgaW4gYilmKGIsYykmJihhW2NdPWJbY10pO3JldHVybiBmKGIsInRvU3RyaW5nIikmJihhLnRvU3RyaW5nPWIudG9TdHJpbmcpLGYoYiwidmFsdWVPZiIpJiYoYS52YWx1ZU9mPWIudmFsdWVPZiksYX1mdW5jdGlvbiBoKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCEwKS51dGMoKX1mdW5jdGlvbiBpKCl7cmV0dXJue2VtcHR5OiExLHVudXNlZFRva2VuczpbXSx1bnVzZWRJbnB1dDpbXSxvdmVyZmxvdzotMixjaGFyc0xlZnRPdmVyOjAsbnVsbElucHV0OiExLGludmFsaWRNb250aDpudWxsLGludmFsaWRGb3JtYXQ6ITEsdXNlckludmFsaWRhdGVkOiExLGlzbzohMSxwYXJzZWREYXRlUGFydHM6W10sbWVyaWRpZW06bnVsbH19ZnVuY3Rpb24gaihhKXtyZXR1cm4gbnVsbD09YS5fcGYmJihhLl9wZj1pKCkpLGEuX3BmfWZ1bmN0aW9uIGsoYSl7aWYobnVsbD09YS5faXNWYWxpZCl7dmFyIGI9aihhKSxjPWdkLmNhbGwoYi5wYXJzZWREYXRlUGFydHMsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9KTthLl9pc1ZhbGlkPSFpc05hTihhLl9kLmdldFRpbWUoKSkmJmIub3ZlcmZsb3c8MCYmIWIuZW1wdHkmJiFiLmludmFsaWRNb250aCYmIWIuaW52YWxpZFdlZWtkYXkmJiFiLm51bGxJbnB1dCYmIWIuaW52YWxpZEZvcm1hdCYmIWIudXNlckludmFsaWRhdGVkJiYoIWIubWVyaWRpZW18fGIubWVyaWRpZW0mJmMpLGEuX3N0cmljdCYmKGEuX2lzVmFsaWQ9YS5faXNWYWxpZCYmMD09PWIuY2hhcnNMZWZ0T3ZlciYmMD09PWIudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09Yi5iaWdIb3VyKX1yZXR1cm4gYS5faXNWYWxpZH1mdW5jdGlvbiBsKGEpe3ZhciBiPWgoTmFOKTtyZXR1cm4gbnVsbCE9YT9nKGooYiksYSk6aihiKS51c2VySW52YWxpZGF0ZWQ9ITAsYn1mdW5jdGlvbiBtKGEpe3JldHVybiB2b2lkIDA9PT1hfWZ1bmN0aW9uIG4oYSxiKXt2YXIgYyxkLGU7aWYobShiLl9pc0FNb21lbnRPYmplY3QpfHwoYS5faXNBTW9tZW50T2JqZWN0PWIuX2lzQU1vbWVudE9iamVjdCksbShiLl9pKXx8KGEuX2k9Yi5faSksbShiLl9mKXx8KGEuX2Y9Yi5fZiksbShiLl9sKXx8KGEuX2w9Yi5fbCksbShiLl9zdHJpY3QpfHwoYS5fc3RyaWN0PWIuX3N0cmljdCksbShiLl90em0pfHwoYS5fdHptPWIuX3R6bSksbShiLl9pc1VUQyl8fChhLl9pc1VUQz1iLl9pc1VUQyksbShiLl9vZmZzZXQpfHwoYS5fb2Zmc2V0PWIuX29mZnNldCksbShiLl9wZil8fChhLl9wZj1qKGIpKSxtKGIuX2xvY2FsZSl8fChhLl9sb2NhbGU9Yi5fbG9jYWxlKSxoZC5sZW5ndGg+MClmb3IoYyBpbiBoZClkPWhkW2NdLGU9YltkXSxtKGUpfHwoYVtkXT1lKTtyZXR1cm4gYX1mdW5jdGlvbiBvKGIpe24odGhpcyxiKSx0aGlzLl9kPW5ldyBEYXRlKG51bGwhPWIuX2Q/Yi5fZC5nZXRUaW1lKCk6TmFOKSxpZD09PSExJiYoaWQ9ITAsYS51cGRhdGVPZmZzZXQodGhpcyksaWQ9ITEpfWZ1bmN0aW9uIHAoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBvfHxudWxsIT1hJiZudWxsIT1hLl9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gcShhKXtyZXR1cm4gMD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpfWZ1bmN0aW9uIHIoYSl7dmFyIGI9K2EsYz0wO3JldHVybiAwIT09YiYmaXNGaW5pdGUoYikmJihjPXEoYikpLGN9ZnVuY3Rpb24gcyhhLGIsYyl7dmFyIGQsZT1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCksZj1NYXRoLmFicyhhLmxlbmd0aC1iLmxlbmd0aCksZz0wO2ZvcihkPTA7ZT5kO2QrKykoYyYmYVtkXSE9PWJbZF18fCFjJiZyKGFbZF0pIT09cihiW2RdKSkmJmcrKztyZXR1cm4gZytmfWZ1bmN0aW9uIHQoYil7YS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmInVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiRGVwcmVjYXRpb24gd2FybmluZzogIitiKX1mdW5jdGlvbiB1KGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGcoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsYiksZCYmKHQoYisiXG5Bcmd1bWVudHM6ICIrQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsICIpKyJcbiIrKG5ldyBFcnJvcikuc3RhY2spLGQ9ITEpLGMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxjKX1mdW5jdGlvbiB2KGIsYyl7bnVsbCE9YS5kZXByZWNhdGlvbkhhbmRsZXImJmEuZGVwcmVjYXRpb25IYW5kbGVyKGIsYyksamRbYl18fCh0KGMpLGpkW2JdPSEwKX1mdW5jdGlvbiB3KGEpe3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24geChhKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX1mdW5jdGlvbiB5KGEpe3ZhciBiLGM7Zm9yKGMgaW4gYSliPWFbY10sdyhiKT90aGlzW2NdPWI6dGhpc1siXyIrY109Yjt0aGlzLl9jb25maWc9YSx0aGlzLl9vcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAodGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSsifCIrL1xkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24geihhLGIpe3ZhciBjLGQ9Zyh7fSxhKTtmb3IoYyBpbiBiKWYoYixjKSYmKHgoYVtjXSkmJngoYltjXSk/KGRbY109e30sZyhkW2NdLGFbY10pLGcoZFtjXSxiW2NdKSk6bnVsbCE9YltjXT9kW2NdPWJbY106ZGVsZXRlIGRbY10pO3JldHVybiBkfWZ1bmN0aW9uIEEoYSl7bnVsbCE9YSYmdGhpcy5zZXQoYSl9ZnVuY3Rpb24gQihhKXtyZXR1cm4gYT9hLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgiXyIsIi0iKTphfWZ1bmN0aW9uIEMoYSl7Zm9yKHZhciBiLGMsZCxlLGY9MDtmPGEubGVuZ3RoOyl7Zm9yKGU9QihhW2ZdKS5zcGxpdCgiLSIpLGI9ZS5sZW5ndGgsYz1CKGFbZisxXSksYz1jP2Muc3BsaXQoIi0iKTpudWxsO2I+MDspe2lmKGQ9RChlLnNsaWNlKDAsYikuam9pbigiLSIpKSlyZXR1cm4gZDtpZihjJiZjLmxlbmd0aD49YiYmcyhlLGMsITApPj1iLTEpYnJlYWs7Yi0tfWYrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiBEKGEpe3ZhciBiPW51bGw7aWYoIW5kW2FdJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyl0cnl7Yj1sZC5fYWJicixyZXF1aXJlKCIuL2xvY2FsZS8iK2EpLEUoYil9Y2F0Y2goYyl7fXJldHVybiBuZFthXX1mdW5jdGlvbiBFKGEsYil7dmFyIGM7cmV0dXJuIGEmJihjPW0oYik/SChhKTpGKGEsYiksYyYmKGxkPWMpKSxsZC5fYWJicn1mdW5jdGlvbiBGKGEsYil7cmV0dXJuIG51bGwhPT1iPyhiLmFiYnI9YSxudWxsIT1uZFthXT8odigiZGVmaW5lTG9jYWxlT3ZlcnJpZGUiLCJ1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSBhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUiKSxiPXoobmRbYV0uX2NvbmZpZyxiKSk6bnVsbCE9Yi5wYXJlbnRMb2NhbGUmJihudWxsIT1uZFtiLnBhcmVudExvY2FsZV0/Yj16KG5kW2IucGFyZW50TG9jYWxlXS5fY29uZmlnLGIpOnYoInBhcmVudExvY2FsZVVuZGVmaW5lZCIsInNwZWNpZmllZCBwYXJlbnRMb2NhbGUgaXMgbm90IGRlZmluZWQgeWV0IikpLG5kW2FdPW5ldyBBKGIpLEUoYSksbmRbYV0pOihkZWxldGUgbmRbYV0sbnVsbCl9ZnVuY3Rpb24gRyhhLGIpe2lmKG51bGwhPWIpe3ZhciBjO251bGwhPW5kW2FdJiYoYj16KG5kW2FdLl9jb25maWcsYikpLGM9bmV3IEEoYiksYy5wYXJlbnRMb2NhbGU9bmRbYV0sbmRbYV09YyxFKGEpfWVsc2UgbnVsbCE9bmRbYV0mJihudWxsIT1uZFthXS5wYXJlbnRMb2NhbGU/bmRbYV09bmRbYV0ucGFyZW50TG9jYWxlOm51bGwhPW5kW2FdJiZkZWxldGUgbmRbYV0pO3JldHVybiBuZFthXX1mdW5jdGlvbiBIKGEpe3ZhciBiO2lmKGEmJmEuX2xvY2FsZSYmYS5fbG9jYWxlLl9hYmJyJiYoYT1hLl9sb2NhbGUuX2FiYnIpLCFhKXJldHVybiBsZDtpZighYyhhKSl7aWYoYj1EKGEpKXJldHVybiBiO2E9W2FdfXJldHVybiBDKGEpfWZ1bmN0aW9uIEkoKXtyZXR1cm4ga2QobmQpfWZ1bmN0aW9uIEooYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7b2RbY109b2RbYysicyJdPW9kW2JdPWF9ZnVuY3Rpb24gSyhhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGE/b2RbYV18fG9kW2EudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIEwoYSl7dmFyIGIsYyxkPXt9O2ZvcihjIGluIGEpZihhLGMpJiYoYj1LKGMpLGImJihkW2JdPWFbY10pKTtyZXR1cm4gZH1mdW5jdGlvbiBNKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBudWxsIT1kPyhPKHRoaXMsYixkKSxhLnVwZGF0ZU9mZnNldCh0aGlzLGMpLHRoaXMpOk4odGhpcyxiKX19ZnVuY3Rpb24gTihhLGIpe3JldHVybiBhLmlzVmFsaWQoKT9hLl9kWyJnZXQiKyhhLl9pc1VUQz8iVVRDIjoiIikrYl0oKTpOYU59ZnVuY3Rpb24gTyhhLGIsYyl7YS5pc1ZhbGlkKCkmJmEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKStiXShjKX1mdW5jdGlvbiBQKGEsYil7dmFyIGM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWZvcihjIGluIGEpdGhpcy5zZXQoYyxhW2NdKTtlbHNlIGlmKGE9SyhhKSx3KHRoaXNbYV0pKXJldHVybiB0aGlzW2FdKGIpO3JldHVybiB0aGlzfWZ1bmN0aW9uIFEoYSxiLGMpe3ZhciBkPSIiK01hdGguYWJzKGEpLGU9Yi1kLmxlbmd0aCxmPWE+PTA7cmV0dXJuKGY/Yz8iKyI6IiI6Ii0iKStNYXRoLnBvdygxMCxNYXRoLm1heCgwLGUpKS50b1N0cmluZygpLnN1YnN0cigxKStkfWZ1bmN0aW9uIFIoYSxiLGMsZCl7dmFyIGU9ZDsic3RyaW5nIj09dHlwZW9mIGQmJihlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZF0oKX0pLGEmJihzZFthXT1lKSxiJiYoc2RbYlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gUShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiWzFdLGJbMl0pfSksYyYmKHNkW2NdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYSl9KX1mdW5jdGlvbiBTKGEpe3JldHVybiBhLm1hdGNoKC9cW1tcc1xTXS8pP2EucmVwbGFjZSgvXlxbfFxdJC9nLCIiKTphLnJlcGxhY2UoL1xcL2csIiIpfWZ1bmN0aW9uIFQoYSl7dmFyIGIsYyxkPWEubWF0Y2gocGQpO2ZvcihiPTAsYz1kLmxlbmd0aDtjPmI7YisrKXNkW2RbYl1dP2RbYl09c2RbZFtiXV06ZFtiXT1TKGRbYl0pO3JldHVybiBmdW5jdGlvbihiKXt2YXIgZSxmPSIiO2ZvcihlPTA7Yz5lO2UrKylmKz1kW2VdaW5zdGFuY2VvZiBGdW5jdGlvbj9kW2VdLmNhbGwoYixhKTpkW2VdO3JldHVybiBmfX1mdW5jdGlvbiBVKGEsYil7cmV0dXJuIGEuaXNWYWxpZCgpPyhiPVYoYixhLmxvY2FsZURhdGEoKSkscmRbYl09cmRbYl18fFQoYikscmRbYl0oYSkpOmEubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gVihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGIubG9uZ0RhdGVGb3JtYXQoYSl8fGF9dmFyIGQ9NTtmb3IocWQubGFzdEluZGV4PTA7ZD49MCYmcWQudGVzdChhKTspYT1hLnJlcGxhY2UocWQsYykscWQubGFzdEluZGV4PTAsZC09MTtyZXR1cm4gYX1mdW5jdGlvbiBXKGEsYixjKXtLZFthXT13KGIpP2I6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYSYmYz9jOmJ9fWZ1bmN0aW9uIFgoYSxiKXtyZXR1cm4gZihLZCxhKT9LZFthXShiLl9zdHJpY3QsYi5fbG9jYWxlKTpuZXcgUmVnRXhwKFkoYSkpfWZ1bmN0aW9uIFkoYSl7cmV0dXJuIFooYS5yZXBsYWNlKCJcXCIsIiIpLnJlcGxhY2UoL1xcKFxbKXxcXChcXSl8XFsoW15cXVxbXSopXF18XFwoLikvZyxmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBifHxjfHxkfHxlfSkpfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEucmVwbGFjZSgvWy1cL1xcXiQqKz8uKCl8W1xde31dL2csIlxcJCYiKX1mdW5jdGlvbiAkKGEsYil7dmFyIGMsZD1iO2Zvcigic3RyaW5nIj09dHlwZW9mIGEmJihhPVthXSksIm51bWJlciI9PXR5cGVvZiBiJiYoZD1mdW5jdGlvbihhLGMpe2NbYl09cihhKX0pLGM9MDtjPGEubGVuZ3RoO2MrKylMZFthW2NdXT1kfWZ1bmN0aW9uIF8oYSxiKXskKGEsZnVuY3Rpb24oYSxjLGQsZSl7ZC5fdz1kLl93fHx7fSxiKGEsZC5fdyxkLGUpfSl9ZnVuY3Rpb24gYWEoYSxiLGMpe251bGwhPWImJmYoTGQsYSkmJkxkW2FdKGIsYy5fYSxjLGEpfWZ1bmN0aW9uIGJhKGEsYil7cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGEsYisxLDApKS5nZXRVVENEYXRlKCl9ZnVuY3Rpb24gY2EoYSxiKXtyZXR1cm4gYyh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoc1thLm1vbnRoKCldOnRoaXMuX21vbnRoc1tWZC50ZXN0KGIpPyJmb3JtYXQiOiJzdGFuZGFsb25lIl1bYS5tb250aCgpXX1mdW5jdGlvbiBkYShhLGIpe3JldHVybiBjKHRoaXMuX21vbnRoc1Nob3J0KT90aGlzLl9tb250aHNTaG9ydFthLm1vbnRoKCldOnRoaXMuX21vbnRoc1Nob3J0W1ZkLnRlc3QoYik/ImZvcm1hdCI6InN0YW5kYWxvbmUiXVthLm1vbnRoKCldfWZ1bmN0aW9uIGVhKGEsYixjKXt2YXIgZCxlLGYsZz1hLnRvTG9jYWxlTG93ZXJDYXNlKCk7aWYoIXRoaXMuX21vbnRoc1BhcnNlKWZvcih0aGlzLl9tb250aHNQYXJzZT1bXSx0aGlzLl9sb25nTW9udGhzUGFyc2U9W10sdGhpcy5fc2hvcnRNb250aHNQYXJzZT1bXSxkPTA7MTI+ZDsrK2QpZj1oKFsyZTMsZF0pLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09dGhpcy5tb250aHNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX2xvbmdNb250aHNQYXJzZVtkXT10aGlzLm1vbnRocyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJNTU0iPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6Ik1NTSI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKSk6KGU9bWQuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKX1mdW5jdGlvbiBmYShhLGIsYyl7dmFyIGQsZSxmO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIGVhLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLGQ9MDsxMj5kO2QrKyl7aWYoZT1oKFsyZTMsZF0pLGMmJiF0aGlzLl9sb25nTW9udGhzUGFyc2VbZF0mJih0aGlzLl9sb25nTW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHMoZSwiIikucmVwbGFjZSgiLiIsIiIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cCgiXiIrdGhpcy5tb250aHNTaG9ydChlLCIiKS5yZXBsYWNlKCIuIiwiIikrIiQiLCJpIikpLGN8fHRoaXMuX21vbnRoc1BhcnNlW2RdfHwoZj0iXiIrdGhpcy5tb250aHMoZSwiIikrInxeIit0aGlzLm1vbnRoc1Nob3J0KGUsIiIpLHRoaXMuX21vbnRoc1BhcnNlW2RdPW5ldyBSZWdFeHAoZi5yZXBsYWNlKCIuIiwiIiksImkiKSksYyYmIk1NTU0iPT09YiYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmIk1NTSI9PT1iJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoIWMmJnRoaXMuX21vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdhKGEsYil7dmFyIGM7aWYoIWEuaXNWYWxpZCgpKXJldHVybiBhO2lmKCJzdHJpbmciPT10eXBlb2YgYilpZigvXlxkKyQvLnRlc3QoYikpYj1yKGIpO2Vsc2UgaWYoYj1hLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShiKSwibnVtYmVyIiE9dHlwZW9mIGIpcmV0dXJuIGE7cmV0dXJuIGM9TWF0aC5taW4oYS5kYXRlKCksYmEoYS55ZWFyKCksYikpLGEuX2RbInNldCIrKGEuX2lzVVRDPyJVVEMiOiIiKSsiTW9udGgiXShiLGMpLGF9ZnVuY3Rpb24gaGEoYil7cmV0dXJuIG51bGwhPWI/KGdhKHRoaXMsYiksYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcyk6Tih0aGlzLCJNb250aCIpfWZ1bmN0aW9uIGlhKCl7cmV0dXJuIGJhKHRoaXMueWVhcigpLHRoaXMubW9udGgoKSl9ZnVuY3Rpb24gamEoYSl7cmV0dXJuIHRoaXMuX21vbnRoc1BhcnNlRXhhY3Q/KGYodGhpcywiX21vbnRoc1JlZ2V4Iil8fGxhLmNhbGwodGhpcyksYT90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOnRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4fWZ1bmN0aW9uIGthKGEpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhmKHRoaXMsIl9tb250aHNSZWdleCIpfHxsYS5jYWxsKHRoaXMpLGE/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpOnRoaXMuX21vbnRoc1N0cmljdFJlZ2V4JiZhP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4fWZ1bmN0aW9uIGxhKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQ9W10sZT1bXSxmPVtdO2ZvcihiPTA7MTI+YjtiKyspYz1oKFsyZTMsYl0pLGQucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGMsIiIpKSxlLnB1c2godGhpcy5tb250aHMoYywiIikpLGYucHVzaCh0aGlzLm1vbnRocyhjLCIiKSksZi5wdXNoKHRoaXMubW9udGhzU2hvcnQoYywiIikpO2ZvcihkLnNvcnQoYSksZS5zb3J0KGEpLGYuc29ydChhKSxiPTA7MTI+YjtiKyspZFtiXT1aKGRbYl0pLGVbYl09WihlW2JdKSxmW2JdPVooZltiXSk7dGhpcy5fbW9udGhzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Yuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9dGhpcy5fbW9udGhzUmVnZXgsdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Uuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2Quam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG1hKGEpe3ZhciBiLGM9YS5fYTtyZXR1cm4gYyYmLTI9PT1qKGEpLm92ZXJmbG93JiYoYj1jW05kXTwwfHxjW05kXT4xMT9OZDpjW09kXTwxfHxjW09kXT5iYShjW01kXSxjW05kXSk/T2Q6Y1tQZF08MHx8Y1tQZF0+MjR8fDI0PT09Y1tQZF0mJigwIT09Y1tRZF18fDAhPT1jW1JkXXx8MCE9PWNbU2RdKT9QZDpjW1FkXTwwfHxjW1FkXT41OT9RZDpjW1JkXTwwfHxjW1JkXT41OT9SZDpjW1NkXTwwfHxjW1NkXT45OTk/U2Q6LTEsaihhKS5fb3ZlcmZsb3dEYXlPZlllYXImJihNZD5ifHxiPk9kKSYmKGI9T2QpLGooYSkuX292ZXJmbG93V2Vla3MmJi0xPT09YiYmKGI9VGQpLGooYSkuX292ZXJmbG93V2Vla2RheSYmLTE9PT1iJiYoYj1VZCksaihhKS5vdmVyZmxvdz1iKSxhfWZ1bmN0aW9uIG5hKGEpe3ZhciBiLGMsZCxlLGYsZyxoPWEuX2ksaT0kZC5leGVjKGgpfHxfZC5leGVjKGgpO2lmKGkpe2ZvcihqKGEpLmlzbz0hMCxiPTAsYz1iZS5sZW5ndGg7Yz5iO2IrKylpZihiZVtiXVsxXS5leGVjKGlbMV0pKXtlPWJlW2JdWzBdLGQ9YmVbYl1bMl0hPT0hMTticmVha31pZihudWxsPT1lKXJldHVybiB2b2lkKGEuX2lzVmFsaWQ9ITEpO2lmKGlbM10pe2ZvcihiPTAsYz1jZS5sZW5ndGg7Yz5iO2IrKylpZihjZVtiXVsxXS5leGVjKGlbM10pKXtmPShpWzJdfHwiICIpK2NlW2JdWzBdO2JyZWFrfWlmKG51bGw9PWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSl9aWYoIWQmJm51bGwhPWYpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7aWYoaVs0XSl7aWYoIWFlLmV4ZWMoaVs0XSkpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7Zz0iWiJ9YS5fZj1lKyhmfHwiIikrKGd8fCIiKSxDYShhKX1lbHNlIGEuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gb2EoYil7dmFyIGM9ZGUuZXhlYyhiLl9pKTtyZXR1cm4gbnVsbCE9PWM/dm9pZChiLl9kPW5ldyBEYXRlKCtjWzFdKSk6KG5hKGIpLHZvaWQoYi5faXNWYWxpZD09PSExJiYoZGVsZXRlIGIuX2lzVmFsaWQsYS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhiKSkpKX1mdW5jdGlvbiBwYShhLGIsYyxkLGUsZixnKXt2YXIgaD1uZXcgRGF0ZShhLGIsYyxkLGUsZixnKTtyZXR1cm4gMTAwPmEmJmE+PTAmJmlzRmluaXRlKGguZ2V0RnVsbFllYXIoKSkmJmguc2V0RnVsbFllYXIoYSksaH1mdW5jdGlvbiBxYShhKXt2YXIgYj1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiAxMDA+YSYmYT49MCYmaXNGaW5pdGUoYi5nZXRVVENGdWxsWWVhcigpKSYmYi5zZXRVVENGdWxsWWVhcihhKSxifWZ1bmN0aW9uIHJhKGEpe3JldHVybiBzYShhKT8zNjY6MzY1fWZ1bmN0aW9uIHNhKGEpe3JldHVybiBhJTQ9PT0wJiZhJTEwMCE9PTB8fGElNDAwPT09MH1mdW5jdGlvbiB0YSgpe3JldHVybiBzYSh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gdWEoYSxiLGMpe3ZhciBkPTcrYi1jLGU9KDcrcWEoYSwwLGQpLmdldFVUQ0RheSgpLWIpJTc7cmV0dXJuLWUrZC0xfWZ1bmN0aW9uIHZhKGEsYixjLGQsZSl7dmFyIGYsZyxoPSg3K2MtZCklNyxpPXVhKGEsZCxlKSxqPTErNyooYi0xKStoK2k7cmV0dXJuIDA+PWo/KGY9YS0xLGc9cmEoZikraik6aj5yYShhKT8oZj1hKzEsZz1qLXJhKGEpKTooZj1hLGc9aikse3llYXI6ZixkYXlPZlllYXI6Z319ZnVuY3Rpb24gd2EoYSxiLGMpe3ZhciBkLGUsZj11YShhLnllYXIoKSxiLGMpLGc9TWF0aC5mbG9vcigoYS5kYXlPZlllYXIoKS1mLTEpLzcpKzE7cmV0dXJuIDE+Zz8oZT1hLnllYXIoKS0xLGQ9Zyt4YShlLGIsYykpOmc+eGEoYS55ZWFyKCksYixjKT8oZD1nLXhhKGEueWVhcigpLGIsYyksZT1hLnllYXIoKSsxKTooZT1hLnllYXIoKSxkPWcpLHt3ZWVrOmQseWVhcjplfX1mdW5jdGlvbiB4YShhLGIsYyl7dmFyIGQ9dWEoYSxiLGMpLGU9dWEoYSsxLGIsYyk7cmV0dXJuKHJhKGEpLWQrZSkvN31mdW5jdGlvbiB5YShhLGIsYyl7cmV0dXJuIG51bGwhPWE/YTpudWxsIT1iP2I6Y31mdW5jdGlvbiB6YShiKXt2YXIgYz1uZXcgRGF0ZShhLm5vdygpKTtyZXR1cm4gYi5fdXNlVVRDP1tjLmdldFVUQ0Z1bGxZZWFyKCksYy5nZXRVVENNb250aCgpLGMuZ2V0VVRDRGF0ZSgpXTpbYy5nZXRGdWxsWWVhcigpLGMuZ2V0TW9udGgoKSxjLmdldERhdGUoKV19ZnVuY3Rpb24gQWEoYSl7dmFyIGIsYyxkLGUsZj1bXTtpZighYS5fZCl7Zm9yKGQ9emEoYSksYS5fdyYmbnVsbD09YS5fYVtPZF0mJm51bGw9PWEuX2FbTmRdJiZCYShhKSxhLl9kYXlPZlllYXImJihlPXlhKGEuX2FbTWRdLGRbTWRdKSxhLl9kYXlPZlllYXI+cmEoZSkmJihqKGEpLl9vdmVyZmxvd0RheU9mWWVhcj0hMCksYz1xYShlLDAsYS5fZGF5T2ZZZWFyKSxhLl9hW05kXT1jLmdldFVUQ01vbnRoKCksYS5fYVtPZF09Yy5nZXRVVENEYXRlKCkpLGI9MDszPmImJm51bGw9PWEuX2FbYl07KytiKWEuX2FbYl09ZltiXT1kW2JdO2Zvcig7Nz5iO2IrKylhLl9hW2JdPWZbYl09bnVsbD09YS5fYVtiXT8yPT09Yj8xOjA6YS5fYVtiXTsyND09PWEuX2FbUGRdJiYwPT09YS5fYVtRZF0mJjA9PT1hLl9hW1JkXSYmMD09PWEuX2FbU2RdJiYoYS5fbmV4dERheT0hMCxhLl9hW1BkXT0wKSxhLl9kPShhLl91c2VVVEM/cWE6cGEpLmFwcGx5KG51bGwsZiksbnVsbCE9YS5fdHptJiZhLl9kLnNldFVUQ01pbnV0ZXMoYS5fZC5nZXRVVENNaW51dGVzKCktYS5fdHptKSxhLl9uZXh0RGF5JiYoYS5fYVtQZF09MjQpfX1mdW5jdGlvbiBCYShhKXt2YXIgYixjLGQsZSxmLGcsaCxpO2I9YS5fdyxudWxsIT1iLkdHfHxudWxsIT1iLld8fG51bGwhPWIuRT8oZj0xLGc9NCxjPXlhKGIuR0csYS5fYVtNZF0sd2EoS2EoKSwxLDQpLnllYXIpLGQ9eWEoYi5XLDEpLGU9eWEoYi5FLDEpLCgxPmV8fGU+NykmJihpPSEwKSk6KGY9YS5fbG9jYWxlLl93ZWVrLmRvdyxnPWEuX2xvY2FsZS5fd2Vlay5kb3ksYz15YShiLmdnLGEuX2FbTWRdLHdhKEthKCksZixnKS55ZWFyKSxkPXlhKGIudywxKSxudWxsIT1iLmQ/KGU9Yi5kLCgwPmV8fGU+NikmJihpPSEwKSk6bnVsbCE9Yi5lPyhlPWIuZStmLChiLmU8MHx8Yi5lPjYpJiYoaT0hMCkpOmU9ZiksMT5kfHxkPnhhKGMsZixnKT9qKGEpLl9vdmVyZmxvd1dlZWtzPSEwOm51bGwhPWk/aihhKS5fb3ZlcmZsb3dXZWVrZGF5PSEwOihoPXZhKGMsZCxlLGYsZyksYS5fYVtNZF09aC55ZWFyLGEuX2RheU9mWWVhcj1oLmRheU9mWWVhcil9ZnVuY3Rpb24gQ2EoYil7aWYoYi5fZj09PWEuSVNPXzg2MDEpcmV0dXJuIHZvaWQgbmEoYik7Yi5fYT1bXSxqKGIpLmVtcHR5PSEwO3ZhciBjLGQsZSxmLGcsaD0iIitiLl9pLGk9aC5sZW5ndGgsaz0wO2ZvcihlPVYoYi5fZixiLl9sb2NhbGUpLm1hdGNoKHBkKXx8W10sYz0wO2M8ZS5sZW5ndGg7YysrKWY9ZVtjXSxkPShoLm1hdGNoKFgoZixiKSl8fFtdKVswXSxkJiYoZz1oLnN1YnN0cigwLGguaW5kZXhPZihkKSksZy5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGcpLGg9aC5zbGljZShoLmluZGV4T2YoZCkrZC5sZW5ndGgpLGsrPWQubGVuZ3RoKSxzZFtmXT8oZD9qKGIpLmVtcHR5PSExOmooYikudW51c2VkVG9rZW5zLnB1c2goZiksYWEoZixkLGIpKTpiLl9zdHJpY3QmJiFkJiZqKGIpLnVudXNlZFRva2Vucy5wdXNoKGYpO2ooYikuY2hhcnNMZWZ0T3Zlcj1pLWssaC5sZW5ndGg+MCYmaihiKS51bnVzZWRJbnB1dC5wdXNoKGgpLGooYikuYmlnSG91cj09PSEwJiZiLl9hW1BkXTw9MTImJmIuX2FbUGRdPjAmJihqKGIpLmJpZ0hvdXI9dm9pZCAwKSxqKGIpLnBhcnNlZERhdGVQYXJ0cz1iLl9hLnNsaWNlKDApLGooYikubWVyaWRpZW09Yi5fbWVyaWRpZW0sYi5fYVtQZF09RGEoYi5fbG9jYWxlLGIuX2FbUGRdLGIuX21lcmlkaWVtKSxBYShiKSxtYShiKX1mdW5jdGlvbiBEYShhLGIsYyl7dmFyIGQ7cmV0dXJuIG51bGw9PWM/YjpudWxsIT1hLm1lcmlkaWVtSG91cj9hLm1lcmlkaWVtSG91cihiLGMpOm51bGwhPWEuaXNQTT8oZD1hLmlzUE0oYyksZCYmMTI+YiYmKGIrPTEyKSxkfHwxMiE9PWJ8fChiPTApLGIpOmJ9ZnVuY3Rpb24gRWEoYSl7dmFyIGIsYyxkLGUsZjtpZigwPT09YS5fZi5sZW5ndGgpcmV0dXJuIGooYSkuaW52YWxpZEZvcm1hdD0hMCx2b2lkKGEuX2Q9bmV3IERhdGUoTmFOKSk7Zm9yKGU9MDtlPGEuX2YubGVuZ3RoO2UrKylmPTAsYj1uKHt9LGEpLG51bGwhPWEuX3VzZVVUQyYmKGIuX3VzZVVUQz1hLl91c2VVVEMpLGIuX2Y9YS5fZltlXSxDYShiKSxrKGIpJiYoZis9aihiKS5jaGFyc0xlZnRPdmVyLGYrPTEwKmooYikudW51c2VkVG9rZW5zLmxlbmd0aCxqKGIpLnNjb3JlPWYsKG51bGw9PWR8fGQ+ZikmJihkPWYsYz1iKSk7ZyhhLGN8fGIpfWZ1bmN0aW9uIEZhKGEpe2lmKCFhLl9kKXt2YXIgYj1MKGEuX2kpO2EuX2E9ZShbYi55ZWFyLGIubW9udGgsYi5kYXl8fGIuZGF0ZSxiLmhvdXIsYi5taW51dGUsYi5zZWNvbmQsYi5taWxsaXNlY29uZF0sZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnBhcnNlSW50KGEsMTApfSksQWEoYSl9fWZ1bmN0aW9uIEdhKGEpe3ZhciBiPW5ldyBvKG1hKEhhKGEpKSk7cmV0dXJuIGIuX25leHREYXkmJihiLmFkZCgxLCJkIiksYi5fbmV4dERheT12b2lkIDApLGJ9ZnVuY3Rpb24gSGEoYSl7dmFyIGI9YS5faSxlPWEuX2Y7cmV0dXJuIGEuX2xvY2FsZT1hLl9sb2NhbGV8fEgoYS5fbCksbnVsbD09PWJ8fHZvaWQgMD09PWUmJiIiPT09Yj9sKHtudWxsSW5wdXQ6ITB9KTooInN0cmluZyI9PXR5cGVvZiBiJiYoYS5faT1iPWEuX2xvY2FsZS5wcmVwYXJzZShiKSkscChiKT9uZXcgbyhtYShiKSk6KGMoZSk/RWEoYSk6ZT9DYShhKTpkKGIpP2EuX2Q9YjpJYShhKSxrKGEpfHwoYS5fZD1udWxsKSxhKSl9ZnVuY3Rpb24gSWEoYil7dmFyIGY9Yi5faTt2b2lkIDA9PT1mP2IuX2Q9bmV3IERhdGUoYS5ub3coKSk6ZChmKT9iLl9kPW5ldyBEYXRlKGYudmFsdWVPZigpKToic3RyaW5nIj09dHlwZW9mIGY/b2EoYik6YyhmKT8oYi5fYT1lKGYuc2xpY2UoMCksZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfSksQWEoYikpOiJvYmplY3QiPT10eXBlb2YgZj9GYShiKToibnVtYmVyIj09dHlwZW9mIGY/Yi5fZD1uZXcgRGF0ZShmKTphLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGIpfWZ1bmN0aW9uIEphKGEsYixjLGQsZSl7dmFyIGY9e307cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYyYmKGQ9YyxjPXZvaWQgMCksZi5faXNBTW9tZW50T2JqZWN0PSEwLGYuX3VzZVVUQz1mLl9pc1VUQz1lLGYuX2w9YyxmLl9pPWEsZi5fZj1iLGYuX3N0cmljdD1kLEdhKGYpfWZ1bmN0aW9uIEthKGEsYixjLGQpe3JldHVybiBKYShhLGIsYyxkLCExKX1mdW5jdGlvbiBMYShhLGIpe3ZhciBkLGU7aWYoMT09PWIubGVuZ3RoJiZjKGJbMF0pJiYoYj1iWzBdKSwhYi5sZW5ndGgpcmV0dXJuIEthKCk7Zm9yKGQ9YlswXSxlPTE7ZTxiLmxlbmd0aDsrK2UpKCFiW2VdLmlzVmFsaWQoKXx8YltlXVthXShkKSkmJihkPWJbZV0pO3JldHVybiBkfWZ1bmN0aW9uIE1hKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIExhKCJpc0JlZm9yZSIsYSl9ZnVuY3Rpb24gTmEoKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gTGEoImlzQWZ0ZXIiLGEpfWZ1bmN0aW9uIE9hKGEpe3ZhciBiPUwoYSksYz1iLnllYXJ8fDAsZD1iLnF1YXJ0ZXJ8fDAsZT1iLm1vbnRofHwwLGY9Yi53ZWVrfHwwLGc9Yi5kYXl8fDAsaD1iLmhvdXJ8fDAsaT1iLm1pbnV0ZXx8MCxqPWIuc2Vjb25kfHwwLGs9Yi5taWxsaXNlY29uZHx8MDt0aGlzLl9taWxsaXNlY29uZHM9K2srMWUzKmorNmU0KmkrMWUzKmgqNjAqNjAsdGhpcy5fZGF5cz0rZys3KmYsdGhpcy5fbW9udGhzPStlKzMqZCsxMipjLHRoaXMuX2RhdGE9e30sdGhpcy5fbG9jYWxlPUgoKSx0aGlzLl9idWJibGUoKX1mdW5jdGlvbiBQYShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE9hfWZ1bmN0aW9uIFFhKGEsYil7UihhLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMudXRjT2Zmc2V0KCksYz0iKyI7cmV0dXJuIDA+YSYmKGE9LWEsYz0iLSIpLGMrUSh+fihhLzYwKSwyKStiK1Eofn5hJTYwLDIpfSl9ZnVuY3Rpb24gUmEoYSxiKXt2YXIgYz0oYnx8IiIpLm1hdGNoKGEpfHxbXSxkPWNbYy5sZW5ndGgtMV18fFtdLGU9KGQrIiIpLm1hdGNoKGllKXx8WyItIiwwLDBdLGY9Kyg2MCplWzFdKStyKGVbMl0pO3JldHVybiIrIj09PWVbMF0/ZjotZn1mdW5jdGlvbiBTYShiLGMpe3ZhciBlLGY7cmV0dXJuIGMuX2lzVVRDPyhlPWMuY2xvbmUoKSxmPShwKGIpfHxkKGIpP2IudmFsdWVPZigpOkthKGIpLnZhbHVlT2YoKSktZS52YWx1ZU9mKCksZS5fZC5zZXRUaW1lKGUuX2QudmFsdWVPZigpK2YpLGEudXBkYXRlT2Zmc2V0KGUsITEpLGUpOkthKGIpLmxvY2FsKCl9ZnVuY3Rpb24gVGEoYSl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKGEuX2QuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9ZnVuY3Rpb24gVWEoYixjKXt2YXIgZCxlPXRoaXMuX29mZnNldHx8MDtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/bnVsbCE9Yj8oInN0cmluZyI9PXR5cGVvZiBiP2I9UmEoSGQsYik6TWF0aC5hYnMoYik8MTYmJihiPTYwKmIpLCF0aGlzLl9pc1VUQyYmYyYmKGQ9VGEodGhpcykpLHRoaXMuX29mZnNldD1iLHRoaXMuX2lzVVRDPSEwLG51bGwhPWQmJnRoaXMuYWRkKGQsIm0iKSxlIT09YiYmKCFjfHx0aGlzLl9jaGFuZ2VJblByb2dyZXNzP2piKHRoaXMsZGIoYi1lLCJtIiksMSwhMSk6dGhpcy5fY2hhbmdlSW5Qcm9ncmVzc3x8KHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9ITAsYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz1udWxsKSksdGhpcyk6dGhpcy5faXNVVEM/ZTpUYSh0aGlzKTpudWxsIT1iP3RoaXM6TmFOfWZ1bmN0aW9uIFZhKGEsYil7cmV0dXJuIG51bGwhPWE/KCJzdHJpbmciIT10eXBlb2YgYSYmKGE9LWEpLHRoaXMudXRjT2Zmc2V0KGEsYiksdGhpcyk6LXRoaXMudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gV2EoYSl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsYSl9ZnVuY3Rpb24gWGEoYSl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCxhKSx0aGlzLl9pc1VUQz0hMSxhJiZ0aGlzLnN1YnRyYWN0KFRhKHRoaXMpLCJtIikpLHRoaXN9ZnVuY3Rpb24gWWEoKXtyZXR1cm4gdGhpcy5fdHptP3RoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSk6InN0cmluZyI9PXR5cGVvZiB0aGlzLl9pJiZ0aGlzLnV0Y09mZnNldChSYShHZCx0aGlzLl9pKSksdGhpc31mdW5jdGlvbiBaYShhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/KGE9YT9LYShhKS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLWEpJTYwPT09MCk6ITF9ZnVuY3Rpb24gJGEoKXtyZXR1cm4gdGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCl8fHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpfWZ1bmN0aW9uIF9hKCl7aWYoIW0odGhpcy5faXNEU1RTaGlmdGVkKSlyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO3ZhciBhPXt9O2lmKG4oYSx0aGlzKSxhPUhhKGEpLGEuX2Epe3ZhciBiPWEuX2lzVVRDP2goYS5fYSk6S2EoYS5fYSk7dGhpcy5faXNEU1RTaGlmdGVkPXRoaXMuaXNWYWxpZCgpJiZzKGEuX2EsYi50b0FycmF5KCkpPjB9ZWxzZSB0aGlzLl9pc0RTVFNoaWZ0ZWQ9ITE7cmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZH1mdW5jdGlvbiBhYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT8hdGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gYmIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEM6ITF9ZnVuY3Rpb24gY2IoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQ6ITF9ZnVuY3Rpb24gZGIoYSxiKXt2YXIgYyxkLGUsZz1hLGg9bnVsbDtyZXR1cm4gUGEoYSk/Zz17bXM6YS5fbWlsbGlzZWNvbmRzLGQ6YS5fZGF5cyxNOmEuX21vbnRoc306Im51bWJlciI9PXR5cGVvZiBhPyhnPXt9LGI/Z1tiXT1hOmcubWlsbGlzZWNvbmRzPWEpOihoPWplLmV4ZWMoYSkpPyhjPSItIj09PWhbMV0/LTE6MSxnPXt5OjAsZDpyKGhbT2RdKSpjLGg6cihoW1BkXSkqYyxtOnIoaFtRZF0pKmMsczpyKGhbUmRdKSpjLG1zOnIoaFtTZF0pKmN9KTooaD1rZS5leGVjKGEpKT8oYz0iLSI9PT1oWzFdPy0xOjEsZz17eTplYihoWzJdLGMpLE06ZWIoaFszXSxjKSx3OmViKGhbNF0sYyksZDplYihoWzVdLGMpLGg6ZWIoaFs2XSxjKSxtOmViKGhbN10sYyksczplYihoWzhdLGMpfSk6bnVsbD09Zz9nPXt9OiJvYmplY3QiPT10eXBlb2YgZyYmKCJmcm9tImluIGd8fCJ0byJpbiBnKSYmKGU9Z2IoS2EoZy5mcm9tKSxLYShnLnRvKSksZz17fSxnLm1zPWUubWlsbGlzZWNvbmRzLGcuTT1lLm1vbnRocyksZD1uZXcgT2EoZyksUGEoYSkmJmYoYSwiX2xvY2FsZSIpJiYoZC5fbG9jYWxlPWEuX2xvY2FsZSksZH1mdW5jdGlvbiBlYihhLGIpe3ZhciBjPWEmJnBhcnNlRmxvYXQoYS5yZXBsYWNlKCIsIiwiLiIpKTtyZXR1cm4oaXNOYU4oYyk/MDpjKSpifWZ1bmN0aW9uIGZiKGEsYil7dmFyIGM9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gYy5tb250aHM9Yi5tb250aCgpLWEubW9udGgoKSsxMiooYi55ZWFyKCktYS55ZWFyKCkpLGEuY2xvbmUoKS5hZGQoYy5tb250aHMsIk0iKS5pc0FmdGVyKGIpJiYtLWMubW9udGhzLGMubWlsbGlzZWNvbmRzPStiLSthLmNsb25lKCkuYWRkKGMubW9udGhzLCJNIiksY31mdW5jdGlvbiBnYihhLGIpe3ZhciBjO3JldHVybiBhLmlzVmFsaWQoKSYmYi5pc1ZhbGlkKCk/KGI9U2EoYixhKSxhLmlzQmVmb3JlKGIpP2M9ZmIoYSxiKTooYz1mYihiLGEpLGMubWlsbGlzZWNvbmRzPS1jLm1pbGxpc2Vjb25kcyxjLm1vbnRocz0tYy5tb250aHMpLGMpOnttaWxsaXNlY29uZHM6MCxtb250aHM6MH19ZnVuY3Rpb24gaGIoYSl7cmV0dXJuIDA+YT8tMSpNYXRoLnJvdW5kKC0xKmEpOk1hdGgucm91bmQoYSl9ZnVuY3Rpb24gaWIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXt2YXIgZSxmO3JldHVybiBudWxsPT09ZHx8aXNOYU4oK2QpfHwodihiLCJtb21lbnQoKS4iK2IrIihwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4iK2IrIihudW1iZXIsIHBlcmlvZCkuIiksZj1jLGM9ZCxkPWYpLGM9InN0cmluZyI9PXR5cGVvZiBjPytjOmMsZT1kYihjLGQpLGpiKHRoaXMsZSxhKSx0aGlzfX1mdW5jdGlvbiBqYihiLGMsZCxlKXt2YXIgZj1jLl9taWxsaXNlY29uZHMsZz1oYihjLl9kYXlzKSxoPWhiKGMuX21vbnRocyk7Yi5pc1ZhbGlkKCkmJihlPW51bGw9PWU/ITA6ZSxmJiZiLl9kLnNldFRpbWUoYi5fZC52YWx1ZU9mKCkrZipkKSxnJiZPKGIsIkRhdGUiLE4oYiwiRGF0ZSIpK2cqZCksaCYmZ2EoYixOKGIsIk1vbnRoIikraCpkKSxlJiZhLnVwZGF0ZU9mZnNldChiLGd8fGgpKX1mdW5jdGlvbiBrYihhLGIpe3ZhciBjPWF8fEthKCksZD1TYShjLHRoaXMpLnN0YXJ0T2YoImRheSIpLGU9dGhpcy5kaWZmKGQsImRheXMiLCEwKSxmPS02PmU/InNhbWVFbHNlIjotMT5lPyJsYXN0V2VlayI6MD5lPyJsYXN0RGF5IjoxPmU/InNhbWVEYXkiOjI+ZT8ibmV4dERheSI6Nz5lPyJuZXh0V2VlayI6InNhbWVFbHNlIixnPWImJih3KGJbZl0pP2JbZl0oKTpiW2ZdKTtyZXR1cm4gdGhpcy5mb3JtYXQoZ3x8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZix0aGlzLEthKGMpKSl9ZnVuY3Rpb24gbGIoKXtyZXR1cm4gbmV3IG8odGhpcyl9ZnVuY3Rpb24gbWIoYSxiKXt2YXIgYz1wKGEpP2E6S2EoYSk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZjLmlzVmFsaWQoKT8oYj1LKG0oYik/Im1pbGxpc2Vjb25kIjpiKSwibWlsbGlzZWNvbmQiPT09Yj90aGlzLnZhbHVlT2YoKT5jLnZhbHVlT2YoKTpjLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCkpOiExfWZ1bmN0aW9uIG5iKGEsYil7dmFyIGM9cChhKT9hOkthKGEpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmYy5pc1ZhbGlkKCk/KGI9SyhtKGIpPyJtaWxsaXNlY29uZCI6YiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk8Yy52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKGIpLnZhbHVlT2YoKTxjLnZhbHVlT2YoKSk6ITF9ZnVuY3Rpb24gb2IoYSxiLGMsZCl7cmV0dXJuIGQ9ZHx8IigpIiwoIigiPT09ZFswXT90aGlzLmlzQWZ0ZXIoYSxjKTohdGhpcy5pc0JlZm9yZShhLGMpKSYmKCIpIj09PWRbMV0/dGhpcy5pc0JlZm9yZShiLGMpOiF0aGlzLmlzQWZ0ZXIoYixjKSl9ZnVuY3Rpb24gcGIoYSxiKXt2YXIgYyxkPXAoYSk/YTpLYShhKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmQuaXNWYWxpZCgpPyhiPUsoYnx8Im1pbGxpc2Vjb25kIiksIm1pbGxpc2Vjb25kIj09PWI/dGhpcy52YWx1ZU9mKCk9PT1kLnZhbHVlT2YoKTooYz1kLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihiKS52YWx1ZU9mKCk8PWMmJmM8PXRoaXMuY2xvbmUoKS5lbmRPZihiKS52YWx1ZU9mKCkpKTohMX1mdW5jdGlvbiBxYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQWZ0ZXIoYSxiKX1mdW5jdGlvbiByYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQmVmb3JlKGEsYil9ZnVuY3Rpb24gc2IoYSxiLGMpe3ZhciBkLGUsZixnO3JldHVybiB0aGlzLmlzVmFsaWQoKT8oZD1TYShhLHRoaXMpLGQuaXNWYWxpZCgpPyhlPTZlNCooZC51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSxiPUsoYiksInllYXIiPT09Ynx8Im1vbnRoIj09PWJ8fCJxdWFydGVyIj09PWI/KGc9dGIodGhpcyxkKSwicXVhcnRlciI9PT1iP2cvPTM6InllYXIiPT09YiYmKGcvPTEyKSk6KGY9dGhpcy1kLGc9InNlY29uZCI9PT1iP2YvMWUzOiJtaW51dGUiPT09Yj9mLzZlNDoiaG91ciI9PT1iP2YvMzZlNToiZGF5Ij09PWI/KGYtZSkvODY0ZTU6IndlZWsiPT09Yj8oZi1lKS82MDQ4ZTU6ZiksYz9nOnEoZykpOk5hTik6TmFOfWZ1bmN0aW9uIHRiKGEsYil7dmFyIGMsZCxlPTEyKihiLnllYXIoKS1hLnllYXIoKSkrKGIubW9udGgoKS1hLm1vbnRoKCkpLGY9YS5jbG9uZSgpLmFkZChlLCJtb250aHMiKTtyZXR1cm4gMD5iLWY/KGM9YS5jbG9uZSgpLmFkZChlLTEsIm1vbnRocyIpLGQ9KGItZikvKGYtYykpOihjPWEuY2xvbmUoKS5hZGQoZSsxLCJtb250aHMiKSxkPShiLWYpLyhjLWYpKSwtKGUrZCl8fDB9ZnVuY3Rpb24gdWIoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgiZW4iKS5mb3JtYXQoImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaIil9ZnVuY3Rpb24gdmIoKXt2YXIgYT10aGlzLmNsb25lKCkudXRjKCk7cmV0dXJuIDA8YS55ZWFyKCkmJmEueWVhcigpPD05OTk5P3coRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpP3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTpVKGEsIllZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0iKTpVKGEsIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSIpfWZ1bmN0aW9uIHdiKGIpe2J8fChiPXRoaXMuaXNVdGMoKT9hLmRlZmF1bHRGb3JtYXRVdGM6YS5kZWZhdWx0Rm9ybWF0KTt2YXIgYz1VKHRoaXMsYik7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQoYyl9ZnVuY3Rpb24geGIoYSxiKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJihwKGEpJiZhLmlzVmFsaWQoKXx8S2EoYSkuaXNWYWxpZCgpKT9kYih7dG86dGhpcyxmcm9tOmF9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWIpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIHRoaXMuZnJvbShLYSgpLGEpfWZ1bmN0aW9uIHpiKGEsYil7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYocChhKSYmYS5pc1ZhbGlkKCl8fEthKGEpLmlzVmFsaWQoKSk/ZGIoe2Zyb206dGhpcyx0bzphfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFiKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIEFiKGEpe3JldHVybiB0aGlzLnRvKEthKCksYSl9ZnVuY3Rpb24gQmIoYSl7dmFyIGI7cmV0dXJuIHZvaWQgMD09PWE/dGhpcy5fbG9jYWxlLl9hYmJyOihiPUgoYSksbnVsbCE9YiYmKHRoaXMuX2xvY2FsZT1iKSx0aGlzKX1mdW5jdGlvbiBDYigpe3JldHVybiB0aGlzLl9sb2NhbGV9ZnVuY3Rpb24gRGIoYSl7c3dpdGNoKGE9SyhhKSl7Y2FzZSJ5ZWFyIjp0aGlzLm1vbnRoKDApO2Nhc2UicXVhcnRlciI6Y2FzZSJtb250aCI6dGhpcy5kYXRlKDEpO2Nhc2Uid2VlayI6Y2FzZSJpc29XZWVrIjpjYXNlImRheSI6Y2FzZSJkYXRlIjp0aGlzLmhvdXJzKDApO2Nhc2UiaG91ciI6dGhpcy5taW51dGVzKDApO2Nhc2UibWludXRlIjp0aGlzLnNlY29uZHMoMCk7Y2FzZSJzZWNvbmQiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVybiJ3ZWVrIj09PWEmJnRoaXMud2Vla2RheSgwKSwiaXNvV2VlayI9PT1hJiZ0aGlzLmlzb1dlZWtkYXkoMSksInF1YXJ0ZXIiPT09YSYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIEViKGEpe3JldHVybiBhPUsoYSksdm9pZCAwPT09YXx8Im1pbGxpc2Vjb25kIj09PWE/dGhpczooImRhdGUiPT09YSYmKGE9ImRheSIpLHRoaXMuc3RhcnRPZihhKS5hZGQoMSwiaXNvV2VlayI9PT1hPyJ3ZWVrIjphKS5zdWJ0cmFjdCgxLCJtcyIpKX1mdW5jdGlvbiBGYigpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gR2IoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIEhiKCl7cmV0dXJuIHRoaXMuX29mZnNldD9uZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk6dGhpcy5fZH1mdW5jdGlvbiBJYigpe3ZhciBhPXRoaXM7cmV0dXJuW2EueWVhcigpLGEubW9udGgoKSxhLmRhdGUoKSxhLmhvdXIoKSxhLm1pbnV0ZSgpLGEuc2Vjb25kKCksYS5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBKYigpe3ZhciBhPXRoaXM7cmV0dXJue3llYXJzOmEueWVhcigpLG1vbnRoczphLm1vbnRoKCksZGF0ZTphLmRhdGUoKSxob3VyczphLmhvdXJzKCksbWludXRlczphLm1pbnV0ZXMoKSxzZWNvbmRzOmEuc2Vjb25kcygpLG1pbGxpc2Vjb25kczphLm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBLYigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBMYigpe3JldHVybiBrKHRoaXMpfWZ1bmN0aW9uIE1iKCl7cmV0dXJuIGcoe30saih0aGlzKSl9ZnVuY3Rpb24gTmIoKXtyZXR1cm4gaih0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBPYigpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gUGIoYSxiKXtSKDAsW2EsYS5sZW5ndGhdLDAsYil9ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIFViLmNhbGwodGhpcyxhLHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIFJiKGEpe3JldHVybiBVYi5jYWxsKHRoaXMsYSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIFNiKCl7cmV0dXJuIHhhKHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gVGIoKXt2YXIgYT10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4geGEodGhpcy55ZWFyKCksYS5kb3csYS5kb3kpfWZ1bmN0aW9uIFViKGEsYixjLGQsZSl7dmFyIGY7cmV0dXJuIG51bGw9PWE/d2EodGhpcyxkLGUpLnllYXI6KGY9eGEoYSxkLGUpLGI+ZiYmKGI9ZiksVmIuY2FsbCh0aGlzLGEsYixjLGQsZSkpfWZ1bmN0aW9uIFZiKGEsYixjLGQsZSl7dmFyIGY9dmEoYSxiLGMsZCxlKSxnPXFhKGYueWVhciwwLGYuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKGcuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChnLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShnLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBXYihhKXtyZXR1cm4gbnVsbD09YT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKGEtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFhiKGEpe3JldHVybiB3YShhLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFliKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIFpiKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uICRiKGEpe3ZhciBiPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gX2IoYSl7dmFyIGI9d2EodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLCJkIil9ZnVuY3Rpb24gYWMoYSxiKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGE/YTppc05hTihhKT8oYT1iLndlZWtkYXlzUGFyc2UoYSksIm51bWJlciI9PXR5cGVvZiBhP2E6bnVsbCk6cGFyc2VJbnQoYSwxMCl9ZnVuY3Rpb24gYmMoYSxiKXtyZXR1cm4gYyh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbYS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChiKT8iZm9ybWF0Ijoic3RhbmRhbG9uZSJdW2EuZGF5KCldfWZ1bmN0aW9uIGNjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W2EuZGF5KCldfWZ1bmN0aW9uIGRjKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c01pblthLmRheSgpXX1mdW5jdGlvbiBlYyhhLGIsYyl7dmFyIGQsZSxmLGc9YS50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKCF0aGlzLl93ZWVrZGF5c1BhcnNlKWZvcih0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLGQ9MDs3PmQ7KytkKWY9aChbMmUzLDFdKS5kYXkoZCksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT10aGlzLndlZWtkYXlzTWluKGYsIiIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2RdPXRoaXMud2Vla2RheXNTaG9ydChmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpLHRoaXMuX3dlZWtkYXlzUGFyc2VbZF09dGhpcy53ZWVrZGF5cyhmLCIiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBjPyJkZGRkIj09PWI/KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpOiJkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTpudWxsKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCk6ImRkZGQiPT09Yj8oZT1tZC5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSk6ImRkZCI9PT1iPyhlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxnKSwtMSE9PWU/ZTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6bnVsbCkpKTooZT1tZC5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsZyksLTEhPT1lP2U6KGU9bWQuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOihlPW1kLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLGcpLC0xIT09ZT9lOm51bGwpKSl9ZnVuY3Rpb24gZmMoYSxiLGMpe3ZhciBkLGUsZjtpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIGVjLmNhbGwodGhpcyxhLGIsYyk7Zm9yKHRoaXMuX3dlZWtkYXlzUGFyc2V8fCh0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlPVtdKSxkPTA7Nz5kO2QrKyl7aWYoZT1oKFsyZTMsMV0pLmRheShkKSxjJiYhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbZF0mJih0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzU2hvcnQoZSwiIikucmVwbGFjZSgiLiIsIi4/IikrIiQiLCJpIiksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKCJeIit0aGlzLndlZWtkYXlzTWluKGUsIiIpLnJlcGxhY2UoIi4iLCIuPyIpKyIkIiwiaSIpKSx0aGlzLl93ZWVrZGF5c1BhcnNlW2RdfHwoZj0iXiIrdGhpcy53ZWVrZGF5cyhlLCIiKSsifF4iK3RoaXMud2Vla2RheXNTaG9ydChlLCIiKSsifF4iK3RoaXMud2Vla2RheXNNaW4oZSwiIiksdGhpcy5fd2Vla2RheXNQYXJzZVtkXT1uZXcgUmVnRXhwKGYucmVwbGFjZSgiLiIsIiIpLCJpIikpLGMmJiJkZGRkIj09PWImJnRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmImRkZCI9PT1iJiZ0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbZF0udGVzdChhKSlyZXR1cm4gZDtpZihjJiYiZGQiPT09YiYmdGhpcy5fbWluV2Vla2RheXNQYXJzZVtkXS50ZXN0KGEpKXJldHVybiBkO2lmKCFjJiZ0aGlzLl93ZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIGdjKGEpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9YT90aGlzOk5hTjt2YXIgYj10aGlzLl9pc1VUQz90aGlzLl9kLmdldFVUQ0RheSgpOnRoaXMuX2QuZ2V0RGF5KCk7cmV0dXJuIG51bGwhPWE/KGE9YWMoYSx0aGlzLmxvY2FsZURhdGEoKSksdGhpcy5hZGQoYS1iLCJkIikpOmJ9ZnVuY3Rpb24gaGMoYSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1hP3RoaXM6TmFOO3ZhciBiPSh0aGlzLmRheSgpKzctdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSU3O3JldHVybiBudWxsPT1hP2I6dGhpcy5hZGQoYS1iLCJkIil9ZnVuY3Rpb24gaWMoYSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP251bGw9PWE/dGhpcy5kYXkoKXx8Nzp0aGlzLmRheSh0aGlzLmRheSgpJTc/YTphLTcpOm51bGwhPWE/dGhpczpOYU59ZnVuY3Rpb24gamMoYSl7cmV0dXJuIHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdD8oZih0aGlzLCJfd2Vla2RheXNSZWdleCIpfHxtYy5jYWxsKHRoaXMpLGE/dGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c1JlZ2V4KTp0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4JiZhP3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleH1mdW5jdGlvbiBrYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KTp0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleH1mdW5jdGlvbiBsYyhhKXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhmKHRoaXMsIl93ZWVrZGF5c1JlZ2V4Iil8fG1jLmNhbGwodGhpcyksYT90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpOnRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXgmJmE/dGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDp0aGlzLl93ZWVrZGF5c01pblJlZ2V4fWZ1bmN0aW9uIG1jKCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBiLmxlbmd0aC1hLmxlbmd0aH12YXIgYixjLGQsZSxmLGc9W10saT1bXSxqPVtdLGs9W107Zm9yKGI9MDs3PmI7YisrKWM9aChbMmUzLDFdKS5kYXkoYiksZD10aGlzLndlZWtkYXlzTWluKGMsIiIpLGU9dGhpcy53ZWVrZGF5c1Nob3J0KGMsIiIpLGY9dGhpcy53ZWVrZGF5cyhjLCIiKSxnLnB1c2goZCksaS5wdXNoKGUpLGoucHVzaChmKSxrLnB1c2goZCksay5wdXNoKGUpLGsucHVzaChmKTtmb3IoZy5zb3J0KGEpLGkuc29ydChhKSxqLnNvcnQoYSksay5zb3J0KGEpLGI9MDs3PmI7YisrKWlbYl09WihpW2JdKSxqW2JdPVooaltiXSksa1tiXT1aKGtbYl0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cCgiXigiK2suam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzTWluUmVnZXg9dGhpcy5fd2Vla2RheXNSZWdleCx0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoIl4oIitqLmpvaW4oInwiKSsiKSIsImkiKSx0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2kuam9pbigifCIpKyIpIiwiaSIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cCgiXigiK2cuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIG5jKGEpe3ZhciBiPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCJkYXkiKS10aGlzLmNsb25lKCkuc3RhcnRPZigieWVhciIpKS84NjRlNSkrMTtyZXR1cm4gbnVsbD09YT9iOnRoaXMuYWRkKGEtYiwiZCIpfWZ1bmN0aW9uIG9jKCl7cmV0dXJuIHRoaXMuaG91cnMoKSUxMnx8MTJ9ZnVuY3Rpb24gcGMoKXtyZXR1cm4gdGhpcy5ob3VycygpfHwyNH1mdW5jdGlvbiBxYyhhLGIpe1IoYSwwLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLHRoaXMubWludXRlcygpLGIpfSl9ZnVuY3Rpb24gcmMoYSxiKXtyZXR1cm4gYi5fbWVyaWRpZW1QYXJzZX1mdW5jdGlvbiBzYyhhKXtyZXR1cm4icCI9PT0oYSsiIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gdGMoYSxiLGMpe3JldHVybiBhPjExP2M/InBtIjoiUE0iOmM/ImFtIjoiQU0ifWZ1bmN0aW9uIHVjKGEsYil7YltTZF09cigxZTMqKCIwLiIrYSkpfWZ1bmN0aW9uIHZjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJVVEMiOiIifWZ1bmN0aW9uIHdjKCl7cmV0dXJuIHRoaXMuX2lzVVRDPyJDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSI6IiJ9ZnVuY3Rpb24geGMoYSl7cmV0dXJuIEthKDFlMyphKX1mdW5jdGlvbiB5Yygpe3JldHVybiBLYS5hcHBseShudWxsLGFyZ3VtZW50cykucGFyc2Vab25lKCl9ZnVuY3Rpb24gemMoYSxiLGMpe3ZhciBkPXRoaXMuX2NhbGVuZGFyW2FdO3JldHVybiB3KGQpP2QuY2FsbChiLGMpOmR9ZnVuY3Rpb24gQWMoYSl7dmFyIGI9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0sYz10aGlzLl9sb25nRGF0ZUZvcm1hdFthLnRvVXBwZXJDYXNlKCldO3JldHVybiBifHwhYz9iOih0aGlzLl9sb25nRGF0ZUZvcm1hdFthXT1jLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbYV0pfWZ1bmN0aW9uIEJjKCl7cmV0dXJuIHRoaXMuX2ludmFsaWREYXRlfWZ1bmN0aW9uIENjKGEpe3JldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoIiVkIixhKX1mdW5jdGlvbiBEYyhhKXtyZXR1cm4gYX1mdW5jdGlvbiBFYyhhLGIsYyxkKXt2YXIgZT10aGlzLl9yZWxhdGl2ZVRpbWVbY107cmV0dXJuIHcoZSk/ZShhLGIsYyxkKTplLnJlcGxhY2UoLyVkL2ksYSl9ZnVuY3Rpb24gRmMoYSxiKXt2YXIgYz10aGlzLl9yZWxhdGl2ZVRpbWVbYT4wPyJmdXR1cmUiOiJwYXN0Il07cmV0dXJuIHcoYyk/YyhiKTpjLnJlcGxhY2UoLyVzL2ksYil9ZnVuY3Rpb24gR2MoYSxiLGMsZCl7dmFyIGU9SCgpLGY9aCgpLnNldChkLGIpO3JldHVybiBlW2NdKGYsYSl9ZnVuY3Rpb24gSGMoYSxiLGMpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiIixudWxsIT1iKXJldHVybiBHYyhhLGIsYywibW9udGgiKTt2YXIgZCxlPVtdO2ZvcihkPTA7MTI+ZDtkKyspZVtkXT1HYyhhLGQsYywibW9udGgiKTtyZXR1cm4gZX1mdW5jdGlvbiBJYyhhLGIsYyxkKXsiYm9vbGVhbiI9PXR5cGVvZiBhPygibnVtYmVyIj09dHlwZW9mIGImJihjPWIsYj12b2lkIDApLGI9Ynx8IiIpOihiPWEsYz1iLGE9ITEsIm51bWJlciI9PXR5cGVvZiBiJiYoYz1iLGI9dm9pZCAwKSxiPWJ8fCIiKTt2YXIgZT1IKCksZj1hP2UuX3dlZWsuZG93OjA7aWYobnVsbCE9YylyZXR1cm4gR2MoYiwoYytmKSU3LGQsImRheSIpO3ZhciBnLGg9W107Zm9yKGc9MDs3Pmc7ZysrKWhbZ109R2MoYiwoZytmKSU3LGQsImRheSIpO3JldHVybiBofWZ1bmN0aW9uIEpjKGEsYil7cmV0dXJuIEhjKGEsYiwibW9udGhzIil9ZnVuY3Rpb24gS2MoYSxiKXtyZXR1cm4gSGMoYSxiLCJtb250aHNTaG9ydCIpfWZ1bmN0aW9uIExjKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzIil9ZnVuY3Rpb24gTWMoYSxiLGMpe3JldHVybiBJYyhhLGIsYywid2Vla2RheXNTaG9ydCIpfWZ1bmN0aW9uIE5jKGEsYixjKXtyZXR1cm4gSWMoYSxiLGMsIndlZWtkYXlzTWluIil9ZnVuY3Rpb24gT2MoKXt2YXIgYT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9TGUodGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPUxlKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1MZSh0aGlzLl9tb250aHMpLGEubWlsbGlzZWNvbmRzPUxlKGEubWlsbGlzZWNvbmRzKSxhLnNlY29uZHM9TGUoYS5zZWNvbmRzKSxhLm1pbnV0ZXM9TGUoYS5taW51dGVzKSxhLmhvdXJzPUxlKGEuaG91cnMpLGEubW9udGhzPUxlKGEubW9udGhzKSxhLnllYXJzPUxlKGEueWVhcnMpLHRoaXN9ZnVuY3Rpb24gUGMoYSxiLGMsZCl7dmFyIGU9ZGIoYixjKTtyZXR1cm4gYS5fbWlsbGlzZWNvbmRzKz1kKmUuX21pbGxpc2Vjb25kcyxhLl9kYXlzKz1kKmUuX2RheXMsYS5fbW9udGhzKz1kKmUuX21vbnRocyxhLl9idWJibGUoKX1mdW5jdGlvbiBRYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwxKX1mdW5jdGlvbiBSYyhhLGIpe3JldHVybiBQYyh0aGlzLGEsYiwtMSl9ZnVuY3Rpb24gU2MoYSl7cmV0dXJuIDA+YT9NYXRoLmZsb29yKGEpOk1hdGguY2VpbChhKX1mdW5jdGlvbiBUYygpe3ZhciBhLGIsYyxkLGUsZj10aGlzLl9taWxsaXNlY29uZHMsZz10aGlzLl9kYXlzLGg9dGhpcy5fbW9udGhzLGk9dGhpcy5fZGF0YTtyZXR1cm4gZj49MCYmZz49MCYmaD49MHx8MD49ZiYmMD49ZyYmMD49aHx8KGYrPTg2NGU1KlNjKFZjKGgpK2cpLGc9MCxoPTApLGkubWlsbGlzZWNvbmRzPWYlMWUzLGE9cShmLzFlMyksaS5zZWNvbmRzPWElNjAsYj1xKGEvNjApLGkubWludXRlcz1iJTYwLGM9cShiLzYwKSxpLmhvdXJzPWMlMjQsZys9cShjLzI0KSxlPXEoVWMoZykpLGgrPWUsZy09U2MoVmMoZSkpLGQ9cShoLzEyKSxoJT0xMixpLmRheXM9ZyxpLm1vbnRocz1oLGkueWVhcnM9ZCx0aGlzfWZ1bmN0aW9uIFVjKGEpe3JldHVybiA0ODAwKmEvMTQ2MDk3fWZ1bmN0aW9uIFZjKGEpe3JldHVybiAxNDYwOTcqYS80ODAwfWZ1bmN0aW9uIFdjKGEpe3ZhciBiLGMsZD10aGlzLl9taWxsaXNlY29uZHM7aWYoYT1LKGEpLCJtb250aCI9PT1hfHwieWVhciI9PT1hKXJldHVybiBiPXRoaXMuX2RheXMrZC84NjRlNSxjPXRoaXMuX21vbnRocytVYyhiKSwibW9udGgiPT09YT9jOmMvMTI7c3dpdGNoKGI9dGhpcy5fZGF5cytNYXRoLnJvdW5kKFZjKHRoaXMuX21vbnRocykpLGEpe2Nhc2Uid2VlayI6cmV0dXJuIGIvNytkLzYwNDhlNTtjYXNlImRheSI6cmV0dXJuIGIrZC84NjRlNTtjYXNlImhvdXIiOnJldHVybiAyNCpiK2QvMzZlNTtjYXNlIm1pbnV0ZSI6cmV0dXJuIDE0NDAqYitkLzZlNDtjYXNlInNlY29uZCI6cmV0dXJuIDg2NDAwKmIrZC8xZTM7Y2FzZSJtaWxsaXNlY29uZCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqYikrZDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0ICIrYSl9fWZ1bmN0aW9uIFhjKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipyKHRoaXMuX21vbnRocy8xMil9ZnVuY3Rpb24gWWMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXMoYSl9fWZ1bmN0aW9uIFpjKGEpewpyZXR1cm4gYT1LKGEpLHRoaXNbYSsicyJdKCl9ZnVuY3Rpb24gJGMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFbYV19fWZ1bmN0aW9uIF9jKCl7cmV0dXJuIHEodGhpcy5kYXlzKCkvNyl9ZnVuY3Rpb24gYWQoYSxiLGMsZCxlKXtyZXR1cm4gZS5yZWxhdGl2ZVRpbWUoYnx8MSwhIWMsYSxkKX1mdW5jdGlvbiBiZChhLGIsYyl7dmFyIGQ9ZGIoYSkuYWJzKCksZT1fZShkLmFzKCJzIikpLGY9X2UoZC5hcygibSIpKSxnPV9lKGQuYXMoImgiKSksaD1fZShkLmFzKCJkIikpLGk9X2UoZC5hcygiTSIpKSxqPV9lKGQuYXMoInkiKSksaz1lPGFmLnMmJlsicyIsZV18fDE+PWYmJlsibSJdfHxmPGFmLm0mJlsibW0iLGZdfHwxPj1nJiZbImgiXXx8ZzxhZi5oJiZbImhoIixnXXx8MT49aCYmWyJkIl18fGg8YWYuZCYmWyJkZCIsaF18fDE+PWkmJlsiTSJdfHxpPGFmLk0mJlsiTU0iLGldfHwxPj1qJiZbInkiXXx8WyJ5eSIsal07cmV0dXJuIGtbMl09YixrWzNdPSthPjAsa1s0XT1jLGFkLmFwcGx5KG51bGwsayl9ZnVuY3Rpb24gY2QoYSxiKXtyZXR1cm4gdm9pZCAwPT09YWZbYV0/ITE6dm9pZCAwPT09Yj9hZlthXTooYWZbYV09YiwhMCl9ZnVuY3Rpb24gZGQoYSl7dmFyIGI9dGhpcy5sb2NhbGVEYXRhKCksYz1iZCh0aGlzLCFhLGIpO3JldHVybiBhJiYoYz1iLnBhc3RGdXR1cmUoK3RoaXMsYykpLGIucG9zdGZvcm1hdChjKX1mdW5jdGlvbiBlZCgpe3ZhciBhLGIsYyxkPWJmKHRoaXMuX21pbGxpc2Vjb25kcykvMWUzLGU9YmYodGhpcy5fZGF5cyksZj1iZih0aGlzLl9tb250aHMpO2E9cShkLzYwKSxiPXEoYS82MCksZCU9NjAsYSU9NjAsYz1xKGYvMTIpLGYlPTEyO3ZhciBnPWMsaD1mLGk9ZSxqPWIsaz1hLGw9ZCxtPXRoaXMuYXNTZWNvbmRzKCk7cmV0dXJuIG0/KDA+bT8iLSI6IiIpKyJQIisoZz9nKyJZIjoiIikrKGg/aCsiTSI6IiIpKyhpP2krIkQiOiIiKSsoanx8a3x8bD8iVCI6IiIpKyhqP2orIkgiOiIiKSsoaz9rKyJNIjoiIikrKGw/bCsiUyI6IiIpOiJQMEQifXZhciBmZCxnZDtnZD1BcnJheS5wcm90b3R5cGUuc29tZT9BcnJheS5wcm90b3R5cGUuc29tZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9T2JqZWN0KHRoaXMpLGM9Yi5sZW5ndGg+Pj4wLGQ9MDtjPmQ7ZCsrKWlmKGQgaW4gYiYmYS5jYWxsKHRoaXMsYltkXSxkLGIpKXJldHVybiEwO3JldHVybiExfTt2YXIgaGQ9YS5tb21lbnRQcm9wZXJ0aWVzPVtdLGlkPSExLGpkPXt9O2Euc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzPSExLGEuZGVwcmVjYXRpb25IYW5kbGVyPW51bGw7dmFyIGtkO2tkPU9iamVjdC5rZXlzP09iamVjdC5rZXlzOmZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGIgaW4gYSlmKGEsYikmJmMucHVzaChiKTtyZXR1cm4gY307dmFyIGxkLG1kLG5kPXt9LG9kPXt9LHBkPS8oXFtbXlxbXSpcXSl8KFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLHFkPS8oXFtbXlxbXSpcXSl8KFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLHJkPXt9LHNkPXt9LHRkPS9cZC8sdWQ9L1xkXGQvLHZkPS9cZHszfS8sd2Q9L1xkezR9Lyx4ZD0vWystXT9cZHs2fS8seWQ9L1xkXGQ/Lyx6ZD0vXGRcZFxkXGQ/LyxBZD0vXGRcZFxkXGRcZFxkPy8sQmQ9L1xkezEsM30vLENkPS9cZHsxLDR9LyxEZD0vWystXT9cZHsxLDZ9LyxFZD0vXGQrLyxGZD0vWystXT9cZCsvLEdkPS9afFsrLV1cZFxkOj9cZFxkL2dpLEhkPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vZ2ksSWQ9L1srLV0/XGQrKFwuXGR7MSwzfSk/LyxKZD0vWzAtOV0qWydhLXpcdTAwQTAtXHUwNUZGXHUwNzAwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSt8W1x1MDYwMC1cdTA2RkZcL10rKFxzKj9bXHUwNjAwLVx1MDZGRl0rKXsxLDJ9L2ksS2Q9e30sTGQ9e30sTWQ9MCxOZD0xLE9kPTIsUGQ9MyxRZD00LFJkPTUsU2Q9NixUZD03LFVkPTg7bWQ9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/QXJyYXkucHJvdG90eXBlLmluZGV4T2Y6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGI9MDtiPHRoaXMubGVuZ3RoOysrYilpZih0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sUigiTSIsWyJNTSIsMl0sIk1vIixmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vbnRoKCkrMX0pLFIoIk1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLGEpfSksUigiTU1NTSIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcyxhKX0pLEooIm1vbnRoIiwiTSIpLFcoIk0iLHlkKSxXKCJNTSIseWQsdWQpLFcoIk1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNTaG9ydFJlZ2V4KGEpfSksVygiTU1NTSIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNSZWdleChhKX0pLCQoWyJNIiwiTU0iXSxmdW5jdGlvbihhLGIpe2JbTmRdPXIoYSktMX0pLCQoWyJNTU0iLCJNTU1NIl0sZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Yy5fbG9jYWxlLm1vbnRoc1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/YltOZF09ZTpqKGMpLmludmFsaWRNb250aD1hfSk7dmFyIFZkPS9EW29EXT8oXFtbXlxbXF1dKlxdfFxzKykrTU1NTT8vLFdkPSJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyIi5zcGxpdCgiXyIpLFhkPSJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYyIuc3BsaXQoIl8iKSxZZD1KZCxaZD1KZCwkZD0vXlxzKigoPzpbKy1dXGR7Nn18XGR7NH0pLSg/OlxkXGQtXGRcZHxXXGRcZC1cZHxXXGRcZHxcZFxkXGR8XGRcZCkpKD86KFR8ICkoXGRcZCg/OjpcZFxkKD86OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLF9kPS9eXHMqKCg/OlsrLV1cZHs2fXxcZHs0fSkoPzpcZFxkXGRcZHxXXGRcZFxkfFdcZFxkfFxkXGRcZHxcZFxkKSkoPzooVHwgKShcZFxkKD86XGRcZCg/OlxkXGQoPzpbLixdXGQrKT8pPyk/KShbXCtcLV1cZFxkKD86Oj9cZFxkKT98XHMqWik/KT8vLGFlPS9afFsrLV1cZFxkKD86Oj9cZFxkKT8vLGJlPVtbIllZWVlZWS1NTS1ERCIsL1srLV1cZHs2fS1cZFxkLVxkXGQvXSxbIllZWVktTU0tREQiLC9cZHs0fS1cZFxkLVxkXGQvXSxbIkdHR0ctW1ddV1ctRSIsL1xkezR9LVdcZFxkLVxkL10sWyJHR0dHLVtXXVdXIiwvXGR7NH0tV1xkXGQvLCExXSxbIllZWVktREREIiwvXGR7NH0tXGR7M30vXSxbIllZWVktTU0iLC9cZHs0fS1cZFxkLywhMV0sWyJZWVlZWVlNTUREIiwvWystXVxkezEwfS9dLFsiWVlZWU1NREQiLC9cZHs4fS9dLFsiR0dHR1tXXVdXRSIsL1xkezR9V1xkezN9L10sWyJHR0dHW1ddV1ciLC9cZHs0fVdcZHsyfS8sITFdLFsiWVlZWURERCIsL1xkezd9L11dLGNlPVtbIkhIOm1tOnNzLlNTU1MiLC9cZFxkOlxkXGQ6XGRcZFwuXGQrL10sWyJISDptbTpzcyxTU1NTIiwvXGRcZDpcZFxkOlxkXGQsXGQrL10sWyJISDptbTpzcyIsL1xkXGQ6XGRcZDpcZFxkL10sWyJISDptbSIsL1xkXGQ6XGRcZC9dLFsiSEhtbXNzLlNTU1MiLC9cZFxkXGRcZFxkXGRcLlxkKy9dLFsiSEhtbXNzLFNTU1MiLC9cZFxkXGRcZFxkXGQsXGQrL10sWyJISG1tc3MiLC9cZFxkXGRcZFxkXGQvXSxbIkhIbW0iLC9cZFxkXGRcZC9dLFsiSEgiLC9cZFxkL11dLGRlPS9eXC8/RGF0ZVwoKFwtP1xkKykvaTthLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrPXUoIm1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlLiBUaGlzIGlzIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDA3IGZvciBtb3JlIGluZm8uIixmdW5jdGlvbihhKXthLl9kPW5ldyBEYXRlKGEuX2krKGEuX3VzZVVUQz8iIFVUQyI6IiIpKX0pLFIoIlkiLDAsMCxmdW5jdGlvbigpe3ZhciBhPXRoaXMueWVhcigpO3JldHVybiA5OTk5Pj1hPyIiK2E6IisiK2F9KSxSKDAsWyJZWSIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxSKDAsWyJZWVlZIiw0XSwwLCJ5ZWFyIiksUigwLFsiWVlZWVkiLDVdLDAsInllYXIiKSxSKDAsWyJZWVlZWVkiLDYsITBdLDAsInllYXIiKSxKKCJ5ZWFyIiwieSIpLFcoIlkiLEZkKSxXKCJZWSIseWQsdWQpLFcoIllZWVkiLENkLHdkKSxXKCJZWVlZWSIsRGQseGQpLFcoIllZWVlZWSIsRGQseGQpLCQoWyJZWVlZWSIsIllZWVlZWSJdLE1kKSwkKCJZWVlZIixmdW5jdGlvbihiLGMpe2NbTWRdPTI9PT1iLmxlbmd0aD9hLnBhcnNlVHdvRGlnaXRZZWFyKGIpOnIoYil9KSwkKCJZWSIsZnVuY3Rpb24oYixjKXtjW01kXT1hLnBhcnNlVHdvRGlnaXRZZWFyKGIpfSksJCgiWSIsZnVuY3Rpb24oYSxiKXtiW01kXT1wYXJzZUludChhLDEwKX0pLGEucGFyc2VUd29EaWdpdFllYXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHIoYSkrKHIoYSk+Njg/MTkwMDoyZTMpfTt2YXIgZWU9TSgiRnVsbFllYXIiLCEwKTthLklTT184NjAxPWZ1bmN0aW9uKCl7fTt2YXIgZmU9dSgibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP3RoaXM+YT90aGlzOmE6bCgpfSksZ2U9dSgibW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4IixmdW5jdGlvbigpe3ZhciBhPUthLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP2E+dGhpcz90aGlzOmE6bCgpfSksaGU9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGV9O1FhKCJaIiwiOiIpLFFhKCJaWiIsIiIpLFcoIloiLEhkKSxXKCJaWiIsSGQpLCQoWyJaIiwiWloiXSxmdW5jdGlvbihhLGIsYyl7Yy5fdXNlVVRDPSEwLGMuX3R6bT1SYShIZCxhKX0pO3ZhciBpZT0vKFtcK1wtXXxcZFxkKS9naTthLnVwZGF0ZU9mZnNldD1mdW5jdGlvbigpe307dmFyIGplPS9eKFwtKT8oPzooXGQqKVsuIF0pPyhcZCspXDooXGQrKSg/Olw6KFxkKylcLj8oXGR7M30pP1xkKik/JC8sa2U9L14oLSk/UCg/OigtP1swLTksLl0qKVkpPyg/OigtP1swLTksLl0qKU0pPyg/OigtP1swLTksLl0qKVcpPyg/OigtP1swLTksLl0qKUQpPyg/OlQoPzooLT9bMC05LC5dKilIKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilTKT8pPyQvO2RiLmZuPU9hLnByb3RvdHlwZTt2YXIgbGU9aWIoMSwiYWRkIiksbWU9aWIoLTEsInN1YnRyYWN0Iik7YS5kZWZhdWx0Rm9ybWF0PSJZWVlZLU1NLUREVEhIOm1tOnNzWiIsYS5kZWZhdWx0Rm9ybWF0VXRjPSJZWVlZLU1NLUREVEhIOm1tOnNzW1pdIjt2YXIgbmU9dSgibW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4iLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP3RoaXMubG9jYWxlRGF0YSgpOnRoaXMubG9jYWxlKGEpfSk7UigwLFsiZ2ciLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWVrWWVhcigpJTEwMH0pLFIoMCxbIkdHIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSUxMDB9KSxQYigiZ2dnZyIsIndlZWtZZWFyIiksUGIoImdnZ2dnIiwid2Vla1llYXIiKSxQYigiR0dHRyIsImlzb1dlZWtZZWFyIiksUGIoIkdHR0dHIiwiaXNvV2Vla1llYXIiKSxKKCJ3ZWVrWWVhciIsImdnIiksSigiaXNvV2Vla1llYXIiLCJHRyIpLFcoIkciLEZkKSxXKCJnIixGZCksVygiR0ciLHlkLHVkKSxXKCJnZyIseWQsdWQpLFcoIkdHR0ciLENkLHdkKSxXKCJnZ2dnIixDZCx3ZCksVygiR0dHR0ciLERkLHhkKSxXKCJnZ2dnZyIsRGQseGQpLF8oWyJnZ2dnIiwiZ2dnZ2ciLCJHR0dHIiwiR0dHR0ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMildPXIoYSl9KSxfKFsiZ2ciLCJHRyJdLGZ1bmN0aW9uKGIsYyxkLGUpe2NbZV09YS5wYXJzZVR3b0RpZ2l0WWVhcihiKX0pLFIoIlEiLDAsIlFvIiwicXVhcnRlciIpLEooInF1YXJ0ZXIiLCJRIiksVygiUSIsdGQpLCQoIlEiLGZ1bmN0aW9uKGEsYil7YltOZF09MyoocihhKS0xKX0pLFIoInciLFsid3ciLDJdLCJ3byIsIndlZWsiKSxSKCJXIixbIldXIiwyXSwiV28iLCJpc29XZWVrIiksSigid2VlayIsInciKSxKKCJpc29XZWVrIiwiVyIpLFcoInciLHlkKSxXKCJ3dyIseWQsdWQpLFcoIlciLHlkKSxXKCJXVyIseWQsdWQpLF8oWyJ3Iiwid3ciLCJXIiwiV1ciXSxmdW5jdGlvbihhLGIsYyxkKXtiW2Quc3Vic3RyKDAsMSldPXIoYSl9KTt2YXIgb2U9e2RvdzowLGRveTo2fTtSKCJEIixbIkREIiwyXSwiRG8iLCJkYXRlIiksSigiZGF0ZSIsIkQiKSxXKCJEIix5ZCksVygiREQiLHlkLHVkKSxXKCJEbyIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT9iLl9vcmRpbmFsUGFyc2U6Yi5fb3JkaW5hbFBhcnNlTGVuaWVudH0pLCQoWyJEIiwiREQiXSxPZCksJCgiRG8iLGZ1bmN0aW9uKGEsYil7YltPZF09cihhLm1hdGNoKHlkKVswXSwxMCl9KTt2YXIgcGU9TSgiRGF0ZSIsITApO1IoImQiLDAsImRvIiwiZGF5IiksUigiZGQiLDAsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcyxhKX0pLFIoImRkZCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsYSl9KSxSKCJkZGRkIiwwLDAsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsYSl9KSxSKCJlIiwwLDAsIndlZWtkYXkiKSxSKCJFIiwwLDAsImlzb1dlZWtkYXkiKSxKKCJkYXkiLCJkIiksSigid2Vla2RheSIsImUiKSxKKCJpc29XZWVrZGF5IiwiRSIpLFcoImQiLHlkKSxXKCJlIix5ZCksVygiRSIseWQpLFcoImRkIixmdW5jdGlvbihhLGIpe3JldHVybiBiLndlZWtkYXlzTWluUmVnZXgoYSl9KSxXKCJkZGQiLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIud2Vla2RheXNTaG9ydFJlZ2V4KGEpfSksVygiZGRkZCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi53ZWVrZGF5c1JlZ2V4KGEpfSksXyhbImRkIiwiZGRkIiwiZGRkZCJdLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWMuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/Yi5kPWU6aihjKS5pbnZhbGlkV2Vla2RheT1hfSksXyhbImQiLCJlIiwiRSJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZF09cihhKX0pO3ZhciBxZT0iU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXkiLnNwbGl0KCJfIikscmU9IlN1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCIuc3BsaXQoIl8iKSxzZT0iU3VfTW9fVHVfV2VfVGhfRnJfU2EiLnNwbGl0KCJfIiksdGU9SmQsdWU9SmQsdmU9SmQ7UigiREREIixbIkREREQiLDNdLCJERERvIiwiZGF5T2ZZZWFyIiksSigiZGF5T2ZZZWFyIiwiREREIiksVygiREREIixCZCksVygiRERERCIsdmQpLCQoWyJEREQiLCJEREREIl0sZnVuY3Rpb24oYSxiLGMpe2MuX2RheU9mWWVhcj1yKGEpfSksUigiSCIsWyJISCIsMl0sMCwiaG91ciIpLFIoImgiLFsiaGgiLDJdLDAsb2MpLFIoImsiLFsia2siLDJdLDAscGMpLFIoImhtbSIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuIiIrb2MuYXBwbHkodGhpcykrUSh0aGlzLm1pbnV0ZXMoKSwyKX0pLFIoImhtbXNzIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm4iIitvYy5hcHBseSh0aGlzKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxSKCJIbW0iLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpfSksUigiSG1tc3MiLDAsMCxmdW5jdGlvbigpe3JldHVybiIiK3RoaXMuaG91cnMoKStRKHRoaXMubWludXRlcygpLDIpK1EodGhpcy5zZWNvbmRzKCksMil9KSxxYygiYSIsITApLHFjKCJBIiwhMSksSigiaG91ciIsImgiKSxXKCJhIixyYyksVygiQSIscmMpLFcoIkgiLHlkKSxXKCJoIix5ZCksVygiSEgiLHlkLHVkKSxXKCJoaCIseWQsdWQpLFcoImhtbSIsemQpLFcoImhtbXNzIixBZCksVygiSG1tIix6ZCksVygiSG1tc3MiLEFkKSwkKFsiSCIsIkhIIl0sUGQpLCQoWyJhIiwiQSJdLGZ1bmN0aW9uKGEsYixjKXtjLl9pc1BtPWMuX2xvY2FsZS5pc1BNKGEpLGMuX21lcmlkaWVtPWF9KSwkKFsiaCIsImhoIl0sZnVuY3Rpb24oYSxiLGMpe2JbUGRdPXIoYSksaihjKS5iaWdIb3VyPSEwfSksJCgiaG1tIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtMjtiW1BkXT1yKGEuc3Vic3RyKDAsZCkpLGJbUWRdPXIoYS5zdWJzdHIoZCkpLGooYykuYmlnSG91cj0hMH0pLCQoImhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpLGooYykuYmlnSG91cj0hMH0pLCQoIkhtbSIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQpKX0pLCQoIkhtbXNzIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7YltQZF09cihhLnN1YnN0cigwLGQpKSxiW1FkXT1yKGEuc3Vic3RyKGQsMikpLGJbUmRdPXIoYS5zdWJzdHIoZSkpfSk7dmFyIHdlPS9bYXBdXC4/bT9cLj8vaSx4ZT1NKCJIb3VycyIsITApO1IoIm0iLFsibW0iLDJdLDAsIm1pbnV0ZSIpLEooIm1pbnV0ZSIsIm0iKSxXKCJtIix5ZCksVygibW0iLHlkLHVkKSwkKFsibSIsIm1tIl0sUWQpO3ZhciB5ZT1NKCJNaW51dGVzIiwhMSk7UigicyIsWyJzcyIsMl0sMCwic2Vjb25kIiksSigic2Vjb25kIiwicyIpLFcoInMiLHlkKSxXKCJzcyIseWQsdWQpLCQoWyJzIiwic3MiXSxSZCk7dmFyIHplPU0oIlNlY29uZHMiLCExKTtSKCJTIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLFIoMCxbIlNTIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwKX0pLFIoMCxbIlNTUyIsM10sMCwibWlsbGlzZWNvbmQiKSxSKDAsWyJTU1NTIiw0XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTIiw1XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1MiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1MiLDddLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU0KnRoaXMubWlsbGlzZWNvbmQoKX0pLFIoMCxbIlNTU1NTU1NTIiw4XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNSp0aGlzLm1pbGxpc2Vjb25kKCl9KSxSKDAsWyJTU1NTU1NTU1MiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEooIm1pbGxpc2Vjb25kIiwibXMiKSxXKCJTIixCZCx0ZCksVygiU1MiLEJkLHVkKSxXKCJTU1MiLEJkLHZkKTt2YXIgQWU7Zm9yKEFlPSJTU1NTIjtBZS5sZW5ndGg8PTk7QWUrPSJTIilXKEFlLEVkKTtmb3IoQWU9IlMiO0FlLmxlbmd0aDw9OTtBZSs9IlMiKSQoQWUsdWMpO3ZhciBCZT1NKCJNaWxsaXNlY29uZHMiLCExKTtSKCJ6IiwwLDAsInpvbmVBYmJyIiksUigienoiLDAsMCwiem9uZU5hbWUiKTt2YXIgQ2U9by5wcm90b3R5cGU7Q2UuYWRkPWxlLENlLmNhbGVuZGFyPWtiLENlLmNsb25lPWxiLENlLmRpZmY9c2IsQ2UuZW5kT2Y9RWIsQ2UuZm9ybWF0PXdiLENlLmZyb209eGIsQ2UuZnJvbU5vdz15YixDZS50bz16YixDZS50b05vdz1BYixDZS5nZXQ9UCxDZS5pbnZhbGlkQXQ9TmIsQ2UuaXNBZnRlcj1tYixDZS5pc0JlZm9yZT1uYixDZS5pc0JldHdlZW49b2IsQ2UuaXNTYW1lPXBiLENlLmlzU2FtZU9yQWZ0ZXI9cWIsQ2UuaXNTYW1lT3JCZWZvcmU9cmIsQ2UuaXNWYWxpZD1MYixDZS5sYW5nPW5lLENlLmxvY2FsZT1CYixDZS5sb2NhbGVEYXRhPUNiLENlLm1heD1nZSxDZS5taW49ZmUsQ2UucGFyc2luZ0ZsYWdzPU1iLENlLnNldD1QLENlLnN0YXJ0T2Y9RGIsQ2Uuc3VidHJhY3Q9bWUsQ2UudG9BcnJheT1JYixDZS50b09iamVjdD1KYixDZS50b0RhdGU9SGIsQ2UudG9JU09TdHJpbmc9dmIsQ2UudG9KU09OPUtiLENlLnRvU3RyaW5nPXViLENlLnVuaXg9R2IsQ2UudmFsdWVPZj1GYixDZS5jcmVhdGlvbkRhdGE9T2IsQ2UueWVhcj1lZSxDZS5pc0xlYXBZZWFyPXRhLENlLndlZWtZZWFyPVFiLENlLmlzb1dlZWtZZWFyPVJiLENlLnF1YXJ0ZXI9Q2UucXVhcnRlcnM9V2IsQ2UubW9udGg9aGEsQ2UuZGF5c0luTW9udGg9aWEsQ2Uud2Vlaz1DZS53ZWVrcz0kYixDZS5pc29XZWVrPUNlLmlzb1dlZWtzPV9iLENlLndlZWtzSW5ZZWFyPVRiLENlLmlzb1dlZWtzSW5ZZWFyPVNiLENlLmRhdGU9cGUsQ2UuZGF5PUNlLmRheXM9Z2MsQ2Uud2Vla2RheT1oYyxDZS5pc29XZWVrZGF5PWljLENlLmRheU9mWWVhcj1uYyxDZS5ob3VyPUNlLmhvdXJzPXhlLENlLm1pbnV0ZT1DZS5taW51dGVzPXllLENlLnNlY29uZD1DZS5zZWNvbmRzPXplLENlLm1pbGxpc2Vjb25kPUNlLm1pbGxpc2Vjb25kcz1CZSxDZS51dGNPZmZzZXQ9VWEsQ2UudXRjPVdhLENlLmxvY2FsPVhhLENlLnBhcnNlWm9uZT1ZYSxDZS5oYXNBbGlnbmVkSG91ck9mZnNldD1aYSxDZS5pc0RTVD0kYSxDZS5pc0RTVFNoaWZ0ZWQ9X2EsQ2UuaXNMb2NhbD1hYixDZS5pc1V0Y09mZnNldD1iYixDZS5pc1V0Yz1jYixDZS5pc1VUQz1jYixDZS56b25lQWJicj12YyxDZS56b25lTmFtZT13YyxDZS5kYXRlcz11KCJkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLiIscGUpLENlLm1vbnRocz11KCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQiLGhhKSxDZS55ZWFycz11KCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkIixlZSksQ2Uuem9uZT11KCJtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE3NzkiLFZhKTt2YXIgRGU9Q2UsRWU9e3NhbWVEYXk6IltUb2RheSBhdF0gTFQiLG5leHREYXk6IltUb21vcnJvdyBhdF0gTFQiLG5leHRXZWVrOiJkZGRkIFthdF0gTFQiLGxhc3REYXk6IltZZXN0ZXJkYXkgYXRdIExUIixsYXN0V2VlazoiW0xhc3RdIGRkZGQgW2F0XSBMVCIsc2FtZUVsc2U6IkwifSxGZT17TFRTOiJoOm1tOnNzIEEiLExUOiJoOm1tIEEiLEw6Ik1NL0REL1lZWVkiLExMOiJNTU1NIEQsIFlZWVkiLExMTDoiTU1NTSBELCBZWVlZIGg6bW0gQSIsTExMTDoiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSJ9LEdlPSJJbnZhbGlkIGRhdGUiLEhlPSIlZCIsSWU9L1xkezEsMn0vLEplPXtmdXR1cmU6ImluICVzIixwYXN0OiIlcyBhZ28iLHM6ImEgZmV3IHNlY29uZHMiLG06ImEgbWludXRlIixtbToiJWQgbWludXRlcyIsaDoiYW4gaG91ciIsaGg6IiVkIGhvdXJzIixkOiJhIGRheSIsZGQ6IiVkIGRheXMiLE06ImEgbW9udGgiLE1NOiIlZCBtb250aHMiLHk6ImEgeWVhciIseXk6IiVkIHllYXJzIn0sS2U9QS5wcm90b3R5cGU7S2UuX2NhbGVuZGFyPUVlLEtlLmNhbGVuZGFyPXpjLEtlLl9sb25nRGF0ZUZvcm1hdD1GZSxLZS5sb25nRGF0ZUZvcm1hdD1BYyxLZS5faW52YWxpZERhdGU9R2UsS2UuaW52YWxpZERhdGU9QmMsS2UuX29yZGluYWw9SGUsS2Uub3JkaW5hbD1DYyxLZS5fb3JkaW5hbFBhcnNlPUllLEtlLnByZXBhcnNlPURjLEtlLnBvc3Rmb3JtYXQ9RGMsS2UuX3JlbGF0aXZlVGltZT1KZSxLZS5yZWxhdGl2ZVRpbWU9RWMsS2UucGFzdEZ1dHVyZT1GYyxLZS5zZXQ9eSxLZS5tb250aHM9Y2EsS2UuX21vbnRocz1XZCxLZS5tb250aHNTaG9ydD1kYSxLZS5fbW9udGhzU2hvcnQ9WGQsS2UubW9udGhzUGFyc2U9ZmEsS2UuX21vbnRoc1JlZ2V4PVpkLEtlLm1vbnRoc1JlZ2V4PWthLEtlLl9tb250aHNTaG9ydFJlZ2V4PVlkLEtlLm1vbnRoc1Nob3J0UmVnZXg9amEsS2Uud2Vlaz1YYixLZS5fd2Vlaz1vZSxLZS5maXJzdERheU9mWWVhcj1aYixLZS5maXJzdERheU9mV2Vlaz1ZYixLZS53ZWVrZGF5cz1iYyxLZS5fd2Vla2RheXM9cWUsS2Uud2Vla2RheXNNaW49ZGMsS2UuX3dlZWtkYXlzTWluPXNlLEtlLndlZWtkYXlzU2hvcnQ9Y2MsS2UuX3dlZWtkYXlzU2hvcnQ9cmUsS2Uud2Vla2RheXNQYXJzZT1mYyxLZS5fd2Vla2RheXNSZWdleD10ZSxLZS53ZWVrZGF5c1JlZ2V4PWpjLEtlLl93ZWVrZGF5c1Nob3J0UmVnZXg9dWUsS2Uud2Vla2RheXNTaG9ydFJlZ2V4PWtjLEtlLl93ZWVrZGF5c01pblJlZ2V4PXZlLEtlLndlZWtkYXlzTWluUmVnZXg9bGMsS2UuaXNQTT1zYyxLZS5fbWVyaWRpZW1QYXJzZT13ZSxLZS5tZXJpZGllbT10YyxFKCJlbiIse29yZGluYWxQYXJzZTovXGR7MSwyfSh0aHxzdHxuZHxyZCkvLG9yZGluYWw6ZnVuY3Rpb24oYSl7dmFyIGI9YSUxMCxjPTE9PT1yKGElMTAwLzEwKT8idGgiOjE9PT1iPyJzdCI6Mj09PWI/Im5kIjozPT09Yj8icmQiOiJ0aCI7cmV0dXJuIGErY319KSxhLmxhbmc9dSgibW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4iLEUpLGEubGFuZ0RhdGE9dSgibW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLiIsSCk7dmFyIExlPU1hdGguYWJzLE1lPVljKCJtcyIpLE5lPVljKCJzIiksT2U9WWMoIm0iKSxQZT1ZYygiaCIpLFFlPVljKCJkIiksUmU9WWMoInciKSxTZT1ZYygiTSIpLFRlPVljKCJ5IiksVWU9JGMoIm1pbGxpc2Vjb25kcyIpLFZlPSRjKCJzZWNvbmRzIiksV2U9JGMoIm1pbnV0ZXMiKSxYZT0kYygiaG91cnMiKSxZZT0kYygiZGF5cyIpLFplPSRjKCJtb250aHMiKSwkZT0kYygieWVhcnMiKSxfZT1NYXRoLnJvdW5kLGFmPXtzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LGJmPU1hdGguYWJzLGNmPU9hLnByb3RvdHlwZTtjZi5hYnM9T2MsY2YuYWRkPVFjLGNmLnN1YnRyYWN0PVJjLGNmLmFzPVdjLGNmLmFzTWlsbGlzZWNvbmRzPU1lLGNmLmFzU2Vjb25kcz1OZSxjZi5hc01pbnV0ZXM9T2UsY2YuYXNIb3Vycz1QZSxjZi5hc0RheXM9UWUsY2YuYXNXZWVrcz1SZSxjZi5hc01vbnRocz1TZSxjZi5hc1llYXJzPVRlLGNmLnZhbHVlT2Y9WGMsY2YuX2J1YmJsZT1UYyxjZi5nZXQ9WmMsY2YubWlsbGlzZWNvbmRzPVVlLGNmLnNlY29uZHM9VmUsY2YubWludXRlcz1XZSxjZi5ob3Vycz1YZSxjZi5kYXlzPVllLGNmLndlZWtzPV9jLGNmLm1vbnRocz1aZSxjZi55ZWFycz0kZSxjZi5odW1hbml6ZT1kZCxjZi50b0lTT1N0cmluZz1lZCxjZi50b1N0cmluZz1lZCxjZi50b0pTT049ZWQsY2YubG9jYWxlPUJiLGNmLmxvY2FsZURhdGE9Q2IsY2YudG9Jc29TdHJpbmc9dSgidG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscykiLGVkKSxjZi5sYW5nPW5lLFIoIlgiLDAsMCwidW5peCIpLFIoIngiLDAsMCwidmFsdWVPZiIpLFcoIngiLEZkKSxXKCJYIixJZCksJCgiWCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUoMWUzKnBhcnNlRmxvYXQoYSwxMCkpfSksJCgieCIsZnVuY3Rpb24oYSxiLGMpe2MuX2Q9bmV3IERhdGUocihhKSl9KSxhLnZlcnNpb249IjIuMTMuMCIsYihLYSksYS5mbj1EZSxhLm1pbj1NYSxhLm1heD1OYSxhLm5vdz1oZSxhLnV0Yz1oLGEudW5peD14YyxhLm1vbnRocz1KYyxhLmlzRGF0ZT1kLGEubG9jYWxlPUUsYS5pbnZhbGlkPWwsYS5kdXJhdGlvbj1kYixhLmlzTW9tZW50PXAsYS53ZWVrZGF5cz1MYyxhLnBhcnNlWm9uZT15YyxhLmxvY2FsZURhdGE9SCxhLmlzRHVyYXRpb249UGEsYS5tb250aHNTaG9ydD1LYyxhLndlZWtkYXlzTWluPU5jLGEuZGVmaW5lTG9jYWxlPUYsYS51cGRhdGVMb2NhbGU9RyxhLmxvY2FsZXM9SSxhLndlZWtkYXlzU2hvcnQ9TWMsYS5ub3JtYWxpemVVbml0cz1LLGEucmVsYXRpdmVUaW1lVGhyZXNob2xkPWNkLGEucHJvdG90eXBlPURlO3ZhciBkZj1hO3JldHVybiBkZn0pOw==
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNsaXBib2FyZCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgbWF0Y2hlcyA9IHJlcXVpcmUoJ21hdGNoZXMtc2VsZWN0b3InKQ0KDQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlbGVtZW50LCBzZWxlY3RvciwgY2hlY2tZb1NlbGYpIHsNCiAgdmFyIHBhcmVudCA9IGNoZWNrWW9TZWxmID8gZWxlbWVudCA6IGVsZW1lbnQucGFyZW50Tm9kZQ0KDQogIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBkb2N1bWVudCkgew0KICAgIGlmIChtYXRjaGVzKHBhcmVudCwgc2VsZWN0b3IpKSByZXR1cm4gcGFyZW50Ow0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlDQogIH0NCn0NCgp9LHsibWF0Y2hlcy1zZWxlY3RvciI6NX1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewp2YXIgY2xvc2VzdCA9IHJlcXVpcmUoJ2Nsb3Nlc3QnKTsKCi8qKgogKiBEZWxlZ2F0ZXMgZXZlbnQgdG8gYSBzZWxlY3Rvci4KICoKICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvcgogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcGFyYW0ge0Jvb2xlYW59IHVzZUNhcHR1cmUKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gZGVsZWdhdGUoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrLCB1c2VDYXB0dXJlKSB7CiAgICB2YXIgbGlzdGVuZXJGbiA9IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBGaW5kcyBjbG9zZXN0IG1hdGNoIGFuZCBpbnZva2VzIGNhbGxiYWNrLgogKgogKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yCiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAqIEByZXR1cm4ge0Z1bmN0aW9ufQogKi8KZnVuY3Rpb24gbGlzdGVuZXIoZWxlbWVudCwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgIGUuZGVsZWdhdGVUYXJnZXQgPSBjbG9zZXN0KGUudGFyZ2V0LCBzZWxlY3RvciwgdHJ1ZSk7CgogICAgICAgIGlmIChlLmRlbGVnYXRlVGFyZ2V0KSB7CiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoZWxlbWVudCwgZSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRlbGVnYXRlOwoKfSx7ImNsb3Nlc3QiOjF9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKLyoqCiAqIENoZWNrIGlmIGFyZ3VtZW50IGlzIGEgSFRNTCBlbGVtZW50LgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMubm9kZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQKICAgICAgICAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cy4KICoKICogQHBhcmFtIHtPYmplY3R9IHZhbHVlCiAqIEByZXR1cm4ge0Jvb2xlYW59CiAqLwpleHBvcnRzLm5vZGVMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTsKCiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICYmICh0eXBlID09PSAnW29iamVjdCBOb2RlTGlzdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXScpCiAgICAgICAgJiYgKCdsZW5ndGgnIGluIHZhbHVlKQogICAgICAgICYmICh2YWx1ZS5sZW5ndGggPT09IDAgfHwgZXhwb3J0cy5ub2RlKHZhbHVlWzBdKSk7Cn07CgovKioKICogQ2hlY2sgaWYgYXJndW1lbnQgaXMgYSBzdHJpbmcuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZQogKiBAcmV0dXJuIHtCb29sZWFufQogKi8KZXhwb3J0cy5zdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycKICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZzsKfTsKCi8qKgogKiBDaGVjayBpZiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge09iamVjdH0gdmFsdWUKICogQHJldHVybiB7Qm9vbGVhbn0KICovCmV4cG9ydHMuZm4gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpOwoKICAgIHJldHVybiB0eXBlID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwp9OwoKfSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7CnZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTsKdmFyIGRlbGVnYXRlID0gcmVxdWlyZSgnZGVsZWdhdGUnKTsKCi8qKgogKiBWYWxpZGF0ZXMgYWxsIHBhcmFtcyBhbmQgY2FsbHMgdGhlIHJpZ2h0CiAqIGxpc3RlbmVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyB0YXJnZXQgdHlwZS4KICoKICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IHRhcmdldAogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogKiBAcmV0dXJuIHtPYmplY3R9CiAqLwpmdW5jdGlvbiBsaXN0ZW4odGFyZ2V0LCB0eXBlLCBjYWxsYmFjaykgewogICAgaWYgKCF0YXJnZXQgJiYgIXR5cGUgJiYgIWNhbGxiYWNrKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cycpOwogICAgfQoKICAgIGlmICghaXMuc3RyaW5nKHR5cGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcnKTsKICAgIH0KCiAgICBpZiAoIWlzLmZuKGNhbGxiYWNrKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbicpOwogICAgfQoKICAgIGlmIChpcy5ub2RlKHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZSh0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzLm5vZGVMaXN0KHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbGlzdGVuTm9kZUxpc3QodGFyZ2V0LCB0eXBlLCBjYWxsYmFjayk7CiAgICB9CiAgICBlbHNlIGlmIChpcy5zdHJpbmcodGFyZ2V0KSkgewogICAgICAgIHJldHVybiBsaXN0ZW5TZWxlY3Rvcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmcsIEhUTUxFbGVtZW50LCBIVE1MQ29sbGVjdGlvbiwgb3IgTm9kZUxpc3QnKTsKICAgIH0KfQoKLyoqCiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYSBIVE1MIGVsZW1lbnQKICogYW5kIHJldHVybnMgYSByZW1vdmUgbGlzdGVuZXIgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZShub2RlLCB0eXBlLCBjYWxsYmFjaykgewogICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKCiAgICByZXR1cm4gewogICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgSFRNTCBlbGVtZW50cwogKiBhbmQgcmV0dXJucyBhIHJlbW92ZSBsaXN0ZW5lciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHtOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbn0gbm9kZUxpc3QKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuTm9kZUxpc3Qobm9kZUxpc3QsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVMaXN0LCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrKTsKICAgIH0pOwoKICAgIHJldHVybiB7CiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobm9kZUxpc3QsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBhIHNlbGVjdG9yCiAqIGFuZCByZXR1cm5zIGEgcmVtb3ZlIGxpc3RlbmVyIGZ1bmN0aW9uLgogKgogKiBAcGFyYW0ge1N0cmluZ30gc2VsZWN0b3IKICogQHBhcmFtIHtTdHJpbmd9IHR5cGUKICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICogQHJldHVybiB7T2JqZWN0fQogKi8KZnVuY3Rpb24gbGlzdGVuU2VsZWN0b3Ioc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gZGVsZWdhdGUoZG9jdW1lbnQuYm9keSwgc2VsZWN0b3IsIHR5cGUsIGNhbGxiYWNrKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBsaXN0ZW47Cgp9LHsiLi9pcyI6MywiZGVsZWdhdGUiOjJ9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKDQovKioNCiAqIEVsZW1lbnQgcHJvdG90eXBlLg0KICovDQoNCnZhciBwcm90byA9IEVsZW1lbnQucHJvdG90eXBlOw0KDQovKioNCiAqIFZlbmRvciBmdW5jdGlvbi4NCiAqLw0KDQp2YXIgdmVuZG9yID0gcHJvdG8ubWF0Y2hlc1NlbGVjdG9yDQogIHx8IHByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcg0KICB8fCBwcm90by5tb3pNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ubXNNYXRjaGVzU2VsZWN0b3INCiAgfHwgcHJvdG8ub01hdGNoZXNTZWxlY3RvcjsNCg0KLyoqDQogKiBFeHBvc2UgYG1hdGNoKClgLg0KICovDQoNCm1vZHVsZS5leHBvcnRzID0gbWF0Y2g7DQoNCi8qKg0KICogTWF0Y2ggYGVsYCB0byBgc2VsZWN0b3JgLg0KICoNCiAqIEBwYXJhbSB7RWxlbWVudH0gZWwNCiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3Rvcg0KICogQHJldHVybiB7Qm9vbGVhbn0NCiAqIEBhcGkgcHVibGljDQogKi8NCg0KZnVuY3Rpb24gbWF0Y2goZWwsIHNlbGVjdG9yKSB7DQogIGlmICh2ZW5kb3IpIHJldHVybiB2ZW5kb3IuY2FsbChlbCwgc2VsZWN0b3IpOw0KICB2YXIgbm9kZXMgPSBlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGVzW2ldID09IGVsKSByZXR1cm4gdHJ1ZTsNCiAgfQ0KICByZXR1cm4gZmFsc2U7DQp9Cn0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewpmdW5jdGlvbiBzZWxlY3QoZWxlbWVudCkgewogICAgdmFyIHNlbGVjdGVkVGV4dDsKCiAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50Lm5vZGVOYW1lID09PSAnVEVYVEFSRUEnKSB7CiAgICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgICAgIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgZWxlbWVudC52YWx1ZS5sZW5ndGgpOwoKICAgICAgICBzZWxlY3RlZFRleHQgPSBlbGVtZW50LnZhbHVlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSkgewogICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CgogICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTsKICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKCiAgICAgICAgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7CiAgICB9CgogICAgcmV0dXJuIHNlbGVjdGVkVGV4dDsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzZWxlY3Q7Cgp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsKZnVuY3Rpb24gRSAoKSB7CgkvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tCiAgLy8gKHZpYSBodHRwczovL2dpdGh1Yi5jb20vbGlwc21hY2sgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2lzc3Vlcy8zKQp9CgpFLnByb3RvdHlwZSA9IHsKCW9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKCiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7CiAgICAgIGZuOiBjYWxsYmFjaywKICAgICAgY3R4OiBjdHgKICAgIH0pOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIG9uY2U6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgY3R4KSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBmdW5jdGlvbiBsaXN0ZW5lciAoKSB7CiAgICAgIHNlbGYub2ZmKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgfTsKCiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2sKICAgIHJldHVybiB0aGlzLm9uKG5hbWUsIGxpc3RlbmVyLCBjdHgpOwogIH0sCgogIGVtaXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICB2YXIgZGF0YSA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTsKICAgIHZhciBpID0gMDsKICAgIHZhciBsZW4gPSBldnRBcnIubGVuZ3RoOwoKICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGV2dEFycltpXS5mbi5hcHBseShldnRBcnJbaV0uY3R4LCBkYXRhKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBvZmY6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTsKICAgIHZhciBldnRzID0gZVtuYW1lXTsKICAgIHZhciBsaXZlRXZlbnRzID0gW107CgogICAgaWYgKGV2dHMgJiYgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2dHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaykKICAgICAgICAgIGxpdmVFdmVudHMucHVzaChldnRzW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJlbW92ZSBldmVudCBmcm9tIHF1ZXVlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZAogICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRjb3JnYW4vdGlueS1lbWl0dGVyL2NvbW1pdC9jNmViZmFhOWJjOTczYjMzZDExMGE4NGEzMDc3NDJiN2NmOTRjOTUzI2NvbW1pdGNvbW1lbnQtNTAyNDkxMAoKICAgIChsaXZlRXZlbnRzLmxlbmd0aCkKICAgICAgPyBlW25hbWVdID0gbGl2ZUV2ZW50cwogICAgICA6IGRlbGV0ZSBlW25hbWVdOwoKICAgIHJldHVybiB0aGlzOwogIH0KfTsKCm1vZHVsZS5leHBvcnRzID0gRTsKCn0se31dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICdzZWxlY3QnXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCdzZWxlY3QnKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLnNlbGVjdCk7CiAgICAgICAgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiA9IG1vZC5leHBvcnRzOwogICAgfQp9KSh0aGlzLCBmdW5jdGlvbiAobW9kdWxlLCBfc2VsZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9zZWxlY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2VsZWN0KTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9OwoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgICAgICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICAgICAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgICAgIH07CiAgICB9KCk7CgogICAgdmFyIENsaXBib2FyZEFjdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAgICAqLwoKICAgICAgICBmdW5jdGlvbiBDbGlwYm9hcmRBY3Rpb24ob3B0aW9ucykgewogICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpcGJvYXJkQWN0aW9uKTsKCiAgICAgICAgICAgIHRoaXMucmVzb2x2ZU9wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBiYXNlIHByb3BlcnRpZXMgcGFzc2VkIGZyb20gY29uc3RydWN0b3IuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnMgPSBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucygpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTsKCiAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gb3B0aW9ucy5hY3Rpb247CiAgICAgICAgICAgIHRoaXMuZW1pdHRlciA9IG9wdGlvbnMuZW1pdHRlcjsKICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLnRhcmdldDsKICAgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0OwogICAgICAgICAgICB0aGlzLnRyaWdnZXIgPSBvcHRpb25zLnRyaWdnZXI7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICcnOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaW5pdFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluaXRTZWxlY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRleHQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RmFrZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRhcmdldCgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkQWN0aW9uLnByb3RvdHlwZS5zZWxlY3RGYWtlID0gZnVuY3Rpb24gc2VsZWN0RmFrZSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgIHZhciBpc1JUTCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpID09ICdydGwnOwoKICAgICAgICAgICAgdGhpcy5yZW1vdmVGYWtlKCk7CgogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlRmFrZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmZha2VIYW5kbGVyID0gZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZmFrZUhhbmRsZXJDYWxsYmFjaykgfHwgdHJ1ZTsKCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgICAgICAgICAvLyBQcmV2ZW50IHpvb21pbmcgb24gaU9TCiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7CiAgICAgICAgICAgIC8vIFJlc2V0IGJveCBtb2RlbAogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLmJvcmRlciA9ICcwJzsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS5zdHlsZS5wYWRkaW5nID0gJzAnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlLm1hcmdpbiA9ICcwJzsKICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IG91dCBvZiBzY3JlZW4gaG9yaXpvbnRhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgICAgICB0aGlzLmZha2VFbGVtLnN0eWxlW2lzUlRMID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnLTk5OTlweCc7CiAgICAgICAgICAgIC8vIE1vdmUgZWxlbWVudCB0byB0aGUgc2FtZSBwb3NpdGlvbiB2ZXJ0aWNhbGx5CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc3R5bGUudG9wID0gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSArICdweCc7CiAgICAgICAgICAgIHRoaXMuZmFrZUVsZW0uc2V0QXR0cmlidXRlKCdyZWFkb25seScsICcnKTsKICAgICAgICAgICAgdGhpcy5mYWtlRWxlbS52YWx1ZSA9IHRoaXMudGV4dDsKCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5mYWtlRWxlbSk7CgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLmZha2VFbGVtKTsKICAgICAgICAgICAgdGhpcy5jb3B5VGV4dCgpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUucmVtb3ZlRmFrZSA9IGZ1bmN0aW9uIHJlbW92ZUZha2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmZha2VIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIHRoaXMuZmFrZUhhbmRsZXIgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuZmFrZUVsZW0pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5mYWtlRWxlbSk7CiAgICAgICAgICAgICAgICB0aGlzLmZha2VFbGVtID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuc2VsZWN0VGFyZ2V0ID0gZnVuY3Rpb24gc2VsZWN0VGFyZ2V0KCkgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9ICgwLCBfc2VsZWN0Mi5kZWZhdWx0KSh0aGlzLnRhcmdldCk7CiAgICAgICAgICAgIHRoaXMuY29weVRleHQoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmNvcHlUZXh0ID0gZnVuY3Rpb24gY29weVRleHQoKSB7CiAgICAgICAgICAgIHZhciBzdWNjZWVkZWQgPSB1bmRlZmluZWQ7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQodGhpcy5hY3Rpb24pOwogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmhhbmRsZVJlc3VsdChzdWNjZWVkZWQpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuaGFuZGxlUmVzdWx0ID0gZnVuY3Rpb24gaGFuZGxlUmVzdWx0KHN1Y2NlZWRlZCkgewogICAgICAgICAgICBpZiAoc3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgnc3VjY2VzcycsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRUZXh0LAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KCdlcnJvcicsIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRoaXMudHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBjbGVhclNlbGVjdGlvbjogdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZEFjdGlvbi5wcm90b3R5cGUuY2xlYXJTZWxlY3Rpb24gPSBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5ibHVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmRBY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUZha2UoKTsKICAgICAgICB9OwoKICAgICAgICBfY3JlYXRlQ2xhc3MoQ2xpcGJvYXJkQWN0aW9uLCBbewogICAgICAgICAgICBrZXk6ICdhY3Rpb24nLAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHsKICAgICAgICAgICAgICAgIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAnY29weScgOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uID0gYWN0aW9uOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hY3Rpb24gIT09ICdjb3B5JyAmJiB0aGlzLl9hY3Rpb24gIT09ICdjdXQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJhY3Rpb24iIHZhbHVlLCB1c2UgZWl0aGVyICJjb3B5IiBvciAiY3V0IicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICB9LCB7CiAgICAgICAgICAgIGtleTogJ3RhcmdldCcsCiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHRhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodGFyZ2V0KSkgPT09ICdvYmplY3QnICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjb3B5JyAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBQbGVhc2UgdXNlICJyZWFkb25seSIgaW5zdGVhZCBvZiAiZGlzYWJsZWQiIGF0dHJpYnV0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT09ICdjdXQnICYmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpIHx8IHRhcmdldC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90YXJnZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9XSk7CgogICAgICAgIHJldHVybiBDbGlwYm9hcmRBY3Rpb247CiAgICB9KCk7CgogICAgbW9kdWxlLmV4cG9ydHMgPSBDbGlwYm9hcmRBY3Rpb247Cn0pOwoKfSx7InNlbGVjdCI6Nn1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpewooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIGRlZmluZShbJ21vZHVsZScsICcuL2NsaXBib2FyZC1hY3Rpb24nLCAndGlueS1lbWl0dGVyJywgJ2dvb2QtbGlzdGVuZXInXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGZhY3RvcnkobW9kdWxlLCByZXF1aXJlKCcuL2NsaXBib2FyZC1hY3Rpb24nKSwgcmVxdWlyZSgndGlueS1lbWl0dGVyJyksIHJlcXVpcmUoJ2dvb2QtbGlzdGVuZXInKSk7CiAgICB9IGVsc2UgewogICAgICAgIHZhciBtb2QgPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgfTsKICAgICAgICBmYWN0b3J5KG1vZCwgZ2xvYmFsLmNsaXBib2FyZEFjdGlvbiwgZ2xvYmFsLnRpbnlFbWl0dGVyLCBnbG9iYWwuZ29vZExpc3RlbmVyKTsKICAgICAgICBnbG9iYWwuY2xpcGJvYXJkID0gbW9kLmV4cG9ydHM7CiAgICB9Cn0pKHRoaXMsIGZ1bmN0aW9uIChtb2R1bGUsIF9jbGlwYm9hcmRBY3Rpb24sIF90aW55RW1pdHRlciwgX2dvb2RMaXN0ZW5lcikgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBfY2xpcGJvYXJkQWN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsaXBib2FyZEFjdGlvbik7CgogICAgdmFyIF90aW55RW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90aW55RW1pdHRlcik7CgogICAgdmFyIF9nb29kTGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ29vZExpc3RlbmVyKTsKCiAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7CiAgICAgICAgICAgIGRlZmF1bHQ6IG9iagogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7CiAgICAgICAgaWYgKCFzZWxmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBjYWxsID09PSAiZnVuY3Rpb24iKSA/IGNhbGwgOiBzZWxmOwogICAgfQoKICAgIGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgewogICAgICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIiArIHR5cGVvZiBzdXBlckNsYXNzKTsKICAgICAgICB9CgogICAgICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgdmFsdWU6IHN1YkNsYXNzLAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOwogICAgfQoKICAgIHZhciBDbGlwYm9hcmQgPSBmdW5jdGlvbiAoX0VtaXR0ZXIpIHsKICAgICAgICBfaW5oZXJpdHMoQ2xpcGJvYXJkLCBfRW1pdHRlcik7CgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSB0cmlnZ2VyCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICAgKi8KCiAgICAgICAgZnVuY3Rpb24gQ2xpcGJvYXJkKHRyaWdnZXIsIG9wdGlvbnMpIHsKICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsaXBib2FyZCk7CgogICAgICAgICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfRW1pdHRlci5jYWxsKHRoaXMpKTsKCiAgICAgICAgICAgIF90aGlzLnJlc29sdmVPcHRpb25zKG9wdGlvbnMpOwogICAgICAgICAgICBfdGhpcy5saXN0ZW5DbGljayh0cmlnZ2VyKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBpZiBhdHRyaWJ1dGVzIHdvdWxkIGJlIHJlc29sdmVkIHVzaW5nIGludGVybmFsIHNldHRlciBmdW5jdGlvbnMKICAgICAgICAgKiBvciBjdXN0b20gZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICAgICAgICovCgoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLnJlc29sdmVPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZU9wdGlvbnMoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07CgogICAgICAgICAgICB0aGlzLmFjdGlvbiA9IHR5cGVvZiBvcHRpb25zLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuYWN0aW9uIDogdGhpcy5kZWZhdWx0QWN0aW9uOwogICAgICAgICAgICB0aGlzLnRhcmdldCA9IHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGFyZ2V0IDogdGhpcy5kZWZhdWx0VGFyZ2V0OwogICAgICAgICAgICB0aGlzLnRleHQgPSB0eXBlb2Ygb3B0aW9ucy50ZXh0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy50ZXh0IDogdGhpcy5kZWZhdWx0VGV4dDsKICAgICAgICB9OwoKICAgICAgICBDbGlwYm9hcmQucHJvdG90eXBlLmxpc3RlbkNsaWNrID0gZnVuY3Rpb24gbGlzdGVuQ2xpY2sodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSAoMCwgX2dvb2RMaXN0ZW5lcjIuZGVmYXVsdCkodHJpZ2dlciwgJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczIub25DbGljayhlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgQ2xpcGJvYXJkLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhlKSB7CiAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gZS5kZWxlZ2F0ZVRhcmdldCB8fCBlLmN1cnJlbnRUYXJnZXQ7CgogICAgICAgICAgICBpZiAodGhpcy5jbGlwYm9hcmRBY3Rpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkQWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRBY3Rpb24gPSBuZXcgX2NsaXBib2FyZEFjdGlvbjIuZGVmYXVsdCh7CiAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uKHRyaWdnZXIpLAogICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMudGV4dCh0cmlnZ2VyKSwKICAgICAgICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsCiAgICAgICAgICAgICAgICBlbWl0dGVyOiB0aGlzCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdEFjdGlvbiA9IGZ1bmN0aW9uIGRlZmF1bHRBY3Rpb24odHJpZ2dlcikgewogICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoJ2FjdGlvbicsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRhcmdldCA9IGZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQodHJpZ2dlcikgewogICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgndGFyZ2V0JywgdHJpZ2dlcik7CgogICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVmYXVsdFRleHQgPSBmdW5jdGlvbiBkZWZhdWx0VGV4dCh0cmlnZ2VyKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgndGV4dCcsIHRyaWdnZXIpOwogICAgICAgIH07CgogICAgICAgIENsaXBib2FyZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuY2xpcGJvYXJkQWN0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZEFjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICByZXR1cm4gQ2xpcGJvYXJkOwogICAgfShfdGlueUVtaXR0ZXIyLmRlZmF1bHQpOwoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGF0dHJpYnV0ZSB2YWx1ZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWZmaXgKICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShzdWZmaXgsIGVsZW1lbnQpIHsKICAgICAgICB2YXIgYXR0cmlidXRlID0gJ2RhdGEtY2xpcGJvYXJkLScgKyBzdWZmaXg7CgogICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KCiAgICBtb2R1bGUuZXhwb3J0cyA9IENsaXBib2FyZDsKfSk7Cgp9LHsiLi9jbGlwYm9hcmQtYWN0aW9uIjo4LCJnb29kLWxpc3RlbmVyIjo0LCJ0aW55LWVtaXR0ZXIiOjd9XX0se30sWzldKSg5KQp9KTs=
LyohCiAqIGNsaXBib2FyZC5qcyB2MS41LjEyCiAqIGh0dHBzOi8vemVub3JvY2hhLmdpdGh1Yi5pby9jbGlwYm9hcmQuanMKICoKICogTGljZW5zZWQgTUlUIMKpIFplbm8gUm9jaGEKICovCiFmdW5jdGlvbih0KXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLHQpO2Vsc2V7dmFyIGU7ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZS5DbGlwYm9hcmQ9dCgpfX0oZnVuY3Rpb24oKXt2YXIgdCxlLG47cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLG8pe2Z1bmN0aW9uIGkoYSxjKXtpZighblthXSl7aWYoIWVbYV0pe3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFjJiZzKXJldHVybiBzKGEsITApO2lmKHIpcmV0dXJuIHIoYSwhMCk7dmFyIGw9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGwuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsbH12YXIgdT1uW2FdPXtleHBvcnRzOnt9fTtlW2FdWzBdLmNhbGwodS5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciBuPWVbYV1bMV1bdF07cmV0dXJuIGkobj9uOnQpfSx1LHUuZXhwb3J0cyx0LGUsbixvKX1yZXR1cm4gblthXS5leHBvcnRzfWZvcih2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxhPTA7YTxvLmxlbmd0aDthKyspaShvW2FdKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxuKXt2YXIgbz10KCJtYXRjaGVzLXNlbGVjdG9yIik7ZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9bj90OnQucGFyZW50Tm9kZTtpJiZpIT09ZG9jdW1lbnQ7KXtpZihvKGksZSkpcmV0dXJuIGk7aT1pLnBhcmVudE5vZGV9fX0seyJtYXRjaGVzLXNlbGVjdG9yIjo1fV0sMjpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlLG4sbyxyKXt2YXIgYT1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKG4sYSxyKSx7ZGVzdHJveTpmdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGEscil9fX1mdW5jdGlvbiBpKHQsZSxuLG8pe3JldHVybiBmdW5jdGlvbihuKXtuLmRlbGVnYXRlVGFyZ2V0PXIobi50YXJnZXQsZSwhMCksbi5kZWxlZ2F0ZVRhcmdldCYmby5jYWxsKHQsbil9fXZhciByPXQoImNsb3Nlc3QiKTtlLmV4cG9ydHM9b30se2Nsb3Nlc3Q6MX1dLDM6W2Z1bmN0aW9uKHQsZSxuKXtuLm5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmMT09PXQubm9kZVR5cGV9LG4ubm9kZUxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiB2b2lkIDAhPT10JiYoIltvYmplY3QgTm9kZUxpc3RdIj09PWV8fCJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSI9PT1lKSYmImxlbmd0aCJpbiB0JiYoMD09PXQubGVuZ3RofHxuLm5vZGUodFswXSkpfSxuLnN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBTdHJpbmd9LG4uZm49ZnVuY3Rpb24odCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lfX0se31dLDQ6W2Z1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiBvKHQsZSxuKXtpZighdCYmIWUmJiFuKXRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudHMiKTtpZighYy5zdHJpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBTdHJpbmciKTtpZighYy5mbihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgRnVuY3Rpb24iKTtpZihjLm5vZGUodCkpcmV0dXJuIGkodCxlLG4pO2lmKGMubm9kZUxpc3QodCkpcmV0dXJuIHIodCxlLG4pO2lmKGMuc3RyaW5nKHQpKXJldHVybiBhKHQsZSxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Iil9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihlLG4pLHtkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9fX1mdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9KX19fWZ1bmN0aW9uIGEodCxlLG4pe3JldHVybiBzKGRvY3VtZW50LmJvZHksdCxlLG4pfXZhciBjPXQoIi4vaXMiKSxzPXQoImRlbGVnYXRlIik7ZS5leHBvcnRzPW99LHsiLi9pcyI6MyxkZWxlZ2F0ZToyfV0sNTpbZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8odCxlKXtpZihyKXJldHVybiByLmNhbGwodCxlKTtmb3IodmFyIG49dC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZSksbz0wO288bi5sZW5ndGg7KytvKWlmKG5bb109PXQpcmV0dXJuITA7cmV0dXJuITF9dmFyIGk9RWxlbWVudC5wcm90b3R5cGUscj1pLm1hdGNoZXNTZWxlY3Rvcnx8aS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGkubW96TWF0Y2hlc1NlbGVjdG9yfHxpLm1zTWF0Y2hlc1NlbGVjdG9yfHxpLm9NYXRjaGVzU2VsZWN0b3I7ZS5leHBvcnRzPW99LHt9XSw2OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbyh0KXt2YXIgZTtpZigiSU5QVVQiPT09dC5ub2RlTmFtZXx8IlRFWFRBUkVBIj09PXQubm9kZU5hbWUpdC5mb2N1cygpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZT10LnZhbHVlO2Vsc2V7dC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpJiZ0LmZvY3VzKCk7dmFyIG49d2luZG93LmdldFNlbGVjdGlvbigpLG89ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtvLnNlbGVjdE5vZGVDb250ZW50cyh0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG4uYWRkUmFuZ2UobyksZT1uLnRvU3RyaW5nKCl9cmV0dXJuIGV9ZS5leHBvcnRzPW99LHt9XSw3OltmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbygpe31vLnByb3RvdHlwZT17b246ZnVuY3Rpb24odCxlLG4pe3ZhciBvPXRoaXMuZXx8KHRoaXMuZT17fSk7cmV0dXJuKG9bdF18fChvW3RdPVtdKSkucHVzaCh7Zm46ZSxjdHg6bn0pLHRoaXN9LG9uY2U6ZnVuY3Rpb24odCxlLG4pe2Z1bmN0aW9uIG8oKXtpLm9mZih0LG8pLGUuYXBwbHkobixhcmd1bWVudHMpfXZhciBpPXRoaXM7cmV0dXJuIG8uXz1lLHRoaXMub24odCxvLG4pfSxlbWl0OmZ1bmN0aW9uKHQpe3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49KCh0aGlzLmV8fCh0aGlzLmU9e30pKVt0XXx8W10pLnNsaWNlKCksbz0wLGk9bi5sZW5ndGg7Zm9yKG87aT5vO28rKyluW29dLmZuLmFwcGx5KG5bb10uY3R4LGUpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV8fCh0aGlzLmU9e30pLG89blt0XSxpPVtdO2lmKG8mJmUpZm9yKHZhciByPTAsYT1vLmxlbmd0aDthPnI7cisrKW9bcl0uZm4hPT1lJiZvW3JdLmZuLl8hPT1lJiZpLnB1c2gob1tyXSk7cmV0dXJuIGkubGVuZ3RoP25bdF09aTpkZWxldGUgblt0XSx0aGlzfX0sZS5leHBvcnRzPW99LHt9XSw4OltmdW5jdGlvbihlLG4sbyl7IWZ1bmN0aW9uKGkscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kKXQoWyJtb2R1bGUiLCJzZWxlY3QiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgic2VsZWN0IikpO2Vsc2V7dmFyIGE9e2V4cG9ydHM6e319O3IoYSxpLnNlbGVjdCksaS5jbGlwYm9hcmRBY3Rpb249YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ImRlZmF1bHQiOnR9fWZ1bmN0aW9uIG8odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX12YXIgaT1uKGUpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbD8ic3ltYm9sIjp0eXBlb2YgdH0sYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1yZXR1cm4gZnVuY3Rpb24oZSxuLG8pe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLG8mJnQoZSxvKSxlfX0oKSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtvKHRoaXMsdCksdGhpcy5yZXNvbHZlT3B0aW9ucyhlKSx0aGlzLmluaXRTZWxlY3Rpb24oKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzb2x2ZU9wdGlvbnM9ZnVuY3Rpb24gdCgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8PTB8fHZvaWQgMD09PWFyZ3VtZW50c1swXT97fTphcmd1bWVudHNbMF07dGhpcy5hY3Rpb249ZS5hY3Rpb24sdGhpcy5lbWl0dGVyPWUuZW1pdHRlcix0aGlzLnRhcmdldD1lLnRhcmdldCx0aGlzLnRleHQ9ZS50ZXh0LHRoaXMudHJpZ2dlcj1lLnRyaWdnZXIsdGhpcy5zZWxlY3RlZFRleHQ9IiJ9LHQucHJvdG90eXBlLmluaXRTZWxlY3Rpb249ZnVuY3Rpb24gdCgpe3RoaXMudGV4dD90aGlzLnNlbGVjdEZha2UoKTp0aGlzLnRhcmdldCYmdGhpcy5zZWxlY3RUYXJnZXQoKX0sdC5wcm90b3R5cGUuc2VsZWN0RmFrZT1mdW5jdGlvbiB0KCl7dmFyIGU9dGhpcyxuPSJydGwiPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkaXIiKTt0aGlzLnJlbW92ZUZha2UoKSx0aGlzLmZha2VIYW5kbGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW1vdmVGYWtlKCl9LHRoaXMuZmFrZUhhbmRsZXI9ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKXx8ITAsdGhpcy5mYWtlRWxlbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpLHRoaXMuZmFrZUVsZW0uc3R5bGUuZm9udFNpemU9IjEycHQiLHRoaXMuZmFrZUVsZW0uc3R5bGUuYm9yZGVyPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBhZGRpbmc9IjAiLHRoaXMuZmFrZUVsZW0uc3R5bGUubWFyZ2luPSIwIix0aGlzLmZha2VFbGVtLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5mYWtlRWxlbS5zdHlsZVtuPyJyaWdodCI6ImxlZnQiXT0iLTk5OTlweCIsdGhpcy5mYWtlRWxlbS5zdHlsZS50b3A9KHdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkrInB4Iix0aGlzLmZha2VFbGVtLnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0aGlzLmZha2VFbGVtLnZhbHVlPXRoaXMudGV4dCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuc2VsZWN0ZWRUZXh0PSgwLGkuZGVmYXVsdCkodGhpcy5mYWtlRWxlbSksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5yZW1vdmVGYWtlPWZ1bmN0aW9uIHQoKXt0aGlzLmZha2VIYW5kbGVyJiYoZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrKSx0aGlzLmZha2VIYW5kbGVyPW51bGwsdGhpcy5mYWtlSGFuZGxlckNhbGxiYWNrPW51bGwpLHRoaXMuZmFrZUVsZW0mJihkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuZmFrZUVsZW0pLHRoaXMuZmFrZUVsZW09bnVsbCl9LHQucHJvdG90eXBlLnNlbGVjdFRhcmdldD1mdW5jdGlvbiB0KCl7dGhpcy5zZWxlY3RlZFRleHQ9KDAsaS5kZWZhdWx0KSh0aGlzLnRhcmdldCksdGhpcy5jb3B5VGV4dCgpfSx0LnByb3RvdHlwZS5jb3B5VGV4dD1mdW5jdGlvbiB0KCl7dmFyIGU9dm9pZCAwO3RyeXtlPWRvY3VtZW50LmV4ZWNDb21tYW5kKHRoaXMuYWN0aW9uKX1jYXRjaChuKXtlPSExfXRoaXMuaGFuZGxlUmVzdWx0KGUpfSx0LnByb3RvdHlwZS5oYW5kbGVSZXN1bHQ9ZnVuY3Rpb24gdChlKXtlP3RoaXMuZW1pdHRlci5lbWl0KCJzdWNjZXNzIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRleHQ6dGhpcy5zZWxlY3RlZFRleHQsdHJpZ2dlcjp0aGlzLnRyaWdnZXIsY2xlYXJTZWxlY3Rpb246dGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpfSk6dGhpcy5lbWl0dGVyLmVtaXQoImVycm9yIix7YWN0aW9uOnRoaXMuYWN0aW9uLHRyaWdnZXI6dGhpcy50cmlnZ2VyLGNsZWFyU2VsZWN0aW9uOnRoaXMuY2xlYXJTZWxlY3Rpb24uYmluZCh0aGlzKX0pfSx0LnByb3RvdHlwZS5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbiB0KCl7dGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LmJsdXIoKSx3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24gdCgpe3RoaXMucmVtb3ZlRmFrZSgpfSxhKHQsW3trZXk6ImFjdGlvbiIsc2V0OmZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/ImNvcHkiOmFyZ3VtZW50c1swXTtpZih0aGlzLl9hY3Rpb249ZSwiY29weSIhPT10aGlzLl9hY3Rpb24mJiJjdXQiIT09dGhpcy5fYWN0aW9uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAiYWN0aW9uIiB2YWx1ZSwgdXNlIGVpdGhlciAiY29weSIgb3IgImN1dCInKX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fYWN0aW9ufX0se2tleToidGFyZ2V0IixzZXQ6ZnVuY3Rpb24gdChlKXtpZih2b2lkIDAhPT1lKXtpZighZXx8Im9iamVjdCIhPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBlPyJ1bmRlZmluZWQiOnIoZSkpfHwxIT09ZS5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgdmFsdWUsIHVzZSBhIHZhbGlkIEVsZW1lbnQnKTtpZigiY29weSI9PT10aGlzLmFjdGlvbiYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PXRoaXMuYWN0aW9uJiYoZS5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5Iil8fGUuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgInRhcmdldCIgYXR0cmlidXRlLiBZb3UgY2FuXCd0IGN1dCB0ZXh0IGZyb20gZWxlbWVudHMgd2l0aCAicmVhZG9ubHkiIG9yICJkaXNhYmxlZCIgYXR0cmlidXRlcycpO3RoaXMuX3RhcmdldD1lfX0sZ2V0OmZ1bmN0aW9uIHQoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0fX1dKSx0fSgpO3QuZXhwb3J0cz1jfSl9LHtzZWxlY3Q6Nn1dLDk6W2Z1bmN0aW9uKGUsbixvKXshZnVuY3Rpb24oaSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQpdChbIm1vZHVsZSIsIi4vY2xpcGJvYXJkLWFjdGlvbiIsInRpbnktZW1pdHRlciIsImdvb2QtbGlzdGVuZXIiXSxyKTtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgbylyKG4sZSgiLi9jbGlwYm9hcmQtYWN0aW9uIiksZSgidGlueS1lbWl0dGVyIiksZSgiZ29vZC1saXN0ZW5lciIpKTtlbHNle3ZhciBhPXtleHBvcnRzOnt9fTtyKGEsaS5jbGlwYm9hcmRBY3Rpb24saS50aW55RW1pdHRlcixpLmdvb2RMaXN0ZW5lciksaS5jbGlwYm9hcmQ9YS5leHBvcnRzfX0odGhpcyxmdW5jdGlvbih0LGUsbixvKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiByKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gYSh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGModCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCxlKXt2YXIgbj0iZGF0YS1jbGlwYm9hcmQtIit0O2lmKGUuaGFzQXR0cmlidXRlKG4pKXJldHVybiBlLmdldEF0dHJpYnV0ZShuKX12YXIgbD1pKGUpLHU9aShuKSxmPWkobyksZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4sbyl7cih0aGlzLGUpO3ZhciBpPWEodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBpLnJlc29sdmVPcHRpb25zKG8pLGkubGlzdGVuQ2xpY2sobiksaX1yZXR1cm4gYyhlLHQpLGUucHJvdG90eXBlLnJlc29sdmVPcHRpb25zPWZ1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/e306YXJndW1lbnRzWzBdO3RoaXMuYWN0aW9uPSJmdW5jdGlvbiI9PXR5cGVvZiBlLmFjdGlvbj9lLmFjdGlvbjp0aGlzLmRlZmF1bHRBY3Rpb24sdGhpcy50YXJnZXQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGFyZ2V0P2UudGFyZ2V0OnRoaXMuZGVmYXVsdFRhcmdldCx0aGlzLnRleHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudGV4dD9lLnRleHQ6dGhpcy5kZWZhdWx0VGV4dH0sZS5wcm90b3R5cGUubGlzdGVuQ2xpY2s9ZnVuY3Rpb24gdChlKXt2YXIgbj10aGlzO3RoaXMubGlzdGVuZXI9KDAsZi5kZWZhdWx0KShlLCJjbGljayIsZnVuY3Rpb24odCl7cmV0dXJuIG4ub25DbGljayh0KX0pfSxlLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uIHQoZSl7dmFyIG49ZS5kZWxlZ2F0ZVRhcmdldHx8ZS5jdXJyZW50VGFyZ2V0O3RoaXMuY2xpcGJvYXJkQWN0aW9uJiYodGhpcy5jbGlwYm9hcmRBY3Rpb249bnVsbCksdGhpcy5jbGlwYm9hcmRBY3Rpb249bmV3IGwuZGVmYXVsdCh7YWN0aW9uOnRoaXMuYWN0aW9uKG4pLHRhcmdldDp0aGlzLnRhcmdldChuKSx0ZXh0OnRoaXMudGV4dChuKSx0cmlnZ2VyOm4sZW1pdHRlcjp0aGlzfSl9LGUucHJvdG90eXBlLmRlZmF1bHRBY3Rpb249ZnVuY3Rpb24gdChlKXtyZXR1cm4gcygiYWN0aW9uIixlKX0sZS5wcm90b3R5cGUuZGVmYXVsdFRhcmdldD1mdW5jdGlvbiB0KGUpe3ZhciBuPXMoInRhcmdldCIsZSk7cmV0dXJuIG4/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKTp2b2lkIDB9LGUucHJvdG90eXBlLmRlZmF1bHRUZXh0PWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHMoInRleHQiLGUpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uIHQoKXt0aGlzLmxpc3RlbmVyLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbiYmKHRoaXMuY2xpcGJvYXJkQWN0aW9uLmRlc3Ryb3koKSx0aGlzLmNsaXBib2FyZEFjdGlvbj1udWxsKX0sZX0odS5kZWZhdWx0KTt0LmV4cG9ydHM9ZH0pfSx7Ii4vY2xpcGJvYXJkLWFjdGlvbiI6OCwiZ29vZC1saXN0ZW5lciI6NCwidGlueS1lbWl0dGVyIjo3fV19LHt9LFs5XSkoOSl9KTs=
Ly8gU3BlY3RydW0gQ29sb3JwaWNrZXIgdjEuOC4wCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvc3BlY3RydW0KLy8gQXV0aG9yOiBCcmlhbiBHcmluc3RlYWQKLy8gTGljZW5zZTogTUlUCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRAogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIHsgLy8gQ29tbW9uSlMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfQogICAgZWxzZSB7IC8vIEJyb3dzZXIKICAgICAgICBmYWN0b3J5KGpRdWVyeSk7CiAgICB9Cn0pKGZ1bmN0aW9uKCQsIHVuZGVmaW5lZCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIHZhciBkZWZhdWx0T3B0cyA9IHsKCiAgICAgICAgLy8gQ2FsbGJhY2tzCiAgICAgICAgYmVmb3JlU2hvdzogbm9vcCwKICAgICAgICBtb3ZlOiBub29wLAogICAgICAgIGNoYW5nZTogbm9vcCwKICAgICAgICBzaG93OiBub29wLAogICAgICAgIGhpZGU6IG5vb3AsCgogICAgICAgIC8vIE9wdGlvbnMKICAgICAgICBjb2xvcjogZmFsc2UsCiAgICAgICAgZmxhdDogZmFsc2UsCiAgICAgICAgc2hvd0lucHV0OiBmYWxzZSwKICAgICAgICBhbGxvd0VtcHR5OiBmYWxzZSwKICAgICAgICBzaG93QnV0dG9uczogdHJ1ZSwKICAgICAgICBjbGlja291dEZpcmVzQ2hhbmdlOiB0cnVlLAogICAgICAgIHNob3dJbml0aWFsOiBmYWxzZSwKICAgICAgICBzaG93UGFsZXR0ZTogZmFsc2UsCiAgICAgICAgc2hvd1BhbGV0dGVPbmx5OiBmYWxzZSwKICAgICAgICBoaWRlQWZ0ZXJQYWxldHRlU2VsZWN0OiBmYWxzZSwKICAgICAgICB0b2dnbGVQYWxldHRlT25seTogZmFsc2UsCiAgICAgICAgc2hvd1NlbGVjdGlvblBhbGV0dGU6IHRydWUsCiAgICAgICAgbG9jYWxTdG9yYWdlS2V5OiBmYWxzZSwKICAgICAgICBhcHBlbmRUbzogImJvZHkiLAogICAgICAgIG1heFNlbGVjdGlvblNpemU6IDcsCiAgICAgICAgY2FuY2VsVGV4dDogImNhbmNlbCIsCiAgICAgICAgY2hvb3NlVGV4dDogImNob29zZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZU1vcmVUZXh0OiAibW9yZSIsCiAgICAgICAgdG9nZ2xlUGFsZXR0ZUxlc3NUZXh0OiAibGVzcyIsCiAgICAgICAgY2xlYXJUZXh0OiAiQ2xlYXIgQ29sb3IgU2VsZWN0aW9uIiwKICAgICAgICBub0NvbG9yU2VsZWN0ZWRUZXh0OiAiTm8gQ29sb3IgU2VsZWN0ZWQiLAogICAgICAgIHByZWZlcnJlZEZvcm1hdDogZmFsc2UsCiAgICAgICAgY2xhc3NOYW1lOiAiIiwgLy8gRGVwcmVjYXRlZCAtIHVzZSBjb250YWluZXJDbGFzc05hbWUgYW5kIHJlcGxhY2VyQ2xhc3NOYW1lIGluc3RlYWQuCiAgICAgICAgY29udGFpbmVyQ2xhc3NOYW1lOiAiIiwKICAgICAgICByZXBsYWNlckNsYXNzTmFtZTogIiIsCiAgICAgICAgc2hvd0FscGhhOiBmYWxzZSwKICAgICAgICB0aGVtZTogInNwLWxpZ2h0IiwKICAgICAgICBwYWxldHRlOiBbWyIjZmZmZmZmIiwgIiMwMDAwMDAiLCAiI2ZmMDAwMCIsICIjZmY4MDAwIiwgIiNmZmZmMDAiLCAiIzAwODAwMCIsICIjMDAwMGZmIiwgIiM0YjAwODIiLCAiIzk0MDBkMyJdXSwKICAgICAgICBzZWxlY3Rpb25QYWxldHRlOiBbXSwKICAgICAgICBkaXNhYmxlZDogZmFsc2UsCiAgICAgICAgb2Zmc2V0OiBudWxsCiAgICB9LAogICAgc3BlY3RydW1zID0gW10sCiAgICBJRSA9ICEhL21zaWUvaS5leGVjKCB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCApLAogICAgcmdiYVN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgZnVuY3Rpb24gY29udGFpbnMoIHN0ciwgc3Vic3RyICkgewogICAgICAgICAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7CiAgICAgICAgfQoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7CiAgICAgICAgc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjUpJzsKICAgICAgICByZXR1cm4gY29udGFpbnMoc3R5bGUuYmFja2dyb3VuZENvbG9yLCAncmdiYScpIHx8IGNvbnRhaW5zKHN0eWxlLmJhY2tncm91bmRDb2xvciwgJ2hzbGEnKTsKICAgIH0pKCksCiAgICByZXBsYWNlSW5wdXQgPSBbCiAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXJlcGxhY2VyJz4iLAogICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcHJldmlldyc+PGRpdiBjbGFzcz0nc3AtcHJldmlldy1pbm5lcic+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWRkJz4mIzk2NjA7PC9kaXY+IiwKICAgICAgICAiPC9kaXY+IgogICAgXS5qb2luKCcnKSwKICAgIG1hcmt1cCA9IChmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIElFIGRvZXMgbm90IHN1cHBvcnQgZ3JhZGllbnRzIHdpdGggbXVsdGlwbGUgc3RvcHMsIHNvIHdlIG5lZWQgdG8gc2ltdWxhdGUKICAgICAgICAvLyAgdGhhdCBmb3IgdGhlIHJhaW5ib3cgc2xpZGVyIHdpdGggOCBkaXZzIHRoYXQgZWFjaCBoYXZlIGEgc2luZ2xlIGdyYWRpZW50CiAgICAgICAgdmFyIGdyYWRpZW50Rml4ID0gIiI7CiAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDY7IGkrKykgewogICAgICAgICAgICAgICAgZ3JhZGllbnRGaXggKz0gIjxkaXYgY2xhc3M9J3NwLSIgKyBpICsgIic+PC9kaXY+IjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbnRhaW5lciBzcC1oaWRkZW4nPiIsCiAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtcGFsZXR0ZS1jb250YWluZXInPiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLXBhbGV0dGUtYnV0dG9uLWNvbnRhaW5lciBzcC1jZic+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtcGFsZXR0ZS10b2dnbGUnPjwvYnV0dG9uPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1waWNrZXItY29udGFpbmVyJz4iLAogICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC10b3Agc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1maWxsJz48L2Rpdj4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtdG9wLWlubmVyJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWNvbG9yJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zYXQnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC12YWwnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtZHJhZ2dlcic+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1jbGVhciBzcC1jbGVhci1kaXNwbGF5Jz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaHVlJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1zbGlkZXInPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRGaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8ZGl2IGNsYXNzPSdzcC1hbHBoYSc+PGRpdiBjbGFzcz0nc3AtYWxwaGEtaW5uZXInPjxkaXYgY2xhc3M9J3NwLWFscGhhLWhhbmRsZSc+PC9kaXY+PC9kaXY+PC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPC9kaXY+IiwKICAgICAgICAgICAgICAgICAgICAiPGRpdiBjbGFzcz0nc3AtaW5wdXQtY29udGFpbmVyIHNwLWNmJz4iLAogICAgICAgICAgICAgICAgICAgICAgICAiPGlucHV0IGNsYXNzPSdzcC1pbnB1dCcgdHlwZT0ndGV4dCcgc3BlbGxjaGVjaz0nZmFsc2UnICAvPiIsCiAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWluaXRpYWwgc3AtdGh1bWIgc3AtY2YnPjwvZGl2PiIsCiAgICAgICAgICAgICAgICAgICAgIjxkaXYgY2xhc3M9J3NwLWJ1dHRvbi1jb250YWluZXIgc3AtY2YnPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICI8YSBjbGFzcz0nc3AtY2FuY2VsJyBocmVmPScjJz48L2E+IiwKICAgICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nc3AtY2hvb3NlJz48L2J1dHRvbj4iLAogICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iLAogICAgICAgICAgICAgICAgIjwvZGl2PiIsCiAgICAgICAgICAgICI8L2Rpdj4iCiAgICAgICAgXS5qb2luKCIiKTsKICAgIH0pKCk7CgogICAgZnVuY3Rpb24gcGFsZXR0ZVRlbXBsYXRlIChwLCBjb2xvciwgY2xhc3NOYW1lLCBvcHRzKSB7CiAgICAgICAgdmFyIGh0bWwgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBwW2ldOwogICAgICAgICAgICBpZihjdXJyZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgdGlueSA9IHRpbnljb2xvcihjdXJyZW50KTsKICAgICAgICAgICAgICAgIHZhciBjID0gdGlueS50b0hzbCgpLmwgPCAwLjUgPyAic3AtdGh1bWItZWwgc3AtdGh1bWItZGFyayIgOiAic3AtdGh1bWItZWwgc3AtdGh1bWItbGlnaHQiOwogICAgICAgICAgICAgICAgYyArPSAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgY3VycmVudCkpID8gIiBzcC10aHVtYi1hY3RpdmUiIDogIiI7CiAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gdGlueS50b1N0cmluZyhvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCAicmdiIik7CiAgICAgICAgICAgICAgICB2YXIgc3dhdGNoU3R5bGUgPSByZ2JhU3VwcG9ydCA/ICgiYmFja2dyb3VuZC1jb2xvcjoiICsgdGlueS50b1JnYlN0cmluZygpKSA6ICJmaWx0ZXI6IiArIHRpbnkudG9GaWx0ZXIoKTsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgnPHNwYW4gdGl0bGU9IicgKyBmb3JtYXR0ZWRTdHJpbmcgKyAnIiBkYXRhLWNvbG9yPSInICsgdGlueS50b1JnYlN0cmluZygpICsgJyIgY2xhc3M9IicgKyBjICsgJyI+PHNwYW4gY2xhc3M9InNwLXRodW1iLWlubmVyIiBzdHlsZT0iJyArIHN3YXRjaFN0eWxlICsgJzsiIC8+PC9zcGFuPicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGNscyA9ICdzcC1jbGVhci1kaXNwbGF5JzsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgkKCc8ZGl2IC8+JykKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuIGRhdGEtY29sb3I9IiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7IiBjbGFzcz0iJyArIGNscyArICciPjwvc3Bhbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBvcHRzLm5vQ29sb3JTZWxlY3RlZFRleHQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIC5odG1sKCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICI8ZGl2IGNsYXNzPSdzcC1jZiAiICsgY2xhc3NOYW1lICsgIic+IiArIGh0bWwuam9pbignJykgKyAiPC9kaXY+IjsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlQWxsKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY3RydW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzcGVjdHJ1bXNbaV0pIHsKICAgICAgICAgICAgICAgIHNwZWN0cnVtc1tpXS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5zdGFuY2VPcHRpb25zKG8sIGNhbGxiYWNrQ29udGV4dCkgewogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQoe30sIGRlZmF1bHRPcHRzLCBvKTsKICAgICAgICBvcHRzLmNhbGxiYWNrcyA9IHsKICAgICAgICAgICAgJ21vdmUnOiBiaW5kKG9wdHMubW92ZSwgY2FsbGJhY2tDb250ZXh0KSwKICAgICAgICAgICAgJ2NoYW5nZSc6IGJpbmQob3B0cy5jaGFuZ2UsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdzaG93JzogYmluZChvcHRzLnNob3csIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdoaWRlJzogYmluZChvcHRzLmhpZGUsIGNhbGxiYWNrQ29udGV4dCksCiAgICAgICAgICAgICdiZWZvcmVTaG93JzogYmluZChvcHRzLmJlZm9yZVNob3csIGNhbGxiYWNrQ29udGV4dCkKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gb3B0czsKICAgIH0KCiAgICBmdW5jdGlvbiBzcGVjdHJ1bShlbGVtZW50LCBvKSB7CgogICAgICAgIHZhciBvcHRzID0gaW5zdGFuY2VPcHRpb25zKG8sIGVsZW1lbnQpLAogICAgICAgICAgICBmbGF0ID0gb3B0cy5mbGF0LAogICAgICAgICAgICBzaG93U2VsZWN0aW9uUGFsZXR0ZSA9IG9wdHMuc2hvd1NlbGVjdGlvblBhbGV0dGUsCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZUtleSA9IG9wdHMubG9jYWxTdG9yYWdlS2V5LAogICAgICAgICAgICB0aGVtZSA9IG9wdHMudGhlbWUsCiAgICAgICAgICAgIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzLAogICAgICAgICAgICByZXNpemUgPSB0aHJvdHRsZShyZWZsb3csIDEwKSwKICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlLAogICAgICAgICAgICBpc0RyYWdnaW5nID0gZmFsc2UsCiAgICAgICAgICAgIGRyYWdXaWR0aCA9IDAsCiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSAwLAogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgc2xpZGVIZWlnaHQgPSAwLAogICAgICAgICAgICBzbGlkZVdpZHRoID0gMCwKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IDAsCiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IDAsCiAgICAgICAgICAgIHNsaWRlSGVscGVySGVpZ2h0ID0gMCwKICAgICAgICAgICAgY3VycmVudEh1ZSA9IDAsCiAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gMCwKICAgICAgICAgICAgY3VycmVudFZhbHVlID0gMCwKICAgICAgICAgICAgY3VycmVudEFscGhhID0gMSwKICAgICAgICAgICAgcGFsZXR0ZSA9IFtdLAogICAgICAgICAgICBwYWxldHRlQXJyYXkgPSBbXSwKICAgICAgICAgICAgcGFsZXR0ZUxvb2t1cCA9IHt9LAogICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gb3B0cy5zZWxlY3Rpb25QYWxldHRlLnNsaWNlKDApLAogICAgICAgICAgICBtYXhTZWxlY3Rpb25TaXplID0gb3B0cy5tYXhTZWxlY3Rpb25TaXplLAogICAgICAgICAgICBkcmFnZ2luZ0NsYXNzID0gInNwLWRyYWdnaW5nIiwKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CgogICAgICAgIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQsCiAgICAgICAgICAgIGJvZHkgPSBkb2MuYm9keSwKICAgICAgICAgICAgYm91bmRFbGVtZW50ID0gJChlbGVtZW50KSwKICAgICAgICAgICAgZGlzYWJsZWQgPSBmYWxzZSwKICAgICAgICAgICAgY29udGFpbmVyID0gJChtYXJrdXAsIGRvYykuYWRkQ2xhc3ModGhlbWUpLAogICAgICAgICAgICBwaWNrZXJDb250YWluZXIgPSBjb250YWluZXIuZmluZCgiLnNwLXBpY2tlci1jb250YWluZXIiKSwKICAgICAgICAgICAgZHJhZ2dlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtY29sb3IiKSwKICAgICAgICAgICAgZHJhZ0hlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3AtZHJhZ2dlciIpLAogICAgICAgICAgICBzbGlkZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWh1ZSIpLAogICAgICAgICAgICBzbGlkZUhlbHBlciA9IGNvbnRhaW5lci5maW5kKCIuc3Atc2xpZGVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIgPSBjb250YWluZXIuZmluZCgiLnNwLWFscGhhLWlubmVyIiksCiAgICAgICAgICAgIGFscGhhU2xpZGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYSIpLAogICAgICAgICAgICBhbHBoYVNsaWRlSGVscGVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1hbHBoYS1oYW5kbGUiKSwKICAgICAgICAgICAgdGV4dElucHV0ID0gY29udGFpbmVyLmZpbmQoIi5zcC1pbnB1dCIpLAogICAgICAgICAgICBwYWxldHRlQ29udGFpbmVyID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlIiksCiAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lciA9IGNvbnRhaW5lci5maW5kKCIuc3AtaW5pdGlhbCIpLAogICAgICAgICAgICBjYW5jZWxCdXR0b24gPSBjb250YWluZXIuZmluZCgiLnNwLWNhbmNlbCIpLAogICAgICAgICAgICBjbGVhckJ1dHRvbiA9IGNvbnRhaW5lci5maW5kKCIuc3AtY2xlYXIiKSwKICAgICAgICAgICAgY2hvb3NlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1jaG9vc2UiKSwKICAgICAgICAgICAgdG9nZ2xlQnV0dG9uID0gY29udGFpbmVyLmZpbmQoIi5zcC1wYWxldHRlLXRvZ2dsZSIpLAogICAgICAgICAgICBpc0lucHV0ID0gYm91bmRFbGVtZW50LmlzKCJpbnB1dCIpLAogICAgICAgICAgICBpc0lucHV0VHlwZUNvbG9yID0gaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQuYXR0cigidHlwZSIpID09PSAiY29sb3IiICYmIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpLAogICAgICAgICAgICBzaG91bGRSZXBsYWNlID0gaXNJbnB1dCAmJiAhZmxhdCwKICAgICAgICAgICAgcmVwbGFjZXIgPSAoc2hvdWxkUmVwbGFjZSkgPyAkKHJlcGxhY2VJbnB1dCkuYWRkQ2xhc3ModGhlbWUpLmFkZENsYXNzKG9wdHMuY2xhc3NOYW1lKS5hZGRDbGFzcyhvcHRzLnJlcGxhY2VyQ2xhc3NOYW1lKSA6ICQoW10pLAogICAgICAgICAgICBvZmZzZXRFbGVtZW50ID0gKHNob3VsZFJlcGxhY2UpID8gcmVwbGFjZXIgOiBib3VuZEVsZW1lbnQsCiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50ID0gcmVwbGFjZXIuZmluZCgiLnNwLXByZXZpZXctaW5uZXIiKSwKICAgICAgICAgICAgaW5pdGlhbENvbG9yID0gb3B0cy5jb2xvciB8fCAoaXNJbnB1dCAmJiBib3VuZEVsZW1lbnQudmFsKCkpLAogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGZhbHNlLAogICAgICAgICAgICBjdXJyZW50UHJlZmVycmVkRm9ybWF0ID0gb3B0cy5wcmVmZXJyZWRGb3JtYXQsCiAgICAgICAgICAgIGNsaWNrb3V0RmlyZXNDaGFuZ2UgPSAhb3B0cy5zaG93QnV0dG9ucyB8fCBvcHRzLmNsaWNrb3V0RmlyZXNDaGFuZ2UsCiAgICAgICAgICAgIGlzRW1wdHkgPSAhaW5pdGlhbENvbG9yLAogICAgICAgICAgICBhbGxvd0VtcHR5ID0gb3B0cy5hbGxvd0VtcHR5ICYmICFpc0lucHV0VHlwZUNvbG9yOwoKICAgICAgICBmdW5jdGlvbiBhcHBseU9wdGlvbnMoKSB7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZU9ubHkpIHsKICAgICAgICAgICAgICAgIG9wdHMuc2hvd1BhbGV0dGUgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwoKICAgICAgICAgICAgaWYgKG9wdHMucGFsZXR0ZSkgewogICAgICAgICAgICAgICAgcGFsZXR0ZSA9IG9wdHMucGFsZXR0ZS5zbGljZSgwKTsKICAgICAgICAgICAgICAgIHBhbGV0dGVBcnJheSA9ICQuaXNBcnJheShwYWxldHRlWzBdKSA/IHBhbGV0dGUgOiBbcGFsZXR0ZV07CiAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwID0ge307CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbGV0dGVBcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFsZXR0ZUFycmF5W2ldLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IocGFsZXR0ZUFycmF5W2ldW2pdKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlTG9va3VwW3JnYl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGFpbmVyLnRvZ2dsZUNsYXNzKCJzcC1mbGF0IiwgZmxhdCk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtaW5wdXQtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5wdXQpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWFscGhhLWVuYWJsZWQiLCBvcHRzLnNob3dBbHBoYSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtY2xlYXItZW5hYmxlZCIsIGFsbG93RW1wdHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWJ1dHRvbnMtZGlzYWJsZWQiLCAhb3B0cy5zaG93QnV0dG9ucyk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1idXR0b25zLWRpc2FibGVkIiwgIW9wdHMudG9nZ2xlUGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLXBhbGV0dGUtZGlzYWJsZWQiLCAhb3B0cy5zaG93UGFsZXR0ZSk7CiAgICAgICAgICAgIGNvbnRhaW5lci50b2dnbGVDbGFzcygic3AtcGFsZXR0ZS1vbmx5Iiwgb3B0cy5zaG93UGFsZXR0ZU9ubHkpOwogICAgICAgICAgICBjb250YWluZXIudG9nZ2xlQ2xhc3MoInNwLWluaXRpYWwtZGlzYWJsZWQiLCAhb3B0cy5zaG93SW5pdGlhbCk7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmNsYXNzTmFtZSkuYWRkQ2xhc3Mob3B0cy5jb250YWluZXJDbGFzc05hbWUpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewoKICAgICAgICAgICAgaWYgKElFKSB7CiAgICAgICAgICAgICAgICBjb250YWluZXIuZmluZCgiKjpub3QoaW5wdXQpIikuYXR0cigidW5zZWxlY3RhYmxlIiwgIm9uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwoKICAgICAgICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihyZXBsYWNlcikuaGlkZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGNsZWFyQnV0dG9uLmhpZGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5hZnRlcihjb250YWluZXIpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICB2YXIgYXBwZW5kVG8gPSBvcHRzLmFwcGVuZFRvID09PSAicGFyZW50IiA/IGJvdW5kRWxlbWVudC5wYXJlbnQoKSA6ICQob3B0cy5hcHBlbmRUbyk7CiAgICAgICAgICAgICAgICBpZiAoYXBwZW5kVG8ubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG8gPSAkKCJib2R5Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXBwZW5kVG8uYXBwZW5kKGNvbnRhaW5lcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpOwoKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC5iaW5kKCJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0b2dnbGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuaXMoImlucHV0IikpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYoYm91bmRFbGVtZW50LmlzKCI6ZGlzYWJsZWQiKSB8fCAob3B0cy5kaXNhYmxlZCA9PT0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGRpc2FibGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJldmVudCBjbGlja3MgZnJvbSBidWJibGluZyB1cCB0byBkb2N1bWVudC4gIFRoaXMgd291bGQgY2F1c2UgaXQgdG8gYmUgaGlkZGVuLgogICAgICAgICAgICBjb250YWluZXIuY2xpY2soc3RvcFByb3BhZ2F0aW9uKTsKCiAgICAgICAgICAgIC8vIEhhbmRsZSB1c2VyIHR5cGVkIGlucHV0CiAgICAgICAgICAgIHRleHRJbnB1dC5jaGFuZ2Uoc2V0RnJvbVRleHRJbnB1dCk7CiAgICAgICAgICAgIHRleHRJbnB1dC5iaW5kKCJwYXN0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc2V0RnJvbVRleHRJbnB1dCwgMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0ZXh0SW5wdXQua2V5ZG93bihmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXlDb2RlID09IDEzKSB7IHNldEZyb21UZXh0SW5wdXQoKTsgfSB9KTsKCiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi50ZXh0KG9wdHMuY2FuY2VsVGV4dCk7CiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY2xlYXJCdXR0b24uYXR0cigidGl0bGUiLCBvcHRzLmNsZWFyVGV4dCk7CiAgICAgICAgICAgIGNsZWFyQnV0dG9uLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKCiAgICAgICAgICAgICAgICBpZihmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgLy9mb3IgdGhlIGZsYXQgc3R5bGUsIHRoaXMgaXMgYSBjaGFuZ2UgZXZlbnQKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGNob29zZUJ1dHRvbi50ZXh0KG9wdHMuY2hvb3NlVGV4dCk7CiAgICAgICAgICAgIGNob29zZUJ1dHRvbi5iaW5kKCJjbGljay5zcGVjdHJ1bSIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgIGlmIChJRSAmJiB0ZXh0SW5wdXQuaXMoIjpmb2N1cyIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4dElucHV0LnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0b2dnbGVCdXR0b24udGV4dChvcHRzLnNob3dQYWxldHRlT25seSA/IG9wdHMudG9nZ2xlUGFsZXR0ZU1vcmVUZXh0IDogb3B0cy50b2dnbGVQYWxldHRlTGVzc1RleHQpOwogICAgICAgICAgICB0b2dnbGVCdXR0b24uYmluZCgiY2xpY2suc3BlY3RydW0iLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICBvcHRzLnNob3dQYWxldHRlT25seSA9ICFvcHRzLnNob3dQYWxldHRlT25seTsKCiAgICAgICAgICAgICAgICAvLyBUbyBtYWtlIHN1cmUgdGhlIFBpY2tlciBhcmVhIGlzIGRyYXduIG9uIHRoZSByaWdodCwgbmV4dCB0byB0aGUKICAgICAgICAgICAgICAgIC8vIFBhbGV0dGUgYXJlYSAoYW5kIG5vdCBiZWxvdyB0aGUgcGFsZXR0ZSksIGZpcnN0IG1vdmUgdGhlIFBhbGV0dGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBsZWZ0IHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBwaWNrZXIsIHBsdXMgNXB4IGV4dHJhLgogICAgICAgICAgICAgICAgLy8gVGhlICdhcHBseU9wdGlvbnMnIGZ1bmN0aW9uIHB1dHMgdGhlIHdob2xlIGNvbnRhaW5lciBiYWNrIGludG8gcGxhY2UKICAgICAgICAgICAgICAgIC8vIGFuZCB0YWtlcyBjYXJlIG9mIHRoZSBidXR0b24tdGV4dCBhbmQgdGhlIHNwLXBhbGV0dGUtb25seSBDU1MgY2xhc3MuCiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd1BhbGV0dGVPbmx5ICYmICFmbGF0KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygnbGVmdCcsICctPScgKyAocGlja2VyQ29udGFpbmVyLm91dGVyV2lkdGgodHJ1ZSkgKyA1KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhcHBseU9wdGlvbnMoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkcmFnZ2FibGUoYWxwaGFTbGlkZXIsIGZ1bmN0aW9uIChkcmFnWCwgZHJhZ1ksIGUpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IChkcmFnWCAvIGFscGhhV2lkdGgpOwogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSBNYXRoLnJvdW5kKGN1cnJlbnRBbHBoYSAqIDEwKSAvIDEwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgfSwgZHJhZ1N0YXJ0LCBkcmFnU3RvcCk7CgogICAgICAgICAgICBkcmFnZ2FibGUoc2xpZGVyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gcGFyc2VGbG9hdChkcmFnWSAvIHNsaWRlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghb3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGRyYWdnYWJsZShkcmFnZ2VyLCBmdW5jdGlvbiAoZHJhZ1gsIGRyYWdZLCBlKSB7CgogICAgICAgICAgICAgICAgLy8gc2hpZnQrZHJhZyBzaG91bGQgc25hcCB0aGUgbW92ZW1lbnQgdG8gZWl0aGVyIHRoZSB4IG9yIHkgYXhpcy4KICAgICAgICAgICAgICAgIGlmICghZS5zaGlmdEtleSkgewogICAgICAgICAgICAgICAgICAgIHNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1ggPSBjdXJyZW50U2F0dXJhdGlvbiAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRHJhZ1kgPSBkcmFnSGVpZ2h0IC0gKGN1cnJlbnRWYWx1ZSAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHZhciBmdXJ0aGVyRnJvbVggPSBNYXRoLmFicyhkcmFnWCAtIG9sZERyYWdYKSA+IE1hdGguYWJzKGRyYWdZIC0gb2xkRHJhZ1kpOwoKICAgICAgICAgICAgICAgICAgICBzaGlmdE1vdmVtZW50RGlyZWN0aW9uID0gZnVydGhlckZyb21YID8gIngiIDogInkiOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBzZXRTYXR1cmF0aW9uID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gIngiOwogICAgICAgICAgICAgICAgdmFyIHNldFZhbHVlID0gIXNoaWZ0TW92ZW1lbnREaXJlY3Rpb24gfHwgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9PT0gInkiOwoKICAgICAgICAgICAgICAgIGlmIChzZXRTYXR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNhdHVyYXRpb24gPSBwYXJzZUZsb2F0KGRyYWdYIC8gZHJhZ1dpZHRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZXRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHBhcnNlRmxvYXQoKGRyYWdIZWlnaHQgLSBkcmFnWSkgLyBkcmFnSGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoIW9wdHMuc2hvd0FscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudEFscGhhID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtb3ZlKCk7CgogICAgICAgICAgICB9LCBkcmFnU3RhcnQsIGRyYWdTdG9wKTsKCiAgICAgICAgICAgIGlmICghIWluaXRpYWxDb2xvcikgewogICAgICAgICAgICAgICAgc2V0KGluaXRpYWxDb2xvcik7CgogICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBjb2xvciB3YXMgYmxhY2sgLSB1cGRhdGUgdGhlIHByZXZpZXcgVUkgYW5kIHNldCB0aGUgZm9ybWF0CiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc2V0IGZ1bmN0aW9uIHdpbGwgbm90IHJ1biAoZGVmYXVsdCBjb2xvciBpcyBibGFjaykuCiAgICAgICAgICAgICAgICB1cGRhdGVVSSgpOwogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0IHx8IHRpbnljb2xvcihpbml0aWFsQ29sb3IpLmZvcm1hdDsKCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShpbml0aWFsQ29sb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXBkYXRlVUkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYXQpIHsKICAgICAgICAgICAgICAgIHNob3coKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcGFsZXR0ZUVsZW1lbnRDbGljayhlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICYmIGUuZGF0YS5pZ25vcmUpIHsKICAgICAgICAgICAgICAgICAgICBzZXQoJChlLnRhcmdldCkuY2xvc2VzdCgiLnNwLXRodW1iLWVsIikuZGF0YSgiY29sb3IiKSk7CiAgICAgICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5zcC10aHVtYi1lbCIpLmRhdGEoImNvbG9yIikpOwogICAgICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmhpZGVBZnRlclBhbGV0dGVTZWxlY3QpIHsKICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcGFsZXR0ZUV2ZW50ID0gSUUgPyAibW91c2Vkb3duLnNwZWN0cnVtIiA6ICJjbGljay5zcGVjdHJ1bSB0b3VjaHN0YXJ0LnNwZWN0cnVtIjsKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5kZWxlZ2F0ZSgiLnNwLXRodW1iLWVsIiwgcGFsZXR0ZUV2ZW50LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICAgICAgaW5pdGlhbENvbG9yQ29udGFpbmVyLmRlbGVnYXRlKCIuc3AtdGh1bWItZWw6bnRoLWNoaWxkKDEpIiwgcGFsZXR0ZUV2ZW50LCB7IGlnbm9yZTogdHJ1ZSB9LCBwYWxldHRlRWxlbWVudENsaWNrKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvblBhbGV0dGVGcm9tU3RvcmFnZSgpIHsKCiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewoKICAgICAgICAgICAgICAgIC8vIE1pZ3JhdGUgb2xkIHBhbGV0dGVzIG92ZXIgdG8gbmV3IGZvcm1hdC4gIE1heSB3YW50IHRvIHJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciBvbGRQYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCIsIyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChvbGRQYWxldHRlLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9sZFBhbGV0dGUsIGZ1bmN0aW9uKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkgeyB9CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlID0gd2luZG93LmxvY2FsU3RvcmFnZVtsb2NhbFN0b3JhZ2VLZXldLnNwbGl0KCI7Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZENvbG9yVG9TZWxlY3Rpb25QYWxldHRlKGNvbG9yKSB7CiAgICAgICAgICAgIGlmIChzaG93U2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihjb2xvcikudG9SZ2JTdHJpbmcoKTsKICAgICAgICAgICAgICAgIGlmICghcGFsZXR0ZUxvb2t1cFtyZ2JdICYmICQuaW5BcnJheShyZ2IsIHNlbGVjdGlvblBhbGV0dGUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhbGV0dGUucHVzaChyZ2IpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKHNlbGVjdGlvblBhbGV0dGUubGVuZ3RoID4gbWF4U2VsZWN0aW9uU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYWxldHRlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2VLZXkgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2VbbG9jYWxTdG9yYWdlS2V5XSA9IHNlbGVjdGlvblBhbGV0dGUuam9pbigiOyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0VW5pcXVlU2VsZWN0aW9uUGFsZXR0ZSgpIHsKICAgICAgICAgICAgdmFyIHVuaXF1ZSA9IFtdOwogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25QYWxldHRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJnYiA9IHRpbnljb2xvcihzZWxlY3Rpb25QYWxldHRlW2ldKS50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhbGV0dGVMb29rdXBbcmdiXSkgewogICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUucHVzaChzZWxlY3Rpb25QYWxldHRlW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB1bmlxdWUucmV2ZXJzZSgpLnNsaWNlKDAsIG9wdHMubWF4U2VsZWN0aW9uU2l6ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmF3UGFsZXR0ZSgpIHsKCiAgICAgICAgICAgIHZhciBjdXJyZW50Q29sb3IgPSBnZXQoKTsKCiAgICAgICAgICAgIHZhciBodG1sID0gJC5tYXAocGFsZXR0ZUFycmF5LCBmdW5jdGlvbiAocGFsZXR0ZSwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhbGV0dGVUZW1wbGF0ZShwYWxldHRlLCBjdXJyZW50Q29sb3IsICJzcC1wYWxldHRlLXJvdyBzcC1wYWxldHRlLXJvdy0iICsgaSwgb3B0cyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uUGFsZXR0ZUZyb21TdG9yYWdlKCk7CgogICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgaHRtbC5wdXNoKHBhbGV0dGVUZW1wbGF0ZShnZXRVbmlxdWVTZWxlY3Rpb25QYWxldHRlKCksIGN1cnJlbnRDb2xvciwgInNwLXBhbGV0dGUtcm93IHNwLXBhbGV0dGUtcm93LXNlbGVjdGlvbiIsIG9wdHMpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcGFsZXR0ZUNvbnRhaW5lci5odG1sKGh0bWwuam9pbigiIikpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhd0luaXRpYWwoKSB7CiAgICAgICAgICAgIGlmIChvcHRzLnNob3dJbml0aWFsKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCA9IGNvbG9yT25TaG93OwogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBnZXQoKTsKICAgICAgICAgICAgICAgIGluaXRpYWxDb2xvckNvbnRhaW5lci5odG1sKHBhbGV0dGVUZW1wbGF0ZShbaW5pdGlhbCwgY3VycmVudF0sIGN1cnJlbnQsICJzcC1wYWxldHRlLXJvdy1pbml0aWFsIiwgb3B0cykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkcmFnU3RhcnQoKSB7CiAgICAgICAgICAgIGlmIChkcmFnSGVpZ2h0IDw9IDAgfHwgZHJhZ1dpZHRoIDw9IDAgfHwgc2xpZGVIZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyhkcmFnZ2luZ0NsYXNzKTsKICAgICAgICAgICAgc2hpZnRNb3ZlbWVudERpcmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKCdkcmFnc3RhcnQuc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZHJhZ1N0b3AoKSB7CiAgICAgICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKGRyYWdnaW5nQ2xhc3MpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignZHJhZ3N0b3Auc3BlY3RydW0nLCBbIGdldCgpIF0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc2V0RnJvbVRleHRJbnB1dCgpIHsKCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRleHRJbnB1dC52YWwoKTsKCiAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICIiKSAmJiBhbGxvd0VtcHR5KSB7CiAgICAgICAgICAgICAgICBzZXQobnVsbCk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRpbnkgPSB0aW55Y29sb3IodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHRpbnkuaXNWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0KHRpbnkpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9yaWdpbmFsSW5wdXQodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0SW5wdXQuYWRkQ2xhc3MoInNwLXZhbGlkYXRpb24tZXJyb3IiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlKCkgewogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzaG93KCkgewogICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCdiZWZvcmVTaG93LnNwZWN0cnVtJyk7CgogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJvdW5kRWxlbWVudC50cmlnZ2VyKGV2ZW50LCBbIGdldCgpIF0pOwoKICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy5iZWZvcmVTaG93KGdldCgpKSA9PT0gZmFsc2UgfHwgZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGlkZUFsbCgpOwogICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKCiAgICAgICAgICAgICQoZG9jKS5iaW5kKCJrZXlkb3duLnNwZWN0cnVtIiwgb25rZXlkb3duKTsKICAgICAgICAgICAgJChkb2MpLmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykuYmluZCgicmVzaXplLnNwZWN0cnVtIiwgcmVzaXplKTsKICAgICAgICAgICAgcmVwbGFjZXIuYWRkQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBjb2xvck9uU2hvdyA9IGdldCgpOwoKICAgICAgICAgICAgZHJhd0luaXRpYWwoKTsKICAgICAgICAgICAgY2FsbGJhY2tzLnNob3coY29sb3JPblNob3cpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignc2hvdy5zcGVjdHJ1bScsIFsgY29sb3JPblNob3cgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbmtleWRvd24oZSkgewogICAgICAgICAgICAvLyBDbG9zZSBvbiBFU0MKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICAgICAgICAgIGhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2xpY2tvdXQoZSkgewogICAgICAgICAgICAvLyBSZXR1cm4gb24gcmlnaHQgY2xpY2suCiAgICAgICAgICAgIGlmIChlLmJ1dHRvbiA9PSAyKSB7IHJldHVybjsgfQoKICAgICAgICAgICAgLy8gSWYgYSBkcmFnIGV2ZW50IHdhcyBoYXBwZW5pbmcgZHVyaW5nIHRoZSBtb3VzZXVwLCBkb24ndCBoaWRlCiAgICAgICAgICAgIC8vIG9uIGNsaWNrLgogICAgICAgICAgICBpZiAoaXNEcmFnZ2luZykgeyByZXR1cm47IH0KCiAgICAgICAgICAgIGlmIChjbGlja291dEZpcmVzQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV2ZXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGlkZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaGlkZSgpIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGlmIGhpZGluZyBpcyB1bm5lY2Vzc2FyeQogICAgICAgICAgICBpZiAoIXZpc2libGUgfHwgZmxhdCkgeyByZXR1cm47IH0KICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICAgICAgJChkb2MpLnVuYmluZCgia2V5ZG93bi5zcGVjdHJ1bSIsIG9ua2V5ZG93bik7CiAgICAgICAgICAgICQoZG9jKS51bmJpbmQoImNsaWNrLnNwZWN0cnVtIiwgY2xpY2tvdXQpOwogICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKCJyZXNpemUuc3BlY3RydW0iLCByZXNpemUpOwoKICAgICAgICAgICAgcmVwbGFjZXIucmVtb3ZlQ2xhc3MoInNwLWFjdGl2ZSIpOwogICAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoInNwLWhpZGRlbiIpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLmhpZGUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignaGlkZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZXZlcnQoKSB7CiAgICAgICAgICAgIHNldChjb2xvck9uU2hvdywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXQoY29sb3IsIGlnbm9yZUZvcm1hdENoYW5nZSkgewogICAgICAgICAgICBpZiAodGlueWNvbG9yLmVxdWFscyhjb2xvciwgZ2V0KCkpKSB7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUkganVzdCBpbiBjYXNlIGEgdmFsaWRhdGlvbiBlcnJvciBuZWVkcwogICAgICAgICAgICAgICAgLy8gdG8gYmUgY2xlYXJlZC4KICAgICAgICAgICAgICAgIHVwZGF0ZVVJKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBuZXdDb2xvciwgbmV3SHN2OwogICAgICAgICAgICBpZiAoIWNvbG9yICYmIGFsbG93RW1wdHkpIHsKICAgICAgICAgICAgICAgIGlzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgbmV3Q29sb3IgPSB0aW55Y29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgbmV3SHN2ID0gbmV3Q29sb3IudG9Ic3YoKTsKCiAgICAgICAgICAgICAgICBjdXJyZW50SHVlID0gKG5ld0hzdi5oICUgMzYwKSAvIDM2MDsKICAgICAgICAgICAgICAgIGN1cnJlbnRTYXR1cmF0aW9uID0gbmV3SHN2LnM7CiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBuZXdIc3YudjsKICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYSA9IG5ld0hzdi5hOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZVVJKCk7CgogICAgICAgICAgICBpZiAobmV3Q29sb3IgJiYgbmV3Q29sb3IuaXNWYWxpZCgpICYmICFpZ25vcmVGb3JtYXRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQgPSBvcHRzLnByZWZlcnJlZEZvcm1hdCB8fCBuZXdDb2xvci5nZXRGb3JtYXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0KG9wdHMpIHsKICAgICAgICAgICAgb3B0cyA9IG9wdHMgfHwgeyB9OwoKICAgICAgICAgICAgaWYgKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHsKICAgICAgICAgICAgICAgIGg6IGN1cnJlbnRIdWUsCiAgICAgICAgICAgICAgICBzOiBjdXJyZW50U2F0dXJhdGlvbiwKICAgICAgICAgICAgICAgIHY6IGN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgIGE6IE1hdGgucm91bmQoY3VycmVudEFscGhhICogMTAwKSAvIDEwMAogICAgICAgICAgICB9LCB7IGZvcm1hdDogb3B0cy5mb3JtYXQgfHwgY3VycmVudFByZWZlcnJlZEZvcm1hdCB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGlzVmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGV4dElucHV0Lmhhc0NsYXNzKCJzcC12YWxpZGF0aW9uLWVycm9yIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlKCkgewogICAgICAgICAgICB1cGRhdGVVSSgpOwoKICAgICAgICAgICAgY2FsbGJhY2tzLm1vdmUoZ2V0KCkpOwogICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignbW92ZS5zcGVjdHJ1bScsIFsgZ2V0KCkgXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVVSSgpIHsKCiAgICAgICAgICAgIHRleHRJbnB1dC5yZW1vdmVDbGFzcygic3AtdmFsaWRhdGlvbi1lcnJvciIpOwoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICAvLyBVcGRhdGUgZHJhZ2dlciBiYWNrZ3JvdW5kIGNvbG9yIChncmFkaWVudHMgdGFrZSBjYXJlIG9mIHNhdHVyYXRpb24gYW5kIHZhbHVlKS4KICAgICAgICAgICAgdmFyIGZsYXRDb2xvciA9IHRpbnljb2xvci5mcm9tUmF0aW8oeyBoOiBjdXJyZW50SHVlLCBzOiAxLCB2OiAxIH0pOwogICAgICAgICAgICBkcmFnZ2VyLmNzcygiYmFja2dyb3VuZC1jb2xvciIsIGZsYXRDb2xvci50b0hleFN0cmluZygpKTsKCiAgICAgICAgICAgIC8vIEdldCBhIGZvcm1hdCB0aGF0IGFscGhhIHdpbGwgYmUgaW5jbHVkZWQgaW4gKGhleCBhbmQgbmFtZXMgaWdub3JlIGFscGhhKQogICAgICAgICAgICB2YXIgZm9ybWF0ID0gY3VycmVudFByZWZlcnJlZEZvcm1hdDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRBbHBoYSA8IDEgJiYgIShjdXJyZW50QWxwaGEgPT09IDAgJiYgZm9ybWF0ID09PSAibmFtZSIpKSB7CiAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaGV4IiB8fCBmb3JtYXQgPT09ICJoZXgzIiB8fCBmb3JtYXQgPT09ICJoZXg2IiB8fCBmb3JtYXQgPT09ICJuYW1lIikgewogICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJyZ2IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgcmVhbENvbG9yID0gZ2V0KHsgZm9ybWF0OiBmb3JtYXQgfSksCiAgICAgICAgICAgICAgICBkaXNwbGF5Q29sb3IgPSAnJzsKCiAgICAgICAgICAgICAvL3Jlc2V0IGJhY2tncm91bmQgaW5mbyBmb3IgcHJldmlldyBlbGVtZW50CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LnJlbW92ZUNsYXNzKCJzcC1jbGVhci1kaXNwbGF5Iik7CiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50LmNzcygnYmFja2dyb3VuZC1jb2xvcicsICd0cmFuc3BhcmVudCcpOwoKICAgICAgICAgICAgaWYgKCFyZWFsQ29sb3IgJiYgYWxsb3dFbXB0eSkgewogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZXBsYWNlZCBlbGVtZW50cyBiYWNrZ3JvdW5kIHdpdGggaWNvbiBpbmRpY2F0aW5nIG5vIGNvbG9yIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuYWRkQ2xhc3MoInNwLWNsZWFyLWRpc3BsYXkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciByZWFsSGV4ID0gcmVhbENvbG9yLnRvSGV4U3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgcmVhbFJnYiA9IHJlYWxDb2xvci50b1JnYlN0cmluZygpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVwbGFjZWQgZWxlbWVudHMgYmFja2dyb3VuZCBjb2xvciAod2l0aCBhY3R1YWwgc2VsZWN0ZWQgY29sb3IpCiAgICAgICAgICAgICAgICBpZiAocmdiYVN1cHBvcnQgfHwgcmVhbENvbG9yLmFscGhhID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlld0VsZW1lbnQuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiwgcmVhbFJnYik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImJhY2tncm91bmQtY29sb3IiLCAidHJhbnNwYXJlbnQiKTsKICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RWxlbWVudC5jc3MoImZpbHRlciIsIHJlYWxDb2xvci50b0ZpbHRlcigpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAob3B0cy5zaG93QWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmdiID0gcmVhbENvbG9yLnRvUmdiKCk7CiAgICAgICAgICAgICAgICAgICAgcmdiLmEgPSAwOwogICAgICAgICAgICAgICAgICAgIHZhciByZWFsQWxwaGEgPSB0aW55Y29sb3IocmdiKS50b1JnYlN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHZhciBncmFkaWVudCA9ICJsaW5lYXItZ3JhZGllbnQobGVmdCwgIiArIHJlYWxBbHBoYSArICIsICIgKyByZWFsSGV4ICsgIikiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoSUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImZpbHRlciIsIHRpbnljb2xvcihyZWFsQWxwaGEpLnRvRmlsdGVyKHsgZ3JhZGllbnRUeXBlOiAxIH0sIHJlYWxIZXgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwgIi13ZWJraXQtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTbGlkZXJJbm5lci5jc3MoImJhY2tncm91bmQiLCAiLW1vei0iICsgZ3JhZGllbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNsaWRlcklubmVyLmNzcygiYmFja2dyb3VuZCIsICItbXMtIiArIGdyYWRpZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnJlbnQgc3ludGF4IGdyYWRpZW50IG9uIHVucHJlZml4ZWQgcHJvcGVydHkuCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2xpZGVySW5uZXIuY3NzKCJiYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICIgKyByZWFsQWxwaGEgKyAiLCAiICsgcmVhbEhleCArICIpIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IHJlYWxDb2xvci50b1N0cmluZyhmb3JtYXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRleHQgZW50cnkgaW5wdXQgYXMgaXQgY2hhbmdlcyBoYXBwZW4KICAgICAgICAgICAgaWYgKG9wdHMuc2hvd0lucHV0KSB7CiAgICAgICAgICAgICAgICB0ZXh0SW5wdXQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvcHRzLnNob3dQYWxldHRlKSB7CiAgICAgICAgICAgICAgICBkcmF3UGFsZXR0ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkcmF3SW5pdGlhbCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlSGVscGVyTG9jYXRpb25zKCkgewogICAgICAgICAgICB2YXIgcyA9IGN1cnJlbnRTYXR1cmF0aW9uOwogICAgICAgICAgICB2YXIgdiA9IGN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgIGlmKGFsbG93RW1wdHkgJiYgaXNFbXB0eSkgewogICAgICAgICAgICAgICAgLy9pZiBzZWxlY3RlZCBjb2xvciBpcyBlbXB0eSwgaGlkZSB0aGUgaGVscGVycwogICAgICAgICAgICAgICAgYWxwaGFTbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBzbGlkZUhlbHBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICBkcmFnSGVscGVyLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIGhlbHBlcnMgYXJlIHZpc2libGUKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuc2hvdygpOwogICAgICAgICAgICAgICAgZHJhZ0hlbHBlci5zaG93KCk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgbGl0dGxlIGNpcmNsZSBpbiB0aGF0IGRpc3BsYXlzIHlvdXIgY3VycmVudCBzZWxlY3RlZCBjb2xvcgogICAgICAgICAgICAgICAgdmFyIGRyYWdYID0gcyAqIGRyYWdXaWR0aDsKICAgICAgICAgICAgICAgIHZhciBkcmFnWSA9IGRyYWdIZWlnaHQgLSAodiAqIGRyYWdIZWlnaHQpOwogICAgICAgICAgICAgICAgZHJhZ1ggPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnV2lkdGggLSBkcmFnSGVscGVySGVpZ2h0LCBkcmFnWCAtIGRyYWdIZWxwZXJIZWlnaHQpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZHJhZ1kgPSBNYXRoLm1heCgKICAgICAgICAgICAgICAgICAgICAtZHJhZ0hlbHBlckhlaWdodCwKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihkcmFnSGVpZ2h0IC0gZHJhZ0hlbHBlckhlaWdodCwgZHJhZ1kgLSBkcmFnSGVscGVySGVpZ2h0KQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGRyYWdIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogZHJhZ1kgKyAicHgiLAogICAgICAgICAgICAgICAgICAgICJsZWZ0IjogZHJhZ1ggKyAicHgiCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgYWxwaGFYID0gY3VycmVudEFscGhhICogYWxwaGFXaWR0aDsKICAgICAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAibGVmdCI6IChhbHBoYVggLSAoYWxwaGFTbGlkZUhlbHBlcldpZHRoIC8gMikpICsgInB4IgogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gV2hlcmUgdG8gc2hvdyB0aGUgYmFyIHRoYXQgZGlzcGxheXMgeW91ciBjdXJyZW50IHNlbGVjdGVkIGh1ZQogICAgICAgICAgICAgICAgdmFyIHNsaWRlWSA9IChjdXJyZW50SHVlKSAqIHNsaWRlSGVpZ2h0OwogICAgICAgICAgICAgICAgc2xpZGVIZWxwZXIuY3NzKHsKICAgICAgICAgICAgICAgICAgICAidG9wIjogKHNsaWRlWSAtIHNsaWRlSGVscGVySGVpZ2h0KSArICJweCIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB1cGRhdGVPcmlnaW5hbElucHV0KGZpcmVDYWxsYmFjaykgewogICAgICAgICAgICB2YXIgY29sb3IgPSBnZXQoKSwKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9ICcnLAogICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9ICF0aW55Y29sb3IuZXF1YWxzKGNvbG9yLCBjb2xvck9uU2hvdyk7CgogICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgIGRpc3BsYXlDb2xvciA9IGNvbG9yLnRvU3RyaW5nKGN1cnJlbnRQcmVmZXJyZWRGb3JtYXQpOwogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3Rpb24gcGFsZXR0ZSB3aXRoIHRoZSBjdXJyZW50IGNvbG9yCiAgICAgICAgICAgICAgICBhZGRDb2xvclRvU2VsZWN0aW9uUGFsZXR0ZShjb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc0lucHV0KSB7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudmFsKGRpc3BsYXlDb2xvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaXJlQ2FsbGJhY2sgJiYgaGFzQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2tzLmNoYW5nZShjb2xvcik7CiAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJywgWyBjb2xvciBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVmbG93KCkgewogICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gQ2FsY3VsYXRpb25zIHdvdWxkIGJlIHVzZWxlc3MgYW5kIHdvdWxkbid0IGJlIHJlbGlhYmxlIGFueXdheXMKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnV2lkdGggPSBkcmFnZ2VyLndpZHRoKCk7CiAgICAgICAgICAgIGRyYWdIZWlnaHQgPSBkcmFnZ2VyLmhlaWdodCgpOwogICAgICAgICAgICBkcmFnSGVscGVySGVpZ2h0ID0gZHJhZ0hlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVXaWR0aCA9IHNsaWRlci53aWR0aCgpOwogICAgICAgICAgICBzbGlkZUhlaWdodCA9IHNsaWRlci5oZWlnaHQoKTsKICAgICAgICAgICAgc2xpZGVIZWxwZXJIZWlnaHQgPSBzbGlkZUhlbHBlci5oZWlnaHQoKTsKICAgICAgICAgICAgYWxwaGFXaWR0aCA9IGFscGhhU2xpZGVyLndpZHRoKCk7CiAgICAgICAgICAgIGFscGhhU2xpZGVIZWxwZXJXaWR0aCA9IGFscGhhU2xpZGVIZWxwZXIud2lkdGgoKTsKCiAgICAgICAgICAgIGlmICghZmxhdCkgewogICAgICAgICAgICAgICAgY29udGFpbmVyLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKTsKICAgICAgICAgICAgICAgIGlmIChvcHRzLm9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vZmZzZXQob3B0cy5vZmZzZXQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXIub2Zmc2V0KGdldE9mZnNldChjb250YWluZXIsIG9mZnNldEVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlSGVscGVyTG9jYXRpb25zKCk7CgogICAgICAgICAgICBpZiAob3B0cy5zaG93UGFsZXR0ZSkgewogICAgICAgICAgICAgICAgZHJhd1BhbGV0dGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYm91bmRFbGVtZW50LnRyaWdnZXIoJ3JlZmxvdy5zcGVjdHJ1bScpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHsKICAgICAgICAgICAgYm91bmRFbGVtZW50LnNob3coKTsKICAgICAgICAgICAgb2Zmc2V0RWxlbWVudC51bmJpbmQoImNsaWNrLnNwZWN0cnVtIHRvdWNoc3RhcnQuc3BlY3RydW0iKTsKICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgICAgICAgICByZXBsYWNlci5yZW1vdmUoKTsKICAgICAgICAgICAgc3BlY3RydW1zW3NwZWN0LmlkXSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvcHRpb24ob3B0aW9uTmFtZSwgb3B0aW9uVmFsdWUpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBvcHRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9wdHNbb3B0aW9uTmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG9wdHNbb3B0aW9uTmFtZV0gPSBvcHRpb25WYWx1ZTsKCiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lID09PSAicHJlZmVycmVkRm9ybWF0IikgewogICAgICAgICAgICAgICAgY3VycmVudFByZWZlcnJlZEZvcm1hdCA9IG9wdHMucHJlZmVycmVkRm9ybWF0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGx5T3B0aW9ucygpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZW5hYmxlKCkgewogICAgICAgICAgICBkaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBib3VuZEVsZW1lbnQuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQucmVtb3ZlQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkaXNhYmxlKCkgewogICAgICAgICAgICBoaWRlKCk7CiAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgYm91bmRFbGVtZW50LmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgIG9mZnNldEVsZW1lbnQuYWRkQ2xhc3MoInNwLWRpc2FibGVkIik7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRPZmZzZXQoY29vcmQpIHsKICAgICAgICAgICAgb3B0cy5vZmZzZXQgPSBjb29yZDsKICAgICAgICAgICAgcmVmbG93KCk7CiAgICAgICAgfQoKICAgICAgICBpbml0aWFsaXplKCk7CgogICAgICAgIHZhciBzcGVjdCA9IHsKICAgICAgICAgICAgc2hvdzogc2hvdywKICAgICAgICAgICAgaGlkZTogaGlkZSwKICAgICAgICAgICAgdG9nZ2xlOiB0b2dnbGUsCiAgICAgICAgICAgIHJlZmxvdzogcmVmbG93LAogICAgICAgICAgICBvcHRpb246IG9wdGlvbiwKICAgICAgICAgICAgZW5hYmxlOiBlbmFibGUsCiAgICAgICAgICAgIGRpc2FibGU6IGRpc2FibGUsCiAgICAgICAgICAgIG9mZnNldDogc2V0T2Zmc2V0LAogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICBzZXQoYyk7CiAgICAgICAgICAgICAgICB1cGRhdGVPcmlnaW5hbElucHV0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldDogZ2V0LAogICAgICAgICAgICBkZXN0cm95OiBkZXN0cm95LAogICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcgogICAgICAgIH07CgogICAgICAgIHNwZWN0LmlkID0gc3BlY3RydW1zLnB1c2goc3BlY3QpIC0gMTsKCiAgICAgICAgcmV0dXJuIHNwZWN0OwogICAgfQoKICAgIC8qKgogICAgKiBjaGVja09mZnNldCAtIGdldCB0aGUgb2Zmc2V0IGJlbG93L2Fib3ZlIGFuZCBsZWZ0L3JpZ2h0IGVsZW1lbnQgZGVwZW5kaW5nIG9uIHNjcmVlbiBwb3NpdGlvbgogICAgKiBUaGFua3MgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi9tYXN0ZXIvdWkvanF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMKICAgICovCiAgICBmdW5jdGlvbiBnZXRPZmZzZXQocGlja2VyLCBpbnB1dCkgewogICAgICAgIHZhciBleHRyYVkgPSAwOwogICAgICAgIHZhciBkcFdpZHRoID0gcGlja2VyLm91dGVyV2lkdGgoKTsKICAgICAgICB2YXIgZHBIZWlnaHQgPSBwaWNrZXIub3V0ZXJIZWlnaHQoKTsKICAgICAgICB2YXIgaW5wdXRIZWlnaHQgPSBpbnB1dC5vdXRlckhlaWdodCgpOwogICAgICAgIHZhciBkb2MgPSBwaWNrZXJbMF0ub3duZXJEb2N1bWVudDsKICAgICAgICB2YXIgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgdmFyIHZpZXdXaWR0aCA9IGRvY0VsZW0uY2xpZW50V2lkdGggKyAkKGRvYykuc2Nyb2xsTGVmdCgpOwogICAgICAgIHZhciB2aWV3SGVpZ2h0ID0gZG9jRWxlbS5jbGllbnRIZWlnaHQgKyAkKGRvYykuc2Nyb2xsVG9wKCk7CiAgICAgICAgdmFyIG9mZnNldCA9IGlucHV0Lm9mZnNldCgpOwogICAgICAgIG9mZnNldC50b3AgKz0gaW5wdXRIZWlnaHQ7CgogICAgICAgIG9mZnNldC5sZWZ0IC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC5sZWZ0LCAob2Zmc2V0LmxlZnQgKyBkcFdpZHRoID4gdmlld1dpZHRoICYmIHZpZXdXaWR0aCA+IGRwV2lkdGgpID8KICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0LmxlZnQgKyBkcFdpZHRoIC0gdmlld1dpZHRoKSA6IDApOwoKICAgICAgICBvZmZzZXQudG9wIC09CiAgICAgICAgICAgIE1hdGgubWluKG9mZnNldC50b3AsICgob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KICAgICAgICAgICAgTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCAtIGV4dHJhWSkgOiBleHRyYVkpKTsKCiAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgIH0KCiAgICAvKioKICAgICogbm9vcCAtIGRvIG5vdGhpbmcKICAgICovCiAgICBmdW5jdGlvbiBub29wKCkgewoKICAgIH0KCiAgICAvKioKICAgICogc3RvcFByb3BhZ2F0aW9uIC0gbWFrZXMgdGhlIGNvZGUgb25seSBkb2luZyB0aGlzIGEgbGl0dGxlIGVhc2llciB0byByZWFkIGluIGxpbmUKICAgICovCiAgICBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgLyoqCiAgICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0CiAgICAqIFRoYW5rcyB0byB1bmRlcnNjb3JlLmpzCiAgICAqLwogICAgZnVuY3Rpb24gYmluZChmdW5jLCBvYmopIHsKICAgICAgICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgKiBMaWdodHdlaWdodCBkcmFnIGhlbHBlci4gIEhhbmRsZXMgY29udGFpbm1lbnQgd2l0aGluIHRoZSBlbGVtZW50LCBzbyB0aGF0CiAgICAqIHdoZW4gZHJhZ2dpbmcsIHRoZSB4IGlzIHdpdGhpbiBbMCxlbGVtZW50LndpZHRoXSBhbmQgeSBpcyB3aXRoaW4gWzAsZWxlbWVudC5oZWlnaHRdCiAgICAqLwogICAgZnVuY3Rpb24gZHJhZ2dhYmxlKGVsZW1lbnQsIG9ubW92ZSwgb25zdGFydCwgb25zdG9wKSB7CiAgICAgICAgb25tb3ZlID0gb25tb3ZlIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICBvbnN0YXJ0ID0gb25zdGFydCB8fCBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgb25zdG9wID0gb25zdG9wIHx8IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQ7CiAgICAgICAgdmFyIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgdmFyIG9mZnNldCA9IHt9OwogICAgICAgIHZhciBtYXhIZWlnaHQgPSAwOwogICAgICAgIHZhciBtYXhXaWR0aCA9IDA7CiAgICAgICAgdmFyIGhhc1RvdWNoID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7CgogICAgICAgIHZhciBkdXJpbmdEcmFnRXZlbnRzID0ge307CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sic2VsZWN0c3RhcnQiXSA9IHByZXZlbnQ7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1siZHJhZ3N0YXJ0Il0gPSBwcmV2ZW50OwogICAgICAgIGR1cmluZ0RyYWdFdmVudHNbInRvdWNobW92ZSBtb3VzZW1vdmUiXSA9IG1vdmU7CiAgICAgICAgZHVyaW5nRHJhZ0V2ZW50c1sidG91Y2hlbmQgbW91c2V1cCJdID0gc3RvcDsKCiAgICAgICAgZnVuY3Rpb24gcHJldmVudChlKSB7CiAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdmUoZSkgewogICAgICAgICAgICBpZiAoZHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgIC8vIE1vdXNldXAgaGFwcGVuZWQgb3V0c2lkZSBvZiB3aW5kb3cKICAgICAgICAgICAgICAgIGlmIChJRSAmJiBkb2MuZG9jdW1lbnRNb2RlIDwgOSAmJiAhZS5idXR0b24pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0MCA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcyAmJiBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXTsKICAgICAgICAgICAgICAgIHZhciBwYWdlWCA9IHQwICYmIHQwLnBhZ2VYIHx8IGUucGFnZVg7CiAgICAgICAgICAgICAgICB2YXIgcGFnZVkgPSB0MCAmJiB0MC5wYWdlWSB8fCBlLnBhZ2VZOwoKICAgICAgICAgICAgICAgIHZhciBkcmFnWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VYIC0gb2Zmc2V0LmxlZnQsIG1heFdpZHRoKSk7CiAgICAgICAgICAgICAgICB2YXIgZHJhZ1kgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIG9mZnNldC50b3AsIG1heEhlaWdodCkpOwoKICAgICAgICAgICAgICAgIGlmIChoYXNUb3VjaCkgewogICAgICAgICAgICAgICAgICAgIC8vIFN0b3Agc2Nyb2xsaW5nIGluIGlPUwogICAgICAgICAgICAgICAgICAgIHByZXZlbnQoZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgb25tb3ZlLmFwcGx5KGVsZW1lbnQsIFtkcmFnWCwgZHJhZ1ksIGVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RhcnQoZSkgewogICAgICAgICAgICB2YXIgcmlnaHRjbGljayA9IChlLndoaWNoKSA/IChlLndoaWNoID09IDMpIDogKGUuYnV0dG9uID09IDIpOwoKICAgICAgICAgICAgaWYgKCFyaWdodGNsaWNrICYmICFkcmFnZ2luZykgewogICAgICAgICAgICAgICAgaWYgKG9uc3RhcnQuYXBwbHkoZWxlbWVudCwgYXJndW1lbnRzKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBkcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gJChlbGVtZW50KS5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9ICQoZWxlbWVudCkud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAkKGVsZW1lbnQpLm9mZnNldCgpOwoKICAgICAgICAgICAgICAgICAgICAkKGRvYykuYmluZChkdXJpbmdEcmFnRXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICAkKGRvYy5ib2R5KS5hZGRDbGFzcygic3AtZHJhZ2dpbmciKTsKCiAgICAgICAgICAgICAgICAgICAgbW92ZShlKTsKCiAgICAgICAgICAgICAgICAgICAgcHJldmVudChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAkKGRvYykudW5iaW5kKGR1cmluZ0RyYWdFdmVudHMpOwogICAgICAgICAgICAgICAgJChkb2MuYm9keSkucmVtb3ZlQ2xhc3MoInNwLWRyYWdnaW5nIik7CgogICAgICAgICAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIG5vdGlmeWluZyBvYnNlcnZlcnMgdG8gYWxsb3cgdGhlIGNsaWNrIGV2ZW50CiAgICAgICAgICAgICAgICAvLyB0byBmaXJlIGluIENocm9tZS4KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgb25zdG9wLmFwcGx5KGVsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmFnZ2luZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJChlbGVtZW50KS5iaW5kKCJ0b3VjaHN0YXJ0IG1vdXNlZG93biIsIHN0YXJ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBkZWJvdW5jZSkgewogICAgICAgIHZhciB0aW1lb3V0OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgdmFyIHRocm90dGxlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGRlYm91bmNlKSBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgICAgIGlmIChkZWJvdW5jZSB8fCAhdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQodGhyb3R0bGVyLCB3YWl0KTsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICByZXR1cm4gJC5mbi5zcGVjdHJ1bS5pbnB1dFR5cGVDb2xvclN1cHBvcnQoKTsKICAgIH0KCiAgICAvKioKICAgICogRGVmaW5lIGEgalF1ZXJ5IHBsdWdpbgogICAgKi8KICAgIHZhciBkYXRhSUQgPSAic3BlY3RydW0uaWQiOwogICAgJC5mbi5zcGVjdHJ1bSA9IGZ1bmN0aW9uIChvcHRzLCBleHRyYSkgewoKICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT0gInN0cmluZyIpIHsKCiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApOwoKICAgICAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBzcGVjdCA9IHNwZWN0cnVtc1skKHRoaXMpLmRhdGEoZGF0YUlEKV07CiAgICAgICAgICAgICAgICBpZiAoc3BlY3QpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gc3BlY3Rbb3B0c107CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCAiU3BlY3RydW06IG5vIHN1Y2ggbWV0aG9kOiAnIiArIG9wdHMgKyAiJyIgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzID09ICJnZXQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gc3BlY3QuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gImNvbnRhaW5lciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5jb250YWluZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMgPT0gIm9wdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzcGVjdC5vcHRpb24uYXBwbHkoc3BlY3QsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRzID09ICJkZXN0cm95IikgewogICAgICAgICAgICAgICAgICAgICAgICBzcGVjdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlRGF0YShkYXRhSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHNwZWN0LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGEgbmV3IGluc3RhbmNlIG9mIHNwZWN0cnVtCiAgICAgICAgcmV0dXJuIHRoaXMuc3BlY3RydW0oImRlc3Ryb3kiKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgb3B0cywgJCh0aGlzKS5kYXRhKCkpOwogICAgICAgICAgICB2YXIgc3BlY3QgPSBzcGVjdHJ1bSh0aGlzLCBvcHRpb25zKTsKICAgICAgICAgICAgJCh0aGlzKS5kYXRhKGRhdGFJRCwgc3BlY3QuaWQpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLnNwZWN0cnVtLmxvYWQgPSB0cnVlOwogICAgJC5mbi5zcGVjdHJ1bS5sb2FkT3B0cyA9IHt9OwogICAgJC5mbi5zcGVjdHJ1bS5kcmFnZ2FibGUgPSBkcmFnZ2FibGU7CiAgICAkLmZuLnNwZWN0cnVtLmRlZmF1bHRzID0gZGVmYXVsdE9wdHM7CiAgICAkLmZuLnNwZWN0cnVtLmlucHV0VHlwZUNvbG9yU3VwcG9ydCA9IGZ1bmN0aW9uIGlucHV0VHlwZUNvbG9yU3VwcG9ydCgpIHsKICAgICAgICBpZiAodHlwZW9mIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB2YXIgY29sb3JJbnB1dCA9ICQoIjxpbnB1dCB0eXBlPSdjb2xvcicvPiIpWzBdOyAvLyBpZiBjb2xvciBlbGVtZW50IGlzIHN1cHBvcnRlZCwgdmFsdWUgd2lsbCBkZWZhdWx0IHRvIG5vdCBudWxsCiAgICAgICAgICAgIGlucHV0VHlwZUNvbG9yU3VwcG9ydC5fY2FjaGVkUmVzdWx0ID0gY29sb3JJbnB1dC50eXBlID09PSAiY29sb3IiICYmIGNvbG9ySW5wdXQudmFsdWUgIT09ICIiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5wdXRUeXBlQ29sb3JTdXBwb3J0Ll9jYWNoZWRSZXN1bHQ7CiAgICB9OwoKICAgICQuc3BlY3RydW0gPSB7IH07CiAgICAkLnNwZWN0cnVtLmxvY2FsaXphdGlvbiA9IHsgfTsKICAgICQuc3BlY3RydW0ucGFsZXR0ZXMgPSB7IH07CgogICAgJC5mbi5zcGVjdHJ1bS5wcm9jZXNzTmF0aXZlQ29sb3JJbnB1dHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNvbG9ySW5wdXRzID0gJCgiaW5wdXRbdHlwZT1jb2xvcl0iKTsKICAgICAgICBpZiAoY29sb3JJbnB1dHMubGVuZ3RoICYmICFpbnB1dFR5cGVDb2xvclN1cHBvcnQoKSkgewogICAgICAgICAgICBjb2xvcklucHV0cy5zcGVjdHJ1bSh7CiAgICAgICAgICAgICAgICBwcmVmZXJyZWRGb3JtYXQ6ICJoZXg2IgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIFRpbnlDb2xvciB2MS4xLjIKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZ3JpbnMvVGlueUNvbG9yCiAgICAvLyBCcmlhbiBHcmluc3RlYWQsIE1JVCBMaWNlbnNlCgogICAgKGZ1bmN0aW9uKCkgewoKICAgIHZhciB0cmltTGVmdCA9IC9eW1xzLCNdKy8sCiAgICAgICAgdHJpbVJpZ2h0ID0gL1xzKyQvLAogICAgICAgIHRpbnlDb3VudGVyID0gMCwKICAgICAgICBtYXRoID0gTWF0aCwKICAgICAgICBtYXRoUm91bmQgPSBtYXRoLnJvdW5kLAogICAgICAgIG1hdGhNaW4gPSBtYXRoLm1pbiwKICAgICAgICBtYXRoTWF4ID0gbWF0aC5tYXgsCiAgICAgICAgbWF0aFJhbmRvbSA9IG1hdGgucmFuZG9tOwoKICAgIHZhciB0aW55Y29sb3IgPSBmdW5jdGlvbihjb2xvciwgb3B0cykgewoKICAgICAgICBjb2xvciA9IChjb2xvcikgPyBjb2xvciA6ICcnOwogICAgICAgIG9wdHMgPSBvcHRzIHx8IHsgfTsKCiAgICAgICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZgogICAgICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikgewogICAgICAgICAgIHJldHVybiBjb2xvcjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBjYWxsIHVzaW5nIG5ldyBpbnN0ZWFkCiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRpbnljb2xvcikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJnYiA9IGlucHV0VG9SR0IoY29sb3IpOwogICAgICAgIHRoaXMuX29yaWdpbmFsSW5wdXQgPSBjb2xvciwKICAgICAgICB0aGlzLl9yID0gcmdiLnIsCiAgICAgICAgdGhpcy5fZyA9IHJnYi5nLAogICAgICAgIHRoaXMuX2IgPSByZ2IuYiwKICAgICAgICB0aGlzLl9hID0gcmdiLmEsCiAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMCwKICAgICAgICB0aGlzLl9mb3JtYXQgPSBvcHRzLmZvcm1hdCB8fCByZ2IuZm9ybWF0OwogICAgICAgIHRoaXMuX2dyYWRpZW50VHlwZSA9IG9wdHMuZ3JhZGllbnRUeXBlOwoKICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJhbmdlIG9mIFswLDI1NV0gY29tZSBiYWNrIGluIFswLDFdLgogICAgICAgIC8vIFBvdGVudGlhbGx5IGxvc2UgYSBsaXR0bGUgYml0IG9mIHByZWNpc2lvbiBoZXJlLCBidXQgd2lsbCBmaXggaXNzdWVzIHdoZXJlCiAgICAgICAgLy8gLjUgZ2V0cyBpbnRlcnByZXRlZCBhcyBoYWxmIG9mIHRoZSB0b3RhbCwgaW5zdGVhZCBvZiBoYWxmIG9mIDEKICAgICAgICAvLyBJZiBpdCB3YXMgc3VwcG9zZWQgdG8gYmUgMTI4LCB0aGlzIHdhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgYGlucHV0VG9SZ2JgCiAgICAgICAgaWYgKHRoaXMuX3IgPCAxKSB7IHRoaXMuX3IgPSBtYXRoUm91bmQodGhpcy5fcik7IH0KICAgICAgICBpZiAodGhpcy5fZyA8IDEpIHsgdGhpcy5fZyA9IG1hdGhSb3VuZCh0aGlzLl9nKTsgfQogICAgICAgIGlmICh0aGlzLl9iIDwgMSkgeyB0aGlzLl9iID0gbWF0aFJvdW5kKHRoaXMuX2IpOyB9CgogICAgICAgIHRoaXMuX29rID0gcmdiLm9rOwogICAgICAgIHRoaXMuX3RjX2lkID0gdGlueUNvdW50ZXIrKzsKICAgIH07CgogICAgdGlueWNvbG9yLnByb3RvdHlwZSA9IHsKICAgICAgICBpc0Rhcms6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCcmlnaHRuZXNzKCkgPCAxMjg7CiAgICAgICAgfSwKICAgICAgICBpc0xpZ2h0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpOwogICAgICAgIH0sCiAgICAgICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vazsKICAgICAgICB9LAogICAgICAgIGdldE9yaWdpbmFsSW5wdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXQ7CiAgICAgICAgfSwKICAgICAgICBnZXRGb3JtYXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0OwogICAgICAgIH0sCiAgICAgICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYTsKICAgICAgICB9LAogICAgICAgIGdldEJyaWdodG5lc3M6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpOwogICAgICAgICAgICByZXR1cm4gKHJnYi5yICogMjk5ICsgcmdiLmcgKiA1ODcgKyByZ2IuYiAqIDExNCkgLyAxMDAwOwogICAgICAgIH0sCiAgICAgICAgc2V0QWxwaGE6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2EgPSBib3VuZEFscGhhKHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICB0b0hzdjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgcmV0dXJuIHsgaDogaHN2LmggKiAzNjAsIHM6IGhzdi5zLCB2OiBoc3YudiwgYTogdGhpcy5fYSB9OwogICAgICAgIH0sCiAgICAgICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7CiAgICAgICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzdi5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc3YucyAqIDEwMCksIHYgPSBtYXRoUm91bmQoaHN2LnYgKiAxMDApOwogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJoc3YoIiAgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIHYgKyAiJSkiIDoKICAgICAgICAgICAgICAiaHN2YSgiICsgaCArICIsICIgKyBzICsgIiUsICIgKyB2ICsgIiUsICIrIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvSHNsOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpOwogICAgICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTsKICAgICAgICAgICAgdmFyIGggPSBtYXRoUm91bmQoaHNsLmggKiAzNjApLCBzID0gbWF0aFJvdW5kKGhzbC5zICogMTAwKSwgbCA9IG1hdGhSb3VuZChoc2wubCAqIDEwMCk7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/CiAgICAgICAgICAgICAgImhzbCgiICArIGggKyAiLCAiICsgcyArICIlLCAiICsgbCArICIlKSIgOgogICAgICAgICAgICAgICJoc2xhKCIgKyBoICsgIiwgIiArIHMgKyAiJSwgIiArIGwgKyAiJSwgIisgdGhpcy5fcm91bmRBICsgIikiOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIGFsbG93M0NoYXIpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXgoYWxsb3czQ2hhcik7CiAgICAgICAgfSwKICAgICAgICB0b0hleDg6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmdiYVRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIHRoaXMuX2EpOwogICAgICAgIH0sCiAgICAgICAgdG9IZXg4U3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXg4KCk7CiAgICAgICAgfSwKICAgICAgICB0b1JnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGhSb3VuZCh0aGlzLl9yKSwgZzogbWF0aFJvdW5kKHRoaXMuX2cpLCBiOiBtYXRoUm91bmQodGhpcy5fYiksIGE6IHRoaXMuX2EgfTsKICAgICAgICB9LAogICAgICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID8KICAgICAgICAgICAgICAicmdiKCIgICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9nKSArICIsICIgKyBtYXRoUm91bmQodGhpcy5fYikgKyAiKSIgOgogICAgICAgICAgICAgICJyZ2JhKCIgKyBtYXRoUm91bmQodGhpcy5fcikgKyAiLCAiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgIiwgIiArIG1hdGhSb3VuZCh0aGlzLl9iKSArICIsICIgKyB0aGlzLl9yb3VuZEEgKyAiKSI7CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlIiwgZzogbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSIsIGI6IG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUiLCBhOiB0aGlzLl9hIH07CiAgICAgICAgfSwKICAgICAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgPwogICAgICAgICAgICAgICJyZ2IoIiAgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fZywgMjU1KSAqIDEwMCkgKyAiJSwgIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgIiUpIiA6CiAgICAgICAgICAgICAgInJnYmEoIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgIiUsICIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArICIlLCAiICsgbWF0aFJvdW5kKGJvdW5kMDEodGhpcy5fYiwgMjU1KSAqIDEwMCkgKyAiJSwgIiArIHRoaXMuX3JvdW5kQSArICIpIjsKICAgICAgICB9LAogICAgICAgIHRvTmFtZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zcGFyZW50IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRoaXMuX2EgPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBoZXhOYW1lc1tyZ2JUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0cnVlKV0gfHwgZmFsc2U7CiAgICAgICAgfSwKICAgICAgICB0b0ZpbHRlcjogZnVuY3Rpb24oc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgdmFyIGhleDhTdHJpbmcgPSAnIycgKyByZ2JhVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdGhpcy5fYSk7CiAgICAgICAgICAgIHZhciBzZWNvbmRIZXg4U3RyaW5nID0gaGV4OFN0cmluZzsKICAgICAgICAgICAgdmFyIGdyYWRpZW50VHlwZSA9IHRoaXMuX2dyYWRpZW50VHlwZSA/ICJHcmFkaWVudFR5cGUgPSAxLCAiIDogIiI7CgogICAgICAgICAgICBpZiAoc2Vjb25kQ29sb3IpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gdGlueWNvbG9yKHNlY29uZENvbG9yKTsKICAgICAgICAgICAgICAgIHNlY29uZEhleDhTdHJpbmcgPSBzLnRvSGV4OFN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCgiK2dyYWRpZW50VHlwZSsic3RhcnRDb2xvcnN0cj0iK2hleDhTdHJpbmcrIixlbmRDb2xvcnN0cj0iK3NlY29uZEhleDhTdHJpbmcrIikiOwogICAgICAgIH0sCiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGZvcm1hdCkgewogICAgICAgICAgICB2YXIgZm9ybWF0U2V0ID0gISFmb3JtYXQ7CiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCB0aGlzLl9mb3JtYXQ7CgogICAgICAgICAgICB2YXIgZm9ybWF0dGVkU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBoYXNBbHBoYSA9IHRoaXMuX2EgPCAxICYmIHRoaXMuX2EgPj0gMDsKICAgICAgICAgICAgdmFyIG5lZWRzQWxwaGFGb3JtYXQgPSAhZm9ybWF0U2V0ICYmIGhhc0FscGhhICYmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiIHx8IGZvcm1hdCA9PT0gImhleDMiIHx8IGZvcm1hdCA9PT0gIm5hbWUiKTsKCiAgICAgICAgICAgIGlmIChuZWVkc0FscGhhRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yICJ0cmFuc3BhcmVudCIsIGFsbCBvdGhlciBub24tYWxwaGEgZm9ybWF0cwogICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gcmdiYSB3aGVuIHRoZXJlIGlzIHRyYW5zcGFyZW5jeS4KICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJuYW1lIiAmJiB0aGlzLl9hID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1JnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJyZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gInByZ2IiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUGVyY2VudGFnZVJnYlN0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXgiIHx8IGZvcm1hdCA9PT0gImhleDYiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhleDMiKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICJoZXg4IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hleDhTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAibmFtZSIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9OYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gImhzbCIpIHsKICAgICAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic2xTdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAiaHN2IikgewogICAgICAgICAgICAgICAgZm9ybWF0dGVkU3RyaW5nID0gdGhpcy50b0hzdlN0cmluZygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTsKICAgICAgICB9LAoKICAgICAgICBfYXBwbHlNb2RpZmljYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpOwogICAgICAgICAgICB0aGlzLl9yID0gY29sb3IuX3I7CiAgICAgICAgICAgIHRoaXMuX2cgPSBjb2xvci5fZzsKICAgICAgICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iOwogICAgICAgICAgICB0aGlzLnNldEFscGhhKGNvbG9yLl9hKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBsaWdodGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGxpZ2h0ZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBicmlnaHRlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihicmlnaHRlbiwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGRhcmtlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkYXJrZW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBkZXNhdHVyYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGRlc2F0dXJhdGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzYXR1cmF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzYXR1cmF0ZSwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGdyZXlzY2FsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihncmV5c2NhbGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGluOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKHNwaW4sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKCiAgICAgICAgX2FwcGx5Q29tYmluYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncykpKTsKICAgICAgICB9LAogICAgICAgIGFuYWxvZ291czogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKGFuYWxvZ291cywgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihjb21wbGVtZW50LCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgbW9ub2Nocm9tYXRpYzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKG1vbm9jaHJvbWF0aWMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBzcGxpdGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihzcGxpdGNvbXBsZW1lbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICB0cmlhZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHRyaWFkLCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgdGV0cmFkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24odGV0cmFkLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgIH07CgogICAgLy8gSWYgaW5wdXQgaXMgYW4gb2JqZWN0LCBmb3JjZSAxIGludG8gIjEuMCIgdG8gaGFuZGxlIHJhdGlvcyBwcm9wZXJseQogICAgLy8gU3RyaW5nIGlucHV0IHJlcXVpcmVzICIxLjAiIGFzIGlucHV0LCBzbyAxIHdpbGwgYmUgdHJlYXRlZCBhcyAxCiAgICB0aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24oY29sb3IsIG9wdHMpIHsKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHZhciBuZXdDb2xvciA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBpIGluIGNvbG9yKSB7CiAgICAgICAgICAgICAgICBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gImEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbG9yW2ldID0gY29sb3JbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2xvcltpXSA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3JbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xvciA9IG5ld0NvbG9yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihjb2xvciwgb3B0cyk7CiAgICB9OwoKICAgIC8vIEdpdmVuIGEgc3RyaW5nIG9yIG9iamVjdCwgY29udmVydCB0aGF0IGlucHV0IHRvIFJHQgogICAgLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czoKICAgIC8vCiAgICAvLyAgICAgInJlZCIKICAgIC8vICAgICAiI2YwMCIgb3IgImYwMCIKICAgIC8vICAgICAiI2ZmMDAwMCIgb3IgImZmMDAwMCIKICAgIC8vICAgICAiI2ZmMDAwMDAwIiBvciAiZmYwMDAwMDAiCiAgICAvLyAgICAgInJnYiAyNTUgMCAwIiBvciAicmdiICgyNTUsIDAsIDApIgogICAgLy8gICAgICJyZ2IgMS4wIDAgMCIgb3IgInJnYiAoMSwgMCwgMCkiCiAgICAvLyAgICAgInJnYmEgKDI1NSwgMCwgMCwgMSkiIG9yICJyZ2JhIDI1NSwgMCwgMCwgMSIKICAgIC8vICAgICAicmdiYSAoMS4wLCAwLCAwLCAxKSIgb3IgInJnYmEgMS4wLCAwLCAwLCAxIgogICAgLy8gICAgICJoc2woMCwgMTAwJSwgNTAlKSIgb3IgImhzbCAwIDEwMCUgNTAlIgogICAgLy8gICAgICJoc2xhKDAsIDEwMCUsIDUwJSwgMSkiIG9yICJoc2xhIDAgMTAwJSA1MCUsIDEiCiAgICAvLyAgICAgImhzdigwLCAxMDAlLCAxMDAlKSIgb3IgImhzdiAwIDEwMCUgMTAwJSIKICAgIC8vCiAgICBmdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7CgogICAgICAgIHZhciByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDAgfTsKICAgICAgICB2YXIgYSA9IDE7CiAgICAgICAgdmFyIG9rID0gZmFsc2U7CiAgICAgICAgdmFyIGZvcm1hdCA9IGZhbHNlOwoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGNvbG9yID0gc3RyaW5nSW5wdXRUb09iamVjdChjb2xvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIGNvbG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eSgiciIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJnIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoImIiKSkgewogICAgICAgICAgICAgICAgcmdiID0gcmdiVG9SZ2IoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSBTdHJpbmcoY29sb3Iucikuc3Vic3RyKC0xKSA9PT0gIiUiID8gInByZ2IiIDogInJnYiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29sb3IuaGFzT3duUHJvcGVydHkoImgiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgicyIpICYmIGNvbG9yLmhhc093blByb3BlcnR5KCJ2IikpIHsKICAgICAgICAgICAgICAgIGNvbG9yLnMgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnMpOwogICAgICAgICAgICAgICAgY29sb3IudiA9IGNvbnZlcnRUb1BlcmNlbnRhZ2UoY29sb3Iudik7CiAgICAgICAgICAgICAgICByZ2IgPSBoc3ZUb1JnYihjb2xvci5oLCBjb2xvci5zLCBjb2xvci52KTsKICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJoc3YiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJoIikgJiYgY29sb3IuaGFzT3duUHJvcGVydHkoInMiKSAmJiBjb2xvci5oYXNPd25Qcm9wZXJ0eSgibCIpKSB7CiAgICAgICAgICAgICAgICBjb2xvci5zID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTsKICAgICAgICAgICAgICAgIGNvbG9yLmwgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLmwpOwogICAgICAgICAgICAgICAgcmdiID0gaHNsVG9SZ2IoY29sb3IuaCwgY29sb3IucywgY29sb3IubCk7CiAgICAgICAgICAgICAgICBvayA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3JtYXQgPSAiaHNsIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCJhIikpIHsKICAgICAgICAgICAgICAgIGEgPSBjb2xvci5hOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhID0gYm91bmRBbHBoYShhKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IG9rLAogICAgICAgICAgICBmb3JtYXQ6IGNvbG9yLmZvcm1hdCB8fCBmb3JtYXQsCiAgICAgICAgICAgIHI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5yLCAwKSksCiAgICAgICAgICAgIGc6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5nLCAwKSksCiAgICAgICAgICAgIGI6IG1hdGhNaW4oMjU1LCBtYXRoTWF4KHJnYi5iLCAwKSksCiAgICAgICAgICAgIGE6IGEKICAgICAgICB9OwogICAgfQoKCiAgICAvLyBDb252ZXJzaW9uIEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBgcmdiVG9Ic2xgLCBgcmdiVG9Ic3ZgLCBgaHNsVG9SZ2JgLCBgaHN2VG9SZ2JgIG1vZGlmaWVkIGZyb206CiAgICAvLyA8aHR0cDovL21qaWphY2tzb24uY29tLzIwMDgvMDIvcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jb252ZXJzaW9uLWFsZ29yaXRobXMtaW4tamF2YXNjcmlwdD4KCiAgICAvLyBgcmdiVG9SZ2JgCiAgICAvLyBIYW5kbGUgYm91bmRzIC8gcGVyY2VudGFnZSBjaGVja2luZyB0byBjb25mb3JtIHRvIENTUyBjb2xvciBzcGVjCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci8+CiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGIgaW4gWzAsIDI1NV0gb3IgWzAsIDFdCiAgICAvLyAqUmV0dXJuczoqIHsgciwgZywgYiB9IGluIFswLCAyNTVdCiAgICBmdW5jdGlvbiByZ2JUb1JnYihyLCBnLCBiKXsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByOiBib3VuZDAxKHIsIDI1NSkgKiAyNTUsCiAgICAgICAgICAgIGc6IGJvdW5kMDEoZywgMjU1KSAqIDI1NSwKICAgICAgICAgICAgYjogYm91bmQwMShiLCAyNTUpICogMjU1CiAgICAgICAgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic2xgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLgogICAgLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXQogICAgLy8gKlJldHVybnM6KiB7IGgsIHMsIGwgfSBpbiBbMCwxXQogICAgZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikgewoKICAgICAgICByID0gYm91bmQwMShyLCAyNTUpOwogICAgICAgIGcgPSBib3VuZDAxKGcsIDI1NSk7CiAgICAgICAgYiA9IGJvdW5kMDEoYiwgMjU1KTsKCiAgICAgICAgdmFyIG1heCA9IG1hdGhNYXgociwgZywgYiksIG1pbiA9IG1hdGhNaW4ociwgZywgYik7CiAgICAgICAgdmFyIGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pOwogICAgICAgICAgICBzd2l0Y2gobWF4KSB7CiAgICAgICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaCAvPSA2OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgbDogbCB9OwogICAgfQoKICAgIC8vIGBoc2xUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICBmdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7CiAgICAgICAgdmFyIHIsIGcsIGI7CgogICAgICAgIGggPSBib3VuZDAxKGgsIDM2MCk7CiAgICAgICAgcyA9IGJvdW5kMDEocywgMTAwKTsKICAgICAgICBsID0gYm91bmQwMShsLCAxMDApOwoKICAgICAgICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHsKICAgICAgICAgICAgaWYodCA8IDApIHQgKz0gMTsKICAgICAgICAgICAgaWYodCA+IDEpIHQgLT0gMTsKICAgICAgICAgICAgaWYodCA8IDEvNikgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7CiAgICAgICAgICAgIGlmKHQgPCAxLzIpIHJldHVybiBxOwogICAgICAgICAgICBpZih0IDwgMi8zKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMi8zIC0gdCkgKiA2OwogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9CgogICAgICAgIGlmKHMgPT09IDApIHsKICAgICAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpYwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzOwogICAgICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTsKICAgICAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEvMyk7CiAgICAgICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpOwogICAgICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7IHI6IHIgKiAyNTUsIGc6IGcgKiAyNTUsIGI6IGIgKiAyNTUgfTsKICAgIH0KCiAgICAvLyBgcmdiVG9Ic3ZgCiAgICAvLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNWCiAgICAvLyAqQXNzdW1lczoqIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBvciBbMCwgMV0KICAgIC8vICpSZXR1cm5zOiogeyBoLCBzLCB2IH0gaW4gWzAsMV0KICAgIGZ1bmN0aW9uIHJnYlRvSHN2KHIsIGcsIGIpIHsKCiAgICAgICAgciA9IGJvdW5kMDEociwgMjU1KTsKICAgICAgICBnID0gYm91bmQwMShnLCAyNTUpOwogICAgICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7CgogICAgICAgIHZhciBtYXggPSBtYXRoTWF4KHIsIGcsIGIpLCBtaW4gPSBtYXRoTWluKHIsIGcsIGIpOwogICAgICAgIHZhciBoLCBzLCB2ID0gbWF4OwoKICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjsKICAgICAgICBzID0gbWF4ID09PSAwID8gMCA6IGQgLyBtYXg7CgogICAgICAgIGlmKG1heCA9PSBtaW4pIHsKICAgICAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWMKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN3aXRjaChtYXgpIHsKICAgICAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgZzogaCA9IChiIC0gcikgLyBkICsgMjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGggLz0gNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9OwogICAgfQoKICAgIC8vIGBoc3ZUb1JnYmAKICAgIC8vIENvbnZlcnRzIGFuIEhTViBjb2xvciB2YWx1ZSB0byBSR0IuCiAgICAvLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgdiBhcmUgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMTAwXQogICAgLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdCiAgICAgZnVuY3Rpb24gaHN2VG9SZ2IoaCwgcywgdikgewoKICAgICAgICBoID0gYm91bmQwMShoLCAzNjApICogNjsKICAgICAgICBzID0gYm91bmQwMShzLCAxMDApOwogICAgICAgIHYgPSBib3VuZDAxKHYsIDEwMCk7CgogICAgICAgIHZhciBpID0gbWF0aC5mbG9vcihoKSwKICAgICAgICAgICAgZiA9IGggLSBpLAogICAgICAgICAgICBwID0gdiAqICgxIC0gcyksCiAgICAgICAgICAgIHEgPSB2ICogKDEgLSBmICogcyksCiAgICAgICAgICAgIHQgPSB2ICogKDEgLSAoMSAtIGYpICogcyksCiAgICAgICAgICAgIG1vZCA9IGkgJSA2LAogICAgICAgICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sCiAgICAgICAgICAgIGcgPSBbdCwgdiwgdiwgcSwgcCwgcF1bbW9kXSwKICAgICAgICAgICAgYiA9IFtwLCBwLCB0LCB2LCB2LCBxXVttb2RdOwoKICAgICAgICByZXR1cm4geyByOiByICogMjU1LCBnOiBnICogMjU1LCBiOiBiICogMjU1IH07CiAgICB9CgogICAgLy8gYHJnYlRvSGV4YAogICAgLy8gQ29udmVydHMgYW4gUkdCIGNvbG9yIHRvIGhleAogICAgLy8gQXNzdW1lcyByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgIC8vIFJldHVybnMgYSAzIG9yIDYgY2hhcmFjdGVyIGhleAogICAgZnVuY3Rpb24gcmdiVG9IZXgociwgZywgYiwgYWxsb3czQ2hhcikgewoKICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpCiAgICAgICAgXTsKCiAgICAgICAgLy8gUmV0dXJuIGEgMyBjaGFyYWN0ZXIgaGV4IGlmIHBvc3NpYmxlCiAgICAgICAgaWYgKGFsbG93M0NoYXIgJiYgaGV4WzBdLmNoYXJBdCgwKSA9PSBoZXhbMF0uY2hhckF0KDEpICYmIGhleFsxXS5jaGFyQXQoMCkgPT0gaGV4WzFdLmNoYXJBdCgxKSAmJiBoZXhbMl0uY2hhckF0KDApID09IGhleFsyXS5jaGFyQXQoMSkpIHsKICAgICAgICAgICAgcmV0dXJuIGhleFswXS5jaGFyQXQoMCkgKyBoZXhbMV0uY2hhckF0KDApICsgaGV4WzJdLmNoYXJBdCgwKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBoZXguam9pbigiIik7CiAgICB9CiAgICAgICAgLy8gYHJnYmFUb0hleGAKICAgICAgICAvLyBDb252ZXJ0cyBhbiBSR0JBIGNvbG9yIHBsdXMgYWxwaGEgdHJhbnNwYXJlbmN5IHRvIGhleAogICAgICAgIC8vIEFzc3VtZXMgciwgZywgYiBhbmQgYSBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0KICAgICAgICAvLyBSZXR1cm5zIGFuIDggY2hhcmFjdGVyIGhleAogICAgICAgIGZ1bmN0aW9uIHJnYmFUb0hleChyLCBnLCBiLCBhKSB7CgogICAgICAgICAgICB2YXIgaGV4ID0gWwogICAgICAgICAgICAgICAgcGFkMihjb252ZXJ0RGVjaW1hbFRvSGV4KGEpKSwKICAgICAgICAgICAgICAgIHBhZDIobWF0aFJvdW5kKHIpLnRvU3RyaW5nKDE2KSksCiAgICAgICAgICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLAogICAgICAgICAgICAgICAgcGFkMihtYXRoUm91bmQoYikudG9TdHJpbmcoMTYpKQogICAgICAgICAgICBdOwoKICAgICAgICAgICAgcmV0dXJuIGhleC5qb2luKCIiKTsKICAgICAgICB9CgogICAgLy8gYGVxdWFsc2AKICAgIC8vIENhbiBiZSBjYWxsZWQgd2l0aCBhbnkgdGlueWNvbG9yIGlucHV0CiAgICB0aW55Y29sb3IuZXF1YWxzID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgaWYgKCFjb2xvcjEgfHwgIWNvbG9yMikgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpOwogICAgfTsKICAgIHRpbnljb2xvci5yYW5kb20gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGlueWNvbG9yLmZyb21SYXRpbyh7CiAgICAgICAgICAgIHI6IG1hdGhSYW5kb20oKSwKICAgICAgICAgICAgZzogbWF0aFJhbmRvbSgpLAogICAgICAgICAgICBiOiBtYXRoUmFuZG9tKCkKICAgICAgICB9KTsKICAgIH07CgoKICAgIC8vIE1vZGlmaWNhdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFRoYW5rcyB0byBsZXNzLmpzIGZvciBzb21lIG9mIHRoZSBiYXNpY3MgaGVyZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGhlYWQvbGVzcy5qcy9ibG9iL21hc3Rlci9saWIvbGVzcy9mdW5jdGlvbnMuanM+CgogICAgZnVuY3Rpb24gZGVzYXR1cmF0ZShjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wucyAtPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLnMgPSBjbGFtcDAxKGhzbC5zKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2F0dXJhdGUoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdyZXlzY2FsZShjb2xvcikgewogICAgICAgIHJldHVybiB0aW55Y29sb3IoY29sb3IpLmRlc2F0dXJhdGUoMTAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaWdodGVuIChjb2xvciwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCAxMCk7CiAgICAgICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTsKICAgICAgICBoc2wubCArPSBhbW91bnQgLyAxMDA7CiAgICAgICAgaHNsLmwgPSBjbGFtcDAxKGhzbC5sKTsKICAgICAgICByZXR1cm4gdGlueWNvbG9yKGhzbCk7CiAgICB9CgogICAgZnVuY3Rpb24gYnJpZ2h0ZW4oY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7CiAgICAgICAgcmdiLnIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuciAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpOwogICAgICAgIHJnYi5nID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLmcgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTsKICAgICAgICByZ2IuYiA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5iIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRhcmtlbiAoY29sb3IsIGFtb3VudCkgewogICAgICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApOwogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmwgLT0gYW1vdW50IC8gMTAwOwogICAgICAgIGhzbC5sID0gY2xhbXAwMShoc2wubCk7CiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihoc2wpOwogICAgfQoKICAgIC8vIFNwaW4gdGFrZXMgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBhbW91bnQgd2l0aGluIFstMzYwLCAzNjBdIGluZGljYXRpbmcgdGhlIGNoYW5nZSBvZiBodWUuCiAgICAvLyBWYWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlIHdpbGwgYmUgd3JhcHBlZCBpbnRvIHRoaXMgcmFuZ2UuCiAgICBmdW5jdGlvbiBzcGluKGNvbG9yLCBhbW91bnQpIHsKICAgICAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpOwogICAgICAgIHZhciBodWUgPSAobWF0aFJvdW5kKGhzbC5oKSArIGFtb3VudCkgJSAzNjA7CiAgICAgICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICAvLyBDb21iaW5hdGlvbiBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gVGhhbmtzIHRvIGpRdWVyeSB4Q29sb3IgZm9yIHNvbWUgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGVzZQogICAgLy8gPGh0dHBzOi8vZ2l0aHViLmNvbS9pbmZ1c2lvbi9qUXVlcnkteGNvbG9yL2Jsb2IvbWFzdGVyL2pxdWVyeS54Y29sb3IuanM+CgogICAgZnVuY3Rpb24gY29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgaHNsLmggPSAoaHNsLmggKyAxODApICUgMzYwOwogICAgICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmlhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDEyMCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNDApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRldHJhZChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDkwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDE4MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSwKICAgICAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNzApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwbGl0Y29tcGxlbWVudChjb2xvcikgewogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIGggPSBoc2wuaDsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB0aW55Y29sb3IoY29sb3IpLAogICAgICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDcyKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSksCiAgICAgICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjE2KSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sfSkKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGFuYWxvZ291cyhjb2xvciwgcmVzdWx0cywgc2xpY2VzKSB7CiAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjsKICAgICAgICBzbGljZXMgPSBzbGljZXMgfHwgMzA7CgogICAgICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7CiAgICAgICAgdmFyIHBhcnQgPSAzNjAgLyBzbGljZXM7CiAgICAgICAgdmFyIHJldCA9IFt0aW55Y29sb3IoY29sb3IpXTsKCiAgICAgICAgZm9yIChoc2wuaCA9ICgoaHNsLmggLSAocGFydCAqIHJlc3VsdHMgPj4gMSkpICsgNzIwKSAlIDM2MDsgLS1yZXN1bHRzOyApIHsKICAgICAgICAgICAgaHNsLmggPSAoaHNsLmggKyBwYXJ0KSAlIDM2MDsKICAgICAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKGhzbCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoY29sb3IsIHJlc3VsdHMpIHsKICAgICAgICByZXN1bHRzID0gcmVzdWx0cyB8fCA2OwogICAgICAgIHZhciBoc3YgPSB0aW55Y29sb3IoY29sb3IpLnRvSHN2KCk7CiAgICAgICAgdmFyIGggPSBoc3YuaCwgcyA9IGhzdi5zLCB2ID0gaHN2LnY7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0czsKCiAgICAgICAgd2hpbGUgKHJlc3VsdHMtLSkgewogICAgICAgICAgICByZXQucHVzaCh0aW55Y29sb3IoeyBoOiBoLCBzOiBzLCB2OiB2fSkpOwogICAgICAgICAgICB2ID0gKHYgKyBtb2RpZmljYXRpb24pICUgMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgLy8gVXRpbGl0eSBGdW5jdGlvbnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHRpbnljb2xvci5taXggPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMiwgYW1vdW50KSB7CiAgICAgICAgYW1vdW50ID0gKGFtb3VudCA9PT0gMCkgPyAwIDogKGFtb3VudCB8fCA1MCk7CgogICAgICAgIHZhciByZ2IxID0gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IHRpbnljb2xvcihjb2xvcjIpLnRvUmdiKCk7CgogICAgICAgIHZhciBwID0gYW1vdW50IC8gMTAwOwogICAgICAgIHZhciB3ID0gcCAqIDIgLSAxOwogICAgICAgIHZhciBhID0gcmdiMi5hIC0gcmdiMS5hOwoKICAgICAgICB2YXIgdzE7CgogICAgICAgIGlmICh3ICogYSA9PSAtMSkgewogICAgICAgICAgICB3MSA9IHc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdzEgPSAodyArIGEpIC8gKDEgKyB3ICogYSk7CiAgICAgICAgfQoKICAgICAgICB3MSA9ICh3MSArIDEpIC8gMjsKCiAgICAgICAgdmFyIHcyID0gMSAtIHcxOwoKICAgICAgICB2YXIgcmdiYSA9IHsKICAgICAgICAgICAgcjogcmdiMi5yICogdzEgKyByZ2IxLnIgKiB3MiwKICAgICAgICAgICAgZzogcmdiMi5nICogdzEgKyByZ2IxLmcgKiB3MiwKICAgICAgICAgICAgYjogcmdiMi5iICogdzEgKyByZ2IxLmIgKiB3MiwKICAgICAgICAgICAgYTogcmdiMi5hICogcCAgKyByZ2IxLmEgKiAoMSAtIHApCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHRpbnljb2xvcihyZ2JhKTsKICAgIH07CgoKICAgIC8vIFJlYWRhYmlsaXR5IEZ1bmN0aW9ucwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvQUVSVCNjb2xvci1jb250cmFzdD4KCiAgICAvLyBgcmVhZGFiaWxpdHlgCiAgICAvLyBBbmFseXplIHRoZSAyIGNvbG9ycyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAvLyAgICBgYnJpZ2h0bmVzc2A6IGRpZmZlcmVuY2UgaW4gYnJpZ2h0bmVzcyBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICAvLyAgICBgY29sb3JgOiBkaWZmZXJlbmNlIGluIGNvbG9yL2h1ZSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzCiAgICB0aW55Y29sb3IucmVhZGFiaWxpdHkgPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMikgewogICAgICAgIHZhciBjMSA9IHRpbnljb2xvcihjb2xvcjEpOwogICAgICAgIHZhciBjMiA9IHRpbnljb2xvcihjb2xvcjIpOwogICAgICAgIHZhciByZ2IxID0gYzEudG9SZ2IoKTsKICAgICAgICB2YXIgcmdiMiA9IGMyLnRvUmdiKCk7CiAgICAgICAgdmFyIGJyaWdodG5lc3NBID0gYzEuZ2V0QnJpZ2h0bmVzcygpOwogICAgICAgIHZhciBicmlnaHRuZXNzQiA9IGMyLmdldEJyaWdodG5lc3MoKTsKICAgICAgICB2YXIgY29sb3JEaWZmID0gKAogICAgICAgICAgICBNYXRoLm1heChyZ2IxLnIsIHJnYjIucikgLSBNYXRoLm1pbihyZ2IxLnIsIHJnYjIucikgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmcsIHJnYjIuZykgLSBNYXRoLm1pbihyZ2IxLmcsIHJnYjIuZykgKwogICAgICAgICAgICBNYXRoLm1heChyZ2IxLmIsIHJnYjIuYikgLSBNYXRoLm1pbihyZ2IxLmIsIHJnYjIuYikKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBicmlnaHRuZXNzOiBNYXRoLmFicyhicmlnaHRuZXNzQSAtIGJyaWdodG5lc3NCKSwKICAgICAgICAgICAgY29sb3I6IGNvbG9yRGlmZgogICAgICAgIH07CiAgICB9OwoKICAgIC8vIGByZWFkYWJsZWAKICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3QKICAgIC8vIEVuc3VyZSB0aGF0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3IgY29tYmluYXRpb25zIHByb3ZpZGUgc3VmZmljaWVudCBjb250cmFzdC4KICAgIC8vICpFeGFtcGxlKgogICAgLy8gICAgdGlueWNvbG9yLmlzUmVhZGFibGUoIiMwMDAiLCAiIzExMSIpID0+IGZhbHNlCiAgICB0aW55Y29sb3IuaXNSZWFkYWJsZSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTsKICAgICAgICByZXR1cm4gcmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyA+IDEyNSAmJiByZWFkYWJpbGl0eS5jb2xvciA+IDUwMDsKICAgIH07CgogICAgLy8gYG1vc3RSZWFkYWJsZWAKICAgIC8vIEdpdmVuIGEgYmFzZSBjb2xvciBhbmQgYSBsaXN0IG9mIHBvc3NpYmxlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZAogICAgLy8gY29sb3JzIGZvciB0aGF0IGJhc2UsIHJldHVybnMgdGhlIG1vc3QgcmVhZGFibGUgY29sb3IuCiAgICAvLyAqRXhhbXBsZSoKICAgIC8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUoIiMxMjMiLCBbIiNmZmYiLCAiIzAwMCJdKSA9PiAiIzAwMCIKICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUgPSBmdW5jdGlvbihiYXNlQ29sb3IsIGNvbG9yTGlzdCkgewogICAgICAgIHZhciBiZXN0Q29sb3IgPSBudWxsOwogICAgICAgIHZhciBiZXN0U2NvcmUgPSAwOwogICAgICAgIHZhciBiZXN0SXNSZWFkYWJsZSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGNvbG9yTGlzdC5sZW5ndGg7IGkrKykgewoKICAgICAgICAgICAgLy8gV2Ugbm9ybWFsaXplIGJvdGggYXJvdW5kIHRoZSAiYWNjZXB0YWJsZSIgYnJlYWtpbmcgcG9pbnQsCiAgICAgICAgICAgIC8vIGJ1dCByYW5rIGJyaWdodG5lc3MgY29uc3RyYXN0IGhpZ2hlciB0aGFuIGh1ZS4KCiAgICAgICAgICAgIHZhciByZWFkYWJpbGl0eSA9IHRpbnljb2xvci5yZWFkYWJpbGl0eShiYXNlQ29sb3IsIGNvbG9yTGlzdFtpXSk7CiAgICAgICAgICAgIHZhciByZWFkYWJsZSA9IHJlYWRhYmlsaXR5LmJyaWdodG5lc3MgPiAxMjUgJiYgcmVhZGFiaWxpdHkuY29sb3IgPiA1MDA7CiAgICAgICAgICAgIHZhciBzY29yZSA9IDMgKiAocmVhZGFiaWxpdHkuYnJpZ2h0bmVzcyAvIDEyNSkgKyAocmVhZGFiaWxpdHkuY29sb3IgLyA1MDApOwoKICAgICAgICAgICAgaWYgKChyZWFkYWJsZSAmJiAhIGJlc3RJc1JlYWRhYmxlKSB8fAogICAgICAgICAgICAgICAgKHJlYWRhYmxlICYmIGJlc3RJc1JlYWRhYmxlICYmIHNjb3JlID4gYmVzdFNjb3JlKSB8fAogICAgICAgICAgICAgICAgKCghIHJlYWRhYmxlKSAmJiAoISBiZXN0SXNSZWFkYWJsZSkgJiYgc2NvcmUgPiBiZXN0U2NvcmUpKSB7CiAgICAgICAgICAgICAgICBiZXN0SXNSZWFkYWJsZSA9IHJlYWRhYmxlOwogICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CiAgICAgICAgICAgICAgICBiZXN0Q29sb3IgPSB0aW55Y29sb3IoY29sb3JMaXN0W2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYmVzdENvbG9yOwogICAgfTsKCgogICAgLy8gQmlnIExpc3Qgb2YgQ29sb3JzCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLyNzdmctY29sb3I+CiAgICB2YXIgbmFtZXMgPSB0aW55Y29sb3IubmFtZXMgPSB7CiAgICAgICAgYWxpY2VibHVlOiAiZjBmOGZmIiwKICAgICAgICBhbnRpcXVld2hpdGU6ICJmYWViZDciLAogICAgICAgIGFxdWE6ICIwZmYiLAogICAgICAgIGFxdWFtYXJpbmU6ICI3ZmZmZDQiLAogICAgICAgIGF6dXJlOiAiZjBmZmZmIiwKICAgICAgICBiZWlnZTogImY1ZjVkYyIsCiAgICAgICAgYmlzcXVlOiAiZmZlNGM0IiwKICAgICAgICBibGFjazogIjAwMCIsCiAgICAgICAgYmxhbmNoZWRhbG1vbmQ6ICJmZmViY2QiLAogICAgICAgIGJsdWU6ICIwMGYiLAogICAgICAgIGJsdWV2aW9sZXQ6ICI4YTJiZTIiLAogICAgICAgIGJyb3duOiAiYTUyYTJhIiwKICAgICAgICBidXJseXdvb2Q6ICJkZWI4ODciLAogICAgICAgIGJ1cm50c2llbm5hOiAiZWE3ZTVkIiwKICAgICAgICBjYWRldGJsdWU6ICI1ZjllYTAiLAogICAgICAgIGNoYXJ0cmV1c2U6ICI3ZmZmMDAiLAogICAgICAgIGNob2NvbGF0ZTogImQyNjkxZSIsCiAgICAgICAgY29yYWw6ICJmZjdmNTAiLAogICAgICAgIGNvcm5mbG93ZXJibHVlOiAiNjQ5NWVkIiwKICAgICAgICBjb3Juc2lsazogImZmZjhkYyIsCiAgICAgICAgY3JpbXNvbjogImRjMTQzYyIsCiAgICAgICAgY3lhbjogIjBmZiIsCiAgICAgICAgZGFya2JsdWU6ICIwMDAwOGIiLAogICAgICAgIGRhcmtjeWFuOiAiMDA4YjhiIiwKICAgICAgICBkYXJrZ29sZGVucm9kOiAiYjg4NjBiIiwKICAgICAgICBkYXJrZ3JheTogImE5YTlhOSIsCiAgICAgICAgZGFya2dyZWVuOiAiMDA2NDAwIiwKICAgICAgICBkYXJrZ3JleTogImE5YTlhOSIsCiAgICAgICAgZGFya2toYWtpOiAiYmRiNzZiIiwKICAgICAgICBkYXJrbWFnZW50YTogIjhiMDA4YiIsCiAgICAgICAgZGFya29saXZlZ3JlZW46ICI1NTZiMmYiLAogICAgICAgIGRhcmtvcmFuZ2U6ICJmZjhjMDAiLAogICAgICAgIGRhcmtvcmNoaWQ6ICI5OTMyY2MiLAogICAgICAgIGRhcmtyZWQ6ICI4YjAwMDAiLAogICAgICAgIGRhcmtzYWxtb246ICJlOTk2N2EiLAogICAgICAgIGRhcmtzZWFncmVlbjogIjhmYmM4ZiIsCiAgICAgICAgZGFya3NsYXRlYmx1ZTogIjQ4M2Q4YiIsCiAgICAgICAgZGFya3NsYXRlZ3JheTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3NsYXRlZ3JleTogIjJmNGY0ZiIsCiAgICAgICAgZGFya3R1cnF1b2lzZTogIjAwY2VkMSIsCiAgICAgICAgZGFya3Zpb2xldDogIjk0MDBkMyIsCiAgICAgICAgZGVlcHBpbms6ICJmZjE0OTMiLAogICAgICAgIGRlZXBza3libHVlOiAiMDBiZmZmIiwKICAgICAgICBkaW1ncmF5OiAiNjk2OTY5IiwKICAgICAgICBkaW1ncmV5OiAiNjk2OTY5IiwKICAgICAgICBkb2RnZXJibHVlOiAiMWU5MGZmIiwKICAgICAgICBmaXJlYnJpY2s6ICJiMjIyMjIiLAogICAgICAgIGZsb3JhbHdoaXRlOiAiZmZmYWYwIiwKICAgICAgICBmb3Jlc3RncmVlbjogIjIyOGIyMiIsCiAgICAgICAgZnVjaHNpYTogImYwZiIsCiAgICAgICAgZ2FpbnNib3JvOiAiZGNkY2RjIiwKICAgICAgICBnaG9zdHdoaXRlOiAiZjhmOGZmIiwKICAgICAgICBnb2xkOiAiZmZkNzAwIiwKICAgICAgICBnb2xkZW5yb2Q6ICJkYWE1MjAiLAogICAgICAgIGdyYXk6ICI4MDgwODAiLAogICAgICAgIGdyZWVuOiAiMDA4MDAwIiwKICAgICAgICBncmVlbnllbGxvdzogImFkZmYyZiIsCiAgICAgICAgZ3JleTogIjgwODA4MCIsCiAgICAgICAgaG9uZXlkZXc6ICJmMGZmZjAiLAogICAgICAgIGhvdHBpbms6ICJmZjY5YjQiLAogICAgICAgIGluZGlhbnJlZDogImNkNWM1YyIsCiAgICAgICAgaW5kaWdvOiAiNGIwMDgyIiwKICAgICAgICBpdm9yeTogImZmZmZmMCIsCiAgICAgICAga2hha2k6ICJmMGU2OGMiLAogICAgICAgIGxhdmVuZGVyOiAiZTZlNmZhIiwKICAgICAgICBsYXZlbmRlcmJsdXNoOiAiZmZmMGY1IiwKICAgICAgICBsYXduZ3JlZW46ICI3Y2ZjMDAiLAogICAgICAgIGxlbW9uY2hpZmZvbjogImZmZmFjZCIsCiAgICAgICAgbGlnaHRibHVlOiAiYWRkOGU2IiwKICAgICAgICBsaWdodGNvcmFsOiAiZjA4MDgwIiwKICAgICAgICBsaWdodGN5YW46ICJlMGZmZmYiLAogICAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAiZmFmYWQyIiwKICAgICAgICBsaWdodGdyYXk6ICJkM2QzZDMiLAogICAgICAgIGxpZ2h0Z3JlZW46ICI5MGVlOTAiLAogICAgICAgIGxpZ2h0Z3JleTogImQzZDNkMyIsCiAgICAgICAgbGlnaHRwaW5rOiAiZmZiNmMxIiwKICAgICAgICBsaWdodHNhbG1vbjogImZmYTA3YSIsCiAgICAgICAgbGlnaHRzZWFncmVlbjogIjIwYjJhYSIsCiAgICAgICAgbGlnaHRza3libHVlOiAiODdjZWZhIiwKICAgICAgICBsaWdodHNsYXRlZ3JheTogIjc4OSIsCiAgICAgICAgbGlnaHRzbGF0ZWdyZXk6ICI3ODkiLAogICAgICAgIGxpZ2h0c3RlZWxibHVlOiAiYjBjNGRlIiwKICAgICAgICBsaWdodHllbGxvdzogImZmZmZlMCIsCiAgICAgICAgbGltZTogIjBmMCIsCiAgICAgICAgbGltZWdyZWVuOiAiMzJjZDMyIiwKICAgICAgICBsaW5lbjogImZhZjBlNiIsCiAgICAgICAgbWFnZW50YTogImYwZiIsCiAgICAgICAgbWFyb29uOiAiODAwMDAwIiwKICAgICAgICBtZWRpdW1hcXVhbWFyaW5lOiAiNjZjZGFhIiwKICAgICAgICBtZWRpdW1ibHVlOiAiMDAwMGNkIiwKICAgICAgICBtZWRpdW1vcmNoaWQ6ICJiYTU1ZDMiLAogICAgICAgIG1lZGl1bXB1cnBsZTogIjkzNzBkYiIsCiAgICAgICAgbWVkaXVtc2VhZ3JlZW46ICIzY2IzNzEiLAogICAgICAgIG1lZGl1bXNsYXRlYmx1ZTogIjdiNjhlZSIsCiAgICAgICAgbWVkaXVtc3ByaW5nZ3JlZW46ICIwMGZhOWEiLAogICAgICAgIG1lZGl1bXR1cnF1b2lzZTogIjQ4ZDFjYyIsCiAgICAgICAgbWVkaXVtdmlvbGV0cmVkOiAiYzcxNTg1IiwKICAgICAgICBtaWRuaWdodGJsdWU6ICIxOTE5NzAiLAogICAgICAgIG1pbnRjcmVhbTogImY1ZmZmYSIsCiAgICAgICAgbWlzdHlyb3NlOiAiZmZlNGUxIiwKICAgICAgICBtb2NjYXNpbjogImZmZTRiNSIsCiAgICAgICAgbmF2YWpvd2hpdGU6ICJmZmRlYWQiLAogICAgICAgIG5hdnk6ICIwMDAwODAiLAogICAgICAgIG9sZGxhY2U6ICJmZGY1ZTYiLAogICAgICAgIG9saXZlOiAiODA4MDAwIiwKICAgICAgICBvbGl2ZWRyYWI6ICI2YjhlMjMiLAogICAgICAgIG9yYW5nZTogImZmYTUwMCIsCiAgICAgICAgb3JhbmdlcmVkOiAiZmY0NTAwIiwKICAgICAgICBvcmNoaWQ6ICJkYTcwZDYiLAogICAgICAgIHBhbGVnb2xkZW5yb2Q6ICJlZWU4YWEiLAogICAgICAgIHBhbGVncmVlbjogIjk4ZmI5OCIsCiAgICAgICAgcGFsZXR1cnF1b2lzZTogImFmZWVlZSIsCiAgICAgICAgcGFsZXZpb2xldHJlZDogImRiNzA5MyIsCiAgICAgICAgcGFwYXlhd2hpcDogImZmZWZkNSIsCiAgICAgICAgcGVhY2hwdWZmOiAiZmZkYWI5IiwKICAgICAgICBwZXJ1OiAiY2Q4NTNmIiwKICAgICAgICBwaW5rOiAiZmZjMGNiIiwKICAgICAgICBwbHVtOiAiZGRhMGRkIiwKICAgICAgICBwb3dkZXJibHVlOiAiYjBlMGU2IiwKICAgICAgICBwdXJwbGU6ICI4MDAwODAiLAogICAgICAgIHJlYmVjY2FwdXJwbGU6ICI2NjMzOTkiLAogICAgICAgIHJlZDogImYwMCIsCiAgICAgICAgcm9zeWJyb3duOiAiYmM4ZjhmIiwKICAgICAgICByb3lhbGJsdWU6ICI0MTY5ZTEiLAogICAgICAgIHNhZGRsZWJyb3duOiAiOGI0NTEzIiwKICAgICAgICBzYWxtb246ICJmYTgwNzIiLAogICAgICAgIHNhbmR5YnJvd246ICJmNGE0NjAiLAogICAgICAgIHNlYWdyZWVuOiAiMmU4YjU3IiwKICAgICAgICBzZWFzaGVsbDogImZmZjVlZSIsCiAgICAgICAgc2llbm5hOiAiYTA1MjJkIiwKICAgICAgICBzaWx2ZXI6ICJjMGMwYzAiLAogICAgICAgIHNreWJsdWU6ICI4N2NlZWIiLAogICAgICAgIHNsYXRlYmx1ZTogIjZhNWFjZCIsCiAgICAgICAgc2xhdGVncmF5OiAiNzA4MDkwIiwKICAgICAgICBzbGF0ZWdyZXk6ICI3MDgwOTAiLAogICAgICAgIHNub3c6ICJmZmZhZmEiLAogICAgICAgIHNwcmluZ2dyZWVuOiAiMDBmZjdmIiwKICAgICAgICBzdGVlbGJsdWU6ICI0NjgyYjQiLAogICAgICAgIHRhbjogImQyYjQ4YyIsCiAgICAgICAgdGVhbDogIjAwODA4MCIsCiAgICAgICAgdGhpc3RsZTogImQ4YmZkOCIsCiAgICAgICAgdG9tYXRvOiAiZmY2MzQ3IiwKICAgICAgICB0dXJxdW9pc2U6ICI0MGUwZDAiLAogICAgICAgIHZpb2xldDogImVlODJlZSIsCiAgICAgICAgd2hlYXQ6ICJmNWRlYjMiLAogICAgICAgIHdoaXRlOiAiZmZmIiwKICAgICAgICB3aGl0ZXNtb2tlOiAiZjVmNWY1IiwKICAgICAgICB5ZWxsb3c6ICJmZjAiLAogICAgICAgIHllbGxvd2dyZWVuOiAiOWFjZDMyIgogICAgfTsKCiAgICAvLyBNYWtlIGl0IGVhc3kgdG8gYWNjZXNzIGNvbG9ycyB2aWEgYGhleE5hbWVzW2hleF1gCiAgICB2YXIgaGV4TmFtZXMgPSB0aW55Y29sb3IuaGV4TmFtZXMgPSBmbGlwKG5hbWVzKTsKCgogICAgLy8gVXRpbGl0aWVzCiAgICAvLyAtLS0tLS0tLS0KCiAgICAvLyBgeyAnbmFtZTEnOiAndmFsMScgfWAgYmVjb21lcyBgeyAndmFsMSc6ICduYW1lMScgfWAKICAgIGZ1bmN0aW9uIGZsaXAobykgewogICAgICAgIHZhciBmbGlwcGVkID0geyB9OwogICAgICAgIGZvciAodmFyIGkgaW4gbykgewogICAgICAgICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgICAgICAgICAgZmxpcHBlZFtvW2ldXSA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZsaXBwZWQ7CiAgICB9CgogICAgLy8gUmV0dXJuIGEgdmFsaWQgYWxwaGEgdmFsdWUgWzAsMV0gd2l0aCBhbGwgaW52YWxpZCB2YWx1ZXMgYmVpbmcgc2V0IHRvIDEKICAgIGZ1bmN0aW9uIGJvdW5kQWxwaGEoYSkgewogICAgICAgIGEgPSBwYXJzZUZsb2F0KGEpOwoKICAgICAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHsKICAgICAgICAgICAgYSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICAvLyBUYWtlIGlucHV0IGZyb20gWzAsIG5dIGFuZCByZXR1cm4gaXQgYXMgWzAsIDFdCiAgICBmdW5jdGlvbiBib3VuZDAxKG4sIG1heCkgewogICAgICAgIGlmIChpc09uZVBvaW50WmVybyhuKSkgeyBuID0gIjEwMCUiOyB9CgogICAgICAgIHZhciBwcm9jZXNzUGVyY2VudCA9IGlzUGVyY2VudGFnZShuKTsKICAgICAgICBuID0gbWF0aE1pbihtYXgsIG1hdGhNYXgoMCwgcGFyc2VGbG9hdChuKSkpOwoKICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlcgogICAgICAgIGlmIChwcm9jZXNzUGVyY2VudCkgewogICAgICAgICAgICBuID0gcGFyc2VJbnQobiAqIG1heCwgMTApIC8gMTAwOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycwogICAgICAgIGlmICgobWF0aC5hYnMobiAtIG1heCkgPCAwLjAwMDAwMSkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAvLyBDb252ZXJ0IGludG8gWzAsIDFdIHJhbmdlIGlmIGl0IGlzbid0IGFscmVhZHkKICAgICAgICByZXR1cm4gKG4gJSBtYXgpIC8gcGFyc2VGbG9hdChtYXgpOwogICAgfQoKICAgIC8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMQogICAgZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHsKICAgICAgICByZXR1cm4gbWF0aE1pbigxLCBtYXRoTWF4KDAsIHZhbCkpOwogICAgfQoKICAgIC8vIFBhcnNlIGEgYmFzZS0xNiBoZXggdmFsdWUgaW50byBhIGJhc2UtMTAgaW50ZWdlcgogICAgZnVuY3Rpb24gcGFyc2VJbnRGcm9tSGV4KHZhbCkgewogICAgICAgIHJldHVybiBwYXJzZUludCh2YWwsIDE2KTsKICAgIH0KCiAgICAvLyBOZWVkIHRvIGhhbmRsZSAxLjAgYXMgMTAwJSwgc2luY2Ugb25jZSBpdCBpcyBhIG51bWJlciwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCAxCiAgICAvLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDIyMDcyL2phdmFzY3JpcHQtaG93LXRvLWRldGVjdC1udW1iZXItYXMtYS1kZWNpbWFsLWluY2x1ZGluZy0xLTA+CiAgICBmdW5jdGlvbiBpc09uZVBvaW50WmVybyhuKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBuID09ICJzdHJpbmciICYmIG4uaW5kZXhPZignLicpICE9IC0xICYmIHBhcnNlRmxvYXQobikgPT09IDE7CiAgICB9CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHN0cmluZyBwYXNzZWQgaW4gaXMgYSBwZXJjZW50YWdlCiAgICBmdW5jdGlvbiBpc1BlcmNlbnRhZ2UobikgewogICAgICAgIHJldHVybiB0eXBlb2YgbiA9PT0gInN0cmluZyIgJiYgbi5pbmRleE9mKCclJykgIT0gLTE7CiAgICB9CgogICAgLy8gRm9yY2UgYSBoZXggdmFsdWUgdG8gaGF2ZSAyIGNoYXJhY3RlcnMKICAgIGZ1bmN0aW9uIHBhZDIoYykgewogICAgICAgIHJldHVybiBjLmxlbmd0aCA9PSAxID8gJzAnICsgYyA6ICcnICsgYzsKICAgIH0KCiAgICAvLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZQogICAgZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7CiAgICAgICAgaWYgKG4gPD0gMSkgewogICAgICAgICAgICBuID0gKG4gKiAxMDApICsgIiUiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG47CiAgICB9CgogICAgLy8gQ29udmVydHMgYSBkZWNpbWFsIHRvIGEgaGV4IHZhbHVlCiAgICBmdW5jdGlvbiBjb252ZXJ0RGVjaW1hbFRvSGV4KGQpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGQpICogMjU1KS50b1N0cmluZygxNik7CiAgICB9CiAgICAvLyBDb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIGRlY2ltYWwKICAgIGZ1bmN0aW9uIGNvbnZlcnRIZXhUb0RlY2ltYWwoaCkgewogICAgICAgIHJldHVybiAocGFyc2VJbnRGcm9tSGV4KGgpIC8gMjU1KTsKICAgIH0KCiAgICB2YXIgbWF0Y2hlcnMgPSAoZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+CiAgICAgICAgdmFyIENTU19JTlRFR0VSID0gIlstXFwrXT9cXGQrJT8iOwoKICAgICAgICAvLyA8aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI251bWJlci12YWx1ZT4KICAgICAgICB2YXIgQ1NTX05VTUJFUiA9ICJbLVxcK10/XFxkKlxcLlxcZCslPyI7CgogICAgICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS4KICAgICAgICB2YXIgQ1NTX1VOSVQgPSAiKD86IiArIENTU19OVU1CRVIgKyAiKXwoPzoiICsgQ1NTX0lOVEVHRVIgKyAiKSI7CgogICAgICAgIC8vIEFjdHVhbCBtYXRjaGluZy4KICAgICAgICAvLyBQYXJlbnRoZXNlcyBhbmQgY29tbWFzIGFyZSBvcHRpb25hbCwgYnV0IG5vdCByZXF1aXJlZC4KICAgICAgICAvLyBXaGl0ZXNwYWNlIGNhbiB0YWtlIHRoZSBwbGFjZSBvZiBjb21tYXMgb3Igb3BlbmluZyBwYXJlbgogICAgICAgIHZhciBQRVJNSVNTSVZFX01BVENIMyA9ICJbXFxzfFxcKF0rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKICAgICAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSAiW1xcc3xcXChdKygiICsgQ1NTX1VOSVQgKyAiKVssfFxcc10rKCIgKyBDU1NfVU5JVCArICIpWyx8XFxzXSsoIiArIENTU19VTklUICsgIilbLHxcXHNdKygiICsgQ1NTX1VOSVQgKyAiKVxccypcXCk/IjsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmdiOiBuZXcgUmVnRXhwKCJyZ2IiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICByZ2JhOiBuZXcgUmVnRXhwKCJyZ2JhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHNsOiBuZXcgUmVnRXhwKCJoc2wiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc2xhOiBuZXcgUmVnRXhwKCJoc2xhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaHN2OiBuZXcgUmVnRXhwKCJoc3YiICsgUEVSTUlTU0lWRV9NQVRDSDMpLAogICAgICAgICAgICBoc3ZhOiBuZXcgUmVnRXhwKCJoc3ZhIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSwKICAgICAgICAgICAgaGV4MzogL14oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkkLywKICAgICAgICAgICAgaGV4NjogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkkLywKICAgICAgICAgICAgaGV4ODogL14oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC8KICAgICAgICB9OwogICAgfSkoKTsKCiAgICAvLyBgc3RyaW5nSW5wdXRUb09iamVjdGAKICAgIC8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0CiAgICAvLyBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWAKICAgIGZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHsKCiAgICAgICAgY29sb3IgPSBjb2xvci5yZXBsYWNlKHRyaW1MZWZ0LCcnKS5yZXBsYWNlKHRyaW1SaWdodCwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIG5hbWVkID0gZmFsc2U7CiAgICAgICAgaWYgKG5hbWVzW2NvbG9yXSkgewogICAgICAgICAgICBjb2xvciA9IG5hbWVzW2NvbG9yXTsKICAgICAgICAgICAgbmFtZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjb2xvciA9PSAndHJhbnNwYXJlbnQnKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDAsIGZvcm1hdDogIm5hbWUiIH07CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggc3RyaW5nIGlucHV0IHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAgICAgICAgLy8gS2VlcCBtb3N0IG9mIHRoZSBudW1iZXIgYm91bmRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24gLSBkb24ndCB3b3JyeSBhYm91dCBbMCwxXSBvciBbMCwxMDBdIG9yIFswLDM2MF0KICAgICAgICAvLyBKdXN0IHJldHVybiBhbiBvYmplY3QgYW5kIGxldCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgaGFuZGxlIHRoYXQuCiAgICAgICAgLy8gVGhpcyB3YXkgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHRpbnljb2xvciBpcyBpbml0aWFsaXplZCB3aXRoIHN0cmluZyBvciBvYmplY3QuCiAgICAgICAgdmFyIG1hdGNoOwogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5yZ2IuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLnJnYmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IHI6IG1hdGNoWzFdLCBnOiBtYXRjaFsyXSwgYjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc2wuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzbGEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgbDogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc3YuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10gfTsKICAgICAgICB9CiAgICAgICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhzdmEuZXhlYyhjb2xvcikpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGg6IG1hdGNoWzFdLCBzOiBtYXRjaFsyXSwgdjogbWF0Y2hbM10sIGE6IG1hdGNoWzRdIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg4LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFsxXSksCiAgICAgICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0pLAogICAgICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFs0XSksCiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gIm5hbWUiIDogImhleDgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg2LmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdKSwKICAgICAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSksCiAgICAgICAgICAgICAgICBiOiBwYXJzZUludEZyb21IZXgobWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXgzLmV4ZWMoY29sb3IpKSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksCiAgICAgICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSwKICAgICAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLAogICAgICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/ICJuYW1lIiA6ICJoZXgiCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgd2luZG93LnRpbnljb2xvciA9IHRpbnljb2xvcjsKICAgIH0pKCk7CgogICAgJChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCQuZm4uc3BlY3RydW0ubG9hZCkgewogICAgICAgICAgICAkLmZuLnNwZWN0cnVtLnByb2Nlc3NOYXRpdmVDb2xvcklucHV0cygpOwogICAgICAgIH0KICAgIH0pOwoKfSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTcgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50CiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgZnVuY3Rpb25zLgogKi8KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vIEFwcG9pbnRtZW50IGRheXMgY2FjaGUgYW5kIHJlYWR5IGZsYWcKICAgIHZhciBBcHBvaW50bWVudERheXNDYWNoZSwKICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IGZhbHNlLAogICAgICAgIEFKQVhDb3VudGVyID0gMCwKICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzLAogICAgICAgIEN1cnJlbnRWaWV3OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNoYWxsZW5nZVRva2VuIC0gVXNlciBjaGFsbGVuZ2UgdG9rZW4uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkFsbERheVRleHQgLSBMb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgd29yZCAiQWxsLWRheSIuCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFBhcmFtcy5Jc1JUTCAtIElzIGN1cnJlbnQgbG9jYWxlIGlzIHJpZ2h0IHRleHQgYmFzZWQ/CiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuTW9udGhOYW1lcyAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBlYWNoIG1vbnRoLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk1vbnRoTmFtZXNTaG9ydCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBlYWNoIG1vbnRoIG9uIHNob3J0aCBmb3JtYXQuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGF5TmFtZXMgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCB3ZWVrIGRheS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5EYXlOYW1lc1Nob3J0IC0gQXJyYXkgY29udGFpbmluZyB0aGUgbG9jYWxpemVkIHN0cmluZ3MgZm9yIGVhY2ggd2VlayBkYXkgb24gc2hvcnQgZm9ybWF0LgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkJ1dHRvblRleHQgLSBBcnJheSBjb250YWluaW5nIHRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgZWFjaCB3ZWVrIGRheSBvbiBzaG9ydCBmb3JtYXQuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkJ1dHRvblRleHQudG9kYXkgLSBMb2NhbGl6ZWQgc3RyaW5nIGZvciB0aGUgd29yZCAiVG9kYXkiLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0Lm1vbnRoIC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIk1vbnRoIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC53ZWVrIC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIldlZWsiLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0LmRheSAtIExvY2FsaXplZCBzdHJpbmcgZm9yIHRoZSB3b3JkICJEYXkiLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5CdXR0b25UZXh0LnRpbWVsaW5lIC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIlRpbWVsaW5lIi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQnV0dG9uVGV4dC5qdW1wIC0gTG9jYWxpemVkIHN0cmluZyBmb3IgdGhlIHdvcmQgIkp1bXAiLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5GaXJzdERheSAtIEZpcnN0IGRheSBvZiB0aGUgd2VlayAoMDogU3VuZGF5KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGVmYXVsdFZpZXcgLSBEZWZhdWx0IHZpZXcgdG8gZGlzcGxheSAobW9udGh8YWdlbmRhV2Vla3xhZ2VuZGFEYXl8dGltZWxpbmVNb250aHx0aW1lbGluZVdlZWt8dGltZWxpbmVEYXkpLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkhlYWRlciAtIEFycmF5IGNvbnRhaW5pbmcgdmlldyBidXR0b25zIGluIHRoZSBoZWFkZXIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkhlYWRlci5sZWZ0IC0gU3RyaW5nIHdpdGggdmlldyBuYW1lcyBmb3IgbGVmdCBzaWRlIG9mIHRoZSBoZWFkZXIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkhlYWRlci5jZW50ZXIgLSBTdHJpbmcgd2l0aCB2aWV3IG5hbWVzIGZvciBoZWFkZXIgY2VudGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5IZWFkZXIucmlnaHQgLSBTdHJpbmcgd2l0aCB2aWV3IG5hbWVzIGZvciByaWdodCBzaWRlIG9mIHRoZSBoZWFkZXIuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGlhbG9nVGV4dCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBkaWFsb2dzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0LkVkaXRUaXRsZSAtIFRpdGxlIG9mIHRoZSBhZGQvZWRpdCBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRpdGxlIC0gVGl0bGUgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUZXh0IC0gVGV4dCBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUFsbCAtIFRleHQgb2YgJ2FsbCcgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcyAtIFRleHQgb2YgJ2p1c3QgdGhpcycgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0LkRpc21pc3MgLSBUZXh0IG9mICdEaXNtaXNzJyBidXR0b24gaW4gZGlhbG9nLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIC0gTmFtZSBvZiB0aGUgc2NyZWVuIChDYWxlbmRhck92ZXJ2aWV3fFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzQnV0dG9uIC0gSUQgb2YgdGhlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciAtIElEIG9mIHRoZSBzZXR0aW5ncyBkaWFsb2cgY29udGFpbmVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzU2hvdyAtIFNob3cgdGhlIHNldHRpbmdzIGRpYWxvZyBpbW1lZGlhdGVseS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IG1hc2sgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0U3ViYWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkFkZFN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGFkZCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkxpc3RBY3Rpb24gLSBOYW1lIG9mIHRoZSBsaXN0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRGF5c1N1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGFwcG9pbnRtZW50IGRheXMgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5UaWNrZXRBcHBvaW50bWVudFR5cGVzIC0gT2JqZWN0IHdpdGggdGlja2V0IGFwcG9pbnRtZW50IHR5cGVzLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5Xb3JraW5nSG91cnMgLSBPYmplY3Qgd2l0aCB3b3JraW5nIGhvdXIgYXBwb2ludG1lbnRzLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5SZXNvdXJjZXMgLSBPYmplY3Qgd2l0aCByZXNvdXJjZSBwYXJhbWV0ZXJzIChvcHRpb25hbCkuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zLkFwcG9pbnRtZW50IC0gT2JqZWN0IHdpdGggYXBwb2ludG1lbnQgc2NyZWVuIHJlbGF0ZWQgZGF0YSAob3B0aW9uYWwpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZSAtIEF1dG8gb3BlbiBhcHBvaW50bWVudCBjcmVhdGUgc2NyZWVuIHBhcmFtZXRlcnMgKG9wdGlvbmFsKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU3RhcnQgLSBTdGFydCBkYXRlIG9mIG5ldyBhcHBvaW50bWVudCAobW9tZW50IHJlYWR5KS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuRW5kIC0gRW5kIGRhdGUgb2YgbmV3IGFwcG9pbnRtZW50IChtb21lbnQgcmVhZHkpLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5QbHVnaW5LZXkgLSBOYW1lIG9mIHRoZSBwbHVnaW4gbW9kdWxlIHRvIHVzZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU2VhcmNoIC0gU2VhcmNoIHN0cmluZyBmb3IgdGhlIHBsdWdpbiBtb2R1bGUgc2VhcmNoLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5PYmplY3RJRCAtIE9iamVjdCBJRCBmb3IgdGhlIHBsdWdpbiBtb2R1bGUgc2VhcmNoLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRJRCAtIEF1dG8gb3BlbiBhcHBvaW50bWVudCBlZGl0IHNjcmVlbiB3aXRoIHNwZWNpZmllZCBhcHBvaW50bWVudCAob3B0aW9uYWwpLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZUJ1dHRvbiAtIElEIG9mIHRoZSBhZGQgYXBwb2ludG1lbnQgYnV0dG9uLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5DYWxlbmRhcnMgLSBPYmplY3Qgd2l0aCBjYWxlbmRhciBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc291cmNlcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5Td2l0Y2hlcyAtIEFycmF5IG9mIGNhbGVuZGFyIHN3aXRjaCBlbGVtZW50cy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0c30gUGFyYW1zLkNhbGVuZGFycy5MaW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxlbmRhciBzd2l0Y2hlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplcyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgY29udHJvbC4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uIChQYXJhbXMpIHsKICAgICAgICB2YXIgJENhbGVuZGFyT2JqID0gJCgnI2NhbGVuZGFyJyksCiAgICAgICAgICAgICREYXRlcGlja2VyT2JqID0gJCgnPGRpdiAvPicpCiAgICAgICAgICAgICAgICAucHJvcCgnaWQnLCAnRGF0ZXBpY2tlcicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0hpZGRlbicpCiAgICAgICAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoJCgnI2NhbGVuZGFyJykpLAogICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQgPSBbXTsKCiAgICAgICAgaWYgKCFQYXJhbXMuQ2hhbGxlbmdlVG9rZW4pIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgUGFyYW1zLlJlc291cmNlcyA9IFBhcmFtcy5SZXNvdXJjZXMgfHwgewogICAgICAgICAgICBSZXNvdXJjZUNvbHVtbnM6IG51bGwsCiAgICAgICAgICAgIFJlc291cmNlVGV4dDogbnVsbCwKICAgICAgICAgICAgUmVzb3VyY2VTZXR0aW5nc0J1dHRvbjogbnVsbCwKICAgICAgICAgICAgUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lcjogbnVsbCwKICAgICAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nczogZmFsc2UsCiAgICAgICAgICAgIFJlc291cmNlSlNPTjogbnVsbAogICAgICAgIH07CgogICAgICAgIC8vIEluaXRpYWxpemUgY2FsZW5kYXIKICAgICAgICAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKHsKICAgICAgICAgICAgaGVhZGVyOiBQYXJhbXMuSGVhZGVyLAogICAgICAgICAgICBjdXN0b21CdXR0b25zOiB7CiAgICAgICAgICAgICAgICBqdW1wOiB7CiAgICAgICAgICAgICAgICAgICAgdGV4dDogUGFyYW1zLkJ1dHRvblRleHQuanVtcCwKICAgICAgICAgICAgICAgICAgICBjbGljazogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNob3dEYXRlcGlja2VyKCRDYWxlbmRhck9iaiwgJERhdGVwaWNrZXJPYmosICQodGhpcyksIFBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWZhdWx0VmlldzogUGFyYW1zLkRlZmF1bHRWaWV3LAogICAgICAgICAgICBhbGxEYXlUZXh0OiBQYXJhbXMuQWxsRGF5VGV4dCwKICAgICAgICAgICAgaXNSVEw6IFBhcmFtcy5Jc1JUTCwKICAgICAgICAgICAgY29sdW1uRm9ybWF0OiAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgIHRpbWVGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogJ0hIOm1tJywKICAgICAgICAgICAgdGl0bGVGb3JtYXQ6ICdEIE1NTSBZWVlZJywKICAgICAgICAgICAgd2Vla051bWJlcnM6IHRydWUsCiAgICAgICAgICAgIHdlZWtOdW1iZXJUaXRsZTogJyMnLAogICAgICAgICAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdJU08nLAogICAgICAgICAgICBldmVudExpbWl0OiB0cnVlLAogICAgICAgICAgICBoZWlnaHQ6IDYwMCwKICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsCiAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsCiAgICAgICAgICAgIGZpcnN0RGF5OiBQYXJhbXMuRmlyc3REYXksCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFBhcmFtcy5Nb250aE5hbWVzLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFBhcmFtcy5Nb250aE5hbWVzU2hvcnQsCiAgICAgICAgICAgIGRheU5hbWVzOiBQYXJhbXMuRGF5TmFtZXMsCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFBhcmFtcy5EYXlOYW1lc1Nob3J0LAogICAgICAgICAgICBidXR0b25UZXh0OiBQYXJhbXMuQnV0dG9uVGV4dCwKICAgICAgICAgICAgc2NoZWR1bGVyTGljZW5zZUtleTogJ0dQTC1NeS1Qcm9qZWN0LUlzLU9wZW4tU291cmNlJywKICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICBmb3JjZUV2ZW50RHVyYXRpb246IHRydWUsCiAgICAgICAgICAgIG5vd0luZGljYXRvcjogdHJ1ZSwKICAgICAgICAgICAgdGltZXpvbmU6ICdsb2NhbCcsCiAgICAgICAgICAgIHJlc291cmNlQXJlYVdpZHRoOiAnMjElJywKICAgICAgICAgICAgdmlld3M6IHsKICAgICAgICAgICAgICAgIG1vbnRoOiB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGVGb3JtYXQ6ICdNTU1NIFlZWVknLAogICAgICAgICAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZGQnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYWdlbmRhRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgdGl0bGVGb3JtYXQ6ICdEIE1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXM6IGZhbHNlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGltZWxpbmVNb250aDogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzI0OjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICBtb250aHM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGltZWxpbmVXZWVrOiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDI6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWs6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISCcKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGltZWxpbmVEYXk6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMDozMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2xvdExhYmVsRm9ybWF0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZGQsIEQgTU1NJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0hIOm1tJwogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgbG9hZGluZzogZnVuY3Rpb24oSXNMb2FkaW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoSXNMb2FkaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLkNhbGVuZGFyV2lkZ2V0JykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLkNhbGVuZGFyV2lkZ2V0JykucmVtb3ZlQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgdmlld1JlbmRlcjogZnVuY3Rpb24oVmlldykgewoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBvbiBhIHRpbWVsaW5lIHZpZXcuCiAgICAgICAgICAgICAgICBpZiAoVmlldy5uYW1lID09PSAndGltZWxpbmVXZWVrJyB8fCBWaWV3Lm5hbWUgPT09ICd0aW1lbGluZURheScpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNhbGVuZGFyIHdlZWsgbnVtYmVyIHRvIHRpbWVsaW5lIHZpZXcgdGl0bGVzLgogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZpbmQoJy5mYy10b29sYmFyID4gZGl2ID4gaDInKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8c3BhbiAvPicpLmFkZENsYXNzKCdmYy13ZWVrLW51bWJlcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoVmlldy5zdGFydC5mb3JtYXQoJyAjVycpKQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0sIDApOwoKICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHJlc3RvcmUgc2V0dGluZ3MgYnV0dG9uLgogICAgICAgICAgICAgICAgICAgIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdmlldyBzZWxlY3Rpb24KICAgICAgICAgICAgICAgIGlmIChDdXJyZW50VmlldyAhPT0gdW5kZWZpbmVkICYmIEN1cnJlbnRWaWV3ICE9PSBWaWV3Lm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWaWV3OiBWaWV3Lm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDdXJyZW50VmlldyA9IFZpZXcubmFtZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihTdGFydCwgRW5kLCBKU0V2ZW50LCBWaWV3LCBSZXNvdXJjZSkgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IFN0YXJ0LAogICAgICAgICAgICAgICAgICAgIEVuZDogRW5kLAogICAgICAgICAgICAgICAgICAgIEpTRXZlbnQ6IEpTRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgVmlldzogVmlldywKICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZTogUmVzb3VyY2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIERhdGEpOwogICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcigndW5zZWxlY3QnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRDbGljazogZnVuY3Rpb24oQ2FsRXZlbnQsIEpTRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBDYWxFdmVudC5zdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IENhbEV2ZW50LmVuZCwKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIERhdGEpOwogICAgICAgICAgICAgICAgSlNFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnREcm9wOiBmdW5jdGlvbihDYWxFdmVudCwgRGVsdGEsIFJldmVydEZ1bmMpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIENhbEV2ZW50OiBDYWxFdmVudCwKICAgICAgICAgICAgICAgICAgICBQcmV2aW91c0FwcG9pbnRtZW50OiBDdXJyZW50QXBwb2ludG1lbnQsCiAgICAgICAgICAgICAgICAgICAgRGVsdGE6IERlbHRhLAogICAgICAgICAgICAgICAgICAgIFJldmVydEZ1bmM6IFJldmVydEZ1bmMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBVcGRhdGVBcHBvaW50bWVudChQYXJhbXMsIERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlc2l6ZTogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoUGFyYW1zLCBEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZW5kZXI6IGZ1bmN0aW9uKENhbEV2ZW50LCAkRWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyICRJY29uQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICRJY29uOwoKICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5yZWN1cnJpbmcKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5wYXJlbnRJZAogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50Lm5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewoKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgY29udGFpbmVyIGFuZCBpY29uIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAkSWNvbkNvbnRhaW5lciA9ICQoJzxkaXYgLz4nKS5hZGRDbGFzcygnSWNvbnMnKTsKICAgICAgICAgICAgICAgICAgICAkSWNvbiA9ICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXBwb2ludG1lbnQgd2l0aCBhcHByb3ByaWF0ZSBpY29uKHMpCiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLXN1bi1vJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5yZWN1cnJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1yZXBlYXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtbGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQubm90aWZpY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtYmVsbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtY2hhci0nICsgUGFyYW1zLlRpY2tldEFwcG9pbnRtZW50TWFya3NbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBQcmVwZW5kIGNvbnRhaW5lciB0byB0aGUgYXBwb2ludG1lbnQKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5maW5kKCcuZmMtY29udGVudCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5wcmVwZW5kKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemVTdGFydDogZnVuY3Rpb24oQ2FsRXZlbnQpIHsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5zdGFydCA9IENhbEV2ZW50LnN0YXJ0OwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LmVuZCA9IENhbEV2ZW50LmVuZDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnREcmFnU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQucmVzb3VyY2VJZHMgPSBDYWxFdmVudC5yZXNvdXJjZUlkczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRNb3VzZW92ZXI6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgJFRvb2x0aXBPYmosCiAgICAgICAgICAgICAgICAgICAgUG9zWCA9IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zWSA9IDAsCiAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEhUTUwgPSAkKCcjQXBwb2ludG1lbnRUb29sdGlwVGVtcGxhdGUnKS5odG1sKCkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlTGVmdCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZVRvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoIUpTRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50ID0gd2luZG93LmV2ZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEpTRXZlbnQucGFnZVggfHwgSlNFdmVudC5wYWdlWSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LnBhZ2VYOwogICAgICAgICAgICAgICAgICAgIFBvc1kgPSBKU0V2ZW50LnBhZ2VZOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChKU0V2ZW50LmNsaWVudFggfHwgSlNFdmVudC5jbGllbnRZKSB7CiAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEpTRXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgIFBvc1kgPSBKU0V2ZW50LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgcG9zaXRpb25zIHNvIHRoZSB0b29sdGlwIGRvIG5vdCBvdmVybGFwIHdpdGggbW91c2UgcG9pbnRlcgogICAgICAgICAgICAgICAgUG9zWCArPSAxMDsKICAgICAgICAgICAgICAgIFBvc1kgKz0gMTA7CgogICAgICAgICAgICAgICAgaWYgKFRvb2x0aXBIVE1MLmxlbmd0aCA+IDApIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCBhcHBvaW50bWVudCBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gUmVwbGFjZUFwcG9pbnRtZW50SW5mb3JtYXRpb24oVG9vbHRpcEhUTUwsIENhbEV2ZW50KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRvb2x0aXAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmogPSAkKCc8ZGl2Lz4nKS5hZGRDbGFzcygnQXBwb2ludG1lbnRUb29sdGlwIEhpZGRlbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBQb3NZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogUG9zWAogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChUb29sdGlwSFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCdib2R5Jyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0b3AgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbiA9IFBvc1kgKyAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFlQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZVRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gUG9zWSAtICRUb29sdGlwT2JqLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ3RvcCcsIFBvc1kgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSBsZWZ0IHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24gPSBQb3NYICsgJFRvb2x0aXBPYmoud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFhQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZUxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IFBvc1ggLSAkVG9vbHRpcE9iai53aWR0aCgpIC0gMzA7CiAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygnbGVmdCcsIFBvc1ggKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgYXBwb2ludG1lbnQgaWNvbnMKICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnJlY3VycmluZwogICAgICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5wYXJlbnRJZAogICAgICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uQ29udGFpbmVyID0gJFRvb2x0aXBPYmouZmluZCgnLkljb25zJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uID0gJCgnPGkgLz4nKS5hZGRDbGFzcygnZmEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXBwb2ludG1lbnQgd2l0aCBhcHByb3ByaWF0ZSBpY29uKHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLXN1bi1vJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5yZWN1cnJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLXJlcGVhdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtYmVsbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1jaGFyLScgKyBQYXJhbXMuVGlja2V0QXBwb2ludG1lbnRNYXJrc1tDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGVdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIHRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5mYWRlSW4oJ2Zhc3QnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGFwc2UgZmllbGRzZXQgbGVnZW5kIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmluZCgnZmllbGRzZXQnKS5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRmllbGRzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoRmllbGRzZXQpLmZpbmQoJzp2aXNpYmxlJykubGVuZ3RoIDw9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoRmllbGRzZXQpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudE1vdXNlb3V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQoJy5BcHBvaW50bWVudFRvb2x0aXAnKS5mYWRlT3V0KCJmYXN0IikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50czogUGFyYW1zLldvcmtpbmdIb3VycywKICAgICAgICAgICAgcmVzb3VyY2VzOiBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlSlNPTiwKICAgICAgICAgICAgcmVzb3VyY2VDb2x1bW5zOiBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlQ29sdW1ucywKICAgICAgICAgICAgcmVzb3VyY2VMYWJlbFRleHQ6IFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VUZXh0CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgZGF0ZXBpY2tlcgogICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoewogICAgICAgICAgICBzaG93T246ICdidXR0b24nLAogICAgICAgICAgICBidXR0b25UZXh0OiBQYXJhbXMuQnV0dG9uVGV4dC5qdW1wLAogICAgICAgICAgICBjb25zdHJhaW5JbnB1dDogdHJ1ZSwKICAgICAgICAgICAgcHJldlRleHQ6IFBhcmFtcy5CdXR0b25UZXh0LnByZXZEYXRlcGlja2VyLAogICAgICAgICAgICBuZXh0VGV4dDogUGFyYW1zLkJ1dHRvblRleHQubmV4dERhdGVwaWNrZXIsCiAgICAgICAgICAgIGZpcnN0RGF5OiBQYXJhbXMuRmlyc3REYXksCiAgICAgICAgICAgIHNob3dNb250aEFmdGVyWWVhcjogMCwKICAgICAgICAgICAgbW9udGhOYW1lczogUGFyYW1zLk1vbnRoTmFtZXMsCiAgICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogUGFyYW1zLk1vbnRoTmFtZXNTaG9ydCwKICAgICAgICAgICAgZGF5TmFtZXM6IFBhcmFtcy5EYXlOYW1lcywKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogUGFyYW1zLkRheU5hbWVzU2hvcnQsCiAgICAgICAgICAgIGRheU5hbWVzTWluOiBQYXJhbXMuRGF5TmFtZXNNaW4sCiAgICAgICAgICAgIGlzUlRMOiBQYXJhbXMuSXNSVEwsCiAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbihEYXRlVGV4dCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcignZ290b0RhdGUnLCBuZXcgRGF0ZShEYXRlVGV4dCkpOwogICAgICAgICAgICAgICAgJCgnI0RhdGVwaWNrZXJPdmVybGF5JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAkRGF0ZXBpY2tlck9iai5oaWRlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJlZm9yZVNob3dEYXk6IGZ1bmN0aW9uKERhdGVPYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmIChBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGVja0RhdGUoRGF0ZU9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdHJ1ZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQ2hhbmdlTW9udGhZZWFyOiBmdW5jdGlvbihZZWFyLCBNb250aCkgewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCwgUGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBQYXJhbXMuQ2FsZW5kYXJzLlN3aXRjaGVzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDYWxlbmRhclN3aXRjaEluaXQoJCh0aGlzKSwgUGFyYW1zKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKFBhcmFtcy5BcHBvaW50bWVudCkgewoKICAgICAgICAgICAgLy8gQXV0byBvcGVuIGFwcG9pbnRtZW50IGNyZWF0ZSBzY3JlZW4KICAgICAgICAgICAgaWYgKFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZSkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coUGFyYW1zLCB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5TdGFydCA/ICQuZnVsbENhbGVuZGFyLm1vbWVudChQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuU3RhcnQpIDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgICAgICBFbmQ6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5FbmQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLkVuZCkgOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleTogUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlBsdWdpbktleSA/IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5QbHVnaW5LZXkgOiBudWxsLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaDogUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlLlNlYXJjaCA/IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudENyZWF0ZS5TZWFyY2ggOiBudWxsLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEOiBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuT2JqZWN0SUQgPyBQYXJhbXMuQXBwb2ludG1lbnQuQXBwb2ludG1lbnRDcmVhdGUuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQXV0byBvcGVuIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuCiAgICAgICAgICAgIGVsc2UgaWYgKFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudElEKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhQYXJhbXMsIHsgQ2FsRXZlbnQ6IHsgaWQ6IFBhcmFtcy5BcHBvaW50bWVudC5BcHBvaW50bWVudElEIH0gfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGFyYW1zLkFwcG9pbnRtZW50LkFwcG9pbnRtZW50Q3JlYXRlQnV0dG9uKSkKICAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKFBhcmFtcywgewogICAgICAgICAgICAgICAgICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgRW5kOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpCiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKFBhcmFtcy5DYWxlbmRhclNldHRpbmdzQnV0dG9uKSB7CiAgICAgICAgICAgIENhbGVuZGFyU2V0dGluZ3NJbml0KFBhcmFtcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoUGFyYW1zLlJlc291cmNlcy5SZXNvdXJjZVNldHRpbmdzQnV0dG9uKSB7CiAgICAgICAgICAgIFJlc291cmNlU2V0dGluZ3NJbml0KFBhcmFtcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBTaG93RGF0ZXBpY2tlcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhck9iaiAtIENhbGVuZGFyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICREYXRlcGlja2VyT2JqIC0gRGF0ZXBpY2tlciBjb250cm9sIG9iamVjdC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkSnVtcEJ1dHRvbiAtIERhdGVwaWNrZXIgYnV0dG9uIG9iamVjdC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3cgZGF0ZSBwaWNrZXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJEp1bXBCdXR0b24sIFBhcmFtcykgewogICAgICAgIHZhciBDdXJyZW50RGF0ZSA9ICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dldERhdGUnKSwKICAgICAgICAgICAgWWVhciA9IEN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWScpLAogICAgICAgICAgICBNb250aCA9IEN1cnJlbnREYXRlLmZvcm1hdCgnTScpOwoKICAgICAgICAkKCc8ZGl2IC8+JykucHJvcCgnaWQnLCAnRGF0ZXBpY2tlck92ZXJsYXknKQogICAgICAgICAgICAuYXBwZW5kVG8oJCgnYm9keScpKQogICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCwgUGFyYW1zKTsKCiAgICAgICAgJERhdGVwaWNrZXJPYmouZGF0ZXBpY2tlcignc2V0RGF0ZScsIEN1cnJlbnREYXRlLnRvRGF0ZSgpKQogICAgICAgICAgICAuY3NzKHsKICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KCRKdW1wQnV0dG9uLm9mZnNldCgpLmxlZnQgLSAkRGF0ZXBpY2tlck9iai5vdXRlcldpZHRoKCkgKyAkSnVtcEJ1dHRvbi5vdXRlcldpZHRoKCksIDEwKSwKICAgICAgICAgICAgICAgIHRvcDogcGFyc2VJbnQoJEp1bXBCdXR0b24ub2Zmc2V0KCkudG9wIC0gJERhdGVwaWNrZXJPYmoub3V0ZXJIZWlnaHQoKSArICRKdW1wQnV0dG9uLm91dGVySGVpZ2h0KCksIDEwKQogICAgICAgICAgICB9KS5mYWRlSW4oJ2Zhc3QnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDaGVja0RhdGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtEYXRlT2JqZWN0fSBEYXRlT2JqZWN0IC0gQSBKUyBkYXRlIG9iamVjdCB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gRmlyc3QgZWxlbWVudCBpcyBhbHdheXMgdHJ1ZSwgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBDU1MKICAgICAqICAgICAgICAgICAgICAgICAgY2xhc3MsIHRoaXJkIGVsZW1lbnQgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIGRhdGUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2sgaWYgZGF0ZSBoYXMgYW4gYXBwb2ludG1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENoZWNrRGF0ZShEYXRlT2JqZWN0KSB7CiAgICAgICAgdmFyIERhdGVNb21lbnQgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoRGF0ZU9iamVjdCksCiAgICAgICAgICAgIERheUFwcG9pbnRtZW50cyA9IEFwcG9pbnRtZW50RGF5c0NhY2hlW0RhdGVNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJyldLAogICAgICAgICAgICBEYXlDbGFzcyA9IERheUFwcG9pbnRtZW50cyA/ICdIaWdobGlnaHQnIDogJycsCiAgICAgICAgICAgIERheURlc2NyaXB0aW9uID0gRGF5QXBwb2ludG1lbnRzID8gRGF5QXBwb2ludG1lbnRzLnRvU3RyaW5nKCkgOiAnJzsKCiAgICAgICAgcmV0dXJuIFt0cnVlLCBEYXlDbGFzcywgRGF5RGVzY3JpcHRpb25dOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFwcG9pbnRtZW50RGF5cwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICREYXRlcGlja2VyT2JqIC0gRGF0ZXBpY2tlciBjb250cm9sIG9iamVjdC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gWWVhciAtIFNlbGVjdGVkIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IE1vbnRoIC0gU2VsZWN0ZWQgbW9udGggKDEtMTIpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2FjaGVzIHRoZSBsaXN0IG9mIGFwcG9pbnRtZW50IGRheXMgZm9yIGxhdGVyIHVzZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCwgUGFyYW1zKSB7CiAgICAgICAgdmFyIFN0YXJ0VGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5zdGFydE9mKCdtb250aCcpLAogICAgICAgICAgICBFbmRUaW1lID0gJC5mdWxsQ2FsZW5kYXIubW9tZW50KFllYXIgKyAnLScgKyBNb250aCwgJ1lZWVktTScpLmFkZCgxLCAnbW9udGhzJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuTGlzdEFjdGlvbiwKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5EYXlzU3ViYWN0b24sCiAgICAgICAgICAgICAgICBTdGFydFRpbWU6IFN0YXJ0VGltZS5mb3JtYXQoJ1lZWVktTU0tREQnKSwKICAgICAgICAgICAgICAgIEVuZFRpbWU6IEVuZFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJykKICAgICAgICAgICAgfTsKCiAgICAgICAgJERhdGVwaWNrZXJPYmouYWRkQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CiAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQgPSBmYWxzZTsKCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZSA9IFJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAkRGF0ZXBpY2tlck9iai5yZW1vdmVDbGFzcygnQUpBWExvYWRpbmcnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgZGF0ZSBwaWNrZXIgYmVjYXVzZSB0aGlzIGNhbGwgaXMgYXN5bmNocm9ub3VzCiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouZGF0ZXBpY2tlcigncmVmcmVzaCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwdWJsaWMKICAgICAqIEBuYW1lIFNob3dXYWl0aW5nRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2hvd3Mgd2FpdGluZyBkaWFsb2cuCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dXYWl0aW5nRGlhbG9nID0gZnVuY3Rpb24gKCkgewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCc8ZGl2IGNsYXNzPSJTcGFjaW5nIENlbnRlciI+PHNwYW4gY2xhc3M9IkFKQVhMb2FkZXIiIHRpdGxlPSInICsgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zTG9hZGluZycpICsgJyI+PC9zcGFuPjwvZGl2PicsIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc0xvYWRpbmcnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVwbGFjZUFwcG9pbnRtZW50SW5mb3JtYXRpb24KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBSZXBsYWNlSFRNTCAtIFN0cmluZyBjb250YWluaW5nICVwbGFjZWhvbGRlcnMlLgogICAgICogQHBhcmFtIHtPYmplY3R9IENhbEV2ZW50IC0gQ2FsZW5kYXIgYXBwb2ludG1lbnQgb2JqZWN0LgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBTdHJpbmcgd2l0aCByZXBsYWNlZCBwbGFjZWhvbGRlcnMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgUmVwbGFjZXMgcGxhY2Vob2xkZXJzIGluIHN1cHBsaWVkIHN0cmluZyB3aXRoIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluZm9ybWF0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBSZXBsYWNlQXBwb2ludG1lbnRJbmZvcm1hdGlvbihSZXBsYWNlSFRNTCwgQ2FsRXZlbnQpIHsKICAgICAgICB2YXIgUGxhY2Vob2xkZXIsCiAgICAgICAgICAgIFNlYXJjaFBsYWNlaG9sZGVyLAogICAgICAgICAgICBSZXBsYWNlVmFsdWU7CgogICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgcHJvcGVydGllcwogICAgICAgIGZvciAoUGxhY2Vob2xkZXIgaW4gQ2FsRXZlbnQpIHsKICAgICAgICAgICAgU2VhcmNoUGxhY2Vob2xkZXIgPSBuZXcgUmVnRXhwKCclJyArIFBsYWNlaG9sZGVyICsgJyUnLCAnZycpOwogICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSBDYWxFdmVudFtQbGFjZWhvbGRlcl07CgogICAgICAgICAgICAvLyBTcGVjaWFsIHByb3BlcnRpZXMKICAgICAgICAgICAgaWYgKFBsYWNlaG9sZGVyID09PSAncmVjdXJyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChQbGFjZWhvbGRlciA9PT0gJ3N0YXJ0JyB8fCBQbGFjZWhvbGRlciA9PT0gJ2VuZCcpIHsKICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUGxhY2Vob2xkZXIgPT09ICdlbmQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChSZXBsYWNlVmFsdWUpLnN1YnRyYWN0KDEsICdkYXknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gJC5mdWxsQ2FsZW5kYXIubW9tZW50KFJlcGxhY2VWYWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChSZXBsYWNlVmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKFBsYWNlaG9sZGVyID09PSAncGx1Z2luRGF0YScpIHsKICAgICAgICAgICAgICAgICQuZWFjaChDYWxFdmVudC5wbHVnaW5EYXRhLCBmdW5jdGlvbiAoS2V5LCBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0gVmFsdWUucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7CiAgICAgICAgICAgICAgICAgICAgUmVwbGFjZUhUTUwgPSBSZXBsYWNlSFRNTC5yZXBsYWNlKCclJyArIEtleSArICclJywgVmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGVmYXVsdCBKU09OIHZhbHVlcwogICAgICAgICAgICBpZiAoUmVwbGFjZVZhbHVlID09PSBudWxsIHx8IFJlcGxhY2VWYWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIFJlcGxhY2VWYWx1ZSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgaWYgKFJlcGxhY2VWYWx1ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgUmVwbGFjZVZhbHVlID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zWWVzJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlcGxhY2UgbmV3bGluZXMKICAgICAgICAgICAgaWYgKFJlcGxhY2VWYWx1ZS5yZXBsYWNlKSB7CiAgICAgICAgICAgICAgICBSZXBsYWNlVmFsdWUgPSBSZXBsYWNlVmFsdWUucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlcGxhY2UgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgIFJlcGxhY2VIVE1MID0gUmVwbGFjZUhUTUwucmVwbGFjZShTZWFyY2hQbGFjZWhvbGRlciwgUmVwbGFjZVZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBSZXBsYWNlSFRNTDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwdWJsaWMKICAgICAqIEBuYW1lIE9wZW5FZGl0RGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGNvbmZpZ3VyYXRpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGlhbG9nVGV4dCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBkaWFsb2dzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0LkVkaXRUaXRsZSAtIFRpdGxlIG9mIHRoZSBhZGQvZWRpdCBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZVRpdGxlIC0gVGl0bGUgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUZXh0IC0gVGV4dCBvZiB0aGUgb2NjdXJyZW5jZSBkaWFsb2cuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUFsbCAtIFRleHQgb2YgJ2FsbCcgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcyAtIFRleHQgb2YgJ2p1c3QgdGhpcycgYnV0dG9uIGluIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcyAtIEFycmF5IGNvbnRhaW5pbmcgbmFtZXMgb2YgdGhlIGNhbGxiYWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgYWN0aW9uLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0TWFza1N1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgbWFzayBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQXBwb2ludG1lbnREYXRhIC0gSGFzaCB3aXRoIGFwcG9pbnRtZW50IGRhdGEuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLlN0YXJ0IC0gTW9tZW50IG9iamVjdCB3aXRoIHN0YXJ0IGRhdGUvdGltZS4KICAgICAqIEBwYXJhbSB7TW9tZW50fSBBcHBvaW50bWVudERhdGEuRW5kIC0gTW9tZW50IG9iamVjdCB3aXRoIGVuZCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50IC0gQ2FsZW5kYXIgZXZlbnQgb2JqZWN0IChGdWxsQ2FsZW5kYXIpLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZSAtIENhbGVuZGFyIHJlc291cmNlIG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBvcGVucyB0aGUgYXBwb2ludG1lbnQgZGlhbG9nIGFmdGVyIHNlbGVjdGluZyBhIHRpbWUgcGVyaW9kIG9yIGFuIGFwcG9pbnRtZW50LgogICAgICovCiAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyA9IGZ1bmN0aW9uIChQYXJhbXMsIEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICBBY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdEFjdGlvbiA6ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0TWFza1N1YmFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuRWRpdE1hc2tTdWJhY3Rpb24gOiAnRWRpdE1hc2snLAogICAgICAgICAgICBBcHBvaW50bWVudElEOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuaWQgOiBudWxsLAogICAgICAgICAgICBTdGFydFllYXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQueWVhcigpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRNb250aDogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC5tb250aCgpICsgMSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0RGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LmRhdGUoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0SG91cjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC5ob3VyKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydE1pbnV0ZTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC5taW51dGUoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZFllYXI6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLnllYXIoKSA6IG51bGwsCiAgICAgICAgICAgIEVuZE1vbnRoOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5tb250aCgpICsgMSA6IG51bGwsCiAgICAgICAgICAgIEVuZERheTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQuZGF0ZSgpIDogbnVsbCwKICAgICAgICAgICAgRW5kSG91cjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQuaG91cigpIDogbnVsbCwKICAgICAgICAgICAgRW5kTWludXRlOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5taW51dGUoKSA6IG51bGwsCiAgICAgICAgICAgIEFsbERheTogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IChBcHBvaW50bWVudERhdGEuRW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJykgOiBudWxsLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZSA/IFsgQXBwb2ludG1lbnREYXRhLlJlc291cmNlLlRlYW1JRCBdIDogbnVsbCwKICAgICAgICAgICAgUmVzb3VyY2VJRDogQXBwb2ludG1lbnREYXRhLlJlc291cmNlID8gWyBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UuaWQgXSA6IG51bGwsCiAgICAgICAgICAgIFBsdWdpbktleTogQXBwb2ludG1lbnREYXRhLlBsdWdpbktleSA/IEFwcG9pbnRtZW50RGF0YS5QbHVnaW5LZXkgOiBudWxsLAogICAgICAgICAgICBTZWFyY2g6IEFwcG9pbnRtZW50RGF0YS5TZWFyY2ggPyBBcHBvaW50bWVudERhdGEuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgT2JqZWN0SUQ6IEFwcG9pbnRtZW50RGF0YS5PYmplY3RJRCA/IEFwcG9pbnRtZW50RGF0YS5PYmplY3RJRCA6IG51bGwKICAgICAgICB9OwoKICAgICAgICAvLyBNYWtlIGVuZCB0aW1lIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBpbmNsdXNpdmUKICAgICAgICBpZiAoRGF0YS5BbGxEYXkgJiYgRGF0YS5BbGxEYXkgPT09ICcxJykgewogICAgICAgICAgICBBcHBvaW50bWVudERhdGEuRW5kLnN1YnRyYWN0KDEsICdkYXknKTsKICAgICAgICAgICAgRGF0YS5FbmRZZWFyID0gQXBwb2ludG1lbnREYXRhLkVuZC55ZWFyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTW9udGggPSBBcHBvaW50bWVudERhdGEuRW5kLm1vbnRoKCkgKyAxOwogICAgICAgICAgICBEYXRhLkVuZERheSA9IEFwcG9pbnRtZW50RGF0YS5FbmQuZGF0ZSgpOwogICAgICAgICAgICBEYXRhLkVuZEhvdXIgPSBBcHBvaW50bWVudERhdGEuRW5kLmhvdXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNaW51dGUgPSBBcHBvaW50bWVudERhdGEuRW5kLm1pbnV0ZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gRWRpdERpYWxvZygpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhIVE1MLCBQYXJhbXMuRGlhbG9nVGV4dC5FZGl0VGl0bGUsICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICB9LCAnaHRtbCcKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGVhdGluZyBldmVudAogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgJiYgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgVGl0bGU6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSwKICAgICAgICAgICAgICAgIEhUTUw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUZXh0LAogICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICBDbG9zZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkVzY2FwZTogdHJ1ZSwKICAgICAgICAgICAgICAgIFBvc2l0aW9uVG9wOiAnMjAlJywKICAgICAgICAgICAgICAgIFBvc2l0aW9uTGVmdDogJ0NlbnRlcicsCiAgICAgICAgICAgICAgICBCdXR0b25zOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0RGlhbG9nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VKdXN0VGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdDYWxsRm9yQWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IEVkaXREaWFsb2cKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0Nsb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0LkNsb3NlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBFZGl0RGlhbG9nKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFVwZGF0ZUFwcG9pbnRtZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGNvbmZpZ3VyYXRpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuRGlhbG9nVGV4dCAtIEFycmF5IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBzdHJpbmdzIGZvciBkaWFsb2dzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSAtIFRpdGxlIG9mIHRoZSBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlVGV4dCAtIFRleHQgb2YgdGhlIG9jY3VycmVuY2UgZGlhbG9nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VBbGwgLSBUZXh0IG9mICdhbGwnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuRGlhbG9nVGV4dC5PY2N1cnJlbmNlSnVzdFRoaXMgLSBUZXh0IG9mICdqdXN0IHRoaXMnIGJ1dHRvbiBpbiBvY2N1cnJlbmNlIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuRWRpdFN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIGVkaXQgc3ViYWN0aW9uLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBhcHBvaW50bWVudCB3aXRoIHN1cHBsaWVkIGRhdGEuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFVwZGF0ZUFwcG9pbnRtZW50KFBhcmFtcywgQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRTdWJhY3Rpb24gOiAnRWRpdEFwcG9pbnRtZW50JywKICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmlkLAogICAgICAgICAgICBTdGFydFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC55ZWFyKCksCiAgICAgICAgICAgIFN0YXJ0TW9udGg6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5tb250aCgpICsgMSwKICAgICAgICAgICAgU3RhcnREYXk6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5kYXRlKCksCiAgICAgICAgICAgIFN0YXJ0SG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmhvdXIoKSwKICAgICAgICAgICAgU3RhcnRNaW51dGU6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5taW51dGUoKSwKICAgICAgICAgICAgRW5kWWVhcjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC55ZWFyKCksCiAgICAgICAgICAgIEVuZE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1vbnRoKCkgKyAxLAogICAgICAgICAgICBFbmREYXk6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuZGF0ZSgpLAogICAgICAgICAgICBFbmRIb3VyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhvdXIoKSwKICAgICAgICAgICAgRW5kTWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLm1pbnV0ZSgpLAogICAgICAgICAgICBBbGxEYXk6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuaGFzVGltZSgpID8gJzAnIDogJzEnLAogICAgICAgICAgICBSZWN1cnJpbmc6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZWN1cnJpbmcgPyAnMScgOiAnMCcsCiAgICAgICAgICAgIFRlYW1JRDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgPyBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQudGVhbUlkcyA6IHVuZGVmaW5lZCwKICAgICAgICAgICAgUmVzb3VyY2VJRDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWRzIDoKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkID8gWyBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCBdIDogdW5kZWZpbmVkCiAgICAgICAgfTsKCiAgICAgICAgLy8gQXNzaWduZWQgcmVzb3VyY2UgZGlkbid0IGNoYW5nZQogICAgICAgIGlmICgKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQKICAgICAgICAgICAgJiYgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgJiYgJC5pbkFycmF5KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5yZXNvdXJjZUlkcwogICAgICAgICAgICApICE9PSAtMQogICAgICAgICkgewogICAgICAgICAgICBEYXRhLlJlc291cmNlSUQgPSBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5yZXNvdXJjZUlkczsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIFVwZGF0ZSgpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUmV2ZXJ0RnVuYygpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIE1ha2UgZW5kIHRpbWUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzIGluY2x1c2l2ZQogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuc3VidHJhY3QoMSwgJ2RheScpOwogICAgICAgICAgICBEYXRhLkVuZFllYXIgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLnllYXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNb250aCA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQubW9udGgoKSArIDE7CiAgICAgICAgICAgIERhdGEuRW5kRGF5ID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kYXRlKCk7CiAgICAgICAgICAgIERhdGEuRW5kSG91ciA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQuaG91cigpOwogICAgICAgICAgICBEYXRhLkVuZE1pbnV0ZSA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQubWludXRlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXBlYXRpbmcgZXZlbnQKICAgICAgICBpZiAoQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnBhcmVudElkKSB7CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgVGl0bGU6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUaXRsZSwKICAgICAgICAgICAgICAgIEhUTUw6IFBhcmFtcy5EaWFsb2dUZXh0Lk9jY3VycmVuY2VUZXh0LAogICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICBDbG9zZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkVzY2FwZTogdHJ1ZSwKICAgICAgICAgICAgICAgIFBvc2l0aW9uVG9wOiAnMjAlJywKICAgICAgICAgICAgICAgIFBvc2l0aW9uTGVmdDogJ0NlbnRlcicsCiAgICAgICAgICAgICAgICBCdXR0b25zOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlJlY3VycmluZyA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlRGVsdGEgPSBBcHBvaW50bWVudERhdGEuRGVsdGEuYXNTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnQm90aCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnU3RhcnRUaW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gRGF0YS5VcGRhdGVEZWx0YSAqIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnRW5kVGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogUGFyYW1zLkRpYWxvZ1RleHQuT2NjdXJyZW5jZUp1c3RUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0Nsb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IFBhcmFtcy5EaWFsb2dUZXh0LkNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUmV2ZXJ0RnVuYygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2FsZW5kYXJTd2l0Y2hJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJENhbGVuZGFyU3dpdGNoIC0gY2FsZW5kYXIgY2hlY2tib3ggZWxlbWVudC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gLSBOYW1lIG9mIHRoZSBzY3JlZW4gKENhbGVuZGFyT3ZlcnZpZXd8UmVzb3VyY2VPdmVydmlldykuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zLkNhbGVuZGFycyAtIE9iamVjdCB3aXRoIGNhbGVuZGFyIHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzb3VyY2VzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3RzfSBQYXJhbXMuQ2FsZW5kYXJzLlN3aXRjaGVzIC0gQXJyYXkgb2YgY2FsZW5kYXIgc3dpdGNoIGVsZW1lbnRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3RzfSBQYXJhbXMuQ2FsZW5kYXJzLkxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIGNhbGVuZGFyIHN3aXRjaGVzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNhbGVuZGFyIGNoZWNrYm94IGJlaGF2aW9yIGFuZCBsb2FkcyBtdWx0aXBsZSBjYWxlbmRhcnMgdG8gdGhlCiAgICAgKiAgICAgIEZ1bGxDYWxlbmRhciBjb250cm9sLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclN3aXRjaEluaXQoJENhbGVuZGFyU3dpdGNoLCBQYXJhbXMpIHsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmFibGVkIHNvdXJjZXMKICAgICAgICBpZiAoJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ2FkZEV2ZW50U291cmNlJywgUGFyYW1zLkNhbGVuZGFycy5Tb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgICRDYWxlbmRhclN3aXRjaC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXQ6Y2hlY2tlZCcpLmxlbmd0aCA+IFBhcmFtcy5DYWxlbmRhcnMuTGltaXQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0FsZXJ0KENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Rvb01hbnlDYWxlbmRhcnNIZWFkbGluZScpLCBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNUb29NYW55Q2FsZW5kYXJzVGV4dCcpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyU3dpdGNoU291cmNlKCRDYWxlbmRhclN3aXRjaCwgUGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoU291cmNlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJENhbGVuZGFyU3dpdGNoIC0gY2FsZW5kYXIgY2hlY2tib3ggZWxlbWVudC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQYXJhbXMgLSBIYXNoIHdpdGggZGlmZmVyZW50IGNvbmZpZyBvcHRpb25zLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gLSBOYW1lIG9mIHRoZSBzY3JlZW4gKENhbGVuZGFyT3ZlcnZpZXd8UmVzb3VyY2VPdmVydmlldykuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zLkNhbGVuZGFycyAtIE9iamVjdCB3aXRoIGNhbGVuZGFyIHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXMgLSBBcnJheSBvZiBjYWxlbmRhciBzb3VyY2VzLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGVuYWJsZXMvZGlzYWJsZXMgY2FsZW5kYXIgc291cmNlIGluIEZ1bGxDYWxlbmRhciBjb250cm9sIGFuZCBzdG9yZXMKICAgICAqICAgICAgc2VsZWN0aW9uIHRvIHVzZXIgcHJlZmVyZW5jZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU3dpdGNoU291cmNlKCRDYWxlbmRhclN3aXRjaCwgUGFyYW1zKSB7CiAgICAgICAgdmFyIENhbGVuZGFyU2VsZWN0aW9uID0gW107CgogICAgICAgIC8vIFNob3cvaGlkZSB0aGUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIFBhcmFtcy5DYWxlbmRhcnMuU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVtb3ZlRXZlbnRTb3VyY2UnLCBQYXJhbXMuQ2FsZW5kYXJzLlNvdXJjZXNbJENhbGVuZGFyU3dpdGNoLmRhdGEoJ2lkJyldKTsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBhbGwgY2hlY2tlZCBjYWxlbmRhcnMKICAgICAgICAkLmVhY2goJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0OmNoZWNrZWQnKSwgZnVuY3Rpb24gKEluZGV4LCBFbGVtZW50KSB7CiAgICAgICAgICAgIENhbGVuZGFyU2VsZWN0aW9uLnB1c2goJChFbGVtZW50KS5kYXRhKCdpZCcpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU3RvcmUgc2VsZWN0aW9uIGluIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogUGFyYW1zLkNoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IFBhcmFtcy5PdmVydmlld1NjcmVlbiA/IFBhcmFtcy5PdmVydmlld1NjcmVlbiA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIENhbGVuZGFyU2VsZWN0aW9uOiBKU09OLnN0cmluZ2lmeShDYWxlbmRhclNlbGVjdGlvbikKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBMb2NhdGlvbkxpbmtJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uT2JqIC0gbG9jYXRpb24gZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uTGlua3MgLSBsb2NhdGlvbiBsaW5rcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBsb2NhdGlvbiBsaW5rIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0ID0gZnVuY3Rpb24gKCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpIHsKICAgICAgICB2YXIgTG9jYXRpb25WYWx1ZSA9ICRMb2NhdGlvbk9iai52YWwoKSB8fCAkTG9jYXRpb25PYmoudGV4dCgpOwoKICAgICAgICAkTG9jYXRpb25MaW5rcy5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICB2YXIgJExpbmtPYmogPSAkKEVsZW1lbnQpLAogICAgICAgICAgICAgICAgQmFzZVVSTCAgPSAkTGlua09iai5kYXRhKCdiYXNlVXJsJyk7CgogICAgICAgICAgICAvLyBVcGRhdGUgbGluayBVUkwgYW5kIHNob3cgaXQgaWYgbG9jYXRpb24gaXMgc2V0CiAgICAgICAgICAgIGlmIChMb2NhdGlvblZhbHVlLmxlbmd0aCA+IDAgJiYgTG9jYXRpb25WYWx1ZSAhPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5hdHRyKCdocmVmJywgQmFzZVVSTCArIGVuY29kZVVSSUNvbXBvbmVudChMb2NhdGlvblZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAuZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaGlkZSB0aGUgbGluawogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMaW5rT2JqLmZhZGVPdXQoJ2Zhc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBSZWdpc3RlciBrZXkgdXAgZXZlbnQgaGFuZGxlcgogICAgICAgICRMb2NhdGlvbk9iai5vZmYoJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbigna2V5dXAuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0KCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgQWxsRGF5SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRBbGxEYXkgLSBhbGwgZGF5IGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIGRheSBjaGVja2JveCBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCA9IGZ1bmN0aW9uICgkQWxsRGF5KSB7CiAgICAgICAgaWYgKCQoJyNTdGFydE1vbnRoOmRpc2FibGVkJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIHN0YXJ0IGhvdXIvbWludXRlIGFuZCBjb21wbGV0ZSBlbmQgdGltZQogICAgICAgIGlmICgkQWxsRGF5LnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykudmFsKCcwJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpCiAgICAgICAgICAgICAgICAucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQWxsRGF5Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkQWxsRGF5KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFJlY3VycmluZ0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVjdXJyaW5nIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmluZyAtIGZpZWxkIHdpdGggcmVjdXJyaW5nIGZsYWcuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVHlwZSAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgdHlwZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUgLSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC0gQ3VzdG9tIHR5cGUgZHJvcC1kb3duCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0IC0gaW50ZXJ2YWwgdGV4dAogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAtIGNvbnRhaW5zIHdlZWsgZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLSBjb250YWlucyBtb250aCBkYXlzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC0gY29udGFpbnMgbW9udGhzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYgLSBsYXllciB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0IC0gZHJvcCBkb3duIHdpdGggcmVjdXJyZW5jZSBsaW1pdCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSBjb3VudCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSB1bnRpbCBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkgLSBzZWxlY3QgZmllbGQgZm9yIHJlY2N1cmVuY2UgdW50aWwgZGF5LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJlY3VycmVuY2UgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewoKICAgICAgICBmdW5jdGlvbiBSZWNJbml0KEZpZWxkcykgewogICAgICAgICAgICB2YXIgRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gW10sCiAgICAgICAgICAgICAgICBNb250aHMgPSBbXSwKICAgICAgICAgICAgICAgIEluZGV4OwoKICAgICAgICAgICAgaWYgKCQoJ2lucHV0I0RheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIERheXMgPSAkKCdpbnB1dCNEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aERheXMgPSAkKCdpbnB1dCNNb250aERheXMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNNb250aERheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIE1vbnRocyA9ICQoJ2lucHV0I01vbnRocycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9IiArIERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhEYXlzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9IiArIE1vbnRoRGF5c1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IE1vbnRocy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChNb250aHNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aHNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlVHlwZS52YWwoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gJ0N1c3RvbScpIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tRGFpbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0RGF5JykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21XZWVrbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFdlZWsnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbU1vbnRobHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dE1vbnRoJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21ZZWFybHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFllYXInKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwoKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdik7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LnJlbW92ZUNsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0KEZpZWxkcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFJlY0luaXQoRmllbGRzKTsKICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTm90aWZpY2F0aW9uSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byByZW1pbmRlciBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb24gLSBkcm9wIGRvd24gd2l0aCBzeXN0ZW0gbm90aWZpY2F0aW9uIHNlbGVjdGlvbi4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiAtIGN1c3RvbSBzZWxlY3Rpb24gb2Ygc3lzdGVtIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIHJlbWluZGVyIHNlY3Rpb24gYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQgPSBmdW5jdGlvbiAoRmllbGRzKSB7CiAgICAgICAgdmFyIE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiA9IEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LmF0dHIoJ2lkJyk7CgogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvblRlbXBsYXRlLnZhbCgpICE9PSAnQ3VzdG9tJykgewoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgY3VzdG9tIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gY3VzdG9tIGZpZWxkIGlzIG5lZWRlZAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5zaG93KCk7CgogICAgICAgICAgICAvLyBpbml0aWFsaXplIG1vZGVybiBmaWVsZHMgb24gY3VzdG9tIHNlbGVjdGlvbgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXRTZWxlY3QoJCgnc2VsZWN0Lk1vZGVybml6ZScpKTsKICAgICAgICB9CgogICAgICAgIC8vIGRpc2FibGUgZW5hYmxlIHRoZSBkaWZmZXJlbnQgY3VzdG9tIGZpZWxkcwogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcpKSB7CgogICAgICAgICAgICAvLyBlbmFibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGlucHV0CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIElucHV0RmllbGRzIGJ1ZyBpbiB0aGUgZnJhbWV3b3JrIChkaXNhYmxlZCBhdHRyaWJ1dGUgbm90IGNoZWNrZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24pCiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5EZWFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2KSk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFRlYW1Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFRlYW1JRE9iaiAtIGZpZWxkIHdpdGggbGlzdCBvZiB0ZWFtcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUmVzb3VyY2VJRE9iaiAtIGZpZWxkIHdpdGggbGlzdCBvZiByZXNvdXJjZXMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ2hhbGxlbmdlVG9rZW4gLSBVc2VyIGNoYWxsZW5nZSB0b2tlbi4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkVGVhbVZhbHVlT2JqIC0gZmllbGQgd2l0aCByZWFkIG9ubHkgdmFsdWVzIGZvciB0ZWFtLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRSZXNvdXJjZVZhbHVlT2JqIC0gZmllbGQgd2l0aCByZWFkIG9ubHkgdmFsdWVzIGZvciByZXNvdXJjZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGVhbSBmaWVsZHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLlRlYW1Jbml0ID0gZnVuY3Rpb24gKCRUZWFtSURPYmosICRSZXNvdXJjZUlET2JqLCBDaGFsbGVuZ2VUb2tlbiwgJFRlYW1WYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmopIHsKICAgICAgICAkVGVhbUlET2JqLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVGVhbVVzZXJMaXN0JywKICAgICAgICAgICAgICAgIFRlYW1JRDogJFRlYW1JRE9iai52YWwoKQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgVG9nZ2xlQUpBWExvYWRlcigkUmVzb3VyY2VJRE9iaiwgdHJ1ZSk7CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgU2VsZWN0ZWRJRCA9ICRSZXNvdXJjZUlET2JqLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5UZWFtVXNlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlc291cmNlSURPYmouZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3BvbnNlLlRlYW1Vc2VyTGlzdCwgZnVuY3Rpb24gKEluZGV4LCBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE5ld09wdGlvbiA9IG5ldyBPcHRpb24oVmFsdWUsIEluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgb3B0aW9uIHRleHQsIGJlY2F1c2Ugb2Ygd3JvbmcgaHRtbCBxdW90aW5nIG9mIHRleHQgY29udGVudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChUaGlzIGlzIG5lZWRlZCBmb3IgSUUuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLmlubmVySFRNTCA9IFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2VsZWN0ZWRJRCAmJiBTZWxlY3RlZElELmluZGV4T2YoSW5kZXgpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdPcHRpb24uc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmFwcGVuZChOZXdPcHRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgY3VzdG9tIHJlZHJhdyBldmVudCBmb3IgSW5wdXRGaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgJFJlc291cmNlSURPYmoudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVG9nZ2xlQUpBWExvYWRlcigkUmVzb3VyY2VJRE9iaiwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICBmdW5jdGlvbiBDb2xsYXBzZVZhbHVlcygkVmFsdWVPYmosIFZhbHVlcykgewogICAgICAgICAgICAkVmFsdWVPYmouaHRtbCgnJyk7CiAgICAgICAgICAgICQuZWFjaChWYWx1ZXMsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciBDb3VudCA9IFZhbHVlcy5sZW5ndGg7CgogICAgICAgICAgICAgICAgaWYgKEluZGV4IDwgMikgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZU9iai5odG1sKCRWYWx1ZU9iai5odG1sKCkgKyBWYWx1ZSArICc8YnI+Jyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFZhbHVlcy5zcGxpY2UoLUNvdW50LCAyKTsKICAgICAgICAgICAgICAgICAgICAkKCc8YSAvPicpLmF0dHIoJ2hyZWYnLCAnIycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnRGlhbG9nVG9vbHRpcExpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dCgnKycgKyAoQ291bnQtMikgKyAnIG1vcmUnKQogICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJFRvb2x0aXBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEhUTUwgPSAnPHA+JyArIFZhbHVlcy5qb2luKCc8YnI+JykgKyAnPC9wPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlTGVmdCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZVRvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBleGlzdGluZyB0b29sdGlwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZ1Rvb2x0aXAnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRXZlbnQucGFnZVggfHwgRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEV2ZW50LnBhZ2VZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFdmVudC5jbGllbnRYIHx8IEV2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZICs9IDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRvb2x0aXAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdBcHBvaW50bWVudFRvb2x0aXAgRGlhbG9nVG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKFRvb2x0aXBIVE1MKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ3otaW5kZXgnLCA0MDAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ3dpZHRoJywgJ2F1dG8nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSB0b3AgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uID0gUG9zWSArICRUb29sdGlwT2JqLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZID0gUG9zWSAtICRUb29sdGlwT2JqLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygndG9wJywgUG9zWSArICdweCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSBsZWZ0IHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiA9IFBvc1ggKyAkVG9vbHRpcE9iai53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IFBvc1ggLSAkVG9vbHRpcE9iai53aWR0aCgpIC0gMzA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCdsZWZ0JywgUG9zWCArICdweCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIHRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZhZGVJbignZmFzdCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRvb2x0aXAgb24gYW55IG91dHNpZGUgY2xpY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJChFdmVudC50YXJnZXQpLmNsb3Nlc3QoJy5EaWFsb2dUb29sdGlwTGluaycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZ1Rvb2x0aXAnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkVmFsdWVPYmopOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDb2xsYXBzZSByZWFkIG9ubHkgdmFsdWVzCiAgICAgICAgaWYgKCRUZWFtVmFsdWVPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIENvbGxhcHNlVmFsdWVzKCRUZWFtVmFsdWVPYmosICRUZWFtVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgICAgICBpZiAoJFJlc291cmNlVmFsdWVPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIENvbGxhcHNlVmFsdWVzKCRSZXNvdXJjZVZhbHVlT2JqLCAkUmVzb3VyY2VWYWx1ZU9iai5odG1sKCkuc3BsaXQoJzxicj4nKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU2V0dGluZ3NJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUGFyYW1zIC0gSGFzaCB3aXRoIGRpZmZlcmVudCBjb25maWcgb3B0aW9ucy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MgLSBBcnJheSBjb250YWluaW5nIG5hbWVzIG9mIHRoZSBjYWxsYmFja3MuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gLSBOYW1lIG9mIHRoZSBlZGl0IGFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiAtIE5hbWUgb2YgdGhlIHByZWZlcmVuY2VzIHN1YmFjdGlvbi4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFBhcmFtcy5PdmVydmlld1NjcmVlbiAtIE5hbWUgb2YgdGhlIHNjcmVlbiAoUmVzb3VyY2VPdmVydmlldykuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NCdXR0b24gLSBJRCBvZiB0aGUgc2V0dGluZ3MgYnV0dG9uLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5DYWxlbmRhclNldHRpbmdzRGlhbG9nQ29udGFpbmVyIC0gSUQgb2YgdGhlIHNldHRpbmdzIGRpYWxvZyBjb250YWluZXIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUGFyYW1zLkNhbGVuZGFyU2V0dGluZ3NTaG93IC0gU2hvdyB0aGUgc2V0dGluZ3MgZGlhbG9nIGltbWVkaWF0ZWx5LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNhbGVuZGFyIHNldHRpbmdzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclNldHRpbmdzSW5pdChQYXJhbXMpIHsKICAgICAgICB2YXIgJENhbGVuZGFyU2V0dGluZ3NPYmogPSAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5DYWxlbmRhclNldHRpbmdzQnV0dG9uKSksCiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzRGlhbG9nID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lcikpOwoKICAgICAgICAvLyBDYWxlbmRhciBzZXR0aW5ncyBidXR0b24KICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZywgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2V0dGluZ3MnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTYXZlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJFNob3duQXBwb2ludG1lbnRzID0gJCgnI1Nob3duQXBwb2ludG1lbnRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IFBhcmFtcy5DaGFsbGVuZ2VUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLkVkaXRBY3Rpb24gOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA/IFBhcmFtcy5DYWxsYmFja3MuUHJlZlN1YmFjdGlvbiA6ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duQXBwb2ludG1lbnRzOiAkU2hvd25BcHBvaW50bWVudHMudmFsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRGVidWcuTG9nKCdFcnJvciB1cGRhdGluZyB1c2VyIHByZWZlcmVuY2VzIScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJ0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50JyArIChQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gPyBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gOiAnQ2FsZW5kYXJPdmVydmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLCB0cnVlKTsKCiAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAvLyBTaG93IHNldHRpbmdzIGRpYWxvZyBpbW1lZGlhdGVseQogICAgICAgIGlmIChQYXJhbXMuQ2FsZW5kYXJTZXR0aW5nc1Nob3cpIHsKICAgICAgICAgICAgJENhbGVuZGFyU2V0dGluZ3NPYmoudHJpZ2dlcignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBSZXNvdXJjZVNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcyAtIEhhc2ggd2l0aCBkaWZmZXJlbnQgY29uZmlnIG9wdGlvbnMuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzIC0gQXJyYXkgY29udGFpbmluZyBuYW1lcyBvZiB0aGUgY2FsbGJhY2tzLgogICAgICogQHBhcmFtIHtBcnJheX0gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIC0gTmFtZSBvZiB0aGUgZWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gLSBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlcyBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0FycmF5fSBQYXJhbXMuT3ZlcnZpZXdTY3JlZW4gLSBOYW1lIG9mIHRoZSBzY3JlZW4gKFJlc291cmNlT3ZlcnZpZXcpLgogICAgICogQHBhcmFtIHtPYmplY3R9IFBhcmFtcy5SZXNvdXJjZXMgLSBPYmplY3Qgd2l0aCByZXNvdXJjZXMgcGFyYW1ldGVycy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NCdXR0b24gLSBJRCBvZiB0aGUgZWxlbWVudCBmb3Igc2V0dGluZ3MgYnV0dG9uLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lciAtIElEIG9mIHRoZSBlbGVtZW50IHdpdGggZGlhbG9nIGNvbnRlbnQuCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFBhcmFtcy5SZXNvdXJjZXMuUmVzdG9yZURlZmF1bHRTZXR0aW5ncyAtIHdoZXRoZXIgdG8gZGlzcGxheSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZXNvdXJjZSBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gUmVzb3VyY2VTZXR0aW5nc0luaXQoUGFyYW1zKSB7CiAgICAgICAgdmFyICRSZXNvdXJjZVNldHRpbmdzT2JqID0gJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQYXJhbXMuUmVzb3VyY2VzLlJlc291cmNlU2V0dGluZ3NCdXR0b24pKSwKICAgICAgICAgICAgJFJlc291cmNlU2V0dGluZ3NEaWFsb2cgPSAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBhcmFtcy5SZXNvdXJjZXMuUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0NvbnRhaW5lcikpOwoKICAgICAgICAvLyBSZXNvdXJjZSBzZXR0aW5ncyBidXR0b24KICAgICAgICAkUmVzb3VyY2VTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkUmVzb3VyY2VTZXR0aW5nc0RpYWxvZywgQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyVHJhbnNsYXRpb25zU2V0dGluZ3MnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJUcmFuc2xhdGlvbnNTYXZlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJExpc3RDb250YWluZXIgPSAkKCcuQWxsb2NhdGlvbkxpc3RDb250YWluZXInKS5maW5kKCcuQXNzaWduZWRGaWVsZHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93blJlc291cmNlcyA9IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBQYXJhbXMuQ2hhbGxlbmdlVG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uID8gUGFyYW1zLkNhbGxiYWNrcy5FZGl0QWN0aW9uIDogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gPyBQYXJhbXMuQ2FsbGJhY2tzLlByZWZTdWJhY3Rpb24gOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogUGFyYW1zLk92ZXJ2aWV3U2NyZWVuID8gUGFyYW1zLk92ZXJ2aWV3U2NyZWVuIDogJ1Jlc291cmNlT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtSUQ6ICQoJyNUZWFtJykudmFsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkTGlzdENvbnRhaW5lcikgJiYgJExpc3RDb250YWluZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKCRMaXN0Q29udGFpbmVyLmZpbmQoJ2xpJyksIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93blJlc291cmNlcy5wdXNoKCQodGhpcykuYXR0cignZGF0YS1maWVsZG5hbWUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlNob3duUmVzb3VyY2VzID0gSlNPTi5zdHJpbmdpZnkoU2hvd25SZXNvdXJjZXMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuRGVidWcuTG9nKCdFcnJvciB1cGRhdGluZyB1c2VyIHByZWZlcmVuY2VzIScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLCB0cnVlKTsKCiAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgQ29yZS5BZ2VudC5UYWJsZUZpbHRlcnMuU2V0QWxsb2NhdGlvbkxpc3QoKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5ncyA9IFBhcmFtcy5SZXNvdXJjZXMuUmVzdG9yZURlZmF1bHRTZXR0aW5nczsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQWRkcyByZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MgYnV0dG9uICh0cmFzaCBjYW4pIHRvIHZpZXcgYW5kIGluaXRpYWxpemVzIGl0cyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKSB7CiAgICAgICAgdmFyICRSZXN0b3JlU2V0dGluZ3NPYmo7CgogICAgICAgIC8vIFNraXAgaWYgYnV0dG9uIGlzIG5vdCBuZWVkZWQgb3Igd2UgYWxyZWFkeSBoYXZlIG9uZS4KICAgICAgICBpZiAoCiAgICAgICAgICAgICFSZXN0b3JlRGVmYXVsdFNldHRpbmdzCiAgICAgICAgICAgIHx8ICQoJyNSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykubGVuZ3RoID4gMAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBDcmVhdGUgdGhlIGJ1dHRvbi4KICAgICAgICAkUmVzdG9yZVNldHRpbmdzT2JqID0gJCgnPGEgLz4nKS5hdHRyKCdpZCcsICdSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykKICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCAnIycpCiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDYWxlbmRhclRyYW5zbGF0aW9uc1Jlc3RvcmUnKSkKICAgICAgICAgICAgLmFwcGVuZCgkKCc8aSAvPicpLmFkZENsYXNzKCdmYSBmYS10cmFzaCcpKTsKCiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBjb2x1bW4gaGVhZGVyLgogICAgICAgICQoJ3RyLmZjLXN1cGVyICsgdHIgLmZjLWNlbGwtY29udGVudCcpLmFwcGVuZCgkUmVzdG9yZVNldHRpbmdzT2JqKTsKCiAgICAgICAgLy8gUmVnaXN0ZXIgY2xpY2sgaGFuZGxlci4KICAgICAgICAkUmVzdG9yZVNldHRpbmdzT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiAnUmVzb3VyY2VPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nczogJ1Nob3duUmVzb3VyY2VzJywKICAgICAgICAgICAgICAgICAgICBUZWFtSUQ6ICQoJyNUZWFtJykudmFsKCkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVG9nZ2xlQUpBWExvYWRlcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQgLSBPYmplY3QgcmVmZXJlbmNlIG9mIHRoZSBmaWVsZCB3aGljaCBpcyB1cGRhdGVkCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFNob3cgLSBTaG93IG9yIGhpZGUgdGhlIEFKQVggbG9hZGVyIGltYWdlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2hvd3MgYW5kIGhpZGVzIGFuIGFqYXggbG9hZGVyIGZvciBldmVyeSBlbGVtZW50IHdoaWNoIGlzIHVwZGF0ZXMgdmlhIGFqYXguCiAgICAgKi8KICAgIGZ1bmN0aW9uIFRvZ2dsZUFKQVhMb2FkZXIoJEVsZW1lbnQsIFNob3cpIHsKICAgICAgICB2YXIgJExvYWRlciA9ICQoJyNBSkFYTG9hZGVyJyArICRFbGVtZW50LmF0dHIoJ2lkJykpLAogICAgICAgICAgICBMb2FkZXJIVE1MID0gJzxzcGFuIGlkPSJBSkFYTG9hZGVyJyArICRFbGVtZW50LmF0dHIoJ2lkJykgKyAnIiBjbGFzcz0iQUpBWExvYWRlciI+PC9zcGFuPic7CgogICAgICAgIC8vIEVsZW1lbnQgbm90IHByZXNlbnQKICAgICAgICBpZiAoISRFbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93IG9yIGhpZGUgdGhlIGxvYWRlcgogICAgICAgIGlmIChTaG93KSB7CiAgICAgICAgICAgIGlmICghJExvYWRlci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICRFbGVtZW50LmFmdGVyKExvYWRlckhUTUwpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJExvYWRlci5zaG93KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJExvYWRlci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICRMb2FkZXIuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgUGx1Z2luSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRQbHVnaW5GaWVsZHMgLSBmaWVsZHMgd2l0aCBkaWZmZXJlbnQgcGx1Z2luIHNlYXJjaGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IENoYWxsZW5nZVRva2VuIC0gVXNlciBjaGFsbGVuZ2UgdG9rZW4uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcGx1Z2luIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCA9IGZ1bmN0aW9uICgkUGx1Z2luRmllbGRzLCBDaGFsbGVuZ2VUb2tlbikgewoKICAgICAgICBmdW5jdGlvbiBJbml0UmVtb3ZlQnV0dG9ucygpIHsKICAgICAgICAgICAgJCgnLlJlbW92ZUJ1dHRvbicpLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyICRSZW1vdmVPYmogPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSA9ICRSZW1vdmVPYmouZGF0YSgncGx1Z2luS2V5JyksCiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmogPSAkKCcjUGx1Z2luXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQbHVnaW5LZXkpKSwKICAgICAgICAgICAgICAgICAgICBQbHVnaW5EYXRhID0gSlNPTi5wYXJzZSgkUGx1Z2luRGF0YU9iai52YWwoKSksCiAgICAgICAgICAgICAgICAgICAgTGlua0lEID0gJFJlbW92ZU9iai5kYXRhKCdsaW5rSWQnKS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICRQYXJlbnQgPSAkUmVtb3ZlT2JqLnBhcmVudCgpOwoKICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEuc3BsaWNlKFBsdWdpbkRhdGEuaW5kZXhPZihMaW5rSUQpLCAxKTsKICAgICAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAgICAgJFBhcmVudC5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgTGlua0lELCBMaW5rTmFtZSkgewogICAgICAgICAgICB2YXIgJFBsdWdpbkNvbnRhaW5lck9iaiA9ICQoJyNQbHVnaW5Db250YWluZXJfJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmogPSAkKCcjUGx1Z2luXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQbHVnaW5LZXkpKSwKICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICRFeGlzdGluZ0xpbmtzID0gJFBsdWdpbkNvbnRhaW5lck9iai5maW5kKCcuTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSksCiAgICAgICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iaiA9ICQoJzxkaXYgLz4nKSwKICAgICAgICAgICAgICAgICRVUkxPYmogPSAkKCc8YSAvPicpLAogICAgICAgICAgICAgICAgJFJlbW92ZU9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICBMaW5rVVJMID0gUGx1Z2luVVJMLnJlcGxhY2UoJyVzJywgTGlua0lEKTsKCiAgICAgICAgICAgIGlmICgkRXhpc3RpbmdMaW5rcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFBsdWdpbkRhdGEucHVzaChMaW5rSUQpOwogICAgICAgICAgICAkUGx1Z2luRGF0YU9iai52YWwoSlNPTi5zdHJpbmdpZnkoUGx1Z2luRGF0YSkpOwoKICAgICAgICAgICAgJExpbmtDb250YWluZXJPYmouYWRkQ2xhc3MoJ0xpbmtfJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKExpbmtJRCkpOwoKICAgICAgICAgICAgJFVSTE9iai5hdHRyKCdocmVmJywgTGlua1VSTCkKICAgICAgICAgICAgICAgIC5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJykKICAgICAgICAgICAgICAgIC50ZXh0KExpbmtOYW1lKQogICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRMaW5rQ29udGFpbmVyT2JqKTsKCiAgICAgICAgICAgICRSZW1vdmVPYmouYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnUmVtb3ZlQnV0dG9uJykKICAgICAgICAgICAgICAgIC5kYXRhKCdwbHVnaW5LZXknLCBQbHVnaW5LZXkpCiAgICAgICAgICAgICAgICAuZGF0YSgnbGlua0lkJywgTGlua0lEKQogICAgICAgICAgICAgICAgLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAkKCc8aSAvPicpLmFkZENsYXNzKCdmYSBmYS1taW51cy1zcXVhcmUtbycpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJExpbmtDb250YWluZXJPYmouYXBwZW5kVG8oJFBsdWdpbkNvbnRhaW5lck9iaik7CiAgICAgICAgICAgIEluaXRSZW1vdmVCdXR0b25zKCk7CiAgICAgICAgfQoKICAgICAgICAkUGx1Z2luRmllbGRzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJEVsZW1lbnQgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJEVsZW1lbnQuZGF0YSgncGx1Z2luS2V5JyksCiAgICAgICAgICAgICAgICBQbHVnaW5VUkwgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5VcmwnKTsKCiAgICAgICAgICAgIC8vIFNraXAgYWxyZWFkeSBpbml0aWFsaXplZCBmaWVsZHMKICAgICAgICAgICAgaWYgKCRFbGVtZW50Lmhhc0NsYXNzKCd1aS1hdXRvY29tcGxldGUtaW5wdXQnKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSh7CiAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IDIsCiAgICAgICAgICAgICAgICBkZWxheTogNTAwLAogICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoUmVxdWVzdCwgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudEFKQVhOdW1iZXIgPSArK0FKQVhDb3VudGVyLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENoYWxsZW5nZVRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudFBsdWdpblNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5LZXk6IFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSArICcqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IDIwCiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIGZyb20gdGhlIGxhdGVzdCBhamF4IHJlcXVlc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFKQVhDb3VudGVyICE9PSBDdXJyZW50QUpBWE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLlZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIHRoaXMuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLlZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgVUkuaXRlbS5rZXksIFVJLml0ZW0ubGFiZWwpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBJbml0UmVtb3ZlQnV0dG9ucygpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgRWRpdEFwcG9pbnRtZW50CiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGF0YSAtIEhhc2ggd2l0aCBjYWxsIGFuZCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkNhbGVuZGFySUQgLSBBcHBvaW50bWVudCBjYWxlbmRhciBJRC4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWN0aW9uIC0gRWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3ViYWN0aW9uIC0gRWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuVGl0bGUgLSBBcHBvaW50bWVudCB0aXRsZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5EZXNjcmlwdGlvbiAtIEFwcG9pbnRtZW50IGRlc2NyaXB0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkxvY2F0aW9uIC0gQXBwb2ludG1lbnQgbG9jYXRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRZZWFyIC0gQXBwb2ludG1lbnQgc3RhcnQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1vbnRoIC0gQXBwb2ludG1lbnQgc3RhcnQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnREYXkgLSBBcHBvaW50bWVudCBzdGFydCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRIb3VyIC0gQXBwb2ludG1lbnQgc3RhcnQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1pbnV0ZSAtIEFwcG9pbnRtZW50IHN0YXJ0IG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRZZWFyIC0gQXBwb2ludG1lbnQgZW5kIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTW9udGggLSBBcHBvaW50bWVudCBlbmQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kRGF5IC0gQXBwb2ludG1lbnQgZW5kIGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRIb3VyIC0gQXBwb2ludG1lbnQgZW5kIGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTWludXRlIC0gQXBwb2ludG1lbnQgZW5kIG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BbGxEYXkgLSBJcyBhcHBvaW50bWVudCBhbiBhbGwtZGF5IGFwcG9pbnRtZW50ICgwfDEpPwogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHN1Ym1pdHMgYW4gZWRpdCBhcHBvaW50bWVudCBjYWxsIHRvIHRoZSBiYWNrZW5kIGFuZCByZWZyZXNoZXMgdGhlIHZpZXcuCiAgICAgICovCiAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQgPSBmdW5jdGlvbiAoRGF0YSkgewogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q2FsZW5kYXJBZ2VuZGFPdmVydmlldycpKSB7CiAgICAgICAgICAgICQoJy5PdmVydmlld0NvbnRyb2wnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVmZXRjaEV2ZW50cycpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGlhbG9nCiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZWxvYWQgcGFnZSBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENhbGVuZGFyQWdlbmRhT3ZlcnZpZXcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFJlc3BvbnNlLkVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyIHx8IHt9KSk7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTcgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgPSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICogQGF1dGhvciBPVFJTIEFHCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KICovCkNvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5NYW5hZ2UgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgdmFyIFJ1bGVDb3VudCA9IDA7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0VGlja2V0QXBwb2ludG1lbnRzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBJbml0aWFsUnVsZUNvdW50IC0gRnJvbSB3aGljaCBydWxlIHRoZSBjb3VudCBzaG91bGQgc3RhcnQgKG9wdGlvbmFsKQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIHRpY2tldCBhcHBvaW50bWVudCBmaWVsZHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudHMgPSBmdW5jdGlvbiAoSW5pdGlhbFJ1bGVDb3VudCkgewogICAgICAgIHZhciAkQWRkUnVsZU9iaiA9ICQoJyNBZGRSdWxlQnV0dG9uJyksCiAgICAgICAgICAgICRUZW1wbGF0ZU9iaiA9ICQoJyNUaWNrZXRBcHBvaW50bWVudFJ1bGVzVGVtcGxhdGUnKTsKCiAgICAgICAgaWYgKEluaXRpYWxSdWxlQ291bnQpIHsKICAgICAgICAgICAgUnVsZUNvdW50ID0gcGFyc2VJbnQoSW5pdGlhbFJ1bGVDb3VudCwgMTApOwogICAgICAgIH0KCiAgICAgICAgJEFkZFJ1bGVPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBSdWxlSUQgPSArK1J1bGVDb3VudCwKICAgICAgICAgICAgICAgICRSdWxlT2JqID0gJCgkVGVtcGxhdGVPYmouaHRtbCgpKSwKICAgICAgICAgICAgICAgICRDb250YWluZXJPYmogPSAkQWRkUnVsZU9iai5wYXJlbnRzKCdmaWVsZHNldCcpOwoKICAgICAgICAgICAgJFJ1bGVPYmoKCiAgICAgICAgICAgICAgICAvLyBSdWxlIG51bWJlcgogICAgICAgICAgICAgICAgLmZpbmQoJy5SdWxlTnVtYmVyJykKICAgICAgICAgICAgICAgIC50ZXh0KFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGRhdGUgZmllbGQgYW5kIGxhYmVsCiAgICAgICAgICAgICAgICAuZmluZCgnI1N0YXJ0RGF0ZScpCiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuYXR0cignbmFtZScsICdTdGFydERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKQogICAgICAgICAgICAgICAgLnByZXYoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnU3RhcnREYXRlXycgKyBSdWxlSUQpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmVuZCgpCgogICAgICAgICAgICAgICAgLy8gRW5kIGRhdGUgZmllbGQgYW5kIGxhYmVsCiAgICAgICAgICAgICAgICAuZmluZCgnI0VuZERhdGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ0VuZERhdGVfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKQogICAgICAgICAgICAgICAgLnByZXYoJ2xhYmVsJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnRW5kRGF0ZV8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC8vIFF1ZXVlcyBmaWVsZCwgbGFiZWwgYW5kIGVycm9yCiAgICAgICAgICAgICAgICAuZmluZCgnI1F1ZXVlSUQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ1F1ZXVlSURfJyArIFJ1bGVJRCkKICAgICAgICAgICAgICAgIC5lbmQoKQogICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsW2Zvcj0iUXVldWVJRCJdJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb3InLCAnUXVldWVJRF8nICsgUnVsZUlEKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAuZmluZCgnI1F1ZXVlSURFcnJvcicpCiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnUXVldWVJRF8nICsgUnVsZUlEICsgJ0Vycm9yJykKICAgICAgICAgICAgICAgIC5lbmQoKQoKICAgICAgICAgICAgICAgIC5pbnNlcnRCZWZvcmUoJENvbnRhaW5lck9iaik7CgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCRSdWxlT2JqKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcnVsZSBidXR0b25zCiAgICAgICAgICAgIFRhcmdldE5TLkluaXRUaWNrZXRBcHBvaW50bWVudFJ1bGUoUnVsZUlELCAkUnVsZU9iaik7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0VGlja2V0QXBwb2ludG1lbnRSdWxlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLk1hbmFnZQogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBSdWxlSUQgLSBJRCBvZiB0aGUgcnVsZSAoMSwgMiwgMy4uLikKICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkUnVsZU9iaiAtIFJ1bGUgb2JqZWN0CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgYnV0dG9ucyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFRpY2tldEFwcG9pbnRtZW50UnVsZSA9IGZ1bmN0aW9uIChSdWxlSUQsICRSdWxlT2JqKSB7CiAgICAgICAgdmFyICRSZW1vdmVPYmogPSAkUnVsZU9iai5maW5kKCdsZWdlbmQgLlJlbW92ZUJ1dHRvbicpLAogICAgICAgICAgICAkUmVtb3ZlUGFyYW1PYmogPSAkUnVsZU9iai5maW5kKCcuRmllbGQgPiAuUmVtb3ZlQnV0dG9uJyksCiAgICAgICAgICAgICRBZGRQYXJhbU9iaiA9ICRSdWxlT2JqLmZpbmQoJy5BZGRCdXR0b24nKSwKICAgICAgICAgICAgJFBhcmFtT2JqID0gJFJ1bGVPYmouZmluZCgnLlNlYXJjaFBhcmFtcycpLAogICAgICAgICAgICAkVGVtcGxhdGVPYmogPSAkKCcjVGlja2V0QXBwb2ludG1lbnRTZWFyY2hQYXJhbVRlbXBsYXRlJyk7CgogICAgICAgICRQYXJhbU9iai52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKTsKCiAgICAgICAgJFJlbW92ZU9iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJFJ1bGVPYmoucmVtb3ZlKCk7CiAgICAgICAgICAgIFVwZGF0ZVJ1bGVDb3VudCgpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICAkUmVtb3ZlUGFyYW1PYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkU2VhcmNoUGFyYW1PYmogPSAkKHRoaXMpLnBhcmVudCgpLAogICAgICAgICAgICAgICAgUGFyYW1OYW1lID0gJFNlYXJjaFBhcmFtT2JqLmZpbmQoJy5TZWFyY2hQYXJhbScpLmRhdGEoJ3BhcmFtJyk7CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1PYmoucmVtb3ZlKCk7CiAgICAgICAgICAgICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgIC52YWwoJFBhcmFtT2JqLmZpbmQoJ29wdGlvbjplbmFibGVkJykuZmlyc3QoKS5hdHRyKCd2YWx1ZScpKQogICAgICAgICAgICAgICAgLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgICRBZGRQYXJhbU9iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyICRTZWFyY2hQYXJhbU9iaiA9ICQoJFRlbXBsYXRlT2JqLmh0bWwoKSksCiAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW1Db250YWluZXJPYmogPSAkUnVsZU9iai5maW5kKCcuU2VhcmNoUGFyYW1zQ29udGFpbmVyJyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlUGFyYW1PYmogPSAkU2VhcmNoUGFyYW1PYmouZmluZCgnLlJlbW92ZUJ1dHRvbicpLAogICAgICAgICAgICAgICAgUGFyYW1OYW1lID0gJFBhcmFtT2JqLnZhbCgpOwoKICAgICAgICAgICAgaWYgKCFQYXJhbU5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFtT2JqLmZpbmQoJ29wdGlvblt2YWx1ZT0iJyArIFBhcmFtTmFtZSArICciXScpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCB0cnVlKQogICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAudmFsKCRQYXJhbU9iai5maW5kKCdvcHRpb246ZW5hYmxlZCcpLmZpcnN0KCkuYXR0cigndmFsdWUnKSkKICAgICAgICAgICAgICAgIC50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpOwoKICAgICAgICAgICAgLy8gTGFiZWwKICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqCiAgICAgICAgICAgICAgICAuZmluZCgnbGFiZWwnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2ZvcicsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgLmZpbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgLmFmdGVyKCcgJyArICRQYXJhbU9iai5maW5kKCdvcHRpb25bdmFsdWU9IicgKyBQYXJhbU5hbWUgKyAnIl0nKS50ZXh0KCkgKyAnOicpOwoKICAgICAgICAgICAgLy8gT3duZXJJRHMgYW5kIFJlc3BvbnNpYmxlSURzIGFyZSBtdWx0aS1zZWxlY3QgZmllbGRzLgogICAgICAgICAgICBpZiAoUGFyYW1OYW1lID09PSAnT3duZXJJRHMnIHx8IFBhcmFtTmFtZSA9PT0gJ1Jlc3BvbnNpYmxlSURzJykgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ3NlbGVjdCcpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ25hbWUnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSkKICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAuZmluZCgnI1NlYXJjaFBhcmFtRXJyb3InKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lICsgJ0Vycm9yJykKICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAuZmluZCgnaW5wdXQnKQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSW5wdXQgZmllbGQgYW5kIGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW1PYmoKICAgICAgICAgICAgICAgICAgICAuZmluZCgnaW5wdXQnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsICdTZWFyY2hQYXJhbV8nICsgUnVsZUlEICsgJ18nICsgUGFyYW1OYW1lKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCduYW1lJywgJ1NlYXJjaFBhcmFtXycgKyBSdWxlSUQgKyAnXycgKyBQYXJhbU5hbWUpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyNTZWFyY2hQYXJhbUVycm9yJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignaWQnLCAnU2VhcmNoUGFyYW1fJyArIFJ1bGVJRCArICdfJyArIFBhcmFtTmFtZSArICdFcnJvcicpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ3NlbGVjdCcpCiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoUGFyYW1PYmouYXBwZW5kVG8oJFNlYXJjaFBhcmFtQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkU2VhcmNoUGFyYW1Db250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZVBhcmFtT2JqLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtT2JqLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJFBhcmFtT2JqLmZpbmQoJ29wdGlvblt2YWx1ZT0iJyArIFBhcmFtTmFtZSArICciXScpCiAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgLnZhbCgkUGFyYW1PYmouZmluZCgnb3B0aW9uOmVuYWJsZWQnKS5maXJzdCgpLmF0dHIoJ3ZhbHVlJykpCiAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBVcGRhdGVSdWxlQ291bnQoKSB7CiAgICAgICAgdmFyICRSdWxlTnVtYmVyT2JqID0gJCgnLlJ1bGVOdW1iZXI6dmlzaWJsZScpOwoKICAgICAgICAkUnVsZU51bWJlck9iai5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICAkKEVsZW1lbnQpLnRleHQoSW5kZXggKyAxKTsKICAgICAgICB9KTsKCiAgICAgICAgUnVsZUNvdW50ID0gJFJ1bGVOdW1iZXJPYmoubGVuZ3RoOwogICAgfQoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuTWFuYWdlIHx8IHt9KSk7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE3IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6Ok9UUlNBcHBvaW50bWVudENhbGVuZGFyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCk9UUlNCdXNpbmVzcy5wbSAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlKCk7CiAgICAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlLWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKICAgICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25BZGQoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0FwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0FwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIHBvc3NpYmxlIGNoYW5nZXMgb24gdGhlIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgYXBwb2ludG1lbnQgb2JqZWN0CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CgogICAgIyB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrcwogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCB1cGRhdGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBhcHBvaW50bWVudCBvYmplY3QKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uQWRkKCkKCkFkZCBiYXNpYyBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZm9yIHJlbWluZGVycy4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnROb3RpZmljYXRpb25BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlQXBwb2ludG1lbnROb3RpZmljYXRpb25zID0gKAogICAgICAgICdBcHBvaW50bWVudCByZW1pbmRlciBub3RpZmljYXRpb24nID0+IHsKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25UeXBlICAgICAgID0+IFsnQXBwb2ludG1lbnQnXSwKICAgICAgICAgICAgICAgIFZpc2libGVGb3JBZ2VudCAgICAgICAgPT4gWzFdLAogICAgICAgICAgICAgICAgVmlzaWJsZUZvckFnZW50VG9vbHRpcCA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ1lvdSB3aWxsIHJlY2VpdmUgYSBub3RpZmljYXRpb24gZWFjaCB0aW1lIGEgcmVtaW5kZXIgdGltZSBpcyByZWFjaGVkIGZvciBvbmUgb2YgeW91ciBhcHBvaW50bWVudHMuJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIEV2ZW50cyAgICAgICAgICAgICAgICA9PiBbJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJ10sCiAgICAgICAgICAgICAgICBSZWNpcGllbnRzICAgICAgICAgICAgPT4gWydBcHBvaW50bWVudEFnZW50UmVhZFBlcm1pc3Npb25zJ10sCiAgICAgICAgICAgICAgICBTZW5kT25PdXRPZk9mZmljZSAgICAgPT4gWzFdLAogICAgICAgICAgICAgICAgVHJhbnNwb3J0cyAgICAgICAgICAgID0+IFsnRW1haWwnXSwKICAgICAgICAgICAgICAgIEFnZW50RW5hYmxlZEJ5RGVmYXVsdCA9PiBbJ0VtYWlsJ10sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gewogICAgICAgICAgICAgICAgJ2RlJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdIYWxsbyAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4KVGVybWluICZxdW90OyZsdDtPVFJTX0FQUE9JTlRNRU5UX1RJVExFJmd0OyZxdW90OyBoYXQgc2VpbmUgQmVuYWNocmljaHRpZ3VuZ3N6ZWl0IGVycmVpY2h0LjxiciAvPgo8YnIgLz4KQmVzY2hyZWlidW5nOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KU3RhbmRvcnQ6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpLYWxlbmRlcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KU3RhcnR6ZWl0cHVua3Q6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4KRW5kemVpdHB1bmt0OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpHYW56dMOkZ2lnOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+CldpZWRlcmhvbHVuZzogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAnRXJpbm5lcnVuZzogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZW4nID0+IHsKICAgICAgICAgICAgICAgICAgICAnQm9keScgPT4gJ0hpICZsdDtPVFJTX05PVElGSUNBVElPTl9SRUNJUElFTlRfVXNlckZpcnN0bmFtZSZndDssPGJyIC8+CjxiciAvPgphcHBvaW50bWVudCAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsgaGFzIHJlYWNoZWQgaXRzIG5vdGlmaWNhdGlvbiB0aW1lLjxiciAvPgo8YnIgLz4KRGVzY3JpcHRpb246ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OzxiciAvPgpMb2NhdGlvbjogJmx0O09UUlNfQVBQT0lOVE1FTlRfTE9DQVRJT04mZ3Q7PGJyIC8+CkNhbGVuZGFyOiA8c3BhbiBzdHlsZT0iY29sb3I6ICZsdDtPVFJTX0NBTEVOREFSX0NPTE9SJmd0OzsiPuKWoDwvc3Bhbj4gJmx0O09UUlNfQ0FMRU5EQVJfQ0FMRU5EQVJOQU1FJmd0OzxiciAvPgpTdGFydCBkYXRlOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkVuZCBkYXRlOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9FTkRUSU1FJmd0OzxiciAvPgpBbGwtZGF5OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+ClJlcGVhdDogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAnUmVtaW5kZXI6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2h1JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdLZWR2ZXMgJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0OyE8YnIgLz4KPGJyIC8+CkEga8O2dmV0a2V6xZEgZXNlbcOpbnkgZWzDqXJ0ZSBheiDDqXJ0ZXPDrXTDqXNpIGlkZWrDqXQ6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1RJVExFJmd0OzxiciAvPgo8YnIgLz4KTGXDrXLDoXM6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OzxiciAvPgpIZWx5OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4KTmFwdMOhcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KS2V6ZMOpc2kgZMOhdHVtOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9TVEFSVFRJTUUmZ3Q7PGJyIC8+CkJlZmVqZXrDqXNpIGTDoXR1bTogJmx0O09UUlNfQVBQT0lOVE1FTlRfRU5EVElNRSZndDs8YnIgLz4KRWfDqXN6IG5hcG9zOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+CklzbcOpdGzFkWTDqXM6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ0VtbMOpa2V6dGV0xZE6IDxPVFJTX0FQUE9JTlRNRU5UX1RJVExFPicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3NyX0N5cmwnID0+IHsKICAgICAgICAgICAgICAgICAgICAnQm9keScgPT4gJ9CX0LTRgNCw0LLQviAmbHQ7T1RSU19OT1RJRklDQVRJT05fUkVDSVBJRU5UX1VzZXJGaXJzdG5hbWUmZ3Q7LDxiciAvPgo8YnIgLz4K0LLRgNC10LzQtSDRmNC1INC30LAg0L7QsdCw0LLQtdGI0YLQtdGa0LUg0YMg0LLQtdC30Lgg0YLQtdGA0LzQuNC90LAgJnF1b3Q7Jmx0O09UUlNfQVBQT0lOVE1FTlRfVElUTEUmZ3Q7JnF1b3Q7LjxiciAvPgo8YnIgLz4K0J7Qv9C40YE6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0RFU0NSSVBUSU9OJmd0OzxiciAvPgrQm9C+0LrQsNGG0LjRmNCwOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9MT0NBVElPTiZndDs8YnIgLz4K0JrQsNC70LXQvdC00LDRgDogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4K0JTQsNGC0YPQvCDQv9C+0YfQtdGC0LrQsDogJmx0O09UUlNfQVBQT0lOVE1FTlRfU1RBUlRUSU1FJmd0OzxiciAvPgrQlNCw0YLRg9C8INC60YDQsNGY0LA6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CtCm0LXQu9C+0LTQvdC10LLQvdC+OiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9BTExEQVkmZ3Q7PGJyIC8+CtCf0L7QvdCw0LLRmdCw0ZrQtTogJmx0O09UUlNfQVBQT0lOVE1FTlRfUkVDVVJSSU5HJmd0OzxiciAvPgo8YnIgLz4KPGEgaHJlZj0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiIHRpdGxlPSImbHQ7T1RSU19DT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O09UUlNfQ09ORklHX0ZRRE4mZ3Q7LyZsdDtPVFJTX0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXc7QXBwb2ludG1lbnRJRD0mbHQ7T1RSU19BUFBPSU5UTUVOVF9BUFBPSU5UTUVOVElEJmd0OyI+Jmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDs8L2E+PGJyIC8+CjxiciAvPgotLSAmbHQ7T1RSU19DT05GSUdfTm90aWZpY2F0aW9uU2VuZGVyTmFtZSZndDsnLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50VHlwZScgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnICAgICA9PiAn0J/QvtC00YHQtdGC0L3QuNC6OiA8T1RSU19BUFBPSU5UTUVOVF9USVRMRT4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdzcl9MYXRuJyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0JvZHknID0+ICdaZHJhdm8gJmx0O09UUlNfTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF9Vc2VyRmlyc3RuYW1lJmd0Oyw8YnIgLz4KPGJyIC8+CnZyZW1lIGplIHphIG9iYXZlxaF0ZW5qZSB1IHZlemkgdGVybWluYSAmcXVvdDsmbHQ7T1RSU19BUFBPSU5UTUVOVF9USVRMRSZndDsmcXVvdDsuPGJyIC8+CjxiciAvPgpPcGlzOiAmbHQ7T1RSU19BUFBPSU5UTUVOVF9ERVNDUklQVElPTiZndDs8YnIgLz4KTG9rYWNpamU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0xPQ0FUSU9OJmd0OzxiciAvPgpLYWxlbmRhcjogPHNwYW4gc3R5bGU9ImNvbG9yOiAmbHQ7T1RSU19DQUxFTkRBUl9DT0xPUiZndDs7Ij7ilqA8L3NwYW4+ICZsdDtPVFJTX0NBTEVOREFSX0NBTEVOREFSTkFNRSZndDs8YnIgLz4KRGF0dW0gcG/EjWV0a2E6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1NUQVJUVElNRSZndDs8YnIgLz4KRGF0dW0ga3JhamE6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0VORFRJTUUmZ3Q7PGJyIC8+CkNlbG9kbmV2bm86ICZsdDtPVFJTX0FQUE9JTlRNRU5UX0FMTERBWSZndDs8YnIgLz4KUG9uYXZsamFuamU6ICZsdDtPVFJTX0FQUE9JTlRNRU5UX1JFQ1VSUklORyZndDs8YnIgLz4KPGJyIC8+CjxhIGhyZWY9IiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7IiB0aXRsZT0iJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7aW5kZXgucGw/QWN0aW9uPUFnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3O0FwcG9pbnRtZW50SUQ9Jmx0O09UUlNfQVBQT0lOVE1FTlRfQVBQT0lOVE1FTlRJRCZndDsiPiZsdDtPVFJTX0NPTkZJR19IdHRwVHlwZSZndDs6Ly8mbHQ7T1RSU19DT05GSUdfRlFETiZndDsvJmx0O09UUlNfQ09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldztBcHBvaW50bWVudElEPSZsdDtPVFJTX0FQUE9JTlRNRU5UX0FQUE9JTlRNRU5USUQmZ3Q7PC9hPjxiciAvPgo8YnIgLz4KLS0gJmx0O09UUlNfQ09ORklHX05vdGlmaWNhdGlvblNlbmRlck5hbWUmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnQ29udGVudFR5cGUnID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JyAgICAgPT4gJ1BvZHNldG5pazogPE9UUlNfQVBQT0lOVE1FTlRfVElUTEU+JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKCiAgICBteSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnKTsKCiAgICAjIEdldCBhbGwgbm90aWZpY2F0aW9ucyBvZiBhcHBvaW50bWVudCB0eXBlLgogICAgbXkgJU5vdGlmaWNhdGlvbkxpc3QgPSAkTm90aWZpY2F0aW9uRXZlbnRPYmplY3QtPk5vdGlmaWNhdGlvbkxpc3QoCiAgICAgICAgVHlwZSA9PiAnQXBwb2ludG1lbnQnLAogICAgKTsKICAgIG15ICVOb3RpZmljYXRpb25MaXN0UmV2ZXJzZSA9IHJldmVyc2UgJU5vdGlmaWNhdGlvbkxpc3Q7CgogICAgTkVXTk9USUZJQ0FUSU9OOgogICAgZm9yIG15ICROb3RpZmljYXRpb25OYW1lICggc29ydCBrZXlzICVBcHBvaW50bWVudE5vdGlmaWNhdGlvbnMgKSB7CgogICAgICAgICMgRG8gbm90IGFkZCBuZXcgbm90aWZpY2F0aW9uIGlmIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgZXhpc3RzLgogICAgICAgIG5leHQgTkVXTk9USUZJQ0FUSU9OIGlmICROb3RpZmljYXRpb25MaXN0UmV2ZXJzZXskTm90aWZpY2F0aW9uTmFtZX07CgogICAgICAgICMgQWRkIG5ldyBldmVudCBub3RpZmljYXRpb24uCiAgICAgICAgbXkgJElEID0gJE5vdGlmaWNhdGlvbkV2ZW50T2JqZWN0LT5Ob3RpZmljYXRpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJE5vdGlmaWNhdGlvbk5hbWUsCiAgICAgICAgICAgIERhdGEgICAgPT4gJEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uc3skTm90aWZpY2F0aW9uTmFtZX0tPntEYXRhfSwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkQXBwb2ludG1lbnROb3RpZmljYXRpb25zeyROb3RpZmljYXRpb25OYW1lfS0+e01lc3NhZ2V9LAogICAgICAgICAgICBDb21tZW50ID0+ICcnLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBpZiAhJElEOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
JVBERi0xLjQKJaqrrK0KMSAwIG9iago8PAovQ3JlYXRvciAoQXBhY2hlIEZPUCBWZXJzaW9uIDIuMSkKL1Byb2R1Y2VyIChBcGFjaGUgRk9QIFZlcnNpb24gMi4xKQovQ3JlYXRpb25EYXRlIChEOjIwMTcxMDEwMDk1MjIzKzAyJzAwJykKPj4KZW5kb2JqCjIgMCBvYmoKPDwKICAvTiAzCiAgL0xlbmd0aCAzIDAgUgogIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nO2ZZ1BUWRaA73uvc6Chu2kyNDlJlNCA5JwkSBYV6G4yLTQ5mJDBERhBRCQpgogCDjg6BBlFRRQDoqCAeRoZBJRxcBRRUVnAH7NVu7VbW7W1f7bPj/e+OufWO+e+ulXvq3oAyJDi2QnJsD4ACbwUvq+zHTMoOISJvQ9wgAxIgAow4ezkRFtvbw+wHCtrwT/E+1EArdzv6fzz+r8MEieBxwEAoi9zLIebzF7mncsczUngrOSnVzg9JTEFANh7men85QGXmbPCEd84Y4WjvnHR6ho/X/tlPgoAjhS1yoRTKxyxytSuFWZH8xMAkO5bXq/CTuQvP196pZfitxlWQ3RlP8woLo/LD0/hcpj/4db+ffxdL3Ty8sv/rzf4H/dZOTvf6K3l6pmAGBV/5baWAcB6DQBS8ldO5TAAlN0AdPT8lYs4DkBnCQCSz9ip/LRvOdTq7IAAKIAOpIA8UAYaQAcYAlNgAWyAI3ADXsAPBIPNgA2iQQLgg3SQA3aBfFAISsBBUAVqQQNoAq3gDOgE58FlcA3cAnfBCHgMBGASvAJz4D1YhCAIC5EhGiQFKUCqkDZkCLEgK8gR8oB8oWAoDIqCeFAqlAPthgqhUqgKqoOaoJ+gc9Bl6AY0BD2ExqEZ6E/oE4zAJJgOy8FqsB7Mgm1hd9gP3gRHwUlwFpwH74Mr4Hr4FNwBX4ZvwSOwAH4FzyMAISIMRBHRQViIPeKFhCCRCB/ZjhQg5Ug90op0I/3IPUSAzCIfURgUDcVE6aAsUC4ofxQblYTajipCVaFOojpQfah7qHHUHOormoyWRWujzdGu6CB0FDodnY8uRzei29FX0SPoSfR7DAbDwKhjTDEumGBMLCYbU4Q5jGnDXMIMYSYw81gsVgqrjbXEemHDsSnYfGwl9hT2InYYO4n9gCPi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YmoKNCAwIG9iagpbL0lDQ0Jhc2VkIDIgMCBSXQplbmRvYmoKNSAwIG9iago8PAogIC9UeXBlIC9NZXRhZGF0YQogIC9TdWJ0eXBlIC9YTUwKICAvTGVuZ3RoIDYgMCBSCj4+CnN0cmVhbQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPgo8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgo8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgcmRmOmFib3V0PSIiPgo8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0Pgo8ZGM6bGFuZ3VhZ2U+ZW48L2RjOmxhbmd1YWdlPgo8ZGM6ZGF0ZT4yMDE3LTEwLTEwVDA5OjUyOjIzKzAyOjAwPC9kYzpkYXRlPgo8L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iIHJkZjphYm91dD0iIj4KPHBkZjpQcm9kdWNlcj5BcGFjaGUgRk9QIFZlcnNpb24gMi4xPC9wZGY6UHJvZHVjZXI+CjxwZGY6UERGVmVyc2lvbj4xLjQ8L3BkZjpQREZWZXJzaW9uPgo8L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHJkZjphYm91dD0iIj4KPHhtcDpDcmVhdG9yVG9vbD5BcGFjaGUgRk9QIFZlcnNpb24gMi4xPC94bXA6Q3JlYXRvclRvb2w+Cjx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMTAtMTBUMDk6NTI6MjMrMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+Cjx4bXA6Q3JlYXRlRGF0ZT4yMDE3LTEwLTEwVDA5OjUyOjIzKzAyOjAwPC94bXA6Q3JlYXRlRGF0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VHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDY2Ny42MjkgMTU1Ljc1NCA2NzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDU2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNjY3LjYyOSA1MzkuOTk4IDY3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjggMCBSIC9YWVogNzIuMCA3MDAuOCBudWxsXQo+PgplbmRvYmoKNjAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjU1LjYyOSAyOTQuNjc3IDY2NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2NTUuNjI5IDUzOS45OTggNjY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1OSAwIFIKL0ggL0kKCj4+CmVuZG9iago2MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDYyNC4yNyBudWxsXQo+PgplbmRvYmoKNjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjQzLjYyOSAyMjEuNDg3IDY1My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2NDMuNjI5IDUzOS45OTggNjUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2MiAwIFIKL0ggL0kKCj4+CmVuZG9iago2NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDQ3Ny42OSBudWxsXQo+PgplbmRvYmoKNjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjMxLjYyOSAzMTcuNTkzIDY0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNjcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2MzEuNjI5IDUzOS45OTggNjQxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2NSAwIFIKL0ggL0kKCj4+CmVuZG9iago2OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDIyNy4wMSBudWxsXQo+PgplbmRvYmoKNjkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjE5LjYyOSAyNDEuOTc2IDYyOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNjggMCBSCi9IIC9JCgo+PgplbmRvYmoKNzAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA2MTkuNjI5IDUzOS45OTggNjI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA2OCAwIFIKL0ggL0kKCj4+CmVuZG9iago3MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyOCAwIFIgL1hZWiA3Mi4wIDEyNi40OCBudWxsXQo+PgplbmRvYmoKNzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjA3LjYyOSAxODAuNTYgNjE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3MSAwIFIKL0ggL0kKCj4+CmVuZG9iago3MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDYwNy42MjkgNTM5Ljk5OCA2MTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDcxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjc0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgNjYyLjAgbnVsbF0KPj4KZW5kb2JqCjc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU5NS42MjkgMzU5LjU1NSA2MDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDc0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjc2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNTk1LjYyOSA1MzkuOTk3IDYwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzEgMCBSIC9YWVogNzIuMCA1NDkuNiBudWxsXQo+PgplbmRvYmoKNzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTgzLjYyOSAyNjkuMzcyIDU5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNzkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4OCA1ODMuNjI5IDU0MC4zNDggNTkzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA3NyAwIFIKL0ggL0kKCj4+CmVuZG9iago4MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMSAwIFIgL1hZWiA3Mi4wIDQ3MS4yIG51bGxdCj4+CmVuZG9iago4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzEuNjI5IDI2My4zMDkgNTgxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4MCAwIFIKL0ggL0kKCj4+CmVuZG9iago4MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg4IDU3MS42MjkgNTQwLjM0OCA1ODEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDgwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjgzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMxIDAgUiAvWFlaIDcyLjAgMzA0LjggbnVsbF0KPj4KZW5kb2JqCjg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU1OS42MjkgMzUzLjkxOCA1NjkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDgzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjg1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTU5LjYyOSA1MzkuOTk4IDU2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODMgMCBSCi9IIC9JCgo+PgplbmRvYmoKODYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA1NDcuNjI5IDIwNC45NzYgNTU3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA4NiAwIFIKL0ggL0kKCj4+CmVuZG9iago4OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDU0Ny42MjkgNTM5Ljk5OCA1NTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjg5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNzAwLjggbnVsbF0KPj4KZW5kb2JqCjkwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUzNS42MjkgMTczLjQwOCA1NDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDg5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjkxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNTM1LjYyOSA1MzkuOTk4IDU0NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgODkgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzQgMCBSIC9YWVogNzIuMCA2MjYuNCBudWxsXQo+PgplbmRvYmoKOTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTIzLjYyOSAxNjQuOTEzIDUzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgOTIgMCBSCi9IIC9JCgo+PgplbmRvYmoKOTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjgwNyA1MjMuNjI5IDU0MC4xNjcgNTMzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5MiAwIFIKL0ggL0kKCj4+CmVuZG9iago5NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszNCAwIFIgL1hZWiA3Mi4wIDU1OC4wIG51bGxdCj4+CmVuZG9iago5NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MTEuNjI5IDIwOS41NTIgNTIxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA5NSAwIFIKL0ggL0kKCj4+CmVuZG9iago5NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDUxMS42MjkgNTM5Ljk5OCA1MjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjk4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzM0IDAgUiAvWFlaIDcyLjAgNDg5LjYgbnVsbF0KPj4KZW5kb2JqCjk5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQ5OS42MjkgMjIxLjc5NCA1MDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ5OS42MjkgNTM5Ljk5OCA1MDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDk4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxMDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0ODcuNjI5IDE0OS4zOSA0OTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwMSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMDMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzOCA0ODcuNjI5IDUzOS45OTggNDk3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQwIDAgUiAvWFlaIDcyLjAgNjc4LjggbnVsbF0KPj4KZW5kb2JqCjEwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0NzUuNjI5IDE5OS4wMDYgNDg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMDQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTA2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNDc1LjYyOSA1MzkuOTk4IDQ4NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwNyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MCAwIFIgL1hZWiA3Mi4wIDYwMi40IG51bGxdCj4+CmVuZG9iagoxMDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDYzLjYyOSAxOTQuNjQxIDQ3My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTA3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEwOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ2My42MjkgNTM5Ljk5OCA0NzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDEwNyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKMTExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDUxLjYyOSAxNjEuNzg0IDQ2MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQ1MS42MjkgNTM5Ljk5OCA0NjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2NjcuNjUyIG51bGxdCj4+CmVuZG9iagoxMTQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDM5LjYyOSAzMzUuOTk0IDQ0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTEzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjExNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDQzOS42MjkgNTM5Ljk5NyA0NDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExMyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA2MDUuNDY3IG51bGxdCj4+CmVuZG9iagoxMTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDI3LjYyOSA0MTcuOTU5IDQzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjExOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQyNy42MjkgNTM5Ljk5OCA0MzcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExNiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMTkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA1NDMuMjgyIG51bGxdCj4+CmVuZG9iagoxMjAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDE1LjYyOSAzNDYuNTMyIDQyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTE5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM4IDQxNS42MjkgNTM5Ljk5OCA0MjUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDExOSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxMjIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDMgMCBSIC9YWVogNzIuMCA0ODEuMDk3IG51bGxdCj4+CmVuZG9iagoxMjMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDAzLjYyOSAzNDQuNjYgNDEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNDAzLjYyOSA1MzkuOTk3IDQxMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTIyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyNSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDQxOC45MTIgbnVsbF0KPj4KZW5kb2JqCjEyNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzOTEuNjI5IDM5MS45MTMgNDAxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTI3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzkxLjYyOSA1MzkuOTk3IDQwMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEyOCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDM1Ni43MjcgbnVsbF0KPj4KZW5kb2JqCjEyOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNzkuNjI5IDQxMS41MzUgMzg5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMjggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTMwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzc5LjYyOSA1MzkuOTk3IDM4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTI4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDI5NC41NDIgbnVsbF0KPj4KZW5kb2JqCjEzMiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNjcuNjI5IDM2MC4yOTggMzc3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTMzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzY3LjYyOSA1MzkuOTk3IDM3Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTMxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDIzMi4zNTcgbnVsbF0KPj4KZW5kb2JqCjEzNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNTUuNjI5IDM1Mi42MTggMzY1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzU1LjYyOSA1MzkuOTk3IDM2NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjEzNyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MyAwIFIgL1hZWiA3Mi4wIDE0Ni4xNzIgbnVsbF0KPj4KZW5kb2JqCjEzOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzNDMuNjI5IDMxMy4xNTUgMzUzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxMzcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTM5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMzQzLjYyOSA1MzkuOTk3IDM1My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTM3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iagoxNDEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMzMxLjYyOSAzNTYuODczIDM0MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDMzMS42MjkgNTQwLjM0NyAzNDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0MCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNDMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCA2NjIuMzUgbnVsbF0KPj4KZW5kb2JqCjE0NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMTkuNjI5IDI5OC4wNjQgMzI5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDMgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggMzE5LjYyOSA1MzkuOTk4IDMyOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDU5OC45MjUgbnVsbF0KPj4KZW5kb2JqCjE0NyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAzMDcuNjI5IDM5Mi4yOTIgMzE3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTQ4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy44MDcgMzA3LjYyOSA1NDAuMTY3IDMxNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE0OSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDQ5OS41IG51bGxdCj4+CmVuZG9iagoxNTAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjk1LjYyOSA1MDcuODI2IDMwNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTQ5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuMDQ1IDI5NS42MjkgNTQwLjQwNSAzMDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE0OSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCA0MDkuNjc1IG51bGxdCj4+CmVuZG9iagoxNTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjgzLjYyOSA0NzUuMTI0IDI5My42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTUyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDI4My42MjkgNTQwLjM0NyAyOTMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE1MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNTUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYgMCBSIC9YWVogNzIuMCAzMTkuODUgbnVsbF0KPj4KZW5kb2JqCjE1NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyNzEuNjI5IDQ3OS42MDYgMjgxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTU3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODggMjcxLjYyOSA1NDAuMzQ4IDI4MS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE1OCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDIzMC4wMjUgbnVsbF0KPj4KZW5kb2JqCjE1OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAyNTkuNjI5IDQ3OC44NjkgMjY5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNTggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTYwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMjU5LjYyOSA1NDAuMzQ3IDI2OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTU4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NiAwIFIgL1hZWiA3Mi4wIDE0MC4yIG51bGxdCj4+CmVuZG9iagoxNjIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjQ3LjYyOSA0ODEuNTc5IDI1Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTYxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg3IDI0Ny42MjkgNTQwLjM0NyAyNTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2MSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjQgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA3MDguMCBudWxsXQo+PgplbmRvYmoKMTY1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDIzNS42MjkgNDA4Ljg1NyAyNDUuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNjYgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAyMzUuNjI5IDU0MC4zNDcgMjQ1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNjQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTY3IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgNjMwLjQ5OCBudWxsXQo+PgplbmRvYmoKMTY4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDIyMy42MjkgNDQ4LjEyIDIzMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTY3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDIyMy42MjkgNTM5Ljk5NyAyMzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE2NyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA1NjQuOTk2IG51bGxdCj4+CmVuZG9iagoxNzEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMjExLjYyOSAyNTEuMDIxIDIyMS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTcwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDIxMS42MjkgNTM5Ljk5NyAyMjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3MCAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA0OTkuNDk0IG51bGxdCj4+CmVuZG9iagoxNzQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMTk5LjYyOSA0MzMuNzg3IDIwOS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDE5OS42MjkgNTM5Ljk5NyAyMDkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3MyAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCA0MzMuOTkyIG51bGxdCj4+CmVuZG9iagoxNzcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgMTg3LjYyOSA0NzUuMzEzIDE5Ny42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE3OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuOTg4IDE4Ny42MjkgNTQwLjM0OCAxOTcuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE3NiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxNzkgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDkgMCBSIC9YWVogNzIuMCAzNDIuMDkgbnVsbF0KPj4KZW5kb2JqCjE4MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxNzUuNjI5IDM4Ni43ODQgMTg1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxNzkgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTgxIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy45ODcgMTc1LjYyOSA1NDAuMzQ3IDE4NS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTc5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE4MiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0OSAwIFIgL1hZWiA3Mi4wIDIyOC41ODggbnVsbF0KPj4KZW5kb2JqCjE4MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxNjMuNjI5IDM5MC4zNCAxNzMuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4MiAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjk4NyAxNjMuNjI5IDU0MC4zNDcgMTczLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODIgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg1IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ5IDAgUiAvWFlaIDcyLjAgMTE1LjA4NiBudWxsXQo+PgplbmRvYmoKMTg2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDE1MS42MjkgNDE3LjUyMSAxNjEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDE4NSAwIFIKL0ggL0kKCj4+CmVuZG9iagoxODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyAxNTEuNjI5IDUzOS45OTcgMTYxLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODUgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTg4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzUyIDAgUiAvWFlaIDcyLjAgNzA4LjAgbnVsbF0KPj4KZW5kb2JqCjE4OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMzkuNjI5IDQxMy4wMTkgMTQ5LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxODggMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTM5LjYyOSA1MzkuOTk3IDE0OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTg4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5MSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDYzMS41MDEgbnVsbF0KPj4KZW5kb2JqCjE5MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMjcuNjI5IDQ0Mi45MjMgMTM3LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTkzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzNC4yODcgMTI3LjYyOSA1NDAuNjQ3IDEzNy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTkxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5NCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDU1NS4wMDIgbnVsbF0KPj4KZW5kb2JqCjE5NSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMTUuNjI5IDQyNC4yNzQgMTI1LjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTQgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTE1LjYyOSA1MzkuOTk3IDEyNS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjE5NyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQ3OC41MDMgbnVsbF0KPj4KZW5kb2JqCjE5OCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCAxMDMuNjI5IDQwMi4xMTIgMTEzLjYxOSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSAxOTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKMTk5IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgMTAzLjYyOSA1MzkuOTk3IDExMy42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMTk3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjIwMCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs1MiAwIFIgL1hZWiA3Mi4wIDQwMi4wMDQgbnVsbF0KPj4KZW5kb2JqCjIwMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA5MS42MjkgNDAyLjExMiAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA5MS42MjkgNTM5Ljk5NyAxMDEuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMCAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAzMjUuNTA1IG51bGxdCj4+CmVuZG9iagoyMDQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzkuNjI5IDM1Ni4wNDUgODkuNjE5IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDIwMyAwIFIKL0ggL0kKCj4+CmVuZG9iagoyMDUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA3OS42MjkgNTM5Ljk5NyA4OS42MTkgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgMjAzIDAgUgovSCAvSQoKPj4KZW5kb2Jq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jX/j//9u/OCfpwfO2DB++pH78s85wF1/+e/f/vMP/+MH9+0//PAP/2g//S/28/ztf/0wj/HlY/6Tnf55AfPX4tmOcq/y9Z/u+KtyhgccZ+e+/bcffvrjD3//3b5T77798b8eN+lVZyl3++a9gbAgCPVezGAN4x5vU0jwniq/75uC//1vti44FQplbmRzdHJlYW0KZW5kb2JqCjIwNyAwIG9iagoyMjU3NQplbmRvYmoKMjA4IDAgb2JqClsKNTQgMCBSCjU1IDAgUgo1NyAwIFIKNTggMCBSCjYwIDAgUgo2MSAwIFIKNjMgMCBSCjY0IDAgUgo2NiAwIFIKNjcgMCBSCjY5IDAgUgo3MCAwIFIKNzIgMCBSCjczIDAgUgo3NSAwIFIKNzYgMCBSCjc4IDAgUgo3OSAwIFIKODEgMCBSCjgyIDAgUgo4NCAwIFIKODUgMCBSCjg3IDAgUgo4OCAwIFIKOTAgMCBSCjkxIDAgUgo5MyAwIFIKOTQgMCBSCjk2IDAgUgo5NyAwIFIKOTkgMCBSCjEwMCAwIFIKMTAyIDAgUgoxMDMgMCBSCjEwNSAwIFIKMTA2IDAgUgoxMDggMCBSCjEwOSAwIFIKMTExIDAgUgoxMTIgMCBSCjExNCAwIFIKMTE1IDAgUgoxMTcgMCBSCjExOCAwIFIKMTIwIDAgUgoxMjEgMCBSCjEyMyAwIFIKMTI0IDAgUgoxMjYgMCBSCjEyNyAwIFIKMTI5IDAgUgoxMzAgMCBSCjEzMiAwIFIKMTMzIDAgUgoxMzUgMCBSCjEzNiAwIFIKMTM4IDAgUgoxMzkgMCBSCjE0MSAwIFIKMTQyIDAgUgoxNDQgMCBSCjE0NSAwIFIKMTQ3IDAgUgoxNDggMCBSCjE1MCAwIFIKMTUxIDAgUgoxNTMgMCBSCjE1NCAwIFIKMTU2IDAgUgoxNTcgMCBSCjE1OSAwIFIKMTYwIDAgUgoxNjIgMCBSCjE2MyAwIFIKMTY1IDAgUgoxNjYgMCBSCjE2OCAwIFIKMTY5IDAgUgoxNzEgMCBSCjE3MiAwIFIKMTc0IDAgUgoxNzUgMCBSCjE3NyAwIFIKMTc4IDAgUgoxODAgMCBSCjE4MSAwIFIKMTgzIDAgUgoxODQgMCBSCjE4NiAwIFIKMTg3IDAgUgoxODkgMCBSCjE5MCAwIFIKMTkyIDAg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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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YWNlIC9EZXZpY2VHcmF5Cj4+CnN0cmVhbQp4nO3BMQEAAADCoP6pZwsvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMIKEii5FMp4SRKOIkSTqLkM4WAgiRKPpUSTqKEkyjhJEo+UwgoSKLkUynhJEo4iRJOouQzhYCCJEo+lRJOooSTKOEkSj5TCChIouRTKeEkSjiJEk6i5DOFgIIkSj6VEk6ihJMo4SRKPlMI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QhYiIhKyfDC1LmRIhmhIuglQEUJWCiELEREJWT6YWhcyJEM0JN0EqAghK4WQhYiIhCwfTK0LGZIhGpJuAlSEkJVCyEJEREKWD6bWhQzJEA1ON1977bXLLrvswAMP/LQH2bV27dodO3ZMfNsCAzLTxfe+972JbF69vP/++88999ymTZueeOIJme5WKarRaNTVqnh8b9asWbNmz549Z86cT33qU9/61rf0LvlSNsouOUAO8xVbY06Z0hCyEBGRkOVjcKbWA8uQDFHFbp566qmSKTZs2FC9JRdffPHpp5++fv36dW3WrFlzYRt5kWyRXQsXLpSc1Vv5//Vf/+UMRMLVV18dPjcwIMcff7y9USbqUzFn7dy588orrzzggANkTI466ijJHZ/4xCcWL148NjbWW4EDFbJOPvnkFStWrFy58jvf+Y69VzbKLjlADvMVW2NOmdIQshARkZDlY0gSRBWGZIiqdPPFF19cunSpJCzJPnv37q3YkqOPPvryyy+/4oorJEZdeuml55xzzhNPPPHMM8/IC5mry0bZJQcce+yxvZX/7LPPbt68+bnnnpMcIeVIprv55psfe+yxhx9+uHB1LDAgvoWPr3zlK1MrZ8n4HHrooSMjI9ddd126cdOmTXPnzpW09fOf/zymkA8//HBnm48++mg8H7J27dol2+WAmHJefvnlW2655a677tJLaVLmu+++22w2b7311u3bt/vO9b1Z8+fPP/HEE88///zTTjvN3isbZZccIIf5iq0xp0xpCFmIiFguZP35p4u/lGPxT/9ccErPtOra8GC/Si+mx6l1xSGa7F6XokL6eHBDNkLd/g5q36uErKuuumrdunWSfSQT3X777RVbIkntwgsvvKTNueeeK1Eo2X799ddLzpJMJDP2iy666NRTT61Y0ZlnninlLF68OP6UwIDIe+zbdfjhh/tz1iPfPj7l24/EN6U/yLRW2iEpw17Uu/fee88777wjjzxy27Zt4ULef//9k2bPvmD16nPOPXfpsmWSp5KQJS8uvPjis1esOO+CC44/8UQJSuFyHnzoobOXLWusWbP6wgvlXX/77beT7Xv27Fl90UVSyCWNxpKzz77vvvucp/verE984hOrV6+eOXOmfABOOOEEvUu+lI2ySw6Qw3zF1phTpjSELERELB+yJmoaPNlT7gohq0KzJ7vXpeg1fbQSVtrJ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AAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQFgmG599ckzNU9+9Vbrwi89HRZ4+qWlqu67+J2bl3/7t37jTMpv/NZvX755p+dWAXicxASAYcr78mU0qP/VsERMyBc90z8mvHXpiSd+5wc/T4WBOz//we888cSlt3rVA8BjJSYADFMUDMogkE8U5fNwUI0J82GIZqwoM0L/mPDihTMXXlxxLgAbIyYADFM9JszDQXdMqKyVGmF46els3lI3HYkJACeSmAAwTI1nE6bd+s6YUMsWrXciiQkAwycmAAzTvMdf3Ck069UvjgkLH3xeISaE/20qysUEgONITAAYpurAQDUo9B9N6K7aaALAoIkJAMNU6/EXHfv8r+QoQ+rZhPbIICYADJ+YADBMqV86qmSC7I+nk790VPk1o5YkICYADJ+YAMBReuvSE7954Y9a/t2EP7rwm/7dBIBjSUwA4Ej5V5gBTiIxAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAg0jMmvA8AAJwaRhMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAAbs5s2br8Opt+kLEU4kMQFgwEJMuHfv3s7Ozv3c38JpEs78u3fvhqtg0xcinEhiAsCAhQ5S6CmF/lKYHo1GYzgdwtkezvkiKYgJsBoxAWDAQgfp/v37YWJvb29/f/8BnALhVJ9MJuGc382TgpgAqxETAAasiAmj0Sh0nB4+fPj+gHwK7Q4ODkJSCGe+mAArExMABix0kEI3aTweP3jwIHScNt21X6dH0C4khRCNw5kvJsDKostq080BYJ2qMSF0nDbdtV+njXQ+OSnC2R7OeTEBDiO6rDbdHIDj5p2XL5defqco+/DNrXK624IlO2f330q7rpjw6qWzZ0pnL726bD89W//81fz/l1776vlilVXWndpI55OTQkyAw4suq003B+BYyTLC9nv7hY9vbF3eevPDUPyrt7Yub7/bp4IFS3bO7r+VdgtiQtlFv3p++aAwiwkrOEQ6KG2k88lJISbA4UWX1aabA3CcZN/nX789nv412rt9PcsJ5fhC/lV/tkx9sCGUbL388tbly81hiKlZDVsvb5dJIK6nvpX4z75jDX1jQjkd8kKhCACh/Pz589WSchQizKiOJqSWnNV2/lKYebW64dkIRrluXltednVafdG0qD1iAv2ICXB40WW16eYAHCejj268cHk6gpAZT/Yne6Px5ONQfP29/ck4671v3fi4HGzI++3ZKMDl7dvTwtmSc/N1bm+Hfn8eE5r1VLcyn11uJISWSb3apOVGEyoloWAaAaYd9GnBvCTv7NdiQrTkfIgi6+vXuvnlhubr5n9XJ5LtERPoR0yAw4suq003B+BYyfriRWe++PZ/GhjmtwMVwaFYNiyXF2ZzZ2MQiRuH3tkOc4t1xlkMyWe31VOsG1Z54cZHo93piMZ2/wcWlns2ofzqviyad9SnU1G2qMWE+pLvd3TymzEhelShmGi2R0ygnyIm7O3tiQmwsuiy2nRzAI6f0IWPHk6od/4rDzlH3ftUTMhuFipLykjQXc+7ZVCppZUe+o4m1Pr9yWU2FBPaH37YSOeTk0JMgMOLLqtNNwfgOAkd9+rt/+VX+ZXv+V+u3V/UIybUkkGZGbrrCTHh+uxB6uwfmJ2OO/SwXEwo7/lJ/IpRpfM/v6eoMyYsddNRMiY02yMm0I+YAIcXXVabbg7AcTIOsaAaFPKbf35d6cBXn3HOChtjDYmbjsbFg9B5fS9PRw4W1FNfZYnBhCVjwvupR5jjzv/8CeSzZ7tjwvwR5vPxsEA+o/YIcyomNNsjJtCPZxPg8KLLatPNAThWxpP99yo3/Gzd+Dj/Jr94tDkEiNHeRzdmP1C0tb39QjTWUFmyVunH05W2tq8XIwfJeirrjidlM7ZufJQPJhz+l44en3X8/mnDRjqfnBRiAhxedFltujkAx035ZEL1bp/80eb8h4aKqXxmUBZN5r+iOluyYrZSuUqyntq6ZTPKJ50P/UtHR27+BPL6Q4KYQCcxAQ4vuqw23RwA1qmMCSFgbG404UhspPPJiRBO9YODAzEBDim6sjbdHADWqYgJo9FoMpmEjtOmu/br9Cm0CKf6w4cPQzQOZ/79+/fFBFiNmAAwYEVMCBN7e3vZzUz7+w/gFAinejjnw5kvJsDKxASAAQsdpJ2dnSIpjEajMYvsnRybPlTHWjjbwzkfzvxw/osJsBoxAWDAQgfp7t27RVKA0+N+Lpz59+7dExNgNWICwIDdBMQEWImYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICwIDdvHnzdTj1Nn0hwokkJgAMWIgJ9+7d29nZKf61qU3/m1fwWIUz/+7du/7dBFiNmAAwYKGDVPwTzGF6NBqN4XQIZ3s454ukICbAasQEgAELHaT79++Hib29vf39/QdwCoRTfTKZhHN+N08KYgKsRkwAGLAiJoxGo9Bxevjw4fvHw6dwxA4ODkJSCGe+mAArExMABix0kEI3aTweP3jwIHScNp0Pph7BEQtJIUTjcOaLCbCy6LLadHMAWKdqTAgdp03ng6mN9Bs5VcLZHs55MQEOI7qsNt0cgGPpwze3Lke23vyw75ovv7PS3O5V+1kpJlw9f+b81ajs1Utnz156VUzghBAT4PCiy2rTzQE4ln711tbl6+/tV032Rn3X3H53pbndq/azfEwIGSEQEzjZxAQ4vOiy2nRzAI6lth77h29ubb355svTAYbKV//vTMu2Xt5OrJmaWxmwyOt5p17rO/FG+o01LI4JV89Xuv8hDISA0DaacP782TPVDBHK8r/PTGuYR4nZ1HytWoUb6TdyqogJcHjRZbXp5gAcS20xISu/vHXj42x44b3r5Y1IoU8/Lby9HXr20ZqpufOy/Y9v5P3/8eTjGy9kQxiTcWX2dGYw2pvks7otGRNmRcmYME0Ds7lZSbFYKClDQSMmnEkMQmyk38ipIibA4UWX1aabA3As5XEg8WhCfjPS7eL2o1+HXv128c3/dlk4/igrrcWE5NzxpLyLaRTCQ142zyZhlRdufJTNHu3dvj7dSi9dMaG4vag0TwbdzybMpipLTSfTowmJW5U20m/kVCliwt7enpgAK4suq003B+BYaj6bUHTqq6MM5XR2O1CZDMpO/0z73PK+ostxTHh3e5WnpzPrHE1YIiY0xxfEBB4rMQEOL7qsNt0cgGOp66ajRkyo9f1rqWC3dW4WEbZvT286eiERE6ohpefT05kjjAnJm47m9yOJCWySmACHF11Wm24OwLG0VEzYHd8uH1PIRwjqa6bmZnHh+u1xWU8+v63CJQYTjuIHUWtT0f1K0/uYsseWxQQ2ybMJcHjRZbXp5gAcS81nE4qfHErHhPzx42KFre3r8bMJqbmjvY9uzLawtb1dPOQwyp5cKLYznrw3u+9o68ZH+WDCun7paBM20m/kVBET4PCiy2rTzQE4lrKfFYplPzNU/bmh2k8PzVaYBM0fJErMnW9hXliUFfPHk+iOo3X90tEmbKTfyKkiJsDhRZfVppsDwDqVMSEEDDGBUyKc6gcHB2ICHFJ0ZW26OQCsUxETRqPRZDIJHadN54OpT+EohVP94cOHIRqHM//+/ftiAqxGTAAYsCImhIm9vb3sZqb9/QdwCoRTPZzz4cwXE2BlYgLAgIUO0s7OTpEURqPRmEX2To5NH6pjLZzt4ZwPZ344/8UEWI2YADBgoYN09+7dIinA6XE/F878e/fuiQmwGjEBYMBuAmICrERMAAAAImICAAAQERMAAICImAAAAETEBAAAICImAAAAETEBAACIiAkAAEBETAAAACJiAgAAEBETAACAiJgAAABExAQAACAiJgAAABExAQAAiIgJAABAREwAAAAiYgIAABAREwAAgIiYAAAARMQEAAAgIiYAAAARMQEAAIiICQAAQERMAAAAImICAAAQERMAAICImAAwZB+8duVr197uLjnS7R7B5t6+1q/Gw2/68RyrtTmi5mbVBlde+2BNlTXa2NHw7n3qdZqFeT3avsHXuuc+PrYtLlVD50vQ91I9TAOOos5lKz/Kt7sFW1zrok1iAsCQbTwmHAExocXRNHe9ta7cAVu9tmMfE7odz5jQrGpIMWHlFcUEAE6Q7pgQPsWnqsuUpcnPlubcrC/wWvGN8/Qr58oytQY01s17cK81t5duWGV71641Zqcqb910ZV42OetGhqXmPcpolfbD0rYX06/hK4XZkteuXZkdmXJ6xRbW25nX1nhpe9TW1v5aPY1Xdr7v1b3osa35q1ddrPlK5Ssml2++QB01zGNC/npMm9P54naefomXNXEJtBW2HMOykxm/ENWFa7OzGt+uTHdU3lVnx84ufh17jSb0uVS7D2+15un0wmuzx7GKN9TzdOps4Wxino8SIbVxhne9DyxqauvxTL4tLE1MABiyrphQ+yir9njmnarGp8u8l1qbqvYiWzsPiXWjjtt8KtV/rLSh2cREszs3Xe87zteofaR3N762WHIvqv2K8mhU963WF1mlhY3XoXxpl6gt3f5+B6G+F+Uay22r4zXr2bauV3265eranVvuPv1SL2vyEkgXth3D+enRfXCq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ZHN0cmVhbQplbmRvYmoKNDY1IDAgb2JqCjE0OTQKZW5kb2JqCjQ2NiAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Db250ZW50cyA0NjQgMCBSCj4+CmVuZG9iago0NjcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAyNDkuMDA2IG51bGxdCj4+CmVuZG9iago0NjggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNzA5LjAwNSA0MDcuMDIzIDcxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDY3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ2OSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDcwOS4wMDUgNTM5Ljk5NyA3MTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ2NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNTIgMCBSIC9YWVogNzIuMCAxNzIuNTA3IG51bGxdCj4+CmVuZG9iago0NzEgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjk3LjAwNSAzODQuNzIxIDcwNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDcwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuNjM3IDY5Ny4wMDUgNTM5Ljk5NyA3MDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3MCAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzMgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ3NCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2ODUuMDA1IDQwNy4wODIgNjk0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzggNjg1LjAwNSA1MzkuOTk4IDY5NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDczIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ3NiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCA2NDkuNiBudWxsXQo+PgplbmRvYmoKNDc3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDY3My4wMDUgNDIxLjI4NiA2ODIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3NiAwIFIKL0ggL0kKCj4+CmVuZG9iago0NzggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA2NzMuMDA1IDUzOS45OTcgNjgyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0NzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDc5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDU3My4yIG51bGxdCj4+CmVuZG9iago0ODAgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjYxLjAwNSA0MDIuOTc5IDY3MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDc5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzMuODA4IDY2MS4wMDUgNTQwLjE2OCA2NzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ3OSAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjEyIDAgUiAvWFlaIDcyLjAgNDk2LjggbnVsbF0KPj4KZW5kb2JqCjQ4MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA2NDkuMDA1IDQxMS4yNzYgNjU4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUzMy42MzcgNjQ5LjAwNSA1MzkuOTk3IDY1OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDgyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ4NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyMTIgMCBSIC9YWVogNzIuMCAzODQuNCBudWxsXQo+PgplbmRvYmoKNDg2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDYzNy4wMDUgNDEzLjgwNiA2NDYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4NSAwIFIKL0ggL0kKCj4+CmVuZG9iago0ODcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTMzLjYzNyA2MzcuMDA1IDUzOS45OTcgNjQ2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0ODUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDg4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIxMiAwIFIgL1hZWiA3Mi4wIDMwOC4wIG51bGxdCj4+CmVuZG9iago0ODkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjI1LjAwNSAzOTYuMDA5IDYzNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDg4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5MCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MzQuMzM3IDYyNS4wMDUgNTQwLjY5NyA2MzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ4OCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTEgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjI3IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjQ5MiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDYxMy4wMDUgMTI1LjI3NiA2MjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5MSAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA2MTMuMDA1IDUzOS45OTggNjIyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNDk0IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIyNyAwIFIgL1hZWiA3Mi4wIDcwMC44IG51bGxdCj4+CmVuZG9iago0OTUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNjAxLjAwNSAyOTQuNTc4IDYxMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNDk0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjQ5NiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDYwMS4wMDUgNTM5Ljk5OCA2MTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NCAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjMwIDAgUiAvWFlaIDcyLjAgNDM1LjU0NiBudWxsXQo+PgplbmRvYmoKNDk4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU4OS4wMDUgMzI3LjU5MyA1OTguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDQ5NyAwIFIKL0ggL0kKCj4+CmVuZG9iago0OTkgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3NyA1ODkuMDA1IDUzOS45OTcgNTk4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA0OTcgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTAwIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzIzMCAwIFIgL1hZWiA3Mi4wIDIwMC4wNzQgbnVsbF0KPj4KZW5kb2JqCjUwMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NzcuMDA1IDMyOC4wNDYgNTg2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTAyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzcgNTc3LjAwNSA1MzkuOTk3IDU4Ni45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAwIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwMyAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFsyNDEgMCBSIC9YWVogNzIuMCA0NDkuMzYzIG51bGxdCj4+CmVuZG9iago1MDQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTY1LjAwNSAyMDkuODY5IDU3NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTAzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUwNSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDU2NS4wMDUgNTM5Ljk5OCA1NzQuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwMyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDYgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMjg1IDAgUiAvWFlaIDcyLjAgNTUwLjU3MiBudWxsXQo+PgplbmRvYmoKNTA3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDU1My4wMDUgMjAzLjA5NiA1NjIuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUwNiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MDggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1NTMuMDA1IDUzOS45OTggNTYyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTA5IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzI4NSAwIFIgL1hZWiA3Mi4wIDM1OS41MjggbnVsbF0KPj4KZW5kb2JqCjUxMCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1NDEuMDA1IDMxNy40OTMgNTUwLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MDkgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTExIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzcgNTQxLjAwNSA1MzkuOTk3IDU1MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTA5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxMiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszMTEgMCBSIC9YWVogNzIuMCAzOTkuMDQ2IG51bGxdCj4+CmVuZG9iago1MTMgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNTI5LjAwNSAyNDEuOTI2IDUzOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTEyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUxNCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDUyOS4wMDUgNTM5Ljk5OCA1MzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxMiAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTUgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbMzI2IDAgUiAvWFlaIDcyLjAgMjczLjAwNCBudWxsXQo+PgplbmRvYmoKNTE2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDUxNy4wMDUgMTgwLjUzNSA1MjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUxNSAwIFIKL0ggL0kKCj4+CmVuZG9iago1MTcgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA1MTcuMDA1IDUzOS45OTggNTI2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTUgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTE4IDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzMzNyAwIFIgL1hZWiA3Mi4wIDI3Ni4yMTEgbnVsbF0KPj4KZW5kb2JqCjUxOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA1MDUuMDA1IDM1OS40ODEgNTE0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MTggMCBSCi9IIC9JCgo+PgplbmRvYmoKNTIwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNTA1LjAwNSA1MzkuOTk4IDUxNC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTE4IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyMSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFszODUgMCBSIC9YWVogNzIuMCAyMjUuMjcyIG51bGxdCj4+CmVuZG9iago1MjIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDkzLjAwNSAyNjkuNDcgNTAyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MjEgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTIzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy42MjcgNDkzLjAwNSA1NDAuMzQ3IDUwMi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTIxIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNCAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0MDkgMCBSIC9YWVogNzIuMCA1MTYuMDY5IG51bGxdCj4+CmVuZG9iago1MjUgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDgxLjAwNSAyNzUuNTgzIDQ5MC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTI0IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyNiAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuNjI4IDQ4MS4wMDUgNTQwLjM0OCA0OTAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MjcgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDM3IDAgUiAvWFlaIDcyLjAgNDU0LjE2IG51bGxdCj4+CmVuZG9iago1MjggMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgMTA0LjAgNDY5LjAwNSAzNjAuMDc4IDQ3OC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTI3IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUyOSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc3IDQ2OS4wMDUgNTM5Ljk5NyA0NzguOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUyNyAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzAgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDQ1IDAgUiAvWFlaIDcyLjAgNzIwLjAgbnVsbF0KPj4KZW5kb2JqCjUzMSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA4MC4wIDQ1Ny4wMDUgMjYxLjcwMyA0NjYuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzMCAwIFIKL0ggL0kKCj4+CmVuZG9iago1MzIgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgNTI3LjI3OCA0NTcuMDA1IDUzOS45OTggNDY2Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzAgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTMzIDAgb2JqCjw8IC9UeXBlIC9BY3Rpb24KL1MgL0dvVG8KL0QgWzQ0OCAwIFIgL1hZWiA3Mi4wIDcyMC4wIG51bGxdCj4+CmVuZG9iago1MzQgMCBvYmoKPDwgL1R5cGUgL0Fubm90Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsgODAuMCA0NDUuMDA1IDEzMi45MDggNDU0Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzMgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDQ1LjAwNSA1MzkuOTk4IDQ1NC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTMzIDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzNiAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjMgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTM3IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgNDMzLjAwNSAxMTkuMDYgNDQyLjk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1MzYgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTM4IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDMzLjAwNSA1MzkuOTk4IDQ0Mi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM2IDAgUgovSCAvSQoKPj4KZW5kb2JqCjUzOSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjMgMCBSIC9YWVogNzIuMCA2NzguOCBudWxsXQo+PgplbmRvYmoKNTQwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDEwNC4wIDQyMS4wMDUgMTcxLjkyIDQzMC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTM5IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0MSAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyA1MjcuMjc4IDQyMS4wMDUgNTM5Ljk5OCA0MzAuOTk1IF0KL0MgWyAwIDAgMCBdCi9Cb3JkZXIgWyAwIDAgMCBdCi9BIDUzOSAwIFIKL0ggL0kKCj4+CmVuZG9iago1NDIgMCBvYmoKPDwgL1R5cGUgL0FjdGlvbgovUyAvR29UbwovRCBbNDYzIDAgUiAvWFlaIDcyLjAgNjI0LjQgbnVsbF0KPj4KZW5kb2JqCjU0MyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWyAxMDQuMCA0MDkuMDA1IDE2Ny44MzMgNDE4Ljk5NSBdCi9DIFsgMCAwIDAgXQovQm9yZGVyIFsgMCAwIDAgXQovQSA1NDIgMCBSCi9IIC9JCgo+PgplbmRvYmoKNTQ0IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDUyNy4yNzggNDA5LjAwNSA1MzkuOTk4IDQxOC45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTQyIDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0NSAwIG9iago8PCAvVHlwZSAvQWN0aW9uCi9TIC9Hb1RvCi9EIFs0NjYgMCBSIC9YWVogNzIuMCA3MjAuMCBudWxsXQo+PgplbmRvYmoKNTQ2IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbIDgwLjAgMzk3LjAwNSAxNTQuNjY1IDQwNi45OTUgXQovQyBbIDAgMCAwIF0KL0JvcmRlciBbIDAgMCAwIF0KL0EgNTQ1IDAgUgovSCAvSQoKPj4KZW5kb2JqCjU0NyAwIG9iago8PCAvVHlwZSAv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MCAwIFIKNDkyIDAgUgo0OTMgMCBSCjQ5NSAwIFIKNDk2IDAgUgo0OTggMCBSCjQ5OSAwIFIKNTAxIDAgUgo1MDIgMCBSCjUwNCAwIFIKNTA1IDAgUgo1MDcgMCBSCjUwOCAwIFIKNTEwIDAgUgo1MTEgMCBSCjUxMyAwIFIKNTE0IDAgUgo1MTYgMCBSCjUxNyAwIFIKNTE5IDAgUgo1MjAgMCBSCjUyMiAwIFIKNTIzIDAgUgo1MjUgMCBSCjUyNiAwIFIKNTI4IDAgUgo1MjkgMCBSCjUzMSAwIFIKNTMyIDAgUgo1MzQgMCBSCjUzNSAwIFIKNTM3IDAgUgo1MzggMCBSCjU0MCAwIFIKNTQxIDAgUgo1NDMgMCBSCjU0NCAwIFIKNTQ2IDAgUgo1NDcgMCBSCl0KZW5kb2JqCjU1MSAwIG9iago8PAogIC9SZXNvdXJjZXMgMTQgMCBSCiAgL1R5cGUgL1BhZ2UKICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQogIC9Dcm9wQm94IFswIDAgNjEyIDc5Ml0KICAvQmxlZWRCb3ggWzAgMCA2MTIgNzkyXQogIC9UcmltQm94IFswIDAgNjEyIDc5Ml0KICAvUGFyZW50IDE1IDAgUgogIC9Bbm5vdHMgNTUwIDAgUgogIC9Db250ZW50cyA1NDggMCBSCj4+CmVuZG9iago1NTIgMCBvYmoKPDwKICAvVHlwZSAvRm9udERlc2NyaXB0b3IKICAvRm9udE5hbWUgL0VBQUFBQStEZWphVnVTYW5zLUJvbGQKICAvRm9udEJCb3ggWy0xMDY5IC00MTUgMTk3NSAxMTc0XQogIC9GbGFncyAzMwogIC9DYXBIZWlnaHQgNzI5CiAgL0FzY2VudCAxMTc0CiAgL0Rlc2NlbnQgLTQxNQogIC9JdGFsaWNBbmdsZSAwCiAgL1N0ZW1WIDAKICAvTWlzc2luZ1dpZHRoIDUwMAogIC9Gb250RmlsZTIgNTUzIDAgUgogIC9DSURTZXQgNTU0IDAgUgo+PgplbmRvYmoKNTUzIDAgb2JqCjw8CiAgL0xlbmd0aDEgMzAxNTIKICAvTGVuZ3RoIDU1NSAwIFIKICAvRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeJztvQl8FEUWMF7V1d0z03MnmdxH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b2JqCjU4OCAwIG9iago8PAogIC9UeXBlIC9DYXRhbG9nCiAgL1BhZ2VzIDE1IDAgUgogIC9MYW5nIChlbikKICAvTWV0YWRhdGEgNSAwIFIKICAvUGFnZUxhYmVscyA1ODkgMCBSCj4+CmVuZG9iagoxNCAwIG9iago8PAogIC9Gb250IDw8CiAgL0YxNiA1NTcgMCBSCiAgL0YxNSA1NjYgMCBSCiAgL0YxNyA1NzUgMCBSCiAgL0YxOSA1ODQgMCBSCj4+CiAgL1Byb2NTZXQgWy9QREYgL0ltYWdlQiAvSW1hZ2VDIC9UZXh0XQogIC9YT2JqZWN0IDw8CiAgL0ltMSA3IDAgUgogIC9JbTIgOSAwIFIKICAvSW0zIDE2IDAgUgogIC9JbTQgMTggMCBSCiAgL0ltNSAyMTMgMCBSCiAgL0ltNiAyMTUgMCBSCiAgL0ltNyAyMTcgMCBSCiAgL0ltOCAyMTkgMCBSCiAgL0ltOSAyMjEgMCBSCiAgL0ltMTAgMjIzIDAgUgogIC9JbTExIDIzMSAwIFIKICAvSW0xMiAyMzMgMCBSCiAgL0ltMTMgMjM1IDAgUgogIC9JbTE0IDIzNyAwIFIKICAvSW0xNSAyNDIgMCBSCiAgL0ltMTYgMjQ0IDAgUgogIC9JbTE3IDI0OSAwIFIKICAvSW0xOCAyNTEgMCBSCiAgL0ltMTkgMjUzIDAgUgogIC9JbTIwIDI1NSAwIFIKICAvSW0yMSAyNjAgMCBSCiAgL0ltMjIgMjYyIDAgUgogIC9JbTIzIDI2NCAwIFIKICAvSW0yNCAyNjYgMCBSCiAgL0ltMjUgMjY4IDAgUgogIC9JbTI2IDI3MCAwIFIKICAvSW0yNyAyNzUgMCBSCiAgL0ltMjggMjc3IDAgUgogIC9JbTI5IDI3OSAwIFIKICAvSW0zMCAyODEgMCBSCiAgL0ltMzEgMjg2IDAgUgogIC9JbTMyIDI4OCAwIFIKICAvSW0zMyAyOTMgMCBSCiAgL0ltMzQgMjk1IDAgUgogIC9JbTM1IDMwMyAwIFIKICAvSW0zNiAzMDUgMCBSCiAgL0ltMzcgMzA3IDAgUgogIC9JbTM4IDMxMiAwIFIKICAvSW0zOSAzMTQgMCBSCiAgL0ltNDAgMzE2IDAgUgogIC9JbTQxIDMxOCAwIFIKICAvSW00MiAzMjAgMCBSCiAgL0ltNDMgMzIyIDAgUgogIC9JbTQ0IDMyNyAwIFIKICAvSW00NSAzMjkgMCBSCiAgL0ltNDYgMzMxIDAgUgogIC9JbTQ3IDMzMyAwIFIKICAvSW00OCAzMzggMCBSCiAgL0ltNDkgMzQwIDAgUgogIC9JbTUwIDM0MiAwIFIKICAvSW01MSAzNDQgMCBSCiAgL0ltNTIgMzQ5IDAgUgogIC9JbTUzIDM1MSAwIFIKICAvSW01NCAzNTMgMCBSCiAgL0ltNTUgMzU1IDAgUgogIC9JbTU2IDM1NyAwIFIKICAvSW01NyAzNTkgMCBSCiAgL0ltNTggMzY0IDAgUgogIC9JbTU5IDM2NiAwIFIKICAvSW02MCAzNjggMCBSCiAgL0ltNjEgMzcwIDAgUgogIC9JbTYyIDM3NSAwIFIKICAvSW02MyAzNzcgMCBSCiAgL0ltNjQgMzc5IDAgUgogIC9JbTY1IDM4MSAwIFIKICAvSW02NiAzODYgMCBSCiAgL0ltNjcgMzg4IDAgUgogIC9JbTY4IDM5MCAwIFIKICAvSW02OSAzOTIgMCBSCiAgL0ltNzAgMzk0IDAgUgogIC9JbTcxIDM5NiAwIFIKICAvSW03MiA0MDEgMCBSCiAgL0ltNzMgNDAzIDAgUgogIC9JbTc0IDQwNSAwIFIKICAvSW03NSA0MTAgMCBSCiAgL0ltNzYgNDEyIDAgUgogIC9JbTc3IDQxNCAwIFIKICAvSW03OCA0MTYgMCBSCiAgL0ltNzkgNDI0IDAgUgogIC9JbTgwIDQyNiAwIFIKICAvSW04MSA0MzEgMCBSCiAgL0ltODIgNDMzIDAgUgogIC9JbTgzIDQzOCAwIFIKPj4KICAvQ29sb3JTcGFjZSA8PCAvRGVmYXVsdFJHQiA0IDAgUiAvSUNDMzAwIDMwMiAwIFIgPj4KPj4KZW5kb2JqCjU4OSAwIG9iago8PCAvTnVtcyBbMCA8PCAvUyAvRCA+PiAxIDw8IC9TIC9yIC9TdCAyID4+IDIgPDwgL1MgL3IgL1N0IDMgPj4gMyA8PCAvUyAvciAvU3QgNCA+PiA0IDw8IC9TIC9EID4+IDEyIDw8IC9TIC9EIC9TdCA5ID4+XSA+PgplbmRvYmoKeHJlZgowIDU5MAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDE0NSAwMDAwMCBuIAowMDAwMDAyNjgzIDAwMDAwIG4gCjAwMDAwMDI3MDMgMDAwMDAgbiAKMDAwMDAwMjczNiAwMDAwMCBuIAowMDAwMDAzNjgzIDAwMDAwIG4gCjAwMDAwMDM3MDIgMDAwMDAgbiAKMDAwMDA1MjIyNyAwMDAwMCBuIAowMDAwMDUyMjQ4IDAwMDAwIG4gCjAwMDAxMDU1MDggMDAwMDAgbiAKMDAwMDEwNTUzMCAwMDAwMCBuIAowMDAwMTA2MDQ3IDAwMDAwIG4gCjAwMDAxMDYwNjcgMDAwMDAgbiAKMDAwMDgxMTkxMyAwMDAwMCBuIAowMDAwODExNDA4IDAwMDAwIG4gCjAwMDAxMDYyNjEgMDAwMDAgbiAKMDAwMDExMjQzMiAwMDAwMCBuIAowMDAwMTEyNDUzIDAwMDAwIG4gCjAwMDAxMTk2MzMgMDAwMDAgbiAKMDAwMDExOTY1NCAwMDAwMCBuIAowMDAwMTE5NzM5IDAwMDAwIG4gCjAwMDAxMTk4NzcgMDAwMDAgbiAKMDAwMDEyMDc4NiAwMDAwMCBuIAowMDAwMTIwODA2IDAwMDAwIG4gCjAwMDAxMjA4MzMgMDAwMDAgbiAKMDAwMDEyMTA0NCAwMDAwMCBuIAowMDAwMTIzOTUyIDAwMDAwIG4gCjAwMDAxMjM5NzMgMDAwMDAgbiAKMDAwMDEyNDE2NyAwMDAwMCBuIAowMDAwMTI2NTY5IDAwMDAwIG4gCjAwMDAxMjY1OTAgMDAwMDAgbiAKMDAwMDEyNjc4NCAwMDAwMCBuIAowMDAwMTI3ODM0IDAwMDAwIG4gCjAwMDAxMjc4NTQgMDAwMDAgbiAKMDAwMDEyODA0OCAwMDAwMCBuIAowMDAwMTI4MTQzIDAwMDAwIG4gCjAwMDAxMjgyNzkgMDAwMDAgbiAKMDAwMDEyOTUzMyAwMDAwMCBuIAowMDAwMTI5NTU0IDAwMDAwIG4gCjAwMDAxMjk1ODEgMDAwMDAgbiAKMDAwMDEyOTc5MiAwMDAwMCBuIAowMDAwMTMxNDk0IDAwMDAwIG4gCjAwMDAxMzE1MTUgMDAwMDAgbiAKMDAwMDEzMTcwOSAwMDAwMCBuIAowMDAwMTMzMzY3IDAwMDAwIG4gCjAwMDAxMzMzODggMDAwMDAgbiAKMDAwMDEzMzU4MiAwMDAwMCBuIAowMDAwMTM2MDM1IDAwMDAwIG4gCjAwMDAxMzYwNTYgMDAwMDAgbiAKMDAwMDEzNjI1MCAwMDAwMCBuIAowMDAwMTM4MDIxIDAwMDAwIG4gCjAwMDAxMzgwNDIgMDAwMDAgbiAKMDAwMDEzODIzNiAwMDAwMCBuIAowMDAwMTM4MzE0IDAwMDAwIG4gCjAwMDAxMzg0NTAgMDAwMDAgbiAKMDAwMDEzODU4NyAwMDAwMCBuIAowMDAwMTM4NjY1IDAwMDAwIG4gCjAwMDAxMzg4MDIgMDAwMDAgbiAKMDAwMDEzODk0MiAwMDAwMCBuIAowMDAwMTM5MDIwIDAwMDAwIG4gCjAwMDAxMzkxNTggMDAwMDAgbiAKMDAwMDEzOTI5OCAwMDAwMCBuIAowMDAwMTM5Mzc3IDAwMDAwIG4gCjAwMDAxMzk1MTUgMDAwMDAgbiAKMDAwMDEzOTY1NSAwMDAwMCBuIAowMDAwMTM5NzM0IDAwMDAwIG4gCjAwMDAxMzk4NzIgMDAwMDAgbiAKMDAwMDE0MDAxMiAwMDAwMCBuIAowMDAwMTQwMDkxIDAwMDAwIG4gCjAwMDAxNDAyMjkgMDAwMDAgbiAKMDAwMDE0MDM2OSAwMDAwMCBuIAowMDAwMTQwNDQ4IDAwMDAwIG4gCjAwMDAxNDA1ODUgMDAwMDAgbiAKMDAwMDE0MDcyNSAwMDAwMCBuIAowMDAwMTQwODAzIDAwMDAwIG4gCjAwMDAxNDA5NDEgMDAwMDAgbiAKMDAwMDE0MTA4MSAwMDAwMCBuIAowMDAwMTQxMTU5IDAwMDAwIG4gCjAwMDAxNDEyOTcgMDAwMDAgbiAKMDAwMDE0MTQzNyAwMDAwMCBuIAowMDAwMTQxNTE1IDAwMDAwIG4gCjAwMDAxNDE2NTMgMDAwMDAgbiAKMDAwMDE0MTc5MyAwMDAwMCBuIAowMDAwMTQxODcxIDAwMDAwIG4gCjAwMDAxNDIwMDkgMDAwMDAgbiAKMDAwMDE0MjE0OSAwMDAwMCBuIAowMDAwMTQyMjI3IDAwMDAwIG4gCjAwMDAxNDIzNjQgMDAwMDAgbiAKMDAwMDE0MjUwNCAwMDAwMCBuIAowMDAwMTQyNTgyIDAwMDAwIG4gCjAwMDAxNDI3MjAgMDAwMDAgbiAKMDAwMDE0Mjg2MCAwMDAwMCBuIAowMDAwMTQyOTM4IDAwMDAwIG4gCjAwMDAxNDMwNzYgMDAwMDAgbiAKMDAwMDE0MzIxNiAwMDAwMCBuIAowMDAwMTQzMjk0IDAwMDAwIG4gCjAwMDAxNDM0MzIgMDAwMDAgbiAKMDAwMDE0MzU3MiAwMDAwMCBuIAowMDAwMTQzNjUwIDAwMDAwIG4gCjAwMDAxNDM3ODggMDAwMDAgbiAKMDAwMDE0MzkyOSAwMDAwMCBuIAowMDAwMTQ0MDA4IDAwMDAwIG4gCjAwMDAxNDQxNDYgMDAwMDAgbiAKMDAwMDE0NDI4OCAwMDAwMCBuIAowMDAwMTQ0MzY3IDAwMDAwIG4gCjAwMDAxNDQ1MDcgMDAwMDAgbiAKMDAwMDE0NDY0OSAwMDAwMCBuIAowMDAwMTQ0NzI4IDAwMDAwIG4gCjAwMDAxNDQ4NjggMDAwMDAgbiAKMDAwMDE0NTAxMCAwMDAwMCBuIAowMDAwMTQ1MDg5IDAwMDAwIG4gCjAwMDAxNDUyMjggMDAwMDAgbiAKMDAwMDE0NTM3MCAwMDAwMCBuIAowMDAwMTQ1NDUxIDAwMDAwIG4gCjAwMDAxNDU1OTEgMDAwMDAgbiAKMDAwMDE0NTczMyAwMDAwMCBuIAowMDAwMTQ1ODE0IDAwMDAwIG4gCjAwMDAxNDU5NTQgMDAwMDAgbiAKMDAwMDE0NjA5NiAwMDAwMCBuIAowMDAwMTQ2MTc3IDAwMDAwIG4gCjAwMDAxNDYzMTcgMDAwMDAgbiAKMDAwMDE0NjQ1OSAwMDAwMCBuIAowMDAwMTQ2NTQwIDAwMDAwIG4gCjAwMDAxNDY2NzkgMDAwMDAgbiAKMDAwMDE0NjgyMSAwMDAwMCBuIAowMDAwMTQ2OTAyIDAwMDAwIG4gCjAwMDAxNDcwNDIgMDAwMDAgbiAKMDAwMDE0NzE4NCAwMDAwMCBuIAowMDAwMTQ3MjY1IDAwMDAwIG4gCjAwMDAxNDc0MDUgMDAwMDAgbiAKMDAwMDE0NzU0NyAwMDAwMCBuIAowMDAwMTQ3NjI4IDAwMDAwIG4gCjAwMDAxNDc3NjggMDAwMDAgbiAKMDAwMDE0NzkxMCAwMDAwMCBuIAowMDAwMTQ3OTkxIDAwMDAwIG4gCjAwMDAxNDgxMzEgMDAwMDAgbiAKMDAwMDE0ODI3MyAwMDAwMCBuIAowMDAwMTQ4MzU0IDAwMDAwIG4gCjAwMDAxNDg0OTQgMDAwMDAgbiAKMDAwMDE0ODYzNiAwMDAwMCBuIAowMDAwMTQ4NzE1IDAwMDAwIG4gCjAwMDAxNDg4NTUgMDAwMDAgbiAKMDAwMDE0ODk5NyAwMDAwMCBuIAowMDAwMTQ5MDc3IDAwMDAwIG4gCjAwMDAxNDkyMTcgMDAwMDAgbiAKMDAwMDE0OTM1OSAwMDAwMCBuIAowMDAwMTQ5NDQwIDAwMDAwIG4gCjAwMDAxNDk1ODAgMDAwMDAgbiAKMDAwMDE0OTcyMiAwMDAwMCBuIAowMDAwMTQ5ODAxIDAwMDAwIG4gCjAwMDAxNDk5NDEgMDAwMDAgbiAKMDAwMDE1MDA4MyAwMDAwMCBuIAowMDAwMTUwMTY0IDAwMDAwIG4gCjAwMDAxNTAzMDQgMDAwMDAgbiAKMDAwMDE1MDQ0NiAwMDAwMCBuIAowMDAwMTUwNTI2IDAwMDAwIG4gCjAwMDAxNTA2NjYgMDAwMDAgbiAKMDAwMDE1MDgwOCAwMDAwMCBuIAowMDAwMTUwODg5IDAwMDAwIG4gCjAwMDAxNTEwMjkgMDAwMDAgbiAKMDAwMDE1MTE3MSAwMDAwMCBuIAowMDAwMTUxMjUwIDAwMDAwIG4gCjAwMDAxNTEzOTAgMDAwMDAgbiAKMDAwMDE1MTUzMiAwMDAwMCBuIAowMDAwMTUxNjExIDAwMDAwIG4gCjAwMDAxNTE3NTEgMDAwMDAgbiAKMDAwMDE1MTg5MyAwMDAwMCBuIAowMDAwMTUxOTc0IDAwMDAwIG4gCjAwMDAxNTIxMTMgMDAwMDAgbiAKMDAwMDE1MjI1NSAwMDAwMCBuIAowMDAwMTUyMzM2IDAwMDAwIG4gCjAwMDAxNTI0NzYgMDAwMDAgbiAKMDAwMDE1MjYxOCAwMDAwMCBuIAowMDAwMTUyNjk5IDAwMDAwIG4gCjAwMDAxNTI4MzkgMDAwMDAgbiAKMDAwMDE1Mjk4MSAwMDAwMCBuIAowMDAwMTUzMDYyIDAwMDAwIG4gCjAwMDAxNTMyMDIgMDAwMDAgbiAKMDAwMDE1MzM0NCAwMDAwMCBuIAowMDAwMTUzNDI0IDAwMDAwIG4gCjAwMDAxNTM1NjQgMDAwMDAgbiAKMDAwMDE1MzcwNiAwMDAwMCBuIAowMDAwMTUzNzg3IDAwMDAwIG4gCjAwMDAxNTM5MjYgMDAwMDAgbiAKMDAwMDE1NDA2OCAwMDAwMCBuIAowMDAwMTU0MTQ5IDAwMDAwIG4gCjAwMDAxNTQyODkgMDAwMDAgbiAKMDAwMDE1NDQzMSAwMDAwMCBuIAowMDAwMTU0NTEwIDAwMDAwIG4gCjAwMDAxNTQ2NTAgMDAwMDAgbiAKMDAwMDE1NDc5MiAwMDAwMCBuIAowMDAwMTU0ODczIDAwMDAwIG4gCjAwMDAxNTUwMTMgMDAwMDAgbiAKMDAwMDE1NTE1NSAwMDAwMCBuIAowMDAwMTU1MjM2IDAwMDAwIG4gCjAwMDAxNTUzNzYgMDAwMDAgbiAKMDAwMDE1NTUxOCAwMDAwMCBuIAowMDAwMTU1NTk5IDAwMDAwIG4gCjAwMDAxNTU3MzkgMDAwMDAgbiAKMDAwMDE1NTg4MSAwMDAwMCBuIAowMDAwMTU1OTYyIDAwMDAwIG4gCjAwMDAxNTYxMDEgMDAwMDAgbiAKMDAwMDE1NjI0MiAwMDAwMCBuIAowMDAwMTU2MzIzIDAwMDAwIG4gCjAwMDAxNTY0NjEgMDAwMDAgbiAKMDAwMDE1NjYwMSAwMDAwMCBuIAowMDAwMTc5MjU0IDAwMDAwIG4gCjAwMDAxNzkyNzcgMDAwMDAgbiAKMDAwMDE4MDA4MyAwMDAwMCBuIAowMDAwMTgwMjk3IDAwMDAwIG4gCjAwMDAxODE5NjMgMDAwMDAgbiAKMDAwMDE4MTk4NSAwMDAwMCBuIAowMDAwMTgyMTgxIDAwMDAwIG4gCjAwMDAxODMzMTIgMDAwMDAgbiAKMDAwMDE4MzMzMyAwMDAwMCBuIAowMDAwMjA5MzMyIDAwMDAwIG4gCjAwMDAyMDkzNTUgMDAwMDAgbiAKMDAwMDIxMDQxMSAwMDAwMCBuIAowMDAwMjEwNDMyIDAwMDAwIG4gCjAwMDAyMzEzNDIgMDAwMDAgbiAKMDAwMDIzMTM2NSAwMDAwMCBuIAowMDAwMjMyMDIyIDAwMDAwIG4gCjAwMDAyMzIwNDMgMDAwMDAgbiAKMDAwMDI4MTUwOCAwMDAwMCBuIAowMDAwMjgxNTMxIDAwMDAwIG4gCjAwMDAyODI4MjYgMDAwMDAgbiAKMDAwMDI4Mjg0OCAwMDAwMCBuIAowMDAwMjgzMDQ0IDAwMDAwIG4gCjAwMDAyODY2MzcgMDAwMDAgbiAKMDAwMDI4NjY1OSAwMDAwMCBuIAowMDAwMjg2ODU1IDAwMDAwIG4gCjAwMDAyODc0MDQgMDAwMDAgbiAKMDAwMDI4NzQyNSAwMDAwMCBuIAowMDAwMzAwMTY5IDAwMDAwIG4gCjAwMDAzMDAxOTIgMDAwMDAgbiAKMDAwMDMwMTY5MiAwMDAwMCBuIAowMDAwMzAxNzE0IDAwMDAwIG4gCjAwMDAzNTAzNzcgMDAwMDAgbiAKMDAwMDM1MDQwMCAwMDAwMCBuIAowMDAwMzUyNDE1IDAwMDAwIG4gCjAwMDAzNTI0MzcgMDAwMDAgbiAKMDAwMDM1MjYzMyAwMDAwMCBuIAowMDAwMzUyOTg1IDAwMDAwIG4gCjAwMDAzNTMwMDYgMDAwMDAgbiAKMDAwMDM2MjA1MCAwMDAwMCBuIAowMDAwMzYyMDcyIDAwMDAwIG4gCjAwMDAzNjM1ODggMDAwMDAgbiAKMDAwMDM2MzYxMCAwMDAwMCBuIAowMDAwMzYzODA2IDAwMDAwIG4gCjAwMDAzNjQxMTggMDAwMDAgbiAKMDAwMDM2NDEzOSAwMDAwMCBuIAowMDAwMzY5NzE1IDAwMDAwIG4gCjAwMDAzNjk3MzcgMDAwMDAgbiAKMDAwMDM3MDg3NCAwMDAwMCBuIAowMDAwMzcwODk1IDAwMDAwIG4gCjAwMDAzOTQ3NzUgMDAwMDAgbiAKMDAwMDM5NDc5OCAwMDAwMCBuIAowMDAwMzk1OTEwIDAwMDAwIG4gCjAwMDAzOTU5MzIgMDAwMDAgbiAKMDAwMDM5NjEyOCAwMDAwMCBuIAowMDAwMzk2OTU5IDAwMDAwIG4gCjAwMDAzOTY5ODAgMDAwMDAgbiAKMDAwMDQxMTk4NiAwMDAwMCBuIAowMDAwNDEyMDA5IDAwMDAwIG4gCjAwMDA0MTIyNjQgMDAwMDAgbiAKMDAwMDQxMjI4NCAwMDAwMCBuIAowMDAwNDE0NzM5IDAwMDAwIG4gCjAwMDA0MTQ3NjEgMDAwMDAgbiAKMDAwMDQxNTA0MSAwMDAwMCBuIAowMDAwNDE1MDYxIDAwMDAwIG4gCjAwMDA0MjAwNjUgMDAwMDAgbiAKMDAwMDQyMDA4NyAwMDAwMCBuIAowMDAwNDIxNDAyIDAwMDAwIG4gCjAwMDA0MjE0MjQgMDAwMDAgbiAKMDAwMDQyMTYyMCAwMDAwMCBuIAowMDAwNDIxOTIwIDAwMDAwIG4gCjAwMDA0MjE5NDAgMDAwMDAgbiAKMDAwMDQyNTYzMSAwMDAwMCBuIAowMDAwNDI1NjUzIDAwMDAwIG4gCjAwMDA0MjY1MDcgMDAwMDAgbiAKMDAwMDQyNjUyOCAwMDAwMCBuIAowMDAwNDQyNDE1IDAwMDAwIG4gCjAwMDA0NDI0MzggMDAwMDAgbiAKMDAwMDQ0Mzg4MSAwMDAwMCBuIAowMDAwNDQzOTAzIDAwMDAwIG4gCjAwMDA0NDQwOTkgMDAwMDAgbiAKMDAwMDQ0NDczOCAwMDAwMCBuIAowMDAwNDQ0NzU5IDAwMDAwIG4gCjAwMDA0NjMxODQgMDAwMDAgbiAKMDAwMDQ2MzIwNyAwMDAwMCBuIAowMDAwNDY0MjE2IDAwMDAwIG4gCjAwMDA0NjQyMzcgMDAwMDAgbiAKMDAwMDQ2NDQzMyAwMDAwMCBuIAowMDAwNDY0NzU1IDAwMDAwIG4gCjAwMDA0NjQ3NzYgMDAwMDAgbiAKMDAwMDQ2OTQwMSAwMDAwMCBuIAowMDAwNDY5NDIzIDAwMDAwIG4gCjAwMDA0NzE0MTcgMDAwMDAgbiAKMDAwMDQ3MTQzOSAwMDAwMCBuIAowMDAwNDcxNjM1IDAwMDAwIG4gCjAwMDA0NzQzNDAgMDAwMDAgbiAKMDAwMDQ3NDM2MiAwMDAwMCBuIAowMDAwNDc0Mzk5IDAwMDAwIG4gCjAwMDA0ODQwMTcgMDAwMDAgbiAKMDAwMDQ4NDAzOSAwMDAwMCBuIAowMDAwNDg0MzkxIDAwMDAwIG4gCjAwMDA0ODQ0MTIgMDAwMDAgbiAKMDAwMDQ5MTQwMCAwMDAwMCBuIAowMDAwNDkxNDIyIDAwMDAwIG4gCjAwMDA0OTIyNDkgMDAwMDAgbiAKMDAwMDQ5MjI3MCAwMDAwMCBuIAowMDAwNDkyNDY2IDAwMDAwIG4gCjAwMDA0OTI4MDkgMDAwMDAgbiAKMDAwMDQ5MjgzMCAwMDAwMCBuIAowMDAwNDk3ODUwIDAwMDAwIG4gCjAwMDA0OTc4NzIgMDAwMDAgbiAKMDAwMDQ5ODE0MSAwMDAwMCBuIAowMDAwNDk4MTYxIDAwMDAwIG4gCjAwMDA1MDIwNzMgMDAwMDAgbiAKMDAwMDUwMjA5NSAwMDAwMCBuIAowMDAwNTAyMzQ4IDAwMDAwIG4gCjAwMDA1MDIzNjggMDAwMDAgbiAKMDAwMDUwNDQzMSAwMDAwMCBuIAowMDAwNTA0NDUzIDAwMDAwIG4gCjAwMDA1MDYzMjcgMDAwMDAgbiAKMDAwMDUwNjM0OSAwMDAwMCBuIAowMDAwNTA2NTQ1IDAwMDAwIG4gCjAwMDA1MDY5NjMgMDAwMDAgbiAKMDAwMDUwNjk4NCAwMDAwMCBuIAowMDAwNTE3MzI3IDAwMDAwIG4gCjAwMDA1MTczNTAgMDAwMDAgbiAKMDAwMDUxNzU5MyAwMDAwMCBuIAowMDAwNTE3NjEzIDAwMDAwIG4gCjAwMDA1MTkxNDIgMDAwMDAgbiAKMDAwMDUxOTE2NCAwMDAwMCBuIAowMDAwNTIwOTE2IDAwMDAwIG4gCjAwMDA1MjA5MzggMDAwMDAgbiAKMDAwMDUyMTEzNCAwMDAwMCBuIAowMDAwNTIxNzM2IDAwMDAwIG4gCjAwMDA1MjE3NTcgMDAwMDAgbiAKMDAwMDUzNjM0MiAwMDAwMCBuIAowMDAwNTM2MzY1IDAwMDAwIG4gCjAwMDA1MzY2OTggMDAwMDAgbiAKMDAwMDUzNjcxOSAwMDAwMCBuIAowMDAwNTQ1MjM3IDAwMDAwIG4gCjAwMDA1NDUyNTkgMDAwMDAgbiAKMDAwMDU0NjQ2NyAwMDAwMCBuIAowMDAwNTQ2NDg5IDAwMDAwIG4gCjAwMDA1NDY2ODUgMDAwMDAgbiAKMDAwMDU0NzA2OSAwMDAwMCBuIAowMDAwNTQ3MDkwIDAwMDAwIG4gCjAwMDA1NTE3ODIgMDAwMDAgbiAKMDAwMDU1MTgwNCAwMDAwMCBuIAowMDAwNTUyMTkwIDAwMDAwIG4gCjAwMDA1NTIyMTEgMDAwMDAgbiAKMDAwMDU1Njk1MSAwMDAwMCBuIAowMDAwNTU2OTczIDAwMDAwIG4gCjAwMDA1NTc0MjkgMDAwMDAgbiAKMDAwMDU1NzQ1MCAwMDAwMCBuIAowMDAwNTYxODMwIDAwMDAwIG4gCjAwMDA1NjE4NTIgMDAwMDAgbiAKMDAwMDU2NDQxNiAwMDAwMCBuIAowMDAwNTY0NDM4IDAwMDAwIG4gCjAwMDA1NjQ2MzQgMDAwMDAgbiAKMDAwMDU2NTEwNyAwMDAwMCBuIAowMDAwNTY1MTI4IDAwMDAwIG4gCjAwMDA1NzUzNDkgMDAwMDAgbiAKMDAwMDU3NTM3MSAwMDAwMCBuIAowMDAwNTc2MTAxIDAwMDAwIG4gCjAwMDA1NzYxMjIgMDAwMDAgbiAKMDAwMDU5NDI1NiAwMDAwMCBuIAowMDAwNTk0Mjc5IDAwMDAwIG4gCjAwMDA1OTU0MjMgMDAwMDAgbiAKMDAwMDU5NTQ0NSAwMDAwMCBuIAowMDAwNTk1NjQxIDAwMDAwIG4gCjAwMDA1OTY1MDYgMDAwMDAgbiAKMDAwMDU5NjUyNyAwMDAwMCBuIAowMDAwNjI0MjI2IDAwMDAwIG4gCjAwMDA2MjQyNDkgMDAwMDAgbiAKMDAwMDYyNDU5NiAwMDAwMCBuIAowMDAwNjI0NjE3IDAwMDAwIG4gCjAwMDA2MzAzNzUgMDAwMDAgbiAKMDAwMDYzMDM5NyAwMDAwMCBuIAowMDAwNjMyMDI3IDAwMDAwIG4gCjAwMDA2MzIwNDkgMDAwMDAgbiAKMDAwMDYzMjI0NSAwMDAwMCBuIAowMDAwNjMyNTI3IDAwMDAwIG4gCjAwMDA2MzI1NDcgMDAwMDAgbiAKMDAwMDYzNDg2OSAwMDAwMCBuIAowMDAwNjM0ODkxIDAwMDAwIG4gCjAwMDA2MzUyOTIgMDAwMDAgbiAKMDAwMDYzNTMxMyAwMDAwMCBuIAowMDAwNjM5ODI2IDAwMDAwIG4gCjAwMDA2Mzk4NDggMDAwMDAgbiAKMDAwMDY0MDI5OCAwMDAwMCBuIAowMDAwNjQwMzE5IDAwMDAwIG4gCjAwMDA2NDk1MDQgMDAwMDAgbiAKMDAwMDY0OTUyNiAwMDAwMCBuIAowMDAwNjUwNjQ5IDAwMDAwIG4gCjAwMDA2NTA2NzEgMDAwMDAgbiAKMDAwMDY1MDg2NyAwMDAwMCBuIAowMDAwNjU0MjQ0IDAwMDAwIG4gCjAwMDA2NTQyNjYgMDAwMDAgbiAKMDAwMDY1NDc3NSAwMDAwMCBuIAowMDAwNjU0Nzk2IDAwMDAwIG4gCjAwMDA2NjExNjUgMDAwMDAgbiAKMDAwMDY2MTE4NyAwMDAwMCBuIAowMDAwNjYzMTU4IDAwMDAwIG4gCjAwMDA2NjMxODAgMDAwMDAgbiAKMDAwMDY2MzM3NiAwMDAwMCBuIAowMDAwNjY0MDQwIDAwMDAwIG4gCjAwMDA2NjQwNjEgMDAwMDAgbiAKMDAwMDY3NjU1NSAwMDAwMCBuIAowMDAwNjc2NTc4IDAwMDAwIG4gCjAwMDA2NzY5MDEgMDAwMDAgbiAKMDAwMDY3NjkyMiAwMDAwMCBuIAowMDAwNjgyMjI2IDAwMDAwIG4gCjAwMDA2ODIyNDggMDAwMDAgbiAKMDAwMDY4NDIwNyAwMDAwMCBuIAowMDAwNjg0MjI5IDAwMDAwIG4gCjAwMDA2ODQ0MjUgMDAwMDAgbiAKMDAwMDY4NTIxOCAwMDAwMCBuIAowMDAwNjg1MjM5IDAwMDAwIG4gCjAwMDA2ODU0MzUgMDAwMDAgbiAKMDAwMDY4NjA3MCAwMDAwMCBuIAowMDAwNjg2MDkxIDAwMDAwIG4gCjAwMDA3MDE0NjMgMDAwMDAgbiAKMDAwMDcwMTQ4NiAwMDAwMCBuIAowMDAwNzAyNDI5IDAwMDAwIG4gCjAwMDA3MDI0NTAgMDAwMDAgbiAKMDAwMDcwMjY0NiAwMDAwMCBuIAowMDAwNzAyOTcwIDAwMDAwIG4gCjAwMDA3MDI5OTEgMDAwMDAgbiAKMDAwMDcwODg5MyAwMDAwMCBuIAowMDAwNzA4OTE1IDAwMDAwIG4gCjAwMDA3MTEyODIgMDAwMDAgbiAKMDAwMDcxMTMwNCAwMDAwMCBuIAowMDAwNzExNTAwIDAwMDAwIG4gCjAwMDA3MTY1MjYgMDAwMDAgbiAKMDAwMDcxNjU0OCAwMDAwMCBuIAowMDAwNzE3OTg1IDAwMDAwIG4gCjAwMDA3MTgwMDcgMDAwMDAgbiAKMDAwMDcxODIwMyAwMDAwMCBuIAowMDAwNzE5MDM2IDAwMDAwIG4gCjAwMDA3MTkwNTcgMDAwMDAgbiAKMDAwMDcxOTI1MyAwMDAwMCBuIAowMDAwNzIwNjExIDAwMDAwIG4gCjAwMDA3MjA2MzMgMDAwMDAgbiAKMDAwMDcyMDgyOSAwMDAwMCBuIAowMDAwNzIyMTUwIDAwMDAwIG4gCjAwMDA3MjIxNzIgMDAwMDAgbiAKMDAwMDcyMjM2OCAwMDAwMCBuIAowMDAwNzIzNzIyIDAwMDAwIG4gCjAwMDA3MjM3NDQgMDAwMDAgbiAKMDAwMDcyMzk0MCAwMDAwMCBuIAowMDAwNzI1Mjk3IDAwMDAwIG4gCjAwMDA3MjUzMTkgMDAwMDAgbiAKMDAwMDcyNTUxNSAwMDAwMCBuIAowMDAwNzI2MjI0IDAwMDAwIG4gCjAwMDA3MjYyNDUgMDAwMDAgbiAKMDAwMDcyNjQ0MSAwMDAwMCBuIAowMDAwNzI4MTI1IDAwMDAwIG4gCjAwMDA3MjgxNDcgMDAwMDAgbiAKMDAwMDcyODM0MyAwMDAwMCBuIAowMDAwNzI5OTE1IDAwMDAwIG4gCjAwMDA3Mjk5MzcgMDAwMDAgbiAKMDAwMDczMDEzMyAwMDAwMCBuIAowMDAwNzMwMjE0IDAwMDAwIG4gCjAwMDA3MzAzNTQgMDAwMDAgbiAKMDAwMDczMDQ5NiAwMDAwMCBuIAowMDAwNzMwNTc3IDAwMDAwIG4gCjAwMDA3MzA3MTcgMDAwMDAgbiAKMDAwMDczMDg1OSAwMDAwMCBuIAowMDAwNzMwOTM5IDAwMDAwIG4gCjAwMDA3MzEwNzkgMDAwMDAgbiAKMDAwMDczMTIyMSAwMDAwMCBuIAowMDAwNzMxMzAxIDAwMDAwIG4gCjAwMDA3MzE0NDEgMDAwMDAgbiAKMDAwMDczMTU4MyAwMDAwMCBuIAowMDAwNzMxNjYzIDAwMDAwIG4gCjAwMDA3MzE4MDMgMDAwMDAgbiAKMDAwMDczMTk0NSAwMDAwMCBuIAowMDAwNzMyMDI1IDAwMDAwIG4gCjAwMDA3MzIxNjUgMDAwMDAgbiAKMDAwMDczMjMwNyAwMDAwMCBuIAowMDAwNzMyMzg3IDAwMDAwIG4gCjAwMDA3MzI1MjcgMDAwMDAgbiAKMDAwMDczMjY2OSAwMDAwMCBuIAowMDAwNzMyNzQ5IDAwMDAwIG4gCjAwMDA3MzI4ODkgMDAwMDAgbiAKMDAwMDczMzAzMSAwMDAwMCBuIAowMDAwNzMzMTExIDAwMDAwIG4gCjAwMDA3MzMyNTAgMDAwMDAgbiAKMDAwMDczMzM5MiAwMDAwMCBuIAowMDAwNzMzNDcyIDAwMDAwIG4gCjAwMDA3MzM2MTIgMDAwMDAgbiAKMDAwMDczMzc1NCAwMDAwMCBuIAowMDAwNzMzODM2IDAwMDAwIG4gCjAwMDA3MzM5NzYgMDAwMDAgbiAKMDAwMDczNDExOCAwMDAwMCBuIAowMDAwNzM0MjAwIDAwMDAwIG4gCjAwMDA3MzQzNDAgMDAwMDAgbiAKMDAwMDczNDQ4MiAwMDAwMCBuIAowMDAwNzM0NTY0IDAwMDAwIG4gCjAwMDA3MzQ3MDQgMDAwMDAgbiAKMDAwMDczNDg0NiAwMDAwMCBuIAowMDAwNzM0OTI4IDAwMDAwIG4gCjAwMDA3MzUwNjggMDAwMDAgbiAKMDAwMDczNTIxMCAwMDAwMCBuIAowMDAwNzM1MjkyIDAwMDAwIG4gCjAwMDA3MzU0MzIgMDAwMDAgbiAKMDAwMDczNTU3NCAwMDAwMCBuIAowMDAwNzM1NjU2IDAwMDAwIG4gCjAwMDA3MzU3OTYgMDAwMDAgbiAKMDAwMDczNTkzOCAwMDAwMCBuIAowMDAwNzM2MDIwIDAwMDAwIG4gCjAwMDA3MzYxNjAgMDAwMDAgbiAKMDAwMDczNjMwMiAwMDAwMCBuIAowMDAwNzM2Mzg0IDAwMDAwIG4gCjAwMDA3MzY1MjQgMDAwMDAgbiAKMDAwMDczNjY2NiAwMDAwMCBuIAowMDAwNzM2NzQ4IDAwMDAwIG4gCjAwMDA3MzY4ODcgMDAwMDAgbiAKMDAwMDczNzAyOSAwMDAwMCBuIAowMDAwNzM3MTExIDAwMDAwIG4gCjAwMDA3MzcyNTEgMDAwMDAgbiAKMDAwMDczNzM5MyAwMDAwMCBuIAowMDAwNzM3NDc0IDAwMDAwIG4gCjAwMDA3Mzc2MTQgMDAwMDAgbiAKMDAwMDczNzc1NiAwMDAwMCBuIAowMDAwNzM3ODM2IDAwMDAwIG4gCjAwMDA3Mzc5NzUgMDAwMDAgbiAKMDAwMDczODExNyAwMDAwMCBuIAowMDAwNzM4MTk3IDAwMDAwIG4gCjAwMDA3MzgzMzYgMDAwMDAgbiAKMDAwMDczODQ3OCAwMDAwMCBuIAowMDAwNzM4NTU4IDAwMDAwIG4gCjAwMDA3Mzg2OTYgMDAwMDAgbiAKMDAwMDczODgzOCAwMDAwMCBuIAowMDAwNzM4OTE4IDAwMDAwIG4gCjAwMDA3MzkwNTcgMDAwMDAgbiAKMDAwMDczOTE5OSAwMDAwMCBuIAowMDAwNzM5Mjc5IDAwMDAwIG4gCjAwMDA3Mzk0MTkgMDAwMDAgbiAKMDAwMDczOTU2MSAwMDAwMCBuIAowMDAwNzM5NjQxIDAwMDAwIG4gCjAwMDA3Mzk3ODAgMDAwMDAgbiAKMDAwMDczOTkyMiAwMDAwMCBuIAowMDAwNzU0MDQzIDAwMDAwIG4gCjAwMDA3NTQwNjYgMDAwMDAgbiAKMDAwMDc1NDUxOSAwMDAwMCBuIAowMDAwNzU0NzMzIDAwMDAwIG4gCjAwMDA3NTQ5OTggMDAwMDAgbiAKMDAwMDc2OTcxNSAwMDAwMCBuIAowMDAwNzY5NjkyIDAwMDAwIG4gCjAwMDA3Njk4MTUgMDAwMDAgbiAKMDAwMDc2OTgzNSAwMDAwMCBuIAowMDAwNzcwNDg2IDAwMDAwIG4gCjAwMDA3NzAwMDAgMDAwMDAgbiAKMDAwMDc3MTA2NyAwMDAwMCBuIAowMDAwNzcxMDg4IDAwMDAwIG4gCjAwMDA3NzEzNDggMDAwMDAgbiAKMDAwMDc4Nzg1MSAwMDAwMCBuIAowMDAwNzg3ODI4IDAwMDAwIG4gCjAwMDA3ODc5NTcgMDAwMDAgbiAKMDAwMDc4Nzk3NyAwMDAwMCBuIAowMDAwNzg4Njg5IDAwMDAwIG4gCjAwMDA3ODgxMzcgMDAwMDAgbiAKMDAwMDc4OTM0NiAwMDAwMCBuIAowMDAwNzg5MzY3IDAwMDAwIG4gCjAwMDA3ODk2MzUgMDAwMDAgbiAKMDAwMDc5ODg1NyAwMDAwMCBuIAowMDAwNzk4ODM1IDAwMDAwIG4gCjAwMDA3OTg5NTUgMDAwMDAgbiAKMDAwMDc5ODk3NSAwMDAwMCBuIAowMDAwNzk5NDU4IDAwMDAwIG4gCjAwMDA3OTkxNDMgMDAwMDAgbiAKMDAwMDc5OTg1OSAwMDAwMCBuIAowMDAwNzk5ODgwIDAwMDAwIG4gCjAwMDA4MDAxNDIgMDAwMDAgbiAKMDAwMDgxMDIyNCAwMDAwMCBuIAowMDAwODEwMjAyIDAwMDAwIG4gCjAwMDA4MTAzMjIgMDAwMDAgbiAKMDAwMDgxMDM0MiAwMDAwMCBuIAowMDAwODEwODk3IDAwMDAwIG4gCjAwMDA4MTA1MDYgMDAwMDAgbiAKMDAwMDgxMTM4NyAwMDAwMCBuIAowMDAwODExODA0IDAwMDAwIG4gCjAwMDA4MTM0MzMgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9Sb290IDU4OCAwIFIKICAvSW5mbyAxIDAgUgogIC9JRCBbPDIxNTIwMjI2RUU0MjkwOTUxQjA1RENBMzgyQzcyOEVGPiA8MjE1MjAyMjZFRTQyOTA5NTFCMDVEQ0EzODJDNzI4RUY+XQogIC9TaXplIDU5MAo+PgpzdGFydHhyZWYKODEzNTczCiUlRU9GCg==