FAQ
1.4.2
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Added OpenSearch feature for faqs, like all ready existing for ticket OpenSearch. Fixed bug#2505 - It is not possible to Link Tickets and FAQ Articles.
Added new link object for OTRS framework 2.3.x.
A FAQ/knowledge base.
Eine FAQ-/Wissensdatenbank.
2.3.x
The FAQ/knowledge base will be found at the navigation bar and required "faq" group permissions to use it. To create new FAQ article you need to create categories and define the permission who can access categories.
Die FAQ/Knowledge Base ist in der Navigationsleiste zu finden. Es werden "faq" Gruppen-Rechte benötig um die FAQ benutzen zu können. Um FAQ Artikel erstellen zu können müssen zuerst Kategorien erstellt und die Berechtigungs-Gruppen dieser Kategorien definiert werden.
# add faq group
require Kernel::System::Group;
$Self->{GroupObject} = Kernel::System::Group->new(%{$Self});
$Self->{GroupObject}->GroupAdd(
Name => 'faq',
Comment => 'faq database users',
ValidID => 1,
UserID => 1,
);
$Self->{GroupObject}->GroupAdd(
Name => 'faq_admin',
Comment => 'faq admin users',
ValidID => 1,
UserID => 1,
);
2008-07-07 13:31:25
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogRkFRLnhtbCx2IDEuMTEgMjAwOC8wNy8wMyAyMTo0NDoxMiBtYXJ0aW4gRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok5vdGVUeXBlcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNwZWNpZnkgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzLCB0aGF0IHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIHN5c3RlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBr9m5uZW4gZGllIHZlcnNjaGllZGVuZW4gTm90aXotVHlwZW4gZmVzdGdlbGVndCB3ZXJkZW4sIGRpZSBpbm5lcmhhbGIgZGVzIFN5c3RlbXMgdmVyd2VuZGV0IHdlcmRlbiBzb2xsZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdOb3RlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtaW50ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtZXh0ZXJuYWwiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtcmVwb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlOYW1lIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBjYXRlZ29yeSBuYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Sb290IEthdGVnb3JpZSBOYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkRlZmF1bHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkZBUTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5Q29tbWVudCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgY2F0ZWdvcnkgbmFtZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+Um9vdCBLYXRlZ29yaWUgTmFtZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpEZWZhdWx0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5kZWZhdWx0IGNvbW1lbnQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OlZvdGluZzo6UmF0ZXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5SYXRlcyBmb3Igdm90aW5nLiBLZXkgbXVzdCBiZSBpbiBwcm9jZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5HZXdpY2h0dW5nIGb8ciBkaWUgQmV3ZXJ0dW5nLiBEZXIgS2V5IG11c3MgaW4gUHJvemVudCBhbmdlZ2ViZW4gd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW06OlZvdGluZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMDAiPjEwMCAlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI3NSI+NzUgJTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNTAiPjUwICU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjI1Ij4yNSAlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj4wICU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OlZvdGluZzo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgdm90aW5nIGluIGRlZmluZWQgaW50ZXJmYWNlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW50ZXJmYWNlcyBpbiBkZW5lbiBkYXMgVm90aW5nIEZlYXR1cmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW06OlZvdGluZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbnRlcm5hbCI+aW50ZXJuYWwgKGFnZW50KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZXh0ZXJuYWwiPmV4dGVybmFsIChjdXN0b21lcik8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OlZvdGluZzo6UXVlc3Rpb25MYW5nS2V5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TGFuZ3VhZ2VrZXkgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGUgbGFuZ3VhZ2UgZmlsZSAqX0ZBUS5wbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TGFuZ3VhZ2VLZXkgZvxyIGRpZSBGcmFnZSBiZWkgZGVyIEFydGlrZWxiZXdlcnR1bmcuIFdpcmQgaW4gZGVuIFNwcmFjaGZpbGVzIGRlZmluaWVydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtOjpWb3Rpbmc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkFydGljbGVWb3RpbmdRdWVzdGlvbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6OlBhdGg6OlNob3ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IEZBUSBwYXRoIHllcy9uby48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RkFRIFBmYWQgYW56ZWlnZW4gamEvbmVpbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okl0ZW1MaXN0OjpWb3RpbmdSZXN1bHREZWNpbWFsUGxhY2VzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVjaW1hbCBwbGFjZXMgb2YgdGhlIHZvdGluZyByZXN1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlemltYWxzdGVsbGVuIGRlcyBFcmdlYm5pc2VzIGJlaSBkZXIgQXJ0aWtlbGJld2VydHVuZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okl0ZW1MaXN0OjpWb3RpbmdSZXN1bHRDb2xvcnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DU1MgY29sb3IgZm9yIHRoZSB2b3RpbmcgcmVzdWx0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5GYXJiZW4gZvxyIGRpZSBBbnplaWdlIGRlcyBFcmdlYm5pc2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMwIj5yZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjcwIj5vcmFuZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwMCI+Z3JlZW48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpQYXRoOjpTZXBlcmF0b3IiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5GQVEgcGF0aCBzZXBlcmF0b3IuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRyZW5uemVpY2hlbiBpbSBGQVEgUGZhZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+uzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6Q2F0ZWdvcnk6Okljb24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5DYXRlZ29yeSBpY29uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5LYXRlZ29yaWUgSWNvbiBpbiBkZXIgRkFRLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkNhdGVnb3J5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5mYXEtY2F0ZWdvcnktc21hbGwucG5nPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpJY29uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SXRlbSBpY29uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BcnRpa2VsIEljb24gaW4gZGVyIEZBUS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5mYXEtaXRlbS1zbWFsbC5wbmc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvdyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkludGVyZmFjZXMgd2hlcmUgdGhlIHF1aWNrc2VhcmNoIHNob3VsZCBiZSBzaG93bi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW50ZXJmYWNlcyBpbiBkZW5lbiBkYXMgUXVpY2tTZWFyY2ggRmVhdHVyZSBhbmdlemVpZ3Qgd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbnRlcm5hbCI+aW50ZXJuYWwgKGFnZW50KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZXh0ZXJuYWwiPmV4dGVybmFsIChjdXN0b21lcik8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InB1YmxpYyI+cHVibGljIChwdWJsaWMpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3dTdWJDYXRlZ29yeUl0ZW1zIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBpdGVtcyBvZiBzdWJjYXRlZ29yaWVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BcnRpa2VsIGF1cyBTdWJrYXRlZ29yaWVuIGFuemVpZ2VuIGphL25laW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6RXhwbG9yZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBsYXN0IGNoYW5nZSBpdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SW50ZXJmYWNlcyBpbiBkZW5lbiBkYXMgTGFzdENoYW5nZSBGZWF0dXJlIGFuZ2V6ZWlndCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJpbnRlcm5hbCI+aW50ZXJuYWwgKGFnZW50KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iZXh0ZXJuYWwiPmV4dGVybmFsIChjdXN0b21lcik8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InB1YmxpYyI+cHVibGljIChwdWJsaWMpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93IGl0ZW1zIG9mIHN1YmNhdGVnb3JpZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFydGlrZWwgYXVzIFN1YmthdGVnb3JpZW4gYW56ZWlnZW4gamEvbmVpbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OkxpbWl0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TnVtYmVyIG9mIHNob3duIGl0ZW1zIGluIGxhc3QgY2hhbmdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QW56YWhsIGRlciB6dSBhbnplaWdlbmRlbiBBcnRpa2VsIGluIGxldHp0ZW4gxG5kZXJ1bmdlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3ciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OdW1iZXIgb2Ygc2hvd24gaXRlbXMgaW4gbGFzdCBjcmVhdGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5JbnRlcmZhY2VzIGluIGRlbmVuIGRhcyBMYXN0Q3JlYXRlIEZlYXR1cmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImludGVybmFsIj5pbnRlcm5hbCAoYWdlbnQpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJleHRlcm5hbCI+ZXh0ZXJuYWwgKGN1c3RvbWVyKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0icHVibGljIj5wdWJsaWMgKHB1YmxpYyk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpTaG93U3ViQ2F0ZWdvcnlJdGVtcyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgaXRlbXMgb2Ygc3ViY2F0ZWdvcmllcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+QXJ0aWtlbCBhdXMgU3Via2F0ZWdvcmllbiBhbnplaWdlbiBqYS9uZWluLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkV4cGxvcmVyPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6TGltaXQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TaG93biBpdGVtcyBpbiBsYXN0IGNyZWF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFuemFobCBkZXIgenUgYW56ZWlnZW5kZW4gQXJ0aWtlbCBpbiB6dWxldHp0IGVyc3RlbGx0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpFeHBsb3JlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6RkFRSG9vayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgaG9vayBmb3IgRkFRLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdGFuZGFyZCBCZXplaWNobmVyIGb8ciBlaW5lIEZBUS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5GQVEjPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpEZWZhdWx0OjpTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgc3RhdGUgZm9yIEZBUSBlbnRyeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U3RhbmRhcmQgU3RhdHVzIGVpbmVzICBGQVEtRWludHJhZ3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+aW50ZXJuYWwgKGFnZW50KTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZBUTo6SXRlbTo6RmllbGQxIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5pdGlvbiBvZiBGQVEgaXRlbSBmcmVlIHRleHQgZmllbGQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaXRpb24gZGVyIGZyZWllbiBUZXh0ZmVsZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2hvdyI+cHVibGljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXB0aW9uIj5TeW1wdG9tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4xMDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkMiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPnB1YmxpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+UHJvYmxlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+MjAwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpGaWVsZDMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5EZWZpbml0aW9uIG9mIEZBUSBpdGVtIGZyZWUgdGV4dCBmaWVsZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pdGlvbiBkZXIgZnJlaWVuIFRleHRmZWxkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SXRlbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaG93Ij5wdWJsaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNhcHRpb24iPlNvbHV0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj4zMDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkNCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+RmllbGQ0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj40MDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkNSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FwdGlvbiI+RmllbGQ1PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj41MDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGQVE6Okl0ZW06OkZpZWxkNiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluaXRpb24gb2YgRkFRIGl0ZW0gZnJlZSB0ZXh0IGZpZWxkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbml0aW9uIGRlciBmcmVpZW4gVGV4dGZlbGRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GQVE8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJdGVtPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNob3ciPmludGVybmFsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDYXB0aW9uIj5Db21tZW50PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj42MDA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyM4MzAxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdGQVEnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgJ0ZBUScgb2JqZWN0cyB1c2luZyB0aGUgJ05vcm1hbCcgbGluayB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EZWZpbmllcnQsIGRhc3MgZWluICdGQVEnLU9iamVrdGUgbWl0IGRlbSBMaW5rdHlwICdOb3JtYWwnIG1pdCBhbmRlcmVuICdGQVEnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPk5vcm1hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxpbmtPYmplY3Q6OlBvc3NpYmxlTGluayMjIzgzMDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UaGlzIHNldHRpbmcgZGVmaW5lcyB0aGF0IGEgJ0ZBUScgb2JqZWN0IGNhbiBiZSBsaW5rZWQgd2l0aCBvdGhlciAnRkFRJyBvYmplY3RzIHVzaW5nIHRoZSAnUGFyZW50Q2hpbGQnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnRkFRJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnUGFyZW50Q2hpbGQnIG1pdCBhbmRlcmVuICdGQVEnLU9iamVrdGVuIHZlcmxpbmt0IHdlcmRlbiBrYW5uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkxpbmtPYmplY3Q8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlBhcmVudENoaWxkPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjODMwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoaXMgc2V0dGluZyBkZWZpbmVzIHRoYXQgYSAnRkFRJyBvYmplY3QgY2FuIGJlIGxpbmtlZCB3aXRoIG90aGVyICdUaWNrZXQnIG9iamVjdHMgdXNpbmcgdGhlICdOb3JtYWwnIGxpbmsgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0LCBkYXNzIGVpbiAnRkFRJy1PYmpla3RlIG1pdCBkZW0gTGlua3R5cCAnTm9ybWFsJyBtaXQgYW5kZXJlbiAnVGlja2V0Jy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5Ob3JtYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsjIyM4MzA0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhhdCBhICdGQVEnIG9iamVjdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgJ1RpY2tldCcgb2JqZWN0cyB1c2luZyB0aGUgJ1BhcmVudENoaWxkJyBsaW5rIHR5cGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRlZmluaWVydCwgZGFzcyBlaW4gJ0ZBUSctT2JqZWt0ZSBtaXQgZGVtIExpbmt0eXAgJ1BhcmVudENoaWxkJyBtaXQgYW5kZXJlbiAnVGlja2V0Jy1PYmpla3RlbiB2ZXJsaW5rdCB3ZXJkZW4ga2Fubi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpMaW5rT2JqZWN0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDEiPkZBUTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MiI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5QYXJlbnRDaGlsZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudEZBUSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBGQVEgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGb8ciBkYXMgRkFRLU9iamVrdCBpbSBBZ2VudC1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxHcm91cFJvPmZhcTwvR3JvdXBSbz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5GQVE8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+RkFRPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+SXRlbUFyZWE8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZBUTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+aGVscC5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7TmF2PU5vcm1hbDwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+cTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjgzMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwUm8+ZmFxPC9Hcm91cFJvPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5FeHBsb3JlcjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RXhwbG9yZXI8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmxpc3QucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1FeHBsb3JlcjwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5GQVE8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmU8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEdyb3VwPmZhcTwvR3JvdXA+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldyBBcnRpY2xlPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5OZXcgQXJ0aWNsZTwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+bmV3LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249QWRkPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXBSbz5mYXE8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkZBUS1TZWFyY2g8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlNlYXJjaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c2VhcmNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50RkFRJmFtcDtTdWJhY3Rpb249U2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+czwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXBSbz5mYXE8L0dyb3VwUm8+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkhpc3Rvcnk8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkhpc3Rvcnk8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmhpc3RvcnkucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRGQVEmYW1wO1N1YmFjdGlvbj1TeXN0ZW1IaXN0b3J5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+bzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjMxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxX2FkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TGFuZ3VhZ2U8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkxhbmd1YWdlPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5sYW5ndWFnZS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPUxhbmd1YWdlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+dTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8R3JvdXA+ZmFxX2FkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q2F0ZWdvcnk8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkNhdGVnb3J5PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5jYXRlZ29yeS5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudEZBUSZhbXA7U3ViYWN0aW9uPUNhdGVnb3J5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPkZBUTwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+YzwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkyMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkN1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZSMjI0N1c3RvbWVyRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEN1c3RvbWVyRkFRIG9iamVjdCBpbiB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBm/HIgZGFzIEN1c3RvbWVyRkFRLU9iamVrdCBpbSBDdXN0b21lci1JbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RkFRPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+Q3VzdG9tZXIgZmFxPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkZBUTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT48L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+RkFRLUFyZWE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkZBUS1BcmVhPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5oZWxwLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUN1c3RvbWVyRkFRPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPjwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+ZjwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjQwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpDb21tb25QYXJhbSMjI0FjdGlvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgdmFsdWUgZm9yIHRoZSBBY3Rpb24gcGFyYW1ldGVyIGZvciB0aGUgcHVibGljIGZyb250ZW5kLiBUaGUgQWN0aW9uIHBhcmFtZXRlciBpcyB1c2VkIGluIHRoZSBzY3JpcHRzIG9mIHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkd2VydCBkZXMgQWN0aW9uLVBhcmFtZXRlcnMgZvxyIGRlbiD2ZmZlbnRsaWNoZW4gRkFRLUJlcmVpY2guIERlciBBY3Rpb24tUGFyYW1ldGVyIHdpcmQgdm9uIGRlbiBTa3JpcHRlbiBkZXMgU3lzdGVtcyBiZW51dHp0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPlB1YmxpY0ZBUTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlB1YmxpY0Zyb250ZW5kOjpNb2R1bGUjIyNQdWJsaWNGQVEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgUHVibGljRkFRIG9iamVjdCBpbiB0aGUgcHVibGljIEZBUSBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBm/HIgZGFzIFB1YmxpY0ZBUS1PYmpla3QgaW0g9mZmZW50bGljaGVuIEZBUS1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5DdXN0b21lciBmYXE8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+RkFRPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPFRpdGxlPjwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5GQVEtQXJlYTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RkFRLUFyZWE8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmhlbHAucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249Q3VzdG9tZXJGQVE8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5mPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRkFROjpJdGVtOjpIVE1MIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyBGQVEgQXJ0aWNsZSB3aXRoIEhUTUwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhUTUwgRGFyc3RlbGx1bmcgZGVyIEZBUSBBcnRpa2VsIGVpbnNjaGFsdGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZBUTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6Okl0ZW08L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6SGVhZGVyTWV0YU1vZHVsZSMjIzMtRkFRU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TW9kdWxlIHRvIGdlbmVyYXRlIGh0bWwgT3BlblNlYXJjaCBwcm9maWxlIGZvciBzaG9ydCBmYXEgc2VhcmNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Nb2R1bCB6dW0gZ2VuZXJpZXJlbiBkZXMgSFRNTCAiT3BlblNlYXJjaCIgUHJvZmlsZXMgc2NobmVsbGUgRkFRLVN1Y2hlbiD8YmVyIGRhcyBCcm93c2VyLVN1Y2hmZWxkIGFuYmlldGVuIHp1IGv2bm5lbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZU1ldGFIZWFkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkhlYWRlck1ldGFGQVFTZWFyY2g8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRGQVE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9GQVEucG0gLSBwcm92aWRlcyBkZSBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZGVfRkFRLnBtLHYgMS41IDIwMDgvMDcvMDcgMTE6MDA6MzAgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ZBUTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRUcmFuc2xhdGlvbiA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJFRyYW5zbGF0aW9uIG5lICdIQVNIJzsKCiAgICAjICQkU1RBUlQkJAoKICAgICMgb3duIHRyYW5zbGF0aW9ucwogICAgJFRyYW5zbGF0aW9uLT57J1lvdSBoYXZlIGFscmVhZHkgdm90ZWQhJ30gPSAnU2llIGhhYmVuIGJlcmVpdHMgYmV3ZXJ0ZXQhJzsKICAgICRUcmFuc2xhdGlvbi0+eydObyByYXRlIHNlbGVjdGVkISd9ICAgICAgID0gJ0tlaW5lIEJld2VydHVuZyBhdXN35GhsdCEnOwogICAgJFRyYW5zbGF0aW9uLT57J1RoYW5rcyBmb3Igdm90ZSEnfSAgICAgICAgPSAnRGFua2UgZvxyIElocmUgQmV3ZXJ0dW5nZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+e1ZvdGVzfSAgICAgICAgICAgICAgICAgICAgID0gJ0Jld2VydHVuZ2VuJzsKICAgICRUcmFuc2xhdGlvbi0+e0xhdGVzdENoYW5nZWRJdGVtc30gICAgICAgID0gJ3p1bGV0enQgZ2XkbmRlcnRlIEFydGlrZWwnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q3JlYXRlZEl0ZW1zfSAgICAgICAgPSAnenVsZXR6dCBlcnN0ZWxsdGUgQXJ0aWtlbCc7CiAgICAkVHJhbnNsYXRpb24tPntBcnRpY2xlVm90aW5nUXVlc3Rpb259CiAgICAgICAgPSAnV2llIGd1dCB3dXJkZSBtaXQgZGllc2VtIEFydGlrZWwgSWhyZSBGcmFnZSBiZWFudHdvcnRldD8nOwogICAgJFRyYW5zbGF0aW9uLT57U3ViQ2F0ZWdvcnlPZn0gICAgICAgICAgICAgICAgICAgID0gJ1VudGVya2F0ZWdvcmllIHZvbic7CiAgICAkVHJhbnNsYXRpb24tPntRdWlja1NlYXJjaH0gICAgICAgICAgICAgICAgICAgICAgPSAnU2NobmVsbHN1Y2hlJzsKICAgICRUcmFuc2xhdGlvbi0+e0RldGFpbFNlYXJjaH0gICAgICAgICAgICAgICAgICAgICA9ICdEZXRhaWxzdWNoZSc7CiAgICAkVHJhbnNsYXRpb24tPntDYXRlZ29yaWVzfSAgICAgICAgICAgICAgICAgICAgICAgPSAnS2F0ZWdvcmllbic7CiAgICAkVHJhbnNsYXRpb24tPntTdWJDYXRlZ29yaWVzfSAgICAgICAgICAgICAgICAgICAgPSAnU3Via2F0ZWdvcmllbic7CiAgICAkVHJhbnNsYXRpb24tPnsnQSBjYXRlZ29yeSBzaG91bGQgaGF2ZSBhIG5hbWUhJ30gPSAnRWluZSBLYXRlZ29yaWVuIHNvbGx0ZSBlaW5lbiBOYW1lbiBoYWJlbiEnOwogICAgJFRyYW5zbGF0aW9uLT57J0EgY2F0ZWdvcnkgc2hvdWxkIGhhdmUgYSBjb21tZW50ISd9CiAgICAgICAgPSAnRWluZSBLYXRlZ29yaWVuIHNvbGx0ZSBlaW5lbiBLb21tZW50YXIgaGFiZW4hJzsKICAgICRUcmFuc2xhdGlvbi0+eydGQVEgTmV3cyAobmV3IGNyZWF0ZWQpJ30gICAgICA9ICdGQVEgTmV3cyAobmV1IGVyc3RlbGx0ZSknOwogICAgJFRyYW5zbGF0aW9uLT57J0ZBUSBOZXdzIChyZWNlbnRseSBjaGFuZ2VkKSd9ID0gJ0ZBUSBOZXdzICh6dWxldHp0IGdl5G5kZXJ0ZSknOwogICAgJFRyYW5zbGF0aW9uLT57CiAgICAgICAgJ05vIGNhdGVnb3J5IGFjY2VzYWJsZS4gVG8gY3JlYXRlIGFuIGFydGljbGUgeW91IG5lZWQgaGF2ZSBhdCBsZWFzZSBhY2Nlc3MgdG8gbWluLiBvbmUgY2F0ZWdvcnkuIFBsZWFzZSBjaGVjayB5b3VyIGdyb3VwL2NhdGVnb3J5IHBlcm1pc3Npb24gdW5kZXIgLWNhdGVnb3J5IG1lbnUtIScKICAgICAgICB9CiAgICAgICAgPSAnS2VpbmUgS2F0ZWdvcmllLUF1c3dhaGwgbfZnbGljaC4gVW0gZWluZW4gQXJ0aWtlbCBlcnN0ZWxsZW4genUga/ZubmVuLCBtdXNzIG1hbiBtaW4uIFp1Z3JpZmYgYXVmIGVpbmUgS2F0ZWdvcmllIGhhYmVuLiBCaXR0ZSD8YmVycHL8ZmVuIFNpZSBkaWUgR3J1cHBlbi9LYXRlZ29yaWUgQmVyZWNodGlndW5nIGltIE1lbnVwdW5rdCAtS2F0ZWdvcmllLSEnOwogICAgJFRyYW5zbGF0aW9uLT57J0FnZW50IEdyb3VwcyB3aGljaCBjYW4gYWNjZXNzIHRoaXMgY2F0ZWdvcnkuJ30KICAgICAgICA9ICdBZ2VudGVuIEdydXBwZSB3ZWxjaGUgYXVmIGRpZXNlIEthdGVnb3JpZSBadWdyaWZmIGhhdC4nOwogICAgJFRyYW5zbGF0aW9uLT57J0EgY2F0ZWdvcnkgbmVlZCBtaW4uIG9uZSBwZXJtaXNzaW9uIGdyb3VwISd9CiAgICAgICAgPSAnRWluZSBLYXRlZ29yaWUgbXVzcyBtaW4uIGVpbmUgQmVyZWNodGlndW5nLUdydXBwZSBoYWJlbi4nOwogICAgJFRyYW5zbGF0aW9uLT57J1dpbGwgYmUgc2hvd24gYXMgY29tbWVudCBpbiBFeHBsb3JlLid9CiAgICAgICAgPSAnV2lyZCAgaW0gRXhwbG9yZXIgYWxzIEtvbW1lbnRhciBhbmdlemVpZ3QuJzsKCiAgICAjICQkU1RPUCQkCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lbl9GQVEucG0gLSBwcm92aWRlcyBlbiBsYW5ndWFnZSB0cmFuc2xhdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZW5fRkFRLnBtLHYgMS40IDIwMDgvMDcvMDcgMTE6MDA6MzAgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVuX0ZBUTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRUcmFuc2xhdGlvbiA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJFRyYW5zbGF0aW9uIG5lICdIQVNIJzsKCiAgICAjICQkU1RBUlQkJAoKICAgICMgb3duIHRyYW5zbGF0aW9ucwogICAgJFRyYW5zbGF0aW9uLT57Vm90ZXN9ICAgICAgICAgICAgICAgICAgICAgPSAnVm90ZXMnOwogICAgJFRyYW5zbGF0aW9uLT57TGF0ZXN0Q2hhbmdlZEl0ZW1zfSAgICAgICAgPSAnbGF0ZXN0IGNoYW5nZWQgYXJ0aWNsZSc7CiAgICAkVHJhbnNsYXRpb24tPntMYXRlc3RDcmVhdGVkSXRlbXN9ICAgICAgICA9ICdsYXRlc3QgY3JlYXRlZCBhcnRpY2xlJzsKICAgICRUcmFuc2xhdGlvbi0+e0FydGljbGVWb3RpbmdRdWVzdGlvbn0gICAgID0gJ0RpZCB0aGlzIGFydGljbGUgaGVscD8nOwogICAgJFRyYW5zbGF0aW9uLT57UXVpY2tTZWFyY2h9ICAgICAgICAgICAgICAgPSAnUXVpY2sgU2VhcmNoJzsKICAgICRUcmFuc2xhdGlvbi0+e0RldGFpbFNlYXJjaH0gICAgICAgICAgICAgID0gJ0RldGFpbCBTZWFyY2gnOwogICAgJFRyYW5zbGF0aW9uLT57J1lvdSBoYXZlIGFscmVhZHkgdm90ZWQhJ30gPSAnWW91IGhhdmUgYWxyZWFkeSB2b3RlISc7CiAgICAkVHJhbnNsYXRpb24tPnsnTm8gcmF0ZSBzZWxlY3RlZCEnfSAgICAgICA9ICdObyByYXRlIHNlbGVjdGVkISc7CiAgICAkVHJhbnNsYXRpb24tPnsnVGhhbmtzIGZvciB2b3RlISd9ICAgICAgICA9ICdUaGFua3MgZm9yIHZvdGUhJzsKICAgICRUcmFuc2xhdGlvbi0+e0NhdGVnb3JpZXN9ICAgICAgICAgICAgICAgID0gJ0NhdGVnb3JpZXMnOwogICAgJFRyYW5zbGF0aW9uLT57U3ViQ2F0ZWdvcmllc30gICAgICAgICAgICAgPSAnU3ViY2F0ZWdvcmllcyc7CgogICAgIyAkJFNUT1AkJAogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0ZBUS5wbSAtIGZhcSBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMTggMjAwOC8wNy8wNyAxMTowMjoyOSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6RkFROwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkZBUTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xOCAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGZvciAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApIGlmICggISRTZWxmLT57JF99ICk7CiAgICB9CgogICAgIyBmYXEgb2JqZWN0CiAgICAkU2VsZi0+e0ZBUU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RkFRLT5uZXcoJVBhcmFtKTsKCiAgICAjIGxpbmsgb2JqZWN0CiAgICAkU2VsZi0+e0xpbmtPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwoKICAgICMgYWdlbnQgdXNlcgogICAgJFNlbGYtPntBZ2VudFVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwoKICAgICMgaW50ZXJmYWNlIHNldHRpbmdzCgogICAgJFNlbGYtPntJbnRlcmZhY2V9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSA9PiAncHVibGljJwogICAgKTsKICAgICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlTGlzdCgKICAgICAgICBUeXBlcyA9PiBbJ3B1YmxpYyddCiAgICApOwoKICAgICMgZ2xvYmFsIG91dHB1dCB2YXJzCiAgICAkU2VsZi0+e05vdGlmeX0gPSBbXTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRFeHBsb3JlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zICAgPSBxdyhPcmRlciBTb3J0KTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDYXRlZ29yeUlEJyApIHx8IDA7CiAgICAkR2V0UGFyYW17T3JkZXJ9ICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdPcmRlcicgKSAgICAgIHx8ICdUaXRsZSc7CiAgICAkR2V0UGFyYW17U29ydH0gICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0JyApICAgICAgIHx8ICd1cCc7CiAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICBpZiAoICEkR2V0UGFyYW17JF99ICYmICEoICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICkgKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkYiBhY3Rpb24KICAgIG15ICVDYXRlZ29yeURhdGEgPSAoKTsKICAgIGlmICggJEdldFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgICVDYXRlZ29yeURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5R2V0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwogICAgICAgIGlmICggISVDYXRlZ29yeURhdGEgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgZHRsIGJsb2NrCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyJywKICAgICAgICBEYXRhID0+IHsgJUNhdGVnb3J5RGF0YSwgJUZyb250ZW5kIH0sCiAgICApOwoKICAgICMgRkFRIHBhdGgKICAgICRTZWxmLT5fR2V0RkFRUGF0aCgKICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICk7CgogICAgIyBleHBsb3JlciB0aXRsZQogICAgaWYgKCAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkQ2F0ZWdvcnlEYXRhe05hbWV9LAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkQ2F0ZWdvcnlEYXRhe0NvbW1lbnR9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RGVmYXVsdDo6Um9vdENhdGVnb3J5TmFtZScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpEZWZhdWx0OjpSb290Q2F0ZWdvcnlDb21tZW50JykKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZXhwbG9yZXIgY2F0ZWdvcnkgbGlzdAogICAgaWYgKCAhJFBhcmFte01vZGV9ICkgewogICAgICAgICRQYXJhbXtNb2RlfSA9ICdQdWJsaWMnOwogICAgfQogICAgaWYgKCAhZGVmaW5lZCggJFBhcmFte0N1c3RvbWVyVXNlcn0gKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyfSA9ICcnOwogICAgfQogICAgaWYgKCAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlckNhdGVnb3J5TGlzdCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgT3JkZXIgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICd1cCcsCiAgICAgICAgICAgIE1vZGUgICAgICAgICA9PiAkUGFyYW17TW9kZX0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlckNhdGVnb3J5TGlzdCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkR2V0UGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIE9yZGVyICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICBTb3J0ICAgICAgID0+ICd1cCcsCiAgICAgICAgICAgIE1vZGUgICAgICAgPT4gJFBhcmFte01vZGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsb3JlciBpdGVtIGxpc3QKICAgICRTZWxmLT5fR2V0RXhwbG9yZXJJdGVtTGlzdCgKICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICBPcmRlciAgICAgID0+ICRHZXRQYXJhbXtPcmRlcn0gfHwgJ1RpdGxlJywKICAgICAgICBTb3J0ICAgICAgID0+ICRHZXRQYXJhbXtTb3J0fSB8fCAndXAnCiAgICApOwoKICAgICMgcXVpY2tzZWFyY2gKICAgIG15ICVTaG93UXVpY2tTZWFyY2ggPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3cnKSB9OwogICAgaWYgKCBleGlzdHMoICRTaG93UXVpY2tTZWFyY2h7ICRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfSB9ICkgKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3JlclF1aWNrU2VhcmNoKAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgbGF0ZXN0IGNoYW5nZSBmYXEgaXRlbXMKICAgIG15ICVTaG93TGFzdENoYW5nZSA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93JykgfTsKICAgIGlmICggZXhpc3RzKCAkU2hvd0xhc3RDaGFuZ2V7ICRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfSB9ICkgKSB7CiAgICAgICAgJFNlbGYtPl9HZXRFeHBsb3Jlckxhc3RDaGFuZ2VJdGVtcygKICAgICAgICAgICAgQ2F0ZWdvcnlJRCAgID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgTW9kZSAgICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICB9CgogICAgIyBsYXRlc3QgY3JlYXRlIGZhcSBpdGVtcwogICAgbXkgJVNob3dMYXN0Q3JlYXRlID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3cnKSB9OwogICAgaWYgKCBleGlzdHMoICRTaG93TGFzdENyZWF0ZXsgJFNlbGYtPntJbnRlcmZhY2V9e05hbWV9IH0gKSApIHsKICAgICAgICAkU2VsZi0+X0dldEV4cGxvcmVyTGFzdENyZWF0ZUl0ZW1zKAogICAgICAgICAgICBDYXRlZ29yeUlEICAgPT4gJEdldFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICBNb2RlICAgICAgICAgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXRGQVFQYXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGQVFQYXRoQ2F0ZWdvcnlFbGVtZW50JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJ05hbWUnICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkRlZmF1bHQ6OlJvb3RDYXRlZ29yeU5hbWUnKSwKICAgICAgICAgICAgJ0NhdGVnb3J5SUQnID0+ICcwJwogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6OlBhdGg6OlNob3cnKSApIHsKICAgICAgICBteSBAQ2F0ZWdvcnlMaXN0CiAgICAgICAgICAgID0gQHsgJFNlbGYtPntGQVFPYmplY3R9LT5GQVFQYXRoTGlzdEdldCggQ2F0ZWdvcnlJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0gKSB9OwogICAgICAgIGZvciBteSAkRGF0YSAoQENhdGVnb3J5TGlzdCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aENhdGVnb3J5RWxlbWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJXskRGF0YX0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIF9HZXRFeHBsb3JlckNhdGVnb3J5TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgKHF3KE9yZGVyIFNvcnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiICkKICAgICAgICB9CiAgICB9CiAgICBteSBAQ2F0ZWdvcnlJRHMgPSAoKTsKICAgIGlmICggJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgewogICAgICAgIEBDYXRlZ29yeUlEcyA9IEB7CiAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+QWdlbnRDYXRlZ29yeVNlYXJjaCgKICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInICkgewogICAgICAgIEBDYXRlZ29yeUlEcyA9IEB7CiAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+Q3VzdG9tZXJDYXRlZ29yeVNlYXJjaCgKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBAQ2F0ZWdvcnlJRHMgPSBAewogICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPlB1YmxpY0NhdGVnb3J5U2VhcmNoKAogICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9OwogICAgfQoKICAgIGlmIChAQ2F0ZWdvcnlJRHMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckNhdGVnb3J5TGlzdCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgKEBDYXRlZ29yeUlEcykgewogICAgICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlHZXQoIENhdGVnb3J5SUQgPT4gJF8gKTsKICAgICAgICAgICAgJERhdGF7Q2F0ZWdvcnlOdW1iZXJ9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeUNvdW50KAogICAgICAgICAgICAgICAgUGFyZW50SURzID0+IFskX10KICAgICAgICAgICAgKTsKICAgICAgICAgICAgJERhdGF7QXJ0aWNsZU51bWJlcn0gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUNvdW50KAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gWyRfXSwKICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoICRGcm9udGVuZHtDc3NSb3d9IGVxICdzZWFyY2hwYXNzaXZlJyApIHsKICAgICAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJDYXRlZ29yeVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRFeHBsb3Jlckl0ZW1MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIChxdyhPcmRlciBTb3J0KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIiApCiAgICAgICAgfQogICAgfQoKICAgIG15ICRDc3NSb3cgID0gJyc7CiAgICBteSBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgIENhdGVnb3J5SURzID0+IFsgJFBhcmFte0NhdGVnb3J5SUR9IF0sCiAgICAgICAgU3RhdGVzICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgIE9yZGVyICAgICAgID0+ICRQYXJhbXtPcmRlcn0sCiAgICAgICAgU29ydCAgICAgICAgPT4gJFBhcmFte1NvcnR9LAogICAgICAgIExpbWl0ICAgICAgID0+IDMwMCwKICAgICk7CgogICAgaWYgKEBJdGVtSURzKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJGQVFJdGVtTGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0KICAgICAgICApOwogICAgICAgIGZvciAoQEl0ZW1JRHMpIHsKICAgICAgICAgICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoIEl0ZW1JRCA9PiAkXyApOwoKICAgICAgICAgICAgIyBjc3MgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoICRDc3NSb3cgZXEgJ3NlYXJjaHBhc3NpdmUnICkgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSAgICAgICAgICAgICAgICA9ICRDc3NSb3c7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKCBSYXRlID0+ICREYXRhe1Jlc3VsdH0gKSAuICc7JzsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckZBUUl0ZW1Sb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCAlRnJvbnRlbmQgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCnN1YiBfR2V0RXhwbG9yZXJMYXN0Q2hhbmdlSXRlbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q2hhbmdlOjpTaG93JykgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICAgICBmb3IgKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIiApCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgQEl0ZW1JRHMgPSAoKTsKICAgICAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtDYXRlZ29yeUlEfSApICkgewoKICAgICAgICAgICAgIyBhZGQgY3VycmVudCBjYXRlZ29yeWlkCiAgICAgICAgICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgICAgICAgICBpZiAoICRQYXJhbXtDYXRlZ29yeUlEfSApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBDYXRlZ29yeUlEcywgKCAkUGFyYW17Q2F0ZWdvcnlJRH0gKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXtNb2RlfSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte01vZGV9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFte0N1c3RvbWVyVXNlcn0gKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIHN1YmNhdGVnb3J5aWRzCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykgKSB7CiAgICAgICAgICAgICAgICBteSBAU3ViQ2F0ZWdvcnlJRHMgPSBAewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbVN0YXRlcyAgID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSAgICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHB1c2goIEBDYXRlZ29yeUlEcywgQFN1YkNhdGVnb3J5SURzICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q2hhbmdlJwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQYXJhbXtNb2RlfSA9fiAvcHVibGljL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q2hhbmdlUnNzJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQENhdGVnb3J5SURzKSB7CiAgICAgICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SURzID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgU3RhdGVzICAgICAgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgICAgIE9yZGVyICAgICAgID0+ICdDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnZG93bicsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDaGFuZ2U6OkxpbWl0JykKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENoYW5nZScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICBPcmRlciAgPT4gJ0NoYW5nZWQnLAogICAgICAgICAgICAgICAgU29ydCAgID0+ICdkb3duJywKICAgICAgICAgICAgICAgIExpbWl0ICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENoYW5nZTo6TGltaXQnKQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3IgKEBJdGVtSURzKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoIEl0ZW1JRCA9PiAkXyApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDaGFuZ2VGQVFJdGVtUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVEYXRhfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIF9HZXRFeHBsb3Jlckxhc3RDcmVhdGVJdGVtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6RXhwbG9yZXI6Okxhc3RDcmVhdGU6OlNob3cnKSApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvciAocXcoQ2F0ZWdvcnlJRCkpIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyEiICkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSBASXRlbUlEcyA9ICgpOwogICAgICAgIGlmICggZGVmaW5lZCggJFBhcmFte0NhdGVnb3J5SUR9ICkgKSB7CgogICAgICAgICAgICAjIGFkZCBjdXJyZW50IGNhdGVnb3J5aWQKICAgICAgICAgICAgbXkgQENhdGVnb3J5SURzID0gKCk7CiAgICAgICAgICAgIGlmICggJFBhcmFte0NhdGVnb3J5SUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCggQENhdGVnb3J5SURzLCAoICRQYXJhbXtDYXRlZ29yeUlEfSApICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFte01vZGV9ICkgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TW9kZX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17Q3VzdG9tZXJVc2VyfSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcn0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgc3ViY2F0ZWdvcnlpZHMKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6U2hvd1N1YkNhdGVnb3J5SXRlbXMnKSApIHsKICAgICAgICAgICAgICAgIG15IEBTdWJDYXRlZ29yeUlEcyA9IEB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5DYXRlZ29yeVN1YkNhdGVnb3J5SURMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtU3RhdGVzICAgPT4gJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBNb2RlICAgICAgICAgPT4gJFBhcmFte01vZGV9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcHVzaCggQENhdGVnb3J5SURzLCBAU3ViQ2F0ZWdvcnlJRHMgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBhcmFte01vZGV9ID1+IC9wdWJsaWMvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRXhwbG9yZXJMYXRlc3RDcmVhdGVSc3MnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChAQ2F0ZWdvcnlJRHMpIHsKICAgICAgICAgICAgICAgIEBJdGVtSURzID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRHMgPT4gXEBDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgICAgICBTdGF0ZXMgICAgICA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICAgICAgT3JkZXIgICAgICAgPT4gJ0NyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdkb3duJywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6TGFzdENyZWF0ZTo6TGltaXQnKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyTGF0ZXN0Q3JlYXRlJwogICAgICAgICAgICApOwogICAgICAgICAgICBASXRlbUlEcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgICAgICAgICAgU3RhdGVzID0+ICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfSwKICAgICAgICAgICAgICAgIE9yZGVyICA9PiAnQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICBTb3J0ICAgPT4gJ2Rvd24nLAogICAgICAgICAgICAgICAgTGltaXQgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpMYXN0Q3JlYXRlOjpMaW1pdCcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGR0bCBibG9jawogICAgICAgIGZvciAoQEl0ZW1JRHMpIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCggSXRlbUlEID0+ICRfICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBsb3JlckxhdGVzdENyZWF0ZUZBUUl0ZW1Sb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdWIgX0dldEV4cGxvcmVyUXVpY2tTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGQVE6OkV4cGxvcmVyOjpRdWlja1NlYXJjaDo6U2hvdycpICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIChxdygpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIgKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR0bCBibG9jawogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGxvcmVyUXVpY2tTZWFyY2gnLAogICAgICAgICAgICBEYXRhID0+IHsgQ2F0ZWdvcnlJRCA9PiAkUGFyYW17Q2F0ZWdvcnlJRH0gfQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIEdldEl0ZW1WaWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUZyb250ZW5kID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgICA9IHF3KEl0ZW1JRCk7CgogICAgIyBtYW5hZ2UgcGFyYW1ldGVycwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgaWYgKCAhKCAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGIgYWN0aW9uCiAgICBteSAlSXRlbURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCgKICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBodG1sIHF1b3RpbmcKICAgIGZvciBteSAkS2V5IChxdyAoRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYpKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpJdGVtOjpIVE1MJykgKSB7CiAgICAgICAgICAgIG15IEBBcnJheSA9IHNwbGl0IC9wcmU+LywgJEl0ZW1EYXRheyRLZXl9OwogICAgICAgICAgICBteSAkVGV4dCA9ICcnOwogICAgICAgICAgICBmb3IgKEBBcnJheSkgewogICAgICAgICAgICAgICAgaWYgKCAkXyA9fiAvKC4qKVw8XC8kLyApIHsKICAgICAgICAgICAgICAgICAgICAkVGV4dCAuPSAncHJlPicgLiAkXyAuICdwcmU+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRfID1+IHMvXG4vXDxiclw+L2c7CiAgICAgICAgICAgICAgICAgICAgJFRleHQgLj0gJF87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEl0ZW1EYXRheyRLZXl9ID0gJFRleHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkSXRlbURhdGF7JEtleX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEl0ZW1EYXRheyRLZXl9LAogICAgICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gNTAwMCwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISVJdGVtRGF0YSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQoKICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCAhZXhpc3RzKCAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317ICRJdGVtRGF0YXtTdGF0ZVR5cGVJRH0gfSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q3JlYXRlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q3JlYXRlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAlVXNlckluZm8gPSAkU2VsZi0+e0FnZW50VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkSXRlbURhdGF7Q2hhbmdlZEJ5fSwKICAgICk7CiAgICAkRnJvbnRlbmR7Q2hhbmdlZEJ5TG9naW59ID0gJFVzZXJJbmZve1VzZXJMb2dpbn07CgogICAgIyBpdGVtIHZpZXcKICAgICRGcm9udGVuZHtDc3NDb2x1bW5Wb3RpbmdSZXN1bHR9ID0gJ2NvbG9yOicKICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+R2V0RkFRSXRlbVZvdGluZ1JhdGVDb2xvciggUmF0ZSA9PiAkSXRlbURhdGF7UmVzdWx0fSApIC4gJzsnOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWaWV3JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgKTsKICAgIGlmICggJFBhcmFte1Blcm1pc3Npb259ICYmICRQYXJhbXtQZXJtaXNzaW9ufSBlcSAncncnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZBUUl0ZW1WaWV3TGlua1VwZGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVJdGVtRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0xpbmtEZWxldGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEsICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBGQVEgcGF0aAogICAgaWYgKCAkU2VsZi0+X0dldEZBUVBhdGgoIENhdGVnb3J5SUQgPT4gJEl0ZW1EYXRhe0NhdGVnb3J5SUR9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJUl0ZW1EYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBpdGVtIGF0dGFjaG1lbnQKICAgIG15IEBBdHRhY2htZW50SW5kZXggPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkF0dGFjaG1lbnRJbmRleCgKICAgICAgICBJdGVtSUQgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICApOwogICAgaWYgKEBBdHRhY2htZW50SW5kZXgpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHslSXRlbURhdGF9LAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudEluZGV4KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtVmlld0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVJdGVtRGF0YSwgJXskQXR0YWNobWVudH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpdGVtIGZpZWxkcwogICAgJFNlbGYtPl9HZXRJdGVtRmllbGRzKAogICAgICAgIEl0ZW1EYXRhID0+IFwlSXRlbURhdGEKICAgICk7CgogICAgIyBpdGVtIHZvdGluZwogICAgbXkgJVNob3dJdGVtVm90aW5nID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpTaG93JykgfTsKICAgIGlmICggZXhpc3RzKCAkU2hvd0l0ZW1Wb3Rpbmd7ICRTZWxmLT57SW50ZXJmYWNlfXtOYW1lfSB9ICkgKSB7CiAgICAgICAgJFNlbGYtPl9HZXRJdGVtVm90aW5nKAogICAgICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtMaW5rc30gJiYgJFBhcmFte0xpbmtzfSA9PSAxICkgewoKICAgICAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0ID0+ICdGQVEnLAogICAgICAgICAgICBLZXkgICAgPT4gJEdldFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICAgICAgbXkgJExpbmtUYWJsZVZpZXdNb2RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgICAgICMgY3JlYXRlIHRoZSBsaW5rIHRhYmxlCiAgICAgICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICAgICAgTGlua0xpc3RXaXRoRGF0YSA9PiAkTGlua0xpc3RXaXRoRGF0YSwKICAgICAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGhlIHNpbXBsZSBsaW5rIHRhYmxlCiAgICAgICAgaWYgKCRMaW5rVGFibGVTdHJnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgR2V0SXRlbVNtYWxsVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICBteSBAUGFyYW1zICAgPSBxdyhJdGVtSUQpOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgIGZvciAoQFBhcmFtcykgewogICAgICAgIGlmICggISggJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRiIGFjdGlvbgogICAgbXkgJUl0ZW1EYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgSXRlbUlEID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJUl0ZW1EYXRhICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CgogICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICBpZiAoICFleGlzdHMoICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXsgJEl0ZW1EYXRhe1N0YXRlVHlwZUlEfSB9ICkgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57QWdlbnRVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRJdGVtRGF0YXtDcmVhdGVkQnl9LAogICAgKTsKICAgICRGcm9udGVuZHtDcmVhdGVkQnlMb2dpbn0gPSAkVXNlckluZm97VXNlckxvZ2lufTsKICAgICVVc2VySW5mbyA9ICRTZWxmLT57QWdlbnRVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRJdGVtRGF0YXtDaGFuZ2VkQnl9LAogICAgKTsKICAgICRGcm9udGVuZHtDaGFuZ2VkQnlMb2dpbn0gPSAkVXNlckluZm97VXNlckxvZ2lufTsKCiAgICAjIGl0ZW0gdmlldwogICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0gPSAnY29sb3I6JwogICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5HZXRGQVFJdGVtVm90aW5nUmF0ZUNvbG9yKCBSYXRlID0+ICRJdGVtRGF0YXtSZXN1bHR9ICkgLiAnOyc7CiAgICAkRnJvbnRlbmR7SXRlbUZpZWxkVmFsdWVzfSA9ICRTZWxmLT5fR2V0SXRlbUZpZWxkVmFsdWVzKCBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1ZpZXdTbWFsbCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUl0ZW1EYXRhLCAlRnJvbnRlbmQgfSwKICAgICk7CgogICAgIyBGQVEgcGF0aAogICAgaWYgKCAkU2VsZi0+X0dldEZBUVBhdGgoIENhdGVnb3J5SUQgPT4gJEl0ZW1EYXRhe0NhdGVnb3J5SUR9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRUGF0aEl0ZW1FbGVtZW50U21hbGwnLAogICAgICAgICAgICBEYXRhID0+IFwlSXRlbURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGl0ZW0gYXR0YWNobWVudAogICAgaWYgKCBkZWZpbmVkKCAkSXRlbURhdGF7RmlsZW5hbWV9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRkFRSXRlbVZpZXdBdHRhY2htZW50U21hbGwnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlSXRlbURhdGEgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpbmtlZCBvYmplY3RzCiAgICAjIGxvb2t1cCB0aGUgbGluayBzdGF0ZSBpZAogICAgbXkgJExpbmtTdGF0ZUlEID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+U3RhdGVMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRFeGlzdGluZ0xpbmtzID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua3NHZXQoCiAgICAgICAgT2JqZWN0ICA9PiAnRkFRJywKICAgICAgICBLZXkgICAgID0+ICRHZXRQYXJhbXtJdGVtSUR9LAogICAgICAgIFN0YXRlSUQgPT4gJExpbmtTdGF0ZUlELAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHByZXBhcmUgdGhlIG91dHB1dCBoYXNoCiAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JEV4aXN0aW5nTGlua3N9ICkgewoKICAgICAgICAjIGdldCBvYmplY3QgZGVzY3JpcHRpb24KICAgICAgICBteSAlT2JqZWN0RGVzY3JpcHRpb24gPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5PYmplY3REZXNjcmlwdGlvbkdldCgKICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRUeXBlICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXsgJEV4aXN0aW5nTGlua3MtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgICAgICBteSAkVHlwZUlEID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkVHlwZSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0eXBlIGRhdGEKICAgICAgICAgICAgbXkgJVR5cGVEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+VHlwZUdldCgKICAgICAgICAgICAgICAgIFR5cGVJRCA9PiAkVHlwZUlELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyAkRXhpc3RpbmdMaW5rcy0+eyRPYmplY3R9LT57JFR5cGV9IH0gKSB7CgogICAgICAgICAgICAgICAgbXkgJExpbmtUeXBlTmFtZQogICAgICAgICAgICAgICAgICAgID0gJERpcmVjdGlvbiBlcSAnVGFyZ2V0JyA/ICRUeXBlRGF0YXtUYXJnZXROYW1lfSA6ICRUeXBlRGF0YXtTb3VyY2VOYW1lfTsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUeXBlTmFtZSA9PiAkTGlua1R5cGVOYW1lLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbUtleSAoIEB7ICRFeGlzdGluZ0xpbmtzLT57JE9iamVjdH0tPnskVHlwZX0tPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBpdGVtIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJUl0ZW1EZXNjcmlwdGlvbiA9ICRTZWxmLT57TGlua09iamVjdH0tPkl0ZW1EZXNjcmlwdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICA9PiAkSXRlbUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgY2VsbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50ID0gJEl0ZW1EZXNjcmlwdGlvbntJdGVtRGF0YX0KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRPYmplY3REZXNjcmlwdGlvbntPdmVydmlld30tPntOb3JtYWx9LT57S2V5fSB9IHx8ICcnOwoKICAgICAgICAgICAgICAgICAgICBteSAkTGlua1N0cmluZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdENvbnRlbnRTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ0ZBUScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFNlbGYtPntJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEl0ZW1LZXksCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEl0ZW1EZXNjcmlwdGlvbiA9PiBcJUl0ZW1EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRGF0YSAgICAgICAgICAgID0+ICRPYmplY3REZXNjcmlwdGlvbntPdmVydmlld30tPntOb3JtYWx9LAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlua0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtTdHJpbmcgPT4gJExpbmtTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldEl0ZW1QcmludCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgbXkgQFBhcmFtcyAgID0gcXcoSXRlbUlEKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICBpZiAoICEoICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICkgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkIHBhcmFtZXRlciAkXyIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBkYiBhY3Rpb24KICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIGlmICggISVJdGVtRGF0YSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgfQoKICAgICMgaHRtbCBxdW90aW5nCiAgICBmb3IgbXkgJEtleSAocXcgKEZpZWxkMSBGaWVsZDIgRmllbGQzIEZpZWxkNCBGaWVsZDUgRmllbGQ2KSkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6SFRNTCcpICkgewogICAgICAgICAgICAkSXRlbURhdGF7JEtleX0gPX4gcy9cbi9cPGJyXD4vZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRJdGVtRGF0YXskS2V5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkSXRlbURhdGF7JEtleX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgICAgICAgICA9PiA1MDAwLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCAhZXhpc3RzKCAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317ICRJdGVtRGF0YXtTdGF0ZVR5cGVJRH0gfSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgYWRkIGFydGljbGUKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgIERhdGEgPT4gXCVJdGVtRGF0YSwKICAgICk7CgogICAgIyBmaWVsZHMKICAgICRTZWxmLT5fR2V0SXRlbUZpZWxkcygKICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICApOwogICAgcmV0dXJuOwp9CgpzdWIgX0dldEl0ZW1GaWVsZHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgICA9IHF3KEl0ZW1EYXRhKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICBpZiAoICFleGlzdHMoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY29uZmlnIHZhbHVlcwogICAgbXkgJUl0ZW1GaWVsZHMgPSAoKTsKICAgIGZvciAoIG15ICRpID0gMTsgJGkgPCA3OyAkaSsrICkgewogICAgICAgIG15ICVJdGVtQ29uZmlnID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICRpICkgfTsKICAgICAgICBpZiAoICRJdGVtQ29uZmlne1Nob3d9ICkgewogICAgICAgICAgICAkSXRlbUZpZWxkc3sgIkZpZWxkIiAuICRpIH0gPSBcJUl0ZW1Db25maWc7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRLZXkgKCBzb3J0KCB7ICRJdGVtRmllbGRzeyRhfXtQcmlvfSA8PT4gJEl0ZW1GaWVsZHN7JGJ9e1ByaW99IH0ga2V5cyglSXRlbUZpZWxkcykgKSApIHsKICAgICAgICBteSAlU3RhdGVUeXBlRGF0YSA9ICV7CiAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbUZpZWxkc3skS2V5fXtTaG93fQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB9OwoKICAgICAgICAjIHNob3cgeWVzIC9ubwogICAgICAgIGlmICggZXhpc3RzKCAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc317ICRTdGF0ZVR5cGVEYXRhe0lEfSB9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGQVFJdGVtRmllbGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEl0ZW1GaWVsZHN7JEtleX0gfSwKICAgICAgICAgICAgICAgICAgICAnU3RhdGVOYW1lJyA9PiAkU3RhdGVUeXBlRGF0YXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICAnS2V5JyAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICdWYWx1ZScgICAgID0+ICRQYXJhbXtJdGVtRGF0YX17JEtleX0gfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9HZXRJdGVtRmllbGRWYWx1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15IEBQYXJhbXMgICA9IHF3KEl0ZW1EYXRhKTsKCiAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICBpZiAoICFleGlzdHMoICRQYXJhbXskX30gKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8iICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY29uZmlnIHZhbHVlcwogICAgbXkgJUl0ZW1GaWVsZHMgPSAoKTsKICAgIGZvciAoIG15ICRpID0gMTsgJGkgPCA3OyAkaSsrICkgewogICAgICAgIG15ICVJdGVtQ29uZmlnID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdGQVE6Okl0ZW06OkZpZWxkJyAuICRpICkgfTsKICAgICAgICBpZiAoICRJdGVtQ29uZmlne1Nob3d9ICkgewogICAgICAgICAgICAkSXRlbUZpZWxkc3sgIkZpZWxkIiAuICRpIH0gPSBcJUl0ZW1Db25maWc7CiAgICAgICAgfQogICAgfQogICAgbXkgJFN0cmluZyA9ICcnOwogICAgZm9yIG15ICRLZXkgKCBzb3J0KCB7ICRJdGVtRmllbGRzeyRhfXtQcmlvfSA8PT4gJEl0ZW1GaWVsZHN7JGJ9e1ByaW99IH0ga2V5cyglSXRlbUZpZWxkcykgKSApIHsKICAgICAgICBpZiAoICRJdGVtRmllbGRzeyRLZXl9e1Nob3d9IGVxICdpbnRlcm5hbCcgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgICAgIG15ICVTdGF0ZVR5cGVEYXRhID0gJXsKICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtRmllbGRzeyRLZXl9e1Nob3d9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIH07CgogICAgICAgICMgc2hvdyB5ZXMgL25vCiAgICAgICAgaWYgKCBleGlzdHMoICRTZWxmLT57SW50ZXJmYWNlU3RhdGVzfXsgJFN0YXRlVHlwZURhdGF7SUR9IH0gKSApIHsKICAgICAgICAgICAgJFN0cmluZyAuPSAkUGFyYW17SXRlbURhdGF9eyRLZXl9IHx8ICcnOwogICAgICAgICAgICAkU3RyaW5nIC49ICJcblxuIjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJFN0cmluZzsKfQoKc3ViIF9HZXRJdGVtVm90aW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgZm9yIChxdyhJdGVtRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIgKTsKICAgICAgICB9CiAgICB9CiAgICBteSAlSXRlbURhdGEgPSAleyAkUGFyYW17SXRlbURhdGF9IH07CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICJWb3RpbmciCiAgICApOwogICAgbXkgJVZvdGVEYXRhID0gJXsKICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPlZvdGVHZXQoCiAgICAgICAgICAgIENyZWF0ZUJ5ICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgSW50ZXJmYWNlID0+ICRTZWxmLT57SW50ZXJmYWNlfXtJRH0sCiAgICAgICAgICAgIElQICAgICAgICA9PiAkRU5WeydSRU1PVEVfQUREUid9LAogICAgICAgICAgICApCiAgICAgICAgfTsKCiAgICBteSAkRmxhZyA9IDA7CgogICAgIyBhbHJlYWR5IHZvdGVkPwogICAgaWYgKCVWb3RlRGF0YSkgewoKICAgICAgICAjIGl0ZW0vY2hhbmdlX3RpbWUgPiB2b3RpbmcvY3JlYXRlX3RpbWUKICAgICAgICBteSAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkSXRlbURhdGF7Q2hhbmdlZH0gfHwgJycgKTsKICAgICAgICBteSAkVm90ZUNyZWF0ZWRTeXN0ZW1UaW1lCiAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkVm90ZURhdGF7Q3JlYXRlZH0gfHwgJycgKTsKCiAgICAgICAgaWYgKCAkSXRlbUNoYW5nZWRTeXN0ZW1UaW1lID4gJFZvdGVDcmVhdGVkU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCggQHsgJFNlbGYtPntOb3RpZnl9IH0sIFsgJ0luZm8nLCAnWW91IGhhdmUgYWxyZWFkeSB2b3RlZCEnIF0gKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRGbGFnID0gMTsKICAgIH0KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdWb3RlJyAmJiAkRmxhZyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgcGFyYW1ldGVycwogICAgICAgIGZvciAocXcoSXRlbURhdGEpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgcGFyYW1ldGVyICRfISIgKQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG1hbmFnZSBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgbXkgQFBhcmFtcyAgID0gcXcoSXRlbUlEIFJhdGUpOwogICAgICAgIGZvciAoQFBhcmFtcykgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17UmF0ZX0gZXEgJzAnIG9yICRHZXRQYXJhbXtSYXRlfSApIHsKICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5Wb3RlQWRkKAogICAgICAgICAgICAgICAgQ3JlYXRlZEJ5ID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICA9PiAkR2V0UGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIElQICAgICAgICA9PiAkRU5WeydSRU1PVEVfQUREUid9LAogICAgICAgICAgICAgICAgSW50ZXJmYWNlID0+ICRTZWxmLT57SW50ZXJmYWNlfXtJRH0sCiAgICAgICAgICAgICAgICBSYXRlICAgICAgPT4gJEdldFBhcmFte1JhdGV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoKCBAeyAkU2VsZi0+e05vdGlmeX0gfSwgWyAnSW5mbycsICdUaGFua3MgZm9yIHZvdGUhJyBdICk7CiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoKCBAeyAkU2VsZi0+e05vdGlmeX0gfSwgWyAnRXJyb3InLCAnTm8gcmF0ZSBzZWxlY3RlZCEnIF0gKTsKICAgICAgICAgICAgJFNlbGYtPkdldEl0ZW1Wb3RpbmdGb3JtKAogICAgICAgICAgICAgICAgSXRlbURhdGEgPT4gJFBhcmFte0l0ZW1EYXRhfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZvcm0KICAgICRTZWxmLT5fR2V0SXRlbVZvdGluZ0Zvcm0oCiAgICAgICAgSXRlbURhdGEgPT4gJFBhcmFte0l0ZW1EYXRhfQogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBfR2V0SXRlbVZvdGluZ0Zvcm0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbWV0ZXJzCiAgICBmb3IgKHF3KEl0ZW1EYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCBwYXJhbWV0ZXIgJF8hIiApCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdWb3RlRm9ybScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJXsgJFBhcmFte0l0ZW1EYXRhfSB9IH0KICAgICk7CgogICAgbXkgJVZvdGluZ1JhdGVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZBUTo6SXRlbTo6Vm90aW5nOjpSYXRlcycpIH07CiAgICBmb3IgbXkgJGtleSAoIHNvcnQoIHsgJGIgPD0+ICRhIH0ga2V5cyglVm90aW5nUmF0ZXMpICkgKSB7CiAgICAgICAgbXkgJURhdGEgPSAoICJWYWx1ZSIgPT4gJGtleSwgIlRpdGxlIiA9PiAkVm90aW5nUmF0ZXN7JGtleX0gKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICJWb3RpbmdSYXRlUm93IiwKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybjsKfQoKc3ViIEdldEl0ZW1TZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgZm9yIChxdyhMYW5ndWFnZUlEcyBDYXRlZ29yeUlEcykpIHsKICAgICAgICBteSBAQXJyYXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRfICk7CiAgICAgICAgaWYgKEBBcnJheSkgewogICAgICAgICAgICAkR2V0UGFyYW17JF99ID0gXEBBcnJheTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKHF3KFF1aWNrU2VhcmNoIE51bWJlciBUaXRsZSBXaGF0IEtleXdvcmQpKSB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgIH0KCiAgICAjIHF1aWNrc2VhcmNoIGluIHN1YmNhdGVnb3JpZXM/CiAgICBpZiAoICRHZXRQYXJhbXtRdWlja1NlYXJjaH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRkFROjpFeHBsb3Jlcjo6UXVpY2tTZWFyY2g6OlNob3dTdWJDYXRlZ29yeUl0ZW1zJykgKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtNb2RlfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtNb2RlfSA9ICdQdWJsaWMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXtVc2VyfSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJ9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgQFN1YkNhdGVnb3J5SURzID0gQHsKICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlTdWJDYXRlZ29yeUlETGlzdCgKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJEdldFBhcmFte0NhdGVnb3J5SURzfS0+WzBdLAogICAgICAgICAgICAgICAgICAgIEl0ZW1TdGF0ZXMgICA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcn0sCiAgICAgICAgICAgICAgICAgICAgTW9kZSAgICAgICAgID0+ICRQYXJhbXtNb2RlfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICBwdXNoKCBAeyAkR2V0UGFyYW17Q2F0ZWdvcnlJRHN9IH0sIEBTdWJDYXRlZ29yeUlEcyApOwogICAgICAgIH0KICAgIH0KICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgICAgICAgICAgICAgICAgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCgpIH0sCiAgICAgICAgU2l6ZSAgICAgICAgICAgICAgICA9PiA1LAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0xhbmd1YWdlSURzJywKICAgICAgICBNdWx0aXBsZSAgICAgICAgICAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRFJlZkFycmF5ICA9PiAkR2V0UGFyYW17TGFuZ3VhZ2VJRHN9IHx8IFtdLAogICAgICAgIEhUTUxRdW90ZSAgICAgICAgICAgPT4gMSwKICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICApOwogICAgbXkgJENhdGVnb3JpZXMgPSAoKTsKICAgIGlmICggJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQWdlbnQnICkgewogICAgICAgICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdDdXN0b21lcicgKSB7CiAgICAgICAgJENhdGVnb3JpZXMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkdldEN1c3RvbWVyQ2F0ZWdvcmllcygKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ3J3JwogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KCk7CiAgICB9CiAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICBDYXRlZ29yeUxpc3QgICAgICAgID0+IHsgJXskQ2F0ZWdvcmllc30gfSwKICAgICAgICBTaXplICAgICAgICAgICAgICAgID0+IDUsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ2F0ZWdvcnlJRHMnLAogICAgICAgIE11bHRpcGxlICAgICAgICAgICAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEcyAgICAgICAgID0+ICRHZXRQYXJhbXtDYXRlZ29yeUlEc30gfHwgW10sCiAgICAgICAgSFRNTFF1b3RlICAgICAgICAgICA9PiAxLAogICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1NlYXJjaCcsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUdldFBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICk7CgogICAgIyBidWlsZCByZXN1bHQKICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0JyApICkgewogICAgICAgIG15ICRDc3NSb3cgPSAnJzsKCiAgICAgICAgbXkgQEl0ZW1JRHMgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUVNlYXJjaCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFN0YXRlcyA9PiAkU2VsZi0+e0ludGVyZmFjZVN0YXRlc30sCiAgICAgICAgICAgIExpbWl0ICA9PiAyNSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlYXJjaFJlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCB9LAogICAgICAgICk7CiAgICAgICAgZm9yIChASXRlbUlEcykgewogICAgICAgICAgICAlRnJvbnRlbmQgPSAoKTsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkZBUUdldCggSXRlbUlEID0+ICRfICk7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJ3JvJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAkUGVybWlzc2lvbiA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2hlY2tDYXRlZ29yeVVzZXJQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJERhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFBhcmFte01vZGV9ICYmICRQYXJhbXtNb2RlfSBlcSAnQ3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgJFBlcm1pc3Npb24gPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNoZWNrQ2F0ZWdvcnlDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgICA9PiAkRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBuZSAnJyApIHsKICAgICAgICAgICAgICAgIGlmICggJENzc1JvdyBlcSAnc2VhcmNocGFzc2l2ZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJENzc1JvdyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRhe0Nzc1Jvd30gPSAkQ3NzUm93OwogICAgICAgICAgICAgICAgJEZyb250ZW5ke0Nzc0NvbHVtblZvdGluZ1Jlc3VsdH0KICAgICAgICAgICAgICAgICAgICA9ICdjb2xvcjonCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkdldEZBUUl0ZW1Wb3RpbmdSYXRlQ29sb3IoIFJhdGUgPT4gJERhdGF7UmVzdWx0fSApCiAgICAgICAgICAgICAgICAgICAgLiAnOyc7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgpzdWIgR2V0U3lzdGVtSGlzdG9yeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVGcm9udGVuZCA9ICgpOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnU3lzdGVtSGlzdG9yeScsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgJEZyb250ZW5ke0Nzc1Jvd30gPSAnJzsKICAgIG15IEBIaXN0b3J5ID0gQHsgJFNlbGYtPntGQVFPYmplY3R9LT5IaXN0b3J5R2V0KCkgfTsKICAgIGZvciBteSAkUm93IChASGlzdG9yeSkgewoKICAgICAgICAjIGNzcyBjb25maWd1cmF0aW9uCiAgICAgICAgaWYgKCAkRnJvbnRlbmR7Q3NzUm93fSBlcSAnc2VhcmNocGFzc2l2ZScgKSB7CiAgICAgICAgICAgICRGcm9udGVuZHtDc3NSb3d9ID0gJ3NlYXJjaGFjdGl2ZSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRnJvbnRlbmR7Q3NzUm93fSA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICB9CiAgICAgICAgbXkgJURhdGEgPSAleyRSb3d9OyAgICAjJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoSXRlbUlEID0+ICRSb3ctPntJdGVtSUR9KTsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFJvdy0+e0NyZWF0ZWRCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3lzdGVtSGlzdG9yeVJvdycsCiAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgJUZyb250ZW5kLCAlVXNlciwgTmFtZSA9PiAkUm93LT57TmFtZX0gfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50RkFRLnBtIC0gZmFxIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRGQVEucG0sdiAxLjE2IDIwMDgvMDcvMDcgMTE6MDI6MjkgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50RkFROwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6TW9kdWxlczo6RkFROwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R3JvdXA7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTYgJCkgWzFdOwoKQElTQSA9IHF3KEtlcm5lbDo6TW9kdWxlczo6RkFRKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBteSAkU2VsZiA9IG5ldyBLZXJuZWw6Ok1vZHVsZXM6OkZBUSglUGFyYW0pOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgaW50ZXJmYWNlIHNldHRpbmdzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgJFNlbGYtPntJbnRlcmZhY2V9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVHZXQoCiAgICAgICAgTmFtZSA9PiAnaW50ZXJuYWwnCiAgICApOwogICAgJFNlbGYtPntJbnRlcmZhY2VTdGF0ZXN9ID0gJFNlbGYtPntGQVFPYmplY3R9LT5TdGF0ZVR5cGVMaXN0KAogICAgICAgIFR5cGVzID0+IFsgJ2ludGVybmFsJywgJ2V4dGVybmFsJywgJ3B1YmxpYycgXQogICAgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBPYmplY3RzCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgZm9yIChxdyhTZXNzaW9uT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKSBpZiAoICEkU2VsZi0+eyRffSApOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCVQYXJhbSk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewoKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBQYXJhbXRlcgogICAgbXkgQFBhcmFtcyAgID0gKCk7CiAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgIG15ICVGcm9udGVuZCA9ICgpOwogICAgbXkgJURhdGEgICAgID0gKCk7CgogICAgIyBPdXRwdXQKICAgIG15ICRPdXRwdXQgICAgICA9ICcnOwogICAgbXkgJEhlYWRlciAgICAgID0gJyc7CiAgICBteSAkSGVhZGVyVGl0bGUgPSAnJzsKICAgIG15ICRIZWFkZXJUeXBlICA9ICcnOwogICAgbXkgJE5hdmlnYXRpb24gID0gJyc7CiAgICBteSAkTm90aWZ5ICAgICAgPSAnJzsKICAgIG15ICRDb250ZW50ICAgICA9ICcnOwogICAgbXkgJEZvb3RlciAgICAgID0gJyc7CiAgICBteSAkRm9vdGVyVHlwZSAgPSAnJzsKCiAgICBteSAkRGVmYXVsdEhlYWRlciAgICAgPSAnJzsKICAgIG15ICREZWZhdWx0TmF2aWdhdGlvbiA9ICcnOwogICAgbXkgJERlZmF1bHROb3RpZnkgICAgID0gJyc7CiAgICBteSAkRGVmYXVsdENvbnRlbnQgICAgPSAnJzsKICAgIG15ICREZWZhdWx0Rm9vdGVyICAgICA9ICcnOwoKICAgICMgbWFuYWdlIHBhcmFtZXRlcnMKICAgICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjCiAgICBAUGFyYW1zID0gcXcoSXRlbUlEIElEIE51bWJlciBOYW1lIENvbW1lbnQgQ2F0ZWdvcnlJRCBQYXJlbnRJRCBTdGF0ZUlEIExhbmd1YWdlSUQgVGl0bGUgVXNlcklECiAgICAgICAgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgRnJlZUtleTEgRnJlZUtleTIgRnJlZUtleTMgS2V5d29yZHMgT3JkZXIgU29ydCBOYXYpOwogICAgZm9yIChAUGFyYW1zKSB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSB8fCAnJzsKICAgIH0KCiAgICAjIG5hdmlnYXRpb24gT04vT0ZGCiAgICAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIwogICAgJEhlYWRlclR5cGUgPSAkU2VsZi0+e0xhc3RGQVFOYXZ9OwogICAgaWYgKCAkR2V0UGFyYW17TmF2fSBlcSAnTm9ybWFsJyApIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICcnOwogICAgfQogICAgZWxzaWYgKCAkR2V0UGFyYW17TmF2fSBlcSAnTm9uZScgfHwgJFNlbGYtPntMYXN0RkFRTmF2fSApIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICdTbWFsbCc7CiAgICAgICAgJE5hdmlnYXRpb24gPSAnICc7CiAgICAgICAgJE5vdGlmeSAgICAgPSAnICc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSGVhZGVyVHlwZSA9ICcnOwogICAgfQoKICAgICMgc3RvcmUgbmF2IHBhcmFtCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RGQVFOYXYnLAogICAgICAgIFZhbHVlICAgICA9PiAkSGVhZGVyVHlwZSwKICAgICk7CgogICAgIyB2aWV3IHNtYWxsCiAgICAjJEhlYWRlclR5cGUgPSAkU2VsZi0+e0xhc3RGQVFOYXZ9IHx8ICcnOwogICAgI215ICROYXYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ05hdicpIHx8ICcnOwoKICAgICMgb3V0cHV0CiAgICAkT3V0cHV0ID0gJyc7CgogICAgIyBzdG9yZSBzZWFyY2ggcGFyYW1zCiAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RGQVFXaGF0JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFBhcmFte1doYXR9LAogICAgKTsKICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdEZBUUtleXdvcmQnLAogICAgICAgIFZhbHVlICAgICA9PiAkUGFyYW17S2V5d29yZH0sCiAgICApOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGl2ZXIgT3BlblNlYXJjaERlc2NyaXB0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ09wZW5TZWFyY2hEZXNjcmlwdGlvbicgKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50RkFRT3BlblNlYXJjaERlc2NyaXB0aW9uJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ09wZW5TZWFyY2hEZXNjcmlwdGlvbi54bWwnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAidGV4dC94bWwiLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGxhbmd1YWdlIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZScgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0hlYWRsaW5lfSAgICAgICA9ICdBZGQnOwogICAgICAgICRGcm9udGVuZHtBZGRMaW5rfSAgICAgICAgPSAnKENsaWNrIGhlcmUgdG8gYWRkKSc7CiAgICAgICAgJEZyb250ZW5ke1N1YmFjdGlvbn0gICAgICA9ICdMYW5ndWFnZUFkZCc7CiAgICAgICAgJEZyb250ZW5ke0xhbmd1YWdlT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCggVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSApIH0sCiAgICAgICAgICAgIFNpemUgPT4gMTAsCiAgICAgICAgICAgIE5hbWUgPT4gJ0lEJywKICAgICAgICAgICAgSFRNTFF1b3RlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQgfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBsYW5ndWFnZSBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xhbmd1YWdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgI2dldCBEYXRhCiAgICAgICAgbXkgJVBhcmFtRGF0YSA9ICgpOwogICAgICAgICRQYXJhbURhdGF7VXNlcklEfSA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBmb3IgKHF3KE5hbWUpKSB7CiAgICAgICAgICAgIGlmICggISggJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICkgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCAkXyAhIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIGlmICggISRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VEdXBsaWNhdGVDaGVjayggTmFtZSA9PiAkUGFyYW1EYXRhe05hbWV9ICkgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUFkZCggJVBhcmFtRGF0YSwgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEZBUSZTdWJhY3Rpb249TGFuZ3VhZ2UiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiTGFuZ3VhZ2UgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGxhbmd1YWdlIHVwZGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZUNoYW5nZScgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICNnZXQgRGF0YQogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBmb3IgKHF3KElEKSkgewogICAgICAgICAgICBpZiAoICEoICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgJF8gISIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICBteSAlTGFuZ3VhZ2VEYXRhCiAgICAgICAgICAgID0gJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUdldCggSUQgPT4gJFBhcmFtRGF0YXtJRH0sIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKTsKICAgICAgICBpZiAoICElTGFuZ3VhZ2VEYXRhICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7SGVhZGxpbmV9ICAgICAgID0gJ0NoYW5nZSc7CiAgICAgICAgJEZyb250ZW5ke0FkZExpbmt9ICAgICAgICA9ICcnOwogICAgICAgICRGcm9udGVuZHtTdWJhY3Rpb259ICAgICAgPSAnTGFuZ3VhZ2VDaGFuZ2UnOwogICAgICAgICRGcm9udGVuZHtMYW5ndWFnZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsgJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUxpc3QoIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKSB9LAogICAgICAgICAgICBTaXplID0+IDEwLAogICAgICAgICAgICBOYW1lID0+ICdJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgICAgICAgPT4gJExhbmd1YWdlRGF0YXtMYW5ndWFnZUlEfSwKICAgICAgICAgICAgSFRNTFF1b3RlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFuZ3VhZ2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQsICVMYW5ndWFnZURhdGEgfSwKICAgICAgICApOwoKICAgICAgICAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlRnJvbnRlbmQsICVMYW5ndWFnZURhdGEgfSwKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEZBUScsCiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgbGFuZ3VhZ2UgdXBkYXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdMYW5ndWFnZUNoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IERhdGEKICAgICAgICBteSAlUGFyYW1EYXRhID0gKCk7CiAgICAgICAgJFBhcmFtRGF0YXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgIGZvciAocXcoSUQgTmFtZSkpIHsKICAgICAgICAgICAgaWYgKCAhKCAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKSApICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkICRfICEiICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZHVwbGljYXRlIGNoZWNrCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntGQVFPYmplY3R9LT5MYW5ndWFnZUR1cGxpY2F0ZUNoZWNrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW1EYXRhe05hbWV9LAogICAgICAgICAgICAgICAgSUQgICA9PiAkUGFyYW1EYXRhe0lEfQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlVXBkYXRlKCAlUGFyYW1EYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1MYW5ndWFnZSIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJMYW5ndWFnZSAnJFBhcmFtRGF0YXtOYW1lfScgYWxyZWFkeSBleGlzdHMhIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0ZWdvcnkgdXBkYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5Q2hhbmdlJyApIHsKCiAgICAgICAgQFBhcmFtcyA9IHF3KENhdGVnb3J5SUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBpZiAoICEkU2VsZi0+e0FjY2Vzc1J3fSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAjIGNlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgPSAoKTsKICAgICAgICBmb3IgKHF3KENhdGVnb3J5SUQpKSB7CiAgICAgICAgICAgIGlmICggISggJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICkgKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCAkXyAhIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVDYXRlZ29yeURhdGEgPSAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5R2V0KAogICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRQYXJhbURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJUNhdGVnb3J5RGF0YSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5TG9uZ09wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdCggVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSApIH0gfSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEwLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENhdGVnb3J5RGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgSFRNTFF1b3RlICAgID0+IDEsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdCggVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSApIH0gfSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUGFyZW50SUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENhdGVnb3J5RGF0YXtQYXJlbnRJRH0sCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFJvb3RFbGVtZW50ICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgPT4geyAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJENhdGVnb3J5RGF0YXtWYWxpZElEfSwKICAgICAgICApOwogICAgICAgIG15ICRTZWxlY3RlZEdyb3VwcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+R2V0Q2F0ZWdvcnlHcm91cCgKICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkUGFyYW1EYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJUdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cExpc3QoIFZhbGlkID0+IDEgKTsKICAgICAgICAkRnJvbnRlbmR7R3JvdXBPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgID0+IFwlR3JvdXBzLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgPT4gJ1Blcm1pc3Npb25Hcm91cHMnLAogICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgPT4gMTIsCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBTZWxlY3RlZElEUmVmQXJyYXkgPT4gJFNlbGVjdGVkR3JvdXBzLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0hlYWRsaW5lfSAgICAgID0gJ1VwZGF0ZSc7CiAgICAgICAgJFBhcmFte0Zvcm1TdWJhY3Rpb259ID0gJ0NhdGVnb3J5Q2hhbmdlQWN0aW9uJzsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yeScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVGcm9udGVuZCwgJUNhdGVnb3J5RGF0YSB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcnlBZGRMaW5rJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSB1cGRhdGUgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NhdGVnb3J5Q2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSAgICAgID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBOYW1lIENvbW1lbnQpOwogICAgICAgIG15IEBQYXJhbXMgICAgICAgICA9IHF3KFBhcmVudElEIFZhbGlkSUQpOwogICAgICAgIGZvciAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgICAgICBpZiAoICEkUGFyYW1EYXRheyRffSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFtRGF0YXskX30gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR1cGxpY2F0ZSBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjaygKICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRQYXJhbURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBJRCAgICAgICA9PiAkUGFyYW1EYXRhe0NhdGVnb3J5SUR9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFtRGF0YXtQYXJlbnRJRH0KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBkYiBhY3Rpb24KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5VXBkYXRlKCAlUGFyYW1EYXRhLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgY2F0ZWdvcnlncm91cHMKICAgICAgICAgICAgICAgIG15IEBQZXJtaXNzaW9uR3JvdXBzCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICJQZXJtaXNzaW9uR3JvdXBzIiApOwogICAgICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5TZXRDYXRlZ29yeUdyb3VwKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJFBhcmFtRGF0YXtDYXRlZ29yeUlEfSwKICAgICAgICAgICAgICAgICAgICBHcm91cElEcyAgID0+IFxAUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50RkFRJlN1YmFjdGlvbj1DYXRlZ29yeSIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDYXRlZ29yeSAnJFBhcmFtRGF0YXtOYW1lfScgYWxyZWFkeSBleGlzdHMhIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRlZ29yeSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2F0ZWdvcnknICkgewoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKCiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5TG9uZ09wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgPT4geyAleyAkU2VsZi0+e0ZBUU9iamVjdH0tPkNhdGVnb3J5TGlzdCggVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSApIH0gfSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEwLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBIVE1MUXVvdGUgICAgPT4gMSwKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICAgICAgJEZyb250ZW5ke0NhdGVnb3J5T3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGQVFDYXRlZ29yeUxpc3RPcHRpb24oCiAgICAgICAgICAgIENhdGVnb3J5TGlzdCA9PiB7ICV7ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlMaXN0KCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICkgfSB9LAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdQYXJlbnRJRCcsCiAgICAgICAgICAgIEhUTUxRdW90ZSAgICA9PiAxLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFJvb3RFbGVtZW50ICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgJEZyb250ZW5ke1ZhbGlkT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgPT4geyAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSA9PiAnVmFsaWRJRCcsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17SGVhZGxpbmV9ICAgICAgPSAnQWRkJzsKICAgICAgICAkUGFyYW17Rm9ybVN1YmFjdGlvbn0gPSAnQ2F0ZWdvcnlBZGRBY3Rpb24nOwoKICAgICAgICAjIGdyb3VwIHBlcm1pc3Npb24KICAgICAgICBteSAlR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApOwogICAgICAgICRGcm9udGVuZHtHcm91cE9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICA9PiBcJUdyb3VwcywKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Blcm1pc3Npb25Hcm91cHMnLAogICAgICAgICAgICBTaXplICAgICA9PiAxMiwKICAgICAgICAgICAgTXVsdGlwbGUgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NhdGVnb3J5JywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0ZWdvcnkgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDYXRlZ29yeUFkZEFjdGlvbicgKSB7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgICAgICA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KE5hbWUgQ29tbWVudCk7CiAgICAgICAgbXkgQFBhcmFtcyAgICAgICAgID0gcXcoUGFyZW50SUQgVmFsaWRJRCk7CiAgICAgICAgZm9yIChAUmVxdWlyZWRQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgIGlmICggISRQYXJhbURhdGF7JF99ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiTmVlZCAkXyIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbURhdGF7JF99ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkICRfIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGR1cGxpY2F0ZSBjaGVjawogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlEdXBsaWNhdGVDaGVjaygKICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICRQYXJhbURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW1EYXRhe1BhcmVudElEfQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRDYXRlZ29yeUlECiAgICAgICAgICAgICAgICA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlBZGQoICVQYXJhbURhdGEsIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0gKTsKICAgICAgICAgICAgaWYgKCRDYXRlZ29yeUlEKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgY2F0ZWdvcnlncm91cHMKICAgICAgICAgICAgICAgIG15IEBQZXJtaXNzaW9uR3JvdXBzCiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICJQZXJtaXNzaW9uR3JvdXBzIiApOwogICAgICAgICAgICAgICAgJFNlbGYtPntGQVFPYmplY3R9LT5TZXRDYXRlZ29yeUdyb3VwKAogICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gJENhdGVnb3J5SUQsCiAgICAgICAgICAgICAgICAgICAgR3JvdXBJRHMgICA9PiBcQFBlcm1pc3Npb25Hcm91cHMsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudEZBUSZTdWJhY3Rpb249Q2F0ZWdvcnkiCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2F0ZWdvcnkgJyRQYXJhbURhdGF7TmFtZX0nIGFscmVhZHkgZXhpc3RzISIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCgogICAgICAgICMgZHRsCiAgICAgICAgJEZyb250ZW5ke0xhbmd1YWdlT3B0aW9ufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgPT4geyAkU2VsZi0+e0ZBUU9iamVjdH0tPkxhbmd1YWdlTGlzdCgpIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0xhbmd1YWdlSUQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFNlbGVjdGVkICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgIG15ICRDYXRlZ29yaWVzID0gJFNlbGYtPntGQVFPYmplY3R9LT5HZXRVc2VyQ2F0ZWdvcmllcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycKICAgICAgICApOwogICAgICAgICRGcm9udGVuZHtDYXRlZ29yeU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RkFRQ2F0ZWdvcnlMaXN0T3B0aW9uKAogICAgICAgICAgICBDYXRlZ29yeUxpc3QgICAgICAgID0+ICRDYXRlZ29yaWVzLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDYXRlZ29yeUlEJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CgogICAgICAgICRGcm9udGVuZHtTdGF0ZU9wdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhICAgICA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAnaW50ZXJuYWwgKGFnZW50KScsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmaWVsZHMKICAgICAgICAkU2VsZi0+X0dldEl0ZW1GaWVsZHMoCiAgICAgICAgICAgIEl0ZW1EYXRhID0+IHt9CiAgICAgICAgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhUaXRsZSk7CgogICAgICAgICMgcGVybWlzc2lvbiBjaGVjawogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgICAgICA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgVGl0bGUpOwogICAgICAgIG15IEBQYXJhbXMKICAgICAgICAgICAgPSBxdyhTdGF0ZUlEIExhbmd1YWdlSUQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgS2V5d29yZHMgVGl0bGUpOwogICAgICAgIGZvciAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgICAgICBpZiAoICEkUGFyYW1EYXRheyRffSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoQFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICB9CgogICAgICAgICMgaW5zZXJ0IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFBZGQoCiAgICAgICAgICAgICVQYXJhbURhdGEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICBpZiAoICEkSXRlbUlEICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPkF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VmlldyZJdGVtSUQ9JEl0ZW1JRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpdGVtIHVwZGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGUnICkgewoKICAgICAgICBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSAgICAgID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoQ2F0ZWdvcnlJRCBJdGVtSUQpOwogICAgICAgIGZvciAoQFJlcXVpcmVkUGFyYW1zKSB7CiAgICAgICAgICAgICRQYXJhbURhdGF7JF99ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkXyApOwogICAgICAgICAgICBpZiAoICEkUGFyYW1EYXRheyRffSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRiIGFjdGlvbgogICAgICAgIG15ICVJdGVtRGF0YSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJUl0ZW1EYXRhICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBkdGwKICAgICAgICAkRnJvbnRlbmR7TGFuZ3VhZ2VPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgICAgICA9PiAkSXRlbURhdGF7TGFuZ3VhZ2VJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAkQ2F0ZWdvcmllcyA9ICRTZWxmLT57RkFRT2JqZWN0fS0+R2V0VXNlckNhdGVnb3JpZXMoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAncncnCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7Q2F0ZWdvcnlPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZBUUNhdGVnb3J5TGlzdE9wdGlvbigKICAgICAgICAgICAgQ2F0ZWdvcnlMaXN0ICAgICAgICA9PiAkQ2F0ZWdvcmllcywKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgICAgICA9PiAkSXRlbURhdGF7Q2F0ZWdvcnlJRH0sCiAgICAgICAgKTsKICAgICAgICAkRnJvbnRlbmR7U3RhdGVPcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PcHRpb25TdHJnSGFzaFJlZigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVMaXN0KCkgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEl0ZW1EYXRhe1N0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVJdGVtRGF0YSwgJUZyb250ZW5kIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudEluZGV4ID0gJFNlbGYtPntGQVFPYmplY3R9LT5BdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50SW5kZXgpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZUF0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVJdGVtRGF0YSwgJXskQXR0YWNobWVudH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZmllbGRzCiAgICAgICAgJFNlbGYtPl9HZXRJdGVtRmllbGRzKAogICAgICAgICAgICBJdGVtRGF0YSA9PiBcJUl0ZW1EYXRhCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQKICAgICAgICAkSGVhZGVyVGl0bGUgPSAnRWRpdCc7CiAgICAgICAgJEhlYWRlciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCBUeXBlID0+ICRIZWFkZXJUeXBlLCBUaXRsZSA9PiAkSGVhZGVyVGl0bGUgKTsKCiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgaXRlbSB1cGRhdGUgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1VwZGF0ZUFjdGlvbicgKSB7CgogICAgICAgIEBQYXJhbXMgPSBxdyhJdGVtSUQgVGl0bGUgQ2F0ZWdvcnlJRCBTdGF0ZUlEIExhbmd1YWdlSUQpOwoKICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKCiAgICAgICAgaWYgKCAhJFNlbGYtPntBY2Nlc3NSd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwYXJhbWV0ZXJzCiAgICAgICAgbXkgJVBhcmFtRGF0YSAgICAgID0gKCk7CiAgICAgICAgbXkgQFJlcXVpcmVkUGFyYW1zID0gcXcoVGl0bGUgQ2F0ZWdvcnlJRCk7CiAgICAgICAgbXkgQFBhcmFtcyA9IHF3KEl0ZW1JRCBTdGF0ZUlEIExhbmd1YWdlSUQgRmllbGQxIEZpZWxkMiBGaWVsZDMgRmllbGQ0IEZpZWxkNSBGaWVsZDYgS2V5d29yZHMKICAgICAgICAgICAgQXR0YWNobWVudFVwbG9hZCBBdHRhY2htZW50RGVsZXRlMCBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTAgQXR0YWNobWVudERlbGV0ZTExIEF0dGFjaG1lbnREZWxldGUxMgogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlMTMgQXR0YWNobWVudERlbGV0ZTE0IEF0dGFjaG1lbnREZWxldGUxNSBBdHRhY2htZW50RGVsZXRlMTYpOwoKICAgICAgICBmb3IgKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICAgICAgaWYgKCAhJFBhcmFtRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICBteSAkUmVkaXJlY3QgPSAxOwoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yICggMCAuLiAxNiApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW1EYXRheyJBdHRhY2htZW50RGVsZXRlJF8ifSApIHsKICAgICAgICAgICAgICAgICRSZWRpcmVjdCA9IDA7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0ZBUU9iamVjdH0tPkF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRQYXJhbURhdGF7SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgaWYgKCAkUGFyYW1EYXRhe0F0dGFjaG1lbnRVcGxvYWR9ICkgewogICAgICAgICAgICAkUmVkaXJlY3QgPSAwOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICJmaWxlX3VwbG9hZCIsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ3N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+QXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBpdGVtCiAgICAgICAgbXkgJFVwZGF0ZSA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRVXBkYXRlKAogICAgICAgICAgICAlUGFyYW1EYXRhLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFJlZGlyZWN0KSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVZpZXcmSXRlbUlEPSRHZXRQYXJhbXtJdGVtSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249VXBkYXRlJkl0ZW1JRD0kR2V0UGFyYW17SXRlbUlEfSZDYXRlZ29yeUlEPSRHZXRQYXJhbXtDYXRlZ29yeUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBpdGVtIHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgewoKICAgICAgICBAUGFyYW1zID0gcXcoSXRlbUlEKTsKCiAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrCgogICAgICAgIGlmICggISRTZWxmLT57QWNjZXNzUnd9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGFyYW1ldGVycwogICAgICAgIG15ICVQYXJhbURhdGEgICAgICA9ICgpOwogICAgICAgIG15IEBSZXF1aXJlZFBhcmFtcyA9IHF3KENhdGVnb3J5SUQgSXRlbUlEKTsKICAgICAgICBmb3IgKEBSZXF1aXJlZFBhcmFtcykgewogICAgICAgICAgICAkUGFyYW1EYXRheyRffSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJF8gKTsKICAgICAgICAgICAgaWYgKCAhJFBhcmFtRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKEBQYXJhbXMpIHsKICAgICAgICAgICAgJFBhcmFtRGF0YXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgfQoKICAgICAgICAjI