LinkObject2 1.0.6 OTRS AG http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Build for OTRS::ITSM 1.0.6. Build for OTRS::ITSM 1.0.5. Build for OTRS::ITSM 1.0.4. Build for OTRS::ITSM 1.0.3. Build for OTRS::ITSM 1.0.2. Build for OTRS::ITSM 1.0.1. Build for OTRS::ITSM 1.0.0 rc2. Build for OTRS::ITSM 1.0.0 rc1. Build for OTRS::ITSM 1.0.0 beta4. Build for OTRS::ITSM 1.0.0 beta3. Update version number of package. Testbuild for OTRS::ITSM 1.0.0 beta2. Init release. The LinkObject2 package. Das LinkObject2 Paket. 2.2.6 <br> WELCOME<br> <br> You are about to install the OTRS module LinkObject2.<br> <br> <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 LinkObject2 zu installieren.<br> <br> <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 LinkObject2.<br> <br> <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 LinkObject2 zu aktualisieren.<br> <br> <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> 2008-03-29 23:12:15 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBMaW5rT2JqZWN0Mi54bWwsdiAxLjYgMjAwNy8wNC8xNiAxMDo0OTo0OSBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50TGlua09iamVjdDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWdlbnRMaW5rT2JqZWN0MiBvYmplY3QgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFnZW50TGlua09iamVjdDItT2JqZWt0cyBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TGlua09iamVjdDI8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkxpbmtPYmplY3QyPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkxpbmtPYmplY3QyPC9OYXZCYXJOYW1lPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudExpbmtPYmplY3QyU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFnZW50TGlua09iamVjdDJTZWFyY2ggb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBBZ2VudExpbmtPYmplY3QyU2VhcmNoLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxpbmtPYmplY3QyPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5MaW5rT2JqZWN0MjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5MaW5rT2JqZWN0MjwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRMaW5rT2JqZWN0MkFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZ2VudExpbmtPYmplY3QyQWRkIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWdlbnRMaW5rT2JqZWN0MkFkZC1PYmpla3RzIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5MaW5rT2JqZWN0MjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+TGlua09iamVjdDI8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+TGlua09iamVjdDI8L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAwLUJhY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Nb2R1bGUgdG8gc2hvdyBiYWNrIGxpbmsgaW4gbGluayBvYmplY3QgMiBtZW51LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj7cYmVyIGRpZXNlcyBNb2R1bCB3aXJkIGRlciBadXL8Y2stTGluayBpbiBkZXIgTGlua2xlaXN0ZSBkZXIgTGlua09iamVjdDItQW5zaWNodCBhbmdlemVpZ3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpMaW5rT2JqZWN0Mjo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0Mk1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5CYWNrPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+QmFjazwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPiRFbnZ7IkxpbmtPYmplY3QyTGFzdFNjcmVlbiJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMTAwLUFkZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPk1vZHVsZSB0byBzaG93IGFkZCBsaW5rIGluIGxpbmsgb2JqZWN0IDIgbWVudS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+3GJlciBkaWVzZXMgTW9kdWwgd2lyZCBkZXIgSGluenVm/Gdlbi1MaW5rIGluIGRlciBMaW5rbGVpc3RlIGRlciBMaW5rT2JqZWN0Mi1BbnNpY2h0IGFuZ2V6ZWlndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkxpbmtPYmplY3QyOjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iPkFkZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudExpbmtPYmplY3QyU2VhcmNoJmFtcDtTb3VyY2VDbGFzcz0kUURhdGF7IlNvdXJjZUNsYXNzIn0mYW1wO1NvdXJjZUtleT0kUURhdGF7IlNvdXJjZUtleSJ9PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDI6OlR5cGUjIyNOb3JtYWwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5MaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkxpbmsgVHlwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3QyOjpUeXBlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOb3JtYWxOYW1lIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJldmVyc2VOYW1lIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0Mjo6VHlwZSMjI1BhcmVudENoaWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5MaW5rIFR5cC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0Mjo6VHlwZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTm9ybWFsTmFtZSI+UGFyZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXZlcnNlTmFtZSI+Q2hpbGQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+ IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19MaW5rT2JqZWN0Mi5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgTGlua09iamVjdDIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogYmdfTGlua09iamVjdDIucG0sdiAxLjEuMi4xIDIwMDcvMTIvMDMgMTU6NDk6NTcgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0xpbmtPYmplY3QyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWxhdGVkIE9iamVjdHMnfSA9ICfR4vrw5+Dt6CDu4eXq8ugnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIE9iamVjdCd9ID0gJ87h5ery6C3o5/Lu9+3o9ugnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFyZ2V0IE9iamVjdCd9ID0gJ87h5ery6C325evoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmt0eXBlJ30gPSAn0ujvIO3gIOLw+ufq4PLgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhcmdldCBPYmplY3RzIGFyZS4uLid9ID0gJ8jn4fDg7ejy5SDu4eXq8ugg8eAgLi4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3JtYWwnfSA9ICfN7vDs4Ovt4Cc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJlbnQnfSA9ICfQ7uTo8uXrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoaWxkJ30gPSAnxOXy5Sc7CgogICAgcmV0dXJuIDE7Cn0KCjE7 IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9MaW5rT2JqZWN0Mi5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBMaW5rT2JqZWN0MgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBjel9MaW5rT2JqZWN0Mi5wbSx2IDEuMS4yLjEgMjAwNy8xMi8xMCAxNDowMTo1NyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3pfTGlua09iamVjdDI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0ZWQgT2JqZWN0cyd9ID0gJ05hdsOhemFuw6kgb2JqZWt0eSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgT2JqZWN0J30gPSAnWmRvcmpvdsOpIG9iamVrdHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFyZ2V0IE9iamVjdCd9ID0gJ0PDrWxvdsOpIG9iamVrdHknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3R5cGUnfSA9ICdMaW5rIHR5cGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFyZ2V0IE9iamVjdHMgYXJlLi4uJ30gPSAnWnZvbGVuw6kgb2JqZWt0eSBqc291IC4uLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm9ybWFsJ30gPSAnTm9ybcOhbG7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJlbnQnfSA9ICdSb2RpxI0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hpbGQnfSA9ICdEw610xJsnOwoKICAgIHJldHVybiAxOwp9CgoxOwo= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9MaW5rT2JqZWN0Mi5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgTGlua09iamVjdDIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfTGlua09iamVjdDIucG0sdiAxLjggMjAwNy8wNy8wMiAxMjo0MDo0NCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfTGlua09iamVjdDI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbGF0ZWQgT2JqZWN0cyd9ID0gJ0FiaORuZ2lnZSBPYmpla3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBPYmplY3QnfSA9ICdRdWVsbCBPYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFyZ2V0IE9iamVjdCd9ID0gJ1ppZWwgT2JqZWt0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmt0eXBlJ30gPSAnVmVya278cGZ1bmdzdHlwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhcmdldCBPYmplY3RzIGFyZS4uLid9ID0gJ1ppZWwgT2JqZWt0ZSBzaW5kLi4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3JtYWwnfSA9ICdOb3JtYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyZW50J30gPSAnRWx0ZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoaWxkJ30gPSAnS2luZCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7 IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDIucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRMaW5rT2JqZWN0Mi5wbSx2IDEuMTEgMjAwNy8wOC8wMiAxMjo1MDo1NSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudExpbmtPYmplY3QyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjExICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkU291cmNlQ2xhc3MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNvdXJjZUNsYXNzIik7CiAgICBteSAkU291cmNlS2V5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTb3VyY2VLZXkiKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoISRTb3VyY2VDbGFzcyB8fCAhJFNvdXJjZUtleSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTb3VyY2VDbGFzcyBhbmQgU291cmNlS2V5IGlzIGdpdmVuISIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CiAgICAjIGRlbGV0ZSBsaW5rcwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTGlua0RlbGV0ZScpIHsKICAgICAgICAjIGdldCBkZWxldGUgaWRzCiAgICAgICAgbXkgQERlbGV0ZUlEcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAiRGVsZXRlSUQiKTsKICAgICAgICAjIGRlbGV0ZSBsaW5rcwogICAgICAgIGlmIChARGVsZXRlSURzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdDJ9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgTGlua0lEID0+IFxARGVsZXRlSURzLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICMgb3V0cHV0IGhlYWRlcgogICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdPdmVydmlldycpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICMgcnVuIGxpbmsgb2JqZWN0IG1lbnUgbW9kdWxlcwogICAgaWYgKHJlZigkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDI6OkZyb250ZW5kOjpNZW51TW9kdWxlJykpIGVxICdIQVNIJykgewogICAgICAgIG15ICVNZW51cyA9ICV7JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3QyOjpGcm9udGVuZDo6TWVudU1vZHVsZScpfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yZWFjaCBteSAkTWVudSAoc29ydCBrZXlzICVNZW51cykgewogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNZW51c3skTWVudX0tPntNb2R1bGV9KSkgewogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkQ291bnRlciA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgIyBnZXQgc291cmNlIG92ZXJ2aWV3IGRhdGEKICAgIG15ICRTb3VyY2VPYmplY3QgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+T2JqZWN0T3ZlcnZpZXdHZXQoCiAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgIEtleSA9PiAkU291cmNlS2V5LAogICAgKTsKICAgICMgZ2V0IGNsYXNzIG5hbWUKICAgIG15ICRTb3VyY2VDbGFzc05hbWUgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+Q2xhc3NOYW1lR2V0KAogICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBLZXkgPT4gJFNvdXJjZUtleSwKICAgICk7CiAgICAjIG91dHB1dCBzb3VyY2Ugb2JqZWN0IGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1NvdXJjZU9iamVjdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIENsYXNzTmFtZSA9PiAkU291cmNlQ2xhc3NOYW1lLAogICAgICAgIH0sCiAgICApOwogICAgIyBvdXRwdXQgc291cmNlIG9iamVjdCByb3cgYmxvY2sKICAgIGZvcmVhY2ggbXkgJFJvd0RhdGEgKEB7JFNvdXJjZU9iamVjdH0pIHsKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICgkUm93RGF0YS0+e1RyYW5zbGF0aW9ufSkgewogICAgICAgICAgICAkUm93RGF0YS0+e0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFJvd0RhdGEtPntDb250ZW50fSk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvdXJjZU9iamVjdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskUm93RGF0YX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgZ2V0IHBhcnRuZXIgbGluayBkYXRhIGxpc3QKICAgIG15ICRQYXJ0bmVyTGlua0RhdGFMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJMaW5rRGF0YUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgIEtleSA9PiAkU291cmNlS2V5LAogICAgKTsKICAgICMgZ2VuZXJhdGUgYmxvY2sgbGlzdAogICAgbXkgJEJsb2NrTGlzdCA9IHt9OwogICAgZm9yZWFjaCBteSAkSXRlbSAoQHskUGFydG5lckxpbmtEYXRhTGlzdH0pIHsKICAgICAgICAkQmxvY2tMaXN0LT57JEl0ZW0tPntCbG9ja25hbWUxfX0tPnskSXRlbS0+e0Jsb2NrbmFtZTJ9fS0+eyRJdGVtLT57TGlua0lEfX0gPSAkSXRlbTsKICAgIH0KICAgICMgc3RhcnQgcGFydG5lciBvdXRwdXQKICAgIGZvcmVhY2ggbXkgJEJsb2NrbmFtZTEgKHNvcnQga2V5cyAleyRCbG9ja0xpc3R9KSB7CiAgICAgICAgZm9yZWFjaCBteSAkQmxvY2tuYW1lMiAoc29ydCBrZXlzICV7JEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfX0pIHsKICAgICAgICAgICAgbXkgJEl0ZW1MaXN0ID0gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfTsKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15IEBMaW5rSURzID0ga2V5cygleyRJdGVtTGlzdH0pOwogICAgICAgICAgICBteSAkUGFydG5lclRhYmxlQ29sdW1uID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJUYWJsZUNvbHVtbkdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtTGlzdC0+eyRMaW5rSURzWzBdfS0+e1BhcnRuZXJDbGFzc30sCiAgICAgICAgICAgICAgICBMaW5rVHlwZUNvbHVtbiA9PiAxLAogICAgICAgICAgICAgICAgRGVsZXRlQ29sdW1uID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgY291bnQgY29sdW1ucwogICAgICAgICAgICBteSAkQ29sdW1uQ291bnQgPSBAeyRQYXJ0bmVyVGFibGVDb2x1bW59OwogICAgICAgICAgICAjIG91dHB1dCBsaW5rIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICBCbG9ja25hbWUxID0+ICRCbG9ja25hbWUxLAogICAgICAgICAgICAgICAgICAgIEJsb2NrbmFtZTIgPT4gJEJsb2NrbmFtZTIsCiAgICAgICAgICAgICAgICAgICAgQ29sc3BhbiA9PiAkQ29sdW1uQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIG91dHB1dCBjb2x1bW4gd2lkdGggYmxvY2sKICAgICAgICAgICAgZm9yZWFjaCBteSAkQ29sdW1uIChAeyRQYXJ0bmVyVGFibGVDb2x1bW59KSB7CiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIGhlYWRlciBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0NvbHVtbldpZHRoJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggPT4gJENvbHVtbi0+e0hUTUxPdXRwdXR9LT57VGFibGVXaWR0aH0gfHwgJyonLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgb3V0cHV0IGhlYWRsaW5lIGNvbHVtbiBibG9jawogICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW4gKEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0pIHsKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rSGVhZGVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkQ29sdW1uLT57SGVhZGxpbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDc3NDbGFzczsKICAgICAgICAgICAgZm9yZWFjaCBteSAkTGlua0RhdGEgKHNvcnQga2V5cyAleyRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn19KSB7CiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rUm93JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW5EYXRhIChAeyRQYXJ0bmVyVGFibGVDb2x1bW59KSB7CiAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgY29udGVudAogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRCbG9ja0xpc3QtPnskQmxvY2tuYW1lMX0tPnskQmxvY2tuYW1lMn0tPnskTGlua0RhdGF9LT57UGFydG5lckNsYXNzfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRGF0YSA9PiAkQ29sdW1uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0RhdGEgPT4gJEJsb2NrTGlzdC0+eyRCbG9ja25hbWUxfS0+eyRCbG9ja25hbWUyfS0+eyRMaW5rRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHJvdyBjb2x1bW4gYmxvY2sKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rUm93Q29sdW1uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb250ZW50U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOw== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJBZGQucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRMaW5rT2JqZWN0MkFkZC5wbSx2IDEuMTAgMjAwNy8wOC8wMiAxMjo1MDo1NSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudExpbmtPYmplY3QyQWRkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEwICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIikKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e0xpbmtPYmplY3QyfSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICRTb3VyY2VDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU291cmNlQ2xhc3MiKTsKICAgIG15ICRTb3VyY2VLZXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlNvdXJjZUtleSIpOwogICAgbXkgJFBhcnRuZXJDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUGFydG5lckNsYXNzIik7CiAgICBteSAkUGFydG5lck9iamVjdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUGFydG5lck9iamVjdCIpOwogICAgbXkgJFBhcnRuZXJMaW5rVHlwZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUGFydG5lckxpbmtUeXBlIik7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICghJFNvdXJjZUNsYXNzIHx8ICEkU291cmNlS2V5IHx8ICEkUGFydG5lckNsYXNzIHx8ICEkUGFydG5lck9iamVjdCB8fCAhJFBhcnRuZXJMaW5rVHlwZSkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICJObyBTb3VyY2VDbGFzcywgU291cmNlS2V5LCBQYXJ0bmVyQ2xhc3MsIFBhcnRuZXJPYmplY3QgYW5kIFBhcnRuZXJMaW5rVHlwZSBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGluayBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdMaW5rQWRkJykgewogICAgICAgICMgZ2V0IHRhcmdldCBrZXlzCiAgICAgICAgbXkgQFRhcmdldEtleXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gIlRhcmdldEtleSIpOwogICAgICAgIG15ICRSZXZlcnNlOwogICAgICAgIG15ICRMaW5rVHlwZTsKICAgICAgICBpZiAoJFBhcnRuZXJMaW5rVHlwZSA9fiAvXiguKz8pOjooLiopJC8pIHsKICAgICAgICAgICAgJExpbmtUeXBlID0gJDE7CiAgICAgICAgICAgIGlmICgkMiBlcSAnUmV2ZXJzZScpIHsKICAgICAgICAgICAgICAgICRSZXZlcnNlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGFkZCBsaW5rcwogICAgICAgIGZvcmVhY2ggbXkgJE9uZUtleSAoQFRhcmdldEtleXMpIHsKICAgICAgICAgICAgaWYgKCRSZXZlcnNlKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSA9PiAkT25lS2V5LAogICAgICAgICAgICAgICAgICAgIFRhcmdldENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3QyfS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRMaW5rVHlwZSwKICAgICAgICAgICAgICAgICAgICBTb3VyY2VDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0Q2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgPT4gJE9uZUtleSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj1BZ2VudExpbmtPYmplY3QyJlNvdXJjZUNsYXNzPSRTb3VyY2VDbGFzcyZTb3VyY2VLZXk9JFNvdXJjZUtleSIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNlIHsKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ0xpbmsnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICMgZ2V0IHNvdXJjZSBvdmVydmlldyBkYXRhCiAgICAgICAgbXkgJFNvdXJjZU9iamVjdCA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5PYmplY3RPdmVydmlld0dldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICBLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICApOwogICAgICAgICMgZ2V0IHNvdXJjZSBjbGFzcyBuYW1lCiAgICAgICAgbXkgJFNvdXJjZUNsYXNzTmFtZSA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5DbGFzc05hbWVHZXQoCiAgICAgICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgS2V5ID0+ICRTb3VyY2VLZXksCiAgICAgICAgKTsKICAgICAgICAjIG91dHB1dCBzb3VyY2Ugb2JqZWN0IGJsb2NrCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU291cmNlT2JqZWN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc05hbWUgPT4gJFNvdXJjZUNsYXNzTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IHNvdXJjZSBvYmplY3Qgcm93IGJsb2NrCiAgICAgICAgZm9yZWFjaCBteSAkUm93RGF0YSAoQHskU291cmNlT2JqZWN0fSkgewogICAgICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgICAgICBpZiAoJFJvd0RhdGEtPntUcmFuc2xhdGlvbn0pIHsKICAgICAgICAgICAgICAgICRSb3dEYXRhLT57Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkUm93RGF0YS0+e0NvbnRlbnR9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU291cmNlT2JqZWN0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JFJvd0RhdGF9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBnZXQgcGFydG5lciBzZWFyY2ggZm9ybSBkYXRhCiAgICAgICAgbXkgJEZvcm1EYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MlBhcnRuZXJTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICBPYmplY3QgPT4gJFBhcnRuZXJPYmplY3QsCiAgICAgICAgKTsKICAgICAgICAjIHN0YXJ0IHBhcnRuZXIgc2VhcmNoCiAgICAgICAgbXkgJFBhcnRuZXJJRHMgPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lck9iamVjdFNlYXJjaCgKICAgICAgICAgICAgQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgT2JqZWN0ID0+ICRQYXJ0bmVyT2JqZWN0LAogICAgICAgICAgICBGb3JtRGF0YSA9PiAkRm9ybURhdGEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAjIGRlbGV0ZSBuZWVkbGVzcyBpZHMKICAgICAgICAkUGFydG5lcklEcyA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyTGlua0RhdGFOZWVkbGVzc0RlbGV0ZSgKICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICBTb3VyY2VLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgUGFydG5lckNsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgIFBhcnRuZXJJRHMgPT4gJFBhcnRuZXJJRHMsCiAgICAgICAgICAgIFBhcnRuZXJMaW5rVHlwZSA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICk7CiAgICAgICAgaWYgKEB7JFBhcnRuZXJJRHN9KSB7CiAgICAgICAgICAgICMgZ2V0IHBhcnRuZXIgZGF0YQogICAgICAgICAgICBteSAkUGFydG5lckluZm8gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lckFkZERhdGFMaXN0KAogICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgU291cmNlS2V5ID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBQYXJ0bmVyQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIFBhcnRuZXJJRHMgPT4gJFBhcnRuZXJJRHMsCiAgICAgICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJFBhcnRuZXJMaW5rVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBnZXQgcGFydG5lciB0YWJsZSBjb2x1bW5zCiAgICAgICAgICAgIG15ICRQYXJ0bmVyVGFibGVDb2x1bW4gPSAkU2VsZi0+e0xpbmtPYmplY3QyfS0+UGFydG5lclRhYmxlQ29sdW1uR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJFBhcnRuZXJDbGFzcywKICAgICAgICAgICAgICAgIEFkZENvbHVtbiA9PiAxLAogICAgICAgICAgICAgICAgTGlua1R5cGVDb2x1bW4gPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBjb3VudCBjb2x1bW5zCiAgICAgICAgICAgIG15ICRDb2x1bW5Db3VudCA9IEB7JFBhcnRuZXJUYWJsZUNvbHVtbn07CiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIFBhcnRuZXJPYmplY3QgPT4gJFBhcnRuZXJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgUGFydG5lckxpbmtUeXBlID0+ICRQYXJ0bmVyTGlua1R5cGUsCiAgICAgICAgICAgICAgICAgICAgQmxvY2tuYW1lMSA9PiAkUGFydG5lckluZm8tPlswXS0+e0Jsb2NrbmFtZTF9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEJsb2NrbmFtZTIgPT4gJFBhcnRuZXJJbmZvLT5bMF0tPntCbG9ja25hbWUyfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBDb2xzcGFuID0+ICRDb2x1bW5Db3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgb3V0cHV0IGNvbHVtbiB3aWR0aCBibG9jawogICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW4gKEB7JFBhcnRuZXJUYWJsZUNvbHVtbn0pIHsKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgaGVhZGVyIGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rQ29sdW1uV2lkdGgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBXaWR0aCA9PiAkQ29sdW1uLT57SFRNTE91dHB1dH0tPntUYWJsZVdpZHRofSB8fCAnKicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUgY29sdW1uIGJsb2NrCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbHVtbiAoQHskUGFydG5lclRhYmxlQ29sdW1ufSkgewogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBoZWFkZXIgY29sdW1uIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtIZWFkZXJDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRDb2x1bW4tPntIZWFkbGluZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJENzc0NsYXNzOwogICAgICAgICAgICBmb3JlYWNoIG15ICRMaW5rRGF0YSAoQHskUGFydG5lckluZm99KSB7CiAgICAgICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgICAgIGlmICgkQ3NzQ2xhc3MgJiYgJENzc0NsYXNzIGVxICdzZWFyY2hwYXNzaXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc0NsYXNzID0gJ3NlYXJjaHBhc3NpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayBibG9jawogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rUm93JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRDb2x1bW5EYXRhIChAeyRQYXJ0bmVyVGFibGVDb2x1bW59KSB7CiAgICAgICAgICAgICAgICAgICAgIyBsb29rdXAgY29udGVudAogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50U3RyaW5nID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkRhdGEgPT4gJENvbHVtbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtEYXRhID0+ICRMaW5rRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgcm93IGNvbHVtbiBibG9jawogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtSb3dDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBvdXRwdXQgbm8gcmVzdWx0IGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb1Jlc3VsdCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgY291bnQgcGFydG5lcnMKICAgICAgICBteSAkVG90YWxIaXRzID0gQHskUGFydG5lcklEc307CiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDJBZGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRvdGFsSGl0cyA9PiAkVG90YWxIaXRzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgIyBvdXRwdXQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOw== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50TGlua09iamVjdDJTZWFyY2gucG0gLSB0aGUgbGluayBvYmplY3QgMiBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRMaW5rT2JqZWN0MlNlYXJjaC5wbSx2IDEuNiAyMDA3LzA4LzAyIDEyOjUwOjU1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50TGlua09iamVjdDJTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntMaW5rT2JqZWN0Mn0gPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDItPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkT3V0cHV0OwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFNvdXJjZUNsYXNzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTb3VyY2VDbGFzcyIpOwogICAgbXkgJFNvdXJjZUtleSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU291cmNlS2V5Iik7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkU291cmNlQ2xhc3MgfHwgISRTb3VyY2VLZXkpIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gU291cmNlQ2xhc3MgYW5kIFNvdXJjZUtleSBpcyBnaXZlbiEiLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQogICAgIyBvdXRwdXQgaGVhZGVyCiAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1NlYXJjaCcpOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICMgZ2V0IHNvdXJjZSBvdmVydmlldyBkYXRhCiAgICBteSAkU291cmNlT2JqZWN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPk9iamVjdE92ZXJ2aWV3R2V0KAogICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBLZXkgPT4gJFNvdXJjZUtleSwKICAgICk7CiAgICAjIGdldCBjbGFzcyBuYW1lCiAgICBteSAkU291cmNlQ2xhc3NOYW1lID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPkNsYXNzTmFtZUdldCgKICAgICAgICBDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgS2V5ID0+ICRTb3VyY2VLZXksCiAgICApOwogICAgIyBvdXRwdXQgc291cmNlIG9iamVjdCBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTb3VyY2VPYmplY3QnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDbGFzc05hbWUgPT4gJFNvdXJjZUNsYXNzTmFtZSwKICAgICAgICB9LAogICAgKTsKICAgICMgb3V0cHV0IHNvdXJjZSBvYmplY3Qgcm93IGJsb2NrCiAgICBmb3JlYWNoIG15ICRSb3dEYXRhIChAeyRTb3VyY2VPYmplY3R9KSB7CiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoJFJvd0RhdGEtPntUcmFuc2xhdGlvbn0pIHsKICAgICAgICAgICAgJFJvd0RhdGEtPntDb250ZW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRSb3dEYXRhLT57Q29udGVudH0pOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb3VyY2VPYmplY3RSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFJvd0RhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICAjIGdldCBwYXJ0bmVyIG9iamVjdAogICAgbXkgJFBhcnRuZXJPYmplY3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlBhcnRuZXJPYmplY3QiKSB8fCAnJzsKICAgIGlmICgkUGFydG5lck9iamVjdCBlcSAnLScpIHsKICAgICAgICAkUGFydG5lck9iamVjdCA9ICcnOwogICAgfQogICAgIyBnZW5lcmF0ZSBwYXJ0bmVyIGNsYXNzCiAgICBteSAkUGFydG5lckNsYXNzID0gJFBhcnRuZXJPYmplY3Q7CiAgICBpZiAoJFBhcnRuZXJDbGFzcyA9fiAvXiguKz8pOjouKiQvKSB7CiAgICAgICAgJFBhcnRuZXJDbGFzcyA9ICQxOwogICAgfQogICAgIyBnZXQgcGFydG5lciBsaW5rIHR5cGUKICAgIG15ICRQYXJ0bmVyTGlua1R5cGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlBhcnRuZXJMaW5rVHlwZSIpIHx8ICcnOwogICAgaWYgKCRQYXJ0bmVyTGlua1R5cGUgZXEgJy0nKSB7CiAgICAgICAgJFBhcnRuZXJMaW5rVHlwZSA9ICcnOwogICAgfQogICAgIyBnZXQgcGFydG5lciBvYmplY3QgbGlzdAogICAgbXkgJFBhcnRuZXJPYmplY3RMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlBhcnRuZXJPYmplY3RMaXN0KAogICAgICAgIENsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICBTZWxlY3RlZEtleSA9PiAkUGFydG5lck9iamVjdCwKICAgICk7CiAgICAjIGdlbmVyYXRlIFBhcnRuZXJPYmplY3RTdHJnCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJykgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CiAgICBteSAkUGFydG5lck9iamVjdFN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgPT4gJFBhcnRuZXJPYmplY3RMaXN0LAogICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3QnLAogICAgICAgIFRyZWVWaWV3ID0+ICRUcmVlVmlldywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBPbkNoYW5nZSA9PiAnZG9jdW1lbnQudGFyZ2V0b2JqZWN0LnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7JywKICAgICk7CiAgICAjIGdldCBwYXJ0bmVyIGxpbmsgdHlwZSBsaXN0CiAgICBteSAkUGFydG5lckxpbmtUeXBlTGlzdCA9IFtdOwogICAgaWYgKCRQYXJ0bmVyQ2xhc3MpIHsKICAgICAgICAkUGFydG5lckxpbmtUeXBlTGlzdCA9ICRTZWxmLT57TGlua09iamVjdDJ9LT5QYXJ0bmVyTGlua1R5cGVMaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkU291cmNlQ2xhc3MsCiAgICAgICAgICAgIFBhcnRuZXJDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICBTZWxlY3RlZEtleSA9PiAkUGFydG5lckxpbmtUeXBlLAogICAgICAgICk7CiAgICB9CiAgICAjIGdlbmVyYXRlIFBhcnRuZXJMaW5rVHlwZVN0cmcKICAgIG15ICRQYXJ0bmVyTGlua1R5cGVTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+ICRQYXJ0bmVyTGlua1R5cGVMaXN0LAogICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJMaW5rVHlwZScsCiAgICAgICAgU29ydCA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIE9uQ2hhbmdlID0+ICdkb2N1bWVudC50YXJnZXRvYmplY3Quc3VibWl0KCk7IHJldHVybiBmYWxzZTsnLAogICAgKTsKICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlbGVjdCBibG9jawogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQYXJ0bmVyT2JqZWN0U2VsZWN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFNvdXJjZUNsYXNzLAogICAgICAgICAgICBTb3VyY2VLZXkgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgUGFydG5lck9iamVjdFN0cmcgPT4gJFBhcnRuZXJPYmplY3RTdHJnLAogICAgICAgICAgICBQYXJ0bmVyTGlua1R5cGVTdHJnID0+ICRQYXJ0bmVyTGlua1R5cGVTdHJnLAogICAgICAgIH0sCiAgICApOwogICAgaWYgKCRQYXJ0bmVyQ2xhc3MgJiYgJFBhcnRuZXJMaW5rVHlwZSkgewogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGUgbGlzdAogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0Mn0tPlNlYXJjaEF0dHJpYnV0ZUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgIE9iamVjdCA9PiAkUGFydG5lck9iamVjdCwKICAgICAgICApOwogICAgICAgICMgb3V0cHV0IHBhcnRuZXIgb2JqZWN0IHNlYXJjaCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2gnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgUGFydG5lckNsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgICAgICAgICBQYXJ0bmVyT2JqZWN0ID0+ICRQYXJ0bmVyT2JqZWN0LAogICAgICAgICAgICAgICAgUGFydG5lckxpbmtUeXBlID0+ICRQYXJ0bmVyTGlua1R5cGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAjIHN0YXJ0IHNlYXJjaCBhdHRyaWJ1dGUgb3V0cHV0CiAgICAgICAgZm9yZWFjaCBteSAkUm93IChAeyRTZWFyY2hBdHRyaWJ1dGVMaXN0fSkgewogICAgICAgICAgICAjIG91dHB1dCBwYXJ0bmVyIG9iamVjdCBzZWFyY2ggdGFibGUgYmxvY2sKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2hUYWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkUm93LT57VHlwZX0gJiYgJFJvdy0+e1R5cGV9IGVxICdTZXBhcmF0b3InKSB7CiAgICAgICAgICAgICAgICAjIG91dHB1dCBwYXJ0bmVyIG9iamVjdCBzZWFyY2ggdGFibGUgc2VwYXJhdG9yIGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVNlcGFyYXRvcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBjcmVhdGUgc2VhcmNoIGlucHV0IGVsZW1lbnQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdDJTZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkUGFydG5lckNsYXNzLAogICAgICAgICAgICAgICAgICAgIEl0ZW0gPT4gJFJvdywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAjIG91dHB1dCBwYXJ0bmVyIG9iamVjdCBzZWFyY2ggdGFibGUgcm93IGJsb2NrCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmluZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50TGlua09iamVjdDJTZWFyY2gnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFNvdXJjZUNsYXNzID0+ICRTb3VyY2VDbGFzcywKICAgICAgICAgICAgU291cmNlS2V5ID0+ICRTb3VyY2VLZXksCiAgICAgICAgfSwKICAgICk7CiAgICAjIG91dHB1dCBmb290ZXIKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOw== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRMaW5rT2JqZWN0Mi5wbSAtIHByb3ZpZGVzIGdlbmVyaWMgSFRNTCBvdXRwdXQgZm9yIExpbmtPYmplY3QyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExheW91dExpbmtPYmplY3QyLnBtLHYgMS44IDIwMDcvMDgvMDIgMTA6MzY6NDQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRMaW5rT2JqZWN0MjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuOCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWl0ZW0gTGlua09iamVjdDJDb250ZW50U3RyaW5nQ3JlYXRlKCkKCnJldHVybnMgYSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3QyQ29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBDb2x1bW5EYXRhID0+ICRIYXNoUmVmLAogICAgICAgIExpbmtEYXRhID0+ICRIYXNoUmVmLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rT2JqZWN0MkNvbnRlbnRTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJENvbnRlbnRTdHJpbmcgPSAnJzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDbGFzcyBDb2x1bW5EYXRhIExpbmtEYXRhKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGlua09iamVjdDJMYXlvdXRCYWNrZW5kKAogICAgICAgIENsYXNzID0+ICRQYXJhbXtDbGFzc30sCiAgICApOwogICAgIyBnZW5lcmF0ZSBjb250ZW50IHN0cmluZwogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgJENvbnRlbnRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+Q29udGVudFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgQ29sdW1uRGF0YSA9PiAkUGFyYW17Q29sdW1uRGF0YX0sCiAgICAgICAgICAgIExpbmtEYXRhID0+ICRQYXJhbXtMaW5rRGF0YX0sCiAgICAgICAgKSB8fCAnJzsKICAgIH0KICAgICMgcmV0dXJuCiAgICByZXR1cm4gJENvbnRlbnRTdHJpbmc7Cn0KCj1pdGVtIExpbmtPYmplY3QyU2VhcmNoSW5wdXRDcmVhdGUoKQoKcmV0dXJucyBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+TGlua09iamVjdDJTZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBJdGVtID0+ICRSZWYsCiAgICApOwoKPWN1dAoKc3ViIExpbmtPYmplY3QyU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFN0cmluZyA9ICcnOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENsYXNzIEl0ZW0pKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CiAgICAjIGdlbmVyYXRlIGlucHV0IHN0cmluZwogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgJFN0cmluZyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgSXRlbSA9PiAkUGFyYW17SXRlbX0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKSB8fCAnJzsKICAgIH0KICAgICMgcmV0dXJuCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gTGlua09iamVjdDJQYXJ0bmVyU2VhcmNoRm9ybUdldCgpCgpyZXR1cm4gdGhlIHNlYXJjaCBkYXRhIGZyb20gZm9ybQoKICAgIG15ICRGb3JtRGF0YSA9ICRMYXlvdXRPYmplY3QtPkxpbmtPYmplY3QyUGFydG5lclNlYXJjaEZvcm1HZXQoCiAgICAgICAgQ2xhc3MgPT4gJ1RpY2tldCcsCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rT2JqZWN0MlBhcnRuZXJTZWFyY2hGb3JtR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRGb3JtRGF0YTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhDbGFzcyBPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CiAgICAjIGdlbmVyYXRlIGlucHV0IHN0cmluZwogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPlBhcnRuZXJTZWFyY2hGb3JtR2V0KAogICAgICAgICAgICBPYmplY3QgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgKTsKICAgIH0KICAgICMgcmV0dXJuCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aXRlbSBfTG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgbGlua29iamVjdDIgbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgogICAgJEJhY2tlbmRPYmplY3QgPSAkTGF5b3V0T2JqZWN0LT5fTG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZCgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJEJhY2tlbmRPYmplY3Q7CiAgICBpZiAoISRQYXJhbXtDbGFzc30pIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIENsYXNzISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGNhY2hlZAogICAgaWYgKCRTZWxmLT57J0NhY2hlOjpfTG9hZExpbmtPYmplY3QyTGF5b3V0QmFja2VuZDo6Jy4kUGFyYW17Q2xhc3N9fSkgewogICAgICAgIHJldHVybiAkU2VsZi0+eydDYWNoZTo6X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQ6OicuJFBhcmFte0NsYXNzfX07CiAgICB9CiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMaW5rT2JqZWN0MkxheW91dCRQYXJhbXtDbGFzc30iOwogICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKSB7CiAgICAgICAgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgKTsKICAgIH0KICAgICMgY2FjaGUgb2JqZWN0CiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAkU2VsZi0+eydDYWNoZTo6X0xvYWRMaW5rT2JqZWN0MkxheW91dEJhY2tlbmQ6OicuJFBhcmFte0NsYXNzfX0gPSAkQmFja2VuZE9iamVjdDsKICAgIH0KICAgICMgcmV0dXJuIG9iamVjdAogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOw== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MaW5rT2JqZWN0Mk1lbnVHZW5lcmljLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IExpbmtPYmplY3QyTWVudUdlbmVyaWMucG0sdiAxLjIgMjAwNy8wNy8wMiAxMjo0MDo0NCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxpbmtPYmplY3QyTWVudUdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgTGlua09iamVjdDIgVXNlcklEKSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCEkUGFyYW17U291cmNlQ2xhc3N9IHx8ICEkUGFyYW17U291cmNlS2V5fSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgU291cmNlQ2xhc3MgYW5kIFNvdXJjZUtleSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51JywKICAgICAgICBEYXRhID0+IHt9LAogICAgKTsKICAgIGlmICgkUGFyYW17Q291bnRlcn0pIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZW51SXRlbVNwbGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZW51SXRlbScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgU291cmNlQ2xhc3MgPT4gJFBhcmFte1NvdXJjZUNsYXNzfSwKICAgICAgICAgICAgU291cmNlS2V5ID0+ICRQYXJhbXtTb3VyY2VLZXl9LAogICAgICAgICAgICAleyRQYXJhbXtDb25maWd9fSwKICAgICAgICB9LAogICAgKTsKICAgICRQYXJhbXtDb3VudGVyfSsrOwoKICAgIHJldHVybiAkUGFyYW17Q291bnRlcn07Cn0KCjE7 IyAtLQojIEFnZW50TGlua09iamVjdDIuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDIuZHRsLHYgMS44IDIwMDcvMDYvMTEgMTI6MjY6MzkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7Ik92ZXJ2aWV3In0gJFRleHR7IkxpbmsifSAkRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIHdpZHRoPSI3NSUiIGNsYXNzPSJtZW51Ij4KPCEtLSBkdGw6YmxvY2s6TWVudSAtLT4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW1TcGxpdCAtLT4KICAgICAgLQo8IS0tIGR0bDpibG9jazpNZW51SXRlbVNwbGl0IC0tPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSREYXRheyJMaW5rIn0iICREYXRheyJMaW5rUGFyYW0ifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsiJFFEYXRheyJOYW1lIn0ifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIGNsYXNzPSJtZW51aXRlbSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In08L2E+CjwhLS0gZHRsOmJsb2NrOk1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpNZW51IC0tPgogICAgPC90ZD4KICAgIDx0ZCBhbGlnbj0icmlnaHQiIHdpZHRoPSIyNSUiIGNsYXNzPSJtZW51Ij48L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdCAtLT4KICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiU291cmNlIE9iamVjdCJ9ICgkUURhdGF7IkNsYXNzTmFtZSJ9KTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEyNSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7Ik5hbWUifSJ9OiA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiQ29udGVudCJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTb3VyY2VPYmplY3RSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdCAtLT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJMaW5rRGVsZXRlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VDbGFzcyIgdmFsdWU9IiRRRGF0YXsiU291cmNlQ2xhc3MifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlS2V5IiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VLZXkifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDxjb2xncm91cD4KPCEtLSBkdGw6YmxvY2s6TGlua0NvbHVtbldpZHRoIC0tPgogICAgICAgICAgPGNvbCB3aWR0aD0iJFFEYXRheyJXaWR0aCJ9Ij4KPCEtLSBkdGw6YmxvY2s6TGlua0NvbHVtbldpZHRoIC0tPgogICAgICAgICAgPC9jb2xncm91cD4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9Ij4KICAgICAgICAgICAgICA8Yj48aT4kVGV4dHsiJFFEYXRheyJCbG9ja25hbWUxIn0ifSAkUURhdGF7IkJsb2NrbmFtZTIifTwvaT48L2I+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpMaW5rSGVhZGVyQ29sdW1uIC0tPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiJFFEYXRheyJDb250ZW50In0ifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtIZWFkZXJDb2x1bW4gLS0+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3dDb2x1bW4gLS0+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiQ29udGVudCJ9PC90ZD4KPCEtLSBkdGw6YmxvY2s6TGlua1Jvd0NvbHVtbiAtLT4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3cgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGNvbHNwYW49IiRRRGF0YXsiQ29sc3BhbiJ9IiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkxpbmsgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K IyAtLQojIEFnZW50TGlua09iamVjdDJBZGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyQWRkCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJBZGQuZHRsLHYgMS45IDIwMDcvMDYvMTEgMTI6MjY6MzkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkFkZCJ9ICRUZXh0eyJMaW5rIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCkiPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJUb3RhbCBoaXRzIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTb3VyY2UgT2JqZWN0In0gKCRRRGF0YXsiQ2xhc3NOYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDb250ZW50In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkxpbmtBZGQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUNsYXNzIiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VLZXkiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUtleSJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJDbGFzcyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQYXJ0bmVyT2JqZWN0IiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyT2JqZWN0In0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJMaW5rVHlwZSIgdmFsdWU9IiRRRGF0YXsiUGFydG5lckxpbmtUeXBlIn0iPgogICAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8Y29sZ3JvdXA+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDxjb2wgd2lkdGg9IiRRRGF0YXsiV2lkdGgifSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtDb2x1bW5XaWR0aCAtLT4KICAgICAgICAgIDwvY29sZ3JvdXA+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSI+CiAgICAgICAgICAgICAgPGI+PGk+JFRleHR7IiRRRGF0YXsiQmxvY2tuYW1lMSJ9In0gJFFEYXRheyJCbG9ja25hbWUyIn08L2k+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TGlua0hlYWRlckNvbHVtbiAtLT4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IiRRRGF0YXsiQ29udGVudCJ9In08L3RkPgo8IS0tIGR0bDpibG9jazpMaW5rSGVhZGVyQ29sdW1uIC0tPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGlua1JvdyAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgo8IS0tIGR0bDpibG9jazpMaW5rUm93Q29sdW1uIC0tPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JERhdGF7IkNvbnRlbnQifTwvdGQ+CjwhLS0gZHRsOmJsb2NrOkxpbmtSb3dDb2x1bW4gLS0+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rUm93IC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBjb2xzcGFuPSIkUURhdGF7IkNvbHNwYW4ifSIgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkxpbmsifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPjxmb250IGNvbG9yPSJyZWQiPiRUZXh0eyJObyBSZXN1bHRzIGZvdW5kIn0hPC9mb250PjwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Tm9SZXN1bHQgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4= IyAtLQojIEFnZW50TGlua09iamVjdDJTZWFyY2guZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZ2VudExpbmtPYmplY3QyU2VhcmNoCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50TGlua09iamVjdDJTZWFyY2guZHRsLHYgMS4zIDIwMDcvMDYvMTUgMTM6NTA6NDMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNlYXJjaCJ9ICRUZXh0eyJMaW5rIn0gJEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRMaW5rT2JqZWN0MiZTb3VyY2VDbGFzcz0kTFFEYXRheyJTb3VyY2VDbGFzcyJ9JlNvdXJjZUtleT0kTFFEYXRheyJTb3VyY2VLZXkifSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgogICAgICA8dGFibGUgd2lkdGg9IjgwMCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJTb3VyY2UgT2JqZWN0In0gKCRRRGF0YXsiQ2xhc3NOYW1lIn0pPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTI1IiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiTmFtZSJ9In06IDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJDb250ZW50In08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNvdXJjZU9iamVjdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U291cmNlT2JqZWN0IC0tPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VsZWN0IC0tPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBuYW1lPSJ0YXJnZXRvYmplY3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTb3VyY2VDbGFzcyIgdmFsdWU9IiRRRGF0YXsiU291cmNlQ2xhc3MifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlS2V5IiB2YWx1ZT0iJFFEYXRheyJTb3VyY2VLZXkifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEyNSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUYXJnZXQgT2JqZWN0In06IDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFydG5lck9iamVjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEyNSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ikxpbmt0eXBlIn06IDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+KCRUZXh0eyJUYXJnZXQgT2JqZWN0cyBhcmUuLi4ifSkgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiUGFydG5lckxpbmtUeXBlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlbGVjdCAtLT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaCAtLT4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRMaW5rT2JqZWN0MkFkZCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU291cmNlQ2xhc3MiIHZhbHVlPSIkUURhdGF7IlNvdXJjZUNsYXNzIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNvdXJjZUtleSIgdmFsdWU9IiRRRGF0YXsiU291cmNlS2V5In0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJDbGFzcyIgdmFsdWU9IiRRRGF0YXsiUGFydG5lckNsYXNzIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlBhcnRuZXJPYmplY3QiIHZhbHVlPSIkUURhdGF7IlBhcnRuZXJPYmplY3QifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUGFydG5lckxpbmtUeXBlIiB2YWx1ZT0iJFFEYXRheyJQYXJ0bmVyTGlua1R5cGUifSI+CiAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDAiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IlNlYXJjaCJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGUgLS0+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVNlcGFyYXRvciAtLT4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCIgY29sc3Bhbj0iMiI+Jm5ic3A7PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpQYXJ0bmVyT2JqZWN0U2VhcmNoVGFibGVTZXBhcmF0b3IgLS0+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVJvdyAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJOYW1lIn0ifTogPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJJbnB1dFN0cmluZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2hUYWJsZVJvdyAtLT4KPCEtLSBkdGw6YmxvY2s6UGFydG5lck9iamVjdFNlYXJjaFRhYmxlIC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOlBhcnRuZXJPYmplY3RTZWFyY2ggLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdDIucG0gLSB0byBsaW5rIG9iamVjdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGlua09iamVjdDIucG0sdiAxLjE2LjIuMiAyMDA3LzA4LzIzIDE2OjQ0OjA3IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjE2LjIuMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0MiAtIHRvIGxpbmsgb2JqZWN0cyBsaWtlIHRpY2tldHMsIGZhcXMsIC4uLgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zIHRvIGxpbmsgb2JqZWN0cyBsaWtlIHRpY2tldHMsIGZhcXMsIC4uLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRMaW5rT2JqZWN0MiA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Mi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBMaW5rQWRkKCkKCmFkZCBhIG5ldyBsaW5rCgogICAgJFRydWUgPSAkTGlua09iamVjdDItPkxpbmtBZGQoCiAgICAgICAgVHlwZSA9PiAnTm9ybWFsJywKICAgICAgICBTb3VyY2VDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBTb3VyY2VLZXkgPT4gJzEyMycsCiAgICAgICAgVGFyZ2V0Q2xhc3MgPT4gJ0ZBUScsCiAgICAgICAgVGFyZ2V0S2V5ID0+ICcxMicsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0FkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdyhUeXBlIFNvdXJjZUNsYXNzIFNvdXJjZUtleSBUYXJnZXRDbGFzcyBUYXJnZXRLZXkgVXNlcklEKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCRQYXJhbXtTb3VyY2VDbGFzc30gZXEgJFBhcmFte1RhcmdldENsYXNzfSAmJiAkUGFyYW17U291cmNlS2V5fSBlcSAkUGFyYW17VGFyZ2V0S2V5fSkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkxvb3AgcHJvdGVjdGlvbi4gb2JqZWN0IDEgYW5kIG9iamVjdCAyIGFyZSBpZGVudGljYWwhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVHlwZSBTb3VyY2VDbGFzcyBTb3VyY2VLZXkgVGFyZ2V0Q2xhc3MgVGFyZ2V0S2V5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgbXkgJEV4aXN0czsKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIGxpbmtfb2JqZWN0MiBXSEVSRSAiLgogICAgICAgICAgICAibGlua190eXBlID0gJyRQYXJhbXtUeXBlfScgQU5EIHNvdXJjZV9jbGFzcyA9ICckUGFyYW17U291cmNlQ2xhc3N9JyBBTkQgc291cmNlX2tleSA9ICckUGFyYW17U291cmNlS2V5fScgQU5EICIuCiAgICAgICAgICAgICJ0YXJnZXRfY2xhc3MgPSAnJFBhcmFte1RhcmdldENsYXNzfScgQU5EIHRhcmdldF9rZXkgPSAnJFBhcmFte1RhcmdldEtleX0nIiwKICAgICk7CiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRFeGlzdHMgPSAxOwogICAgfQogICAgIyBhZGQgbmV3IGxpbmsKICAgIGlmICghJEV4aXN0cykgewogICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAkUmV0dXJuID0gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGxpbmtfb2JqZWN0MiAiLgogICAgICAgICAgICAgICAgIihsaW5rX3R5cGUsIHNvdXJjZV9jbGFzcywgc291cmNlX2tleSwgdGFyZ2V0X2NsYXNzLCB0YXJnZXRfa2V5LCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSBWQUxVRVMgIi4KICAgICAgICAgICAgICAgICIoJyRQYXJhbXtUeXBlfScsICckUGFyYW17U291cmNlQ2xhc3N9JywgJyRQYXJhbXtTb3VyY2VLZXl9JywgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte1RhcmdldENsYXNzfScsICckUGFyYW17VGFyZ2V0S2V5fScsICckQ3VycmVudFRpbWUnLCAkUGFyYW17VXNlcklEfSkiCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuOwp9Cgo9aXRlbSBMaW5rRGVsZXRlKCkKCmRlbGV0ZSBhbiBleGlzdGluZyBsaW5rCgogICAgJFRydWUgPSAkTGlua09iamVjdDItPkxpbmtEZWxldGUoCiAgICAgICAgTGlua0lEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0Mi0+TGlua0RlbGV0ZSgKICAgICAgICBMaW5rSUQgPT4gWzEsIDQsIDYsIDEyLCA5OV0sCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpbmtJRHM7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KExpbmtJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGlmIChyZWYoJFBhcmFte0xpbmtJRH0pIGVxICdBUlJBWScpIHsKICAgICAgICBmb3JlYWNoIG15ICRMaW5rSUQgKEB7JFBhcmFte0xpbmtJRH19KSB7CiAgICAgICAgICAgICRMaW5rSUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJExpbmtJRCwgJ0ludGVnZXInKTsKICAgICAgICAgICAgcHVzaChATGlua0lEcywgJExpbmtJRCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0xpbmtJRH0gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFte0xpbmtJRH0sICdJbnRlZ2VyJyk7CiAgICAgICAgcHVzaChATGlua0lEcywgJFBhcmFte0xpbmtJRH0pOwogICAgfQogICAgIyBkZWxldGUgaW4gZGF0YWJhc2UKICAgIG15ICRMaW5rSURTdHJpbmcgPSBqb2luKCcsICcsIEBMaW5rSURzKTsKICAgIG15ICRSZXR1cm4gPSAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBsaW5rX29iamVjdDIgV0hFUkUgaWQgSU4gKCRMaW5rSURTdHJpbmcpIiwKICAgICk7CiAgICByZXR1cm4gJFJldHVybjsKfQoKPWl0ZW0gT2JqZWN0T3ZlcnZpZXdHZXQoKQoKcmV0dXJuIGEgYXJyYXkgaGFzaCByZWZlcmVuY2Ugb2Ygb2JqZWN0IG92ZXJ2aWV3IGRhdGEKCiAgICAkQXJyYXlSZWYgPSAkTGlua09iamVjdDItPk9iamVjdE92ZXJ2aWV3R2V0KAogICAgICAgIENsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIEtleSA9PiAnMTIzJywKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0T3ZlcnZpZXdHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE9iamVjdERhdGEgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgZm9yZWFjaCAocXcoQ2xhc3MgS2V5KSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17Q2xhc3N9LAogICAgKTsKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAkT2JqZWN0RGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5PYmplY3RPdmVydmlld0dldCgKICAgICAgICAgICAgS2V5ID0+ICRQYXJhbXtLZXl9LAogICAgICAgICkgfHwgW107CiAgICB9CiAgICByZXR1cm4gJE9iamVjdERhdGE7Cn0KCj1pdGVtIENsYXNzTmFtZUdldCgpCgpyZXR1cm4gdGhlIG5hbWUgb2YgYSBjbGFzcwoKICAgICRDbGFzc05hbWUgPSAkTGlua09iamVjdDItPkNsYXNzTmFtZUdldCgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBLZXkgPT4gJzEyMycsCiAgICApOwoKPWN1dAoKc3ViIENsYXNzTmFtZUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkQ2xhc3NOYW1lID0gJyc7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KENsYXNzIEtleSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgJENsYXNzTmFtZSA9ICRCYWNrZW5kT2JqZWN0LT5DbGFzc05hbWVHZXQoCiAgICAgICAgICAgIEtleSA9PiAkUGFyYW17S2V5fSwKICAgICAgICApIHx8ICcnOwogICAgfQogICAgcmV0dXJuICRDbGFzc05hbWU7Cn0KCj1pdGVtIFBhcnRuZXJMaW5rRGF0YUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBwYXJ0bmVyIGxpbmsgZGF0YSBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgICRBcnJheVJlZiA9ICRMaW5rT2JqZWN0Mi0+UGFydG5lckxpbmtEYXRhTGlzdCgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBLZXkgPT4gJzEyMycsCiAgICApOwoKPWN1dAoKc3ViIFBhcnRuZXJMaW5rRGF0YUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQFBhcnRuZXJMaW5rRGF0YUxpc3RUbXA7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KENsYXNzIEtleSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCwgbGlua190eXBlLCB0YXJnZXRfY2xhc3MsIHRhcmdldF9rZXkgRlJPTSBsaW5rX29iamVjdDIgV0hFUkUgIi4KICAgICAgICAgICAgInNvdXJjZV9jbGFzcyA9ICckUGFyYW17Q2xhc3N9JyBBTkQgc291cmNlX2tleSA9ICckUGFyYW17S2V5fSciLAogICAgKTsKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgbXkgJUxpbms7CiAgICAgICAgJExpbmt7TGlua0lEfSA9ICRSb3dbMF07CiAgICAgICAgJExpbmt7VHlwZX0gPSAkUm93WzFdOwogICAgICAgICRMaW5re1BhcnRuZXJDbGFzc30gPSAkUm93WzJdOwogICAgICAgICRMaW5re1BhcnRuZXJLZXl9ID0gJFJvd1szXTsKICAgICAgICAkTGlua3tQYXJ0bmVyQ29tYmluYXRpb259ID0gJ05vcm1hbCc7CiAgICAgICAgJExpbmt7QmxvY2tuYW1lMX0gPSAkTGlua3tQYXJ0bmVyQ2xhc3N9OwogICAgICAgICRMaW5re0Jsb2NrbmFtZTJ9ID0gJyc7CiAgICAgICAgJExpbmt7TXlDbGFzc30gPSAkUGFyYW17Q2xhc3N9OwogICAgICAgICRMaW5re015S2V5fSA9ICRQYXJhbXtLZXl9OwogICAgICAgIHB1c2goQFBhcnRuZXJMaW5rRGF0YUxpc3RUbXAsIFwlTGluayk7CiAgICB9CiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQsIGxpbmtfdHlwZSwgc291cmNlX2NsYXNzLCBzb3VyY2Vfa2V5IEZST00gbGlua19vYmplY3QyIFdIRVJFICIuCiAgICAgICAgICAgICJ0YXJnZXRfY2xhc3MgPSAnJFBhcmFte0NsYXNzfScgQU5EIHRhcmdldF9rZXkgPSAnJFBhcmFte0tleX0nIiwKICAgICk7CiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVMaW5rOwogICAgICAgICRMaW5re0xpbmtJRH0gPSAkUm93WzBdOwogICAgICAgICRMaW5re1R5cGV9ID0gJFJvd1sxXTsKICAgICAgICAkTGlua3tQYXJ0bmVyQ2xhc3N9ID0gJFJvd1syXTsKICAgICAgICAkTGlua3tQYXJ0bmVyS2V5fSA9ICRSb3dbM107CiAgICAgICAgJExpbmt7UGFydG5lckNvbWJpbmF0aW9ufSA9ICdSZXZlcnNlJzsKICAgICAgICAkTGlua3tCbG9ja25hbWUxfSA9ICRMaW5re1BhcnRuZXJDbGFzc307CiAgICAgICAgJExpbmt7QmxvY2tuYW1lMn0gPSAnJzsKICAgICAgICAkTGlua3tNeUNsYXNzfSA9ICRQYXJhbXtDbGFzc307CiAgICAgICAgJExpbmt7TXlLZXl9ID0gJFBhcmFte0tleX07CiAgICAgICAgcHVzaChAUGFydG5lckxpbmtEYXRhTGlzdFRtcCwgXCVMaW5rKTsKICAgIH0KICAgIG15IEBQYXJ0bmVyTGlua0RhdGFEZWxldGU7CiAgICBteSBAUGFydG5lckxpbmtEYXRhTGlzdDsKICAgIGZvcmVhY2ggbXkgJEl0ZW0gKEBQYXJ0bmVyTGlua0RhdGFMaXN0VG1wKSB7CiAgICAgICAgIyBsb2FkIHBhcnRuZXIgYmFja2VuZAogICAgICAgIG15ICRQYXJ0bmVyQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgICAgIENsYXNzID0+ICRJdGVtLT57UGFydG5lckNsYXNzfSwKICAgICAgICApOwogICAgICAgICMgYWRkIGJsb2NrIG5hbWVzCiAgICAgICAgaWYgKCRQYXJ0bmVyQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICBteSAkUGFydG5lck9LID0gJFBhcnRuZXJCYWNrZW5kT2JqZWN0LT5QYXJ0bmVyTGlua0RhdGFBZGQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFBhcnRuZXJPSykgewogICAgICAgICAgICAgICAgcHVzaCAoQFBhcnRuZXJMaW5rRGF0YUxpc3QsICRJdGVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggKEBQYXJ0bmVyTGlua0RhdGFEZWxldGUsICRJdGVtLT57TGlua0lEfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIGRlbGV0ZSB1c2VsZXNzIGxpbmsgZGF0YQogICAgaWYgKEBQYXJ0bmVyTGlua0RhdGFEZWxldGUpIHsKICAgICAgICAkU2VsZi0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgTGlua0lEID0+IFxAUGFydG5lckxpbmtEYXRhRGVsZXRlLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXEBQYXJ0bmVyTGlua0RhdGFMaXN0Owp9Cgo9aXRlbSBQYXJ0bmVyTGlua0RhdGFOZWVkbGVzc0RlbGV0ZSgpCgpyZW1vdmUgbmVlZGxlc3MgcGFydG5lciBsaW5rIGlkcyBmcm9tIGdpdmVuIFBhcnRuZXJJRHMgYW5kIHJldHVybiBhbiBhcnJheSByZWZlcmVuY2UKCiAgICAkQXJyYXlSZWYgPSAkTGlua09iamVjdDItPlBhcnRuZXJMaW5rRGF0YU5lZWRsZXNzRGVsZXRlKAogICAgICAgIFNvdXJjZUNsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIFNvdXJjZUtleSA9PiAxLAogICAgICAgIFBhcnRuZXJDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBQYXJ0bmVySURzID0+IFsxLDIsMyw0XSwKICAgICAgICBQYXJ0bmVyTGlua1R5cGUgPT4gJ0FsdGVybmF0aXZlVG86Ok5vcm1hbCcsCiAgICApOwoKPWN1dAoKc3ViIFBhcnRuZXJMaW5rRGF0YU5lZWRsZXNzRGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgZm9yZWFjaCAocXcoU291cmNlQ2xhc3MgU291cmNlS2V5IFBhcnRuZXJDbGFzcyBQYXJ0bmVySURzIFBhcnRuZXJMaW5rVHlwZSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIG5ldyBhcnJheQogICAgbXkgQFBhcnRuZXJMaXN0OwogICAgZm9yZWFjaCBteSAkUGFydG5lcklEIChAeyRQYXJhbXtQYXJ0bmVySURzfX0pIHsKICAgICAgICAjIG5leHQgaWQsIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIGlkZW50aWNhbAogICAgICAgIGlmICgkUGFyYW17U291cmNlS2V5fSBlcSAkUGFydG5lcklEICYmICRQYXJhbXtTb3VyY2VDbGFzc30gZXEgJFBhcmFte1BhcnRuZXJDbGFzc30pIHsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiAgICAgICAgcHVzaChAUGFydG5lckxpc3QsICRQYXJ0bmVySUQpOwogICAgfQogICAgcmV0dXJuIFxAUGFydG5lckxpc3Q7Cn0KCj1pdGVtIFBhcnRuZXJBZGREYXRhTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHBhcnRuZXIgbGluayBkYXRhIGFzIGFycmF5IGhhc2ggcmVmZXJlbmNlCgogICAgJEFycmF5UmVmID0gJExpbmtPYmplY3QyLT5QYXJ0bmVyQWRkRGF0YUxpc3QoCiAgICAgICAgU291cmNlQ2xhc3MgPT4gJ1RpY2tldCcsCiAgICAgICAgU291cmNlS2V5ID0+IDEsCiAgICAgICAgUGFydG5lckNsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIFBhcnRuZXJJRHMgPT4gWzEsMiwzLDRdLAogICAgICAgIFBhcnRuZXJMaW5rVHlwZSA9PiAnQWx0ZXJuYXRpdmVUbzo6Tm9ybWFsJywKICAgICk7Cgo9Y3V0CgpzdWIgUGFydG5lckFkZERhdGFMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgZm9yZWFjaCAocXcoU291cmNlQ2xhc3MgU291cmNlS2V5IFBhcnRuZXJDbGFzcyBQYXJ0bmVySURzIFBhcnRuZXJMaW5rVHlwZSkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2V0IGxpbmt0eXBlIGFuZCBwYXJ0bmVyIGNvbWJpbmF0aW9uCiAgICBteSAkTGlua1R5cGU7CiAgICBteSAkUGFydG5lckNvbWJpbmF0aW9uID0gJ05vcm1hbCc7CiAgICBpZiAoJFBhcmFte1BhcnRuZXJMaW5rVHlwZX0gPX4gL14oLis/KTo6KC4qKSQvKSB7CiAgICAgICAgJExpbmtUeXBlID0gJDE7CiAgICAgICAgaWYgKCQyIGVxICdSZXZlcnNlJykgewogICAgICAgICAgICAkUGFydG5lckNvbWJpbmF0aW9uID0gJ1JldmVyc2UnOwogICAgICAgIH0KICAgIH0KICAgIG15IEBQYXJ0bmVyQWRkRGF0YUxpc3Q7CiAgICBmb3JlYWNoIG15ICRQYXJ0bmVySUQgKEB7JFBhcmFte1BhcnRuZXJJRHN9fSkgewogICAgICAgIG15ICVMaW5rOwogICAgICAgICRMaW5re015S2V5fSA9ICRQYXJhbXtTb3VyY2VLZXl9OwogICAgICAgICRMaW5re015Q2xhc3N9ID0gJFBhcmFte1NvdXJjZUNsYXNzfTsKICAgICAgICAkTGlua3tQYXJ0bmVyS2V5fSA9ICRQYXJ0bmVySUQ7CiAgICAgICAgJExpbmt7UGFydG5lckNsYXNzfSA9ICRQYXJhbXtQYXJ0bmVyQ2xhc3N9OwogICAgICAgICRMaW5re0Jsb2NrbmFtZTF9ID0gJExpbmt7UGFydG5lckNsYXNzfTsKICAgICAgICAkTGlua3tCbG9ja25hbWUyfSA9ICcnOwogICAgICAgICRMaW5re1R5cGV9ID0gJExpbmtUeXBlOwogICAgICAgICRMaW5re1BhcnRuZXJDb21iaW5hdGlvbn0gPSAkUGFydG5lckNvbWJpbmF0aW9uOwogICAgICAgIHB1c2goQFBhcnRuZXJBZGREYXRhTGlzdCwgXCVMaW5rKTsKICAgIH0KICAgIGZvcmVhY2ggbXkgJEl0ZW0gKEBQYXJ0bmVyQWRkRGF0YUxpc3QpIHsKICAgICAgICAjIGxvYWQgcGFydG5lciBiYWNrZW5kCiAgICAgICAgbXkgJFBhcnRuZXJCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW0tPntQYXJ0bmVyQ2xhc3N9LAogICAgICAgICk7CiAgICAgICAgIyBhZGQgYmxvY2sgbmFtZXMKICAgICAgICBpZiAoJFBhcnRuZXJCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgICAgICRQYXJ0bmVyQmFja2VuZE9iamVjdC0+UGFydG5lckxpbmtEYXRhQWRkKAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXEBQYXJ0bmVyQWRkRGF0YUxpc3Q7Cn0KCj1pdGVtIFBhcnRuZXJUYWJsZUNvbHVtbkdldCgpCgpyZXR1cm5zIGEgYXJyYXkgaGFzaCByZWZlcmVuY2Ugd2l0aCBjb2x1bW4gZGF0YQoKICAgICRBcnJheVJlZiA9ICRMYXlvdXRPYmplY3QtPlBhcnRuZXJUYWJsZUNvbHVtbkdldCgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICAgICBMaW5rVHlwZUNvbHVtbiA9PiAxLCAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIEFkZENvbHVtbiA9PiAxLCAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICAgICAgRGVsZXRlQ29sdW1uID0+IDEsICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDAgKDB8MSkKICAgICk7Cgo9Y3V0CgpzdWIgUGFydG5lclRhYmxlQ29sdW1uR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRDb2x1bW5EYXRhID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGZvcmVhY2ggKHF3KENsYXNzKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBDbGFzcyA9PiAkUGFyYW17Q2xhc3N9LAogICAgKTsKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAkQ29sdW1uRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5QYXJ0bmVyVGFibGVDb2x1bW5HZXQoKSB8fCBbXTsKICAgIH0KICAgIG15ICRDb2x1bW5UeXBlID0gW107CiAgICAjIGFkZCB0eXBlIGNvbHVtbgogICAgaWYgKCRQYXJhbXtMaW5rVHlwZUNvbHVtbn0pIHsKICAgICAgICAkQ29sdW1uVHlwZSA9IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdUeXBlJywKICAgICAgICAgICAgICAgIEhlYWRsaW5lID0+ICdMaW5rdHlwZScsCiAgICAgICAgICAgICAgICBUeXBlID0+ICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICBIVE1MT3V0cHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUYWJsZVdpZHRoID0+IDExMCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIHB1c2goQHskQ29sdW1uRGF0YX0sIEB7JENvbHVtblR5cGV9KTsKICAgIH0KICAgICMgYWRkIGxpbmthZGQgY29sdW1uCiAgICBpZiAoJFBhcmFte0FkZENvbHVtbn0pIHsKICAgICAgICBteSAkQ29sdW1uQWRkID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BhcnRuZXJLZXknLAogICAgICAgICAgICAgICAgSGVhZGxpbmUgPT4gJycsCiAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICBIVE1MT3V0cHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUYXJnZXRLZXknLAogICAgICAgICAgICAgICAgICAgIFRhYmxlV2lkdGggPT4gMjUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgdW5zaGlmdChAeyRDb2x1bW5EYXRhfSwgQHskQ29sdW1uQWRkfSk7CiAgICB9CiAgICAjIGFkZCBkZWxldGUgY29sdW1uCiAgICBpZiAoJFBhcmFte0RlbGV0ZUNvbHVtbn0pIHsKICAgICAgICBteSAkQ29sdW1uRGVsZXRlID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ0xpbmtJRCcsCiAgICAgICAgICAgICAgICBIZWFkbGluZSA9PiAnJywKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RlbGV0ZUlEJywKICAgICAgICAgICAgICAgICAgICBUYWJsZVdpZHRoID0+IDI1LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIHVuc2hpZnQoQHskQ29sdW1uRGF0YX0sIEB7JENvbHVtbkRlbGV0ZX0pOwogICAgfQogICAgIyByZXR1cm4gY29sdW1uIGRhdGEKICAgIHJldHVybiAkQ29sdW1uRGF0YTsKfQoKPWl0ZW0gUGFydG5lck9iamVjdExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiB0YXJnZXQgb2JqZWN0cyBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgICRBcnJheUhhc2hSZWYgPSAkTGlua09iamVjdDItPlBhcnRuZXJPYmplY3RMaXN0KAogICAgICAgIENsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIFNlbGVjdGVkS2V5ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFBhcnRuZXJPYmplY3RMaXN0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRQYXJ0bmVyT2JqZWN0TGlzdCA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdyhDbGFzcykpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgZ2V0IHBvc3NpYmxlIHBhcnRuZXIgaGFzaAogICAgbXkgJFBvc3NpYmxlUGFydG5lckhhc2ggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDI6OlBvc3NpYmxlUGFydG5lcicpOwogICAgbXkgJFBvc3NpYmxlUGFydG5lckxpc3QgPSAkUG9zc2libGVQYXJ0bmVySGFzaC0+eyRQYXJhbXtDbGFzc319OwoKICAgIGZvcmVhY2ggbXkgJFBhcnRuZXJDbGFzcyAoc29ydCBrZXlzICV7JFBvc3NpYmxlUGFydG5lckxpc3R9KSB7CiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJ0bmVyQ2xhc3MsCiAgICAgICAgKTsKICAgICAgICAjIGdldCBvYmplY3QgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICBteSAkUGFydG5lck9iamVjdExpc3RGcmFnbWVudCA9ICRCYWNrZW5kT2JqZWN0LT5QYXJ0bmVyT2JqZWN0TGlzdCgKICAgICAgICAgICAgICAgIFNlbGVjdGVkS2V5ID0+ICRQYXJhbXtTZWxlY3RlZEtleX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2goQHskUGFydG5lck9iamVjdExpc3R9LCBAeyRQYXJ0bmVyT2JqZWN0TGlzdEZyYWdtZW50fSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRQYXJ0bmVyT2JqZWN0TGlzdDsKfQoKPWl0ZW0gUGFydG5lckxpbmtUeXBlTGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHBhcnRuZXIgbGluayB0eXBlcyBhcyBhcnJheSByZWZlcmVuY2UKCiAgICAkQXJyYXlSZWYgPSAkTGlua09iamVjdDItPlBhcnRuZXJMaW5rVHlwZUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ1RpY2tldCcsCiAgICAgICAgUGFydG5lckNsYXNzID0+ICdGQVEnLAogICAgICAgIFNlbGVjdGVkS2V5ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFBhcnRuZXJMaW5rVHlwZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFBhcnRuZXJMaW5rVHlwZUxpc3QgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgZm9yZWFjaCAocXcoQ2xhc3MgUGFydG5lckNsYXNzKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBnZXQgcG9zc2libGUgcGFydG5lciBoYXNoCiAgICBteSAkUG9zc2libGVQYXJ0bmVySGFzaCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0Mjo6UG9zc2libGVQYXJ0bmVyJyk7CiAgICBteSAkUG9zc2libGVMaW5rVHlwZUxpc3QgPSAkUG9zc2libGVQYXJ0bmVySGFzaC0+eyRQYXJhbXtDbGFzc319LT57JFBhcmFte1BhcnRuZXJDbGFzc319IHx8IFtdOwoKICAgIGZvcmVhY2ggbXkgJExpbmtUeXBlIChzb3J0IEB7JFBvc3NpYmxlTGlua1R5cGVMaXN0fSkgewogICAgICAgIG15ICRMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDI6OlR5cGUnKTsKCiAgICAgICAgaWYgKCRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9ICYmCiAgICAgICAgICAgICRMaW5rVHlwZUxpc3QtPnskTGlua1R5cGV9LT57Tm9ybWFsTmFtZX0gJiYKICAgICAgICAgICAgJExpbmtUeXBlTGlzdC0+eyRMaW5rVHlwZX0tPntSZXZlcnNlTmFtZX0KICAgICAgICApIHsKICAgICAgICAgICAgbXkgJE5vcm1hbE5hbWUgPSAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e05vcm1hbE5hbWV9OwogICAgICAgICAgICBteSAkUmV2ZXJzZU5hbWUgPSAkTGlua1R5cGVMaXN0LT57JExpbmtUeXBlfS0+e1JldmVyc2VOYW1lfTsKICAgICAgICAgICAgIyBhZGQgbm9ybWFsIG5hbWEKICAgICAgICAgICAgbXkgJVJvdzsKICAgICAgICAgICAgJFJvd3tLZXl9ID0gJExpbmtUeXBlIC4gJzo6Tm9ybWFsJzsKICAgICAgICAgICAgJFJvd3tWYWx1ZX0gPSAkTm9ybWFsTmFtZTsKICAgICAgICAgICAgIyBhZGQgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCRQYXJhbXtTZWxlY3RlZEtleX0gJiYgJFBhcmFte1NlbGVjdGVkS2V5fSBlcSAkUm93e0tleX0pIHsKICAgICAgICAgICAgICAgICRSb3d7U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoKEB7JFBhcnRuZXJMaW5rVHlwZUxpc3R9LCBcJVJvdyk7CiAgICAgICAgICAgICMgYWRkIHJldmVyc2UgbmFtZQogICAgICAgICAgICBpZiAoJE5vcm1hbE5hbWUgbmUgJFJldmVyc2VOYW1lKSB7CiAgICAgICAgICAgICAgICBteSAlUm93MjsKICAgICAgICAgICAgICAgICRSb3cye0tleX0gPSAkTGlua1R5cGUgLiAnOjpSZXZlcnNlJzsKICAgICAgICAgICAgICAgICRSb3cye1ZhbHVlfSA9ICRSZXZlcnNlTmFtZTsKICAgICAgICAgICAgICAgICMgYWRkIHNlbGVjdGVkCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte1NlbGVjdGVkS2V5fSAmJiAkUGFyYW17U2VsZWN0ZWRLZXl9IGVxICRSb3cye0tleX0pIHsKICAgICAgICAgICAgICAgICAgICAkUm93MntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaChAeyRQYXJ0bmVyTGlua1R5cGVMaXN0fSwgXCVSb3cyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIGFkZCBibGFuayByb3cKICAgICAgICAgICAgbXkgJVJvdzM7CiAgICAgICAgICAgICRSb3cze0tleX0gPSAnLSc7CiAgICAgICAgICAgICRSb3cze1ZhbHVlfSA9ICcnOwogICAgICAgICAgICBwdXNoKEB7JFBhcnRuZXJMaW5rVHlwZUxpc3R9LCBcJVJvdzMpOwogICAgICAgIH0KICAgIH0KICAgICMgcmVtb3ZlIGxhc3QgKGJsYW5rKSByb3cKICAgIHBvcChAeyRQYXJ0bmVyTGlua1R5cGVMaXN0fSk7CgogICAgcmV0dXJuICRQYXJ0bmVyTGlua1R5cGVMaXN0Owp9Cgo9aXRlbSBQYXJ0bmVyT2JqZWN0U2VhcmNoKCkKCnJldHVybiBhIGxpc3Qgb2YgcGFydG5lciBpZHMgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgJEFycmF5UmVmID0gJExpbmtPYmplY3QyLT5QYXJ0bmVyT2JqZWN0U2VhcmNoKAogICAgICAgIENsYXNzID0+ICdUaWNrZXQnLAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBGb3JtRGF0YSA9PiAkRm9ybURhdGFSZWYsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFBhcnRuZXJPYmplY3RTZWFyY2ggewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFBhcnRuZXJJRHMgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgZm9yZWFjaCAocXcoQ2xhc3MgT2JqZWN0IEZvcm1EYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgQ2xhc3MgPT4gJFBhcmFte0NsYXNzfSwKICAgICk7CiAgICAjIHNlYXJjaCBwYXJ0bmVyIG9iamVjdHMKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICRQYXJ0bmVySURzID0gJEJhY2tlbmRPYmplY3QtPlBhcnRuZXJPYmplY3RTZWFyY2goCiAgICAgICAgICAgIE9iamVjdCA9PiAkUGFyYW17T2JqZWN0fSwKICAgICAgICAgICAgRm9ybURhdGEgPT4gJFBhcmFte0Zvcm1EYXRhfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJFBhcnRuZXJJRHM7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZUxpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiBzZWFyY2ggYXR0cmlidXRlcyBhcyBhcnJheSBoYXNoIHJlZmVyZW5jZQoKICAgICRBcnJheUhhc2hSZWYgPSAkTGlua09iamVjdDItPlNlYXJjaEF0dHJpYnV0ZUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ1RpY2tldCcsCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQ6OjExJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkU2VhcmNoQXR0cmlidXRlTGlzdCA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0CiAgICBmb3JlYWNoIChxdyhDbGFzcyBPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIENsYXNzID0+ICRQYXJhbXtDbGFzc30sCiAgICApOwogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEF0dHJpYnV0ZUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgICAgIE9iamVjdCA9PiAkUGFyYW17T2JqZWN0fSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRTZWFyY2hBdHRyaWJ1dGVMaXN0Owp9Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGxpbmsgb2JqZWN0IGJhY2tlbmQgbW9kdWxlCgogICAgJEhhc2hSZWYgPSAkTGlua09iamVjdDItPl9Mb2FkQmFja2VuZCgKICAgICAgICBDbGFzcyA9PiAnVGlja2V0JywKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRCYWNrZW5kIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRCYWNrZW5kT2JqZWN0OwogICAgaWYgKCEkUGFyYW17Q2xhc3N9KSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBDbGFzcyEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIGNoZWNrIGlmIG9iamVjdCBpcyBjYWNoZWQKICAgIGlmICgkU2VsZi0+eydDYWNoZTo6TGlua09iamVjdDI6Ol9Mb2FkQmFja2VuZDo6Jy4kUGFyYW17Q2xhc3N9fSkgewogICAgICAgIHJldHVybiAkU2VsZi0+eydDYWNoZTo6TGlua09iamVjdDI6Ol9Mb2FkQmFja2VuZDo6Jy4kUGFyYW17Q2xhc3N9fTsKICAgIH0KICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QyOjoiLiRQYXJhbXtDbGFzc307CiAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkpIHsKICAgICAgICAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgICMgY2FjaGUgb2JqZWN0CiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAkU2VsZi0+eydDYWNoZTo6TGlua09iamVjdDI6Ol9Mb2FkQmFja2VuZDo6Jy4kUGFyYW17Q2xhc3N9fSA9ICRCYWNrZW5kT2JqZWN0OwogICAgfQogICAgIyByZXR1cm4gb2JqZWN0CiAgICByZXR1cm4gJEJhY2tlbmRPYmplY3Q7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xNi4yLjIgJCAkRGF0ZTogMjAwNy8wOC8yMyAxNjo0NDowNyAkCgo9Y3V0