WebMail 0.11.1 OTRS GmbH http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Upgrade to 2.2.x. Added .fr translation. A web mail (IMAP) program. Ein Web Email (IMAP) Programm. 2.2.x The Calendar Application will be found at the navigation bar to handle internal events. Die Kalender Applikation ist in der Navigationsleiste zu finden. Mit ihr koennen interne Termine verwaltet werden. 2007-06-28 01:36:19 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRXZWJNYWlsIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBBZ2VudFdlYm1haWwgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFsbGUgUGFyYW1ldGVyIGb8ciBkYXMgQWdlbnRXZWJtYWlsLU9iamVrdCBpbm5lcmhhbGIgZGVzIEFnZW50LUludGVyZmFjZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPFRpdGxlPldlYk1haWw8L1RpdGxlPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPldlYk1haWwgbW9kdWxlIHJlZ2lzdHJhdGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5XZWJNYWlsPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QSB3ZWIgbWFpbCBjbGllbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPldlYk1haWw8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPndlYm1haWwucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+V2ViTWFpbDwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pnc8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JbmJveCBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+SW5ib3g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlID5saXN0LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50V2ViTWFpbDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5XZWJNYWlsPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5vPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Db21wb3NlIG5ldyBlbWFpbDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+Q29tcG9zZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bWFpbF9uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsJmFtcDtTdWJhY3Rpb249Q29tcG9zZTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5XZWJNYWlsPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5uPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5TZWFyY2ggYW4gZW1haWw8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlYXJjaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c2VhcmNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50V2ViTWFpbCZhbXA7U3ViYWN0aW9uPVNlYXJjaDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5XZWJNYWlsPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5zPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MzAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Gb2xkZXIgYWRkL3JlbmFtZS9kZWxldGU8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZvbGRlcjwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+Zm9sZGVyLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50V2ViTWFpbCZhbXA7U3ViYWN0aW9uPUZvbGRlcjwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5XZWJNYWlsPC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5mPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+OTAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UcmFzaDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RW1wdHkgVHJhc2g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmVkaXR0cmFzaC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFdlYk1haWwmYW1wO1N1YmFjdGlvbj1FeHB1bmdlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPldlYk1haWw8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmU8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQcmVmZXJlbmNlc0dyb3VwcyMjI1dlYk1haWwiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5BbGwgcGFyYW1ldGVycyBmb3IgdGhlIFdlYk1haWwgb2JqZWN0IGluIHRoZSBwcmVmZXJlbmNlIHZpZXcgb2YgdGhlIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QWxsZSBQYXJhbWV0ZXIgZGVzIFdlYk1haWwtT2JqZWt0cyBpbm5lcmhhbGIgZGVyIEFuc2ljaHQgZvxyIGRpZSBFaW5zdGVsbHVuZ2VuIGltIEFnZW50LUludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlc1dlYk1haWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHVtIj5PdGhlciBPcHRpb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+V2ViTWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+WW91ciBJTUFQIFdlYk1haWwgc2V0dGluZ3MuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj44MzAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldlYk1haWw6OklNQVBGb2xkZXJQcmVmaXgiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QcmVmaXggZm9yIElNQVAgZm9sZGVycy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+UHLkZml4IGb8ciBkaWUgSU1BUC1PcmRuZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPk1haWwvPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6SU1BUEhvc3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JTUFQIGhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPklNQVAtU2VydmVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPldlYk1haWw8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5sb2NhbGhvc3Q8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpJTUFQUHJvdG9jb2wiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZhdWx0IElNQVAgcHJvdG9jb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBJTUFQLVByb3Rva29sLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9ImltYXAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbWFwIj5pbWFwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbWFwcyI+aW1hcHM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldlYk1haWw6OlRyYXNoRm9sZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHJhc2ggZm9sZGVyIGluIHdlYm1haWwuIERlbGV0ZWQgbWVzc2FnZXMgd2lsbCBiZSBtb3ZlZCB0byB0aGlzIGZvbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+T3JkbmVyIGb8ciBnZWz2c2NodGUgTmFjaHJpY2h0ZW4gaW0gV2ViLU1haWxlci4gQWxsZSBnZWz2c2NodGVuIE5hY2hyaWNodGVuIHdlcmRlbiBpbiBkaWVzZW4gT3JkbmVyIHZlcnNjaG9iZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPlRyYXNoPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6U2VudEZvbGRlciIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgSU1BUCBmb2xkZXIgZm9yIHNlbnQgbWVzc2FnZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk9yZG5lciBm/HIgZ2VzZW5kZXRlIE5hY2hyaWNodGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPldlYk1haWw8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5TZW50PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6UGFnZVNob3duIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SG93IG1hbnkgbWVzc2FnZXMgd291bGQgeW91IGxpa2UgdG8gZGlzcGxheSBwZXIgcGFnZT88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+V2llIHZpZWxlIE5hY2hyaWNodGVuIHNvbGxlbiBwcm8gU2VpdGUgYW5nZXplaWd0IHdlcmRlbj88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MjU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpTaG93bkhlYWRlcnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBoZWFkZXJzIGZvciBldmVyeSBtYWlsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgZm9sZ2VuZGVuIEtvcGZ6ZWlsZW4gYmVpIGplZGVyIE5hY2hyaWNodCBhbnplaWdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkZyb208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5UbzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNjPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+U3ViamVjdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk9yZ2FuaXNhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlJlcGx5LVRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+WC1TcGFtLVN0YXR1czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlgtUHJpb3JpdHk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkltcG9ydGFuY2U8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6TWFpbEZvb3RlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNwZWNpZnkgYSBNYWlsZm9vdGVyLiBUaGlzIHRleHQgd2lsbCBiZSBhcHBlbmRlZCB0byBldmVyeSBvdXRnb2luZyBtZXNzYWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GZXN0bGVnZW4gZWluZXIgU2lnbmF0dXIuIERpZXNlciBUZXh0IHdpcmQgYXV0b21hdGlzY2ggdW50ZXIgamVkZSBhdXNnZWhlbmRlIE5hY2hyaWNodCBlaW5nZWb8Z3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8VGV4dEFyZWE+LS0KVGhpcyBtZXNzYWdlIHdhcyBzZW50IHVzaW5nIE9UUlMgMi4wIEFwcGxpY2F0aW9uIE1vZHVsZSBXZWJNYWlsIChodHRwOi8vb3Rycy5vcmcvKS4KICAgICAgICAgICAgPC9UZXh0QXJlYT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9BZ2VudFdlYk1haWwucG0gLSB0aGUgZnIgbGFuZ3VhZ2UgZm9yIEFnZW50Q2FsZW5kYXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZnJfQWdlbnRXZWJNYWlsLnBtLHYgMS4xIDIwMDcvMDYvMjcgMjM6MzA6NTEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmcl9BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0x1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VucmVhZCd9ID0gJ05vbi1MdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb2xkZXInfSA9ICdS6XBlcnRvaXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lc3NhZ2VzJ30gPSAnTWVzc2FnZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgVHJhc2gnfSA9ICdQb3ViZWxsZSB2aWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXBvc2UgbmV3IGVtYWlsISd9ID0gJ0NvbXBvc2VyIHVuIG5vdXZlYXUgbWVzc2FnZSAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luYm94IE92ZXJuZXcnfSA9ICdOb3V2ZWxsZSBib+50ZSDgIGxldHRyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGEgZW1haWwhJ30gPSAnUmVjaGVyY2hlciB1biBtZXNzYWdlICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdS6XBvbmRyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBseSBBbGwnfSA9ICdS6XBvbmRyZSDgIHRvdXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5ib3gnfSA9ICdJbmJveCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycnfSA9ICcnOwoKICAgICMgJCRTVE9QJCQKfQoxOwo= cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0dlbGVzZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5yZWFkJ30gPSAnVW5nZWxlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZvbGRlcid9ID0gJ09yZG5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ05hY2hyaWNodGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IFRyYXNoJ30gPSAnUGFwaWVya29yYiBsZWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnTmV1ZSBOYWNocmljaHQgdmVyZmFzc2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnSW5ib3gg3GJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhbiBlbWFpbCEnfSA9ICdFaW5lIEVtYWlsIHN1Y2hlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdBbnR3b3J0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHkgQWxsJ30gPSAnQW50d29ydGVuIGFuIGFsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5ib3gnfSA9ICdFaW5nYW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jyd9ID0gJyc7CgogICAgIyAkJFNUT1AkJAp9CjE7Cgo= cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0xlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbnJlYWQnfSA9ICdVbGVzdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb2xkZXInfSA9ICdNYXBwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ0Jlc2tqZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgVHJhc2gnfSA9ICdQYXBpcmt1cnYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnU2tyaXYgbnkgZS1wb3N0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnT3ZlcnNpa3Qgb3ZlciBJbm5ib2tzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhIGVtYWlsISd9ID0gJ1P4ayBpIGUtcG9zdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdTdmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGx5IEFsbCd9ID0gJ1N2YXIgYWxsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCd9ID0gJ0lubmJva3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJ30gPSAnJzsKCiAgICAjICQkU1RPUCQkCn0KMTsKCg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50V2ViTWFpbC5wbSAtIHByb3ZpZGVzIGEgbWFpbCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRXZWJNYWlsLnBtLHYgMS4xNCAyMDA3LzA2LzI3IDIzOjI5OjQyIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0Owp1c2UgTWFpbDo6SU1BUFRhbGs7CnVzZSBNYWlsOjpBZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZWFyY2hQcm9maWxlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VhcmNoUHJvZmlsZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCVQYXJhbSk7CgogICAgJFNlbGYtPntGb2xkZXJQcmVmaXh9ID0gJFNlbGYtPntVc2VyV2ViTWFpbElNQVBGb2xkZXJQcmVmaXh9IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpJTUFQRm9sZGVyUHJlZml4JykgfHwgJyc7CiAgICAkU2VsZi0+e1RyYXNoRm9sZGVyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpUcmFzaEZvbGRlcicpIHx8ICdUcmFzaCc7CiAgICAkU2VsZi0+e1NlbnRGb2xkZXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1dlYk1haWw6OlNlbnRGb2xkZXInKSB8fCAnU2VudCc7CiAgICAkU2VsZi0+e1BhZ2VTaG93bn0gPSAkU2VsZi0+e1VzZXJXZWJNYWlsUGFnZVNob3dufSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6UGFnZVNob3duJykgfHwgMjU7CgogICAgJFNlbGYtPntVc2VyRnJvbX0gPSAiXCIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICRTZWxmLT57TWFpbEZvb3Rlcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6TWFpbEZvb3RlcicpOwogICAgJFNlbGYtPntTaG93bkhlYWRlcnN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1dlYk1haWw6OlNob3duSGVhZGVycycpOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0ZvbGRlcicpKSB7CiAgICAgICAgJFBhcmFte0ZvbGRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0ZvbGRlcicpOwogICAgICAgICRQYXJhbXtGb2xkZXJ9ID1+IHMvXC9cLy9cLy9nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0ZvbGRlcn0gPSAnSU5CT1gnOwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfSkgewogICAgICAgICRTZWxmLT57VXNlcldlYk1haWxJTUFQUHJvdG9jb2x9ID0gJ2ltYXAnOwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUEhvc3R9KSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnTmVlZCBVc2VyV2ViTWFpbElNQVBIb3N0IFBhcmFtJyk7CiAgICB9CiAgICBpZiAoISRTZWxmLT57VXNlcldlYk1haWxJTUFQVXNlcn0pIHsKICAgICAgICAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFVzZXJ9ID0gJFNlbGYtPnsnX1VzZXJMb2dpbid9OwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkfSkgewogICAgICAgICRTZWxmLT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9ID0gJFNlbGYtPnsnX1VzZXJQdyd9OwogICAgfQogICAgbXkgJElNQVA7CiAgICBpZiAoJFNlbGYtPntVc2VyV2ViTWFpbElNQVBQcm90b2NvbH0gZXEgJ2ltYXBzJykgewogICAgICAgIGlmICghJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnSU86OlNvY2tldDo6U1NMJykpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBteSAkU1NMID0gSU86OlNvY2tldDo6U1NMLT5uZXcoIiRTZWxmLT57VXNlcldlYk1haWxJTUFQSG9zdH06aW1hcHMiKTsKICAgICAgICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFVzZXJuYW1lID0+ICRTZWxmLT57VXNlcldlYk1haWxJTUFQVXNlcn0sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRTZWxmLT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9LAojICAgICAgICAgICAgUm9vdEZvbGRlciA9PiAkU2VsZi0+e0ZvbGRlclByZWZpeH0sCiAgICAgICAgICAgIFNvY2tldCA9PiAkU1NMLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFNlcnZlciA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUEhvc3R9LAogICAgICAgICAgICBVc2VybmFtZSA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFVzZXJ9LAogICAgICAgICAgICBQYXNzd29yZCA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkfSwKIyAgICAgICAgICAgIFJvb3RGb2xkZXIgPT4gJFNlbGYtPntGb2xkZXJQcmVmaXh9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoISRJTUFQKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAiRmFpbGVkIHRvIGNvbm5lY3QvbG9naW4gdG8gSU1BUCBzZXJ2ZXIgJFNlbGYtPntVc2VyV2ViTWFpbElNQVBVc2VyfVxAJFNlbGYtPntVc2VyV2ViTWFpbElNQVBIb3N0fTokU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfTogJCEiKTsKICAgIH0KIyAgICAkSU1BUC0+c2V0X3RyYWNpbmcoMSk7CiAgICBteSBAYm94ZXMgPSAoKTsKICAgIG15IEBib3hlc0wgPSAkSU1BUC0+bGlzdCgiIiwgIiRTZWxmLT57Rm9sZGVyUHJlZml4fSUiKTsKICAgIGZvcmVhY2ggbXkgJEZvbGRlciAoQGJveGVzTCkgewogICAgICAgIGlmICgkRm9sZGVyICYmIHJlZigkRm9sZGVyKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgIG15IEBBID0gQHskRm9sZGVyfTsKIyAgICAgICAgcHJpbnQgIiRBWzJdIFxuIjsKICAgICAgICAgICAgcHVzaCAoQGJveGVzLCAkQVsyXSk7CiAgICAgICAgfQogICAgfQogICAgcHVzaCAoQGJveGVzLCAnSU5CT1gnKTsKICAgIG15ICVGb2xkZXJzID0gKCk7CiAgICBmb3JlYWNoIG15ICRGb2xkZXIgKEBib3hlcykgewogICAgICAgIG15ICRPcmlnRm9sZGVyID0gJEZvbGRlcjsKICAgICAgICAkRm9sZGVyID1+IHMvXFEkU2VsZi0+e0ZvbGRlclByZWZpeH1cRS8vOwogICAgICAgICRGb2xkZXIgPX4gcy9eXC8vLzsKIyAgICAgICAgJFNlbGYtPntGb2xkZXJQcmVmaXh9ID0gJyc7CiMgICAgICAgIG15ICROdW0gPSAkSU1BUC0+bWVzc2FnZV9jb3VudCgkRm9sZGVyKTsKIyAgICAgICAgaWYgKGRlZmluZWQoJE51bSkpIHsKIyAgICAgICAgICAgICRGb2xkZXJzeyRGb2xkZXJ9ID0gIiRGb2xkZXIgKCROdW0pIjsKICAgICAgICAgICAgJEZvbGRlcnN7JE9yaWdGb2xkZXJ9ID0gJEZvbGRlcjsKIyAgICAgICAgfQogICAgfQogICAgJFBhcmFteydGb2xkZXJzJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgPT4gXCVGb2xkZXJzLAogICAgICAgIE5hbWUgPT4gJ0ZvbGRlcicsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Rm9sZGVyfSwKICAgICk7CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNvbXBvc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb21wb3NlJykgewogICAgICAgIG15ICVFcnJvciA9ICgpOwogICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgIGZvcmVhY2ggKHF3KFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgU2VuZCBJblJlcGx5VG8gRm9ybUlEIEF0dGFjaG1lbnRVcGxvYWQgTWVzc2FnZQogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTApKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIHRyYXNoIGZvbGRlcgogICAgICAgIGlmICghJElNQVAtPnNlbGVjdCgkU2VsZi0+e1NlbnRGb2xkZXJ9KSkgewogICAgICAgICAgICAkSU1BUC0+Y3JlYXRlKCRTZWxmLT57U2VudEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIGFuZCBjcmVhdGUgZm9ybSBpZAogICAgICAgIGlmICghJEdldFBhcmFte0Zvcm1JRH0pIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkR2V0UGFyYW17U2VuZH0pIHsKIyAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgICAgIG15ICRSZXBseVRvQWxsID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdSZXBseVRvQWxsJykgfHwgJyc7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17TWVzc2FnZX0pIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRHZXRQYXJhbXtNZXNzYWdlfSwgJ3JmYzgyMicpOwogICAgICAgICAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JEdldFBhcmFte01lc3NhZ2V9fS0+eydyZmM4MjInfTsKICAgICAgICAgICAgICAgIG15IEBFbWFpbCA9IHNwbGl0KC9cbi8sICRQbGFpbik7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgwLi4kI0VtYWlsKSB7CiAgICAgICAgICAgICAgICAgICAgJEVtYWlsWyRfXSAuPSAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoISRHZXRQYXJhbXtTdWJqZWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnU3ViamVjdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17VG99KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnUmVwbHktVG8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJEdldFBhcmFte1RvfSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJ0Zyb20nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkUmVwbHlUb0FsbCkgewogICAgICAgICAgICAgICAgICAgIG15ICRSZXBseSA9ICcnOwogICAgICAgICAgICAgICAgICAgIG15ICRSZXBseUNsZWFyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnVG8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVwbHkgLj0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdUbycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdDYycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkUmVwbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseSAuPSAiLCAiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseSAuPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJ0NjJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVtYWlsIChNYWlsOjpBZGRyZXNzLT5wYXJzZSgkUmVwbHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRW1haWwtPmFkZHJlc3MoKSAhfiAvXiRTZWxmLT57VXNlckVtYWlsfSQvaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZXBseUNsZWFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlcGx5Q2xlYXIgLj0gIiwgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseUNsZWFyIC49ICRFbWFpbC0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRSZXBseUNsZWFyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17J0luUmVwbHlUbyd9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteydJblJlcGx5VG8nfSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnTWVzc2FnZS1JZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17Qm9keX0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkUGFyc2VPYmplY3QtPkdldE1lc3NhZ2VCb2R5KCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKFxuXHJ8XHJcclxufFxyXG4pL1xuL2c7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvXHIvXG4vZzsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsNzh9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzL1xuL1xuPiAvZzsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAiXG4+ICIgLiAkR2V0UGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnRnJvbScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRGcm9tID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdGcm9tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvKDwuKz9ALis/PnxcKC4rP0AuKz9cKSkvL2c7CiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXHMkLy9nOwogICAgICAgICAgICAgICAgICAgICAgICAkRnJvbSAuPSAnICcuJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3dyb3RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICIkRnJvbTpcbiIgLiAkR2V0UGFyYW17Qm9keX07CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yZWFjaCAoMS4uMTApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0pIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9KSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgKTsKICAgICAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICAgICAgZm9yZWFjaCAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkRW1haWwgKE1haWw6OkFkZHJlc3MtPnBhcnNlKCRHZXRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyIkXyBpbnZhbGlkIn0gLj0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yIHx8ICEkR2V0UGFyYW17U2VuZH0pIHsKICAgICAgICAgICAgIyBjb21wb3NlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb21wb3NlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVHZXRQYXJhbSwgJUVycm9yLCBGcm9tID0+ICRTZWxmLT57VXNlckZyb219LCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yZWFjaCBteSAkRGF0YVJlZiAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBwYWdlCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnQ29tcG9zZScpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICBwdXNoIChAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYWRkIG1haWwgZm9vdGVyCiAgICAgICAgICAgIGlmICgkU2VsZi0+e01haWxGb290ZXJ9KSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuIi4kU2VsZi0+e01haWxGb290ZXJ9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICAgICAgbXkgKCRIZWFkZXIsICRCb2R5KSA9ICRTZWxmLT57U2VuZG1haWxPYmplY3R9LT5TZW5kKAogICAgICAgICAgICAgICAgRnJvbSA9PiAkU2VsZi0+e1VzZXJGcm9tfSwKICAgICAgICAgICAgICAgIFRvID0+ICRHZXRQYXJhbXtUb30gfHwgJycsCiAgICAgICAgICAgICAgICBDYyA9PiAkR2V0UGFyYW17Q2N9IHx8ICcnLAogICAgICAgICAgICAgICAgQmNjID0+ICRHZXRQYXJhbXtCY2N9IHx8ICcnLAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICAgICBUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgQm9keSA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFwcGVuZCBtZXNzYWdlIHRvIHNlbnQgYm94CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJHskSGVhZGVyfS4iXG4iLiR7JEJvZHl9OwogICAgICAgICAgICAkSU1BUC0+YXBwZW5kKCRTZWxmLT57U2VudEZvbGRlcn0sIFsnTGl0ZXJhbCcsICRNZXNzYWdlXSk7CgogICAgICAgICAgICAjIHN0b3JlIGFuc3dlcmVkCiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17TWVzc2FnZX0gJiYgJFBhcmFte0ZvbGRlcn0pIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICAgICAgJElNQVAtPnN0b3JlKCRHZXRQYXJhbXtNZXNzYWdlfSwgJytmbGFncycsICcoXFxBbnN3ZXJlZCknKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cHVuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHB1bmdlJykgewogICAgICAgICMgY2hlY2sgdHJhc2ggZm9sZGVyCiAgICAgICAgaWYgKCEkSU1BUC0+c2VsZWN0KCRTZWxmLT57VHJhc2hGb2xkZXJ9KSkgewogICAgICAgICAgICAkSU1BUC0+Y3JlYXRlKCRTZWxmLT57VHJhc2hGb2xkZXJ9KTsKICAgICAgICAgICAgJElNQVAtPnNlbGVjdCgkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgfQogICAgICAgIG15ICROdW0gPSAkSU1BUC0+Z2V0X3Jlc3BvbnNlX2NvZGUoJ2V4aXN0cycpOwogICAgICAgIGlmICgkTnVtKSB7CiAgICAgICAgICAgIG15ICRSZXMgPSAkSU1BUC0+ZmV0Y2goIjE6JE51bSIsICcoZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgICAgICAkSU1BUC0+c3RvcmUoJE1lc3NhZ2UsICcrZmxhZ3MnLCAnKFxcZGVsZXRlZCknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRJTUFQLT5leHB1bmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgIyBjaGVjayB0cmFzaCBmb2xkZXIKICAgICAgICBpZiAoISRJTUFQLT5zZWxlY3QoJFNlbGYtPntUcmFzaEZvbGRlcn0pKSB7CiAgICAgICAgICAgICRJTUFQLT5jcmVhdGUoJFNlbGYtPntUcmFzaEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICAjIGNvcHkgYW5kIGRlbGV0ZSBvbGQgbWVzc2FnZQogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICRJTUFQLT5jb3B5KCRNZXNzYWdlLCAkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgJElNQVAtPnN0b3JlKCRNZXNzYWdlLCAnK2ZsYWdzJywgJyhcXGRlbGV0ZWQpJyk7CiAgICAgICAgJElNQVAtPmV4cHVuZ2UoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30pOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBidWxrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQnVsaycpIHsKICAgICAgICBteSBATWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAnTWVzc2FnZUlEJyk7CiAgICAgICAgbXkgJFJlYWQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1JlYWQnKSB8fCAnJzsKICAgICAgICBteSAkVW5yZWFkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdVbnJlYWQnKSB8fCAnJzsKICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEZWxldGUnKSB8fCAnJzsKICAgICAgICAjIGNoZWNrIHRyYXNoIGZvbGRlcgogICAgICAgIGlmICghJElNQVAtPnNlbGVjdCgkU2VsZi0+e1RyYXNoRm9sZGVyfSkpIHsKICAgICAgICAgICAgJElNQVAtPmNyZWF0ZSgkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgfQogICAgICAgICMgZGVsZXRlCiAgICAgICAgaWYgKCREZWxldGUpIHsKICAgICAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAjIGNvcHkgYW5kIGRlbGV0ZSBvbGQgbWVzc2FnZQogICAgICAgICAgICAgICAgJElNQVAtPmNvcHkoJF8sICRTZWxmLT57VHJhc2hGb2xkZXJ9KTsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkXywgJytmbGFncycsICcoXFxkZWxldGVkKScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRJTUFQLT5leHB1bmdlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUmVhZCkgewogICAgICAgICAgICAkSU1BUC0+c2VsZWN0KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICAgICAgZm9yZWFjaCAoQE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkXywgJytmbGFncycsICcoXFxTZWVuKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkVW5yZWFkKSB7CiAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICBmb3JlYWNoIChATWVzc2FnZSkgewogICAgICAgICAgICAgICAgJElNQVAtPnN0b3JlKCRfLCAnLWZsYWdzJywgJyhcXFNlZW4pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZpZXcnKSB7CiAgICAgICAgbXkgJFByaW50ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcmludCcpIHx8ICcnOwogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgJElNQVAtPnN0b3JlKCRNZXNzYWdlLCAnK2ZsYWdzJywgJyhcXFNlZW4pJyk7CiAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRNZXNzYWdlLCAncmZjODIyJyk7CiAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JE1lc3NhZ2V9LT57J3JmYzgyMid9OwogICAgICAgIG15IEBFbWFpbCA9IHNwbGl0KC9cbi8sICRQbGFpbik7CiAgICAgICAgZm9yZWFjaCAoMC4uJCNFbWFpbCkgewogICAgICAgICAgICAkRW1haWxbJF9dIC49ICJcbiI7CiAgICAgICAgfQogICAgICAgIG15ICRQYXJzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICBFbWFpbCA9PiBcQEVtYWlsLAogICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICBpZiAoISRQcmludCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBNZXNzYWdlID0+ICRNZXNzYWdlLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEB7JFNlbGYtPntTaG93bkhlYWRlcnN9fSkgewogICAgICAgICAgICAkRGF0YXskX30gPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJF8pOwogICAgICAgICAgICBpZiAoJERhdGF7JF99KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IEtleSA9PiAkXywgVmFsdWUgPT4gJERhdGF7JF99LCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICREYXRhe0RhdGV9ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdEYXRlJyk7CiAgICAgICAgaWYgKCREYXRhe0RhdGV9KSB7CiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRhe0RhdGVOaWNlfSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckRhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEtleSA9PiAnRGF0ZScsIFZhbHVlID0+ICREYXRhe0RhdGVOaWNlfSB8fCAkRGF0YXtEYXRlfSwgRGF0ZSA9PiAkRGF0YXtEYXRlfX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRCb2R5ID0gJFBhcnNlT2JqZWN0LT5HZXRNZXNzYWdlQm9keSgpOwogICAgICAgICRCb2R5ID1+IHMvXHIvL2c7CiAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpIHx8IDg1LAogICAgICAgICAgICBUZXh0ID0+ICRCb2R5LAogICAgICAgICAgICBWTWF4ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgICAgICMgbGluayBxdW90aW5nCiAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtRdW90ZSgKICAgICAgICAgICAgVGV4dCA9PiAkQm9keSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHknLAogICAgICAgICAgICBEYXRhID0+IHsgQm9keSA9PiAkQm9keSwgfSwKICAgICAgICApOwogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRQYXJzZU9iamVjdC0+R2V0QXR0YWNobWVudHMoKTsKICAgICAgICBpZiAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3JlYWNoIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgaWYgKCRBdHRhY2htZW50LT57RmlsZXNpemV9ID4gKDEwMjQqMTAyNCkpIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0vKDEwMjQqMTAyNCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA+IDEwMjQpIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gc3ByaW50ZiAiJS4xZiBLQnl0ZXMiLCAoKCRBdHRhY2htZW50LT57RmlsZXNpemV9LzEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0uJyBCeXRlcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4gIlwkRW52e1wiQmFzZWxpbmtcIn1BY3Rpb249XCRFbnZ7XCJBY3Rpb25cIn0mU3ViYWN0aW9uPUF0dGFjaG1lbnQmRm9sZGVyPSRQYXJhbXtGb2xkZXJ9Jk1lc3NhZ2U9JE1lc3NhZ2UmRmlsZUlEPSRDb3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBJbWFnZSA9PiAnZGlzay1zLnBuZycsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0+ICd0YXJnZXQ9Il9ibGFuayIgJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJFByaW50KSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnTWVzc2FnZScpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoVGl0bGUgPT4gJ1ByaW50Jyk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50V2ViTWFpbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGF0dGFjaG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdBdHRhY2htZW50JykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgbXkgJEZpbGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRmlsZUlEJykgfHwgJyc7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKICAgICAgICBteSBAQURhdGEgPSAkSU1BUC0+ZmV0Y2goJE1lc3NhZ2UsICdyZmM4MjInKTsKICAgICAgICBteSAkUGxhaW4gPSAkQURhdGFbMF0tPnskTWVzc2FnZX0tPnsncmZjODIyJ307CiAgICAgICAgbXkgQEVtYWlsID0gc3BsaXQoL1xuLywgJFBsYWluKTsKICAgICAgICBmb3JlYWNoICgwLi4kI0VtYWlsKSB7CiAgICAgICAgICAgICRFbWFpbFskX10gLj0gIlxuIjsKICAgICAgICB9CiAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgIExvZ09iamVjdCA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkUGFyc2VPYmplY3QtPkdldEF0dGFjaG1lbnRzKCk7CiAgICAgICAgaWYgKCRBdHRhY2htZW50c1skRmlsZUlELTFdKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoJXskQXR0YWNobWVudHNbJEZpbGVJRC0xXX0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlYXJjaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICBteSAlU2VhcmNoID0gKCk7CiAgICAgICAgIyBsb2FkIGxhc3Qgc2VhcmNoIG9wdGlvbnMKICAgICAgICBpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcm9maWxlJykpIHsKICAgICAgICAgICAgJVNlYXJjaCA9ICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVHZXQoCiAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ1dlYk1haWxTZWFyY2gnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2gnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlU2VhcmNoIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1NlYXJjaCcpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlYXJjaCByZXN1bHQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2hSZXN1bHQnKSB7CiAgICAgICAgbXkgJVNlYXJjaCA9ICgpOwogICAgICAgIG15IEBTZWFyY2hRdWVyeSA9ICgpOwogICAgICAgIG15ICRQYWdlU2hvd24gPSAkU2VsZi0+e1BhZ2VTaG93bn0gfHwgMjA7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgIyBnZXQgc2VhcmNoIHBhcmFtcwogICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBCb2R5IFNvcnRCeSBPcmRlcikpIHsKICAgICAgICAgICAgJFNlYXJjaHskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIGlmIG9sZCBwcm9maWxlIGlzIG5lZWRlZAogICAgICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1Byb2ZpbGUnKSkgewogICAgICAgICAgICBteSAkT3JkZXIgPSAnJzsKICAgICAgICAgICAgbXkgJFNvcnRCeSA9ICcnOwogICAgICAgICAgICBpZiAoJFNlYXJjaHtPcmRlcn0pIHsKICAgICAgICAgICAgICAgICRPcmRlciA9ICRTZWFyY2h7T3JkZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VhcmNoe1NvcnRCeX0pIHsKICAgICAgICAgICAgICAgICRTb3J0QnkgPSAkU2VhcmNoe1NvcnRCeX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJVNlYXJjaCA9ICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVHZXQoCiAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ1dlYk1haWxTZWFyY2gnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJE9yZGVyKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoe09yZGVyfSA9ICRPcmRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNvcnRCeSkgewogICAgICAgICAgICAgICAgJFNlYXJjaHtTb3J0Qnl9ID0gJFNvcnRCeTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBkZWxldGUgb2xkIHNlYXJjaCBwYXJhbXMKICAgICAgICAgICAgJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fS0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnV2ViTWFpbFNlYXJjaCcsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ2xhc3Qtc2VhcmNoJywKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgcmVtZW1iZXIgbmV3IHNlYXJjaCBvcHRpb25zCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJVNlYXJjaCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fS0+U2VhcmNoUHJvZmlsZUFkZCgKICAgICAgICAgICAgICAgICAgICBCYXNlID0+ICdXZWJNYWlsU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWFyY2h7JF99LAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRTb3J0QnkgPSAkU2VhcmNoe1NvcnRCeX0gfHwgJ0RhdGUnOwogICAgICAgIG15ICRPcmRlckJ5ID0gJFNlYXJjaHtPcmRlcn0gfHwgJ1VwJzsKCiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFBhcmFte0ZvbGRlcn0mU3RhcnRIaXQ9JFN0YXJ0SGl0JiIsCiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICBpZiAoJFNlYXJjaHskS2V5fSkgewogICAgICAgICAgICAgICAgcHVzaCAoQFNlYXJjaFF1ZXJ5LCB1YygkS2V5KSwgJFNlYXJjaHskS2V5fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKICAgICAgICBteSBAUmVzdXRsTUlEID0gJElNQVAtPnNlYXJjaChAU2VhcmNoUXVlcnkpOwogICAgICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJVBhZ2VOYXYgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBhZ2VOYXZCYXIoCiAgICAgICAgICAgIExpbWl0ID0+IDIwMDAsCiAgICAgICAgICAgIFN0YXJ0SGl0ID0+ICRTdGFydEhpdCwKICAgICAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgICAgIEFsbEhpdHMgPT4gJCNSZXN1dGxNSUQrMSwKICAgICAgICAgICAgQWN0aW9uID0+ICJBY3Rpb249XCRFbnZ7XCJBY3Rpb25cIn0iLAogICAgICAgICAgICBMaW5rID0+ICJTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRQYXJhbXtGb2xkZXJ9JiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlUGFnZU5hdn0sCiAgICAgICAgKTsKICAgICAgICAjIGZldGNoIG1haWxib3gKICAgICAgICBteSAkTWVzc2FnZXMgPSAnJzsKICAgICAgICBmb3JlYWNoIChAUmVzdXRsTUlEKSB7CiAgICAgICAgICAgIGlmICgkTWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlcyAuPSAiLCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE1lc3NhZ2VzIC49ICRfOwogICAgICAgIH0KICAgICAgICBteSAlT3JkZXIgPSAoKTsKICAgICAgICBteSAkUmVzOwogICAgICAgIGlmIChAUmVzdXRsTUlEKSB7CiAgICAgICAgICAgICRSZXMgPSAkSU1BUC0+ZmV0Y2goJE1lc3NhZ2VzLCAnKGZsYWdzIHJmYzgyMi5oZWFkZXIgcmZjODIyLnNpemUgZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc29ydAogICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskUmVzLT57JE1lc3NhZ2V9LT57J2VudmVsb3BlJ319OwogICAgICAgICAgICAgICAgIyBvcmRlciBieSBmcm9tCiAgICAgICAgICAgICAgICBpZiAoJFNvcnRCeSBlcSAnRnJvbScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RnJvbX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7RnJvbX0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU3ViamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7U3ViamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7U3ViamVjdH0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7U3ViamVjdH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU2l6ZScpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2l6ZSA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLnNpemUnfTsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gc3ByaW50ZigiJTAxMDBkIiwgJFNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBkYXRlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtEYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwNDBkIiwgJFN5c3RlbVRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNob3duIG1lc3NhZ2VzCiAgICAgICAgbXkgQFNob3duID0gKCk7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGlmICgoJE9yZGVyQnkgZXEgJ0Rvd24nICYmICRTb3J0QnkgbmUgJ0RhdGUnKSB8fCAkT3JkZXJCeSBlcSAnVXAnICYmICRTb3J0QnkgZXEgJ0RhdGUnKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHJldmVyc2Ugc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IG1lc3NhZ2VzCiAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoQFNob3duKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICMgZ2V0IGFuZCBwYXJzZSBoZWFkZXJzCiAgICAgICAgICAgIG15ICRQbGFpbiA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLmhlYWRlcid9OwogICAgICAgICAgICBteSBARW1haWwgPSBzcGxpdCgvXG4vLCAkUGxhaW4pOwogICAgICAgICAgICBteSAkUGFyc2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgRW1haWwgPT4gXEBFbWFpbCwKICAgICAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBEYXRlKSkgewogICAgICAgICAgICAgICAgJERhdGF7JF99ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICRfKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICAgICAkRGF0YXtOdW1iZXJ9ID0gJE1lc3NhZ2U7CiAgICAgICAgICAgICREYXRhe0ZvbGRlcn0gPSAkUGFyYW17Rm9sZGVyfTsKICAgICAgICAgICAgbXkgQEZsYWdzID0gQHskUmVzLT57JE1lc3NhZ2V9LT57ZmxhZ3N9fTsKICAgICAgICAgICAgIyBzaG93IGh1bWFuIHNpemUKICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgIGlmICgkU2l6ZSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCRTaXplLygxMDI0KjEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFNpemUgPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCgkU2l6ZS8xMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9ICRTaXplLicgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe1NpemV9ID0gJFNpemU7CiAgICAgICAgICAgICMgY29udmVydCBkYXRlCiAgICAgICAgICAgIGlmICgkRGF0YXtEYXRlfSkgewogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRTeXN0ZW1UaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RGF0ZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoQEZsYWdzKSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gPX4gLyhEZWxldGV8U2VlbnxKdW5rKSQvaSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe2xjKCQxKX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJERhdGF7J3NlZW4nfSkgewogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRTdGFydCJ9ID0gJzxiPic7CiAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZEVuZCJ9ID0gJzwvYj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzaG93IHBlcnNvbmFsIGltYWdlCiAgICAgICAgICAgIGlmICgkU2VsZi0+X0NoZWNrUGVyc29uYWxNZXNzYWdlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCBGbGFnID0+ICdwZXJzb25hbCcsIFRpdGxlID0+ICdwZXJzb25hbCcsIEltYWdlID0+ICdwZXJzb25hbCcsIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBhbnN3ZXJlZHxmb3J3YXJlZHxkZWxldGUgaW1hZ2VzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEZsYWcgKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRGbGFnID1+IC8oYW5zd2VyZWR8Zm9yd2FyZGVkfGRlbGV0ZWQpL2kpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAkRmxhZywgVGl0bGUgPT4gbGMoJDEpLCBJbWFnZSA9PiBsYygkMSksIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1NlYXJjaCcpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHBsYWluCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlld1BsYWluJykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwgMSk7CiAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRNZXNzYWdlLCAncmZjODIyJyk7CiAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JE1lc3NhZ2V9LT57J3JmYzgyMid9OwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICcnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIENvbnRlbnQgPT4gJFBsYWluLAogICAgICAgICk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbmRleAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgIG15ICRQYWdlU2hvd24gPSAkU2VsZi0+e1BhZ2VTaG93bn0gfHwgMjA7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU29ydEJ5JykgfHwgJ0RhdGUnOwogICAgICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdPcmRlcicpIHx8ICdVcCc7CiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9JkZvbGRlcj0kUGFyYW17Rm9sZGVyfSZTdGFydEhpdD0kU3RhcnRIaXQmU29ydEJ5PSRTb3J0QnkmT3JkZXI9JE9yZGVyQnkiLAogICAgICAgICk7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKIyAgICAgICAgbXkgJE51bSA9ICRJTUFQLT5tZXNzYWdlX2NvdW50KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICBteSAkTnVtID0gJElNQVAtPmdldF9yZXNwb25zZV9jb2RlKCdleGlzdHMnKTsKCiAgICAgICAgIyBidWlsZCBzZWFyY2ggbmF2aWdhdGlvbiBiYXIKICAgICAgICBteSAlUGFnZU5hdiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGFnZU5hdkJhcigKICAgICAgICAgICAgTGltaXQgPT4gMjAwMCwKICAgICAgICAgICAgU3RhcnRIaXQgPT4gJFN0YXJ0SGl0LAogICAgICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICAgICAgQWxsSGl0cyA9PiAkTnVtLAogICAgICAgICAgICBBY3Rpb24gPT4gIkFjdGlvbj1cJEVudntcIkFjdGlvblwifSIsCiAgICAgICAgICAgIExpbmsgPT4gIkZvbGRlcj0kUGFyYW17Rm9sZGVyfSZTb3J0Qnk9JFNvcnRCeSZPcmRlcj0kT3JkZXJCeSYiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5kZXgnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlUGFnZU5hdn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCBtYWlsYm94CiAgICAgICAgbXkgJU9yZGVyID0gKCk7CiAgICAgICAgbXkgJFJlczsKICAgICAgICBpZiAoJE51bSkgewogICAgICAgICAgICAkUmVzID0gJElNQVAtPmZldGNoKCIxOiROdW0iLCAnKGZsYWdzIHJmYzgyMi5oZWFkZXIgcmZjODIyLnNpemUgZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc29ydAogICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskUmVzLT57JE1lc3NhZ2V9LT57J2VudmVsb3BlJ319OwogICAgICAgICAgICAgICAgIyBvcmRlciBieSBmcm9tCiAgICAgICAgICAgICAgICBpZiAoJFNvcnRCeSBlcSAnRnJvbScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RnJvbX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7RnJvbX0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU3ViamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7U3ViamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7U3ViamVjdH0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7U3ViamVjdH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU2l6ZScpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2l6ZSA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLnNpemUnfTsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gc3ByaW50ZigiJTAxMDBkIiwgJFNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBkYXRlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtEYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwNDBkIiwgJFN5c3RlbVRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNob3duIG1lc3NhZ2VzCiAgICAgICAgbXkgQFNob3duID0gKCk7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGlmICgoJE9yZGVyQnkgZXEgJ0Rvd24nICYmICRTb3J0QnkgbmUgJ0RhdGUnKSB8fCAkT3JkZXJCeSBlcSAnVXAnICYmICRTb3J0QnkgZXEgJ0RhdGUnKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHJldmVyc2Ugc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IG1lc3NhZ2VzCiAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoQFNob3duKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICMgZ2V0IGFuZCBwYXJzZSBoZWFkZXJzCiAgICAgICAgICAgIG15ICRQbGFpbiA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLmhlYWRlcid9OwogICAgICAgICAgICBteSBARW1haWwgPSBzcGxpdCgvXG4vLCAkUGxhaW4pOwogICAgICAgICAgICBteSAkUGFyc2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgRW1haWwgPT4gXEBFbWFpbCwKICAgICAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBEYXRlKSkgewogICAgICAgICAgICAgICAgJERhdGF7JF99ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICRfKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICAgICAkRGF0YXtOdW1iZXJ9ID0gJE1lc3NhZ2U7CiAgICAgICAgICAgICREYXRhe0ZvbGRlcn0gPSAkUGFyYW17Rm9sZGVyfTsKICAgICAgICAgICAgbXkgQEZsYWdzID0gQHskUmVzLT57JE1lc3NhZ2V9LT57ZmxhZ3N9fTsKICAgICAgICAgICAgIyBzaG93IGh1bWFuIHNpemUKICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgIGlmICgkU2l6ZSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCRTaXplLygxMDI0KjEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFNpemUgPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCgkU2l6ZS8xMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9ICRTaXplLicgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe1NpemV9ID0gJFNpemU7CiAgICAgICAgICAgICMgY29udmVydCBkYXRlCiAgICAgICAgICAgIGlmICgkRGF0YXtEYXRlfSkgewogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRTeXN0ZW1UaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RGF0ZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoQEZsYWdzKSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gPX4gLyhEZWxldGV8U2VlbnxKdW5rKSQvaSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe2xjKCQxKX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJERhdGF7J3NlZW4nfSkgewogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRTdGFydCJ9ID0gJzxiPic7CiAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZEVuZCJ9ID0gJzwvYj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzaG93IHBlcnNvbmFsIGltYWdlCiAgICAgICAgICAgIGlmICgkU2VsZi0+X0NoZWNrUGVyc29uYWxNZXNzYWdlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCBGbGFnID0+ICdwZXJzb25hbCcsIFRpdGxlID0+ICdwZXJzb25hbCcsIEltYWdlID0+ICdwZXJzb25hbCcsIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBhbnN3ZXJlZHxmb3J3YXJlZHxkZWxldGUgaW1hZ2VzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEZsYWcgKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRGbGFnID1+IC8oYW5zd2VyZWR8Zm9yd2FyZGVkfGRlbGV0ZWQpL2kpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAkRmxhZywgVGl0bGUgPT4gbGMoJDEpLCBJbWFnZSA9PiBsYygkMSksIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+ICdNYWlsYm94JywKICAgICAgICAgICAgUmVmcmVzaCA9PiA2MCo1LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50V2ViTWFpbCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9DaGVja1BlcnNvbmFsTWVzc2FnZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiMgICAgaWYgKCgkUGFyYW17VG99ICYmICRQYXJhbXtUb30gPX4gL1xRJFNlbGYtPntVc2VyRW1haWx9XEUvaSkgfHwKIyAgICAgICAgKCRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSA9fiAvXFEkU2VsZi0+e1VzZXJFbWFpbH1cRS9pKSkgewogICAgaWYgKCRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSA9fiAvXFEkU2VsZi0+e1VzZXJFbWFpbH1cRS9pKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCjE7Cg== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9QcmVmZXJlbmNlc1dlYk1haWwucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogUHJlZmVyZW5jZXNXZWJNYWlsLnBtLHYgMS4yIDIwMDUvMDEvMDYgMTA6MTE6MjAgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXNXZWJNYWlsOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0Kc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgZW52CiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIFBhcmFtT2JqZWN0KSkgewogICAgICAgIGRpZSAiR290IG5vICRfISIgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFBhcmFtIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBQYXJhbXMgPSAoKTsKICAgIHB1c2ggKEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEJsb2NrID0+ICdJbnB1dEtleScsCiAgICAgICAgICAgIEtleSA9PiAnSG9zdCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUEhvc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtVc2VyRGF0YX0tPntVc2VyV2ViTWFpbElNQVBIb3N0fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEhvc3QnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIGltYXAgPT4gJ2ltYXAnLAogICAgICAgICAgICAgICAgaW1hcHMgPT4gJ2ltYXBzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIEtleSA9PiAnUHJvdG9jb2wnLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBQcm90b2NvbCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJEYXRhfS0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUFByb3RvY29sJykgfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ0lucHV0S2V5JywKICAgICAgICAgICAgS2V5ID0+ICdGb2xkZXIgUHJlZml4JywKICAgICAgICAgICAgTmFtZSA9PiAnVXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEZvbGRlclByZWZpeCcpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgICAgIDI1ID0+ICcyNScsCiAgICAgICAgICAgICAgICAzNSA9PiAnMzUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBCbG9jayA9PiAnT3B0aW9uJywKICAgICAgICAgICAgS2V5ID0+ICdNZXNzYWdlIGEgcGFnZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsUGFnZVNob3duJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxQYWdlU2hvd259IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpQYWdlU2hvd24nKSB8fCAnJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBCbG9jayA9PiAnSW5wdXRLZXknLAogICAgICAgICAgICBLZXkgPT4gJ1VzZXInLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBVc2VyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQVXNlcn0gfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ1Bhc3N3b3JkJywKICAgICAgICAgICAgS2V5ID0+ICdQYXNzd29yZCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIEBQYXJhbXM7Cn0KIyAtLQpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBmb3JlYWNoIG15ICRLZXkgKGtleXMgJXskUGFyYW17R2V0UGFyYW19fSkgewogICAgICAgIG15IEBBcnJheSA9IEB7JFBhcmFte0dldFBhcmFtfS0+eyRLZXl9fTsKICAgICAgICBmb3JlYWNoIChAQXJyYXkpIHsKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICBpZiAoISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyB1cGRhdGUgU2Vzc2lvbklECiAgICAgICAgICAgIGlmICgkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSBlcSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0Kc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KMTsK IyAtLQojIEFnZW50V2ViTWFpbC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50V2ViTWFpCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgTWFydGluIEVkZW5ob2ZlciA8bWFydGluK2NvZGVAb3Rycy5vcmc+CiMgLS0KIyAkSWQ6IEFnZW50V2ViTWFpbC5kdGwsdiAxLjggMjAwNi8wNC8wNSAwODo1ODo1MyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgY29scz0iMSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbk92ZXJ2aWV3In0iPiRUZXh0eyJCYWNrIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249Q29tcG9zZSZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZNZXNzYWdlPSRRRGF0YXsiTWVzc2FnZSJ9Ij4kVGV4dHsiUmVwbHkifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Db21wb3NlJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JFFEYXRheyJNZXNzYWdlIn0mUmVwbHlUb0FsbD0xIj4kVGV4dHsiUmVwbHkgQWxsIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZQcmludD0xJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JFFEYXRheyJNZXNzYWdlIn0iIHRhcmdldD0icHJpbnQiPiRUZXh0eyJQcmludCJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXdQbGFpbiZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZNZXNzYWdlPSRRRGF0YXsiTWVzc2FnZSJ9IiB0YXJnZXQ9Il9ibGFuayI+JFRleHR7IlBsYWluIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JFFEYXRheyJNZXNzYWdlIn0iPiRUZXh0eyJEZWxldGUifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzYwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjgwIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxMjAwIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyRGF0ZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iODAiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFFEYXRheyJEYXRlIn0iPiRUaW1lTG9uZ3siJFFEYXRheyJWYWx1ZSJ9In08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlckRhdGUgLS0+CiMgc2hvdyBhdHRhY2htZW50cwo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3dMaW5rIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRGF0YXsiTGluayJ9IiAkRGF0YXsiVGFyZ2V0In0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In06ICRRRGF0YXsiRmlsZW5hbWUifSc7cmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPjwvYT4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3dOb0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiSW1hZ2UifSIgYm9yZGVyPSIwIiBhbHQ9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9Ij4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+JERhdGF7IkJvZHkifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCb2R5IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpWaWV3IC0tPgoKPCEtLSBkdGw6YmxvY2s6UHJpbnQgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGNvbHM9IjEiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiUHJpbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjgwIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxMjAwIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyRGF0ZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iODAiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFFEYXRheyJEYXRlIn0iPiRUaW1lTG9uZ3siJFFEYXRheyJWYWx1ZSJ9In08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlckRhdGUgLS0+CiMgc2hvdyBhdHRhY2htZW50cwo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3dMaW5rIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRGF0YXsiTGluayJ9IiAkRGF0YXsiVGFyZ2V0In0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In06ICRRRGF0YXsiRmlsZW5hbWUifSc7cmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+JFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifTwvYT4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd0xpbmsgLS0+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGaWxlc2l6ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPjxocj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkJvZHkgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPiREYXRheyJCb2R5In08L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4mbmJzcDs8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlByaW50IC0tPgoKPCEtLSBkdGw6YmxvY2s6Q29tcG9zZSAtLT4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBzdWJtaXRfY29tcG9zZSgpCnsKICAgIGlmIChkb2N1bWVudC5jb21wb3NlLlRvLnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBUbzogcmVjaXBpZW50ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5Uby5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgaWYgKGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC52YWx1ZSA9PSAiIikgewogICAgICAgIGFsZXJ0KCckVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIFNwZWxsQ2hlY2tTdWJtaXQoKQp7CiAgICBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdzcGVsbGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5zcGVsbGluZy5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBCb29rQ2hlY2tTdWJtaXQoKQp7CiAgICBkb2N1bWVudC5ib29rLlRvLnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Uby52YWx1ZTsKICAgIGRvY3VtZW50LmJvb2suQ2MudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkNjLnZhbHVlOwogICAgZG9jdW1lbnQuYm9vay5CY2MudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJjYy52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnYm9vaycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5ib29rLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0Pgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBjb2xzPSIxIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNvbXBvc2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuT3ZlcnZpZXcifSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZW5kIiAgICAgIHZhbHVlPSIxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNZXNzYWdlIiAgIHZhbHVlPSIkUURhdGF7Ik1lc3NhZ2UifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW5SZXBseVRvIiB2YWx1ZT0iJFFEYXRheyJJblJlcGx5VG8ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9sZGVyIiAgICB2YWx1ZT0iJFFEYXRheyJGb2xkZXIifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiAgICB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNzYwIj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGcm9tIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRnJvbSJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiRnJvbSBpbnZhbGlkIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG8ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRvIiB2YWx1ZT0iJFFEYXRheyJUbyJ9IiBzaXplPSI4MCI+IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiVG8gaW52YWxpZCJ9PC9mb250PgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2MiIHZhbHVlPSIkUURhdGF7IkNjIn0iIHNpemU9IjgwIj4gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJDYyBpbnZhbGlkIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQmNjIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJCY2MiIHZhbHVlPSIkUURhdGF7IkJjYyJ9IiBzaXplPSI4MCI+IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiQmNjIGludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjgwIj48L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJJbnZhbGlkIn08L2ZvbnQ+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJTcGVsbCBDaGVjayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1zcGVsbC5wbmciPiRUZXh0eyJTcGVsbCBDaGVjayJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iQm9va0NoZWNrU3VibWl0KCk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsiQWRkcmVzcyBCb29rIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWNvbnRlbnRzLnBuZyI+JFRleHR7IkFkZHJlc3MgQm9vayJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiNhdHRhY2htZW50IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7IkF0dGFjaG1lbnRzIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWF0dGFjaC5wbmciPiRUZXh0eyJBdHRhY2htZW50cyJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxwcmU+CiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQm9keSIgcm93cz0iMjUiIGNvbHM9Ijc4IiB3cmFwPSIkRW52eyJCcm93c2VyV3JhcCJ9Ij4KICAgICAgICAgICAgICAgICRRRGF0YXsiQm9keSJ9CiAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlbmQgbWFpbCEifSIgb25jbGljaz0icmV0dXJuIHN1Ym1pdF9jb21wb3NlKCk7Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9InNwZWxsaW5nIiB0YXJnZXQ9InNwZWxsaW5nIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFNwZWxsaW5nIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVsbF9sYW5nIiB2YWx1ZT0iIj4KICAgICAgPC9mb3JtPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9ImJvb2siIHRhcmdldD0iYm9vayI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRCb29rIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUbyIgdmFsdWU9IiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2MiIHZhbHVlPSIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJjYyIgdmFsdWU9IiI+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpDb21wb3NlIC0tPgoKPCEtLSBkdGw6YmxvY2s6U2VhcmNoIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBjb2xzPSIxIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNlYXJjaCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2VhcmNoUmVzdWx0Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI3MDAiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZvbGRlciJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kRGF0YXsiRm9sZGVycyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRnJvbSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iRnJvbSIgdmFsdWU9IiREYXRheyJGcm9tIn0iIHNpemU9IjUwIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG8ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRvIiB2YWx1ZT0iJERhdGF7IlRvIn0iIHNpemU9IjUwIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2MifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNjIiB2YWx1ZT0iJERhdGF7IkNjIn0iIHNpemU9IjUwIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IiREYXRheyJTdWJqZWN0In0iIHNpemU9IjUwIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVGV4dCJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQm9keSIgdmFsdWU9IiREYXRheyJCb2R5In0iIHNpemU9IjUwIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaCAtLT4KCjwhLS0gZHRsOmJsb2NrOlNlYXJjaFJlc3VsdCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgY29scz0iMSI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifTogJFFEYXRheyJGb2xkZXIifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaCZQcm9maWxlPWxhc3Qtc2VhcmNoIiBjbGFzcz0ibWVudWl0ZW0iPgogICAgICAkVGV4dHsiQ2hhbmdlIHNlYXJjaCBvcHRpb25zIn0KICAgICAgPC9hPgogICAgICAtICRUZXh0eyJNZXNzYWdlcyJ9OiA8Yj4kUURhdGF7IlJlc3VsdCJ9PC9iPiAtICRUZXh0eyJUb3RhbCJ9OiA8Yj4kRGF0YXsiVG90YWxIaXRzIn08L2I+CiAgICAgIC0gJFRleHR7IlBhZ2UifTogJERhdGF7IlNpdGVOYXZCYXIifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJCdWxrIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb2xkZXIiICAgIHZhbHVlPSIkUURhdGF7IkZvbGRlciJ9Ij4KIyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRGVsZXRlIiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KIyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iUmVhZCIgICB2YWx1ZT0iJFRleHR7IlJlYWQifSI+CiMgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlVucmVhZCIgdmFsdWU9IiRUZXh0eyJVbnJlYWQifSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4kVGV4dHsiIyJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjM1JSI+JFRleHR7IkZyb20ifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1Gcm9tJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9RnJvbSZPcmRlcj1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVN1YmplY3QmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgdXB3YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgdXB3YXJkIn0iPjwvYT4gLwogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJEYXRlIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9RGF0ZSZPcmRlcj1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PURhdGUmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgZG93bndhcmQifSIgYWx0PSIkVGV4dHsic29ydCBkb3dud2FyZCJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwMCI+JFRleHR7IlNpemUifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TaXplJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9U2l6ZSZPcmRlcj1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2UgLS0+CiAgICAgICAgICA8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICIiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNocGFzc2l2ZSI7IH0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Ik1lc3NhZ2VJRCIgdmFsdWU9IiRRRGF0YXsiTnVtYmVyIn0iPjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+JERhdGF7IkJvbGRTdGFydCJ9JFFEYXRheyJOdW1iZXIifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2VGbGFnIC0tPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9d2VibWFpbF8kUURhdGF7IkltYWdlIn0ucG5nIiBib3JkZXI9IjAiIHRpdGxlPSIkUURhdGF7IlRpdGxlIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgojJFFEYXRheyJGbGFnIn0KPCEtLSBkdGw6YmxvY2s6U2VhcmNoTWVzc2FnZUZsYWcgLS0+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSIgdGl0bGU9IiRRRGF0YXsiRnJvbSJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In08YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1WaWV3JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJGcm9tIiwiNDAifTwvYT4kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9IiB0aXRsZT0iJFFEYXRheyJTdWJqZWN0In0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiU3ViamVjdCIsIjQwIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kVGltZUxvbmd7IiRRRGF0YXsiRGF0ZSJ9In0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7IlNpemUifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgInNlYXJjaGFjdGl2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICIiOyB9PgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNocGFzc2l2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICJzZWFyY2hhY3RpdmUiOyB9Pgo8IS0tIGR0bDpibG9jazpTZWFyY2hNZXNzYWdlIC0tPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoUmVzdWx0IC0tPgoKPCEtLSBkdGw6YmxvY2s6SW5kZXggLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGNvbHM9IjEiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiTWFpbGJveCJ9OiAkUURhdGF7IkZvbGRlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgJFRleHR7Ik1lc3NhZ2VzIn06IDxiPiRRRGF0YXsiUmVzdWx0In08L2I+IC0gJFRleHR7IlRvdGFsIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgICAgLSAkVGV4dHsiUGFnZSJ9OiAkRGF0YXsiU2l0ZU5hdkJhciJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICRUZXh0eyJGb2xkZXIifTogJERhdGF7IkZvbGRlcnMifQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VsZWN0In0iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkJ1bGsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvbGRlciIgdmFsdWU9IiRRRGF0YXsiRm9sZGVyIn0iPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+JFRleHR7IiMifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIzNSUiPiRUZXh0eyJGcm9tIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1Gcm9tJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1Gcm9tJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJEYXRlIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMDAiPiRUZXh0eyJTaXplIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TaXplJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TaXplJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TWVzc2FnZSAtLT4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgIiIpIHsgJEVudnsiQ29sb3IifSA9ICJzZWFyY2hwYXNzaXZlIjsgfT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iTWVzc2FnZUlEIiB2YWx1ZT0iJFFEYXRheyJOdW1iZXIifSI+PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7Ik51bWJlciJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TWVzc2FnZUZsYWcgLS0+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJEVudnsiSW1hZ2VzIn13ZWJtYWlsXyRRRGF0YXsiSW1hZ2UifS5wbmciIGJvcmRlcj0iMCIgdGl0bGU9IiRRRGF0YXsiVGl0bGUifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiMkUURhdGF7IkZsYWcifQo8IS0tIGR0bDpibG9jazpNZXNzYWdlRmxhZyAtLT4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9IiB0aXRsZT0iJFFEYXRheyJGcm9tIn0iPiREYXRheyJCb2xkU3RhcnQifTxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kUURhdGF7Ik51bWJlciJ9Ij4kUURhdGF7IkZyb20iLCI0MCJ9PC9hPiREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iIHRpdGxlPSIkUURhdGF7IlN1YmplY3QifSI+JERhdGF7IkJvbGRTdGFydCJ9JFFEYXRheyJTdWJqZWN0IiwiNDAifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRUaW1lTG9uZ3siJFFEYXRheyJEYXRlIn0ifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiU2l6ZSJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNoYWN0aXZlIikgeyAkRW52eyJDb2xvciJ9ID0gIiI7IH0+CiAgICAgICAgICA8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICJzZWFyY2hwYXNzaXZlIikgeyAkRW52eyJDb2xvciJ9ID0gInNlYXJjaGFjdGl2ZSI7IH0+CjwhLS0gZHRsOmJsb2NrOk1lc3NhZ2UgLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI3IiBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEZWxldGUiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlJlYWQiIHZhbHVlPSIkVGV4dHsiUmVhZCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJVbnJlYWQiIHZhbHVlPSIkVGV4dHsiVW5yZWFkIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkluZGV4IC0tPgoK IyEvdXNyL2Jpbi9wZXJsIC13CnBhY2thZ2UgTWFpbDo6SU1BUFRhbGs7Cgo9aGVhZDEgTkFNRQoKTWFpbDo6SU1BUFRhbGsgLSBJTUFQIGNsaWVudCBpbnRlcmZhY2Ugd2l0aCBsb3RzIG9mIGZlYXR1cmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIE1haWw6OklNQVBUYWxrOwoKICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgIFNlcnZlciA9PiAkUG9wU2VydmVyLAogICAgICBVc2VybmFtZSA9PiAnZm9vJywKICAgICAgUGFzc3dvcmQgPT4gJ2JhcicsCiAgICAgIFVpZCA9PiAxICkKICAgIHx8IGRpZSAiRmFpbGVkIHRvIGNvbm5lY3QvbG9naW4gdG8gSU1BUCBzZXJ2ZXIiOwoKICAjIEFwcGVuZCBtZXNzYWdlIHRvIGZvbGRlcgogIG9wZW4obXkgJEYsICdyZmM4MjJtc2cudHh0Jyk7CiAgJElNQVAtPmFwcGVuZCgkRm9sZGVyTmFtZSwgJEYpIHx8IGRpciAkQDsKICBjbG9zZSgkRik7CgogICMgU2VsZWN0IGZvbGRlciBhbmQgZ2V0IGZpcnN0IHVuc2VlbiBtZXNzYWdlCiAgJElNQVAtPnNlbGVjdCgkRm9sZGVyTmFtZSkgfHwgZGllICRAOwogICRNc2dJZCA9ICRJTUFQLT5zZWFyY2goJ25vdCcsICdzZWVuJyktPlswXTsKCiAgIyBHZXQgbWVzc2FnZSBlbnZlbG9wZSBhbmQgcHJpbnQgc29tZSBkZXRhaWxzCiAgJE1zZ0VWID0gJElNQVAtPmZldGNoKCRNc2dJZCwgJ2VudmVsb3BlJyktPnskTXNnSWR9LT57ZW52ZWxvcGV9OwogIHByaW50ICJGcm9tOiAiIC4gJE1zZ0V2LT57RnJvbX07CiAgcHJpbnQgIlRvOiAiIC4gJE1zZ0V2LT57VG99OwogIHByaW50ICJTdWJqZWN0OiAiIC4gJE1zZ0V2LT57U3ViamVjdH07CgogICMgR2V0IG1lc3NhZ2UgYm9keSBzdHJ1Y3R1cmUKICAkTXNnQlMgPSAkSU1BUC0+ZmV0Y2goJE1zZ0lkLCAnYm9keXN0cnVjdHVyZScpLT57JE1zZ0lkfS0+e2JvZHlzdHJ1Y3R1cmV9OwoKICAjIEZpbmQgaW1hcCBwYXJ0IG51bWJlciBvZiB0ZXh0IHBhcnQgb2YgbWVzc2FnZQogICRNc2dUeHRIYXNoID0gTWFpbDo6SU1BUFRhbGs6OmZpbmRfbWVzc2FnZSgkTXNnQlMpOwogICRNc2dQYXJ0ID0gJE1zZ1R4dEhhc2gtPntwbGFpbn0tPnsnSU1BUC1QYXJ0bnVtJ307CgogICMgUmV0cmlldmUgbWVzc2FnZSB0ZXh0IGJvZHkKICAkTXNnVHh0ID0gJElNQVAtPmZldGNoKCRNc2dJZCwgImJvZHlbJE1zZ1BhcnRdIiktPnskTXNnSWR9LT57Ym9keX07CgogICRJTUFQLT5sb2dvdXQoKTsKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgY29tbXVuaWNhdGVzIHdpdGggYW4gSU1BUCBzZXJ2ZXIuIEVhY2ggSU1BUCBzZXJ2ZXIgY29tbWFuZAppcyBtYXBwZWQgdG8gYSBtZXRob2Qgb2YgdGhpcyBvYmplY3QuCgpBbHRob3VnaCBvdGhlciBJTUFQIG1vZHVsZXMgZXhpc3Qgb24gQ1BBTiwgdGhpcyBoYXMgc2V2ZXJhbCBhZHZhbnRhZ2VzCm92ZXIgb3RoZXIgbW9kdWxlcy4KCj1vdmVyIDQKCj1pdGVtICoKCkl0IHBhcnNlcyB0aGUgbW9yZSBjb21wbGV4IElNQVAgc3RydWN0dXJlcyBsaWtlIGVudmVsb3BlcyBhbmQgYm9keQpzdHJ1Y3R1cmVzIGludG8gbmljZSBQRVJMIGRhdGEgc3RydWN0dXJlcwoKPWl0ZW0gKgoKSXQgY29ycmVjdGx5IHN1cHBvcnRzIGF0b21zLCBxdW90ZWQgc3RyaW5ncyBhbmQgbGl0ZXJhbHMgYXQgYW55CnBvaW50LiBTb21lIHBhcnNlcnMgaW4gb3RoZXIgbW9kdWxlcyBhcmVuJ3QgZnVsbHkgSU1BUCBjb21wYXRpYWJsZQphbmQgbWF5IGJyZWFrIGF0IG9kZCB0aW1lcyB3aXRoIGNlcnRhaW4gbWVzc2FnZXMgb24gc29tZSBzZXJ2ZXJzCgo9aXRlbSAqCgpJdCBhbGxvd3MgbGFyZ2UgcmV0dXJuIHZhbHVlcyAoZWcuIGF0dGFjaG1lbnRzIG9uIGEgbWVzc2FnZSkKdG8gYmUgcmVhZCBkaXJlY3RseSBpbnRvIGEgZmlsZSwgcmF0aGVyIHRoYW4gaW50byBtZW1vcnkuCgo9aXRlbSAqCgpJdCBpbmNsdWRlcyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gZmluZCB0aGUgYWN0dWFsIHRleHQvcGxhaW4Kb3IgdGV4dC9odG1sIHBhcnQgb2YgYSBtZXNzYWdlIG91dCBvZiBhIGNvbXBsZXggTUlNRSBzdHJ1Y3R1cmUuCkl0IGFsc28gY2FuIGZpbmQgYSBsaXN0IG9mIGF0dGFjaGVtZW50cywgYW5kIENJRCBsaW5rcyBmb3IgSFRNTAptZXNzYWdlcyB3aXRoIGF0dGFjaGVkIGltYWdlcwoKPWl0ZW0gKgoKSXQgc3VwcG9ydHMgZGVjb2Rpbmcgb2YgTUlNRSBoZWFkZXJzIHRvIHBlcmwgdXRmLTggc3RyaW5ncyBhdXRvbWF0aWNhbGx5LApzbyB5b3UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggTUlNRSBlbmNvZGVkIGhlYWRlcnMgKGVuYWJsZWQgb3B0aW9uYWxseSkKCj1iYWNrCgpXaGlsZSB0aGUgSU1BUCBwcm90b2NvbCBkb2VzIGFsbG93IGZvciBhc3luY2hyb25vdXMgcnVubmluZyBvZiBjb21tYW5kcywgdGhpcwptb2R1bGUgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBhIHN5bmNocm9ub3VzIG1hbm5lci4gVGhhdCBpcywgeW91IGlzc3VlIGEKY29tbWFuZCBieSBjYWxsaW5nIGEgbWV0aG9kLCBhbmQgdGhlIGNvbW1hbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgYXBwcm9wcmlhdGUKcmVzcG9uc2UgaXMgcmV0dXJuZWQuIFRoZSBtZXRob2Qgd2lsbCB0aGVuIHJldHVybiB0aGUgcGFyc2VkIHJlc3VsdHMgZnJvbQp0aGUgZ2l2ZW4gY29tbWFuZC4KCj1jdXQKCiMgRXhwb3J0IHt7ewpyZXF1aXJlIEV4cG9ydGVyOwpASVNBID0gcXcoRXhwb3J0ZXIpOwolRVhQT1JUX1RBR1MgPSAoCiAgRGVmYXVsdCA9PiBbIHF3KGdldF9ib2R5X3BhcnQgZmluZF9tZXNzYWdlIGJ1aWxkX2NpZF9tYXApIF0KKTsKRXhwb3J0ZXI6OmV4cG9ydF9va190YWdzKCdEZWZhdWx0Jyk7CgpzdWIgaW1wb3J0IHsKICAjIFRlc3QgZm9yIHNwZWNpYWwgY2FzZSBpZiBuZWVkIFVURjggc3VwcG9ydAogIG91ciAkQWxyZWFkeUxvYWRlZEVuY29kZTsKICBpZiAoQF8+MSAmJiAkX1sxXSAmJiAkX1sxXSBlcSAnOnV0ZjhzdXBwb3J0JykgewogICAgc3BsaWNlIEBfLCAxLCAxOwogICAgaWYgKCEkQWxyZWFkeUxvYWRlZEVuY29kZSkgewogICAgICBldmFsICJ1c2UgRW5jb2RlIHF3KGRlY29kZSk7IjsKICAgICAgJEFscmVhZHlMb2FkZWRFbmNvZGUgPSAxOwogICAgfQogIH0KCiAgZ290byAmRXhwb3J0ZXI6OmltcG9ydDsKfQoKb3VyICRWRVJTSU9OID0gJzEuMDInOwojIH19fQoKIyBVc2UgbW9kdWxlcyB7e3sKdXNlIEZjbnRsIHF3KDpERUZBVUxUKTsKdXNlIFNvY2tldDsKdXNlIElPOjpTZWxlY3Q7CnVzZSBJTzo6SGFuZGxlOwp1c2UgSU86OlNvY2tldDsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIHN0cmljdDsKIyB9fX0KCj1oZWFkMSBDTEFTUyBPVkVSVklFVwoKVGhlIG9iamVjdCBtZXRob2RzIGhhdmUgYmVlbiBicm9rZW4gaW4gc2V2ZXJhbCBzZWN0aW9ucy4KCj1oZWFkMiBTZWN0aW9ucwoKPW92ZXIgNAoKPWl0ZW0gQ09OU1RBTlRTCgpMaXN0cyB0aGUgYXZhaWxhYmxlIGNvbnN0YW50cyB0aGUgY2xhc3MgdXNlcwoKPWl0ZW0gQ09OU1RSVUNUT1IKCkV4cGxhaW5zIGFsbCB0aGUgb3B0aW9ucyBhdmFpbGFibGUgd2hlbiBjb25zdHJ1Y3RpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCkM8TWFpbDo6SU1BUFRhbGs+IGNsYXNzCgo9aXRlbSBDT05ORUNUSU9OIENPTlRST0wgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgd2hpY2ggY29udHJvbCB0aGUgb3ZlcmFsbCBJTUFQIGNvbm5lY3Rpb24gb2JqZWN0LCBzdWNoCmFzIGxvZ2dpbmcgaW4gYW5kIGxvZ2dpbmcgb3V0LCBob3cgcmVzdWx0cyBhcmUgcGFyc2VkLCBob3cgZm9sZGVyIG5hbWVzIGFuZAptZXNzYWdlIGlkJ3MgYXJlIHRyZWF0ZWQsIGV0Yy4KCj1pdGVtIElNQVAgRk9MREVSIENPTU1BTkQgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgdG8gaW5zcGVjdCwgYWRkLCBkZWxldGUgYW5kIHJlbmFtZSBJTUFQIGZvbGRlcnMgb24gdGhlIHNlcnZlcgoKPWl0ZW0gSU1BUCBNRVNTQUdFIENPTU1BTkQgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgdG8gcmV0cmlldmUsIGRlbGV0ZSwgbW92ZSBhbmQgYWRkIG1lc3NhZ2VzIHRvL2Zyb20gSU1BUCBmb2xkZXJzCgo9aXRlbSBIRUxQRVIgTUVUSE9EUwoKVGhlc2UgYXJlIGV4dHJhIG1ldGhvZHMgdGhhdCB1c2VycyBvZiB0aGlzIGNsYXNzIG1pZ2h0IGZpbmQgdXNlZnVsLiBUaGV5CmdlbmVyYWxseSBkbyBleHRyYSBwYXJzaW5nIG9uIHJldHVybmVkIHN0cnVjdHVyZXMgdG8gcHJvdmlkZSBoaWdoZXIKbGV2ZWwgZnVuY3Rpb25hbGl0eS4KCj1pdGVtIElOVEVSTkFMIE1FVEhPRFMKClRoZXNlIGFyZSBtZXRob2RzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQzxNYWlsOjpJTUFQVGFsaz4gb2JqZWN0IHRvIGdldCB3b3JrCmRvbmUuIFRoZXkgbWF5IGJlIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byBleHRlbmQgdGhlIGNsYXNzIHlvdXJzZWxmLiBOb3RlIHRoYXQKaW50ZXJuYWwgbWV0aG9kcyB3aWxsIGFsd2F5cyAnZGllJyBpZiB0aGV5IGVuY291bnRlciBhbnkgZXJyb3JzLgoKPWl0ZW0gSU5URVJOQUwgU09DS0VUIEZVTkNUSU9OUwoKVGhlc2UgYXJlIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEM8TWFpbDo6SU1BUFRhbGs+IG9iamVjdCAKdG8gcmVhZC93cml0ZSBkYXRhIHRvL2Zyb20gdGhlIElNQVAgY29ubmVjdGlvbiBzb2NrZXQuIFRoZSBjbGFzcyBkb2VzCml0J3Mgb3duIGJ1ZmZlcmluZyBzbyBpZiB5b3Ugd2FudCB0byByZWFkL3dyaXRlIHRvIHRoZSBJTUFQIHNvY2tldCwgeW91CnNob3VsZCB1c2UgdGhlc2UgZnVuY3Rpb25zLgoKPWl0ZW0gSU5URVJOQUwgUEFSU0lORyBGVU5DVElPTlMKClRoZXNlIGFyZSBmdW5jdGlvbnMgdXNlZCB0byBwYXJzZSB0aGUgcmVzdWx0cyByZXR1cm5lZCBmcm9tIHRoZSBJTUFQIHNlcnZlcgppbnRvIHBlcmwgc3R5bGUgZGF0YSBzdHJ1Y3R1cmVzLgoKPWJhY2sKCj1oZWFkMiBNZXRob2QgcmVzdWx0cwoKQWxsIG1ldGhvZHMgcmV0dXJuIHVuZGVmIG9uIGZhaWx1cmUuIFRoZXJlIGFyZSBmb3VyIG1haW4gbW9kZXMgb2YgZmFpbHVyZToKCj1vdmVyIDQKCj1pdGVtIDEuIEFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcvd3JpdGluZyB0byBhIHNvY2tldC4gTWF5YmUgdGhlIHNlcnZlcgpjbG9zZWQgaXQsIG9yIHlvdSdyZSBub3QgY29ubmVjdGVkIHRvIGFueSBzZXJ2ZXIuCgo9aXRlbSAyLiBBbiBlcnJvciBvY2N1cnJlZCBwYXJzaW5nIHRoZSByZXNwb25zZSBvZiBhbiBJTUFQIGNvbW1hbmQuIFRoaXMgaXMKdXN1YWxseSBvbmx5IGEgcHJvYmxlbSBpZiB5b3VyIElNQVAgc2VydmVyIHJldHVybnMgaW52YWxpZCBkYXRhLgoKPWl0ZW0gMy4gQW4gSU1BUCBjb21tYW5kIGRpZG4ndCByZXR1cm4gYW4gJ09LJyByZXNwb25zZS4KCj1pdGVtIDQuIFRoZSBzb2NrZXQgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbQp0aGUgc2VydmVyLgoKPWJhY2sKCkluIGVhY2ggY2FzZSwgc29tZSByZWFkYWJsZSBmb3JtIG9mIGVycm9yIHRleHQgaXMgcGxhY2VkIGluICRALCBvciB5b3UKY2FuIGNhbGwgdGhlIEM8Z2V0X2xhc3RfZXJyb3IoKT4gbWV0aG9kLiBGb3IgY29tbWFuZHMgd2hpY2ggcmV0dXJuCnJlc3BvbnNlcyAoZWcgZmV0Y2gsIGdldGFjbCwgZXRjKSwgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC4gU2VlIGVhY2gKY29tbWFuZCBmb3IgZGV0YWlscyBvZiB0aGUgcmVzcG9uc2UgcmVzdWx0LiBGb3IgY29tbWFuZHMKd2l0aCBubyByZXNwb25zZSBidXQgd2hpY2ggc3VjY2VlZCAoZWcgc2V0YWNsLCByZW5hbWUsIGV0YykgdGhlIHJlc3VsdAonb2snIGlzIGdlbmVyYWxseSByZXR1cm5lZC4KCj1oZWFkMiBNZXRob2QgcGFyYW1ldGVycwoKQWxsIG1ldGhvZHMgd2hpY2ggc2VuZCBkYXRhIHRvIHRoZSBJTUFQIHNlcnZlciAoZWcuIEM8ZmV0Y2goKT4sIEM8c2VhcmNoKCk+LApldGMpIGhhdmUgdGhlaXIgYXJndW1lbnRzIHByb2Nlc3NlZCBiZWZvcmUgdGhleSBhcmUgc2VudC4gQXJndW1lbnRzIG1heSBiZQpzcGVjaWZpZWQgaW4gc2V2ZXJhbCB3YXlzOgoKPW92ZXIgNAoKPWl0ZW0gQjxzY2FsYXI+CgpUaGUgdmFsdWUgaXMgZmlyc3QgY2hlY2tlZCBhbmQgcXVvdGVkIGlmIHJlcXVpcmVkLiBWYWx1ZXMgY29udGFpbmluZwpbXDAwMFwwMTJcMDE1XSBhcmUgdHVybmVkIGludG8gbGl0ZXJhbHMsIHZhbHVlcyBjb250YWluaW5nCltcMDAwLVwwNDBce1x9IFwlXCpcIl0gYXJlIHF1b3RlZCBieSBzdXJyb3VuZGluZyB3aXRoIGEgIi4uLiIgcGFpcgooYW55ICIgdGhlbXNlbHZlcyBhcmUgdHVybmVkIGludG8gXCIpLgoKPWl0ZW0gQjxmaWxlIHJlZj4KClRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpcyBzZW50IGFzIGFuIElNQVAgbGl0ZXJhbC4gTm90ZSB0aGF0CmJlY2F1c2UgSU1BUFRhbGsgaGFzIHRvIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBiZWluZyBzZW50LAp0aGlzIG11c3QgYmUgYSB0cnVlIGZpbGUgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHNlZWtlZCBhbmQgbm90Cmp1c3Qgc29tZSBzdHJlYW0uIFRoZSBlbnRpcmUgZmlsZSB3aWxsIGJlIHNlbnQgcmVnYXJkbGVzcyBvZiB0aGUKY3VycmVudCBzZWVrIHBvaW50LgoKPWl0ZW0gQjxhcnJheSByZWY+CgpUaGUgYXJyYXkgcmVmZXJlbmNlIHNob3VsZCBjb250YWluIG9ubHkgMiBpdGVtcy4gVGhlIGZpcnN0IGl0ZW0gaXMgYSB0ZXh0CnN0cmluZyB3aGljaCBzcGVjaWZpZXMgd2hhdCB0byBkbyB3aXRoIHRoZSBzZWNvbmQgaXRlbSBvZiB0aGUgYXJyYXkgcmVmCgo9b3ZlciA0Cgo9aXRlbSAqICdMaXRlcmFsJwoKVGhlIHN0cmluZy9kYXRhIGluIHRoZSBzZWNvbmQgaXRlbSBzaG91bGQgYmUgc2VudCBhcyBhbiBJTUFQIGxpdGVyYWwKcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsbHkgZGF0YSBpbiB0aGUgc3RyaW5nL2RhdGEKCj1pdGVtICogJ05vUXVvdGUnCgpUaGUgc3RyaW5nL2RhdGEgaW4gdGhlIHNlY29uZCBpdGVtIHNob3VsZCBiZSBzZW50IGFzIGlzLCBubyBxdW90aW5nIHdpbGwKb2NjdXIsIGFuZCB0aGUgZGF0YSB3b24ndCBiZSBzZW50IGFzIHF1b3RlZCBvciBhcyBhIGxpdGVyYWwgcmVnYXJkbGVzcwpvZiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZy9kYXRhLgoKRXhhbXBsZXM6CiAgICAjIFBhc3N3b3JkIGlzIGF1dG9tYXRpY2FsbHkgcXVvdGVkIHRvICJuYXN0eSUqXCJwYXNzd2QiCiAgICAkSU1BUC0+bG9naW4oImpvZSIsICduYXN0eSUqInBhc3N3ZCcpOwogICAgIyBBcHBlbmQgJE1zZ1R4dCBhcyBzdHJpbmcKICAgICRJTUFQLT5hcHBlbmQoImluYm94IiwgWyAnTGl0ZXJhbCcsICRNc2dUeHQgXSkKICAgICMgQXBwZW5kIE1TR0ZJTEUgY29udGVudHMgYXMgbmV3IG1lc3NhZ2UKICAgICRJTUFQLT5hcHBlbmQoImluYm94IiwgXCpNU0dGSUxFIF0pCgo9YmFjawoKPWJhY2sKCj1jdXQKCj1oZWFkMSBDT05TVEFOVFMKClRoZXNlIGNvbnN0YW50cyByZWxhdGUgdG8gdGhlIHN0YW5kYXJkIDQgc3RhdGVzIHRoYXQgYW4gSU1BUCBjb25uZWN0aW9uIGNhbgpiZSBpbi4gVGhleSBhcmUgcGFzc2VkIGFuZCByZXR1cm5lZCBmcm9tIHRoZSBDPHN0YXRlKCk+IG1ldGhvZC4gU2VlIFJGQzIwNjAKZm9yIG1vcmUgZGV0YWlscyBhYm91dCBJTUFQIGNvbm5lY3Rpb24gc3RhdGVzLgoKPW92ZXIgNAoKPWl0ZW0gSTxVbmNvbm5lY3RlZD4KCkN1cnJlbnQgbm90IGNvbm5lY3RlZCB0byBhbnkgc2VydmVyCgo9aXRlbSBJPENvbm5lY3RlZD4KCkNvbm5lY3RlZCB0byBhIHNlcnZlciwgYnV0IG5vdCBsb2dnZWQgaW4KCj1pdGVtIEk8QXV0aGVudGljYXRlZD4KCkNvbm5lY3RlZCBhbmQgbG9nZ2VkIGludG8gYSBzZXJ2ZXIsIGJ1dCBub3QgY3VycmVudCBmb2xkZXIKCj1pdGVtIEk8U2VsZWN0ZWQ+CgpDb25uZWN0ZWQsIGxvZ2dlZCBpbiBhbmQgaGF2ZSAnc2VsZWN0J2VkIGEgY3VycmVudCBmb2xkZXIKCj1iYWNrCgo9Y3V0CgojIENvbnN0YW50cyBmb3IgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGUgY29ubmVjdGlvbiBjYW4gYmUgaW4ge3t7CiMgT2JqZWN0IG5vdCBjb25uZWN0ZWQKdXNlIGNvbnN0YW50IFVuY29ubmVjdGVkID0+IDA7CiMgY29ubmVjdGVkOyBub3QgbG9nZ2VkIGluCnVzZSBjb25zdGFudCBDb25uZWN0ZWQgPT4gMTsKIyBsb2dnZWQgaW47IG5vIG1haWxib3ggc2VsZWN0ZWQKdXNlIGNvbnN0YW50IEF1dGhlbnRpY2F0ZWQgPT4gMjsKIyBtYWlsYm94IHNlbGVjdGVkCnVzZSBjb25zdGFudCBTZWxlY3RlZCA9PiAzOwoKIyBXaGF0IGEgbGluayBicmVhayBpcyBvbiB0aGUgbmV0d29yayBjb25uZWN0aW9uCnVzZSBjb25zdGFudCBMQiA9PiAiXDAxNVwwMTIiOwoKIyBSZWdleHBzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGhlYWRlciBpcyBNSU1FIGVuY29kZWQKbXkgJFJGQzE1MjJUb2tlbiA9IHFyL1teXHgwMC1ceDFmXChcKVw8XD5cQFwsXDtcOlwiXC9cW1xdXD9cLlw9XCBdKy87Cm15ICROZWVkRGVjb2RlVVRGOFJlZ2V4cCA9IHFyLz1cPyRSRkMxNTIyVG9rZW5cPyRSRkMxNTIyVG9rZW5cP1teXD9dKlw/PS87CgojIH19fQoKPWhlYWQxIENPTlNUUlVDVE9SCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBJPDwgTWFpbDo6SU1BUFRhbGstbmV3KCVPcHRpb25zKSA+PgoKQ3JlYXRlcyBuZXcgTWFpbDo6SU1BUFRhbGsgb2JqZWN0LiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZC4KCj1pdGVtIEI8Q29ubmVjdGlvbiBPcHRpb25zPgoKPW92ZXIgNAoKPWl0ZW0gQjxTZXJ2ZXI+CgpUaGUgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcyB0byBjb25uZWN0IHRvLiBUaGlzIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzCnRoZSBCPFNvY2tldD4gb3B0aW9uIGlzIHN1cHBsaWVkLgoKPWl0ZW0gQjxQb3J0PgoKVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBob3N0IHRvIGNvbm5lY3QgdG8uIERlZmF1bHRzIHRvIDE0MyBpZiBub3Qgc3VwcGxpZWQuCgo9aXRlbSBCPFNvY2tldD4KCkFuIGV4aXN0aW5nIHNvY2tldCB0byB1c2UgYXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIElNQVAgc2VydmVyLiBJZiB5b3UKc3VwcGx5IHRoZSBCPFNvY2tldD4gb3B0aW9uLCB5b3Ugc2hvdWxkIG5vdCBzdXBwbHkgYSBCPFNlcnZlcj4gb3IgQjxQb3J0PgpvcHRpb24uCgpUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYW4gU1NMIHNvY2tldCBjb25uZWN0aW9uIHVzaW5nCklPOjpTb2NrZXQ6OlNTTCBhbmQgdGhlbiBwYXNzIGluIHRoZSBjb25uZWN0ZWQgc29ja2V0IHRvIHRoZSBuZXcoKSBjYWxsLgoKSXQncyBhbHNvIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDPHJlbGVhc2Vfc29ja2V0KCk+IG1ldGhvZApkZXNjcmliZWQgYmVsb3cgZm9yIHJldXNpbmcgdGhlIHNhbWUgc29ja2V0IGJleW9uZCB0aGUgbGlmZXRpbWUgb2YgdGhlIElNQVBUYWxrCm9iamVjdC4gU2VlIGEgZGVzY3JpcHRpb24gaW4gdGhlIHNlY3Rpb24gQzxyZWxlYXNlX3NvY2tldCgpPiBtZXRob2QgZm9yCm1vcmUgaW5mb3JtYXRpb24uCgpZb3UgbXVzdCBoYXZlIHdyaXRlIGZsdXNoaW5nIGVuYWJsZWQgZm9yIGFueQpzb2NrZXQgeW91IHBhc3MgaW4gaGVyZSBzbyB0aGF0IGNvbW1hbmRzIHdpbGwgYWN0dWFsbHkgYmUgc2VudCwKYW5kIHJlc3BvbnNlcyByZWNlaXZlZCwgcmF0aGVyIHRoYW4ganVzdCB3YWl0aW5nIGFuZCBldmVudHVhbGx5CnRpbWluZyBvdXQuIHlvdSBjYW4gZG8gdGhpcyB1c2luZyB0aGUgcGVybCBDPHNlbGVjdCgpPiBjYWxsIGFuZAokfCB2YXJpYWJsZSBhcyBzaG93biBiZWxvdy4KCiAgbXkgJG9maCA9IHNlbGVjdCgkU29ja2V0KTsgJHwgPSAxOyBzZWxlY3QgKCRvZmgpOwoKPWl0ZW0gQjxTdGF0ZT4KCklmIHlvdSBzdXBwbHkgYSBDPFNvY2tldD4gb3B0aW9uLCB5b3UgY2FuIHNwZWNpZnkgdGhlIElNQVAgc3RhdGUgdGhlCnNvY2tldCBpcyBjdXJyZW50bHkgaW4sIG5hbWVseSBvbmUgb2YgJ1VuY29ubmVjdGVkJywgJ0Nvbm5lY3RlZCcsCidBdXRoZW50aWNhdGVkJyBvciAnU2VsZWN0ZWQnLiBUaGlzIGRlZmF1bHRzIHRvICdDb25uZWN0ZWQnIGlmIG5vdApzdXBwbGllZCBhbmQgdGhlIEM8U29ja2V0PiBvcHRpb24gaXMgc3VwcGxpZWQuCgo9aXRlbSBCPEV4cGVjdEdyZWV0aW5nPgoKSWYgc3VwcGxpZWQgYW5kIHRydWUsIGFuZCBhIHNvY2tldCBpcyBzdXBwbGllZCB2aWEgdGhlIEM8U29ja2V0PgpvcHRpb24sIGNoZWNrcyB0aGF0IGEgZ3JlZXRpbmcgbGluZSBpcyBzdXBwbGllZCBieSB0aGUgc2VydmVyCmFuZCByZWFkcyB0aGUgZ3JlZXRpbmcgbGluZS4KCj1iYWNrCgo9aXRlbSBCPExvZ2luIE9wdGlvbnM+Cgo9b3ZlciA0Cgo9aXRlbSBCPFVzZXJuYW1lPgoKVGhlIHVzZXJuYW1lIHRvIGNvbm5lY3QgdG8gdGhlIElNQVAgc2VydmVyIGFzLiBJZiBub3Qgc3VwcGxpZWQsIG5vIGxvZ2luCmlzIGF0dGVtcHRlZCBhbmQgdGhlIElNQVAgb2JqZWN0IGlzIGxlZnQgaW4gdGhlIEI8Q09OTkVDVEVEPiBzdGF0ZS4KSWYgc3VwcGxpZWQsIHlvdSBtdXN0IGFsc28gc3VwcGx5IHRoZSBCPFBhc3N3b3JkPiBvcHRpb24gYW5kIGEgbG9naW4KaXMgYXR0ZW1wdGVkLiBJZiB0aGUgbG9naW4gZmFpbHMsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQgQjx1bmRlZj4KaXMgcmV0dXJuZWQuIElmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIGEgY29ubmVjdGlvbiBldmVuIGlmIHRoZQpsb2dpbiBmYWlscywgZG9uJ3QgcGFzcyBhIEI8VXNlcm5hbWU+IG9wdGlvbiwgYnV0IGluc3RlYWQgdXNlIHRoZSBCPGxvZ2luPgptZXRob2QgZGVzY3JpYmVkIGJlbG93LgoKPWl0ZW0gQjxQYXNzd29yZD4KClRoZSBwYXNzd29yZCB0byB1c2UgdG8gbG9naW4gdG8gdGhlIGFjY291bnQuCgo9YmFjawoKPWl0ZW0gQjxJTUFQIG1lc3NhZ2UvZm9sZGVyIG9wdGlvbnM+Cgo9b3ZlciA0Cgo9aXRlbSBCPFVpZD4KCkNvbnRyb2wgd2hldGhlciBtZXNzYWdlIGlkcyBhcmUgbWVzc2FnZSB1aWRzIG9yIG5vdC4gVGhpcyBpcyAxIChvbikgYnkKZGVmYXVsdCBiZWNhdXNlIGdlbmVyYWxseSB0aGF0J3MgaG93IG1vc3QgcGVvcGxlIHdhbnQgdG8gdXNlIGl0LiBUaGlzIGFmZmVjdHMKbW9zdCBjb21tYW5kcyB0aGF0IHJlcXVpcmUvdXNlL3JldHVybiBtZXNzYWdlIGlkcyAoZWcuIEI8ZmV0Y2g+LCBCPHNlYXJjaD4sCkI8c29ydD4sIGV0YykgCgo9aXRlbSBCPFJvb3RGb2xkZXI+CgpJZiBzdXBwbGllZCwgc2V0cyB0aGUgcm9vdCBmb2xkZXIgcHJlZml4LiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKQzxzZXRfcm9vdF9mb2xkZXIoKT4gd2l0aCB0aGUgdmFsdWUgcGFzc2VkLiBJZiBubyB2YWx1ZSBpcyBzdXBwbGllZCwKQzxzZXRfcm9vdF9mb2xkZXIoKT4gaXMgY2FsbGVkIHdpdGggbm8gdmFsdWUuIFNlZSB0aGUgQzxzZXRfcm9vdF9mb2xkZXIoKT4KbWV0aG9kIGZvciBtb3JlIGRldGFpbHMuCgo9aXRlbSBCPFNlcGFyYXRvcj4KCklmIHN1cHBsaWVkLCBzZXRzIHRoZSBmb2xkZXIgbmFtZSB0ZXh0IHN0cmluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLiAKUGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBDPHNldF9yb290X2ZvbGRlcigpPiBtZXRob2QuCgo9aXRlbSBCPENhc2VJbnNlbnNpdGl2ZT4KCklmIHN1cHBsaWVkLCBwYXNzZWQgYWxvbmcgd2l0aCBSb290Rm9sZGVyIHRvIHRoZSBDPHNldF9yb290X2ZvbGRlcigpPgptZXRob2QuCgo9aXRlbSBCPEFsdFJvb3RGb2xkZXI+CgpJZiBzdXBwbGllZCwgcGFzc2VkIGFsb25nIHdpdGggUm9vdEZvbGRlciB0byB0aGUgQzxzZXRfcm9vdF9mb2xkZXIoKT4KbWV0aG9kLgoKPWJhY2sKCj1pdGVtIEI8RXhhbXBsZXM+CgogICRpbWFwID0gTWFpbDo6SU1BUFRhbGstPm5ldygKICAgICAgICAgICAgU2VydmVyID0+ICdmb28uY29tJywKICAgICAgICAgICAgUG9ydCA9PiAxNDMsCiAgICAgICAgICAgIFVzZXJuYW1lID0+ICdqb2VibG9nZ3MnLAogICAgICAgICAgICBQYXNzd29yZCA9PiAnbXlwYXNzd29yZCcsCiAgICAgICAgICAgIFNlcGFyYXRvciA9PiAnLicsCiAgICAgICAgICAgIFJvb3RGb2xkZXIgPT4gJ2luYm94JywKICAgICAgICAgICAgQ2FzZUluc2Vuc2l0aXZlID0+IDEpCiAgICAgICAgICB8fCBkaWUgIkNvbm5lY3Rpb24gdG8gZm9vLmNvbSBmYWlsZWQuIFJlYXNvbjogJEAiOwoKICAkaW1hcCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFNvY2tldCA9PiAkU1NMU29ja2V0LAogICAgICAgICAgICBTdGF0ZSA9PiBNYWlsOjpJTUFQVGFsa