MarkTicketSeenUnseen
10.1.2
Rother OSS GmbH
http://otobo.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
- Change OTOBO to Rother OSS GmbH
- Initial release.
Mark whole tickets or single articles as unseen or seen.
Komplette Tickets oder einzelne Artikel als ungelesen oder gelesen markieren.
10.1.x
$Kernel::OM->Get('var::packagesetup::OTOBOMarkTicketSeenUnseen')->CodeInstall();
$Kernel::OM->Get('var::packagesetup::OTOBOMarkTicketSeenUnseen')->CodeUpgrade();
$Kernel::OM->Get('var::packagesetup::OTOBOMarkTicketSeenUnseen')->CodeUninstall();
$Kernel::OM->Get('var::packagesetup::OTOBOMarkTicketSeenUnseen')->CodeReinstall();
2022-05-15 17:50:18
opms
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDaGFuZ2VzIj4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5NYXJrIHRpY2tldCBhcnRpY2xlKHMpIGFzICh1bilzZWVuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiPk1hcmsgdGlja2V0IGFzICh1bilzZWVuPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjTWFya1RpY2tldFVuc2VlblJlZGlyZWN0VVJMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzIGF2YWlsYWJsZSBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldy4gVGhlIGRlZmF1bHQgcmVkaXJlY3QgVVJMIGZyb20gU3lzQ29uZmlnICdNYXJrVGlja2V0VW5zZWVuUmVkaXJlY3REZWZhdWx0VVJMJyBpcyB1c2VkIGlmIG5vIHNlbGVjdGlvbiBpcyBtYWRlIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6UHJlZmVyZW5jZXM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXM6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZlcmVuY2VHcm91cCI+TWlzY2VsbGFuZW91czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiIFRyYW5zbGF0YWJsZT0iMSI+RGlhbG9nIHRvIHNob3cgYWZ0ZXIgbWFya2luZyBhIHRpY2tldCBhcyB1bnNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSIgVHJhbnNsYXRhYmxlPSIxIj5EaWFsb2cgdG8gc2hvdyBhZnRlciBtYXJraW5nIGEgdGlja2V0IGFzIHVuc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj4tPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudERhc2hib2FyZCIgVHJhbnNsYXRhYmxlPSIxIj5EYXNoYm9hcmQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uPUFnZW50VGlja2V0UGhvbmUiIFRyYW5zbGF0YWJsZT0iMSI+TmV3IHBob25lIHRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb249QWdlbnRUaWNrZXRFbWFpbCIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgZW1haWwgdGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudFRpY2tldFF1ZXVlIiBUcmFuc2xhdGFibGU9IjEiPlF1ZXVlIHZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uPUFnZW50VGlja2V0RXNjYWxhdGlvblZpZXciIFRyYW5zbGF0YWJsZT0iMSI+RXNjYWxhdGlvbiB2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudFRpY2tldFN0YXR1c1ZpZXciIFRyYW5zbGF0YWJsZT0iMSI+U3RhdHVzIHZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0jIyNUaWNrZXRJRCMjIyMxIiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBab29tPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGF0YVNlbGVjdGVkIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlVzZXJNYXJrVGlja2V0VW5zZWVuUmVkaXJlY3RVUkw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjQwMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJNYXJrVGlja2V0VW5zZWVuUmVkaXJlY3REZWZhdWx0VVJMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHJlZGlyZWN0IFVSTCBmb3Igc2V0dGluZyBhIHRpY2tldCBhcnRpY2xlIHRvICd1bnNlZW4nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6T1RPQk86Ok1hcmtUaWNrZXRTZWVuVW5zZWVuPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IkFjdGlvbj1BZ2VudERhc2hib2FyZCI+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudERhc2hib2FyZCIgVHJhbnNsYXRhYmxlPSIxIj5EYXNoYm9hcmQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldFBob25lIiBUcmFuc2xhdGFibGU9IjEiPk5ldyBwaG9uZSB0aWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldEVtYWlsIiBUcmFuc2xhdGFibGU9IjEiPk5ldyBlbWFpbCB0aWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldFF1ZXVlIiBUcmFuc2xhdGFibGU9IjEiPlF1ZXVlIHZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldEVzY2FsYXRpb25WaWV3IiBUcmFuc2xhdGFibGU9IjEiPkVzY2FsYXRpb24gdmlldzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0aW9uPUFnZW50VGlja2V0U3RhdHVzVmlldyIgVHJhbnNsYXRhYmxlPSIxIj5TdGF0dXMgdmlldzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0jIyNUaWNrZXRJRCMjIyMxIiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBab29tPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjTWFya1RpY2tldFNlZW5SZWRpcmVjdFVSTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBjb25maWcgcGFyYW1ldGVycyBhdmFpbGFibGUgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcuIFRoZSBkZWZhdWx0IHJlZGlyZWN0IFVSTCBmcm9tIFN5c0NvbmZpZyAnTWFya1RpY2tldFNlZW5SZWRpcmVjdERlZmF1bHRVUkwnIGlzIHVzZWQgaWYgbm8gc2VsZWN0aW9uIGlzIG1hZGUgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpQcmVmZXJlbmNlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZmVyZW5jZUdyb3VwIj5NaXNjZWxsYW5lb3VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5EaWFsb2cgdG8gc2hvdyBhZnRlciBtYXJraW5nIGEgdGlja2V0IGFzIHNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IktleSIgVHJhbnNsYXRhYmxlPSIxIj5EaWFsb2cgdG8gc2hvdyBhZnRlciBtYXJraW5nIGEgdGlja2V0IGFzIHNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IiI+LTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb249QWdlbnREYXNoYm9hcmQiIFRyYW5zbGF0YWJsZT0iMSI+RGFzaGJvYXJkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudFRpY2tldFBob25lIiBUcmFuc2xhdGFibGU9IjEiPk5ldyBwaG9uZSB0aWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uPUFnZW50VGlja2V0RW1haWwiIFRyYW5zbGF0YWJsZT0iMSI+TmV3IGVtYWlsIHRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb249QWdlbnRUaWNrZXRRdWV1ZSIgVHJhbnNsYXRhYmxlPSIxIj5RdWV1ZSB2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudFRpY2tldEVzY2FsYXRpb25WaWV3IiBUcmFuc2xhdGFibGU9IjEiPkVzY2FsYXRpb24gdmlldzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3Rpb249QWdlbnRUaWNrZXRTdGF0dXNWaWV3IiBUcmFuc2xhdGFibGU9IjEiPlN0YXR1cyB2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9IyMjVGlja2V0SUQjIyMjMSIgVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgWm9vbTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGFTZWxlY3RlZCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Vc2VyTWFya1RpY2tldFNlZW5SZWRpcmVjdFVSTDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJpbyI+NDAwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik1hcmtUaWNrZXRTZWVuUmVkaXJlY3REZWZhdWx0VVJMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHJlZGlyZWN0IFVSTCBmb3Igc2V0dGluZyBhIHRpY2tldCBhcnRpY2xlIHRvICdzZWVuJy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6Ok9UT0JPOjpNYXJrVGlja2V0U2VlblVuc2VlbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPSJBY3Rpb249QWdlbnREYXNoYm9hcmQiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3Rpb249QWdlbnREYXNoYm9hcmQiIFRyYW5zbGF0YWJsZT0iMSI+RGFzaGJvYXJkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3Rpb249QWdlbnRUaWNrZXRQaG9uZSIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgcGhvbmUgdGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3Rpb249QWdlbnRUaWNrZXRFbWFpbCIgVHJhbnNsYXRhYmxlPSIxIj5OZXcgZW1haWwgdGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3Rpb249QWdlbnRUaWNrZXRRdWV1ZSIgVHJhbnNsYXRhYmxlPSIxIj5RdWV1ZSB2aWV3PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJBY3Rpb249QWdlbnRUaWNrZXRFc2NhbGF0aW9uVmlldyIgVHJhbnNsYXRhYmxlPSIxIj5Fc2NhbGF0aW9uIHZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldFN0YXR1c1ZpZXciIFRyYW5zbGF0YWJsZT0iMSI+U3RhdHVzIHZpZXc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9IyMjVGlja2V0SUQjIyMjMSIgVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgWm9vbTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMDAxLU1hcmtUaWNrZXRVbnNlZW4iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVnaXN0ZXJzIGEgbGluayBpbiB0aGUgdGlja2V0IG1lbnUgdG8gbWFyayBhIHRpY2tldCBhcyB1bnNlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldFpvb206Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TWFyayBhcyB1bnNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hcmsgdGlja2V0IGFzIHVuc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuO1N1YmFjdGlvbj1VbnNlZW47VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2x1c3Rlck5hbWUiPk1hcmsgYXMgKHVuKXNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsdXN0ZXJQcmlvcml0eSI+MTAwPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMwMDEtTWFya1RpY2tldFNlZW4iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVnaXN0ZXJzIGEgbGluayBpbiB0aGUgdGlja2V0IG1lbnUgdG8gbWFyayBhIHRpY2tldCBhcyBzZWVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRab29tOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPk1hcmsgYXMgc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TWFyayB0aWNrZXQgYXMgc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuO1N1YmFjdGlvbj1TZWVuO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9wdXBUeXBlIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsdXN0ZXJOYW1lIj5NYXJrIGFzICh1bilzZWVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbHVzdGVyUHJpb3JpdHkiPjIwMDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlIyMjNDQyLU1hcmtUaWNrZXRVbnNlZW4iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVnaXN0ZXJzIGEgbGluayBpbiB0aGUgdGlja2V0IG1lbnUgb2YgdGlja2V0IG92ZXJ2aWV3cyB0byBtYXJrIGFsbCBhcnRpY2xlcyBvZiB0aGUgdGlja2V0IGFzIHVuc2Vlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0T3ZlcnZpZXc6Ok1lbnVNb2R1bGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudTo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TWFyayBhcyB1bnNlZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hcmsgdGlja2V0IGFzIHVuc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuO1N1YmFjdGlvbj1VbnNlZW47VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV07UmVkaXJlY3RUb1NlYXJjaD0xOzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0Ij48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBvcHVwVHlwZSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUjIyM0NDItTWFya1RpY2tldFNlZW4iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UmVnaXN0ZXJzIGEgbGluayBpbiB0aGUgdGlja2V0IG1lbnUgb2YgdGlja2V0IG92ZXJ2aWV3cyB0byBtYXJrIGFsbCBhcnRpY2xlcyBvZiB0aGUgdGlja2V0IGFzIHNlZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldE92ZXJ2aWV3OjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPk1hcmsgYXMgc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+TWFyayB0aWNrZXQgYXMgc2VlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aW9uIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxpbmsiPkFjdGlvbj1BZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuO1N1YmFjdGlvbj1TZWVuO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdO1JlZGlyZWN0VG9TZWFyY2g9MTs8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCMjI09UT0JPTWFya1RpY2tldFNlZW5VbnNlZW5CdWxrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlZ2lzdGVycyBhbiBvdXRwdXQgZmlsdGVyIHRoYXQgYWRkcyB0aGUgJ01hcmsgdGlja2V0cyBhcyB1bnNlZW4nIHNlbGVjdGlvbiB0byB0aGUgYnVsayB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6Ok91dHB1dEZpbHRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGaWx0ZXJFbGVtZW50UG9zdDo6T1RPQk9NYXJrVGlja2V0U2VlblVuc2VlbkJ1bGs8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlcyI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0QnVsayI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCMjI09UT0JPTWFya1RpY2tldFNlZW5VbnNlZW5CdWxrQWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlZ2lzdGVycyBhbiBvdXRwdXQgZmlsdGVyIHRoYXQgYWRkcyB0aGUgJ01hcmsgdGlja2V0cyBhcyB1bnNlZW4nIHNlbGVjdGlvbiB0byB0aGUgYnVsayB2aWV3LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6Ok91dHB1dEZpbHRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGaWx0ZXJFbGVtZW50UG9zdDo6T1RPQk9NYXJrVGlja2V0U2VlblVuc2VlbkJ1bGtBY3Rpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlcyI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZvb3RlciI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZvb3RlclNtYWxsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9PVE9CT01hcmtUaWNrZXRTZWVuVW5zZWVuOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJEZWZpbmVzIHRoZSBjb25maWcgcGFyYW1ldGVycyBhdmFpbGFibGUgaW4gdGhlIHByZWZlcmVuY2VzIHZpZXcuIFRoZSBkZWZhdWx0IHJlZGlyZWN0IFVSTCBmcm9tIFN5c0NvbmZpZyAnTWFya1RpY2tldFVuc2VlblJlZGlyZWN0RGVmYXVsdFVSTCcgaXMgdXNlZCBpZiBubyBzZWxlY3Rpb24gaXMgbWFkZSBieSB0aGUgYWdlbnQuIn0KICAgICAgICA9ICJEZWZpbmllcnQgZGllIHp1ciBWZXJmw7xndW5nIHN0ZWhlbmRlbiBLb25maWd1cmF0aW9uc3BhcmFtZXRlciBpbiBkZXIgRWluc3RlbGx1bmdzYW5zaWNodC4gRGVyIFN0YW5kYXJkLVVtbGVpdHVuZ3MtVVJMIGRlciBTeXNDb25maWctRWluc3RlbGx1bmcgJ01hcmtUaWNrZXRVbnNlZW5SZWRpcmVjdERlZmF1bHRVUkwnIHdpcmQgdmVyd2VuZGV0LCBmYWxscyBkZXIgQWdlbnQga2VpbmUgQXVzd2FobCBnZXRyb2ZmZW4gaGF0LiI7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyJEZWZpbmVzIHRoZSByZWRpcmVjdCBVUkwgZm9yIHNldHRpbmcgYSB0aWNrZXQgYXJ0aWNsZSB0byAndW5zZWVuLiJ9CiAgICAgICAgPSAiRGVmaW5pZXJ0IGRlbiBVUkwsIHp1IGRlbSB1bWdlbGVpdGV0IHdpcmQsIG5hY2hkZW0gZWluIEFydGlrZWwgYXVmICd1bmdlbGVzZW4nIGdlc2V0enQgd3VyZGUuIjsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IkRlZmluZXMgdGhlIGNvbmZpZyBwYXJhbWV0ZXJzIGF2YWlsYWJsZSBpbiB0aGUgcHJlZmVyZW5jZXMgdmlldy4gVGhlIGRlZmF1bHQgcmVkaXJlY3QgVVJMIGZyb20gU3lzQ29uZmlnICdNYXJrVGlja2V0U2VlblJlZGlyZWN0RGVmYXVsdFVSTCcgaXMgdXNlZCBpZiBubyBzZWxlY3Rpb24gaXMgbWFkZSBieSB0aGUgYWdlbnQuIn0KICAgICAgICA9ICJEZWZpbmllcnQgZGllIHp1ciBWZXJmw7xndW5nIHN0ZWhlbmRlbiBLb25maWd1cmF0aW9uc3BhcmFtZXRlciBpbiBkZXIgRWluc3RlbGx1bmdzYW5zaWNodC4gRGVyIFN0YW5kYXJkLVVtbGVpdHVuZ3MtVVJMIGRlciBTeXNDb25maWctRWluc3RlbGx1bmcgJ01hcmtUaWNrZXRTZWVuUmVkaXJlY3REZWZhdWx0VVJMJyB3aXJkIHZlcndlbmRldCwgZmFsbHMgZGVyIEFnZW50IGtlaW5lIEF1c3dhaGwgZ2V0cm9mZmVuIGhhdC4iOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiRGVmaW5lcyB0aGUgcmVkaXJlY3QgVVJMIGZvciBzZXR0aW5nIGEgdGlja2V0IGFydGljbGUgdG8gJ3NlZW4nLiJ9CiAgICAgICAgPSAiRGVmaW5pZXJ0IGRlbiBVUkwsIHp1IGRlbSB1bWdlbGVpdGV0IHdpcmQsIG5hY2hkZW0gZWluIEFydGlrZWwgYXVmICdnZWxlc2VuJyBnZXNldHp0IHd1cmRlLiI7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWdpc3RlcnMgYSBsaW5rIGluIHRoZSB0aWNrZXQgbWVudSB0byBtYXJrIGEgdGlja2V0IGFzIHVuc2Vlbi4nfQogICAgICAgID0gJ1JlZ2lzdHJpZXJ0IGVpbmVuIExpbmsgaW0gVGlja2V0bWVuw7wsIHVtIGVpbiBUaWNrZXQgYWxzIHVuZ2VsZXNlbiB6dSBtYXJraWVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlZ2lzdGVycyBhIGxpbmsgaW4gdGhlIHRpY2tldCBtZW51IHRvIG1hcmsgYSB0aWNrZXQgYXMgc2Vlbi4nfQogICAgICAgID0gJ1JlZ2lzdHJpZXJ0IGVpbmVuIExpbmsgaW0gVGlja2V0bWVuw7wsIHVtIGVpbiBUaWNrZXQgYWxzIGdlbGVzZW4genUgbWFya2llcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWdpc3RlcnMgYSBsaW5rIGluIHRoZSB0aWNrZXQgbWVudSBvZiB0aWNrZXQgb3ZlcnZpZXdzIHRvIG1hcmsgYWxsIGFydGljbGVzIG9mIHRoZSB0aWNrZXQgYXMgdW5zZWVuLid9CiAgICAgICAgPSAnUmVnaXN0cmllcnQgZWluZW4gTGluayBpbSBUaWNrZXRtZW7DvCB2b24gVGlja2V0w7xiZXJzaWNodGVuLCB1bSBlaW4gVGlja2V0IGFscyB1bmdlbGVzZW4genUgbWFya2llcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWdpc3RlcnMgYSBsaW5rIGluIHRoZSB0aWNrZXQgbWVudSBvZiB0aWNrZXQgb3ZlcnZpZXdzIHRvIG1hcmsgYWxsIGFydGljbGVzIG9mIHRoZSB0aWNrZXQgYXMgc2Vlbi4nfQogICAgICAgID0gJ1JlZ2lzdHJpZXJ0IGVpbmVuIExpbmsgaW0gVGlja2V0bWVuw7wgdm9uIFRpY2tldMO8YmVyc2ljaHRlbiwgdW0gZWluIFRpY2tldCBhbHMgZ2VsZXNlbiB6dSBtYXJraWVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57IlJlZ2lzdGVycyBhbiBvdXRwdXQgZmlsdGVyIHRoYXQgYWRkcyBhICdNYXJrIGFydGljbGUgYXMgdW5zZWVuJyBsaW5rIHRvIHRoZSBhcnRpY2xlIG1lbnUuIn0KICAgICAgICA9ICdSZWdpc3RyaWVydCBlaW5lbiBPdXRwdXQtRmlsdGVyLCBkZXIgZWluZW4gTGluayB6dXIgTWFya2llcnVuZyBlaW5lcyBBcnRpa2VscyBhbHMgdW5nZWxlc2VuIHp1bSBBcnRpa2VsbWVuw7wgaGluenVmw7xndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsiUmVnaXN0ZXJzIGFuIG91dHB1dCBmaWx0ZXIgdGhhdCBhZGRzIHRoZSAnTWFyayB0aWNrZXRzIGFzIHVuc2Vlbicgc2VsZWN0aW9uIHRvIHRoZSBidWxrIHZpZXcuIn0KICAgICAgICA9ICdSZWdpc3RyaWVydCBlaW5lbiBPdXRwdXQtRmlsdGVyLCBkZXIgZGllIEF1c3dhaGwgZsO8ciBhbHMgdW5nZWxlc2VuIHp1IG1hcmtpZXJlbmRlIFRpY2tldHMgenVyIFNhbW1lbGFrdGlvbi1BbnNpY2h0IGhpbnp1ZsO8Z3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hcmsgdGlja2V0IGFydGljbGUocykgYXMgKHVuKXNlZW4nfQogICAgICAgID0gJ1RpY2tldGFydGlrZWwgYWxzICh1bilnZWxlc2VuIG1hcmtpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXJrIHRpY2tldCBhcyAodW4pc2Vlbid9CiAgICAgICAgPSAnVGlja2V0IGFscyAodW4pZ2VsZXNlbiBtYXJraWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlhbG9nIHRvIHNob3cgYWZ0ZXIgbWFya2luZyBhIHRpY2tldCBhcyB1bnNlZW4nfQogICAgICAgID0gJ0RpYWxvZywgZGVyIGFuZ2V6ZWlndCB3aXJkLCBuYWNoZGVtIGVpbiBUaWNrZXQgYWxzIHVuZ2VsZXNlbiBtYXJraWVydCB3dXJkZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlhbG9nIHRvIHNob3cgYWZ0ZXIgbWFya2luZyBhIHRpY2tldCBhcyBzZWVuJ30gPSAnRGlhbG9nLCBkZXIgYW5nZXplaWd0IHdpcmQsIG5hY2hkZW0gZWluIFRpY2tldCBhbHMgZ2VsZXNlbiBtYXJraWVydCB3dXJkZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFyayBhcyB1bnNlZW4nfSA9ICdBbHMgdW5nZWxlc2VuIG1hcmtpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXJrIGFzIHNlZW4nfSA9ICdBbHMgZ2VsZXNlbiBtYXJraWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFyayB0aWNrZXQgYXMgdW5zZWVuJ30gPSAnVGlja2V0IGFscyB1bmdlbGVzZW4gbWFya2llcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hcmsgdGlja2V0IGFzIHNlZW4nfSA9ICdUaWNrZXQgYWxzIGdlbGVzZW4gbWFya2llcmVuJzsKCiAgICAjIFRlbXBsYXRlcyBhbmQgb3V0cHV0IGZpbHRlcnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hcmsgYXJ0aWNsZSBhcyB1bnNlZW4nfSA9ICdBcnRpa2VsIGFscyB1bmdlbGVzZW4gbWFya2llcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hcmsgdGlja2V0cyBhcyBzZWVuJ30gPSAnVGlja2V0cyBhbHMgZ2VsZXNlbiBtYXJraWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFyayB0aWNrZXRzIGFzIHVuc2Vlbid9ID0gJ1RpY2tldHMgYWxzIHVuZ2VsZXNlbiBtYXJraWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFyayBhcyAodW4pc2Vlbid9ID0gJ1RpY2tldCAodW4pZ2VsZXNlbic7CiAgICByZXR1cm4gMTsKfQoKMTsKCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0TWFya1NlZW5VbnNlZW47Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkVXNlck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRQYXJhbSAocXcoVGlja2V0SUQgQXJ0aWNsZUlEIFN1YmFjdGlvbikpIHsKICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApOwogICAgfQoKICAgIGZvciBteSAkUmVxdWlyZWRQYXJhbSAocXcoVGlja2V0SUQgU3ViYWN0aW9uKSkgewogICAgICAgIGlmICggISRHZXRQYXJhbXskUmVxdWlyZWRQYXJhbX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJOZWVkICRSZXF1aXJlZFBhcmFtISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXNjYWxhciBncmVwIHsgJEdldFBhcmFte1N1YmFjdGlvbn0gZXEgJF8gfSBxdyggU2VlbiBVbnNlZW4gKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICJJbnZhbGlkIHZhbHVlICckR2V0UGFyYW17U3ViYWN0aW9ufScgZm9yIHBhcmFtZXRlciAnU3ViYWN0aW9uJyEiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICAgPT4gJEdldFBhcmFte1RpY2tldElEfSwKICAgICk7CgogICAgbXkgQEFydGljbGVJRHM7CiAgICBpZiAoQEFydGljbGVzKSB7CiAgICAgICAgQEFydGljbGVJRHMgPSBtYXAgeyAkXy0+e0FydGljbGVJRH0gfSBAQXJ0aWNsZXM7CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICBpZiAoICFzY2FsYXIgZ3JlcCB7ICRHZXRQYXJhbXtBcnRpY2xlSUR9IGVxICRfIH0gQEFydGljbGVJRHMgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgZmluZCBBcnRpY2xlSUQgJyRHZXRQYXJhbXtBcnRpY2xlSUR9JyBvZiB0aWNrZXQgd2l0aCBUaWNrZXRJRCAnJEdldFBhcmFte1RpY2tldElEfSchIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmV2ZXJzZSB0aGUgQXJ0aWNsZUlEcyB0byBnZXQgdGhlIGNvcnJlY3QgaW5kZXggZm9yIHRoZSByZWRpcmVjdCBVUkwKICAgICAgICBAQXJ0aWNsZUlEcyA9IHJldmVyc2UgQEFydGljbGVJRHM7CgogICAgICAgICMgcmVtZW1iZXIgYXJ0aWNsZSBpbmRleCBmb3IgbGF0ZXIgcmVwbGFjZW1lbnQgaW4gcmVkaXJlY3QgVVJMCiAgICAgICAgKCAkR2V0UGFyYW17QXJ0aWNsZUluZGV4fSApID0gZ3JlcCB7ICRBcnRpY2xlSURzWyRfXSBlcSAkR2V0UGFyYW17QXJ0aWNsZUlEfSB9IDAgLi4gJCNBcnRpY2xlSURzOwoKICAgICAgICBAQXJ0aWNsZUlEcyA9ICggJEdldFBhcmFte0FydGljbGVJRH0gKTsKICAgIH0KCiAgICAjIGRldGVybWluZSByZXF1aXJlZCBmdW5jdGlvbiBmb3Igc3ViYWN0aW9uCiAgICBteSAkVGlja2V0QWN0aW9uRnVuY3Rpb24gID0gJ1RpY2tldEZsYWdEZWxldGUnOwogICAgbXkgJEFydGljbGVBY3Rpb25GdW5jdGlvbiA9ICdBcnRpY2xlRmxhZ0RlbGV0ZSc7CgogICAgaWYgKCAkR2V0UGFyYW17U3ViYWN0aW9ufSBlcSAnU2VlbicgKSB7CiAgICAgICAgJFRpY2tldEFjdGlvbkZ1bmN0aW9uICA9ICdUaWNrZXRGbGFnU2V0JzsKICAgICAgICAkQXJ0aWNsZUFjdGlvbkZ1bmN0aW9uID0gJ0FydGljbGVGbGFnU2V0JzsKICAgIH0KCiAgICAjIHBlcmZvcm0gYWN0aW9uCiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlSUQgKCBzb3J0IEBBcnRpY2xlSURzICkgewoKICAgICAgICAjIGFydGljbGUgZmxhZwogICAgICAgIG15ICRTdWNjZXNzID0gJEFydGljbGVPYmplY3QtPiRBcnRpY2xlQWN0aW9uRnVuY3Rpb24oCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdTZWVuJywKICAgICAgICAgICAgVmFsdWUgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgIyBpcnJlbGV2YW50IGluIGNhc2Ugb2YgZGVsZXRlCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBBUlRJQ0xFIGlmICRTdWNjZXNzOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICJFcnJvciB3aGlsZSBzZXR0aW5nIGFydGljbGUgd2l0aCBBcnRpY2xlSUQgJyRBcnRpY2xlSUQnICIgLgogICAgICAgICAgICAgICAgIm9mIHRpY2tldCB3aXRoIFRpY2tldElEICckR2V0UGFyYW17VGlja2V0SUR9JyBhcyAiIC4KICAgICAgICAgICAgICAgICggbGMgJEdldFBhcmFte1N1YmFjdGlvbn0gKSAuCiAgICAgICAgICAgICAgICAiISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmbGFnCiAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPiRUaWNrZXRBY3Rpb25GdW5jdGlvbigKICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgIEtleSAgICAgID0+ICdTZWVuJywKICAgICAgICBWYWx1ZSAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICMgaXJyZWxldmFudCBpbiBjYXNlIG9mIGRlbGV0ZQogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiRXJyb3Igd2hpbGUgc2V0dGluZyB0aWNrZXQgd2l0aCAiIC4KICAgICAgICAgICAgICAgICJUaWNrZXRJRCAnJEdldFBhcmFte1RpY2tldElEfScgYXMgIiAuCiAgICAgICAgICAgICAgICAoIGxjICRHZXRQYXJhbXtTdWJhY3Rpb259ICkgLgogICAgICAgICAgICAgICAgIiEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgYmFjayB0byBvdXIgbGFzdCBzZWFyY2ggcmVzdWx0IGlmIHRoZSByZXF1ZXN0IGNhbWUgZnJvbSBhIHNlYXJjaCB2aWV3CiAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZWRpcmVjdFRvU2VhcmNoJyApICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gJ0FjdGlvbj1BZ2VudFRpY2tldFNlYXJjaDtTdWJhY3Rpb249U2VhcmNoO1Byb2ZpbGU9bGFzdC1zZWFyY2g7VGFrZUxhc3RTZWFyY2g9MTsnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkUmVkaXJlY3RVUkwgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlck1hcmtUaWNrZXQnIC4gJEdldFBhcmFte1N1YmFjdGlvbn0gLiAnUmVkaXJlY3RVUkwnIH07CiAgICAkUmVkaXJlY3RVUkwgfHw9ICRDb25maWdPYmplY3QtPkdldCggJ01hcmtUaWNrZXQnIC4gJEdldFBhcmFte1N1YmFjdGlvbn0gLiAnUmVkaXJlY3REZWZhdWx0VVJMJyApOwogICAgJFJlZGlyZWN0VVJMIHx8PSAnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0jIyNUaWNrZXRJRCMjIyc7CgogICAgUkVQTEFDRToKICAgIGZvciBteSAkUmVwbGFjZVBhcmFtIChxdyhUaWNrZXRJRCBBcnRpY2xlSUQgQXJ0aWNsZUluZGV4KSkgewoKICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgcGxhY2Vob2xkZXIgZ2V0cyByZXBsYWNlZAogICAgICAgICRHZXRQYXJhbXskUmVwbGFjZVBhcmFtfSB8fD0gJyc7CgogICAgICAgICRSZWRpcmVjdFVSTCA9fiBzeyMjIyRSZXBsYWNlUGFyYW0jIyN9eyRHZXRQYXJhbXskUmVwbGFjZVBhcmFtfX1nOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBPUCA9PiAkUmVkaXJlY3RVUkwsCiAgICApOwp9CgoxOwoK
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6QXJ0aWNsZUFjdGlvbjo6TWFya0FydGljbGVTZWVuVW5zZWVuOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIENoZWNrQWNjZXNzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIENoZWNrIG5lZWRlZCBzdHVmZi4KICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXQgQXJ0aWNsZSBDaGFubmVsTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVufTsKCiAgICBteSAkVGlja2V0UGVybWlzc2lvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMb2dObyAgICA9PiAxLAogICAgKTsKICAgIHJldHVybiBpZiAhJFRpY2tldFBlcm1pc3Npb247CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZXRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXQgQXJ0aWNsZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVNZW51SXRlbSA9ICgKICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gVHJhbnNsYXRhYmxlKCdNYXJrIGFydGljbGUgYXMgdW5zZWVuJyksCiAgICAgICAgTmFtZSAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdNYXJrIGFzIHVuc2VlbicpLAogICAgICAgIENsYXNzICAgICAgID0+ICdBZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuQXJ0aWNsZScsCiAgICAgICAgTGluayA9PgogICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0TWFya1NlZW5VbnNlZW47U3ViYWN0aW9uPVVuc2VlbjtUaWNrZXRJRD0kUGFyYW17VGlja2V0fS0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSIsCiAgICApOwoKICAgIHJldHVybiAoIFwlTWVudUl0ZW0gKTsKfQoKMTsKCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpuaW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RmlsdGVyRWxlbWVudFBvc3Q6Ok9UT0JPTWFya1RpY2tldFNlZW5VbnNlZW5CdWxrOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6TGFuZ3VhZ2UnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRMYW5ndWFnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKTsKCiAgICBteSAkWWVzTm9PcHRpb25zID0gJENvbmZpZ09iamVjdC0+R2V0KCdZZXNOb09wdGlvbnMnKTsKICAgIG15ICVQYXJhbUxhYmVscyAgPSAoCiAgICAgICAgTWFya1RpY2tldHNBc1NlZW4gICA9PiAnTWFyayB0aWNrZXRzIGFzIHNlZW4nLAogICAgICAgIE1hcmtUaWNrZXRzQXNVbnNlZW4gPT4gJ01hcmsgdGlja2V0cyBhcyB1bnNlZW4nLAogICAgKTsKCiAgICBQQVJBTToKICAgIGZvciBteSAkQ3VycmVudFBhcmFtICggc29ydCBrZXlzICVQYXJhbUxhYmVscyApIHsKICAgICAgICBteSAkQ3VycmVudFBhcmFtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkQ3VycmVudFBhcmFtICk7CgogICAgICAgIG15ICRTZWxlY3RIVE1MID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFllc05vT3B0aW9ucywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkQ3VycmVudFBhcmFtLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRDdXJyZW50UGFyYW1WYWx1ZSB8fCAwLAogICAgICAgICk7CgogICAgICAgIG15ICRDdXJyZW5QYXJhbVRyYW5zbGF0aW9uID0gJExhbmd1YWdlT2JqZWN0LT5UcmFuc2xhdGUoICRQYXJhbUxhYmVsc3skQ3VycmVudFBhcmFtfSApOwogICAgICAgIG15ICRFbGVtZW50SFRNTCAgICAgICAgICAgID0gPDxIVE1MOwo8bGFiZWwgZm9yPSIkQ3VycmVudFBhcmFtIj4kQ3VycmVuUGFyYW1UcmFuc2xhdGlvbjo8L2xhYmVsPgo8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAkU2VsZWN0SFRNTAo8L2Rpdj4KPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpIVE1MCgogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7KDwvZmllbGRzZXQ+W148XSs8L2Rpdj5bXjxdKzwvZGl2PltePF0rPGRpdiBccyBjbGFzcz0iRm9vdGVyIil9eyRFbGVtZW50SFRNTCQxfXhtczsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RmlsdGVyRWxlbWVudFBvc3Q6Ok9UT0JPTWFya1RpY2tldFNlZW5VbnNlZW5CdWxrQWN0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIE9ubHkgaGFuZGxlIHBvcHVwIGNsb3NlCiAgICAjIENoZWNrIGl0IGJ5IHNlYXJjaGluZyBKU0RhdGEgYWRkZWQgYnkgTGF5b3V0OjpQb3B1cDo6UG9wdXBDbG9zZSgpLgogICAgcmV0dXJuIDEgaWYgaW5kZXgoICR7ICRQYXJhbXtEYXRhfSB9LCAnIlBvcHVwQ2xvc2UiOiJMb2FkUGFyZW50VVJMQW5kQ2xvc2UiJyApID09IC0xOwoKICAgIG15ICVSZXF1aXJlZEdldFBhcmFtcyA9ICgKICAgICAgICBBY3Rpb24gICAgPT4gJ0FnZW50VGlja2V0QnVsaycsCiAgICAgICAgU3ViYWN0aW9uID0+ICdEbycsCiAgICApOwoKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkUGFyYW0gKCBzb3J0IGtleXMgJVJlcXVpcmVkR2V0UGFyYW1zICkgewogICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICk7CgogICAgICAgIHJldHVybiAxIGlmICEkR2V0UGFyYW17JFBhcmFtfTsKICAgICAgICByZXR1cm4gMSBpZiAkR2V0UGFyYW17JFBhcmFtfSBuZSAkUmVxdWlyZWRHZXRQYXJhbXN7JFBhcmFtfTsKICAgIH0KCiAgICBteSAlRmxhZ0FjdGlvbk1hcHBpbmcgPSAoCiAgICAgICAgTWFya1RpY2tldHNBc1NlZW4gICA9PiAnU2VlbicsCiAgICAgICAgTWFya1RpY2tldHNBc1Vuc2VlbiA9PiAnVW5zZWVuJywKICAgICk7CgogICAgbXkgJEZsYWdBY3Rpb247CiAgICBGTEFHQUNUSU9OOgogICAgZm9yIG15ICRDdXJyZW50RmxhZ0FjdGlvbiAoIHNvcnQga2V5cyAlRmxhZ0FjdGlvbk1hcHBpbmcgKSB7CiAgICAgICAgbmV4dCBGTEFHQUNUSU9OIGlmICEkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkQ3VycmVudEZsYWdBY3Rpb24gKTsKICAgICAgICAkRmxhZ0FjdGlvbiA9ICRDdXJyZW50RmxhZ0FjdGlvbjsKICAgICAgICBsYXN0IEZMQUdBQ1RJT047CiAgICB9CiAgICByZXR1cm4gMSBpZiAhJEZsYWdBY3Rpb247CgogICAgIyBkZXRlcm1pbmUgcmVxdWlyZWQgZnVuY3Rpb24gZm9yIHN1YmFjdGlvbgogICAgbXkgJFRpY2tldEFjdGlvbkZ1bmN0aW9uICA9ICdUaWNrZXRGbGFnRGVsZXRlJzsKICAgIG15ICRBcnRpY2xlQWN0aW9uRnVuY3Rpb24gPSAnQXJ0aWNsZUZsYWdEZWxldGUnOwoKICAgIGlmICggJEZsYWdBY3Rpb24gZXEgJ01hcmtUaWNrZXRzQXNTZWVuJyApIHsKICAgICAgICAkVGlja2V0QWN0aW9uRnVuY3Rpb24gID0gJ1RpY2tldEZsYWdTZXQnOwogICAgICAgICRBcnRpY2xlQWN0aW9uRnVuY3Rpb24gPSAnQXJ0aWNsZUZsYWdTZXQnOwogICAgfQoKICAgICMgZ2V0IGludm9sdmVkIHRpY2tldHMKICAgIG15IEBUaWNrZXRJRHMgPSBncmVwIHskX30gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgcmV0dXJuIDEgaWYgIUBUaWNrZXRJRHM7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEICggc29ydCBAVGlja2V0SURzICkgewogICAgICAgIG15IEBBcnRpY2xlSURzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVJbmRleCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIEFSVElDTEVJRDoKICAgICAgICBmb3IgbXkgJEFydGljbGVJRCAoIHNvcnQgQEFydGljbGVJRHMgKSB7CgogICAgICAgICAgICAjIGFydGljbGUgZmxhZwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRBcnRpY2xlT2JqZWN0LT4kQXJ0aWNsZUFjdGlvbkZ1bmN0aW9uKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdTZWVuJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAjIGlycmVsZXZhbnQgaW4gY2FzZSBvZiBkZWxldGUKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQVJUSUNMRUlEIGlmICRTdWNjZXNzOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkVycm9yIHdoaWxlIHNldHRpbmcgYXJ0aWNsZSB3aXRoIEFydGljbGVJRCAnJEFydGljbGVJRCcgIiAuCiAgICAgICAgICAgICAgICAgICAgIm9mIHRpY2tldCB3aXRoIFRpY2tldElEICckVGlja2V0SUQnIGFzICIgLgogICAgICAgICAgICAgICAgICAgICggbGMgJEZsYWdBY3Rpb25NYXBwaW5neyRGbGFnQWN0aW9ufSApIC4KICAgICAgICAgICAgICAgICAgICAiISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRpY2tldCBmbGFnCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT4kVGlja2V0QWN0aW9uRnVuY3Rpb24oCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgS2V5ICAgICAgPT4gJ1NlZW4nLAogICAgICAgICAgICBWYWx1ZSAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAjIGlycmVsZXZhbnQgaW4gY2FzZSBvZiBkZWxldGUKICAgICAgICAgICAgVXNlcklEICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkU3VjY2VzczsKCiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAiRXJyb3Igd2hpbGUgc2V0dGluZyB0aWNrZXQgd2l0aCBUaWNrZXRJRCAnJFRpY2tldElEJyBhcyAiIC4KICAgICAgICAgICAgICAgICggbGMgJEZsYWdBY3Rpb25NYXBwaW5neyRGbGFnQWN0aW9ufSApIC4KICAgICAgICAgICAgICAgICIhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoK
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgT1RPQk8gR21iSCwgaHR0cDovL290b2JvLmRlLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJEhlbHBlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJFNlbGVuaXVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwpteSAkT1RPQk9IZWxwZXIgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Wm51bnlIZWxwZXInKTsKbXkgJEFydGljbGVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKIyBjcmVhdGUgdGVzdCB0aWNrZXQgYW5kIGFydGljbGVzCm15ICRUaWNrZXRJRCA9ICRIZWxwZXJPYmplY3QtPlRpY2tldENyZWF0ZSgpOwoKbXkgJEFydGljbGVJREZpcnN0ID0gJEhlbHBlck9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKKTsKbXkgJEFydGljbGVJRFNlY29uZCA9ICRIZWxwZXJPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCik7CgojIHN0b3JlIHRlc3QgZnVuY3Rpb24gaW4gdmFyaWFibGUgc28gdGhlIFNlbGVuaXVtIG9iamVjdCBjYW4gaGFuZGxlIGVycm9ycy9leGNlcHRpb25zL2RpZXMgZXRjLgpteSAkU2VsZW5pdW1UZXN0ID0gc3ViIHsKCiAgICAjIGNyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luCiAgICBteSAlVGVzdFVzZXIgPSAkU2VsZW5pdW1PYmplY3QtPkFnZW50TG9naW4oCiAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJyBdLAogICAgKTsKCiAgICAjIFRPRE86IFVzZSBjYXNlIGZvciB0aGlzIHRlc3QgdW5rbm93bgogICAgIyAgICAgIyBuYXZpZ2F0ZSB0byBjcmVhdGVkIHRlc3QgdGlja2V0IGluIEFnZW50VGlja2V0Wm9vbSBwYWdlIHdpdGhvdXQgYW4gYXJ0aWNsZQogICAgIyAgICAgJFNlbGVuaXVtT2JqZWN0LT5BZ2VudEludGVyZmFjZSgKICAgICMgICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICMgICAgICAgICBUaWNrZXRJRCAgICA9PiAkVGlja2V0SUQsCiAgICAjICAgICAgICAgV2FpdEZvckFKQVggPT4gMCwKICAgICMgICAgICk7CgogICAgIyBuYXZpZ2F0ZSB0byBjcmVhdGVkIHRlc3QgdGlja2V0IGluIEFnZW50VGlja2V0Wm9vbSBwYWdlIHdpdGggYW4gYXJ0aWNsZQogICAgJFNlbGVuaXVtT2JqZWN0LT5BZ2VudEludGVyZmFjZSgKICAgICAgICBBY3Rpb24gICA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQKICAgICk7CgogICAgIyBjaGVjayBmb3IgZWxlbWVudHMKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTZWxlbml1bU9iamVjdC0+ZmluZF9lbGVtZW50KCAnbGkjbmF2LU1hcmstYXMtc2VlbiBhJywgJ2NzcycgKS0+aXNfZGlzcGxheWVkKCksCiAgICAgICAgJyJNYXJrIHRpY2tldCBhcyBzZWVuIiBsaW5rIGlzIHZpc2libGUnLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU2VsZW5pdW1PYmplY3QtPmZpbmRfZWxlbWVudCggJ2xpI25hdi1NYXJrLWFzLXVuc2VlbiBhJywgJ2NzcycgKS0+aXNfZGlzcGxheWVkKCksCiAgICAgICAgJyJNYXJrIHRpY2tldCBhcyB1bnNlZW4iIGxpbmsgaXMgdmlzaWJsZScsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTZWxlbml1bU9iamVjdC0+ZmluZF9lbGVtZW50KCAnYS5BZ2VudFRpY2tldE1hcmtTZWVuVW5zZWVuQXJ0aWNsZScsICdjc3MnICktPmlzX2Rpc3BsYXllZCgpLAogICAgICAgICciTWFyayBhcnRpY2xlIGFzIHVuc2VlbiIgbGluayBpcyB2aXNpYmxlJywKICAgICk7CgogICAgIyBtYXJrIHRpY2tldCBhcyB1bnNlZW4KICAgICMgVE9ETzogVW5rbm93biwgd2h5IGNsaWNrIEFORCBBZ2VudEludGVyZmFjZSBjYWxsIGFyZSBib3RoIG5lY2Vzc2FyeS4gSWYgb25lIGlzIG9taXR0ZWQsCiAgICAjIG5vdCBhbGwgYXJ0aWNsZXMgd2lsbCBiZSBtYXJrZWQgYXMgdW5zZWVuLiBNYW51YWwgdGVzdGluZyB3b3Jrcy4KICAgICRTZWxlbml1bU9iamVjdC0+ZmluZF9lbGVtZW50KCAnbGkjbmF2LU1hcmstYXMtdW5zZWVuIGEnLCAnY3NzJyApLT5jbGljaygpOwogICAgJFNlbGVuaXVtT2JqZWN0LT5BZ2VudEludGVyZmFjZSgKICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRUaWNrZXRNYXJrU2VlblVuc2VlbicsCiAgICAgICAgU3ViYWN0aW9uICAgPT4gJ1Vuc2VlbicsCiAgICAgICAgVGlja2V0SUQgICAgPT4gJFRpY2tldElELAogICAgICAgIFdhaXRGb3JBSkFYID0+IDAsCiAgICApOwoKICAgICMgY2hlY2sgaWYgZmxhZ3Mgd2VyZSBzZXQgY29ycmVjdGx5CiAgICBteSAlRmxhZ3MgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUZsYWdHZXQoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJREZpcnN0LAogICAgICAgIFVzZXJJRCAgICA9PiAkVGVzdFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRGbGFnc3tTZWVufSwKICAgICAgICAiSW5pdGlhbCBhcnRpY2xlIHNlZW4gZmxhZyAtIElEICRBcnRpY2xlSURGaXJzdCIsCiAgICApOwoKICAgICVGbGFncyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlEU2Vjb25kLAogICAgICAgIFVzZXJJRCAgICA9PiAkVGVzdFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRGbGFnc3tTZWVufSwKICAgICAgICAiSW5pdGlhbCBhcnRpY2xlIHNlZW4gZmxhZyAtIElEICRBcnRpY2xlSURTZWNvbmQiLAogICAgKTsKCiAgICAjIGNhbGwgInNlZW4iIHN1YmFjdGlvbiBkaXJlY3RseQogICAgJFNlbGVuaXVtT2JqZWN0LT5BZ2VudEludGVyZmFjZSgKICAgICAgICBBY3Rpb24gICAgICA9PiAnQWdlbnRUaWNrZXRNYXJrU2VlblVuc2VlbicsCiAgICAgICAgU3ViYWN0aW9uICAgPT4gJ1NlZW4nLAogICAgICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgICA9PiAkQXJ0aWNsZUlERmlyc3QsCiAgICAgICAgV2FpdEZvckFKQVggPT4gMCwKICAgICk7CgogICAgIyBjaGVjayBpZiBVUkwgY2FsbCBoYXMgbWFya2VkIHRoZSBhcnRpY2xlIGFzIHNlZW4KICAgICVGbGFncyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlERmlyc3QsCiAgICAgICAgVXNlcklEICAgID0+ICRUZXN0VXNlcntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmxhZ3N7U2Vlbn0sCiAgICAgICAgIlN1YmFjdGlvbiBhcnRpY2xlIHNlZW4gZmxhZyAtIElEICRBcnRpY2xlSURGaXJzdCIsCiAgICApOwoKICAgICVGbGFncyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlEU2Vjb25kLAogICAgICAgIFVzZXJJRCAgICA9PiAkVGVzdFVzZXJ7VXNlcklEfSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRGbGFnc3tTZWVufSwKICAgICAgICAiU3ViYWN0aW9uIGFydGljbGUgc2VlbiBmbGFnIC0gSUQgJEFydGljbGVJRFNlY29uZCIsCiAgICApOwoKICAgICMgcmUtbmF2aWdhdGUgdG8gY3JlYXRlZCB0ZXN0IHRpY2tldCBpbiBBZ2VudFRpY2tldFpvb20gcGFnZQogICAgJFNlbGVuaXVtT2JqZWN0LT5BZ2VudEludGVyZmFjZSgKICAgICAgICBBY3Rpb24gICA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICApOwoKICAgICMgZ2l2ZSBBSkFYIHJlcXVlc3QgdGltZSB0byBtYXJrIHNlY29uZCBhcnRpY2xlIGFzIHNlZW4KICAgIHNsZWVwKDUpOwoKICAgICMgY2hlY2sgaWYgQUpBWCByZXF1ZXN0cyBoYXZlIG1hcmtlZCB0aGUgcmVtYWluaW5nIGFydGljbGUgYXMgcmVhZAogICAgJUZsYWdzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSURGaXJzdCwKICAgICAgICBVc2VySUQgICAgPT4gJFRlc3RVc2Vye1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRGbGFnc3tTZWVufSwKICAgICAgICAiWm9vbSBBSkFYIGFydGljbGUgc2VlbiBmbGFnIC0gSUQgJEFydGljbGVJREZpcnN0IiwKICAgICk7CgogICAgJUZsYWdzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVGbGFnR2V0KAogICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSURTZWNvbmQsCiAgICAgICAgVXNlcklEICAgID0+ICRUZXN0VXNlcntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmxhZ3N7U2Vlbn0sCiAgICAgICAgIlpvb20gQUpBWCBhcnRpY2xlIHNlZW4gZmxhZyAtIElEICRBcnRpY2xlSURTZWNvbmQiLAogICAgKTsKfTsKCiMgZmluYWxseSBydW4gdGhlIHRlc3QocykgaW4gdGhlIGJyb3dzZXIKJFNlbGVuaXVtT2JqZWN0LT5SdW5UZXN0KCRTZWxlbml1bVRlc3QpOwoKMTsKCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAxMi0yMDIyIFpudW55IEdtYkgsIGh0dHA6Ly96bnVueS5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIyLTIwMjIgUm90aGVyIE9TUyBHbWJILCBodHRwOi8vb3RvYm8uZGUvCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpPVE9CT01hcmtUaWNrZXRTZWVuVW5zZWVuOyAgICAjIyBubyBjcml0aWMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB1dGY4OwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpPVE9CT0hlbHBlcicsCik7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7Cgo9aGVhZDEgTkFNRQoKdmFyOjpwYWNrYWdlc2V0dXA6Ok9UT0JPTWFya1RpY2tldFNlZW5VbnNlZW4gLSBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6Ok9UT0JPTWFya1RpY2tldFNlZW5VbnNlZW4nKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkT1RPQk9IZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Wm51bnlIZWxwZXInKTsKCiAgICBteSAkQXJ0aWNsZUFjdGlvbnMgICAgICA9ICRTZWxmLT5fQXJ0aWNsZUFjdGlvbnNHZXQoKTsKICAgIG15ICRBcnRpY2xlQWN0aW9uc0FkZGVkID0gJE9UT0JPSGVscGVyT2JqZWN0LT5fQXJ0aWNsZUFjdGlvbnNBZGQoICV7JEFydGljbGVBY3Rpb25zfSApOwogICAgaWYgKCAhJEFydGljbGVBY3Rpb25zQWRkZWQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRXJyb3IgYWRkaW5nIGFydGljbGUgYWN0aW9ucy4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPkNvZGVJbnN0YWxsKCk7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPkNvZGVJbnN0YWxsKCk7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRPVE9CT0hlbHBlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpabnVueUhlbHBlcicpOwoKICAgIG15ICRBcnRpY2xlQWN0aW9ucyAgICAgICAgPSAkU2VsZi0+X0FydGljbGVBY3Rpb25zR2V0KCk7CiAgICBteSAkQXJ0aWNsZUFjdGlvbnNSZW1vdmVkID0gJE9UT0JPSGVscGVyT2JqZWN0LT5fQXJ0aWNsZUFjdGlvbnNSZW1vdmUoICV7JEFydGljbGVBY3Rpb25zfSApOwogICAgaWYgKCAhJEFydGljbGVBY3Rpb25zUmVtb3ZlZCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFcnJvciByZW1vdmluZyBhcnRpY2xlIGFjdGlvbnMuJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcnRpY2xlQWN0aW9uc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBcnRpY2xlQWN0aW9ucyA9IHsKICAgICAgICBJbnRlcm5hbCA9PiBbICAgICMgQ2hhbm5lbCBuYW1lIChJbnRlcm5hbCwgUGhvbmUsIEVtYWlsLCBDaGF0IG9yIEludmFsaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICdPVE9CT01hcmtUaWNrZXRTZWVuVW5zZWVuJywKICAgICAgICAgICAgICAgIE1vZHVsZSAgID0+ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6QXJ0aWNsZUFjdGlvbjo6TWFya0FydGljbGVTZWVuVW5zZWVuJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICAgICAgUGhvbmUgPT4gWyAgICAgICAjIENoYW5uZWwgbmFtZSAoSW50ZXJuYWwsIFBob25lLCBFbWFpbCwgQ2hhdCBvciBJbnZhbGlkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAnT1RPQk9NYXJrVGlja2V0U2VlblVuc2VlbicsCiAgICAgICAgICAgICAgICBNb2R1bGUgICA9PiAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkFydGljbGVBY3Rpb246Ok1hcmtBcnRpY2xlU2VlblVuc2VlbicsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgICAgIEVtYWlsID0+IFsgICAgICAgIyBDaGFubmVsIG5hbWUgKEludGVybmFsLCBQaG9uZSwgRW1haWwsIENoYXQgb3IgSW52YWxpZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ09UT0JPTWFya1RpY2tldFNlZW5VbnNlZW4nLAogICAgICAgICAgICAgICAgTW9kdWxlICAgPT4gJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpBcnRpY2xlQWN0aW9uOjpNYXJrQXJ0aWNsZVNlZW5VbnNlZW4nLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBDaGF0ID0+IFsgICAgICAgICMgQ2hhbm5lbCBuYW1lIChJbnRlcm5hbCwgUGhvbmUsIEVtYWlsLCBDaGF0IG9yIEludmFsaWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICdPVE9CT01hcmtUaWNrZXRTZWVuVW5zZWVuJywKICAgICAgICAgICAgICAgIE1vZHVsZSAgID0+ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6QXJ0aWNsZUFjdGlvbjo6TWFya0FydGljbGVTZWVuVW5zZWVuJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9OwoKICAgIHJldHVybiAkQXJ0aWNsZUFjdGlvbnM7Cn0KCjE7Cg==