ITSMLocation 1.1.1 OTRS AG http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Build for OTRS::ITSM 1.1.1. Build for OTRS::ITSM 1.1.0 rc1. Build for OTRS::ITSM 1.1.0 beta4. Build for OTRS::ITSM 1.1.0 beta3. Build for OTRS::ITSM 1.1.0 beta2. Build for OTRS::ITSM 1.1.0 beta1. Testbuild for OTRS::ITSM 1.1.0 beta1. The OTRS::ITSM location package. Das OTRS::ITSM Location Paket. 2.2.6 2.2.x CVS <br> WELCOME<br> <br> You are about to install the OTRS module ITSMLocation.<br> <br> <br> REQUIRED OTRS PACKAGES <ul> <li>GeneralCatalog 1.1.1</li> <li>LinkObject 1.1.1</li> <li>ITSMCore 1.1.1</li> <li>ITSMService 1.1.1</li> <li>ITSMTicket 1.1.1</li> <li>ITSMConfigItem 1.1.1</li> </ul> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul ITSMLocation zu installieren.<br> <br> <br> BENÖTIGTE OTRS-PAKETE <ul> <li>GeneralCatalog 1.1.1</li> <li>LinkObject 1.1.1</li> <li>ITSMCore 1.1.1</li> <li>ITSMService 1.1.1</li> <li>ITSMTicket 1.1.1</li> <li>ITSMConfigItem 1.1.1</li> </ul> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WELCOME<br> <br> You are about to upgrade the OTRS module ITSMLocation.<br> <br> <br> REQUIRED OTRS PACKAGES <ul> <li>GeneralCatalog 1.1.1</li> <li>LinkObject 1.1.1</li> <li>ITSMCore 1.1.1</li> <li>ITSMService 1.1.1</li> <li>ITSMTicket 1.1.1</li> <li>ITSMConfigItem 1.1.1</li> </ul> <br> ATTENTION<br> <br> Make sure your database accepts packages over 5 MB in size. A MySQL database for example accepts packages up to 1 MB by default. In this case, the value for max_allowed_packet must be increased. The recommended maximum size accepted is 20 MB.<br> <br> <br> ((enjoy))<br> <br> <br> WILLKOMMEN<br> <br> Sie sind im Begriff das OTRS-Modul ITSMLocation zu aktualisieren.<br> <br> <br> BENÖTIGTE OTRS-PAKETE <ul> <li>GeneralCatalog 1.1.1</li> <li>LinkObject 1.1.1</li> <li>ITSMCore 1.1.1</li> <li>ITSMService 1.1.1</li> <li>ITSMTicket 1.1.1</li> <li>ITSMConfigItem 1.1.1</li> </ul> <br> ACHTUNG<br> <br> Vergewissern Sie sich, dass ihre Datenbank Pakete mit einer Größe von mehr als 5 MB akzeptiert. Eine MySQL Datenbank akzeptiert beispielsweise standartmäßig Pakete mit einer Größe von maximal 1 MB. In diesem Fall muss der Wert für max_allowed_packet erhöht werden. Empfohlen werden 20 MB.<br> <br> <br> ((enjoy))<br> <br> GeneralCatalog ITSMCore ITSMConfigItem LinkObject2 require Kernel::System::Group; $Self->{GroupObject} = Kernel::System::Group->new(%{$Self}); # add group itsm-location $Self->{GroupObject}->GroupAdd( Name => 'itsm-location', Comment => 'Group for ITSM Location mask access in the agent interface.', ValidID => 1, UserID => 1, ); # add user root to itsm-location admin group $Self->{GroupObject}->GroupMemberAdd( GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'itsm-location'), UID => 1, Permission => { ro => 1, move_into => 1, create => 1, owner => 1, priority => 1, rw => 1, }, UserID => 1, ); require Kernel::System::Group; $Self->{GroupObject} = Kernel::System::Group->new(%{$Self}); # add group itsm-location $Self->{GroupObject}->GroupAdd( Name => 'itsm-location', Comment => 'Group for ITSM Location mask access in the agent interface.', ValidID => 1, UserID => 1, ); # add user root to itsm-location admin group $Self->{GroupObject}->GroupMemberAdd( GID => $Self->{GroupObject}->GetGroupIdByName(Group => 'itsm-location'), UID => 1, Permission => { ro => 1, move_into => 1, create => 1, owner => 1, priority => 1, rw => 1, }, UserID => 1, ); 2008-05-04 16:41:48 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNTG9jYXRpb24ueG1sLHYgMS45IDIwMDgvMDEvMTQgMTM6MzM6NTYgbWggRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbklUU01Mb2NhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbklUU01Mb2NhdGlvbiBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5JVFNNTG9jYXRpb24gS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkxvY2F0aW9uPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkxvY2F0aW9uPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazM8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNTG9jYXRpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNTG9jYXRpb24gb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudElUU01Mb2NhdGlvbi1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWxvY2F0aW9uPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPklUU00gTG9jYXRpb24gT3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+TG9jYXRpb248L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+TG9jYXRpb248L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TG9jYXRpb24tQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TG9jYXRpb248L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5pdHNtX2xvY2F0aW9uLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50SVRTTUxvY2F0aW9uPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+TG9jYXRpb248L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMzMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5PdmVydmlldzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+b3ZlcnZpZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRJVFNNTG9jYXRpb248L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+TG9jYXRpb248L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjEwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01Mb2NhdGlvblpvb20iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRJVFNNTG9jYXRpb25ab29tIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNTG9jYXRpb25ab29tLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxHcm91cFJvPml0c20tbG9jYXRpb248L0dyb3VwUm8+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TG9jYXRpb24gWm9vbTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Wm9vbTwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Mb2NhdGlvbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRJVFNNTG9jYXRpb25QcmludCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudElUU01Mb2NhdGlvblByaW50IG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRJVFNNTG9jYXRpb25QcmludC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXBSbz5pdHNtLWxvY2F0aW9uPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxvY2F0aW9uIFByaW50PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5QcmludDwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Mb2NhdGlvbjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNTG9jYXRpb246OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAwLUJhY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBiYWNrIGxpbmsgaW4gbG9jYXRpb24gbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgWnVy/GNrLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIExvY2F0aW9uLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Mb2NhdGlvbjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNTG9jYXRpb25NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkJhY2s8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rIj4kRW52eyJJVFNNTG9jYXRpb25MYXN0U2NyZWVuT3ZlcnZpZXcifTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Mb2NhdGlvbjo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMxMDAtUHJpbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBwcmludCBsaW5rIGluIGxvY2F0aW9uIG1lbnUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPtxiZXIgZGllc2VzIE1vZHVsIHdpcmQgZGVyIERydWNrZW4tTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgTG9rYXRpb24tQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6SVRTTUxvY2F0aW9uOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Mb2NhdGlvbk1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5QcmludDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPlByaW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb24iPkFnZW50SVRTTUxvY2F0aW9uUHJpbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudElUU01Mb2NhdGlvblByaW50JmFtcDtMb2NhdGlvbklEPSRRRGF0YXsiTG9jYXRpb25JRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMaW5rUGFyYW0iPnRhcmdldD0icHJpbnQiPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUxvY2F0aW9uOjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzIwMC1MaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIHNob3cgdGhlIGxpbmsgbGluayBpbiBsb2NhdGlvbiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBWZXJrbvxwZmVuLUxpbmsgaW4gZGVyIExpbmtsZWlzdGUgZGVyIExvY2F0aW9uLUFuc2ljaHQgYW5nZXplaWd0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU008L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OklUU01Mb2NhdGlvbjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNTG9jYXRpb25NZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TGluazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkxpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRMaW5rT2JqZWN0MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50TGlua09iamVjdDImYW1wO1NvdXJjZUNsYXNzPUlUU01Mb2NhdGlvbiZhbXA7U291cmNlS2V5PSRRRGF0YXsiTG9jYXRpb25JRCJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OlBvc3NpYmxlUGFydG5lciMjI0lUU01Mb2NhdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBvc3NpYmxlIHBhcnRuZXIgZnJvbSBJVFNNTG9jYXRpb24gb2JqZWN0IHRvIG90aGVyIG9iamVjdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk32Z2xpY2hlIFBhcnRuZXIgdm9tIElUU01Mb2NhdGlvbiB6dSBhbmRlcmVuIE9iamVrdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3QyOjpQb3NzaWJsZVBhcnRuZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUNvbmZpZ0l0ZW0iPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+UmVsZXZhbnRUbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RGVwZW5kc09uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5BbHRlcm5hdGl2ZVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+ IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNTG9jYXRpb24ucG0gLSB0aGUgYnVsZ2FyaWFuIHRyYW5zbGF0aW9uIG9mIElUU01Mb2NhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogYmdfSVRTTUxvY2F0aW9uLnBtLHYgMS42IDIwMDgvMDMvMTkgMTU6MjE6NTggbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpiZ19JVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgKCRTZWxmKSA9IEBfOwogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydMb2NhdGlvbid9ICAgICAgICAgICAgPSAny+7q4Pbo/yc7CiAgICAkTGFuZy0+eydMb2NhdGlvbi1BcmVhJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J0xvY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIOvu6uD26Ojy5SAtIMzl8fLu7+7r7ubl7ej/8uAnOwogICAgJExhbmctPnsnQWRkIExvY2F0aW9uJ30gICAgICAgID0gJ8Tu4eDi6CDr7urg9uj/JzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBMb2NhdGlvbi4nfSA9ICfM7ubl8uUg5OAg5O7h4OLo8uUg7e7i4CDr7urg9uj/JzsKICAgICRMYW5nLT57J1N1Yi1Mb2NhdGlvbiBvZid9ICAgICA9ICfP7uQt6+7q4Pbo/yDt4Cc7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgPSAnwOTw5fEnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgID0gJ9Hj8ODk4Cc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgPSAnxfLg5ic7CiAgICAkTGFuZy0+eydJVCBGYWNpbGl0eSd9ICAgICAgICAgPSAnyNIg0fru8Prm5e3o5S/P7uzl+eXt6OUnOwogICAgJExhbmctPnsnT2ZmaWNlJ30gICAgICAgICAgICAgID0gJ8706PEnOwogICAgJExhbmctPnsnT3RoZXInfSAgICAgICAgICAgICAgID0gJ8Tw8+PoJzsKICAgICRMYW5nLT57J091dGxldCd9ICAgICAgICAgICAgICA9ICfI5+Lu5C3w7ufl8urgJzsKICAgICRMYW5nLT57J1JhY2snfSAgICAgICAgICAgICAgICA9ICfY6uD0LfDg6ic7CiAgICAkTGFuZy0+eydSb29tJ30gICAgICAgICAgICAgICAgPSAn0fLg/yc7CiAgICAkTGFuZy0+eydXb3JrcGxhY2UnfSAgICAgICAgICAgPSAn0ODh7vLt7iDs//Hy7ic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNTG9jYXRpb24ucG0gLSB0aGUgY3plY2ggdHJhbnNsYXRpb24gb2YgSVRTTUxvY2F0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9JVFNNTG9jYXRpb24ucG0sdiAxLjUgMjAwOC8wMy8xOSAxNToyMTo1OCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN6X0lUU01Mb2NhdGlvbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0xvY2F0aW9uJ30gICAgICAgICAgICA9ICdMb2thbGl0YSc7CiAgICAkTGFuZy0+eydMb2NhdGlvbi1BcmVhJ30gICAgICAgPSAnJzsKICAgICRMYW5nLT57J0xvY2F0aW9uIE1hbmFnZW1lbnQnfSA9ICfFmMOtemVuw60gbG9rYWxpdHkgLSBtw61zdCc7CiAgICAkTGFuZy0+eydBZGQgTG9jYXRpb24nfSAgICAgICAgPSAnRG9kYXQgbG9rYWxpdHUnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IExvY2F0aW9uLid9ID0gJ03Fr8W+ZXRlIGRvZGF0IG5vdm91IGxva2FsaXR1JzsKICAgICRMYW5nLT57J1N1Yi1Mb2NhdGlvbiBvZid9ICAgICA9ICdTdWJsb2thbGl0YSAtIMSNZWhvJzsKICAgICRMYW5nLT57J0FkZHJlc3MnfSAgICAgICAgICAgICA9ICdBZHJlc2EnOwogICAgJExhbmctPnsnQnVpbGRpbmcnfSAgICAgICAgICAgID0gJ0J1ZG92YSc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgPSAnUGF0cm8nOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgID0gJ0lUIHphxZnDrXplbsOtIC9wcm9zdG9yJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICA9ICdLYW5jZWzDocWZJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICA9ICdPc3RhdG7DrSc7CiAgICAkTGFuZy0+eydPdXRsZXQnfSAgICAgICAgICAgICAgPSAnVsO9c3R1cCc7CiAgICAkTGFuZy0+eydSYWNrJ30gICAgICAgICAgICAgICAgPSAnU2vFmcOtxYggPSByYWNrJzsKICAgICRMYW5nLT57J1Jvb20nfSAgICAgICAgICAgICAgICA9ICdNw61zdG5vc3QnOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgID0gJ1ByYWNvdmnFoXTEmyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNTG9jYXRpb24ucG0gLSB0aGUgZ2VybWFuIHRyYW5zbGF0aW9uIG9mIElUU01Mb2NhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfSVRTTUxvY2F0aW9uLnBtLHYgMS4xMyAyMDA4LzAzLzE5IDE1OjIxOjU4IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUxvY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAoJFNlbGYpID0gQF87CiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0xvY2F0aW9uJ30gICAgICAgICAgICA9ICdMb2thdGlvbic7CiAgICAkTGFuZy0+eydMb2NhdGlvbi1BcmVhJ30gICAgICAgPSAnTG9rYXRpb24tQmVyZWljaCc7CiAgICAkTGFuZy0+eydMb2NhdGlvbiBNYW5hZ2VtZW50J30gPSAnTG9rYXRpb24gVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydBZGQgTG9jYXRpb24nfSAgICAgICAgPSAnTG9rYXRpb24gaGluenVm/Gdlbic7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgTG9jYXRpb24uJ30gPSAnRWluZSBuZXVlIExva2F0aW9uIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J1N1Yi1Mb2NhdGlvbiBvZid9ICAgICA9ICdVbnRlcmxva2F0aW9uIHZvbic7CiAgICAkTGFuZy0+eydBZGRyZXNzJ30gICAgICAgICAgICAgPSAnQWRyZXNzZSc7CiAgICAkTGFuZy0+eydCdWlsZGluZyd9ICAgICAgICAgICAgPSAnR2Vi5HVkZSc7CiAgICAkTGFuZy0+eydGbG9vcid9ICAgICAgICAgICAgICAgPSAnRXRhZ2UnOwogICAgJExhbmctPnsnSVQgRmFjaWxpdHknfSAgICAgICAgID0gJ0lUIEVpbnJpY2h0dW5nJzsKICAgICRMYW5nLT57J09mZmljZSd9ICAgICAgICAgICAgICA9ICdC/HJvJzsKICAgICRMYW5nLT57J090aGVyJ30gICAgICAgICAgICAgICA9ICdTb25zdGlnZXMnOwogICAgJExhbmctPnsnT3V0bGV0J30gICAgICAgICAgICAgID0gJ0Fuc2NobHVzc2Rvc2UnOwogICAgJExhbmctPnsnUmFjayd9ICAgICAgICAgICAgICAgID0gJ1JhY2snOwogICAgJExhbmctPnsnUm9vbSd9ICAgICAgICAgICAgICAgID0gJ1JhdW0nOwogICAgJExhbmctPnsnV29ya3BsYWNlJ30gICAgICAgICAgID0gJ0FyYmVpdHNwbGF0eic7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSVRTTUxvY2F0aW9uLnBtIC0gYWRtaW4gZnJvbnRlbmQgdG8gbWFuYWdlIGxvY2F0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5JVFNNTG9jYXRpb24ucG0sdiAxLjE3IDIwMDgvMDIvMjEgMTI6Mzk6MDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluSVRTTUxvY2F0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNTG9jYXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE3ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TG9jYXRpb25PYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsb2NhdGlvbiBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9jYXRpb25FZGl0JyApIHsKICAgICAgICBteSAlTG9jYXRpb25EYXRhOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAkTG9jYXRpb25EYXRhe0xvY2F0aW9uSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9jYXRpb25JRCcgKTsKICAgICAgICBpZiAoICRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0gbmUgJ05FVycgKSB7CiAgICAgICAgICAgICVMb2NhdGlvbkRhdGEgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgUGFyZW50T3B0aW9uU3RyZwogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICVMb2NhdGlvbkxpc3QgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRMb2NhdGlvbkRhdGF7UGFyZW50T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUxvY2F0aW9uTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ1BhcmVudElEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJExvY2F0aW9uRGF0YXtQYXJlbnRJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU29ydCAgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgRGlzYWJsZWRCcmFuY2ggPT4gJExvY2F0aW9uRGF0YXtOYW1lfSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIFR5cGVPcHRpb25TdHJnCiAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KCBDbGFzcyA9PiAnSVRTTTo6TG9jYXRpb246OlR5cGUnICk7CiAgICAgICAgJExvY2F0aW9uRGF0YXtUeXBlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRUeXBlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkTG9jYXRpb25EYXRhe1R5cGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgICAgICRMb2NhdGlvbkRhdGF7VmFsaWRPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRMb2NhdGlvbkRhdGF7VmFsaWRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbG9jYXRpb24gZWRpdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xvY2F0aW9uRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUxvY2F0aW9uRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNTG9jYXRpb24nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsb2NhdGlvbiBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9jYXRpb25TYXZlJyApIHsKICAgICAgICBteSAlTG9jYXRpb25EYXRhOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgbXkgJEZvcm1QYXJhbSAoCiAgICAgICAgICAgIHF3KExvY2F0aW9uSUQgUGFyZW50SUQgTmFtZSBUeXBlSUQgUGhvbmUxIFBob25lMiBGYXggRW1haWwgQWRkcmVzcyBWYWxpZElEIENvbW1lbnQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMb2NhdGlvbkRhdGF7JEZvcm1QYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRGb3JtUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIGlmICggJExvY2F0aW9uRGF0YXtMb2NhdGlvbklEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25BZGQoCiAgICAgICAgICAgICAgICAlTG9jYXRpb25EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntMb2NhdGlvbk9iamVjdH0tPkxvY2F0aW9uVXBkYXRlKAogICAgICAgICAgICAgICAgJUxvY2F0aW9uRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpIGlmICEkU3VjY2VzczsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsb2NhdGlvbiBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IHJlc3VsdAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbG9jYXRpb24gdHlwZXMKICAgICAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpMb2NhdGlvbjo6VHlwZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbG9jYXRpb24gbGlzdAogICAgICAgIG15ICVMb2NhdGlvbkxpc3QgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25MaXN0KAogICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKCiAgICAgICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgICAgICBmb3IgbXkgJExvY2F0aW9uICggdmFsdWVzICVMb2NhdGlvbkxpc3QgKSB7CiAgICAgICAgICAgICRMb2NhdGlvbiAuPSAnOjonOwogICAgICAgIH0KCiAgICAgICAgbXkgJENzc0NsYXNzID0gJyc7CiAgICAgICAgZm9yIG15ICRMb2NhdGlvbklEICggc29ydCB7ICRMb2NhdGlvbkxpc3R7JGF9IGNtcCAkTG9jYXRpb25MaXN0eyRifSB9IGtleXMgJUxvY2F0aW9uTGlzdCApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCBsb2NhdGlvbiBkYXRhCiAgICAgICAgICAgIG15ICVMb2NhdGlvbkRhdGEgPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbklELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVMb2NhdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGVMaXN0LT57ICRMb2NhdGlvbkRhdGF7VHlwZUlEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRMb2NhdGlvbkRhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSBARnJhZ21lbnQgPSBzcGxpdCAnOjonLCAkTG9jYXRpb25EYXRhe05hbWV9OwogICAgICAgICAgICAgICAgcG9wIEBGcmFnbWVudDsKCiAgICAgICAgICAgICAgICBmb3IgKEBGcmFnbWVudCkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvd1NwYWNlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlTG9jYXRpb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVHlwZUxpc3QtPnsgJExvY2F0aW9uRGF0YXtUeXBlSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgPT4gJFZhbGlkTGlzdHsgJExvY2F0aW9uRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JVFNNTG9jYXRpb24nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUxvY2F0aW9uLnBtIC0gdGhlIE9UUlM6OklUU00gTG9jYXRpb24gbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Mb2NhdGlvbi5wbSx2IDEuMTEgMjAwOC8wMi8yMSAxMjozOTowNyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMb2NhdGlvbk9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyBnZXQgdHlwZSBsaXN0CiAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkxvY2F0aW9uOjpUeXBlJywKICAgICk7CgogICAgIyBnZXQgbG9jYXRpb24gbGlzdAogICAgbXkgJUxvY2F0aW9uTGlzdCA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgIGZvciBteSAkTG9jYXRpb24gKCB2YWx1ZXMgJUxvY2F0aW9uTGlzdCApIHsKICAgICAgICAkTG9jYXRpb24gLj0gJzo6JzsKICAgIH0KCiAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgIGZvciBteSAkTG9jYXRpb25JRCAoIHNvcnQgeyAkTG9jYXRpb25MaXN0eyRhfSBjbXAgJExvY2F0aW9uTGlzdHskYn0gfSBrZXlzICVMb2NhdGlvbkxpc3QgKSB7CgogICAgICAgICMgc2V0IG91dHB1dCBvYmplY3QKICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnID8gJ3NlYXJjaGFjdGl2ZScgOiAnc2VhcmNocGFzc2l2ZSc7CgogICAgICAgICMgZ2V0IGxvY2F0aW9uIGRhdGEKICAgICAgICBteSAlTG9jYXRpb24gPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgICAgIExvY2F0aW9uSUQgPT4gJExvY2F0aW9uSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHJvdwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRMb2NhdGlvbntOYW1lU2hvcnR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUeXBlTGlzdC0+eyAkTG9jYXRpb257VHlwZUlEfSB9LAogICAgICAgICAgICAgICAgICAgIENzc0NsYXNzID0+ICRDc3NDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSBARnJhZ21lbnQgPSBzcGxpdCAnOjonLCAkTG9jYXRpb257TmFtZX07CiAgICAgICAgICAgIHBvcCBARnJhZ21lbnQ7CgogICAgICAgICAgICBmb3IgKEBGcmFnbWVudCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jvd1NwYWNlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJExvY2F0aW9ue05hbWVTaG9ydH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFR5cGVMaXN0LT57ICRMb2NhdGlvbntUeXBlSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgbGFzdCBzY3JlZW4gdmlldwogICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdJVFNNTG9jYXRpb25MYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNTG9jYXRpb24nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUxvY2F0aW9uUHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGl0c20gbG9jYXRpb24gYWdlbnQgaW50ZXJmYWNlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Mb2NhdGlvblByaW50LnBtLHYgMS45IDIwMDgvMDUvMDMgMTQ6MTg6MTIgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUxvY2F0aW9uUHJpbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBERjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNTG9jYXRpb247Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UERGLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TG9jYXRpb25PYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkTG9jYXRpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvY2F0aW9uSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRMb2NhdGlvbklEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBMb2NhdGlvbklEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbG9jYXRpb24KICAgIG15ICVMb2NhdGlvbiA9ICRTZWxmLT57TG9jYXRpb25PYmplY3R9LT5Mb2NhdGlvbkdldCgKICAgICAgICBMb2NhdGlvbklEID0+ICRMb2NhdGlvbklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICggISRMb2NhdGlvbntMb2NhdGlvbklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTG9jYXRpb25JRCAkTG9jYXRpb25JRCBub3QgZm91bmQgaW4gZGF0YWJhc2UhIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsb2NhdGlvbiB0eXBlIGxpc3QKICAgIG15ICRMb2NhdGlvblR5cGVMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpMb2NhdGlvbjo6VHlwZScsCiAgICApOwogICAgJExvY2F0aW9ue1R5cGV9ID0gJExvY2F0aW9uVHlwZUxpc3QtPnsgJExvY2F0aW9ue1R5cGVJRH0gfTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNyZWF0ZSBieSkKICAgIG15ICVDcmVhdGVCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkTG9jYXRpb257Q3JlYXRlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCB1c2VyIGRhdGEgKGNoYW5nZSBieSkKICAgIG15ICVDaGFuZ2VCeSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkTG9jYXRpb257Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHBkZiBvdXRwdXQKICAgIGlmICggJFNlbGYtPntQREZPYmplY3R9ICkgewogICAgICAgIG15ICVQYWdlOwogICAgICAgIG15ICRVcmwgPSAnICc7CiAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSApIHsKICAgICAgICAgICAgJFVybAogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSHR0cFR5cGUnKSAuICc6Ly8nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJykKICAgICAgICAgICAgICAgIC4gJEVOVntSRVFVRVNUX1VSSX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KICAgICAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvY2F0aW9uJyk7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVMZWZ0fSAgPSAkTG9jYXRpb257TmFtZVNob3J0fTsKICAgICAgICAkUGFnZXtIZWFkbGluZVJpZ2h0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5JykgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCggVGVtcGxhdGUgPT4gJyRFbnZ7IlRpbWUifScgKTsKICAgICAgICAkUGFnZXtGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRMb2NhdGlvbntOYW1lU2hvcnR9LAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyBvdXRwdXQgZ2VuZXJhbCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0R2VuZXJhbEluZm9zKAogICAgICAgICAgICBQYWdlICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIExvY2F0aW9uID0+IFwlTG9jYXRpb24sCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IFwlQ3JlYXRlQnksCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IFwlQ2hhbmdlQnksCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGV0YWlsZWQgaW5mb3MKICAgICAgICAkU2VsZi0+X1BERk91dHB1dERldGFpbGVkSW5mb3MoCiAgICAgICAgICAgIFBhZ2UgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgTG9jYXRpb24gPT4gXCVMb2NhdGlvbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaWxlIG5hbWUKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICRMb2NhdGlvbntOYW1lU2hvcnR9LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgICAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgICAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKCiAgICAgICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsb2NhdGlvbl8nIC4gJEZpbGVuYW1lIC4gIl8kWS0kTS0kRFxfJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkTG9jYXRpb257TmFtZVNob3J0fSApOwoKICAgICAgICAjIHRyYW5zZm9ybSBsb2NhdGlvbiBmcm9tIGFzY2lpIHRvIGh0bWwKICAgICAgICAkTG9jYXRpb257QWRkcmVzc30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRMb2NhdGlvbntBZGRyZXNzfSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNTG9jYXRpb25QcmludCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJMb2dpbiAgICAgPT4gJENyZWF0ZUJ5e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBDcmVhdGVCeVVzZXJGaXJzdG5hbWUgPT4gJENyZWF0ZUJ5e1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlQnlVc2VyTGFzdG5hbWUgID0+ICRDcmVhdGVCeXtVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyTG9naW4gICAgID0+ICRDaGFuZ2VCeXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgQ2hhbmdlQnlVc2VyRmlyc3RuYW1lID0+ICRDaGFuZ2VCeXtVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIENoYW5nZUJ5VXNlckxhc3RuYW1lICA9PiAkQ2hhbmdlQnl7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgICVMb2NhdGlvbiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0R2VuZXJhbEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgTG9jYXRpb24gQ3JlYXRlQnkgQ2hhbmdlQnkpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvY2F0aW9uJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2NhdGlvbn0tPntOYW1lU2hvcnR9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwleyAkUGFyYW17TG9jYXRpb259IH0sCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkIGJ5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtDcmVhdGVCeX0tPntVc2VyTG9naW59IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17Q3JlYXRlQnl9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NyZWF0ZUJ5fS0+e1VzZXJMYXN0bmFtZX0gLiAnKScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMYXN0IGNoYW5nZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCV7ICRQYXJhbXtMb2NhdGlvbn0gfSwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xhc3QgY2hhbmdlZCBieScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17Q2hhbmdlQnl9LT57VXNlckxvZ2lufSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte0NoYW5nZUJ5fS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtDaGFuZ2VCeX0tPntVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgIG15ICRSb3dzID0gQHskVGFibGVMZWZ0fTsKICAgIGlmICggQHskVGFibGVSaWdodH0gPiAkUm93cyApIHsKICAgICAgICAkUm93cyA9IEB7JFRhYmxlUmlnaHR9OwogICAgfQoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntWYWx1ZX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0NvbnRlbnR9ICAgICAgICAgPSAnICc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzJde0JhY2tncm91bmRDb2xvcn0gPSAnI0ZGRkZGRic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bNF17Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntWYWx1ZX07CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA1MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDIwMC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17UGFnZX0tPntQYWdlQ291bnR9Kys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXREZXRhaWxlZEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBhZ2UgTG9jYXRpb24pKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtMTUsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvY2F0aW9uJyksCiAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICApOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC00LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0YWJsZQogICAgbXkgJFRhYmxlID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvY2F0aW9uJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtMb2NhdGlvbn0tPntOYW1lfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1R5cGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtMb2NhdGlvbn0tPntUeXBlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGhvbmUgMScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TG9jYXRpb259LT57UGhvbmUxfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1Bob25lIDInKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0xvY2F0aW9ufS0+e1Bob25lMn0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdGYXgnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0xvY2F0aW9ufS0+e0ZheH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdFbWFpbCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TG9jYXRpb259LT57RW1haWx9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWRkcmVzcycpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TG9jYXRpb259LT57QWRkcmVzc30sCiAgICAgICAgfSwKICAgIF07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3dzID0gQHskVGFibGV9OwogICAgZm9yIG15ICRSb3cgKCAxIC4uICRSb3dzICkgewogICAgICAgICRSb3ctLTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkVGFibGUtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRUYWJsZS0+WyRSb3ddLT57VmFsdWV9OwogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgICA9IDA7CiAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSAgICAgID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhcmFte1BhZ2V9LT57UGFnZUNvdW50fSAuLiAkUGFyYW17UGFnZX0tPntNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSglVGFibGVQYXJhbSk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGxhc3QgUEFHRSBpZiAkVGFibGVQYXJhbXtTdGF0ZX07CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJXsgJFBhcmFte1BhZ2V9IH0sCiAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYXJhbXtQYWdlfS0+e1BhZ2VUZXh0fSAuICcgJyAuICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtQYWdlfS0+e1BhZ2VDb3VudH0rKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTUxvY2F0aW9uWm9vbS5wbSAtIHRoZSBPVFJTOjpJVFNNIExvY2F0aW9uIHpvb20gbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Mb2NhdGlvblpvb20ucG0sdiAxLjE0IDIwMDgvMDIvMjEgMTI6Mzk6MDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUxvY2F0aW9uWm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNTG9jYXRpb24tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0Mn0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDItPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJExvY2F0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2NhdGlvbklEJyApOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkTG9jYXRpb25JRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gTG9jYXRpb25JRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxvY2F0aW9uCiAgICBteSAlTG9jYXRpb24gPSAkU2VsZi0+e0xvY2F0aW9uT2JqZWN0fS0+TG9jYXRpb25HZXQoCiAgICAgICAgTG9jYXRpb25JRCA9PiAkTG9jYXRpb25JRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkTG9jYXRpb257TG9jYXRpb25JRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkxvY2F0aW9uSUQgJExvY2F0aW9uSUQgbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdHlwZSBsaXN0CiAgICBteSAkVHlwZUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkxvY2F0aW9uOjpUeXBlJywKICAgICk7CiAgICAkTG9jYXRpb257VHlwZX0gICAgPSAkVHlwZUxpc3QtPnsgJExvY2F0aW9ue1R5cGVJRH0gfTsKICAgICRMb2NhdGlvbntBZGRyZXNzfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkTG9jYXRpb257QWRkcmVzc30sCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICk7CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUxvY2F0aW9uOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNTG9jYXRpb246OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25JRCA9PiAkU2VsZi0+e0xvY2F0aW9uSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiBcJUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHBhcnRuZXIgbGluayBkYXRhIGxpc3QKICAgIG15ICRQYXJ0bmVyTGlua0RhdGFMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJMaW5rRGF0YUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU01Mb2NhdGlvbicsCiAgICAgICAgS2V5ICAgPT4gJExvY2F0aW9uSUQsCiAgICApOwoKICAgICMgZ2VuZXJhdGUgYmxvY2sgbGlzdAogICAgbXkgJEJsb2NrTGlzdCA9IHt9OwogICAgZm9yIG15ICRJdGVtICggQHskUGFydG5lckxpbmtEYXRhTGlzdH0gKSB7CiAgICAgICAgJEJsb2NrTGlzdC0+eyAkSXRlbS0+e0Jsb2NrbmFtZTF9IH0tPnsgJEl0ZW0tPntCbG9ja25hbWUyfSB9LT57ICRJdGVtLT57TGlua0lEfSB9ID0gJEl0ZW07CiAgICB9CgogICAgIyBzdGFydCBwYXJ0bmVyIG91dHB1dAogICAgbXkgJE91dHB1dEhvcml6b250YWxSdWxlciA9IDE7CiAgICBmb3IgbXkgJEJsb2NrbmFtZTEgKCBzb3J0IGtleXMgJXskQmxvY2tMaXN0fSApIHsKICAgICAgICBmb3IgbXkgJEJsb2NrbmFtZTIgKCBzb3J0IGtleXMgJXsgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfSB9ICkgewogICAgICAgICAgICBteSAkSXRlbUxpc3QgPSAkQmxvY2tMaXN0LT57JEJsb2NrbmFtZTF9LT57JEJsb2NrbmFtZTJ9OwoKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15IEBMaW5rSURzICAgICAgICAgICAgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgICAgICAgICAgbXkgJFBhcnRuZXJUYWJsZUNvbHVtbiA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyVGFibGVDb2x1bW5HZXQoCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAkSXRlbUxpc3QtPnsgJExpbmtJRHNbMF0gfS0+e1BhcnRuZXJDbGFzc30sCiAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgICA9PiAkSXRlbUxpc3QtPnsgJExpbmtJRHNbMF0gfSwKICAgICAgICAgICAgICAgIExpbmtUeXBlQ29sdW1uID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvdW50IGNvbHVtbnMKICAgICAgICAgICAgbXkgJENvbHVtbkNvdW50ID0gQHskUGFydG5lclRhYmxlQ29sdW1ufTsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMSA9PiAkQmxvY2tuYW1lMSwKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUyID0+ICRCbG9ja25hbWUyLAogICAgICAgICAgICAgICAgICAgIENvbHNwYW4gICAgPT4gJENvbHVtbkNvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGhvcml6b250YWwgcnVsZXIKICAgICAgICAgICAgaWYgKCRPdXRwdXRIb3Jpem9udGFsUnVsZXIpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ0xpbmtIb3Jpem9udGFsUnVsZXInICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0SG9yaXpvbnRhbFJ1bGVyID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdXRwdXQgY29sdW1uIHdpZHRoIGJsb2NrCiAgICAgICAgICAgIGZvciBteSAkQ29sdW1uICggQHskUGFydG5lclRhYmxlQ29sdW1ufSApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0NvbHVtbldpZHRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggPT4gJENvbHVtbi0+e0hUTUxPdXRwdXR9LT57VGFibGVXaWR0aH0gfHwgJyonLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZSBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgZm9yIG15ICRDb2x1bW4gKCBAeyRQYXJ0bmVyVGFibGVDb2x1bW59ICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSGVhZGVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uLT57SGVhZGxpbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJExpbmtEYXRhICggc29ydCBrZXlzICV7ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0gfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgb2JqZWN0CiAgICAgICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaHBhc3NpdmUnID8gJ3NlYXJjaGFjdGl2ZScgOiAnc2VhcmNocGFzc2l2ZSc7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTGlua1JvdycgKTsKICAgICAgICAgICAgICAgIGZvciBteSAkQ29sdW1uRGF0YSAoIEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgbG9va3VwIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdDJDb250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5EYXRhID0+ICRDb2x1bW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRGF0YSAgID0+ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0tPnskTGlua0RhdGF9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgcm93IGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3dDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgID0+ICRDb250ZW50U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3JlYXRlIHVzZXIgZGF0YQogICAgbXkgJUNyZWF0ZVVzZXIgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJExvY2F0aW9ue0NyZWF0ZUJ5fSwKICAgICAgICBDYWNoZWQgPT4gMSwKICAgICk7CiAgICBmb3IgbXkgJFBvc3RmaXggKHF3KFVzZXJMb2dpbiBVc2VyRmlyc3RuYW1lIFVzZXJMYXN0bmFtZSkpIHsKICAgICAgICAkTG9jYXRpb257ICdDcmVhdGUnIC4gJFBvc3RmaXggfSA9ICRDcmVhdGVVc2VyeyRQb3N0Zml4fTsKICAgIH0KCiAgICAjIGdldCBjaGFuZ2UgdXNlciBkYXRhCiAgICBteSAlQ2hhbmdlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkTG9jYXRpb257Q2hhbmdlQnl9LAogICAgICAgIENhY2hlZCA9PiAxLAogICAgKTsKICAgIGZvciBteSAkUG9zdGZpeCAocXcoVXNlckxvZ2luIFVzZXJGaXJzdG5hbWUgVXNlckxhc3RuYW1lKSkgewogICAgICAgICRMb2NhdGlvbnsgJ0NoYW5nZScgLiAkUG9zdGZpeCB9ID0gJENoYW5nZVVzZXJ7JFBvc3RmaXh9OwogICAgfQoKICAgICMgc2V0IGxhc3Qgc2NyZWVuIHZpZXcgKElUU01Mb2NhdGlvbikKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW1MYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JkxvY2F0aW9uSUQ9JExvY2F0aW9uSUQiLAogICAgKTsKCiAgICAjIHNldCBsYXN0IHNjcmVlbiB2aWV3IChMaW5rT2JqZWN0MikKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGlua09iamVjdDJMYXN0U2NyZWVuJywKICAgICAgICBWYWx1ZSAgICAgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mTG9jYXRpb25JRD0kTG9jYXRpb25JRCIsCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNTG9jYXRpb25ab29tJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlTG9jYXRpb24gfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNTG9jYXRpb25NZW51R2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTUxvY2F0aW9uTWVudUdlbmVyaWMucG0sdiAxLjcgMjAwOC8wMS8zMCAxOToxNjoxMSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNTG9jYXRpb25NZW51R2VuZXJpYzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2NhdGlvbk9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtMb2NhdGlvbn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgTG9jYXRpb24hJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBhY2Nlc3MKICAgIG15ICRBY2Nlc3MgPSAxOwoKICAgICMgZ2V0IGdyb3VwcwogICAgbXkgJEdyb3Vwc1JvCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtDb25maWd9LT57QWN0aW9ufSB9LT57R3JvdXBSb30KICAgICAgICB8fCBbXTsKICAgIG15ICRHcm91cHNSdwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gfS0+e0dyb3VwfQogICAgICAgIHx8IFtdOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbgogICAgaWYgKCAkUGFyYW17Q29uZmlnfS0+e0FjdGlvbn0gJiYgKCBAeyRHcm91cHNSb30gfHwgQHskR3JvdXBzUnd9ICkgKSB7CgogICAgICAgICMgc2V0IGFjY2VzcwogICAgICAgICRBY2Nlc3MgPSAwOwoKICAgICAgICAjIGZpbmQgcmVhZCBvbmx5IGdyb3VwcwogICAgICAgIFJPR1JPVVA6CiAgICAgICAgZm9yIG15ICRSb0dyb3VwICggQHskR3JvdXBzUm99ICkgewoKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBSb1skUm9Hcm91cF0ifTsKICAgICAgICAgICAgbmV4dCBST0dST1VQIGlmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFJvWyRSb0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJPR1JPVVA7CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgcmVhZCB3cml0ZSBncm91cHMKICAgICAgICBSV0dST1VQOgogICAgICAgIGZvciBteSAkUndHcm91cCAoIEB7JEdyb3Vwc1J3fSApIHsKCiAgICAgICAgICAgIG5leHQgUldHUk9VUCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9OwogICAgICAgICAgICBuZXh0IFJXR1JPVVAgaWYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRSd0dyb3VwXSJ9IG5lICdZZXMnOwoKICAgICAgICAgICAgIyBzZXQgYWNjZXNzCiAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBsYXN0IFJXR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn0gaWYgISRBY2Nlc3M7CgogICAgIyBvdXRwdXQgbWVudSBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTWVudScgKTsKCiAgICAjIG91dHB1dCBzZXBlcmF0b3IKICAgIGlmICggJFBhcmFte0NvdW50ZXJ9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ01lbnVJdGVtU3BsaXQnICk7CiAgICB9CgogICAgIyBvdXRwdXQgbWVudSBpdGVtCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01lbnVJdGVtJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAleyAkUGFyYW17TG9jYXRpb259IH0sCiAgICAgICAgICAgICV7ICRQYXJhbXtDb25maWd9IH0sCiAgICAgICAgfSwKICAgICk7CiAgICAkUGFyYW17Q291bnRlcn0rKzsKCiAgICByZXR1cm4gJFBhcmFte0NvdW50ZXJ9Owp9CgoxOwo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0MkxheW91dElUU01Mb2NhdGlvbi5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdDJMYXlvdXRJVFNNTG9jYXRpb24ucG0sdiAxLjExIDIwMDgvMDQvMDQgMTA6MjQ6MDcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDJMYXlvdXRJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTGF5b3V0SVRTTUxvY2F0aW9uIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGxvY2F0aW9uIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGlua09iamVjdDJMYXlvdXRJVFNNTG9jYXRpb24tPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IExheW91dE9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFBhcmFtT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb250ZW50U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5Db250ZW50U3RyaW5nQ3JlYXRlKAogICAgICAgIENvbHVtbkRhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgTGlua0RhdGEgPT4gJEhhc2hSZWYsCiAgICApOwoKPWN1dAoKc3ViIENvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29sdW1uRGF0YSBMaW5rRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29udGVudFN0cmluZyA9ICcnOwogICAgaWYgKCAkUGFyYW17Q29sdW1uRGF0YX0tPntUeXBlfSBlcSAnRGF0ZVRpbWUnICkgewogICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiRRRGF0YXsiRGF0ZSJ9In0nLAogICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICBEYXRlID0+ICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyAkUGFyYW17Q29sdW1uRGF0YX0tPntLZXl9IH0gfHwgJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0NoZWNrYm94JyApIHsKICAgICAgICAkQ29udGVudFN0cmluZyA9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17Q29sdW1uRGF0YX0tPntIVE1MT3V0cHV0fS0+e05hbWV9IC4gJyIgJwogICAgICAgICAgICAuICd2YWx1ZT0iJwogICAgICAgICAgICAuICRQYXJhbXtMaW5rRGF0YX0tPnsgJFBhcmFte0NvbHVtbkRhdGF9LT57S2V5fSB9IC4gJyI+JzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0dlbmVyYWxDYXRhbG9nJyApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtDb2x1bW5EYXRhfS0+e0RhdGF9LT57Q2xhc3N9LAogICAgICAgICk7CiAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkQ2xhc3NMaXN0LT57ICRQYXJhbXtMaW5rRGF0YX0tPntEYXRhfS0+eyAkUGFyYW17Q29sdW1uRGF0YX0tPntLZXl9IH0gfTsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRDb250ZW50U3RyaW5nKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ0xpbmsnCiAgICAgICAgJiYgJFBhcmFte0NvbHVtbkRhdGF9LT57RGF0YX0tPntMaW5rVHlwZX0KICAgICAgICAmJiAkUGFyYW17Q29sdW1uRGF0YX0tPntEYXRhfS0+e0xpbmtUeXBlfSBlcSAnWm9vbScKICAgICAgICApCiAgICB7CiAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAnPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Mb2NhdGlvblpvb20mTG9jYXRpb25JRD0nCiAgICAgICAgICAgIC4gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57TG9jYXRpb25JRH0gLiAnIj4nCiAgICAgICAgICAgIC4gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57ICRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX0gfSAuICc8L2E+JzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0NvbHVtbkRhdGF9LT57VHlwZX0gZXEgJ1RleHQnICYmICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57TWF4TGVuZ3RofSApCiAgICB7CiAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57ICRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX0gfSB8fCAnJzsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVmFsdWUpOwogICAgICAgIH0KICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFFEYXRheyJEYXRlIiwiJyAuICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57TWF4TGVuZ3RofSAuICcifScsCiAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgIERhdGUgPT4gJFZhbHVlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDb2x1bW5EYXRhfS0+e1R5cGV9IGVxICdMaW5rVHlwZScgKSB7CiAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0Mjo6VHlwZScpOwogICAgICAgIG15ICRMaW5rVHlwZSAgICAgPSAkUGFyYW17TGlua0RhdGF9LT57ICRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX0gfTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfQogICAgICAgICAgICAmJiAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e05vcm1hbE5hbWV9CiAgICAgICAgICAgICYmICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57UmV2ZXJzZU5hbWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDb250ZW50U3RyaW5nID0gJExpbmtUeXBlTGlzdC0+eyRMaW5rVHlwZX0tPntOb3JtYWxOYW1lfTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17TGlua0RhdGF9LT57UGFydG5lckNvbWJpbmF0aW9ufSBlcSAnUmV2ZXJzZScgKSB7CiAgICAgICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57UmV2ZXJzZU5hbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICggJFBhcmFte0NvbHVtbkRhdGF9LT57SFRNTE91dHB1dH0tPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJENvbnRlbnRTdHJpbmcpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRDb250ZW50U3RyaW5nID0gJFBhcmFte0xpbmtEYXRhfS0+e0RhdGF9LT57ICRQYXJhbXtDb2x1bW5EYXRhfS0+e0tleX0gfSB8fCAnJzsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtDb2x1bW5EYXRhfS0+e0hUTUxPdXRwdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkQ29udGVudFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRDb250ZW50U3RyaW5nKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRDb250ZW50U3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBJdGVtID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhJdGVtIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkSW5wdXRTdHJpbmcgPSAnJzsKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0gZXEgJ1RleHQnICkgewogICAgICAgICRJbnB1dFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte0l0ZW19LT57S2V5fVwiIHNpemU9XCI2MFwiPiI7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9IGVxICdHZW5lcmFsQ2F0YWxvZycgKSB7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBsaXN0CiAgICAgICAgbXkgJFNlbGVjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0NsYXNzfSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIHN0cmluZwogICAgICAgICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgID0+ICRTZWxlY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICA9PiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgICAgICBTaXplICAgICA9PiA1LAogICAgICAgICAgICBNdWx0aXBsZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRJbnB1dFN0cmluZzsKfQoKPWl0ZW0gUGFydG5lclNlYXJjaEZvcm1HZXQoKQoKZ2V0IGFsbCBzZWFyY2ggZm9ybSBkYXRhIGFuZCByZXR1cm4gaXQgYXMgMmQgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+UGFydG5lclNlYXJjaEZvcm1HZXQoKTsKCj1jdXQKCnN1YiBQYXJ0bmVyU2VhcmNoRm9ybUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRGb3JtRGF0YSA9IHt9OwoKICAgICMgZ2V0IHZhbHVlcwogICAgZm9yIG15ICRQYXJhbVZhbHVlIChxdyhOYW1lIFBob25lMSBFbWFpbCBBZGRyZXNzKSkgewogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtVmFsdWUgKTsKICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICRWYWx1ZSA9fiBzL1wqLyUvZzsKICAgICAgICAgICAgJEZvcm1EYXRhLT57JFBhcmFtVmFsdWV9ID0gJFZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnJheXMKICAgIGZvciBteSAkUGFyYW1BcnJheSAocXcoVHlwZUlEcykpIHsKICAgICAgICBteSBAQXJyYXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUFycmF5ICk7CiAgICAgICAgaWYgKEBBcnJheSkgewogICAgICAgICAgICAkRm9ybURhdGEtPnskUGFyYW1BcnJheX0gPSBcQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjExICQgJERhdGU6IDIwMDgvMDQvMDQgMTA6MjQ6MDcgJAoKPWN1dAo= IyAtLQojIEFkbWluSVRTTUxvY2F0aW9uLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWRtaW5JVFNNTG9jYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluSVRTTUxvY2F0aW9uLmR0bCx2IDEuOSAyMDA4LzAxLzI4IDE1OjA2OjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkxvY2F0aW9uIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkxvY2F0aW9uRWRpdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTG9jYXRpb25JRCIgdmFsdWU9Ik5FVyI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQWRkIExvY2F0aW9uIn06PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgTG9jYXRpb24uIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iNzAlIiBjbGFzcz0ibWFpbmJvZHkiPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNjAlIj4kVGV4dHsiTG9jYXRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsidmFsaWQifS8kVGV4dHsiaW52YWxpZCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3RSb3dTcGFjZSAtLT4KICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TGlzdFJvd1NwYWNlIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Mb2NhdGlvbkVkaXQmTG9jYXRpb25JRD0kUURhdGF7IkxvY2F0aW9uSUQifSI+CiAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICRUZXh0eyIkUURhdGF7IlR5cGUifSJ9CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAkVGV4dHsiJFFEYXRheyJWYWxpZCJ9In0KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdMaXN0Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpPdmVydmlld0xpc3QgLS0+CjwhLS0gZHRsOmJsb2NrOkxvY2F0aW9uRWRpdCAtLT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJMb2NhdGlvblNhdmUiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkxvY2F0aW9uSUQiIHZhbHVlPSIkUURhdGF7IkxvY2F0aW9uSUQifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NhdGlvbiJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSIkUURhdGF7Ik5hbWVTaG9ydCJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViLUxvY2F0aW9uIG9mIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFyZW50T3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJUeXBlT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBob25lIn0gMTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJQaG9uZTEiIHZhbHVlPSIkUURhdGF7IlBob25lMSJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUGhvbmUifSAyOiA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlBob25lMiIgdmFsdWU9IiRRRGF0YXsiUGhvbmUyIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjIwMCI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGYXgifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGYXgiIHZhbHVlPSIkUURhdGF7IkZheCJ9IiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRW1haWwifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJFbWFpbCIgdmFsdWU9IiRRRGF0YXsiRW1haWwifSIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjAwIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFkZHJlc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJBZGRyZXNzIiBjb2xzPSI0MCIgcm93cz0iNiI+JFFEYXRheyJBZGRyZXNzIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVmFsaWQifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJWYWxpZE9wdGlvblN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI2MCIgbWF4bGVuZ3RoPSIxNTAiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpMb2NhdGlvbkVkaXQgLS0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo= IyAtLQojIEFnZW50SVRTTUxvY2F0aW9uLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNTG9jYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50SVRTTUxvY2F0aW9uLmR0bCx2IDEuNSAyMDA4LzAxLzI4IDE1OjA2OjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In06ICRUZXh0eyJMb2NhdGlvbiJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjgwMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxvY2F0aW9uIn08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ikxhc3QgQ2hhbmdlIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Um93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpPdmVydmlld1Jvd1NwYWNlIC0tPgogICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3dTcGFjZSAtLT4KICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudElUU01Mb2NhdGlvblpvb20mTG9jYXRpb25JRD0kUURhdGF7IkxvY2F0aW9uSUQifSI+CiAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFRleHR7IiRRRGF0YXsiVHlwZSJ9In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iIHdpZHRoPSIxNTAiPiRUaW1lTG9uZ3siJFFEYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdSb3cgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg== IyAtLQojIEFnZW50SVRTTUxvY2F0aW9uUHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudElUU01Mb2NhdGlvblByaW50LmR0bCx2IDEuMyAyMDA4LzAxLzI4IDE1OjA2OjUyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRUZXh0eyJMb2NhdGlvbiJ9PC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgJFRleHR7IkxvY2F0aW9uLUluZm8ifToKICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAlIj4kVGV4dHsiTG9jYXRpb24ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI0MCUiPiRRRGF0YXsiTmFtZVNob3J0In08L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiQ3JlYXRlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjMwJSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIGJ5In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkNyZWF0ZUJ5VXNlckxvZ2luIn0gKCRRRGF0YXsiQ3JlYXRlQnlVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJDcmVhdGVCeVVzZXJMYXN0bmFtZSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxhc3QgY2hhbmdlZCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ2hhbmdlVGltZSJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij48L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ2hhbmdlQnlVc2VyTG9naW4ifSAoJFFEYXRheyJDaGFuZ2VCeVVzZXJGaXJzdG5hbWUifSAkUURhdGF7IkNoYW5nZUJ5VXNlckxhc3RuYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudHZhbHVlIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgYmdjb2xvcj0iIzAwMDAwMCIgY2xhc3M9ImNvbnRhaW5lciI+CiAgPHRyPgogICAgPHRkPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJzbWFsbCI+CiAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwJSI+JFRleHR7IkxvY2F0aW9uIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJFFEYXRheyJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQaG9uZSAxIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlBob25lMSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBob25lIDIifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUGhvbmUyIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRmF4In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZheCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkUtTWFpbCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJFbWFpbCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkFkZHJlc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBZGRyZXNzIn08L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+ IyAtLQojIEFnZW50SVRTTUxvY2F0aW9uWm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50SVRTTUxvY2F0aW9uWm9vbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRJVFNNTG9jYXRpb25ab29tLmR0bCx2IDEuMTEgMjAwOC8wMS8yOCAxNTowNjo1MiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ilpvb20ifTogJFRleHR7IkxvY2F0aW9uIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkxvY2F0aW9uIn06IDwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVHlwZSJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkUURhdGF7IlR5cGUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBob25lIn0gMTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlBob25lMSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlBob25lIn0gMjogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlBob25lMiJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZheCJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRmF4In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRW1haWwifTogPC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkVtYWlsIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQWRkcmVzcyJ9OiA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJBZGRyZXNzIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkxpbmtIb3Jpem9udGFsUnVsZXIgLS0+CiAgICAgIDxociBzaXplPSIyIj4KPCEtLSBkdGw6YmxvY2s6TGlua0hvcml6b250YWxSdWxlciAtLT4KICAgICAgPGJyPgogICAgICA8dGFibGUgd2lkdGg9Ijk4JSIgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDxjb2xncm91cD4KPCEtLSBkdGw6YmxvY2s6TGlua0NvbHVtbldpZHRoIC0tPgogICAgICAgIDxjb2wgd2lkdGg9IiRRRGF0YXsiV2lkdGgifSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICA8L2NvbGdyb3VwPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+CiAgICAgICAgICAgIDxiPjxpPiRUZXh0eyJSZWxhdGVkIE9iamVjdHMifTogJFRleHR7IiRRRGF0YXsiQmxvY2tuYW1lMSJ9In0gJFFEYXRheyJCbG9ja25hbWUyIn08L2k+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyIkUURhdGF7IkNvbnRlbnQifSJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiREYXRheyJDb250ZW50In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3cgLS0+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCIgY29sc3Bhbj0iJFFEYXRheyJDb2xzcGFuIn0iPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KICAgICAgPGJyPgogICAgPC90ZD4KICAgIDx0ZCB3aWR0aD0iMjUlIiBjbGFzcz0ibWVudSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWludmFsdWUiPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZVRpbWUifSJ9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbmtleSI+JFRleHR7IkNyZWF0ZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNyZWF0ZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDcmVhdGVVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDcmVhdGVVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNyZWF0ZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJtYWlua2V5Ij4kVGV4dHsiTGFzdCBjaGFuZ2VkIn06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWFpbnZhbHVlIj4kVGltZUxvbmd7IiREYXRheyJDaGFuZ2VUaW1lIn0ifTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9Im1haW5rZXkiPiRUZXh0eyJMYXN0IGNoYW5nZWQgYnkifTo8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkNoYW5nZVVzZXJMb2dpbiJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9In0pIj4KICAgICAgICAgICAgJFFEYXRheyJDaGFuZ2VVc2VyTG9naW4iLCIxNSJ9ICgkUXVvdGV7IiREYXRheyJDaGFuZ2VVc2VyRmlyc3RuYW1lIn0gJERhdGF7IkNoYW5nZVVzZXJMYXN0bmFtZSJ9IiwiMTUifSkKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUxvY2F0aW9uLnBtIC0gYWxsIGl0c20gbG9jYXRpb24gZnVuY3Rpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01Mb2NhdGlvbi5wbSx2IDEuMTggMjAwOC8wNS8wMyAxNDoxODo0MCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNTG9jYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Mb2NhdGlvbiAtIGl0c20gbG9jYXRpb24gbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBpdHNtIGxvY2F0aW9uIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkTG9jYXRpb25PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUxvY2F0aW9uLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIExvY2F0aW9uTGlzdCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2YgbG9jYXRpb25zCgogICAgbXkgJUxvY2F0aW9uTGlzdCA9ICRMb2NhdGlvbk9iamVjdC0+TG9jYXRpb25MaXN0KAogICAgICAgIFZhbGlkICA9PiAwLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMb2NhdGlvbkxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgcXVvdGUKICAgICRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17VXNlcklEfSwgJ0ludGVnZXInICk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCBGUk9NIGxvY2F0aW9uJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlTG9jYXRpb25MaXN0OwogICAgbXkgJUxvY2F0aW9uVmFsaWRMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9jYXRpb25MaXN0eyAkUm93WzBdIH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJExvY2F0aW9uVmFsaWRMaXN0eyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiAlTG9jYXRpb25MaXN0IGlmICEkUGFyYW17VmFsaWR9OwoKICAgICMgZHVwbGljYXRlIGxvY2F0aW9uIGxpc3QKICAgIG15ICVMb2NhdGlvbkxpc3RUbXAgPSAlTG9jYXRpb25MaXN0OwoKICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICBmb3IgbXkgJExvY2F0aW9uICggdmFsdWVzICVMb2NhdGlvbkxpc3RUbXAgKSB7CiAgICAgICAgJExvY2F0aW9uIC49ICc6Oic7CiAgICB9CgogICAgIyBnZXQgdmFsaWQgaWRzCiAgICBteSBAVmFsaWRJRHMgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKTsKCiAgICBteSAlTG9jYXRpb25JbnZhbGlkTGlzdDsKICAgIExPQ0FUSU9OSUQ6CiAgICBmb3IgbXkgJExvY2F0aW9uSUQgKAogICAgICAgIHNvcnQgeyAkTG9jYXRpb25MaXN0VG1weyRhfSBjbXAgJExvY2F0aW9uTGlzdFRtcHskYn0gfQogICAgICAgIGtleXMgJUxvY2F0aW9uTGlzdFRtcAogICAgICAgICkKICAgIHsKICAgICAgICBteSAkSW52YWxpZCA9IDE7CiAgICAgICAgZm9yIG15ICRWYWxpZElEIChAVmFsaWRJRHMpIHsKICAgICAgICAgICAgaWYgKCAkTG9jYXRpb25WYWxpZExpc3R7JExvY2F0aW9uSUR9IGVxICRWYWxpZElEICkgewogICAgICAgICAgICAgICAgJEludmFsaWQgPSAwOwogICAgICAgICAgICAgICAgbGFzdCBMT0NBVElPTklEOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICAgICAkTG9jYXRpb25JbnZhbGlkTGlzdHsgJExvY2F0aW9uTGlzdHskTG9jYXRpb25JRH0gfSA9IDE7CiAgICAgICAgICAgIGRlbGV0ZSAkTG9jYXRpb25MaXN0eyRMb2NhdGlvbklEfTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgaW52YWxpZCBsb2NhdGlvbnMgYW4gY2hpbGRzCiAgICBMT0NBVElPTklEOgogICAgZm9yIG15ICRMb2NhdGlvbklEICgga2V5cyAlTG9jYXRpb25MaXN0ICkgewogICAgICAgIElOVkFMSURJRDoKICAgICAgICBmb3IgbXkgJEludmFsaWROYW1lICgga2V5cyAlTG9jYXRpb25JbnZhbGlkTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkTG9jYXRpb25MaXN0eyRMb2NhdGlvbklEfSA9fiBteyBcQSAkSW52YWxpZE5hbWUgOjogfXhtcyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTG9jYXRpb25MaXN0eyRMb2NhdGlvbklEfTsKCiAgICAgICAgICAgICAgICBsYXN0IExPQ0FUSU9OSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMb2NhdGlvbkxpc3Q7Cn0KCj1pdGVtIExvY2F0aW9uR2V0KCkKCnJldHVybiBhIGxvY2F0aW9uIGFzIGhhc2gKClJldHVybgogICAgJExvY2F0aW9uRGF0YXtMb2NhdGlvbklEfQogICAgJExvY2F0aW9uRGF0YXtQYXJlbnRJRH0KICAgICRMb2NhdGlvbkRhdGF7TmFtZX0KICAgICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fQogICAgJExvY2F0aW9uRGF0YXtUeXBlSUR9CiAgICAkTG9jYXRpb25EYXRhe1Bob25lMX0KICAgICRMb2NhdGlvbkRhdGF7UGhvbmUyfQogICAgJExvY2F0aW9uRGF0YXtGYXh9CiAgICAkTG9jYXRpb25EYXRhe0VtYWlsfQogICAgJExvY2F0aW9uRGF0YXtBZGRyZXNzfQogICAgJExvY2F0aW9uRGF0YXtWYWxpZElEfQogICAgJExvY2F0aW9uRGF0YXtDb21tZW50fQogICAgJExvY2F0aW9uRGF0YXtDcmVhdGVUaW1lfQogICAgJExvY2F0aW9uRGF0YXtDcmVhdGVCeX0KICAgICRMb2NhdGlvbkRhdGF7Q2hhbmdlVGltZX0KICAgICRMb2NhdGlvbkRhdGF7Q2hhbmdlQnl9CgogICAgbXkgJUxvY2F0aW9uRGF0YSA9ICRMb2NhdGlvbk9iamVjdC0+TG9jYXRpb25HZXQoCiAgICAgICAgTG9jYXRpb25JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMb2NhdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMb2NhdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhMb2NhdGlvbklEIFVzZXJJRCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFteyRBcmd1bWVudH0sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgZ2V0IGxvY2F0aW9uIGZyb20gZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lLCB0eXBlX2lkLCBwaG9uZTEsIHBob25lMiwgZmF4LCBlbWFpbCwgYWRkcmVzcywgIgogICAgICAgICAgICAuICJ2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgIgogICAgICAgICAgICAuICJGUk9NIGxvY2F0aW9uIFdIRVJFIGlkID0gJFBhcmFte0xvY2F0aW9uSUR9IiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVMb2NhdGlvbkRhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb2NhdGlvbkRhdGF7TG9jYXRpb25JRH0gPSAkUm93WzBdOwogICAgICAgICRMb2NhdGlvbkRhdGF7TmFtZX0gICAgICAgPSAkUm93WzFdOwogICAgICAgICRMb2NhdGlvbkRhdGF7VHlwZUlEfSAgICAgPSAkUm93WzJdOwogICAgICAgICRMb2NhdGlvbkRhdGF7UGhvbmUxfSAgICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7UGhvbmUyfSAgICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7RmF4fSAgICAgICAgPSAkUm93WzVdIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7RW1haWx9ICAgICAgPSAkUm93WzZdIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7QWRkcmVzc30gICAgPSAkUm93WzddIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7VmFsaWRJRH0gICAgPSAkUm93WzhdOwogICAgICAgICRMb2NhdGlvbkRhdGF7Q29tbWVudH0gICAgPSAkUm93WzldIHx8ICcnOwogICAgICAgICRMb2NhdGlvbkRhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzEwXTsKICAgICAgICAkTG9jYXRpb25EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1sxMV07CiAgICAgICAgJExvY2F0aW9uRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbMTJdOwogICAgICAgICRMb2NhdGlvbkRhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzEzXTsKICAgIH0KCiAgICAjIGNoZWNrIGxvY2F0aW9uCiAgICBpZiAoICEkTG9jYXRpb25EYXRhe0xvY2F0aW9uSUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBMb2NhdGlvbklEICgkUGFyYW17TG9jYXRpb25JRH0pISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgc2hvcnQgbmFtZSBhbmQgcGFyZW50aWQKICAgICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fSA9ICRMb2NhdGlvbkRhdGF7TmFtZX07CiAgICBpZiAoICRMb2NhdGlvbkRhdGF7TmFtZX0gPX4gL14oLiopOjooLis/KSQvICkgewogICAgICAgICRMb2NhdGlvbkRhdGF7TmFtZVNob3J0fSA9ICQyOwoKICAgICAgICAjIGxvb2t1cCBwYXJlbnQKICAgICAgICBteSAkTG9jYXRpb25JRCA9ICRTZWxmLT5Mb2NhdGlvbkxvb2t1cCggTmFtZSA9PiAkMSApOwogICAgICAgICRMb2NhdGlvbkRhdGF7UGFyZW50SUR9ID0gJExvY2F0aW9uSUQ7CiAgICB9CgogICAgcmV0dXJuICVMb2NhdGlvbkRhdGE7Cn0KCj1pdGVtIExvY2F0aW9uTG9va3VwKCkKCnJldHVybiBhIGxvY2F0aW9uIG5hbWUgYW5kIGlkCgogICAgbXkgJExvY2F0aW9uTmFtZSA9ICRMb2NhdGlvbk9iamVjdC0+TG9jYXRpb25Mb29rdXAoCiAgICAgICAgTG9jYXRpb25JRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJExvY2F0aW9uSUQgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ0xvY2F0aW9uOjpTdWJMb2NhdGlvbicsCiAgICApOwoKPWN1dAoKc3ViIExvY2F0aW9uTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtMb2NhdGlvbklEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIExvY2F0aW9uSUQgb3IgTmFtZSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte0xvY2F0aW9uSUR9ICkgewoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte0xvY2F0aW9uSUR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17TG9jYXRpb25JRH0sICdJbnRlZ2VyJyApOwoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAiU0VMRUNUIG5hbWUgRlJPTSBsb2NhdGlvbiBXSEVSRSBpZCA9ICRQYXJhbXtMb2NhdGlvbklEfSIsCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJExvY2F0aW9uTmFtZTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTG9jYXRpb25OYW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTG9jYXRpb25OYW1lOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TmFtZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtOYW1lfSApOwoKICAgICAgICAjIGxvb2t1cAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGlkIEZST00gbG9jYXRpb24gV0hFUkUgbmFtZSA9ICckUGFyYW17TmFtZX0nIiwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkTG9jYXRpb25JRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTG9jYXRpb25JRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExvY2F0aW9uSUQ7CiAgICB9Cn0KCj1pdGVtIExvY2F0aW9uQWRkKCkKCmFkZCBhIGxvY2F0aW9uCgogICAgbXkgJFRydWUgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uQWRkKAogICAgICAgIE5hbWUgICAgID0+ICdMb2NhdGlvbiBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBUeXBlSUQgICA9PiAxMjMsCiAgICAgICAgUGhvbmUxICAgPT4gJzAxMDEwMTAxJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUGhvbmUyICAgPT4gJzAxMDEwMTAxJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRmF4ICAgICAgPT4gJzExMTExMjIyMjInLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRW1haWwgICAgPT4gJ215QGVtYWlsLmRlJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWRkcmVzcyAgPT4gJ1RoZSBBZGRyZXNzJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMb2NhdGlvbkFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFR5cGVJRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoUGhvbmUxIFBob25lMiBGYXggRW1haWwgQWRkcmVzcyBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFBhcmFteyRBcmd1bWVudH0gfHwgJyc7CiAgICB9CgogICAgIyBxdW90ZQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBQaG9uZTEgUGhvbmUyIEZheCBFbWFpbCBBZGRyZXNzIENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9ICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUeXBlSUQgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zIChyZXBsYWNlIGl0IHdpdGggU3RyaW5nQ2xlYW4oKSBpbiBPVFJTIDIuMyBhbmQgbGF0ZXIpCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFBob25lMSBQaG9uZTIgRmF4IENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICAkU2VsZi0+X1N0cmluZ0NsZWFuKAogICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17RW1haWx9LAogICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgU3RyaW5nUmVmID0+IFwkUGFyYW17QWRkcmVzc30sCiAgICApOwoKICAgICMgY2hlY2sgbG9jYXRpb24gbmFtZQogICAgaWYgKCAkUGFyYW17TmFtZX0gPX4gLzo6LyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGFkZCBsb2NhdGlvbiEgSW52YWxpZCBMb2NhdGlvbiBuYW1lICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgZnVsbCBuYW1lCiAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmFte05hbWV9OwoKICAgICMgZ2V0IHBhcmVudCBuYW1lCiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkU2VsZi0+TG9jYXRpb25Mb29rdXAoIExvY2F0aW9uSUQgPT4gJFBhcmFte1BhcmVudElEfSApOwogICAgICAgIGlmICgkUGFyZW50TmFtZSkgewogICAgICAgICAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJlbnROYW1lKSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte1BhcmVudElEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1BhcmVudElEfSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXN0aW5nIGxvY2F0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGlkIEZST00gbG9jYXRpb24gV0hFUkUgbmFtZSA9ICckUGFyYW17RnVsbE5hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgaXRlbSwgaWYgaXRlbSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgbG9jYXRpb24hIExvY2F0aW9uIHdpdGggc2FtZSBuYW1lIGFuZCBwYXJlbnQgYWxyZWFkeSBleGlzdHMuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyBsb2NhdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBsb2NhdGlvbiAiCiAgICAgICAgICAgIC4gIihuYW1lLCB0eXBlX2lkLCBwaG9uZTEsIHBob25lMiwgZmF4LCBlbWFpbCwgYWRkcmVzcywgdmFsaWRfaWQsICIKICAgICAgICAgICAgLiAiY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAiCiAgICAgICAgICAgIC4gIignJFBhcmFte0Z1bGxOYW1lfScsICRQYXJhbXtUeXBlSUR9LCAnJFBhcmFte1Bob25lMX0nLCAiCiAgICAgICAgICAgIC4gIickUGFyYW17UGhvbmUyfScsICckUGFyYW17RmF4fScsICIKICAgICAgICAgICAgLiAiJyRQYXJhbXtFbWFpbH0nLCAnJFBhcmFte0FkZHJlc3N9JywgJFBhcmFte1ZhbGlkSUR9LCAnJFBhcmFte0NvbW1lbnR9JywgIgogICAgICAgICAgICAuICJjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0sIGN1cnJlbnRfdGltZXN0YW1wLCAkUGFyYW17VXNlcklEfSkiCiAgICApOwoKICAgIHJldHVybiBpZiAhJFN1Y2Nlc3M7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICJTRUxFQ1QgaWQgRlJPTSBsb2NhdGlvbiBXSEVSRSBuYW1lID0gJyRQYXJhbXtGdWxsTmFtZX0nIiwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRMb2NhdGlvbklEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTG9jYXRpb25JRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRMb2NhdGlvbklEOwp9Cgo9aXRlbSBMb2NhdGlvblVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBsb2NhdGlvbgoKICAgIG15ICRUcnVlID0gJExvY2F0aW9uT2JqZWN0LT5Mb2NhdGlvblVwZGF0ZSgKICAgICAgICBMb2NhdGlvbklEID0+IDEyMywKICAgICAgICBQYXJlbnRJRCAgID0+IDEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE5hbWUgICAgICAgPT4gJ0xvY2F0aW9uIE5hbWUnLAogICAgICAgIFR5cGVJRCAgICAgPT4gMTIzLAogICAgICAgIFBob25lMSAgICAgPT4gJzAxMDEwMTAxJywgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUGhvbmUyICAgICA9PiAnMDEwMTAxMDEnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGYXggICAgICAgID0+ICcxMTExMTIyMjIyJywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEVtYWlsICAgICAgPT4gJ215QGVtYWlsLmRlJywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgQWRkcmVzcyAgICA9PiAnVGhlIEFkZHJlc3MnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICA9PiAnQ29tbWVudCcsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExvY2F0aW9uVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KExvY2F0aW9uSUQgTmFtZSBUeXBlSUQgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFBob25lMSBQaG9uZTIgRmF4IEVtYWlsIEFkZHJlc3MgQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSA9ICRQYXJhbXskQXJndW1lbnR9IHx8ICcnOwogICAgfQoKICAgICMgcXVvdGUKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgUGhvbmUxIFBob25lMiBGYXggRW1haWwgQWRkcmVzcyBDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JEFyZ3VtZW50fSApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTG9jYXRpb25JRCBUeXBlSUQgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskQXJndW1lbnR9LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zIChyZXBsYWNlIGl0IHdpdGggU3RyaW5nQ2xlYW4oKSBpbiBPVFJTIDIuMyBhbmQgbGF0ZXIpCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIFBob25lMSBQaG9uZTIgRmF4IENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPl9TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICAkU2VsZi0+X1N0cmluZ0NsZWFuKAogICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17RW1haWx9LAogICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgKTsKICAgICRTZWxmLT5fU3RyaW5nQ2xlYW4oCiAgICAgICAgU3RyaW5nUmVmID0+IFwkUGFyYW17QWRkcmVzc30sCiAgICApOwoKICAgICMgY2hlY2sgbG9jYXRpb24gbmFtZQogICAgaWYgKCAkUGFyYW17TmFtZX0gPX4gLzo6LyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBsb2NhdGlvbiEgSW52YWxpZCBMb2NhdGlvbiBuYW1lICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2xkIG5hbWUgb2YgbG9jYXRpb24KICAgIG15ICRPbGRMb2NhdGlvbk5hbWUgPSAkU2VsZi0+TG9jYXRpb25Mb29rdXAoCiAgICAgICAgTG9jYXRpb25JRCA9PiAkUGFyYW17TG9jYXRpb25JRH0sCiAgICApOwoKICAgICMgY3JlYXRlIGZ1bGwgbmFtZQogICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJhbXtOYW1lfTsKCiAgICAjIGdldCBwYXJlbnQgbmFtZQogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICRQYXJlbnROYW1lID0gJFNlbGYtPkxvY2F0aW9uTG9va3VwKAogICAgICAgICAgICBMb2NhdGlvbklEID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRQYXJlbnROYW1lKSB7CiAgICAgICAgICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmVudE5hbWUpIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIGlmIHNlbGVjdGVkIHBhcmVudCB3YXMgYSBjaGlsZCBvZiB0aGlzIGxvY2F0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17RnVsbE5hbWV9ID1+IC9eKCRPbGRMb2NhdGlvbk5hbWUpOjovICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGxvY2F0aW9uISBJbnZhbGlkIHBhcmVudCB3YXMgc2VsZWN0ZWQuIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHF1b3RlCiAgICAgICAgJFBhcmFte1BhcmVudElEfSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte1BhcmVudElEfSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXN0aW5nIGxvY2F0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAiU0VMRUNUIGlkIEZST00gbG9jYXRpb24gV0hFUkUgbmFtZSA9ICckUGFyYW17RnVsbE5hbWV9JyIsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17TG9jYXRpb25JRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgbG9jYXRpb24hIExvY2F0aW9uIHdpdGggc2FtZSBuYW1lIGFuZCBwYXJlbnQgYWxyZWFkeSBleGlzdHMuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIGxvY2F0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgbG9jYXRpb24gU0VUIG5hbWUgPSAnJFBhcmFte0Z1bGxOYW1lfScsIHR5cGVfaWQgPSAkUGFyYW17VHlwZUlEfSwgIgogICAgICAgICAgICAuICJwaG9uZTEgPSAnJFBhcmFte1Bob25lMX0nLCBwaG9uZTIgPSAnJFBhcmFte1Bob25lMn0nLCBmYXggPSAnJFBhcmFte0ZheH0nLCAiCiAgICAgICAgICAgIC4gImVtYWlsID0gJyRQYXJhbXtFbWFpbH0nLCBhZGRyZXNzID0gJyRQYXJhbXtBZGRyZXNzfScsIHZhbGlkX2lkID0gJFBhcmFte1ZhbGlkSUR9LCAiCiAgICAgICAgICAgIC4gImNvbW1lbnRzID0gJyRQYXJhbXtDb21tZW50fScsICIKICAgICAgICAgICAgLiAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIgogICAgICAgICAgICAuICJXSEVSRSBpZCA9ICRQYXJhbXtMb2NhdGlvbklEfSIKICAgICk7CgogICAgIyBmaW5kIGFsbCBjaGlsZHMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lIEZST00gbG9jYXRpb24gV0hFUkUgbmFtZSBMSUtFICciCiAgICAgICAgICAgIC4gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRPbGRMb2NhdGlvbk5hbWUpCiAgICAgICAgICAgIC4gIjo6JSciCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQENoaWxkczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUNoaWxkOwogICAgICAgICRDaGlsZHtMb2NhdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJENoaWxke05hbWV9ICAgICAgID0gJFJvd1sxXTsKICAgICAgICBwdXNoKCBAQ2hpbGRzLCBcJUNoaWxkICk7CiAgICB9CgogICAgIyB1cGRhdGUgY2hpbGRzCiAgICBmb3IgbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgJENoaWxkLT57TmFtZX0gPX4gcy9eKCRPbGRMb2NhdGlvbk5hbWUpOjovJFBhcmFte0Z1bGxOYW1lfTo6LzsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIGxvY2F0aW9uIFNFVCBuYW1lID0gJyRDaGlsZC0+e05hbWV9JyBXSEVSRSBpZCA9ICRDaGlsZC0+e0xvY2F0aW9uSUR9IgogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExvY2F0aW9uU2VhcmNoKCkKCnJldHVybiBhIGxvY2F0aW9uIGlkcyBhcyBhbiBhcnJheQoKICAgIG15IEBMb2NhdGlvbkxpc3QgPSAkTG9jYXRpb25PYmplY3QtPkxvY2F0aW9uU2VhcmNoKAogICAgICAgIE5hbWUgICAgPT4gJ0xvY2F0aW9uIE5hbWUnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVHlwZUlEcyA9PiBbMTIzLCAxM