Fred
0.3.5
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Usability improvements.
First release of HTMLValidator plugin, which requires an external program.
Improved ModuleRequired part in the SOPM file.
Added OTRS 2.5 support.
First version for OTRS 2.4.
A tool to support the developer by his development.
Ein Entwicklertool welches dem Entwickler zur Laufzeit bei der Entwicklung unterstützen soll.
2.4.x
2.5.x
<br/>
Welcome! <br/>
<br/>
First of all you should install the necessary perl modules <br/>
<ul>
<li> Devel::SmallProf </li>
<li> Devel::DProf</li>
<li> HTML::Lint</li>
</ul>
If you want to use the HTMLValidate module of Fred, you also need to install the following program <br/>
<ul>
<li> validator (available from http://www.htmlhelp.com/tools/validator/offline/, Linux distributions may have it as package wdg-html-validator) </li>
</ul>
<br/>
<br/>
What can Fred do?<br/>
<br/>
To date, Fred has the following features: <br/>
<ul>
<li> HTMLCheck: <br/>
the HTML output is checked by means of HTML::Lint </li>
<li> HTMLValidate: <br/>
real HTML validation based on an external tool </li>
<li> STDERRLog: <br/>
every entry contained in STDERR is displayed </li>
<li> TranslationDebug: <br/>
displays all translation attempts of the current request which failed. </li>
<li> SQLLog: <br/>
lists all SQL statements of the current request </li>
<li> ConfigLog: <br/>
lists all !ConfigGet requests, indicating their frequency </li>
<li> DProf: <br/>
a profiling tool which evaluates the time required for each function to be executed </li>
<li> SmallProf: <br/>
a profiling tool performing a line-by-line code evaluation </li>
</ul>
<br/>
*Caution* : Please have a look at the possible config settings, which are easily accessible by clicking on "setting". <br/>
<br/>
<br/>
What is Fred's current status?<br/>
<br/>
<ul>
<li> modular design: <br/>
anybody can add a new module at any time </li>
<li> the modules' output is not yet sophisticated <br/>
ideas for improving the output or sensible configurations will be very welcome </li>
<li> please extend Fred, if you have good ideas <br/>
<li> if you have no time to implement your ideas yourselves, please enter them in dev mailinglist </li>
</ul>
<br/>
HTML::Lint
Devel::SmallProf
2009-11-02 15:46:35
opms.otrs.com
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQUFBRnJlZC5wbSx2IDEuOSAyMDA5LzA0LzA2IDEwOjI1OjI1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgppZiAoICRFTlZ7SFRUUF9VU0VSX0FHRU5UfSApIHsKCiAgICAjIGNoZWNrIGlmIHRoZSBuZWVkZWQgcGF0aCBpcyBhdmFpbGFibGUKICAgIG15ICRQYXRoID0gJFNlbGYtPntIb21lfSAuICcvdmFyL2ZyZWQnOwogICAgaWYgKCAhLWUgJFBhdGggKSB7CiAgICAgICAgbWtkaXIgJFBhdGg7CiAgICB9CgogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0hvbWV9IC4gJy92YXIvZnJlZC9TVERFUlIubG9nJzsKCiAgICAjIGNoZWNrIGxvZyBmaWxlIHNpemUKICAgIGlmICggLXMgJEZpbGUgPiAyMCAqIDEwMjQgKiAxMDI0ICkgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KCiAgICAjIG1vdmUgU1RET1VUIHRvIHRtcCBmaWxlCiAgICBpZiAoICFvcGVuIFNUREVSUiwgJz4+JywgJEZpbGUgKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUjogQ2FuJ3Qgd3JpdGUgJEZpbGUhIjsKICAgIH0KfQoKMTsK
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS4yMCAyMDA5LzEwLzIxIDE4OjQwOjM3IG1nIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50IyMjRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlN1YnNjcmliZSB0aGUgb3V0cHV0IGZpbHRlciBhdCB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NZWxkZXQgZGVuIE91dHB1dEZpbHRlckZyZWQgYW0gU3lzdGVtIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uc29sZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmcmVkIGNvbnNvbGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiBtYW4gZGllIEZyZWQtQ29uc29sZSBudXR6ZW4gbe+/vWNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQmVuY2htYXJrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGZyZWQgYmVuY2htYXJrIHRvb2wgKG9ubHkgZm9yIGV4cGVydHMhKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkYXMgRnJlZC1CZW5jaG1hcmt0b29sIG51dHplbiBt77+9Y2h0ZSAobnVyIGbvv71yIEV4cGVydGVuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTbWFsbFByb2YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU21hbGxQcm9mIHByb2ZpbGluZyBmdW5jdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkaWUgU21hbGxQcm9mLVByb2ZpbGluZyBGdW5rdGlvbiBudXR6ZW4gbe+/vWNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjRFByb2YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgRFByb2YgcHJvZmlsaW5nIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIGRpZSBEUHJvZi1Qcm9maWxpbmcgRnVua3Rpb24gbnV0emVuIG3vv71jaHRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1NRTExvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgYW4gcmVhbHRpbWUgU1FMIHN0YXRlbWVudCBsb2cgZnVuY3Rpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiwgd2VubiB6dXIgTGF1ZnplaXQgZGVyIFNRTC1TdGF0ZW1lbnQtTG9nZ2VyIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjSFRNTENoZWNrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCBhbiByZWFsdGltZSBIVE1MLWNoZWNrZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB3ZW5uIHp1ciBMYXVmemVpdCBlaW4gSFRNTC1DaGVja2VyIGF1c2dlZu+/vWhydCB3ZXJkZW4gc29sbC4gV0lDSFRJRzogRGFzIENwYW4tTW9kdWwgSFRNTDo6bGludCBpc3QgaGllcmbvv71yIG5vdHdlbmRpZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNIVE1MVmFsaWRhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IGFuIHJlYWx0aW1lIEhUTUxWYWxpZGF0b3IuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB3ZW5uIHp1ciBMYXVmemVpdCBlaW4gSFRNTC1WYWxpZGF0b3IgYXVzZ2Vm77+9aHJ0IHdlcmRlbiBzb2xsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1RyYW5zbGF0aW9uRGVidWciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4genVyIExhdWZ6ZWl0IGRlciDvv71iZXJzZXR6dW5nc2RlYnVnZ2VyIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjQ29uZmlnTG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNvbmZpZyBsb2cgbWVjaGFuaXNtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIHp1ciBMYXVmemVpdCBDb25pZy1Mb2dtZWNoYW5pc211cyBudXR6ZW4gd2lsbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNTVERFUlJMb2ciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UdXJuIG9uIGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgU1RERVJSTG9nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiBtYW4genVyIExhdWZ6ZWl0IGRhcyBTVERFUlJMb2cgc2VoZW4gd2lsbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY3RpdmUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjRGV2ZWxGcmVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGRldmVsIGZyZWQgb2JqZWN0IGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgRW50d2lja2xlci1PYmpla3RzIEZyZWQgaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkZyZWQtRGV2ZWxvcGVydG9vbHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjU2hvd25MaW5lcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkhlcmUgeW91IGNhbiBpbnNlcnQgdGhlIG51bWJlciBvZiBzaG93biBwcm9maWxpbmcgbGluZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBkaWUgQW56YWhsIGRlciBhbmdlemVpZ3RlbiBhdXNnZXdlcnRldGVuIFplaWxlbiBhbmdlZ2ViZW4gd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjE1PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjT3JkZXJCeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldoaWNoIG9yZGVyIHNob3VsZCB0aGUgcHJvZmlsaW5nIGRhdGEgaGF2ZT88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFjaCB3ZWxjaGVyIFJlaWhlbmZvbGdlIHNvbGxlbiBkaWUgUHJvZmlsaW5nZGF0ZW4gZ2VvcmRuZXQgd2VyZGVuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjQiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5MaW5lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj5DYWxsczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+VGltZSBleGVjdXRpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPlRpbWUgZXhwZW5kZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNtYWxsUHJvZiMjI1BhY2thZ2VzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+Q2hlY2sgb25seSB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGluIFNtYWxsUHJvZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXMgc29sbGVuIG51ciBmb2xnZW5kZSBQYWNrYWdlcyB2b24gU21hbGxQcm9mIGdlcHLvv71mdCB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNTaG93bkxpbmVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGluc2VydCB0aGUgbnVtYmVyIG9mIHNob3duIHByb2ZpbGluZyBmdW5jdGlvbnMgKG1heCA0MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIga2FubiBkaWUgQW56YWhsIGRlciBhbmdlemVpZ3RlbiBhdXNnZXdlcnRldGVuIEZ1bmt0aW9uZW4gYW5nZWdlYmVuIHdlcmRlbiAobWF4aW1hbCA0MCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkRQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4xNTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkRQcm9mIyMjT3JkZXJCeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPldoaWNoIG9yZGVyIHNob3VsZCB0aGUgcHJvZmlsaW5nIGRhdGEgaGF2ZT88L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFjaCB3ZWxjaGVyIFJlaWhlbmZvbGdlIHNvbGxlbiBkaWUgUHJvZmlsaW5nZGF0ZW4gZ2VvcmRuZXQgd2VyZGVuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5EUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iRXhUaW1lIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+TmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2FsbHMiPkNhbGxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFeFRpbWUiPkV4Y2xUaW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdVRpbWUiPkN1bXVsU1RpbWU8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkRQcm9mIyMjRnVuY3Rpb25UcmVlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U2hvdyB0aGUgZnVuY3Rpb24gdHJlZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+WmVpZ2UgZGVuIEZ1bmt0aW9uc2JhdW0uIEVzIHplaWd0IGRpZSBBYmZvbGdlIHVuZCDvv71iaO+/vW5naWdrZWl0IGluIHdlbGNoZXIgZGllIEZ1bmt0aW9uZW4gYXVmZ2VydWZlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkRQcm9mPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6RFByb2YjIyNEaXNhYmxlZFBhY2thZ2VzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RG9uJ3QgY2hlY2sgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBpbiBEUHJvZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXMgc29sbGVuIGZvbGdlbmRlIFBhY2thZ2VzIHZvbiBEUHJvZiBuaWNodCBnZXBy77+9ZnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5EUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPk1JTUU6OkVudGl0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnV0Zjg8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5DR0k8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5BdXRvTG9hZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RW5jb2RlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RHluYUxvYWRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1haWw6OkludGVybmV0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+d2FybmluZ3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EYXRlOjpGb3JtYXQ6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EQkk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EYXRhOjpEdW1wZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5NSU1FOjpIZWFkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TUlNRTo6VG9vbHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5EQkQ6Om15c3FsOjpkYjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1haWw6OkZpZWxkOjpBZGRyTGlzdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkZpbGU6Okdsb2I8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5UaW1lOjpMb2NhbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1haWw6OkZpZWxkOjpEYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+RmluZEJpbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPk1JTUU6OlBhcnNlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkV4cG9ydGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+c3RyaWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TWFpbDo6RmllbGQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6U21hbGxQcm9mIyMjRGlzYWJsZWRGaWxlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRvbid0IGNoZWNrIHRoZSBmb2xsb3dpbmcgcGVybCBmaWxlcyBvciBwYXRoIGluIFNtYWxsUHJvZi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RXMgc29sbGVuIGZvbGdlbmRlIERhdGVpZW4gdW5kIFBmYWRlIGluIFNtYWxsUHJvZiBuaWNodCBnZXBy77+9ZnQgd2VyZGVuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5TbWFsbFByb2Y8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT4vdXNyL2xpYi9wZXJsNTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPi4uLy4uLy9LZXJuZWwvU3lzdGVtL0ZyZWQvPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkNvbmZpZ0xvZyMjI09yZGVyQnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5XaGljaCBvcmRlciBzaG91bGQgdGhlIGNvbmZpZyBsb2cgZGF0YSBoYXZlPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYWNoIHdlbGNoZXIgUmVpaGVuZm9sZ2Ugc29sbGVuIGRpZSBDb25maWdsb2dkYXRlbiBnZW9yZG5ldCB3ZXJkZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvbmZpZ0xvZzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMyI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPkNhbGxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5Db25maWc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPlBhY2thZ2U8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWQucG0sdiAxLjE0IDIwMDkvMDQvMjEgMTA6NTQ6MzcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpEZXZlbEZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE0ICQpIFsxXTsKCiN1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgT2JqZWN0cwogICAgT0JKRUNUOgogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KAogICAgICAgIFBhcmFtT2JqZWN0IERCT2JqZWN0ICAgICBMb2dPYmplY3QgQ29uZmlnT2JqZWN0CiAgICAgICAgTWFpbk9iamVjdCAgTGF5b3V0T2JqZWN0IFRpbWVPYmplY3QgRW5jb2RlT2JqZWN0CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fTsKICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgfQoKICAgICMgICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCV7JFNlbGZ9KTsKICAgICRTZWxmLT57Q29uZmlnVG9vbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkZyZWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3ViYWN0aW9ufSAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJhY3Rpb24nICk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzaG93IHRoZSBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CiAgICAgICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVmVyc2lvbicpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1NvcnJ5LCB0aGlzIHNpZGUgaXMgY3VycmVudGx5IHVuZGVyIGRldmVsb3BtZW50IScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjICAgICAgICBteSAkT3V0cHV0ICAgPSAnJzsKICAgICMKICAgICMgICAgICAgIG15IEBUcmFuc2xhdGlvbldoaXRlTGlzdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKICAgICMgICAgICAgICAgICBLZXkgID0+IDEsCiAgICAjICAgICAgICAgICAgQ2FjaGUgPT4gMCwKICAgICMgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICBteSAlV2hpdGVMaXN0OwogICAgIyAgICAgICAgZm9yIG15ICRDb250ZW50IChAeyRUcmFuc2xhdGlvbldoaXRlTGlzdFsxXXtUcmFuc2xhdGlvbn19KSB7CiAgICAjICAgICAgICAgICAgaWYgKCRDb250ZW50LT57Q29udGVudH0pIHsKICAgICMgICAgICAgICAgICAgICAgIyBhZGQgYWRkIGJsb2NrCiAgICAjICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAjICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5lJywKICAgICMgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgIyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQgPT4gJENvbnRlbnQtPntDb250ZW50fSwKICAgICMgICAgICAgICAgICAgICAgICAgIH0sCiAgICAjICAgICAgICAgICAgICAgICk7CiAgICAjICAgICAgICAgICAgfQogICAgIyAgICAgICAgfQogICAgIwogICAgIyAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIkZyZWQtT3ZlcnZpZXciKTsKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAjICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgIyAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAjICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWQnLAogICAgIyAgICAgICAgKTsKICAgICMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICMgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgIyAgICB9CiAgICAjICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICAgICMgaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBsb2cKICAgICMgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVHJhbnNsYXRpb24nKSB7CiAgICAjICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ZhbHVlJyk7CiAgICAjCiAgICAjICAgICAgICBteSBARGF0YSA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICMgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKICAgICMgICAgICAgICAgICBLZXkgID0+IDEsCiAgICAjICAgICAgICAgICAgQ2FjaGUgPT4gMCwKICAgICMgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICBpZiAoIUBEYXRhKSB7CiAgICAjICAgICAgICAgICAgbXkgQEhhc2g7CiAgICAjCiAgICAjICAgICAgICAgICAgJEhhc2hbMV17VHJhbnNsYXRpb259WzFde0NvbnRlbnR9ID0gJFZhbHVlOwogICAgIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEFkZCgKICAgICMgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgICAgIEtleSAgICAgPT4gMSwKICAgICMgICAgICAgICAgICAgICAgWE1MSGFzaCA9PiBcQEhhc2gsCiAgICAjICAgICAgICAgICAgKTsKICAgICMgICAgICAgIH0KICAgICMgICAgICAgIGVsc2UgewogICAgIyAgICAgICAgICAgIHB1c2ggQHskRGF0YVsxXXtUcmFuc2xhdGlvbn19LCB7Q29udGVudCA9PiAkVmFsdWV9OwogICAgIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFVwZGF0ZSgKICAgICMgICAgICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgICAgIEtleSA9PiAnMScsCiAgICAjICAgICAgICAgICAgICAgIFhNTEhhc2ggPT4gXEBEYXRhLAogICAgIyAgICAgICAgICAgICk7CiAgICAjCiAgICAjICAgICAgICB9CiAgICAjCiAgICAjICAgICAgICBteSAkUmVmZXJlciA9ICRFTlZ7SFRUUF9SRUZFUkVSfTsKICAgICMgICAgICAgIGlmICgkUmVmZXJlciA9fiAvXD8oLispJC8pIHsKICAgICMgICAgICAgICAgICAkUmVmZXJlciA9ICQxOwogICAgIyAgICAgICAgfQogICAgIwogICAgIyAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFJlZmVyZXIpOwogICAgIyAgICB9CiAgICAjICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RyYW5zbGF0aW9uRGVsZXRlJykgewogICAgIyAgICAgICAgbXkgQERhdGEgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hEZWxldGUoCiAgICAjICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiAgICAjICAgICAgICAgICAgS2V5ICA9PiAxLAogICAgIyAgICAgICAgKTsKICAgICMKICAgICMgICAgICAgIG15ICRSZWZlcmVyID0gJEVOVntIVFRQX1JFRkVSRVJ9OwogICAgIyAgICAgICAgaWYgKCRSZWZlcmVyID1+IC9cPyguKykkLykgewogICAgIyAgICAgICAgICAgICRSZWZlcmVyID0gJDE7CiAgICAjICAgICAgICB9CiAgICAjCiAgICAjICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkUmVmZXJlcik7CiAgICAjICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGZhc3QgaGFuZGxlIGZvciBmcmVkIHNldHRpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NldHRpbmcnICkgewogICAgICAgIG15ICRNb2R1bGVGb3JSZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICAgICAgZGVsZXRlICRNb2R1bGVGb3JSZWYtPntDb25zb2xlfTsKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVGb3JSZWZ9ICkgewogICAgICAgICAgICBteSAkQ2hlY2tlZCA9ICcnOwogICAgICAgICAgICBpZiAoICRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2hlY2tlZCA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGcmVkTW9kdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEZyZWRNb2R1bGUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBDaGVja2VkICAgID0+ICRDaGVja2VkLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkZyZWQ6OiRNb2R1bGUiKSApIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFRpdGxlID0+ICJGcmVkLVNldHRpbmciICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHslUGFyYW19LAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNldHRpbmcnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZmFzdCBoYW5kbGUgZm9yIGZyZWQgc2V0dGluZ3MKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZ0FjdGlvbicgKSB7CiAgICAgICAgbXkgJE1vZHVsZUZvclJlZiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6TW9kdWxlJyk7CiAgICAgICAgbXkgQFNlbGVjdGVkRnJlZE1vZHVsZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdGcmVkTW9kdWxlJyApOwogICAgICAgIG15ICVTZWxlY3RlZE1vZHVsZXMgICAgID0gbWFwIHsgJF8gPT4gMTsgfSBAU2VsZWN0ZWRGcmVkTW9kdWxlczsKICAgICAgICBteSAkVXBkYXRlRmxhZzsKICAgICAgICBkZWxldGUgJE1vZHVsZUZvclJlZi0+e0NvbnNvbGV9OwoKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBzeXNjb25maWcgc2V0dGluZ3MKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfQogICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICEkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICJGcmVkOjpNb2R1bGUjIyMkTW9kdWxlIiwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdBY3RpdmUnID0+ICRTZWxlY3RlZE1vZHVsZXN7JE1vZHVsZX0gfHwgMCwKCiAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAnTW9kdWxlJyA9PiAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVXBkYXRlRmxhZyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdGhpcyBmdW5jdGlvbiBpcyBuZXNlY2NhcnkgdG8gZmluaXNoIHRoZSBzeXNjb25maWcgdXBkYXRlCiAgICAgICAgbXkgJFZlcnNpb24gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVmVyc2lvbicpOwogICAgICAgIGlmICggJFVwZGF0ZUZsYWcgJiYgJFZlcnNpb24gPX4gbXsgXjJcLlswMTJdXC4gfW1zeCApIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZUZpbmlzaCgpOwogICAgICAgIH0KCiAgICAgICAgIyBkZWFjdGl2YXRlIGZyZWRtb2R1bGUgdG9kb3MKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICAgICAgaWYgKCAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICEkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9ICkgewoKICAgICAgICAgICAgICAgICMgRXJyb3JoYW5kbGluZyBzaG91bGQgYmUgaW1wcm92ZWQhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhY3RpdmUgZnJlZCBtb2R1bGUgdG9kb3MKICAgICAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXskTW9kdWxlRm9yUmVmfSApIHsKICAgICAgICAgICAgaWYgKCAhJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9ICkgewoKICAgICAgICAgICAgICAgICMgRXJyb3JoYW5kbGluZyBzaG91bGQgYmUgaW1wcm92ZWQhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQmVuY2htYXJrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQmVuY2htYXJrLnBtLHYgMS40IDIwMDkvMDQvMDYgMTA6MjU6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRCZW5jaG1hcms7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQmVuY2htYXJrIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRoZSBiZW5jaG1hcmsgb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRCZW5jaG1hcmstPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gbmUgJ0FSUkFZJzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CiAgICBmb3IgbXkgJExpbmUgKCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSB7CiAgICAgICAgJEhUTUxMaW5lcyAuPSAnPHRyPic7CiAgICAgICAgZm9yIG15ICRDZWxsICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIjx0ZD4kQ2VsbDwvdGQ+IjsKICAgICAgICB9CiAgICAgICAgJEhUTUxMaW5lcyAuPSAnPC90cj4nOwogICAgfQoKICAgIHJldHVybiBpZiAhJEhUTUxMaW5lczsKCiAgICAjIG91dHB1dCB0aGUgaHRtbAogICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRCZW5jaG1hcmsnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMDkvMDQvMDYgMTA6MjU6MTMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uc29sZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZENvbnNvbGUucG0sdiAxLjggMjAwOS8wOS8xNiAxMToyMTozMCBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25zb2xlIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIGNvbnNvbGUgb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25zb2xlLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBjb25zb2xlIHRhYmxlCiAgICBteSAkQ29uc29sZQogICAgICAgID0gJ0FjdGl2YXRlZCBtb2R1bGVzOiA8Yj4nIC4gKCBqb2luICcgLSAnLCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSAuICc8L2I+JzsKCiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57U3RhdHVzfSApIHsKCiAgICAgICAgaWYgKCAkUGFyYW17TW9kdWxlUmVmfS0+e1NldHRpbmd9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2V0dGluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZENvbnNvbGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGV4dCAgICA9PiAkQ29uc29sZSwKICAgICAgICAgICAgICAgIE1vZFBlcmwgPT4gX01vZFBlcmwoKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX01vZFBlcmwgewoKICAgICMgZmluZCBvdXQsIGlmIG1vZHBlcmwgaXMgdXNlZAoKICAgIG15ICRNb2RQZXJsID0gJ2lzIG5vdCBhY3RpdmF0ZWQnOwogICAgaWYgKCBleGlzdHMgJEVOVntNT0RfUEVSTH0gJiYgZGVmaW5lZCAkbW9kX3Blcmw6OlZFUlNJT04gKSB7CiAgICAgICAgJE1vZFBlcmwgPSAkbW9kX3Blcmw6OlZFUlNJT047CiAgICB9CiAgICByZXR1cm4gJE1vZFBlcmw7Cn0KMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDA5LzA5LzE2IDExOjIxOjMwICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkSFRNTENoZWNrLnBtLHYgMS41IDIwMDkvMDQvMDYgMTA6MjU6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2sgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgSFRNTCBjaGVjayBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gKSB7CiAgICAgICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSB7CiAgICAgICAgICAgICRMaW5lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRMaW5lICk7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj5cbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkSFRNTENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS41ICQgJERhdGU6IDIwMDkvMDQvMDYgMTA6MjU6MTMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTFZhbGlkYXRlLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkSFRNTFZhbGlkYXRlLnBtLHYgMS4yIDIwMDkvMTAvMzAgMDg6Mjc6MTAgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MVmFsaWRhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2sgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgSFRNTCBjaGVjayBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57T3JpZ2luYWxEYXRhfSApIHsKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFBhcmFte01vZHVsZVJlZn0tPntPcmlnaW5hbERhdGF9IH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3JpZ1JvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRFbnRyeX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57VmFsaWRhdGlvbkRhdGF9ICkgewogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e1ZhbGlkYXRpb25EYXRhfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmFsaWRhdGlvblJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRFbnRyeSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZEhUTUxWYWxpZGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIgJCAkRGF0ZTogMjAwOS8xMC8zMCAwODoyNzoxMCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU1RERVJSTG9nLnBtLHYgMS45IDIwMDkvMDMvMzEgMTI6NDU6MTEgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIFNUREVSUiBsb2cgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9OwogICAgcmV0dXJuIGlmIHJlZiAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IG5lICdBUlJBWSc7CgogICAgIyBjcmVhdGUgaHRtbCBzdHJpbmcKICAgIG15ICRIVE1MTGluZXM7CiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKCiAgICAgICAgIyBjb252ZXJ0IGFzY2lpIHRvIGh0bWwKICAgICAgICAkSFRNTExpbmVzIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJExpbmUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdOb3JtYWwnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIGlmICEkSFRNTExpbmVzOwoKICAgICRIVE1MTGluZXMgPSAiPHRyPjx0ZD4kSFRNTExpbmVzPC90ZD48L3RyPiI7CgogICAgIyBvdXRwdXQgdGhlIGh0bWwKICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU1RERVJSTG9nJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzAzLzMxIDEyOjQ1OjExICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU21hbGxQcm9mLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU21hbGxQcm9mLnBtLHYgMS45IDIwMDkvMDQvMDYgMTA6MjU6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2YgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgU21hbGxQcm9mIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU21hbGxQcm9mLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU21hbGxQcm9mIHByb2ZpbGluZyB0b29sCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlUmVmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlIHRoZSBwcm9maWxpbmcgZGF0YSBmb3IgYSBiZXR0ZXIgcmVhZGFiaWxpdHkKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICBmb3IgbXkgJFREICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkVEQgKTsKICAgICAgICB9CiAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzNdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPls0XTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQ+JExpbmUtPlswXTwvdGQ+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMV06PC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzVdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPiI7CiAgICB9CgogICAgIyBnZXQgYWxsIHBhY2thZ2VzIHdoaWNoIFNtYWxsUHJvZiBjaGVja3MKICAgIG15ICRQYWNrYWdlcyA9ICcnOwogICAgaWYgKCAkUGFyYW17TW9kdWxlUmVmfS0+e1BhY2thZ2VzfSApIHsKICAgICAgICAkUGFja2FnZXMgPSBqb2luICcgLSAnLCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e1BhY2thZ2VzfSB9OwogICAgfQoKICAgICMgc2hvdyB0aGUgcHJvZmlsaW5nIGRhdGEKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU21hbGxQcm9mJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgVG90YWxDYWxsID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57VG90YWxDYWxsfSwKICAgICAgICAgICAgICAgIFBhY2thZ2VzICA9PiAkUGFja2FnZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDA5LzA0LzA2IDEwOjI1OjEzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkRFByb2YucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWREUHJvZi5wbSx2IDEuOCAyMDA5LzA0LzA2IDEwOjI1OjEzIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkRFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWREUHJvZiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBEUHJvZiBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZERQcm9mLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgRFByb2YgcHJvZmlsaW5nIHRvb2wKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHByZXBhcmUgdGhlIHByb2ZpbGluZyBkYXRhIGZvciBhIGJldHRlciByZWFkYWJpbGl0eQogICAgaWYgKCAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ICkgewogICAgICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRURCAoIEB7JExpbmV9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCgkVEQpICkgewogICAgICAgICAgICAgICAgICAgICRURCA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRURCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPlsxXTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzJdPC90ZD5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZCBhbGlnbj1cInJpZ2h0XCI+JExpbmUtPls0XTwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzVdOjwvdGQ+XG4iCiAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNl08L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPlxuIjsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgICAgIFRvdGFsVGltZSA9PiAkUGFyYW17TW9kdWxlUmVmfS0+e1RvdGFsVGltZX0sCiAgICAgICAgICAgICAgICBUb3RhbENhbGwgPT4gJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtNb2R1bGVSZWZ9LT57RnVuY3Rpb25UcmVlfSApIHsKICAgICAgICBmb3IgbXkgJExpbmUgKCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0Z1bmN0aW9uVHJlZX0gfSApIHsKICAgICAgICAgICAgZm9yIG15ICRURCAoIEB7JExpbmV9ICkgewogICAgICAgICAgICAgICAgJFREID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRURCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMaW5lLT5bMV0gPX4gcy8gLyZuYnNwOyZuYnNwOy9nOwogICAgICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgICAgIC4gIiAgICAgICAgPC90cj5cbiI7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Z1bmN0aW9uTGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGhlIHByb2ZpbGluZyBkYXRhCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZERQcm9mJywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS44ICQgJERhdGU6IDIwMDkvMDQvMDYgMTA6MjU6MTMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkVHJhbnNsYXRpb25EZWJ1Zy5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRnJlZFRyYW5zbGF0aW9uRGVidWcucG0sdiAxLjUgMjAwOS8wNC8wNiAxMDoyNToxMyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFRyYW5zbGF0aW9uRGVidWc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRUcmFuc2xhdGlvbkRlYnVnIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRyYW5zbGF0aW9uIGRlYnVnIG1vZHVsZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkVHJhbnNsYXRpb25EZWJ1Zy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIHRyYW5zbGF0aW9uZGVidWdnaW5nIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDA5LzA0LzA2IDEwOjI1OjEzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1FMTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkU1FMTG9nLnBtLHYgMS44IDIwMDkvMDQvMDYgMTA6MjU6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTUUxMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTUUxMb2cgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgU1FMIGxvZyBtb2R1bGUKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNRTExvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIHRyYW5zbGF0aW9uZGVidWdnaW5nIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZVJlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTGluZSAoIEB7ICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gfSApIHsKICAgICAgICBmb3IgbXkgJFREICggQHskTGluZX0gKSB7CiAgICAgICAgICAgICRURCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkVEQgKTsKICAgICAgICB9CiAgICAgICAgbXkgJENsYXNzID0gJyc7CiAgICAgICAgaWYgKCAkTGluZS0+WzRdICkgewogICAgICAgICAgICAkQ2xhc3MgPSAnIGNsYXNzPSJjb250ZW50a2V5Iic7CiAgICAgICAgfQoKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0ciRDbGFzcz5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzBdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzFdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzJdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzNdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICAgIDx0ZD4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgLiAiICAgICAgICA8L3RyPiI7CiAgICB9CgogICAgaWYgKCRIVE1MTGluZXMpIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdEZXZlbEZyZWRTUUxMb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgSFRNTExpbmVzICAgICAgICA9PiAkSFRNTExpbmVzLAogICAgICAgICAgICAgICAgQWxsU3RhdGVtZW50cyAgICA9PiAkUGFyYW17TW9kdWxlUmVmfS0+e0FsbFN0YXRlbWVudHN9LAogICAgICAgICAgICAgICAgRG9TdGF0ZW1lbnRzICAgICA9PiAkUGFyYW17TW9kdWxlUmVmfS0+e0RvU3RhdGVtZW50c30sCiAgICAgICAgICAgICAgICBTZWxlY3RTdGF0ZW1lbnRzID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57U2VsZWN0U3RhdGVtZW50c30sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgID0+ICRQYXJhbXtNb2R1bGVSZWZ9LT57VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDA5LzA0LzA2IDEwOjI1OjEzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uZmlnTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQ29uZmlnTG9nLnBtLHYgMS42IDIwMDkvMDQvMDYgMTA6MjU6MTMgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25maWdMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25maWdMb2cgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGhlIGNvbmZpZyBsb2cgbW9kdWxlCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRDb25maWdMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSB0cmFuc2xhdGlvbmRlYnVnZ2luZyBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBNb2R1bGVSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCBAeyAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9IH0gKSB7CiAgICAgICAgZm9yIG15ICRURCAoIEB7JExpbmV9ICkgewogICAgICAgICAgICAkVEQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFREICk7CiAgICAgICAgfQogICAgICAgIGlmICggJExpbmUtPlsxXSBlcSAnVHJ1ZScgKSB7CiAgICAgICAgICAgICRMaW5lLT5bMV0gPSAnJzsKICAgICAgICB9CiAgICAgICAgJEhUTUxMaW5lcyAuPSAiICAgICAgICA8dHI+XG4iCiAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bM108L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMV08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMl08L3RkPlxuIgogICAgICAgICAgICAuICIgICAgICAgIDwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZENvbmZpZ0xvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBIVE1MTGluZXMgPT4gJEhUTUxMaW5lcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDkvMDQvMDYgMTA6MjU6MTMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTGF5b3V0RnJlZC5wbSx2IDEuNiAyMDA5LzA0LzIxIDExOjQ0OjAxIHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgc2V2ZXJhbCBmcmVkIG1vZHVsZXMKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRGcmVkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IHx8IHJlZiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgRnJlZE1vZHVsZXNSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJE1vZHVsZU5hbWUgKCBrZXlzICV7ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfSApIHsKCiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZExheW91dEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUgKTsKCiAgICAgICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoIE1vZHVsZVJlZiA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LT57JE1vZHVsZU5hbWV9ICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWQnIC4gJFBhcmFte01vZHVsZU5hbWV9OwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJEJhY2tlbmRPYmplY3QgaWYgJEJhY2tlbmRPYmplY3Q7CiAgICB9CiAgICByZXR1cm47Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDA5LzA0LzIxIDExOjQ0OjAxICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBPdXRwdXRGaWx0ZXJGcmVkLnBtLHYgMS4yMiAyMDA5LzExLzAyIDE0OjMzOjE5IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpPdXRwdXRGaWx0ZXJGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQKCj1oZWFkMSBTWU5PUFNJUwoKYSBvdXRwdXQgZmlsdGVyIG1vZHVsZSBzcGVjaWFsbHkgZm9yIGRldmVsb3BlcgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57RnJlZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RnJlZC0+bmV3KCAleyRTZWxmfSApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSA9ICRQYXJhbXtMYXlvdXRPYmplY3R9OwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwZXJoYXBzIG5vIG91dHB1dCBpcyBnZW5lcmF0ZWQKICAgIGlmICggISRQYXJhbXtEYXRhfSApIHsKICAgICAgICBkaWUgJ0ZyZWQ6IEF0IHRoZSBtb21lbnQsIHlvdXIgY29kZSBnZW5lcmF0ZXMgbm8gb3V0cHV0ISc7CiAgICB9CgogICAgIyBkbyBub3RoaW5nIGlmIG91dHB1dCBpcyBhIGF0dGFjaG1lbnQKICAgIGlmICgKICAgICAgICAkeyAkUGFyYW17RGF0YX0gfSA9fiAvXkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7L21pCiAgICAgICAgfHwgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15Db250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7L21pCiAgICAgICAgKQogICAgewogICAgICAgIHByaW50IFNUREVSUiAiQVRUQUNITUVOVCBET1dOTE9BRFxuIjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGRvIG5vdGhpbmcgaWYgaXQgaXMgYSByZWRpcmVjdAogICAgaWYgKAogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IC9eU3RhdHVzOiAzMDIgTW92ZWQvbWkKICAgICAgICAmJiAkeyAkUGFyYW17RGF0YX0gfSA9fiAvXmxvY2F0aW9uOi9taQogICAgICAgICYmIGxlbmd0aCggJHsgJFBhcmFte0RhdGF9IH0gKSA8IDgwMAogICAgICAgICkKICAgIHsKICAgICAgICBwcmludCBTVERFUlIgIlJFRElSRUNUXG4iOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZG8gbm90aGluZyBpZiBpdCBpcyBmcmVkIGl0IHNlbGYKICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gPX4gbXtGcmVkLVNldHRpbmc8XC90aXRsZT59bXN4ICkgewogICAgICAgIHByaW50IFNUREVSUiAiQ0hBTkdFIEZSRUQgU0VUVElOR1xuIjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGRvIG5vdGhpbmcgaWYgaXQgZG9lcyBub3QgY29udGFpbiB0aGUgPGh0bWw+IGVsZW1lbnQsIG1pZ2h0IGJlCiAgICAjIGFuIGVtYmVkZGVkIGxheW91dCByZW5kZXJpbmcKICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gIX4gbXs8aHRtbD59bXN4ICkgewogICAgICAgIHByaW50IFNUREVSUiAiTk9UIEFOIEhUTUwgRE9DVU1FTlRcbiI7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgZGF0YSBvZiB0aGUgYWN0aXZhdGVkIG1vZHVsZXMKICAgIG15ICRNb2R1bGVGb3JSZWYgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgIG15ICRNb2R1bGVzRGF0YVJlZiA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7JE1vZHVsZUZvclJlZn0gKSB7CiAgICAgICAgaWYgKCAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICkgewogICAgICAgICAgICAkTW9kdWxlc0RhdGFSZWYtPnskTW9kdWxlfSA9IHt9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgdGhlIGFjdGl2YXRlZCBtb2R1bGVzCiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5EYXRhR2V0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRNb2R1bGVzRGF0YVJlZiwKICAgICAgICBIVE1MRGF0YVJlZiAgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgY3JlYXRlIGZyZWRzIG91dHB1dAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DcmVhdGVGcmVkT3V0cHV0KCBGcmVkTW9kdWxlc1JlZiA9PiAkTW9kdWxlc0RhdGFSZWYgKTsKCiAgICAjIGJ1aWxkIHRoZSBjb250ZW50IHN0cmluZwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfS0+e091dHB1dH0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfS0+e091dHB1dH07CiAgICAgICAgZGVsZXRlICRNb2R1bGVzRGF0YVJlZi0+e0NvbnNvbGV9OwogICAgfQogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7JE1vZHVsZXNEYXRhUmVmfSApIHsKICAgICAgICAkT3V0cHV0IC49ICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9LT57T3V0cHV0fSB8fCAnJzsKICAgIH0KCiAgICAjIGluY2x1ZGUgdGhlIGZyZWQgb3V0cHV0IGluIHRoZSBvcmlnaW5hbCBvdXRwdXQKICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gIX4gcy8oXDxib2R5KHwuKz8pXD4pLyQxXG4kT3V0cHV0XG5cblxuXG4vbXggKSB7CiAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gcy9eKC4pL1xuJE91dHB1dFxuXG5cblxuJDEvbXg7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjIyICQgJERhdGU6IDIwMDkvMTEvMDIgMTQ6MzM6MTkgJAoKPWN1dAo=
IyAtLQojIERldmVsRnJlZEJlbmNobWFyay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZEJlbmNobWFyay5kdGwsdiAxLjMgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1CZW5jaG1hcms8L2ZvbnQ+PC9iPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPjx0ZD48L3RkPjwvdHI+CjwvdGFibGU+
IyAtLQojIERldmVsRnJlZENvbW1vbkNTUy5kdGwgLSBjb21tb24gQ1NTIGZvciBGcmVkIG1vZHVsZXMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZENvbW1vbkNTUy5kdGwsdiAxLjQgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgouRGV2ZWxGcmVkQm94IHsKICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrOwogICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Cn0KCi5EZXZlbEZyZWRCb3ggKiB7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5EZXZlbEZyZWRCb3ggPiBoMSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmEwZjBmOwogICAgY29sb3I6IHdoaXRlOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMnB4Owp9CgouRGV2ZWxGcmVkQm94ID4gZGl2LAouRGV2ZWxGcmVkQm94ID4gdGFibGUgewogICAgcGFkZGluZzogMnB4Owp9CgouRGV2ZWxGcmVkQm94IHByZSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgouRGV2ZWxGcmVkQm94IHNtYWxsLAouRGV2ZWxGcmVkQm94IHNtYWxsICogewogICAgZm9udC1zaXplOiAxMXB4Owp9Cjwvc3R5bGU+
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZENvbnNvbGUuZHRsLHYgMS43IDIwMDkvMTAvMzAgMDc6NTc6MTMgbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiRJbmNsdWRleyJEZXZlbEZyZWRDb21tb25DU1MifQoKPGRpdiBjbGFzcz0iRGV2ZWxGcmVkQm94Ij4KICAgIDxoMSBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyI+CiAgICBGcmVkLUNvbnNvbGUKICAgIDxzcGFuIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcCAwcHg7IHJpZ2h0OiA1cHg7Ij5tb2RfcGVybCAkUURhdGF7Ik1vZFBlcmwifTwvc3Bhbj4KICAgIDwvaDE+CiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7Ij4KICAgICAgICAkRGF0YXsiVGV4dCJ9CiAgICAgICAgPHNwYW4gc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wIDBweDsgcmlnaHQ6IDVweDsiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249RGV2ZWxGcmVkJlN1YmFjdGlvbj1TZXR0aW5nIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nU2V0dGluZyc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIG9uQ2xpY2s9IndpbmRvdy5vcGVuKCcnLCAnc2V0dGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD01MDAsaGVpZ2h0PTQ0MCxsZWZ0PTMwMCx0b3A9MjUwJyk7IiB0YXJnZXQ9InNldHRpbmciPnNldHRpbmc8L2E+CjwhLS0gZHRsOmJsb2NrOlNldHRpbmcgLS0+CiAgICAgICAgPC9zcGFuPgogICAgPC9kaXY+CjwvZGl2Pgo=
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkSFRNTENoZWNrLmR0bCx2IDEuNCAyMDA5LzEwLzIxIDE5OjAyOjE4IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgIDx0cj4KICAgICAgICA8dGQgYmdjb2xvcj0iI2JhMGYwZiI+CiAgICAgICAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgYmdjb2xvcj0iI2JhMGYwZiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUhUTUxDaGVjazwvZm9udD48L2I+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZEhUTUxWYWxpZGF0ZS5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkSFRNTFZhbGlkYXRlLmR0bCx2IDEuNSAyMDA5LzExLzAyIDE0OjMzOjE5IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJEZXZlbEZyZWRCb3giPgogICAgPGgxPkZyZWQtSFRNTFZhbGlkYXRlIFJlc3VsdDwvaDE+CiAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgd2lkdGg9IjElIj48L3RkPgogICAgICAgICAgICA8dGQgd2lkdGg9IjElIj5MaW5lPC90ZD4KICAgICAgICAgICAgPHRkIHdpZHRoPSIxJSI+Q2hhcjwvdGQ+CiAgICAgICAgICAgIDx0ZD5NZXNzYWdlPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpWYWxpZGF0aW9uUm93IC0tPgogICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPiRRRGF0YXsiVHlwZSJ9PC90ZD4KICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgc3R5bGU9InBhZGRpbmctbGVmdDogN3B4OyI+JFFEYXRheyJMaW5lTnVtYmVyIn08L3RkPgogICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiBzdHlsZT0icGFkZGluZy1sZWZ0OiA3cHg7Ij4kUURhdGF7IkNoYXJOdW1iZXIifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OiA3cHg7Ij4kUURhdGF7Ik1lc3NhZ2UifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VmFsaWRhdGlvblJvdyAtLT4KICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJTaG93IHNvdXJjZSIgb25jbGljaz0idGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnSFRNTFZhbGlkYXRvck9yaWcnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsiIC8+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgICA8ZGl2IGlkPSJIVE1MVmFsaWRhdG9yT3JpZyIgY2xhc3M9InNtYWxsIiBzdHlsZT0id2lkdGg6IDk5JTsgbWF4LWhlaWdodDogMzAwcHg7IG92ZXJmbG93OiBhdXRvOyBkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiA3cHg7Ij4KICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CjwhLS0gZHRsOmJsb2NrOk9yaWdSb3cgLS0+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMSUiPiRRRGF0YXsiTGluZU51bWJlciJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0iJFFEYXRheyJTdHlsZSJ9Ij48cHJlIHRpdGxlPSIkUURhdGF7IlRpdGxlIn0iPiRRRGF0YXsiTGluZUNvbnRlbnQifTwvcHJlPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk9yaWdSb3cgLS0+CiAgICAgICAgPC90YWJsZT4KICAgIDwvZGl2Pgo8L2Rpdj4=
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFNUREVSUkxvZy5kdGwsdiAxLjUgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1TVERFUlJMb2c8L2ZvbnQ+PC9iPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPjx0ZD48L3RkPjwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU2V0dGluZy5kdGwsdiAxLjkgMjAwOS8xMC8yMSAxOTowMjoxNyBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9IkRldmVsRnJlZFNldHRpbmciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNldHRpbmdBY3Rpb24iPgogICAgICAgICAgICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU2V0dGluZzwvZm9udD48L2I+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGcmVkTW9kdWxlIn0KPCEtLSBkdGw6YmxvY2s6Q29uZmlnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZG1pblN5c0NvbmZpZyZTdWJhY3Rpb249RWRpdCZTeXNDb25maWdTdWJHcm91cD0kRGF0YXsiTW9kdWxlTmFtZSJ9JlN5c0NvbmZpZ0dyb3VwPUZyZWQiICBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nU2V0dGluZyc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiIG9uQ2xpY2s9IndpbmRvdy5yZXNpemVUbyg5MDAsNTAwKSI+KCRUZXh0eyJDb25maWcifSk8L2E+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGcmVkTW9kdWxlIC0tPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkF0dGVudGlvbjogWW91IGNhbid0IHVzZSBTbWFsbFByb2YgYW5kIERQcm9mIGF0IHRoZSBzYW1lIHRpbWUhIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlNhdmUifSIgY2xhc3M9ImJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNtYWxsUHJvZi5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNtYWxsUHJvZiByZXN1bHQgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFNtYWxsUHJvZi5kdGwsdiAxLjYgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1TbWFsbFByb2Y8L2ZvbnQ+PC9iPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlByb2ZpbGVkIHBhY2thZ2VzOiJ9ICRRRGF0YXsiUGFja2FnZXMifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkNhbGxzIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IlRpbWUgZXhlY3V0aW5nIChtcykifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVGltZSBleHBlbmRlZCAobXMpIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IkZpbGUifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiTGluZSJ9CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJUZXh0In0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+JERhdGF7IlRvdGFsQ2FsbCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSI+IENhbGxzPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAgICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGVzcGVjaWFsbHkgJ3RpbWUgZXhlY3V0aW9uJyBhbmQgJ3RpbWUgZXhwZW5kZWQnIHJlYWQgcGVybGRvYyBTbWFsbFByb2YhIn0KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJJZiB5b3UgY2hhbmdlIHRoZSBwYWNrYWdlIGNvbmZpZyB5b3UgaGF2ZSB0byByZWxvYWQgdGhpcyBzaWRlIHR3byB0aW1lcyEifQogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZERQcm9mLmR0bCAtIGEgZnJvbnRlbmQgdG8gc2hvdyB0aGUgRFByb2YgcmVzdWx0IHRhYmxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWREUHJvZi5kdGwsdiAxLjUgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1EUHJvZjwvZm9udD48L2I+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpbWVUYWJsZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4lVGltZTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RXhjbFNlYzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Q3VtdWxTPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4jQ2FsbHM8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPnNlYy9jYWxsPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5Dc2VjL2M6PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+TmFtZTwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5Ub3RhbDo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiREYXRheyJUb3RhbFRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPlNlY29uZHM8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPiREYXRheyJUb3RhbENhbGwifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPiBDYWxsczwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaW1lVGFibGUgLS0+CjwhLS0gZHRsOmJsb2NrOkZ1bmN0aW9uTGlzdCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5OdW1iZXI8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD5OYW1lPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQo8IS0tIGR0bDpibG9jazpGdW5jdGlvbkxpc3QgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPgo=
IyAtLQojIERldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcuZHRsIC0gYSBmcm9udGVuZCB0byBzaG93IHRoZSB0cmFuc2xhdGlvbiBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFRyYW5zbGF0aW9uRGVidWcuZHRsLHYgMS40IDIwMDkvMTAvMjEgMTk6MDI6MTggbWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCBiZ2NvbG9yPSIjYmEwZjBmIj4KICAgICAgICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjYmEwZjBmIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtVHJhbnNsYXRpb25EZWJ1ZzwvZm9udD48L2I+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4=
IyAtLQojIERldmVsRnJlZFNRTExvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIHNxbCBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZFNRTExvZy5kdGwsdiAxLjYgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNSIgYmdjb2xvcj0iI2JhMGYwZiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNRTC1Mb2c8L2ZvbnQ+PC9iPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgICAgICAgICA8dGQ+S2luZDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPlN0YXRlbWVudDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPlBhY2thZ2U8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD5UaW1lIDEvMTAwIHNlYzwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkPkVxdWFsIFN0YXRlbWVudHM8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4kRGF0YXsiQWxsU3RhdGVtZW50cyJ9IEFsbFN0YXRtZW50cyA9ICREYXRheyJTZWxlY3RTdGF0ZW1lbnRzIn0gU0VMRUNUUyArICREYXRheyJEb1N0YXRlbWVudHMifSBET3M8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4kRGF0YXsiVGltZSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQ+c2VjPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CiMganVzdCBhIHNtYWxsIHNwYWNlCjx0YWJsZSBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZENvbmZpZ0xvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIGNvbmZpZyBkZWJ1Z2dpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZENvbmZpZ0xvZy5kdGwsdiAxLjYgMjAwOS8xMC8yMSAxOTowMjoxOCBtZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNiYTBmMGYiPgogICAgICAgICAgICAgICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1Db25maWctTG9nPC9mb250PjwvYj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQ+CgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+Q2FsbHM8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5Db25maWc8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5TdGF0dXM8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5QYWNrYWdlPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiREYXRheyJIVE1MTGluZXMifQogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgojIGp1c3QgYSBzbWFsbCBzcGFjZQo8dGFibGUgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+PHRkPjwvdGQ+PC90cj4KPC90YWJsZT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkLnBtLHYgMS4xMyAyMDA5LzA0LzIxIDEwOjU0OjM3IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEzICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRGcmVkT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQtPm5ldygKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpFdmFsdWF0ZSB0aGUgc2V2ZXJhbCBkYXRhIG9mIGFsbCBmcmVkIG1vZHVsZXMgYW5kIGFkZCB0aGVtCm9uIHRoZSBGcmVkTW9kdWxlcyByZWZlcmVuY2UuCgogICAgJEZyZWRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBGcmVkTW9kdWxlc1JlZiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAhJFBhcmFte0hUTUxEYXRhUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSFRNTERhdGFSZWYhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJE1vZHVsZU5hbWUgKCBrZXlzICV7ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfSApIHsKCiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUgKTsKCiAgICAgICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgICAgICAgICBNb2R1bGVSZWYgICAgICA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LT57JE1vZHVsZU5hbWV9LAogICAgICAgICAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0hUTUxEYXRhUmVmfSwKICAgICAgICAgICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgTW9kdWxlTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJFBhcmFte01vZHVsZU5hbWV9ICk7CgogICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewoKICAgICAgICAjIEZJWE1FIEVycm9yaGFuZGxpbmcKICAgICAgICAkQmFja2VuZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgYSBmcmVkIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKCBNb2R1bGVOYW1lID0+ICRQYXJhbXtNb2R1bGVOYW1lfSApOwoKICAgICMgZ2V0IG1vZHVsZSBkYXRhCiAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKCiAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nCiAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIF9Mb2FkQmFja2VuZCgpCgpsb2FkIGEgeG1sIGl0ZW0gbW9kdWxlCgogICAgJEJhY2tlbmRPYmplY3QgPSAkRnJlZE9iamVjdC0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkQmFja2VuZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZU5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAnS2VybmVsOjpTeXN0ZW06OkZyZWQ6OicgLiAkUGFyYW17TW9kdWxlTmFtZX07CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sICVQYXJhbSwgKTsKCiAgICAgICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CgogICAgICAgICAgICAjIHJldHVybiBvYmplY3QKICAgICAgICAgICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEzICQgJERhdGU6IDIwMDkvMDQvMjEgMTA6NTQ6MzcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9CZW5jaG1hcmsucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEJlbmNobWFyay5wbSx2IDEuNyAyMDA5LzA0LzIxIDEwOjIxOjU3IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpCZW5jaG1hcms7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpGcmVkOjpCZW5jaG1hcmsKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSBiZW5jaG1hcmsgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpCZW5jaG1hcms7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkJlbmNobWFyay0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkX1JlZiAocXcoIE1vZHVsZVJlZiApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRfUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZF9SZWYhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGFibGVSZWYgPSBbCiAgICAgICAgWwogICAgICAgICAgICAiQ2FuJ3QgZmluZCB0aGUgYmVuY2htYXJrIHRhYmxlLCBwbGVhc2UgY2hlY2sgeW91ciBjb2RlIGFuIHJlYWQgdGhlIEhPV1RPIGZvciB0aGUgYmVuY2htYXJrIG1vZHVsZS4iCiAgICAgICAgXQogICAgXTsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0JlbmNobWFyaycpICkgewogICAgICAgICRUYWJsZVJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdCZW5jaG1hcmsnKTsKICAgIH0KICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSAkVGFibGVSZWY7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDA5LzA0LzIxIDEwOjIxOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25zb2xlLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDb25zb2xlLnBtLHYgMS45IDIwMDkvMDQvMjEgMTA6MjE6NTcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpGcmVkOjpDb25zb2xlCgo9aGVhZDEgU1lOT1BTSVMKCmdpdmVzIHlvdSBhbGwgZnVuY3Rpb25zIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRoZSBjb25zb2xlCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGU7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFJlZiAocXcoTW9kdWxlUmVmIEhUTUxEYXRhUmVmIEZyZWRNb2R1bGVzUmVmKSkgewogICAgICAgIGlmICggISRQYXJhbXskUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFJlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNb2R1bGVzID0gKCk7CiAgICBmb3IgbXkgJE1vZHVsZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewogICAgICAgIGlmICggJE1vZHVsZSBuZSAnQ29uc29sZScgKSB7CiAgICAgICAgICAgIHB1c2ggQE1vZHVsZXMsICRNb2R1bGU7CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATW9kdWxlczsKCiAgICBpZiAoICR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSAhfiAvRnJlZC1TZXR0aW5nLyAmJiAkeyAkUGFyYW17SFRNTERhdGFSZWZ9IH0gPX4gL1w8Ym9keS4qP1w+LyApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1N0YXR1c30gPSAxOwogICAgfQoKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9uYW1lPSJBY3Rpb24iIHZhbHVlPSJMb2dpbiIvICkgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57U2V0dGluZ30gPSAxOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjkgJCAkRGF0ZTogMjAwOS8wNC8yMSAxMDoyMTo1NyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhUTUxDaGVjay5wbSx2IDEuOSAyMDA5LzA0LzIxIDEwOjIxOjU3IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2sKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSBIVE1MOjogbGludCBjaGVjawoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFNtYWxsUHJvZk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2stPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFBhcmFtUmVmIChxdyggTW9kdWxlUmVmIEhUTUxEYXRhUmVmICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdIVE1MOjpMaW50JykgKSB7CiAgICAgICAgbXkgJFRleHQgPSAnVGhlIEhUTUwtY2hlY2tlciBvZiBGcmVkIHJlcXVpcmVzIEhUTUw6OkxpbnQgdG8gYmUgaW5zdGFsbGVkIScKICAgICAgICAgICAgLiAnUGxlYXNlIGluc3RhbGwgSFRNTDo6TGludCB2aWEgQ1BBTiBvciBkZWFjdGl2YXRlIHRoZSBIVE1MLWNoZWNrZXIgdmlhIFN5c0NvbmZpZy4nOwogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBbJFRleHRdOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgIG15ICRIVE1MTGludE9iamVjdCA9IEhUTUw6OkxpbnQtPm5ldyggb25seV90eXBlcyA9PiBIVE1MOjpMaW50OjpFcnJvci0+U1RSVUNUVVJFICk7CiAgICAkSFRNTExpbnRPYmplY3QtPnBhcnNlKCAkeyAkUGFyYW17SFRNTERhdGFSZWZ9IH0gKTsKCiAgICBteSAkRXJyb3JDb3VudGVyID0gJEhUTUxMaW50T2JqZWN0LT5lcnJvcnM7CiAgICBteSBASFRNTExpbnRNZXNzYWdlczsKICAgIGZvciBteSAkRXJyb3IgKCAkSFRNTExpbnRPYmplY3QtPmVycm9ycyApIHsKICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgIGlmICggJFN0cmluZyAhfiAvSW52YWxpZCBjaGFyYWN0ZXIgLisgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgLyApIHsKICAgICAgICAgICAgcHVzaCBASFRNTExpbnRNZXNzYWdlcywgJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEBIVE1MTGludE1lc3NhZ2VzKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxASFRNTExpbnRNZXNzYWdlczsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS45ICQgJERhdGU6IDIwMDkvMDQvMjEgMTA6MjE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MVmFsaWRhdGUucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhUTUxWYWxpZGF0ZS5wbSx2IDEuMyAyMDA5LzExLzAyIDE0OjMzOjE5IG1nIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MVmFsaWRhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgRmlsZTo6VGVtcDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxWYWxpZGF0ZQoKPWhlYWQxIFNZTk9QU0lTCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjazsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjay0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkUGFyYW1SZWYgKHF3KCBNb2R1bGVSZWYgSFRNTERhdGFSZWYgKSkgewogICAgICAgIGlmICggISRQYXJhbXskUGFyYW1SZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUGFyYW1SZWYhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29udGVudCA9ICR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfTsKCiAgICAjIGN1dCBvdXQgSFRUUCBoZWFkZXJzCiAgICAkQ29udGVudCA9fiBzL15bXjxdKy8vc214OwoKICAgIG15ICRUbXAgPSBGaWxlOjpUZW1wLT5uZXcoIFVOTElOSyA9PiAxLCBTVUZGSVggPT4gJy5odG1sJyApOwogICAgcHJpbnQgJFRtcCAkQ29udGVudDsKICAgIGNsb3NlKCRUbXApOwoKICAgIG15ICRSZXN1bHQgPSBgL3Vzci9iaW4vdmFsaWRhdGUgLS1lbWFjcyAkVG1wYDsKCiAgICBteSBAUmVzdWx0TGluZXMgPSBzcGxpdCggL1xuLywgJFJlc3VsdCApOwoKICAgIG15ICVUeXBlcyA9ICgKICAgICAgICBFID0+ICdFcnJvcicsCiAgICAgICAgVyA9PiAnV2FybmluZycsCiAgICApOwoKICAgIG15ICVFcnJvckxpbmVzOwogICAgbXkgJVdhcm5pbmdMaW5lczsKICAgIG15ICVMaW5lVGl0bGVzOwoKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKEBSZXN1bHRMaW5lcykgewogICAgICAgIG15ICggJExpbmVOdW1iZXIsICRDaGFyTnVtYmVyLCAkVHlwZSwgJE1lc3NhZ2UgKQogICAgICAgICAgICA9ICRMaW5lID1+IG0vW146XSs6KFxkKyk6KFxkKyk6KFtFV10/KTo/KC4qKS87CiAgICAgICAgbmV4dCBMSU5FIHVubGVzcyAkTWVzc2FnZTsKCiAgICAgICAgJEVycm9yTGluZXN7JExpbmVOdW1iZXJ9ICAgPSAxIGlmICggJFR5cGUgZXEgJ0UnICk7CiAgICAgICAgJFdhcm5pbmdMaW5lc3skTGluZU51bWJlcn0gPSAxIGlmICggJFR5cGUgZXEgJ1cnICk7CiAgICAgICAgJExpbmVUaXRsZXN7JExpbmVOdW1iZXJ9IC49ICIkTWVzc2FnZS4gIjsKCiAgICAgICAgIyBtYXAgVHlwZSB0byByZWFkYWJsZSB2YWx1ZQogICAgICAgICRUeXBlID0gJFR5cGVzeyRUeXBlfTsKCiAgICAgICAgcHVzaCgKICAgICAgICAgICAgQHsgJFBhcmFte01vZHVsZVJlZn0tPntWYWxpZGF0aW9uRGF0YX0gfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGluZU51bWJlciA9PiAkTGluZU51bWJlciwKICAgICAgICAgICAgICAgIENoYXJOdW1iZXIgPT4gJENoYXJOdW1iZXIsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvdW50ZXIgPSAxOwogICAgZm9yIG15ICRPcmlnTGluZSAoIHNwbGl0KCAvXG4vLCAkQ29udGVudCApICkgewogICAgICAgIG15ICRTdHlsZSA9ICcnOwogICAgICAgIGlmICggJEVycm9yTGluZXN7JENvdW50ZXJ9ICkgewogICAgICAgICAgICAkU3R5bGUgPSAnYmFja2dyb3VuZC1jb2xvcjogI0Y0QkJBRDsnCiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFdhcm5pbmdMaW5lc3skQ291bnRlcn0gKSB7CiAgICAgICAgICAgICRTdHlsZSA9ICdiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGNEMwOycKICAgICAgICB9CiAgICAgICAgcHVzaCgKICAgICAgICAgICAgQHsgJFBhcmFte01vZHVsZVJlZn0tPntPcmlnaW5hbERhdGF9IH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExpbmVDb250ZW50ID0+ICRPcmlnTGluZSwKICAgICAgICAgICAgICAgIExpbmVOdW1iZXIgID0+ICRDb3VudGVyLAogICAgICAgICAgICAgICAgU3R5bGUgICAgICAgPT4gJFN0eWxlLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJExpbmVUaXRsZXN7ICRDb3VudGVyKysgfSwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMDkvMTEvMDIgMTQ6MzM6MTkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNUREVSUkxvZy5wbSx2IDEuMTUgMjAwOS8wNC8yMSAxMDoyMTo1NyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1RERVJSTG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNUREVSUiBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZF9SZWYgKHF3KE1vZHVsZVJlZikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZF9SZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkX1JlZiEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3BlbiB0aGUgU1RERVJSLmxvZyBmaWxlIHRvIGdldCB0aGUgU1RERVJSIG1lc3NhZ2VzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1NUREVSUi5sb2cnOwogICAgbXkgJEZpbGVoYW5kbGU7CiAgICBpZiAoICFvcGVuICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RGF0YX0gPSBbCiAgICAgICAgICAgICJQZXJoYXBzIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gYXQgL3Zhci9mcmVkLyBvciAvS2VybmVsL0NvbmZpZy9GaWxlcy9BQUFGcmVkLnBtLiIsCiAgICAgICAgICAgICJDYW4ndCByZWFkIC92YXIvZnJlZC9TVERFUlIubG9nIiwKICAgICAgICBdOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgd2hvbGUgaW5mb3JtYXRpb24KICAgIG15IEBMb2dNZXNzYWdlczsKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgbGFzdCBMSU5FIGlmICRMaW5lID1+IG17IFxBIFxzKiBGUkVEIFxzKiBcen14bXM7CgogICAgICAgICMgQXR0ZW50aW9uOiB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgYmVjYXVzZSBvZiBEUHJvZi4gSSBoYXZlIHRvIGZvcmNlIHRoZSBwcm9jZXNzLgogICAgICAgICMgU28gSSBnZXQgdGhpcyB3YXJuaW5ncyEKICAgICAgICBpZiAoCiAgICAgICAgICAgICRMaW5lCiAgICAgICAgICAgICF+IC8oU3Vicm91dGluZSAuKz8gcmVkZWZpbmVkIGF0fGhhcyAuKz8gdW5zdGFja2VkIGNhbGxzfEZha2luZyAuKz8gZXhpdCB0aW1lc3RhbXApLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgJExpbmU7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgcHJpbnQgU1RERVJSICJcbkZSRURcbiI7CgogICAgIyB0cmltIHRoZSBsb2cgbWVzc2FnZSBhcnJheQogICAgTElORToKICAgIGZvciBteSAkTGluZSAoQExvZ01lc3NhZ2VzKSB7CiAgICAgICAgbGFzdCBMSU5FIGlmICRMaW5lICF+IG17IFxBIFxzKiBceiB9eG1zOwogICAgICAgIHNoaWZ0IEBMb2dNZXNzYWdlczsKICAgIH0KCiAgICAjIHRyaW0gdGhlIGxvZyBtZXNzYWdlIGFycmF5CiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSBATG9nTWVzc2FnZXMgKSB7CiAgICAgICAgbGFzdCBMSU5FIGlmICRMaW5lICF+IG17IFxBIFxzKiBceiB9eG1zOwogICAgICAgIHNoaWZ0IEBMb2dNZXNzYWdlczsKICAgIH0KCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xNSAkICREYXRlOiAyMDA5LzA0LzIxIDEwOjIxOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNtYWxsUHJvZi5wbSx2IDEuMTQgMjAwOS8wNC8yMSAxMDoyMTo1NyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U21hbGxQcm9mOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhdGggICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgbXkgJENvbmZpZ19SZWYgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJlZDo6U21hbGxQcm9mJyk7CiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBTbWFsbFByb2YnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ID1+IC9GcmVkLVNldHRpbmcvOwoKICAgICMgZmluZCBvdXQgd2hpY2ggcGFja2FnZXMgYXJlIGNoZWNrZWQgYnkgU21hbGxQcm9mCiAgICBteSBAUGFja2FnZXMgICAgICAgID0ga2V5cyAlREI6OnBhY2thZ2VzOwogICAgbXkgJENWU0NoZWNrUHJvYmxlbSA9IFwlREI6OnBhY2thZ2VzOyAgICAgICAjIHNvcnJ5LCB0aGlzIGlzIGJlY2F1c2Ugb2YgdGhlIENWU0NoZWNrZXIKICAgIGlmICggISRQYWNrYWdlc1swXSApIHsKICAgICAgICAkUGFja2FnZXNbMF0gPSAnYWxsJzsKICAgIH0KICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57UGFja2FnZXN9ID0gXEBQYWNrYWdlczsKCiAgICAjIGNhdGNoIHRoZSBuZWVkZWQgcHJvZmlsaW5nIGRhdGEKICAgIHN5c3RlbSAiY3AgJFBhdGgvc21hbGxwcm9mLm91dCAkUGF0aC9GcmVkU21hbGxQcm9mLm91dCI7CgogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRQYXRoIC4gJ0ZyZWRTbWFsbFByb2Yub3V0JyApIHsKCiAgICAgICAgIyBjb252ZXJ0IHRoZSBmaWxlIGluIHVzZWFibGUgZGF0YQogICAgICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC8oLis/KTooXGQrPyk6KFxkKz8pOihcZCs/KTooXGQrPyk6XHMqKC4qPykkLyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQExpbmVzLCBbICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgdGhlIG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgZGF0YQogICAgICAgIEBMaW5lcyA9IHNvcnQgeyAkYi0+WyAkQ29uZmlnX1JlZi0+e09yZGVyQnl9IF0gPD0+ICRhLT5bICRDb25maWdfUmVmLT57T3JkZXJCeX0gXSB9IEBMaW5lczsKICAgICAgICBpZiAoICRDb25maWdfUmVmLT57T3JkZXJCeX0gPT0gMSApIHsKICAgICAgICAgICAgQExpbmVzID0gcmV2ZXJzZSBATGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBkaXNhYmxlZCBmaWxlcyBvciBwYXRoIGlmIG5lY2Vzc2FyeQogICAgICAgIGlmICggJENvbmZpZ19SZWYtPntEaXNhYmxlZEZpbGVzfSApIHsKICAgICAgICAgICAgbXkgJERpc2FibGVkRmlsZXMgPSBqb2luICd8JywgQHsgJENvbmZpZ19SZWYtPntEaXNhYmxlZEZpbGVzfSB9OwogICAgICAgICAgICBATGluZXMgPSBncmVwIHsgJF8tPlswXSAhfiBte14oJERpc2FibGVkRmlsZXMpfXggfSBATGluZXM7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgb25seSBzbyBtYW55IGxpbmVzIGFzIHdhbnRlZAogICAgICAgIGlmIChATGluZXMpIHsKICAgICAgICAgICAgc3BsaWNlIEBMaW5lcywgJENvbmZpZ19SZWYtPntTaG93bkxpbmVzfTsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATGluZXM7CiAgICAgICAgfQogICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwogICAgfQoKICAgICMgY29tcHV0ZSB0b3RhbCBjYWxscwogICAgbXkgJFRvdGFsQ2FsbCA9IDA7CiAgICBmb3IgbXkgJFRpbWUgKEBMaW5lcykgewogICAgICAgIGlmICggJFRpbWUtPlsyXSA9fiAvXGQvICkgewogICAgICAgICAgICAkVG90YWxDYWxsICs9ICRUaW1lLT5bMl07CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9ID0gJFRvdGFsQ2FsbDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISIgaWYgLWwgJEZpbGU7CgogICAgIyB0byB1c2UgU21hbGxQcm9mIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgbXkgQExpbmVzID0gPCRGaWxlaGFuZGxlPjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIS91c3IvYmluL3BlcmwgLXcgLWQ6U21hbGxQcm9mXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgICMgY3JlYXRlIGEgaW5mbyBmb3IgdGhlIHVzZXIKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gIkZSRUQgbWFuaXB1bGF0ZWQgdGhlICRGaWxlISIsCiAgICApOwoKICAgICMgY3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBTbWFsbFByb2YgbW9kdWxlCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJSSwgJz4nLCAkU21hbGxQcm9mRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRTbWFsbFByb2ZGaWxlICFcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWQgZG9uJ3QgZWRpdCB0aGlzIGZpbGUhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiMgdXNlIC4uLy4uLyBhcyBsaWIgbG9jYXRpb25cbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEZpbmRCaW4gcXcoXCRCaW4pO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJ1c2UgbGliIFwiXCRCaW4vLi4vLi5cIjtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAidXNlIEtlcm5lbDo6Q29uZmlnO1xuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJteSBcJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiaWYgKFwkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZyZWQ6OlNtYWxsUHJvZicpLT57UGFja2FnZXN9KSB7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkKICAgICAgICAiICAgIG15IFxAQXJyYXkgPSBcQHsgXCRDb25maWdPYmplY3QtPkdldCgnRnJlZDo6U21hbGxQcm9mJyktPntQYWNrYWdlc30gfTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiICAgIG15IFwlSGFzaCA9IG1hcCB7IFwkXyA9PiAxOyB9IFxAQXJyYXk7XG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGVJSUkgIiAgICBcJURCOjpwYWNrYWdlcyA9IFwlSGFzaDtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAifVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUlJICJcJERCOjpkcm9wX3plcm9zID0gMTtcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJSSAiXCREQjo6Z3JlcF9mb3JtYXQgPSAxO1xuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlSUlJOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluL2luZGV4LnBsJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIG15IEBMaW5lcyA9IDwkRmlsZWhhbmRsZT47CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICAjIHJlbW92ZSB0aGUgbWFuaXB1bGF0ZWQgbGluZXMKICAgIGlmICggJExpbmVzWzBdID1+IC8jIVwvdXNyXC9iaW5cL3BlcmwgLXcgLWQ6U21hbGxQcm9mLyApIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyBGUkVEIC0gbWFuaXB1bGF0ZWQvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KCiAgICAjIHNhdmUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIC5zbWFsbHByb2YgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgbmVlZGVkCiAgICBteSAkU21hbGxQcm9mRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL2Jpbi9jZ2ktYmluLy5zbWFsbHByb2YnOwogICAgdW5saW5rICRTbWFsbFByb2ZGaWxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xNCAkICREYXRlOiAyMDA5LzA0LzIxIDEwOjIxOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9EUHJvZi5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRFByb2YucG0sdiAxLjEwIDIwMDkvMDQvMjEgMTA6MjE6NTcgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkRQcm9mOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkRQcm9mCgo9aGVhZDEgU1lOT1BTSVMKCmhhbmRsZSB0aGUgRFByb2YgcHJvZmlsaW5nIGRhdGEKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6RFByb2Y7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkRQcm9mLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATGluZXM7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkUmVmIChxdyhIVE1MRGF0YVJlZiBNb2R1bGVSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBpbiB0aGlzIHR3byBjYXNlcyBpdCBtYWtlcyBubyBzZW5zZSB0byBnZW5lcmF0ZSB0aGUgcHJvZmlsaW5nIGxpc3QKICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ICF+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGlzIHBhZ2UgZGVsaXZlciB0aGUgSFRNTCBieSBtYW55IHNlcGFyYXRlIG91dHB1dCBjYWxscy4nCiAgICAgICAgICAgICAgICAuICcgUGxlYXNlIHVzZSB0aGUgdXN1YWwgd2F5IHRvIGludGVycHJldCBEUHJvZicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICggJHsgJFBhcmFte0hUTUxEYXRhUmVmfSB9ID1+IC9GcmVkLVNldHRpbmcvICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgY2F0Y2ggdGhlIG5lZWRlZCBwcm9maWxpbmcgZGF0YQogICAgbXkgJFBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi8nOwogICAgc3lzdGVtICJjcCAkUGF0aC90bW9uLm91dCAkUGF0aC9EUHJvZi5vdXQiOwoKICAgIG15ICRDb25maWdfUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkRQcm9mJyk7CiAgICBteSBAUHJvZmlsaW5nUmVzdWx0czsKCiAgICAjIHJldHVybnMgdGhlIHRyZWUgcmVzdWx0cyBvZiBjb25maWd1cmVkCiAgICBpZiAoICRDb25maWdfUmVmLT57RnVuY3Rpb25UcmVlfSApIHsKICAgICAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICJkcHJvZnBwIC1GVCAkUGF0aC9EUHJvZi5vdXQgfCIgKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICAgICAgcHVzaCBAUHJvZmlsaW5nUmVzdWx0cywgWyAkQ291bnRlciwgJExpbmUgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntGdW5jdGlvblRyZWV9ID0gXEBQcm9maWxpbmdSZXN1bHRzOwoKICAgICAgICByZXR1cm4gMTsKCiAgICB9CgogICAgIyBzaG93IHRoZSBjb21tb24gcGVyZm9ybWFuY2UgcmVzdWx0cwogICAgbXkgJFNob3duTGluZXMgPSAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDwgNDAgPyAkQ29uZmlnX1JlZi0+e1Nob3duTGluZXN9IDogNDA7CiAgICBteSAkT3B0aW9ucyA9ICItRiAtTyAkU2hvd25MaW5lcyAiOwogICAgJE9wdGlvbnMgLj0gJENvbmZpZ19SZWYtPntPcmRlckJ5fSBlcSAnTmFtZScKICAgICAgICA/ICctYScKICAgICAgICA6ICRDb25maWdfUmVmLT57T3JkZXJCeX0gZXEgJ0NhbGxzJyA/ICctbCcKICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnOwogICAgaWYgKCBvcGVuIG15ICRGaWxlaGFuZGxlLCAiZHByb2ZwcCAkT3B0aW9ucyAkUGF0aC9EUHJvZi5vdXQgfCIgKSB7CiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRMaW5lCiAgICAgICAgICAgICAgICA9fiAvXlxzKj8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KVxzKz8oW15cc10rPylccys/KFteXHNdKz8pXHMrPyhbXlxzXSs/KVxzKz8oW15cc10rPykkLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBQcm9maWxpbmdSZXN1bHRzLCBbICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYsICQ3IF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkTGluZSA9fiAvXlxzKj8oW15cc10rPykkLyApIHsKICAgICAgICAgICAgICAgICRQcm9maWxpbmdSZXN1bHRzWy0xXVs2XSAuPSAkMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgIH0KCiAgICBzaGlmdCBAUHJvZmlsaW5nUmVzdWx0czsKCiAgICBpZiAoICRDb25maWdfUmVmLT57T3JkZXJCeX0gZXEgJ0N1VGltZScgKSB7CiAgICAgICAgQFByb2ZpbGluZ1Jlc3VsdHMgPSBzb3J0IHsgJGItPlsyXSA8PT4gJGEtPlsyXSB9IEBQcm9maWxpbmdSZXN1bHRzOwogICAgfQoKICAgICMgcmVtb3ZlIGRpc2FibGVkIHBhY2thZ2VzIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAkQ29uZmlnX1JlZi0+e0Rpc2FibGVkUGFja2FnZXN9ICkgewogICAgICAgIG15ICREaXNhYmxlZFBhY2thZ2VzID0gam9pbiAnfCcsIEB7ICRDb25maWdfUmVmLT57RGlzYWJsZWRQYWNrYWdlc30gfTsKICAgICAgICBAUHJvZmlsaW5nUmVzdWx0cyA9IGdyZXAgeyAkXy0+WzZdICF+IG17XigkRGlzYWJsZWRQYWNrYWdlcyk6On14IH0gQFByb2ZpbGluZ1Jlc3VsdHM7CiAgICB9CgogICAgIyBjb21wdXRlIHRvdGFsIHRpbWUKICAgIG15ICRUb3RhbFRpbWUgPSAwOwogICAgZm9yIG15ICRUaW1lIChAUHJvZmlsaW5nUmVzdWx0cykgewogICAgICAgIGlmICggJFRpbWUtPlsxXSBuZSAnLScgKSB7CiAgICAgICAgICAgICRUb3RhbFRpbWUgKz0gJFRpbWUtPlsxXTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRUb3RhbFRpbWUpIHsKICAgICAgICBmb3IgbXkgJFRpbWUgKEBQcm9maWxpbmdSZXN1bHRzKSB7CiAgICAgICAgICAgIGlmICggJFRpbWUtPlsxXSBuZSAnLScgKSB7CiAgICAgICAgICAgICAgICAkVGltZS0+WzBdID0gaW50KCAkVGltZS0+WzFdIC8gJFRvdGFsVGltZSAqIDEwMDAwICkgLyAxMDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjb21wdXRlIHRvdGFsIGNhbGxzCiAgICBteSAkVG90YWxDYWxsID0gMDsKICAgIGZvciBteSAkVGltZSAoQFByb2ZpbGluZ1Jlc3VsdHMpIHsKICAgICAgICBpZiAoICRUaW1lLT5bM10gPX4gL1xkLyApIHsKICAgICAgICAgICAgJFRvdGFsQ2FsbCArPSAkVGltZS0+WzNdOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ICAgICAgPSBcQFByb2ZpbGluZ1Jlc3VsdHM7CiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e1RvdGFsVGltZX0gPSAkVG90YWxUaW1lOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntUb3RhbENhbGx9ID0gJFRvdGFsQ2FsbDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvYmluL2NnaS1iaW4vaW5kZXgucGwnOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgdG8gdXNlIERQcm9mIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMhL3Vzci9iaW4vcGVybCAtdyAtZDpEUHJvZlxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKCiAgICAjIGNyZWF0ZSBhIGluZm8gZm9yIHRoZSB1c2VyCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEiLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgQExpbmVzID0gKCk7CiAgICBteSAkRmlsZSAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9iaW4vY2dpLWJpbi9pbmRleC5wbCc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICJDYW4ndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISI7CiAgICB9CgogICAgIyByZWFkIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyByZW1vdmUgdGhlIG1hbmlwdWxhdGVkIGxpbmVzCiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyFcL3VzclwvYmluXC9wZXJsIC13IC1kOkRQcm9mLyApIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoICRMaW5lc1swXSA9fiAvIyBGUkVEIC0gbWFuaXB1bGF0ZWQvICkgewogICAgICAgIHNoaWZ0IEBMaW5lczsKICAgIH0KCiAgICAjIHNhdmUgdGhlIGluZGV4LnBsIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEwICQgJERhdGU6IDIwMDkvMDQvMjEgMTA6MjE6NTcgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9UcmFuc2xhdGlvbkRlYnVnLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBUcmFuc2xhdGlvbkRlYnVnLnBtLHYgMS4xMyAyMDA5LzA0LzIxIDEwOjIxOjU3IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWcKCj1oZWFkMSBTWU5PUFNJUwoKaGFuZGxlIHRoZSB0cmFuc2xhdGlvbiBkZWJ1ZyBkYXRhCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlRyYW5zbGF0aW9uRGVidWctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3BlbiB0aGUgVHJhbnNsYXRpb25EZWJ1Zy5sb2cgZmlsZSB0byBnZXQgdGhlIHVudHJhbnNsYXRlZCB3b3JkcwogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9UcmFuc2xhdGlvbkRlYnVnLmxvZyc7CiAgICBteSAkRmlsZWhhbmRsZTsKICAgIGlmICggIW9wZW4gJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgKSB7CiAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFsKICAgICAgICAgICAgIlBlcmhhcHMgeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiBhdCAvdmFyL2ZyZWQvIiwKICAgICAgICAgICAgIkNhbid0IHJlYWQgL3Zhci9mcmVkL1RyYW5zbGF0aW9uRGVidWcubG9nIgogICAgICAgIF07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgQExvZ01lc3NhZ2VzOwoKICAgICMgZ2V0IHRoZSB3aG9sZSBpbmZvcm1hdGlvbgogICAgTElORToKICAgIGZvciBteSAkTGluZSAoIHJldmVyc2UgPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBsYXN0IExJTkUgaWYgJExpbmUgPX4gL0ZSRUQvOwoKICAgICAgICBjaG9tcCAkTGluZTsKICAgICAgICBuZXh0IExJTkUgaWYgJExpbmUgZXEgJyc7CgogICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICRTZWxmLT5JbnNlcnRXb3JkKCBXaGF0ID0+ICJGUkVEXG4iICk7CgogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSA9IFxATG9nTWVzc2FnZXM7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9MYW5ndWFnZS5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIiBpZiAtbCAkRmlsZTsKCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgbXkgQExpbmVzID0gPCRGaWxlaGFuZGxlPjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICAgICAgaWYgKCAkTGluZSA9fiAvIyB3YXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmLyApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1ZztcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICJteSBcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1Zy0+bmV3KFwle1wkU2VsZn0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiXCRUcmFuc2xhdGlvbkRlYnVnT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCRXaGF0KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL0xhbmd1YWdlLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWdnZXIgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgICMgaGVyZSBJIHVuZG8gbXkgbWFuaXB1bGF0aW9uCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgbXkgQExpbmVzID0gPCRGaWxlaGFuZGxlPjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkNhbid0IHdyaXRlICRGaWxlICFcbiI7CgogICAgbXkgJVJlbW92ZUxpbmUgPSAoCiAgICAgICAgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpUcmFuc2xhdGlvbkRlYnVnO1xuIiA9PiAxLAogICAgICAgICJteSBcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6VHJhbnNsYXRpb25EZWJ1Zy0+bmV3KFwle1wkU2VsZn0pO1xuIgogICAgICAgICAgICA9PiAxLAogICAgICAgICJcJFRyYW5zbGF0aW9uRGVidWdPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcJFdoYXQpO1xuIiA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIGlmICggISRSZW1vdmVMaW5leyRMaW5lfSApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEluc2VydFdvcmQoKQoKU2F2ZSBhIHdvcmQgaW4gdGhlIHRyYW5zbGF0aW9uIGRlYnVnIGxvZwoKICAgICRCYWNrZW5kT2JqZWN0LT5JbnNlcnRXb3JkKAogICAgICAgIFdoYXQgPT4gJ2Egd29yZCcsCiAgICApOwoKPWN1dAoKc3ViIEluc2VydFdvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhZGVmaW5lZCggJFBhcmFte1doYXR9ICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFdoYXQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNhdmUgdGhlIHdvcmQgaW4gbG9nIGZpbGUKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2ZyZWQvVHJhbnNsYXRpb25EZWJ1Zy5sb2cnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJFBhcmFte1doYXR9IC4gIlxuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDA5LzA0LzIxIDEwOjIxOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TUUxMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFNRTExvZy5wbSx2IDEuMTMgMjAwOS8wNC8yMSAxMDoyMTo1NyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIHNxbCBsb2cKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6U1FMTG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJFNtYWxsUHJvZk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3BlbiB0aGUgVHJhbnNsYXRpb25EZWJ1Zy5sb2cgZmlsZSB0byBnZXQgdGhlIHVudHJhbnNsYXRlZCB3b3JkcwogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvZnJlZC9TUUwubG9nJzsKICAgIG15ICRGaWxlaGFuZGxlOwogICAgaWYgKCAhb3BlbiAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gWwogICAgICAgICAgICAiUGVyaGFwcyB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGF0IC92YXIvZnJlZC8iLAogICAgICAgICAgICAiQ2FuJ3QgcmVhZCAvdmFyL2ZyZWQvU1FMLmxvZyIKICAgICAgICBdOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBATG9nTWVzc2FnZXM7CiAgICBteSAkRG9TdGF0ZW1lbnRzICAgICA9IDA7CiAgICBteSAkU2VsZWN0U3RhdGVtZW50cyA9IDA7CgogICAgIyBnZXQgdGhlIHdob2xlIGluZm9ybWF0aW9uCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIGxhc3QgTElORSBpZiAkTGluZSA9fiAvRlJFRC87CgogICAgICAgIG15IEBTcGxpdGVkTG9nID0gc3BsaXQgLzsvLCAkTGluZTsKICAgICAgICBpZiAoICRTcGxpdGVkTG9nWzBdIGVxICdTUUwtRE8nICYmICRTcGxpdGVkTG9nWzFdID1+IC9eU0VMRUNULyApIHsKICAgICAgICAgICAgJFNwbGl0ZWRMb2dbMF0gLj0gJyAtIFBlcmhhcHMgeW91IGhhdmUgYW4gZXJyb3IgeW91IHVzZSBETyBmb3IgYSBTRUxFQ1QtU3RhdGVtZW50Oic7CiAgICAgICAgfQogICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCBcQFNwbGl0ZWRMb2c7CgogICAgICAgIGlmICggJFNwbGl0ZWRMb2dbMF0gZXEgJ1NRTC1ETycgKSB7CiAgICAgICAgICAgICREb1N0YXRlbWVudHMrKzsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmZXIgaW4gMS8xMDAgc2VjCiAgICAgICAgaWYgKCAkU3BsaXRlZExvZ1szXSApIHsKICAgICAgICAgICAgJFBhcmFte01vZHVsZVJlZn0tPntUaW1lfSArPSAkU3BsaXRlZExvZ1szXTsKICAgICAgICAgICAgJFNwbGl0ZWRMb2dbM10gKj0gMTAwOwogICAgICAgIH0KICAgIH0KCiAgICBwb3AgQExvZ01lc3NhZ2VzOwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgIyBmaW5kIG11bHRpIHVzZWQgc3RhdGVtZW50cwogICAgbXkgJU11bHRpVXNlZDsKICAgIGZvciBteSAkU3RhdGVtZW50UmVmIChATG9nTWVzc2FnZXMpIHsKICAgICAgICAkTXVsdGlVc2VkeyAkU3RhdGVtZW50UmVmLT5bMV0gfSsrOwogICAgfQogICAgZm9yIG15ICRTdGF0ZW1lbnRSZWYgKEBMb2dNZXNzYWdlcykgewogICAgICAgIHB1c2ggQHskU3RhdGVtZW50UmVmfSwgKCAkTXVsdGlVc2VkeyAkU3RhdGVtZW50UmVmLT5bMV0gfSAtIDEgKTsKICAgIH0KCiAgICAkU2VsZi0+SW5zZXJ0V29yZCggV2hhdCA9PiAiRlJFRFxuIiApOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntEYXRhfSAgICAgICAgICAgICA9IFxATG9nTWVzc2FnZXM7CiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0FsbFN0YXRlbWVudHN9ICAgID0gc2NhbGFyIEBMb2dNZXNzYWdlczsKICAgICRQYXJhbXtNb2R1bGVSZWZ9LT57RG9TdGF0ZW1lbnRzfSAgICAgPSAkRG9TdGF0ZW1lbnRzOwogICAgJFBhcmFte01vZHVsZVJlZn0tPntTZWxlY3RTdGF0ZW1lbnRzfSA9ICRQYXJhbXtNb2R1bGVSZWZ9LT57QWxsU3RhdGVtZW50c30gLSAkRG9TdGF0ZW1lbnRzOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvU3lzdGVtL0RCLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWcgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICBteSBATGluZXMgPSA8JEZpbGVoYW5kbGU+OwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnbm90aWNlJywgTWVzc2FnZSA9PiAid3JpdGUgZmlsZSEiICk7CiAgICBteSAkUHJlcGFyZTsKICAgIG15ICREb1NRTDsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkTGluZSA9fiBtW14gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICAgICAgICAgIFwkU2VsZi0+e0N1cnMoZXxvKXJ9ICAgICAgICAgICAgXHMqICMgYmVjYXVzZSBvZiBhbiB0eXBvIGJ1Z2ZpeCBpbiAyLjMKICAgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCRTZWxmLT57ZGJofS0+cHJlcGFyZVwoXCRTUUxcKSBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgXCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICBdeAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gImluc2VydCBmcmVkIGxvZyBQcmVwYXJlISIgKTsKICAgICAgICAgICAgJFByZXBhcmUgPSAxOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5IHR2X2ludGVydmFsKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkdDAgPSBbZ2V0dGltZW9mZGF5XTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICJteSBcJFNRTExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2ctPm5ldyhcJXtcJFNlbGZ9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkQ2FsbGVyID0gY2FsbGVyKCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKCiAgICAgICAgfQogICAgICAgIGlmICggJExpbmUgPX4gbXteICAgICMgc2xvdyBsb2cgZmVhdHVyZX0gJiYgJFByZXBhcmUgKSB7CiAgICAgICAgICAgICRQcmVwYXJlID0gMDsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkRGlmZlRpbWUgPSB0dl9pbnRlcnZhbChcJHQwKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICJcJFNRTExvZ09iamVjdC0+SW5zZXJ0V29yZChXaGF0ID0+IFwiU1FMLVNFTEVDVDtcJFNRTDtcJENhbGxlcjtcJERpZmZUaW1lXCIpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRMaW5lID1+IC9eICAgICMgc2VuZCBzcWwgdG8gZGF0YWJhc2UvICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ25vdGljZScsIE1lc3NhZ2UgPT4gImluc2VydCBmcmVkIGxvZyBkbyEiICk7CiAgICAgICAgICAgICREb1NRTCA9IDE7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZztcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgInVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkgdHZfaW50ZXJ2YWwpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCR0MCA9IFtnZXR0aW1lb2ZkYXldO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSQogICAgICAgICAgICAgICAgIm15IFwkU1FMTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZy0+bmV3KFwle1wkU2VsZn0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAibXkgXCRDYWxsZXIgPSBjYWxsZXIoKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTGluZSA9fiBte14gICAgcmV0dXJuIDE7fSAmJiAkRG9TUUwgKSB7CiAgICAgICAgICAgICREb1NRTCA9IDA7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJERpZmZUaW1lID0gdHZfaW50ZXJ2YWwoXCR0MCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJCiAgICAgICAgICAgICAgICAiXCRTUUxMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlNRTC1ETztcJFBhcmFte1NRTH07XCRDYWxsZXI7XCREaWZmVGltZVwiKTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgIH0KCiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9EQi5wbSc7CgogICAgIyBjaGVjayBpZiBpdCBpcyBhbiBzeW1saW5rLCBiZWNhdXNlIGl0IGNhbiBiZSBkZXZlbG9wbWVudCBzeXN0ZW0gd2hpY2ggdXNlIHN5bWxpbmtzCiAgICBkaWUgIkNhbid0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshIiBpZiAtbCAkRmlsZTsKCiAgICAjIHRvIHVzZSBUcmFuc2xhdGlvbkRlYnVnZ2VyIEkgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBMYW5ndWFnZS5wbSBmaWxlCiAgICAjIGhlcmUgSSB1bmRvIG15IG1hbmlwdWxhdGlvbgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSB8fCBkaWUgIkNhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIG15IEBMaW5lcyA9IDwkRmlsZWhhbmRsZT47CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwoKICAgIG15ICVSZW1vdmVMaW5lID0gKAogICAgICAgICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTUUxMb2c7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIm15IFwkU1FMTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNRTExvZy0+bmV3KFwle1wkU2VsZn0pO1xuIiAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICJteSBcJENhbGxlciA9IGNhbGxlcigpO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAiXCRTUUxMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlNRTC1ETztcJFBhcmFte1NRTH07XCRDYWxsZXJcO1wkRGlmZlRpbWVcIik7XG4iID0+IDEsCiAgICAgICAgIlwkU1FMTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJTUUwtU0VMRUNUO1wkU1FMO1wkQ2FsbGVyXDtcJERpZmZUaW1lXCIpO1xuIiAgICA9PiAxLAogICAgICAgICJ1c2UgVGltZTo6SGlSZXMgcXcoZ2V0dGltZW9mZGF5IHR2X2ludGVydmFsKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAibXkgXCR0MCA9IFtnZXR0aW1lb2ZkYXldO1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgIm15IFwkRGlmZlRpbWUgPSB0dl9pbnRlcnZhbChcJHQwKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIGlmICggISRSZW1vdmVMaW5leyRMaW5lfSApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEluc2VydFdvcmQoKQoKU2F2ZSBhIHdvcmQgaW4gdGhlIHRyYW5zbGF0aW9uIGRlYnVnIGxvZwoKICAgICRCYWNrZW5kT2JqZWN0LT5JbnNlcnRXb3JkKAogICAgICAgIFdoYXQgPT4gJ2Egd29yZCcsCiAgICApOwoKPWN1dAoKc3ViIEluc2VydFdvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBXaGF0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzYXZlIHRoZSB3b3JkIGluIGxvZyBmaWxlCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL1NRTC5sb2cnOwogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4+JywgJEZpbGUgfHwgZGllICJDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJFBhcmFte1doYXR9IC4gIlxuIjsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDA5LzA0LzIxIDEwOjIxOjU3ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25maWdMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENvbmZpZ0xvZy5wbSx2IDEuMTIgMjAwOS8wNC8yMSAxMDo1NDozNyB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIGNvbmZpZyBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpDb25maWdMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU21hbGxQcm9mT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggJFBhcmFteyRPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKR2V0IHRoZSBkYXRhIGZvciB0aGlzIGZyZWQgbW9kdWxlLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuCkFuZCBhZGQgdGhlIGRhdGEgdG8gdGhlIG1vZHVsZSByZWYuCgogICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgTW9kdWxlUmVmID0+ICRNb2R1bGVSZWYsCiAgICApOwoKPWN1dAoKc3ViIERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATG9nTWVzc2FnZXM7CgogICAgIyBvcGVuIHRoZSBUcmFuc2xhdGlvbkRlYnVnLmxvZyBmaWxlIHRvIGdldCB0aGUgdW50cmFuc2xhdGVkIHdvcmRzCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9mcmVkL0NvbmZpZy5sb2cnOwogICAgbXkgJEZpbGVoYW5kbGU7CiAgICBpZiAoICFvcGVuICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICkgewogICAgICAgIHByaW50IFNUREVSUiAiUGVyaGFwcyB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIGF0IC92YXIvZnJlZC9cbiIgLgogICAgICAgICAgICAiQ2FuJ3QgcmVhZCAvdmFyL2ZyZWQvQ29uZmlnLmxvZyI7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSB3aG9sZSBpbmZvcm1hdGlvbgogICAgTElORToKICAgIGZvciBteSAkTGluZSAoIHJldmVyc2UgPCRGaWxlaGFuZGxlPiApIHsKICAgICAgICBsYXN0IExJTkUgaWYgJExpbmUgPX4gL0ZSRUQvOwogICAgICAgIHB1c2ggQExvZ01lc3NhZ2VzLCAkTGluZTsKICAgIH0KCiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKICAgIHBvcCBATG9nTWVzc2FnZXM7CiAgICAkU2VsZi0+SW5zZXJ0V29yZCggV2hhdCA9PiAiRlJFRFxuIiApOwoKICAgIG15ICVJbmRpdmlkdWFsQ29uZmlnID0gKCk7CgogICAgZm9yIG15ICRMaW5lIChATG9nTWVzc2FnZXMpIHsKICAgICAgICAkTGluZSA9fiBzL1xuLy87CiAgICAgICAgJEluZGl2aWR1YWxDb25maWd7JExpbmV9Kys7CiAgICB9CgogICAgQExvZ01lc3NhZ2VzID0gKCk7CiAgICBmb3IgbXkgJExpbmUgKCBrZXlzICVJbmRpdmlkdWFsQ29uZmlnICkgewogICAgICAgIG15IEBTcGxpdGVkTGluZSA9IHNwbGl0IC87LywgJExpbmU7CiAgICAgICAgcHVzaCBAU3BsaXRlZExpbmUsICRJbmRpdmlkdWFsQ29uZmlneyRMaW5lfTsKICAgICAgICBwdXNoIEBMb2dNZXNzYWdlcywgXEBTcGxpdGVkTGluZTsKICAgIH0KCiAgICAjIHNvcnQgdGhlIGRhdGEKICAgIG15ICRDb25maWdfUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkNvbmZpZ0xvZycpOwogICAgbXkgJE9yZGVyQnkgPSBkZWZpbmVkKCAkQ29uZmlnX1JlZi0+e09yZGVyQnl9ICkgPyAkQ29uZmlnX1JlZi0+e09yZGVyQnl9IDogMzsKICAgIGlmICggJE9yZGVyQnkgPT0gMyApIHsKICAgICAgICBATG9nTWVzc2FnZXMgPSBzb3J0IHsgJGItPlskT3JkZXJCeV0gPD0+ICRhLT5bJE9yZGVyQnldIH0gQExvZ01lc3NhZ2VzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQExvZ01lc3NhZ2VzID0gc29ydCB7ICRhLT5bJE9yZGVyQnldIGNtcCAkYi0+WyRPcmRlckJ5XSB9IEBMb2dNZXNzYWdlczsKICAgIH0KCiAgICAkUGFyYW17TW9kdWxlUmVmfS0+e0RhdGF9ID0gXEBMb2dNZXNzYWdlczsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBBY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBBY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgQExpbmVzID0gKCk7CgogICAgbXkgJEZpbGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy9LZXJuZWwvQ29uZmlnL0RlZmF1bHRzLnBtJzsKCiAgICAjIGNoZWNrIGlmIGl0IGlzIGFuIHN5bWxpbmssIGJlY2F1c2UgaXQgY2FuIGJlIGRldmVsb3BtZW50IHN5c3RlbSB3aGljaCB1c2Ugc3ltbGlua3MKICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiIGlmIC1sICRGaWxlOwoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWcgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgfHwgZGllICJDYW4ndCBvcGVuICRGaWxlICFcbiI7CiAgICBATGluZXMgPSA8JEZpbGVoYW5kbGU+OwogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIG15ICRTdWJHZXQgPSAnJzsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICBpZiAoICRMaW5lID1+IC9zdWIgR2V0LyApIHsKICAgICAgICAgICAgJFN1YkdldCA9ICJHZXQiOwogICAgICAgIH0KICAgICAgICBpZiAoICRTdWJHZXQgZXEgJ0dldCcgJiYgJExpbmUgPX4gL215IFwkU2VsZiA9IHNoaWZ0Oy8gKSB7CiAgICAgICAgICAgICRTdWJHZXQgLj0gJ1NlbGYnOwogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgICggJFN1YkdldCBlcSAnR2V0U2VsZicgJiYgJExpbmUgPX4gL215IFwkV2hhdCA9IHNoaWZ0Oy8gKQogICAgICAgICAgICB8fCAkU3ViR2V0IGVxICdHZXQnICYmICRMaW5lID1+IC9teSBcKCBcJFNlbGYsIFwkV2hhdCBcKSA9IFxAXzsvCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJ1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZztcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIm15IFwkQ29uZmlnTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbmZpZ0xvZy0+bmV3KCk7XG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICJteSBcJENhbGxlciA9IGNhbGxlcigpO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiaWYgKFwkU2VsZi0+e1wkV2hhdH0pIHsgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkKICAgICAgICAgICAgICAgICIgICAgXCRDb25maWdMb2dPYmplY3QtPkluc2VydFdvcmQoV2hhdCA9PiBcIlwkV2hhdDtUcnVlO1wkQ2FsbGVyO1wiLCBIb21lID0+IFwkU2VsZi0+e0hvbWV9KTtcbiI7CiAgICAgICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIn0gICAgICAgICAgICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAiZWxzZSB7ICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJCiAgICAgICAgICAgICAgICAiICAgIFwkQ29uZmlnTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJcJFdoYXQ7RmFsc2U7XCRDYWxsZXI7XCIsIEhvbWUgPT4gXCRTZWxmLT57SG9tZX0pO1xuIjsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAifSAgICAgICAgICAgICAgICAgICAgICMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL0tlcm5lbC9Db25maWcvRGVmYXVsdHMucG0nOwoKICAgICMgY2hlY2sgaWYgaXQgaXMgYW4gc3ltbGluaywgYmVjYXVzZSBpdCBjYW4gYmUgZGV2ZWxvcG1lbnQgc3lzdGVtIHdoaWNoIHVzZSBzeW1saW5rcwogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAiQ2FuJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEiOwogICAgfQoKICAgICMgdG8gdXNlIFRyYW5zbGF0aW9uRGVidWdnZXIgSSBoYXZlIHRvIG1hbmlwdWxhdGUgdGhlIExhbmd1YWdlLnBtIGZpbGUKICAgICMgaGVyZSBJIHVuZG8gbXkgbWFuaXB1bGF0aW9uCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKCiAgICBteSAlUmVtb3ZlTGluZSA9ICgKICAgICAgICAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAidXNlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpDb25maWdMb2c7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAibXkgXCRDb25maWdMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RnJlZDo6Q29uZmlnTG9nLT5uZXcoKTtcbiIgPT4gMSwKICAgICAgICAibXkgXCRDYWxsZXIgPSBjYWxsZXIoKTtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAiaWYgKFwkU2VsZi0+e1wkV2hhdH0pIHsgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiIgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAiICAgIFwkQ29uZmlnTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJcJFdoYXQ7VHJ1ZTtcJENhbGxlcjtcIiwgSG9tZSA9PiBcJFNlbGYtPntIb21lfSk7XG4iCiAgICAgICAgICAgID0+IDEsCiAgICAgICAgIn0gICAgICAgICAgICAgICAgICAgICAjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIiA9PiAxLAogICAgICAgICJlbHNlIHsgICAgICAgICAgICAgICAgIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiIgPT4gMSwKICAgICAgICAiICAgIFwkQ29uZmlnTG9nT2JqZWN0LT5JbnNlcnRXb3JkKFdoYXQgPT4gXCJcJFdoYXQ7RmFsc2U7XCRDYWxsZXI7XCIsIEhvbWUgPT4gXCRTZWxmLT57SG9tZX0pO1xuIgogICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIGlmICggISRSZW1vdmVMaW5leyRMaW5lfSApIHsKICAgICAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEluc2VydFdvcmQoKQoKU2F2ZSBhIHdvcmQgaW4gdGhlIHRyYW5zbGF0aW9uIGRlYnVnIGxvZwoKICAgICRCYWNrZW5kT2JqZWN0LT5JbnNlcnRXb3JkKAogICAgICAgIFdoYXQgPT4gJ2Egd29yZCcsCiAgICApOwoKPWN1dAoKc3ViIEluc2VydFdvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17SG9tZX0gKSB7CiAgICAgICAgJFBhcmFte0hvbWV9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIH0KCiAgICAjIHNhdmUgdGhlIHdvcmQgaW4gbG9nIGZpbGUKICAgIG15ICRGaWxlID0gJFBhcmFte0hvbWV9IC4gJy92YXIvZnJlZC9Db25maWcubG9nJzsKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc+PicsICRGaWxlIHx8IGRpZSAiQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlICRQYXJhbXtXaGF0fSAuICJcbiI7CiAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTIgJCAkRGF0ZTogMjAwOS8wNC8yMSAxMDo1NDozNyAkCgo9Y3V0Cg==