WebMail 0.10.2 OTRS GmbH http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Fixed html formating problem in compose email mask. upgrade to 2.1.x fixed wrong formated mail body moved to xml config file added nb_NO translation, thanks to Espen Stefansen! added spell checker, some small fixes Navigation bar updated New package A web mail (IMAP) program. Ein Web Email (IMAP) Programm. 2.1.x 2008-02-17 17:34: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== cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0dlbGVzZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5yZWFkJ30gPSAnVW5nZWxlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZvbGRlcid9ID0gJ09yZG5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ05hY2hyaWNodGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IFRyYXNoJ30gPSAnUGFwaWVya29yYiBsZWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnTmV1ZSBOYWNocmljaHQgdmVyZmFzc2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnSW5ib3gg3GJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhbiBlbWFpbCEnfSA9ICdFaW5lIEVtYWlsIHN1Y2hlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdBbnR3b3J0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHkgQWxsJ30gPSAnQW50d29ydGVuIGFuIGFsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5ib3gnfSA9ICdFaW5nYW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jyd9ID0gJyc7CgogICAgIyAkJFNUT1AkJAp9CjE7Cgo= cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0xlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbnJlYWQnfSA9ICdVbGVzdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb2xkZXInfSA9ICdNYXBwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ0Jlc2tqZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgVHJhc2gnfSA9ICdQYXBpcmt1cnYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnU2tyaXYgbnkgZS1wb3N0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnT3ZlcnNpa3Qgb3ZlciBJbm5ib2tzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhIGVtYWlsISd9ID0gJ1P4ayBpIGUtcG9zdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdTdmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGx5IEFsbCd9ID0gJ1N2YXIgYWxsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCd9ID0gJ0lubmJva3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJ30gPSAnJzsKCiAgICAjICQkU1RPUCQkCn0KMTsKCg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50V2ViTWFpbC5wbSAtIHByb3ZpZGVzIGEgbWFpbCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRXZWJNYWlsLnBtLHYgMS4xMyAyMDA2LzEwLzE3IDIwOjQ5OjI4IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0Owp1c2UgTWFpbDo6SU1BUFRhbGs7CnVzZSBNYWlsOjpBZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZWFyY2hQcm9maWxlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJF8hIiBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VhcmNoUHJvZmlsZS0+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+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgPT4gXCVGb2xkZXJzLAogICAgICAgIE5hbWUgPT4gJ0ZvbGRlcicsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Rm9sZGVyfSwKICAgICk7CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNvbXBvc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb21wb3NlJykgewogICAgICAgIG15ICVFcnJvciA9ICgpOwogICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgIGZvcmVhY2ggKHF3KFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgU2VuZCBJblJlcGx5VG8gRm9ybUlEIEF0dGFjaG1lbnRVcGxvYWQgTWVzc2FnZQogICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTApKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+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+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsiJF8gaW52YWxpZCJ9IC49ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvciB8fCAhJEdldFBhcmFte1NlbmR9KSB7CiAgICAgICAgICAgICMgY29tcG9zZSBibG9jawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ29tcG9zZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlR2V0UGFyYW0sICVFcnJvciwgRnJvbSA9PiAkU2VsZi0+e1VzZXJGcm9tfSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJERhdGFSZWYgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIHNob3cgcGFnZQogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ0NvbXBvc2UnKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRXZWJNYWlsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAgICAgcHVzaCAoQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIGFkZCBtYWlsIGZvb3RlcgogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWlsRm9vdGVyfSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICJcbiIuJFNlbGYtPntNYWlsRm9vdGVyfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZW5kIGVtYWlsCiAgICAgICAgICAgIG15ICgkSGVhZGVyLCAkQm9keSkgPSAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICAgICAgICAgIEZyb20gPT4gJFNlbGYtPntVc2VyRnJvbX0sCiAgICAgICAgICAgICAgICBUbyA9PiAkR2V0UGFyYW17VG99IHx8ICcnLAogICAgICAgICAgICAgICAgQ2MgPT4gJEdldFBhcmFte0NjfSB8fCAnJywKICAgICAgICAgICAgICAgIEJjYyA9PiAkR2V0UGFyYW17QmNjfSB8fCAnJywKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIEJvZHkgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhcHBlbmQgbWVzc2FnZSB0byBzZW50IGJveAogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICR7JEhlYWRlcn0uIlxuIi4keyRCb2R5fTsKICAgICAgICAgICAgJElNQVAtPmFwcGVuZCgkU2VsZi0+e1NlbnRGb2xkZXJ9LCBbJ0xpdGVyYWwnLCAkTWVzc2FnZV0pOwoKICAgICAgICAgICAgIyBzdG9yZSBhbnN3ZXJlZAogICAgICAgICAgICBpZiAoJEdldFBhcmFte01lc3NhZ2V9ICYmICRQYXJhbXtGb2xkZXJ9KSB7CiAgICAgICAgICAgICAgICAkSU1BUC0+c2VsZWN0KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkR2V0UGFyYW17TWVzc2FnZX0sICcrZmxhZ3MnLCAnKFxcQW5zd2VyZWQpJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSk7CiAgICAgICAgfQogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBleHB1bmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXhwdW5nZScpIHsKICAgICAgICAjIGNoZWNrIHRyYXNoIGZvbGRlcgogICAgICAgIGlmICghJElNQVAtPnNlbGVjdCgkU2VsZi0+e1RyYXNoRm9sZGVyfSkpIHsKICAgICAgICAgICAgJElNQVAtPmNyZWF0ZSgkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFNlbGYtPntUcmFzaEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICBteSAkTnVtID0gJElNQVAtPmdldF9yZXNwb25zZV9jb2RlKCdleGlzdHMnKTsKICAgICAgICBpZiAoJE51bSkgewogICAgICAgICAgICBteSAkUmVzID0gJElNQVAtPmZldGNoKCIxOiROdW0iLCAnKGVudmVsb3BlKScpOwogICAgICAgICAgICBpZiAoJElNQVAtPmdldF9sYXN0X2Vycm9yKCkpIHsKICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiRVJST1IgJFBhcmFte0ZvbGRlcn0gIi4kSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKS4iXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoa2V5cyAleyRSZXN9KSB7CiAgICAgICAgICAgICAgICAgICAgJElNQVAtPnN0b3JlKCRNZXNzYWdlLCAnK2ZsYWdzJywgJyhcXGRlbGV0ZWQpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSU1BUC0+ZXhwdW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScpIHsKICAgICAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTWVzc2FnZScpIHx8ICcnOwogICAgICAgICMgY2hlY2sgdHJhc2ggZm9sZGVyCiAgICAgICAgaWYgKCEkSU1BUC0+c2VsZWN0KCRTZWxmLT57VHJhc2hGb2xkZXJ9KSkgewogICAgICAgICAgICAkSU1BUC0+Y3JlYXRlKCRTZWxmLT57VHJhc2hGb2xkZXJ9KTsKICAgICAgICB9CiAgICAgICAgIyBjb3B5IGFuZCBkZWxldGUgb2xkIG1lc3NhZ2UKICAgICAgICAkSU1BUC0+c2VsZWN0KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICAkSU1BUC0+Y29weSgkTWVzc2FnZSwgJFNlbGYtPntUcmFzaEZvbGRlcn0pOwogICAgICAgICRJTUFQLT5zdG9yZSgkTWVzc2FnZSwgJytmbGFncycsICcoXFxkZWxldGVkKScpOwogICAgICAgICRJTUFQLT5leHB1bmdlKCk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYnVsawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0J1bGsnKSB7CiAgICAgICAgbXkgQE1lc3NhZ2UgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoUGFyYW0gPT4gJ01lc3NhZ2VJRCcpOwogICAgICAgIG15ICRSZWFkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdSZWFkJykgfHwgJyc7CiAgICAgICAgbXkgJFVucmVhZCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnVW5yZWFkJykgfHwgJyc7CiAgICAgICAgbXkgJERlbGV0ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRGVsZXRlJykgfHwgJyc7CiAgICAgICAgIyBjaGVjayB0cmFzaCBmb2xkZXIKICAgICAgICBpZiAoISRJTUFQLT5zZWxlY3QoJFNlbGYtPntUcmFzaEZvbGRlcn0pKSB7CiAgICAgICAgICAgICRJTUFQLT5jcmVhdGUoJFNlbGYtPntUcmFzaEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICAjIGRlbGV0ZQogICAgICAgIGlmICgkRGVsZXRlKSB7CiAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICBmb3JlYWNoIChATWVzc2FnZSkgewogICAgICAgICAgICAgICAgIyBjb3B5IGFuZCBkZWxldGUgb2xkIG1lc3NhZ2UKICAgICAgICAgICAgICAgICRJTUFQLT5jb3B5KCRfLCAkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgICAgICAgICAkSU1BUC0+c3RvcmUoJF8sICcrZmxhZ3MnLCAnKFxcZGVsZXRlZCknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkSU1BUC0+ZXhwdW5nZSgpOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFJlYWQpIHsKICAgICAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAkSU1BUC0+c3RvcmUoJF8sICcrZmxhZ3MnLCAnKFxcU2VlbiknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFVucmVhZCkgewogICAgICAgICAgICAkSU1BUC0+c2VsZWN0KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICAgICAgZm9yZWFjaCAoQE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkXywgJy1mbGFncycsICcoXFxTZWVuKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdWaWV3JykgewogICAgICAgIG15ICRQcmludCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpbnQnKSB8fCAnJzsKICAgICAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTWVzc2FnZScpIHx8ICcnOwogICAgICAgIG15ICRTdGFydEhpdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3RhcnRIaXQnKSB8fCAxOwogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICRJTUFQLT5zdG9yZSgkTWVzc2FnZSwgJytmbGFncycsICcoXFxTZWVuKScpOwogICAgICAgIG15IEBBRGF0YSA9ICRJTUFQLT5mZXRjaCgkTWVzc2FnZSwgJ3JmYzgyMicpOwogICAgICAgIG15ICRQbGFpbiA9ICRBRGF0YVswXS0+eyRNZXNzYWdlfS0+eydyZmM4MjInfTsKICAgICAgICBteSBARW1haWwgPSBzcGxpdCgvXG4vLCAkUGxhaW4pOwogICAgICAgIGZvcmVhY2ggKDAuLiQjRW1haWwpIHsKICAgICAgICAgICAgJEVtYWlsWyRfXSAuPSAiXG4iOwogICAgICAgIH0KICAgICAgICBteSAkUGFyc2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgTG9nT2JqZWN0ID0+ICRTZWxmLT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgRW1haWwgPT4gXEBFbWFpbCwKICAgICAgICAgICAgRGVidWcgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgaWYgKCEkUHJpbnQpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZpZXcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgTWVzc2FnZSA9PiAkTWVzc2FnZSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmludCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBNZXNzYWdlID0+ICRNZXNzYWdlLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoIChAeyRTZWxmLT57U2hvd25IZWFkZXJzfX0pIHsKICAgICAgICAgICAgJERhdGF7JF99ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICRfKTsKICAgICAgICAgICAgaWYgKCREYXRheyRffSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBLZXkgPT4gJF8sIFZhbHVlID0+ICREYXRheyRffSwgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oInwnKS8vZzsKICAgICAgICAkRGF0YXtEYXRlfSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnRGF0ZScpOwogICAgICAgIGlmICgkRGF0YXtEYXRlfSkgewogICAgICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0RhdGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRGF0YXtEYXRlTmljZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJEYXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBLZXkgPT4gJ0RhdGUnLCBWYWx1ZSA9PiAkRGF0YXtEYXRlTmljZX0gfHwgJERhdGF7RGF0ZX0sIERhdGUgPT4gJERhdGF7RGF0ZX19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQm9keSA9ICRQYXJzZU9iamVjdC0+R2V0TWVzc2FnZUJvZHkoKTsKICAgICAgICAkQm9keSA9fiBzL1xyLy9nOwogICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSB8fCA4NSwKICAgICAgICAgICAgVGV4dCA9PiAkQm9keSwKICAgICAgICAgICAgVk1heCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgICAgICAjIGxpbmsgcXVvdGluZwogICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFRleHQgPT4gJEJvZHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCb2R5JywKICAgICAgICAgICAgRGF0YSA9PiB7IEJvZHkgPT4gJEJvZHksIH0sCiAgICAgICAgKTsKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkUGFyc2VPYmplY3QtPkdldEF0dGFjaG1lbnRzKCk7CiAgICAgICAgaWYgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yZWFjaCBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCRBdHRhY2htZW50LT57RmlsZXNpemV9LygxMDI0KjEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0gPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCgkQXR0YWNobWVudC0+e0ZpbGVzaXplfS8xMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRBdHRhY2htZW50LT57RmlsZXNpemV9LicgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50Um93TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJ0Rvd25sb2FkJywKICAgICAgICAgICAgICAgICBMaW5rID0+ICJcJEVudntcIkJhc2VsaW5rXCJ9QWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9JlN1YmFjdGlvbj1BdHRhY2htZW50JkZvbGRlcj0kUGFyYW17Rm9sZGVyfSZNZXNzYWdlPSRNZXNzYWdlJkZpbGVJRD0kQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgSW1hZ2UgPT4gJ2Rpc2stcy5wbmcnLAogICAgICAgICAgICAgICAgICAgIFRhcmdldCA9PiAndGFyZ2V0PSJfYmxhbmsiICcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoISRQcmludCkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ01lc3NhZ2UnKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRXZWJNYWlsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKFRpdGxlID0+ICdQcmludCcpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhdHRhY2htZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXR0YWNobWVudCcpIHsKICAgICAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTWVzc2FnZScpIHx8ICcnOwogICAgICAgIG15ICRGaWxlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0ZpbGVJRCcpIHx8ICcnOwogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0sMSk7CiAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRNZXNzYWdlLCAncmZjODIyJyk7CiAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JE1lc3NhZ2V9LT57J3JmYzgyMid9OwogICAgICAgIG15IEBFbWFpbCA9IHNwbGl0KC9cbi8sICRQbGFpbik7CiAgICAgICAgZm9yZWFjaCAoMC4uJCNFbWFpbCkgewogICAgICAgICAgICAkRW1haWxbJF9dIC49ICJcbiI7CiAgICAgICAgfQogICAgICAgIG15ICRQYXJzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICBFbWFpbCA9PiBcQEVtYWlsLAogICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFBhcnNlT2JqZWN0LT5HZXRBdHRhY2htZW50cygpOwogICAgICAgIGlmICgkQXR0YWNobWVudHNbJEZpbGVJRC0xXSkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KCV7JEF0dGFjaG1lbnRzWyRGaWxlSUQtMV19KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZWFyY2gKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnKSB7CiAgICAgICAgbXkgJVNlYXJjaCA9ICgpOwogICAgICAgICMgbG9hZCBsYXN0IHNlYXJjaCBvcHRpb25zCiAgICAgICAgaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJvZmlsZScpKSB7CiAgICAgICAgICAgICVTZWFyY2ggPSAkU2VsZi0+e1NlYXJjaFByb2ZpbGVPYmplY3R9LT5TZWFyY2hQcm9maWxlR2V0KAogICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdXZWJNYWlsU2VhcmNoJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnbGFzdC1zZWFyY2gnLAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVNlYXJjaCB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTZWFyY2gnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRXZWJNYWlsJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzZWFyY2ggcmVzdWx0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoUmVzdWx0JykgewogICAgICAgIG15ICVTZWFyY2ggPSAoKTsKICAgICAgICBteSBAU2VhcmNoUXVlcnkgPSAoKTsKICAgICAgICBteSAkUGFnZVNob3duID0gJFNlbGYtPntQYWdlU2hvd259IHx8IDIwOwogICAgICAgIG15ICRTdGFydEhpdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3RhcnRIaXQnKSB8fCAxOwogICAgICAgICMgZ2V0IHNlYXJjaCBwYXJhbXMKICAgICAgICBmb3JlYWNoIChxdyhGcm9tIFRvIENjIFN1YmplY3QgQm9keSBTb3J0QnkgT3JkZXIpKSB7CiAgICAgICAgICAgICRTZWFyY2h7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICRfKTsKICAgICAgICB9CiAgICAgICAgIyBjaGVjayBpZiBvbGQgcHJvZmlsZSBpcyBuZWVkZWQKICAgICAgICBpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcm9maWxlJykpIHsKICAgICAgICAgICAgbXkgJE9yZGVyID0gJyc7CiAgICAgICAgICAgIG15ICRTb3J0QnkgPSAnJzsKICAgICAgICAgICAgaWYgKCRTZWFyY2h7T3JkZXJ9KSB7CiAgICAgICAgICAgICAgICAkT3JkZXIgPSAkU2VhcmNoe09yZGVyfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlYXJjaHtTb3J0Qnl9KSB7CiAgICAgICAgICAgICAgICAkU29ydEJ5ID0gJFNlYXJjaHtTb3J0Qnl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICVTZWFyY2ggPSAkU2VsZi0+e1NlYXJjaFByb2ZpbGVPYmplY3R9LT5TZWFyY2hQcm9maWxlR2V0KAogICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdXZWJNYWlsU2VhcmNoJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAnbGFzdC1zZWFyY2gnLAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRPcmRlcikgewogICAgICAgICAgICAgICAgJFNlYXJjaHtPcmRlcn0gPSAkT3JkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRTb3J0QnkpIHsKICAgICAgICAgICAgICAgICRTZWFyY2h7U29ydEJ5fSA9ICRTb3J0Qnk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgZGVsZXRlIG9sZCBzZWFyY2ggcGFyYW1zCiAgICAgICAgICAgICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVEZWxldGUoCiAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ1dlYk1haWxTZWFyY2gnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHJlbWVtYmVyIG5ldyBzZWFyY2ggb3B0aW9ucwogICAgICAgICAgICBmb3JlYWNoIChrZXlzICVTZWFyY2gpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVBZGQoCiAgICAgICAgICAgICAgICAgICAgQmFzZSA9PiAnV2ViTWFpbFNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnbGFzdC1zZWFyY2gnLAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkXywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2VhcmNoeyRffSwKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkU29ydEJ5ID0gJFNlYXJjaHtTb3J0Qnl9IHx8ICdEYXRlJzsKICAgICAgICBteSAkT3JkZXJCeSA9ICRTZWFyY2h7T3JkZXJ9IHx8ICdVcCc7CgogICAgICAgICMgcmVtZW1iZXIgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj1cJEVudntcIkFjdGlvblwifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRQYXJhbXtGb2xkZXJ9JlN0YXJ0SGl0PSRTdGFydEhpdCYiLAogICAgICAgICk7CiAgICAgICAgZm9yZWFjaCBteSAkS2V5IChxdyhGcm9tIFRvIENjIFN1YmplY3QgQm9keSkpIHsKICAgICAgICAgICAgaWYgKCRTZWFyY2h7JEtleX0pIHsKICAgICAgICAgICAgICAgIHB1c2ggKEBTZWFyY2hRdWVyeSwgdWMoJEtleSksICRTZWFyY2h7JEtleX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0sMSk7CiAgICAgICAgbXkgQFJlc3V0bE1JRCA9ICRJTUFQLT5zZWFyY2goQFNlYXJjaFF1ZXJ5KTsKICAgICAgICAjIGJ1aWxkIHNlYXJjaCBuYXZpZ2F0aW9uIGJhcgogICAgICAgIG15ICVQYWdlTmF2ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QYWdlTmF2QmFyKAogICAgICAgICAgICBMaW1pdCA9PiAyMDAwLAogICAgICAgICAgICBTdGFydEhpdCA9PiAkU3RhcnRIaXQsCiAgICAgICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgICAgICBBbGxIaXRzID0+ICQjUmVzdXRsTUlEKzEsCiAgICAgICAgICAgIEFjdGlvbiA9PiAiQWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9IiwKICAgICAgICAgICAgTGluayA9PiAiU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUGFyYW17Rm9sZGVyfSYiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVBhZ2VOYXZ9LAogICAgICAgICk7CiAgICAgICAgIyBmZXRjaCBtYWlsYm94CiAgICAgICAgbXkgJE1lc3NhZ2VzID0gJyc7CiAgICAgICAgZm9yZWFjaCAoQFJlc3V0bE1JRCkgewogICAgICAgICAgICBpZiAoJE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZXMgLj0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRNZXNzYWdlcyAuPSAkXzsKICAgICAgICB9CiAgICAgICAgbXkgJU9yZGVyID0gKCk7CiAgICAgICAgbXkgJFJlczsKICAgICAgICBpZiAoQFJlc3V0bE1JRCkgewogICAgICAgICAgICAkUmVzID0gJElNQVAtPmZldGNoKCRNZXNzYWdlcywgJyhmbGFncyByZmM4MjIuaGVhZGVyIHJmYzgyMi5zaXplIGVudmVsb3BlKScpOwogICAgICAgICAgICBpZiAoJElNQVAtPmdldF9sYXN0X2Vycm9yKCkpIHsKICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiRVJST1IgJFBhcmFte0ZvbGRlcn0gIi4kSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKS4iXG4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNvcnQKICAgICAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoa2V5cyAleyRSZXN9KSB7CiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICV7JFJlcy0+eyRNZXNzYWdlfS0+eydlbnZlbG9wZSd9fTsKICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgZnJvbQogICAgICAgICAgICAgICAgaWYgKCRTb3J0QnkgZXEgJ0Zyb20nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe0Zyb219KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID1+IHMvKDx8PnwsfDt8OnxcLnwifCd8XCh8XCl8Jnw9XD8uKz9cP3xcPy4rPz1cP3xcPykvL2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtGcm9tfSA9ICc/JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IGxjKCREYXRhe0Zyb219KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgc3ViamVjdAogICAgICAgICAgICAgICAgZWxzaWYgKCRTb3J0QnkgZXEgJ1N1YmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe1N1YmplY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID1+IHMvKDx8PnwsfDt8OnxcLnwifCd8XCh8XCl8Jnw9XD8uKz9cP3xcPy4rPz1cP3xcPykvL2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtTdWJqZWN0fSA9ICc/JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IGxjKCREYXRhe1N1YmplY3R9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgc3ViamVjdAogICAgICAgICAgICAgICAgZWxzaWYgKCRTb3J0QnkgZXEgJ1NpemUnKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwMTAwZCIsICRTaXplKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgZGF0ZQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe0RhdGV9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlcnskTWVzc2FnZX0gPSBzcHJpbnRmKCIlMDQwZCIsICRTeXN0ZW1UaW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlcnskTWVzc2FnZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGdldCBzaG93biBtZXNzYWdlcwogICAgICAgIG15IEBTaG93biA9ICgpOwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBpZiAoKCRPcmRlckJ5IGVxICdEb3duJyAmJiAkU29ydEJ5IG5lICdEYXRlJykgfHwgJE9yZGVyQnkgZXEgJ1VwJyAmJiAkU29ydEJ5IGVxICdEYXRlJykgewogICAgICAgICAgICBmb3JlYWNoIChyZXZlcnNlIHNvcnQgeyRPcmRlcnskYX0gY21wICRPcmRlcnskYn19IGtleXMgJU9yZGVyKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyID49ICRTdGFydEhpdCAmJiAkQ291bnRlciA8ICgkUGFnZVNob3duKyRTdGFydEhpdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCAoQFNob3duLCAkXyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHNvcnQgeyRPcmRlcnskYX0gY21wICRPcmRlcnskYn19IGtleXMgJU9yZGVyKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyID49ICRTdGFydEhpdCAmJiAkQ291bnRlciA8ICgkUGFnZVNob3duKyRTdGFydEhpdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCAoQFNob3duLCAkXyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBtZXNzYWdlcwogICAgICAgIGZvcmVhY2ggbXkgJE1lc3NhZ2UgKEBTaG93bikgewogICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAjIGdldCBhbmQgcGFyc2UgaGVhZGVycwogICAgICAgICAgICBteSAkUGxhaW4gPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5oZWFkZXInfTsKICAgICAgICAgICAgbXkgQEVtYWlsID0gc3BsaXQoL1xuLywgJFBsYWluKTsKICAgICAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgTG9nT2JqZWN0ID0+ICRTZWxmLT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3JlYWNoIChxdyhGcm9tIFRvIENjIFN1YmplY3QgRGF0ZSkpIHsKICAgICAgICAgICAgICAgICREYXRheyRffSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAkXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oInwnKS8vZzsKICAgICAgICAgICAgJERhdGF7TnVtYmVyfSA9ICRNZXNzYWdlOwogICAgICAgICAgICAkRGF0YXtGb2xkZXJ9ID0gJFBhcmFte0ZvbGRlcn07CiAgICAgICAgICAgIG15IEBGbGFncyA9IEB7JFJlcy0+eyRNZXNzYWdlfS0+e2ZsYWdzfX07CiAgICAgICAgICAgICMgc2hvdyBodW1hbiBzaXplCiAgICAgICAgICAgIG15ICRTaXplID0gJFJlcy0+eyRNZXNzYWdlfS0+eydyZmM4MjIuc2l6ZSd9OwogICAgICAgICAgICBpZiAoJFNpemUgPiAoMTAyNCoxMDI0KSkgewogICAgICAgICAgICAgICAgJFNpemUgPSBzcHJpbnRmICIlLjFmIE1CeXRlcyIsICgkU2l6ZS8oMTAyNCoxMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRTaXplID4gMTAyNCkgewogICAgICAgICAgICAgICAgJFNpemUgPSBzcHJpbnRmICIlLjFmIEtCeXRlcyIsICgoJFNpemUvMTAyNCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNpemUgPSAkU2l6ZS4nIEJ5dGVzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtTaXplfSA9ICRTaXplOwogICAgICAgICAgICAjIGNvbnZlcnQgZGF0ZQogICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0RhdGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU3lzdGVtVGltZSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0RhdGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Nob3J0JywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRfID1+IC8oRGVsZXRlfFNlZW58SnVuaykkL2kpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtsYygkMSl9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISREYXRheydzZWVuJ30pIHsKICAgICAgICAgICAgICAgICREYXRheyJCb2xkU3RhcnQifSA9ICc8Yj4nOwogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRFbmQifSA9ICc8L2I+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoTWVzc2FnZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgc2hvdyBwZXJzb25hbCBpbWFnZQogICAgICAgICAgICBpZiAoJFNlbGYtPl9DaGVja1BlcnNvbmFsTWVzc2FnZSglRGF0YSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoTWVzc2FnZUZsYWcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAncGVyc29uYWwnLCBUaXRsZSA9PiAncGVyc29uYWwnLCBJbWFnZSA9PiAncGVyc29uYWwnLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIHNob3cgYW5zd2VyZWR8Zm9yd2FyZWR8ZGVsZXRlIGltYWdlcwogICAgICAgICAgICBmb3JlYWNoIG15ICRGbGFnIChARmxhZ3MpIHsKICAgICAgICAgICAgICAgIGlmICgkRmxhZyA9fiAvKGFuc3dlcmVkfGZvcndhcmRlZHxkZWxldGVkKS9pKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoTWVzc2FnZUZsYWcnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsIEZsYWcgPT4gJEZsYWcsIFRpdGxlID0+IGxjKCQxKSwgSW1hZ2UgPT4gbGMoJDEpLCB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTZWFyY2gnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRXZWJNYWlsJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBwbGFpbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZpZXdQbGFpbicpIHsKICAgICAgICBteSAkTWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnTWVzc2FnZScpIHx8ICcnOwogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0sIDEpOwogICAgICAgIG15IEBBRGF0YSA9ICRJTUFQLT5mZXRjaCgkTWVzc2FnZSwgJ3JmYzgyMicpOwogICAgICAgIG15ICRQbGFpbiA9ICRBRGF0YVswXS0+eyRNZXNzYWdlfS0+eydyZmM4MjInfTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAnJywKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBDb250ZW50ID0+ICRQbGFpbiwKICAgICAgICApOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaW5kZXgKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKICAgICAgICBteSAkUGFnZVNob3duID0gJFNlbGYtPntQYWdlU2hvd259IHx8IDIwOwogICAgICAgIG15ICRTdGFydEhpdCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3RhcnRIaXQnKSB8fCAxOwogICAgICAgIG15ICRTb3J0QnkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1NvcnRCeScpIHx8ICdEYXRlJzsKICAgICAgICBteSAkT3JkZXJCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnT3JkZXInKSB8fCAnVXAnOwogICAgICAgICMgcmVtZW1iZXIgbGFzdCBzY3JlZW4KICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj1cJEVudntcIkFjdGlvblwifSZGb2xkZXI9JFBhcmFte0ZvbGRlcn0mU3RhcnRIaXQ9JFN0YXJ0SGl0JlNvcnRCeT0kU29ydEJ5Jk9yZGVyPSRPcmRlckJ5IiwKICAgICAgICApOwogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0sMSk7CiMgICAgICAgIG15ICROdW0gPSAkSU1BUC0+bWVzc2FnZV9jb3VudCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgbXkgJE51bSA9ICRJTUFQLT5nZXRfcmVzcG9uc2VfY29kZSgnZXhpc3RzJyk7CgogICAgICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJVBhZ2VOYXYgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBhZ2VOYXZCYXIoCiAgICAgICAgICAgIExpbWl0ID0+IDIwMDAsCiAgICAgICAgICAgIFN0YXJ0SGl0ID0+ICRTdGFydEhpdCwKICAgICAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgICAgIEFsbEhpdHMgPT4gJE51bSwKICAgICAgICAgICAgQWN0aW9uID0+ICJBY3Rpb249XCRFbnZ7XCJBY3Rpb25cIn0iLAogICAgICAgICAgICBMaW5rID0+ICJGb2xkZXI9JFBhcmFte0ZvbGRlcn0mU29ydEJ5PSRTb3J0QnkmT3JkZXI9JE9yZGVyQnkmIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0luZGV4JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJVBhZ2VOYXZ9LAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggbWFpbGJveAogICAgICAgIG15ICVPcmRlciA9ICgpOwogICAgICAgIG15ICRSZXM7CiAgICAgICAgaWYgKCROdW0pIHsKICAgICAgICAgICAgJFJlcyA9ICRJTUFQLT5mZXRjaCgiMTokTnVtIiwgJyhmbGFncyByZmM4MjIuaGVhZGVyIHJmYzgyMi5zaXplIGVudmVsb3BlKScpOwogICAgICAgICAgICBpZiAoJElNQVAtPmdldF9sYXN0X2Vycm9yKCkpIHsKICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiRVJST1IgJFBhcmFte0ZvbGRlcn0gIi4kSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKS4iXG4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNvcnQKICAgICAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoa2V5cyAleyRSZXN9KSB7CiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICV7JFJlcy0+eyRNZXNzYWdlfS0+eydlbnZlbG9wZSd9fTsKICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgZnJvbQogICAgICAgICAgICAgICAgaWYgKCRTb3J0QnkgZXEgJ0Zyb20nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe0Zyb219KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID1+IHMvKDx8PnwsfDt8OnxcLnwifCd8XCh8XCl8Jnw9XD8uKz9cP3xcPy4rPz1cP3xcPykvL2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtGcm9tfSA9ICc/JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IGxjKCREYXRhe0Zyb219KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgc3ViamVjdAogICAgICAgICAgICAgICAgZWxzaWYgKCRTb3J0QnkgZXEgJ1N1YmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe1N1YmplY3R9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID1+IHMvKDx8PnwsfDt8OnxcLnwifCd8XCh8XCl8Jnw9XD8uKz9cP3xcPy4rPz1cP3xcPykvL2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtTdWJqZWN0fSA9ICc/JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IGxjKCREYXRhe1N1YmplY3R9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgc3ViamVjdAogICAgICAgICAgICAgICAgZWxzaWYgKCRTb3J0QnkgZXEgJ1NpemUnKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwMTAwZCIsICRTaXplKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3JkZXIgYnkgZGF0ZQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhe0RhdGV9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlcnskTWVzc2FnZX0gPSBzcHJpbnRmKCIlMDQwZCIsICRTeXN0ZW1UaW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPcmRlcnskTWVzc2FnZX0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGdldCBzaG93biBtZXNzYWdlcwogICAgICAgIG15IEBTaG93biA9ICgpOwogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBpZiAoKCRPcmRlckJ5IGVxICdEb3duJyAmJiAkU29ydEJ5IG5lICdEYXRlJykgfHwgJE9yZGVyQnkgZXEgJ1VwJyAmJiAkU29ydEJ5IGVxICdEYXRlJykgewogICAgICAgICAgICBmb3JlYWNoIChyZXZlcnNlIHNvcnQgeyRPcmRlcnskYX0gY21wICRPcmRlcnskYn19IGtleXMgJU9yZGVyKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyID49ICRTdGFydEhpdCAmJiAkQ291bnRlciA8ICgkUGFnZVNob3duKyRTdGFydEhpdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCAoQFNob3duLCAkXyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHNvcnQgeyRPcmRlcnskYX0gY21wICRPcmRlcnskYn19IGtleXMgJU9yZGVyKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyID49ICRTdGFydEhpdCAmJiAkQ291bnRlciA8ICgkUGFnZVNob3duKyRTdGFydEhpdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCAoQFNob3duLCAkXyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBtZXNzYWdlcwogICAgICAgIGZvcmVhY2ggbXkgJE1lc3NhZ2UgKEBTaG93bikgewogICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAjIGdldCBhbmQgcGFyc2UgaGVhZGVycwogICAgICAgICAgICBteSAkUGxhaW4gPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5oZWFkZXInfTsKICAgICAgICAgICAgbXkgQEVtYWlsID0gc3BsaXQoL1xuLywgJFBsYWluKTsKICAgICAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgTG9nT2JqZWN0ID0+ICRTZWxmLT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3JlYWNoIChxdyhGcm9tIFRvIENjIFN1YmplY3QgRGF0ZSkpIHsKICAgICAgICAgICAgICAgICREYXRheyRffSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAkXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oInwnKS8vZzsKICAgICAgICAgICAgJERhdGF7TnVtYmVyfSA9ICRNZXNzYWdlOwogICAgICAgICAgICAkRGF0YXtGb2xkZXJ9ID0gJFBhcmFte0ZvbGRlcn07CiAgICAgICAgICAgIG15IEBGbGFncyA9IEB7JFJlcy0+eyRNZXNzYWdlfS0+e2ZsYWdzfX07CiAgICAgICAgICAgICMgc2hvdyBodW1hbiBzaXplCiAgICAgICAgICAgIG15ICRTaXplID0gJFJlcy0+eyRNZXNzYWdlfS0+eydyZmM4MjIuc2l6ZSd9OwogICAgICAgICAgICBpZiAoJFNpemUgPiAoMTAyNCoxMDI0KSkgewogICAgICAgICAgICAgICAgJFNpemUgPSBzcHJpbnRmICIlLjFmIE1CeXRlcyIsICgkU2l6ZS8oMTAyNCoxMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRTaXplID4gMTAyNCkgewogICAgICAgICAgICAgICAgJFNpemUgPSBzcHJpbnRmICIlLjFmIEtCeXRlcyIsICgoJFNpemUvMTAyNCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNpemUgPSAkU2l6ZS4nIEJ5dGVzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtTaXplfSA9ICRTaXplOwogICAgICAgICAgICAjIGNvbnZlcnQgZGF0ZQogICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0RhdGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU3lzdGVtVGltZSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0RhdGV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFN5c3RlbVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1Nob3J0JywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRfID1+IC8oRGVsZXRlfFNlZW58SnVuaykkL2kpIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtsYygkMSl9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISREYXRheydzZWVuJ30pIHsKICAgICAgICAgICAgICAgICREYXRheyJCb2xkU3RhcnQifSA9ICc8Yj4nOwogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRFbmQifSA9ICc8L2I+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgc2hvdyBwZXJzb25hbCBpbWFnZQogICAgICAgICAgICBpZiAoJFNlbGYtPl9DaGVja1BlcnNvbmFsTWVzc2FnZSglRGF0YSkpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZUZsYWcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAncGVyc29uYWwnLCBUaXRsZSA9PiAncGVyc29uYWwnLCBJbWFnZSA9PiAncGVyc29uYWwnLCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIHNob3cgYW5zd2VyZWR8Zm9yd2FyZWR8ZGVsZXRlIGltYWdlcwogICAgICAgICAgICBmb3JlYWNoIG15ICRGbGFnIChARmxhZ3MpIHsKICAgICAgICAgICAgICAgIGlmICgkRmxhZyA9fiAvKGFuc3dlcmVkfGZvcndhcmRlZHxkZWxldGVkKS9pKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVzc2FnZUZsYWcnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsIEZsYWcgPT4gJEZsYWcsIFRpdGxlID0+IGxjKCQxKSwgSW1hZ2UgPT4gbGMoJDEpLCB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiAnTWFpbGJveCcsCiAgICAgICAgICAgIFJlZnJlc2ggPT4gNjAqNSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfQ2hlY2tQZXJzb25hbE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwojICAgIGlmICgoJFBhcmFte1RvfSAmJiAkUGFyYW17VG99ID1+IC9cUSRTZWxmLT57VXNlckVtYWlsfVxFL2kpIHx8CiMgICAgICAgICgkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gPX4gL1xRJFNlbGYtPntVc2VyRW1haWx9XEUvaSkpIHsKICAgIGlmICgkUGFyYW17VG99ICYmICRQYXJhbXtUb30gPX4gL1xRJFNlbGYtPntVc2VyRW1haWx9XEUvaSkgewogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgoxOwo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9QcmVmZXJlbmNlc1dlYk1haWwucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogUHJlZmVyZW5jZXNXZWJNYWlsLnBtLHYgMS4yIDIwMDUvMDEvMDYgMTA6MTE6MjAgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXNXZWJNYWlsOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0Kc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgZW52CiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIFBhcmFtT2JqZWN0KSkgewogICAgICAgIGRpZSAiR290IG5vICRfISIgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFBhcmFtIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBQYXJhbXMgPSAoKTsKICAgIHB1c2ggKEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEJsb2NrID0+ICdJbnB1dEtleScsCiAgICAgICAgICAgIEtleSA9PiAnSG9zdCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUEhvc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtVc2VyRGF0YX0tPntVc2VyV2ViTWFpbElNQVBIb3N0fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEhvc3QnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIGltYXAgPT4gJ2ltYXAnLAogICAgICAgICAgICAgICAgaW1hcHMgPT4gJ2ltYXBzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIEtleSA9PiAnUHJvdG9jb2wnLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBQcm90b2NvbCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJEYXRhfS0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUFByb3RvY29sJykgfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ0lucHV0S2V5JywKICAgICAgICAgICAgS2V5ID0+ICdGb2xkZXIgUHJlZml4JywKICAgICAgICAgICAgTmFtZSA9PiAnVXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEZvbGRlclByZWZpeCcpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgICAgIDI1ID0+ICcyNScsCiAgICAgICAgICAgICAgICAzNSA9PiAnMzUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBCbG9jayA9PiAnT3B0aW9uJywKICAgICAgICAgICAgS2V5ID0+ICdNZXNzYWdlIGEgcGFnZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsUGFnZVNob3duJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxQYWdlU2hvd259IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpQYWdlU2hvd24nKSB8fCAnJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBCbG9jayA9PiAnSW5wdXRLZXknLAogICAgICAgICAgICBLZXkgPT4gJ1VzZXInLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBVc2VyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQVXNlcn0gfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ1Bhc3N3b3JkJywKICAgICAgICAgICAgS2V5ID0+ICdQYXNzd29yZCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIEBQYXJhbXM7Cn0KIyAtLQpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBmb3JlYWNoIG15ICRLZXkgKGtleXMgJXskUGFyYW17R2V0UGFyYW19fSkgewogICAgICAgIG15IEBBcnJheSA9IEB7JFBhcmFte0dldFBhcmFtfS0+eyRLZXl9fTsKICAgICAgICBmb3JlYWNoIChAQXJyYXkpIHsKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICBpZiAoISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyB1cGRhdGUgU2Vzc2lvbklECiAgICAgICAgICAgIGlmICgkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSBlcSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0Kc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KMTsK IyAtLQojIEFnZW50V2ViTWFpbC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50V2ViTWFpCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFdlYk1haWwuZHRsLHYgMS44LjQuMSAyMDA4LzAyLzE3IDE2OjMzOjE2IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiVmlldyJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5PdmVydmlldyJ9Ij4kVGV4dHsiQmFjayJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUNvbXBvc2UmRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTWVzc2FnZSJ9Ij4kVGV4dHsiUmVwbHkifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1Db21wb3NlJkZvbGRlcj0kTFFEYXRheyJGb2xkZXIifSZNZXNzYWdlPSRMUURhdGF7Ik1lc3NhZ2UifSZSZXBseVRvQWxsPTEiPiRUZXh0eyJSZXBseSBBbGwifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1WaWV3JlByaW50PTEmRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTWVzc2FnZSJ9IiB0YXJnZXQ9InByaW50Ij4kVGV4dHsiUHJpbnQifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1WaWV3UGxhaW4mRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTWVzc2FnZSJ9IiB0YXJnZXQ9Il9ibGFuayI+JFRleHR7IlBsYWluIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249RGVsZXRlJkZvbGRlcj0kTFFEYXRheyJGb2xkZXIifSZNZXNzYWdlPSRMUURhdGF7Ik1lc3NhZ2UifSI+JFRleHR7IkRlbGV0ZSJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3NjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iODAiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjEyMDAifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpIZWFkZXJEYXRlIC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSI4MCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkUURhdGF7IkRhdGUifSI+JFRpbWVMb25neyIkUURhdGF7IlZhbHVlIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyRGF0ZSAtLT4KIyBzaG93IGF0dGFjaG1lbnRzCjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjE1JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iODUlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiREYXRheyJMaW5rIn0iICREYXRheyJUYXJnZXQifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifTogJFFEYXRheyJGaWxlbmFtZSJ9JztyZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIHNyYz0iJEVudnsiSW1hZ2VzIn0kUURhdGF7IkltYWdlIn0iIGJvcmRlcj0iMCIgYWx0PSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9IiB0aXRsZT0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSI+PC9hPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93TGluayAtLT4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48aHI+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCb2R5IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4kRGF0YXsiQm9keSJ9PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkJvZHkgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+Jm5ic3A7PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlZpZXcgLS0+Cgo8IS0tIGR0bDpibG9jazpQcmludCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJQcmludCJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI3MDAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iODAiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjEyMDAifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgo8IS0tIGR0bDpibG9jazpIZWFkZXJEYXRlIC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSI4MCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkUURhdGF7IkRhdGUifSI+JFRpbWVMb25neyIkUURhdGF7IlZhbHVlIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyRGF0ZSAtLT4KIyBzaG93IGF0dGFjaG1lbnRzCjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjE1JSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgIDx0ZCB3aWR0aD0iODUlIiBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiREYXRheyJMaW5rIn0iICREYXRheyJUYXJnZXQifSBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifTogJFFEYXRheyJGaWxlbmFtZSJ9JztyZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+JERhdGF7IkJvZHkifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCb2R5IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJpbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpDb21wb3NlIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkKewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVG8udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJFRleHR7IkEgbWVzc2FnZSBzaG91bGQgaGF2ZSBhIFRvOiByZWNpcGllbnQhIn0nKTsKICAgICAgICBkb2N1bWVudC5jb21wb3NlLlRvLmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSBpZiAoZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LnZhbHVlID09ICIiKSB7CiAgICAgICAgYWxlcnQoJyRUZXh0eyJBIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzdWJqZWN0ISJ9Jyk7CiAgICAgICAgZG9jdW1lbnQuY29tcG9zZS5TdWJqZWN0LmZvY3VzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLy8tLT4KPC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CjwhLS0KZnVuY3Rpb24gU3BlbGxDaGVja1N1Ym1pdCgpCnsKICAgIGRvY3VtZW50LnNwZWxsaW5nLkJvZHkudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJvZHkudmFsdWU7CiAgICB3aW5kb3cub3BlbignJywgJ3NwZWxsaW5nJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LnNwZWxsaW5nLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIEJvb2tDaGVja1N1Ym1pdCgpCnsKICAgIGRvY3VtZW50LmJvb2suVG8udmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLlRvLnZhbHVlOwogICAgZG9jdW1lbnQuYm9vay5DYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQ2MudmFsdWU7CiAgICBkb2N1bWVudC5ib29rLkJjYy52YWx1ZSA9IGRvY3VtZW50LmNvbXBvc2UuQmNjLnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdib29rJywgJ3Rvb2xiYXI9bm8sbG9jYXRpb249bm8sc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzLHdpZHRoPTcwMCxoZWlnaHQ9NTUwLGxlZnQ9MTAwLHRvcD0xMDAnKTsKICAgIGRvY3VtZW50LmJvb2suc3VibWl0KCkKfQovLyAtLT4KPC9zY3JpcHQ+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiQ29tcG9zZSJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5PdmVydmlldyJ9Ij4kVGV4dHsiQmFjayJ9PC9hPgogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlbmQiICAgICAgdmFsdWU9IjEiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik1lc3NhZ2UiICAgdmFsdWU9IiRRRGF0YXsiTWVzc2FnZSJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJblJlcGx5VG8iIHZhbHVlPSIkUURhdGF7IkluUmVwbHlUbyJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb2xkZXIiICAgIHZhbHVlPSIkUURhdGF7IkZvbGRlciJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiICAgIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSI3NjAiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZyb20ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJGcm9tIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJGcm9tIGludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUbyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVG8iIHZhbHVlPSIkUURhdGF7IlRvIn0iIHNpemU9IjgwIj4gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJUbyBpbnZhbGlkIn08L2ZvbnQ+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNjIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDYyIgdmFsdWU9IiRRRGF0YXsiQ2MifSIgc2l6ZT0iODAiPiA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JERhdGF7IkNjIGludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJCY2MifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkJjYyIgdmFsdWU9IiRRRGF0YXsiQmNjIn0iIHNpemU9IjgwIj4gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJCY2MgaW52YWxpZCJ9PC9mb250PjwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgc2l6ZT0iODAiPjwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAkRGF0YXsiVmFsdWUifSA8Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+JERhdGF7IkludmFsaWQifTwvZm9udD4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICRFbnZ7IkJveDAifTxhIGhyZWY9IiIgb25jbGljaz0iU3BlbGxDaGVja1N1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJCb29rQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJBZGRyZXNzIEJvb2sifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9Y29udGVudHMucG5nIj4kVGV4dHsiQWRkcmVzcyBCb29rIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iI2F0dGFjaG1lbnQiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsiQXR0YWNobWVudHMifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9YXR0YWNoLnBuZyI+JFRleHR7IkF0dGFjaG1lbnRzIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IkJvZHkiIHJvd3M9IjI1IiBjb2xzPSI3OCIgd3JhcD0iJEVudnsiQnJvd3NlcldyYXAifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBdHRhY2htZW50In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSI0MDAiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+JFFEYXRheyJGaWxlbmFtZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZXNpemUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidXR0b24iIG5hbWU9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iZmlsZV91cGxvYWQiIHR5cGU9ImZpbGUiIHNpemU9IjQwIiBjbGFzcz0iZml4ZWQiPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iJFRleHR7IkF0dGFjaCJ9Ij4KICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhdHRhY2htZW50Ij48L2E+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZW5kIG1haWwhIn0iIG9uY2xpY2s9InJldHVybiBzdWJtaXRfY29tcG9zZSgpOyI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJzcGVsbGluZyIgdGFyZ2V0PSJzcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRTcGVsbGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQm9keSIgdmFsdWU9IiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlbGxfbGFuZyIgdmFsdWU9IiI+CiAgICAgIDwvZm9ybT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJib29rIiB0YXJnZXQ9ImJvb2siPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50Qm9vayI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVG8iIHZhbHVlPSIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNjIiB2YWx1ZT0iIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCY2MiIHZhbHVlPSIiPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6Q29tcG9zZSAtLT4KCjwhLS0gZHRsOmJsb2NrOlNlYXJjaCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJTZWFyY2gifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNlYXJjaFJlc3VsdCI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNzAwIj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGb2xkZXIifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkZvbGRlcnMifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZyb20ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkZyb20iIHZhbHVlPSIkRGF0YXsiRnJvbSJ9IiBzaXplPSI1MCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRvIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUbyIgdmFsdWU9IiREYXRheyJUbyJ9IiBzaXplPSI1MCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNjIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDYyIgdmFsdWU9IiREYXRheyJDYyJ9IiBzaXplPSI1MCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkRGF0YXsiU3ViamVjdCJ9IiBzaXplPSI1MCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRleHQifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkJvZHkiIHZhbHVlPSIkRGF0YXsiQm9keSJ9IiBzaXplPSI1MCI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiBhY2Nlc3NrZXk9ImciIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWFyY2gifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTZWFyY2ggLS0+Cgo8IS0tIGR0bDpibG9jazpTZWFyY2hSZXN1bHQgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn06ICRRRGF0YXsiRm9sZGVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2gmUHJvZmlsZT1sYXN0LXNlYXJjaCIgY2xhc3M9Im1lbnVpdGVtIj4KICAgICAgJFRleHR7IkNoYW5nZSBzZWFyY2ggb3B0aW9ucyJ9CiAgICAgIDwvYT4KICAgICAgLSAkVGV4dHsiTWVzc2FnZXMifTogPGI+JFFEYXRheyJSZXN1bHQifTwvYj4gLSAkVGV4dHsiVG90YWwifTogPGI+JERhdGF7IlRvdGFsSGl0cyJ9PC9iPgogICAgICAtICRUZXh0eyJQYWdlIn06ICREYXRheyJTaXRlTmF2QmFyIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iICAgIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQnVsayI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9sZGVyIiAgICB2YWx1ZT0iJFFEYXRheyJGb2xkZXIifSI+CiMgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRlbGV0ZSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+CiMgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlJlYWQiICAgdmFsdWU9IiRUZXh0eyJSZWFkIn0iPgojICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJVbnJlYWQiIHZhbHVlPSIkVGV4dHsiVW5yZWFkIn0iPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+JFRleHR7IiMifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIzNSUiPiRUZXh0eyJGcm9tIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9RnJvbSZPcmRlcj1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PUZyb20mT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgZG93bndhcmQifSIgYWx0PSIkVGV4dHsic29ydCBkb3dud2FyZCJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlN1YmplY3QifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9U3ViamVjdCZPcmRlcj1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiRGF0ZSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PURhdGUmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgdXB3YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgdXB3YXJkIn0iPjwvYT4gLwogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVNlYXJjaFJlc3VsdCZQcm9maWxlPWxhc3Qtc2VhcmNoJkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMDAiPiRUZXh0eyJTaXplIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9U2l6ZSZPcmRlcj1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVNpemUmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgZG93bndhcmQifSIgYWx0PSIkVGV4dHsic29ydCBkb3dud2FyZCJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZWFyY2hNZXNzYWdlIC0tPgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAiIikgeyAkRW52eyJDb2xvciJ9ID0gInNlYXJjaHBhc3NpdmUiOyB9PgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJNZXNzYWdlSUQiIHZhbHVlPSIkUURhdGF7Ik51bWJlciJ9Ij48L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiTnVtYmVyIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpTZWFyY2hNZXNzYWdlRmxhZyAtLT4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifXdlYm1haWxfJFFEYXRheyJJbWFnZSJ9LnBuZyIgYm9yZGVyPSIwIiB0aXRsZT0iJFFEYXRheyJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KIyRRRGF0YXsiRmxhZyJ9CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2VGbGFnIC0tPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iIHRpdGxlPSIkUURhdGF7IkZyb20ifSI+JERhdGF7IkJvbGRTdGFydCJ9PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kTFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJGcm9tIiwiNDAifTwvYT4kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9IiB0aXRsZT0iJFFEYXRheyJTdWJqZWN0In0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiU3ViamVjdCIsIjQwIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kVGltZUxvbmd7IiRRRGF0YXsiRGF0ZSJ9In0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7IlNpemUifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgInNlYXJjaGFjdGl2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICIiOyB9PgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNocGFzc2l2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICJzZWFyY2hhY3RpdmUiOyB9Pgo8IS0tIGR0bDpibG9jazpTZWFyY2hNZXNzYWdlIC0tPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoUmVzdWx0IC0tPgoKPCEtLSBkdGw6YmxvY2s6SW5kZXggLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiTWFpbGJveCJ9OiAkUURhdGF7IkZvbGRlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgJFRleHR7Ik1lc3NhZ2VzIn06IDxiPiRRRGF0YXsiUmVzdWx0In08L2I+IC0gJFRleHR7IlRvdGFsIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgICAgLSAkVGV4dHsiUGFnZSJ9OiAkRGF0YXsiU2l0ZU5hdkJhciJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICRUZXh0eyJGb2xkZXIifTogJERhdGF7IkZvbGRlcnMifQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VsZWN0In0iPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkJ1bGsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvbGRlciIgdmFsdWU9IiRRRGF0YXsiRm9sZGVyIn0iPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50aGVhZCI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+JFRleHR7IiMifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjIwIj4mbmJzcDs8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIzNSUiPiRUZXh0eyJGcm9tIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1Gcm9tJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1Gcm9tJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNTAiPiRUZXh0eyJEYXRlIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJFRleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMDAiPiRUZXh0eyJTaXplIn0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kTFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9U2l6ZSZPcmRlcj1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVNpemUmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgZG93bndhcmQifSIgYWx0PSIkVGV4dHsic29ydCBkb3dud2FyZCJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpNZXNzYWdlIC0tPgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAiIikgeyAkRW52eyJDb2xvciJ9ID0gInNlYXJjaHBhc3NpdmUiOyB9PgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJNZXNzYWdlSUQiIHZhbHVlPSIkUURhdGF7Ik51bWJlciJ9Ij48L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiTnVtYmVyIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgo8IS0tIGR0bDpibG9jazpNZXNzYWdlRmxhZyAtLT4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifXdlYm1haWxfJFFEYXRheyJJbWFnZSJ9LnBuZyIgYm9yZGVyPSIwIiB0aXRsZT0iJFFEYXRheyJUaXRsZSJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KIyRRRGF0YXsiRmxhZyJ9CjwhLS0gZHRsOmJsb2NrOk1lc3NhZ2VGbGFnIC0tPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iIHRpdGxlPSIkUURhdGF7IkZyb20ifSI+JERhdGF7IkJvbGRTdGFydCJ9PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249VmlldyZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kTFFEYXRheyJOdW1iZXIifSI+JFFEYXRheyJGcm9tIiwiNDAifTwvYT4kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9IiB0aXRsZT0iJFFEYXRheyJTdWJqZWN0In0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiU3ViamVjdCIsIjQwIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kVGltZUxvbmd7IiRRRGF0YXsiRGF0ZSJ9In0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7IlNpemUifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgInNlYXJjaGFjdGl2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICIiOyB9PgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNocGFzc2l2ZSIpIHsgJEVudnsiQ29sb3IifSA9ICJzZWFyY2hhY3RpdmUiOyB9Pgo8IS0tIGR0bDpibG9jazpNZXNzYWdlIC0tPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyIgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iRGVsZXRlIiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJSZWFkIiB2YWx1ZT0iJFRleHR7IlJlYWQifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iVW5yZWFkIiB2YWx1ZT0iJFRleHR7IlVucmVhZCJ9Ij4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpJbmRleCAtLT4K 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+IDEpCiAgICAgICAgICB8fCBkaWUgIkNvbm5lY3Rpb24gdG8gZm9vLmNvbSBmYWlsZWQuIFJlYXNvbjogJEAiOwoKICAkaW1hcCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFNvY2tldCA9PiAkU1NMU29ja2V0LAogICAgICAgICAgICBTdGF0ZSA9PiBNYWlsOjpJTUFQVGFsazo6QXV0aGVudGljYXRlZCwKICAgICAgICAgICAgVWlkID0+IDApCiAgICAgICAgICB8fCBkaWUgIkNvdWxkIG5vdCBxdWVyeSBvbiBleGlzdGluZyBzb2NrZXQuIFJlYXNvbjogJEAiOwoKPWN1dApzdWIgbmV3IHsKICBteSAkUHJvdG8gPSBzaGlmdDsKICBteSAkQ2xhc3MgPSByZWYoJFByb3RvKSB8fCAkUHJvdG87CiAgbXkgJUFyZ3MgPSBAXzsKCiAgIyBUd28gbWFpbiBwb3NzaWJsZSBuZXcoKSBtb2Rlcy4gRWl0aGVyIGNvbm5lY3QgdG8gc2VydmVyCiAgIyAgIG9yIHVzZSBleGlzdGluZyBzb2NrZXQgcGFzc2VkCiAgJEFyZ3N7U2VydmVyfSB8fCAkQXJnc3tTb2NrZXR9CiAgICB8fCBkaWUgIk5vICdTZXJ2ZXInIG9yICdTb2NrZXQnIHNwZWNpZmllZCI7CiAgJEFyZ3N7U2VydmVyfSAmJiAkQXJnc3tTb2NrZXR9CiAgICAmJiBkaWUgIkNhbiBub3Qgc3BlY2lmeSAnU2VydmVyJyBhbmQgJ1NvY2tldCcgc2ltdWx0YW5lb3VzbHkiOwoKICAjIFNldCBvdXJzZWxmIHRvIGVtcHR5IHRvIHN0YXJ0IHdpdGgKICBteSAkU2VsZiA9IHt9OwogIGJsZXNzICgkU2VsZiwgJENsYXNzKTsKCiAgIyBDcmVhdGUgbmV3IHNvY2tldCB0byBzZXJ2ZXIKICBteSAkU29ja2V0OwogIGlmICgkQXJnc3tTZXJ2ZXJ9KSB7CgogICAgIyBTZXQgc3RhcnRpbmcgc3RhdGUKICAgICRTZWxmLT5zdGF0ZShVbmNvbm5lY3RlZCk7CgogICAgbXkgJFNlcnZlciA9ICRTZWxmLT57U2VydmVyfSA9ICRBcmdze1NlcnZlcn0gfHwgZGllICJObyBTZXJ2ZXIgbmFtZSBnaXZlbiI7CiAgICBteSAkUG9ydCA9ICRTZWxmLT57UG9ydH0gPSAkQXJnc3tQb3J0fSB8fCAxNDM7CgogICAgIyBDcmVhdGUgYSBuZXcgc29ja2V0IGFuZCBjb25uZWN0IHRvIElNQVAgc2VydmVyCiAgICBzb2NrZXQoJFNvY2tldCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIGdldHByb3RvYnluYW1lKCd0Y3AnKSkKICAgICAgfHwgcmV0dXJuIHVuZGVmOwogICAgbXkgJHBhZGRyID0gc29ja2FkZHJfaW4oJFBvcnQsIGluZXRfYXRvbigkU2VydmVyKSk7CiAgICBjb25uZWN0KCRTb2NrZXQsICRwYWRkcikgfHwgcmV0dXJuIHVuZGVmOwogICAgCiAgICAjIEZvcmNlIGZsdXNoaW5nIGFmdGVyIGV2ZXJ5IHdyaXRlIHRvIHRoZSBzb2NrZXQKICAgIG15ICRvZmggPSBzZWxlY3QoJFNvY2tldCk7ICR8ID0gMTsgc2VsZWN0ICgkb2ZoKTsKCiAgICAjIFNldCB0byBjb25uZWN0ZWQgc3RhdGUKICAgICRTZWxmLT5zdGF0ZShDb25uZWN0ZWQpOwogIH0KCiAgIyBXZSBoYXZlIGFuIGV4aXN0aW5nIHNvY2tldAogIGVsc2UgewogICAgIyBDb3B5IHNvY2tldAogICAgJFNvY2tldCA9ICRBcmdze1NvY2tldH07CiAgICBkZWxldGUgJEFyZ3N7U29ja2V0fTsKCiAgICAjIFNldCBzdGF0ZQogICAgJFNlbGYtPnN0YXRlKGV4aXN0cyAkQXJnc3tTdGF0ZX0gPyAkQXJnc3tTdGF0ZX0gOiBDb25uZWN0ZWQpOwogIH0KCiAgJFNlbGYtPntTb2NrZXR9ID0gJFNvY2tldDsKCiAgIyBTYXZlIHNvY2tldCBmb3IgbG