<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
  <name>FrontEndUsers</name>
  <version>0.1.6</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyBtYW5hZ2VtZW50IGFuZCBhZG1pbmlzdHJhdGlvbiBvZiBmcm9udCBlbmQgdXNlcnMgPGk+KHVzZXJzIHdobyBoYXZlIG5vIGFkbWluIGFjY2Vzc3MpPC9pPi4gIEl0IGFsbG93cyBjcmVhdGlvbiBvZiB1c2VyIGdyb3VwcywgYW5kIHVzZXIgYWNjb3VudHMgYW5kIGFsbG93cyB1c2VycyB0byBsb2dpbiBhbmQgbG9nb3V0LiAgaXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ3VzdG9tQ29udGVudCBtb2R1bGUgdG8gZGlzcGxheSBkaWZmZXJlbnQgY29udGVudCB0byBkaWZmZXJlbnQgdXNlcnMgb25jZSB0aGV5IGhhdmUgbG9nZ2VkIGluPC9wPgo8aDM+RmVhdHVyZXM8L2gzPgo8dWw+CjxsaT48cD5Vc2VyIGFjY291bnQgZXhwaXJhdGlvbi4gIFlvdSBjYW4gY3JlYXRlIHRlbXBvcmFyeSB1c2VyczwvcD48L2xpPgo8bGk+PHA+R3JvdXAgUHJvcGVydGllcy4gIFlvdSBjYW4gYXNrIGZvciBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIG9mIGRpZmZlcmVudCBncm91cHM8L3A+PC9saT4KPGxpPjxwPkNhcGFibGUgb2YgaGFuZGxpbmcgaHVuZHJlZHMgb2YgdXNlcnM8L3A+PC9saT4KPGxpPjxwPkhhcyBhbiBleHRlbnNpdmUgQVBJIGZvciBhZGRpbmcgZnVuY3Rpb25hbGl0eTwvcD48L2xpPgo8L3VsPgo8aDM+SG93IGRvIEkgdXNlIGl0PC9oMz4KPHVsPgo8bGk+PHA+QWZ0ZXIgaW5zdGFsbGF0aW9uIHlvdSBjYW4gYWNjZXNzIGFkbWluIHBhbmVsIHRvIHRoZSBGcm9udEVuZFVzZXJzIG1vZHVsZSB1bmRlciB0aGUgJnF1b3Q7VXNlcnMgJiBnR3JvdXBzJnF1b3Q7IG1lbnUuPC9wPjwvbGk+CjxsaT4KPHA+U2Vjb25kbHksIHlvdSBzaG91bGQgZGVmaW5lIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIGFyZSBlc3NlbnRpYWxseSBmaWVsZCBkZWZpbml0aW9ucywgaGVyZSB5b3Ugc3BlY2lmeSB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiB5b3Ugd2FudCB0byBnYXRoZXIsIGFuZCBsaW1pdHMuIGkuZTogIE5hbWUsIEFnZSwgQ2l0eSwgU3RhdGUsIENvdW50cnksIEVtYWlsIGFkZHJlc3MsIGV0Yy48L3A+CjxwPjxiPk5vdGU6PC9iPiBZb3UgZG8gbm90IG5lZWQgdG8gZGVmaW5lIHByb3BlcnRpZXMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgdGhlc2Ugd2lsbCBiZSBwcm92aWRlZCBmb3IgeW91PC9iPgo8L2xpPgo8bGk+PHA+TmV4dCB5b3Ugc2hvdWxkIGNyZWF0ZSBvbmUgb3IgbW9yZSB1c2VyIGdyb3Vwcy4gIFdoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCB5b3UgYXJlIGFza2VkIGZvciBhIGdyb3VwIG5hbWUsIGEgZGVzY3JpcHRpb24gYW5kIHRvIGFzc29jaWF0ZSBwcm9wZXJ0aWVzIHdpdGggdGhhdCBncm91cCwgc3BlY2lmeSB0aGUgcHJvcGVydGllcyBzb3J0IG9yZGVyLCBhbmQgd2V0aGVyIGl0IGlzIGFuIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgaGlkZGVuIGZpZWxkIDxpPihvZmYgaXMgYWxzbyB2YWxpZCk8L2k+PC9wPjwvbGk+CjxsaT48cD48Yj5Ob3RlOjwvYj4gQmVmb3JlIHByb2NlZWRpbmcsIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGFyZSBzZXQgY29ycmVjdGx5LjwvcD48L2xpPgo8bGk+PHA+VGhpcmRseSB5b3Ugc2hvdWxkIGNyZWF0ZSBzb21lIHVzZXJzLiAgQWRkaW5nIHVzZXJzIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gIFdoZW4gY3JlYXRpbmcgYSB1c2VyIHlvdSBhcmUgYXNrZWQgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBhbiBleHBpcnkgZGF0ZSBmb3IgdGhhdCB1c2VyLiAgWW91IHRoZW4gbXVzdCBzZWxlY3QgdGhlIGdyb3VwcyB0aGF0IHRoYXQgdXNlciBpcyBhIG1lbWJlciBvZiwgYW5kIGNsaWNrIFwnTmV4dFwnPC9wPgo8cD48ZW0+Tm90ZTogPC9lbT5UaGlzIGlzIGEgbGFib3VyIGludGVuc2l2ZSBhbmQgYm9yaW5nIHByb2Nlc3MsIGl0IGlzIGVhc2llciB0byBsZXQgdXNlcnMgcmVnaXN0ZXIgdGhlbXNlbHZlcywgYW5kIHRoZW4geW91IGNhbiBlZGl0IHRoZWlyIGdyb3VwIGluZm9ybWF0aW9uLiAgYnV0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBwbGVhc2UgY3JlYXRlIGF0IGxlc3Qgb25lIHVzZXI8L3A+PC9saT4KPGxpPjxwPkxhc3RseSwgYWZ0ZXIgdGhlIHN5c3RlbSBoYXMgZGV0ZXJtaW5lZCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyB0byBiZSBwcmVzZW50ZWQgZm9yIHRoYXQgdXNlciwgeW91IGFyZSBwcmVzZW50ZWQgd2l0aCBhIGZvcm0gYXNraW5nIGZvciBhbGwgb2YgdGhlIHJlcXVpcmVkIHVzZXIgaW5mb3JtYXRpb24uICBDb21wbGV0ZSB0aGlzIGZvcm0gdG8gY29tcGxldGUgdGhlIHVzZXIgYWRkaXRpb248L3A+PC9saT4KPGxpPjxwPllvdSBhcmUgbm93IHJlYWR5IHRvIGFkZCB0aGUgZnJvbnQgZW5kIGZ1bmN0aW9uYWxpdHkgdG8geW91ciBzaXRlLiAgVGhpcyBpcyBhcyBzaW1wbGUgYXMgYWRkaW5nIHRoZSB7Y21zX21vZHVsZSBtb2R1bGU9RnJvbnRFbmRVc2Vyc30gdGFnIHRvIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZTwvcD48L2xpPgo8L3VsPgo8aDM+U3VwcG9ydDwvaDM+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4KPHVsPgo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IGNhbGd1eVwncwptb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0iaHR0cDovL3RlY2hjb20uZHluZG5zLm9yZyI+dGVjaGNvbS5keW5kbnMub3JnPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+UGFyYW1ldGVyczwvaDM+Cjx1bD4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZm9ybT0ibmFtZSI8L2xpPgo8cD5Gb3JtczoKPHVsPgogPGxpPjxlbT5sb2dpbjwvZW0+IC0gRGlzcGxheSB0aGUgbG9naW4gZm9ybTwvbGk+CiA8bGk+PGVtPmxvZ291dDwvZW0+IC0gRGlzcGxheSB0aGUgbG9nb3V0IGZvcm08L2xpPgogPGxpPjxlbT5jaGFuZ2VzZXR0aW5nczwvZW0+IC0gRGlzcGxheSB0aGUgY2hhbmdlIHNldHRpbmdzIGZvcm08L2xpPgogPGxpPjxlbT5mb3Jnb3RwdzwvZW0+IC0gRGlzcGxheSB0aGUgZm9yZ290IHBhc3N3b3JkIGZvcm08L2xpPgo8L3VsPgo8L3A+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHJldHVybnRvPSJwYWdlIjwvbGk+CjxwPlVzZWQgd2l0aCB0aGUgbG9naW4sIGxvZ291dCwgYW5kIGNoYW5nZXNldHRpbmdzIGZvcm1zLCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgcGFnZSBpZCBvciBhbGlhcyBvZiBhIHBhZ2UgdG8gcmVkaXJlY3QgdG8sIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZDwvcD4KPC91bD4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0Cm9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPlJlcXVpcmVtZW50czwvaDM+CjxwPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHksIHRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoZSBDTVNNYWlsZXIgbW9kdWxlIHRvIGJlIHByZXZpb3VzbHkgaW5zdGFsbGVkPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+Q01TTWFpbGVyID0mZ3Q7IDEuNzMuMzwvbGk+PC91bD48aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48L3VsPg==</help>
  <about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDAuMS42PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+MC4wLjEgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCBOUlBUIChOb3QgUmVhZHkgZm9yIFByaW1lIFRpbWUpIHJlbGVhc2U8L2xpPgo8bGk+MC4xLjAgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCByZWxlYXNlPC9saT4KPGxpPjAuMS4xIC0gT2N0b2JlciwgMjAwNSAtIEZpeGVkIGlzc3VlcyB3aXRoIHByb3BlcnRpZXM8L2xpPgo8bGk+MC4xLjIgLSBPY3RvYmVyLCAyMDA1IC0gQWRkZWQgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHk8L2xpPgo8bGk+PHA+MC4xLjMgLSBOb3ZlbWJlciwgMjAwNTwvcD4KICAgIDxwPkFkZGVkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSByZWRpcmVjdCBwYWdlIG9uIGxvZ2luLCBsb2dvdXQsIGZvcmdvdCBwYXNzd29yZCwgYW5kIGNoYW5nZSBzZXR0aW5ncywgYW5kIGFkZGVkIHRoZSByZXR1cm50byBhbmQgZm9ybSBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIHNpZGUgb2YgdGhpbmdzLCBhbHNvIGRpZCBhIGNvdXBsZSBsZiBsaXR0bGUgY2xlYW51cHMuICBUaGlzIHZlcnNpb24gcmVxdWlyZXMgdjAuMTEgYW5kIGFib3ZlIGZvciBjZXJ0YWluLjwvcD48L2xpPgo8bGk+MC4xLjQgLSBOb3ZlbWJlciwgMjAwNSAtIFZlcnkgbWlub3IgY2hhbmdlIHdpdGggcmVzcGVjdCB0byBhIGZvcmdvdHRlbiBhbmQgbm8gbG9uZ2VyIG5lZWRlZCBmdW5jdGlvbiBjYWxsPC9saT4KPGxpPjxwPjAuMS41IC0gTm92ZW1iZXIsIDIwMDU8L3A+CiAgICA8cD5Bbm90aGVyIHZlcnkgbWlub3IgY2hhbmdlLCBhZGRlZCBzb21lIHRleHQgdG8gdGhlIFBvc3RJbnN0YWxsIG1lc3NhZ2UuPC9wPjwvbGk+CjxsaT48cD4wLjEuNiAtIEphbnVhcnksIDIwMDY8cD4KICAgIDxwPkNoYW5nZXMgdG8gdGhlIHBlcm1pc3Npb24gbW9kZWwsIGFuZCBtaW5vciBidWcgZml4ZXMgdG8gdGhlIHByZWZlcmVuY2VzLiAgQWxzbyBzb21lIHBocDUgZml4ZXMgYnV0IEkgYW0gc3VyZSB0aGF0IHRoZXJlIGFyZSBtb3JlIG91dCB0aGVyZS48L3A+PC9saT4KPC91bD48YnIgLz4=</about>
  <requires>
    <requiredname>CMSMailer</requiredname>
    <requiredversion>1.73.3</requiredversion>
  </requires>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/FrontEndUsers.api.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKcmVxdWlyZV9vbmNlKCAiVXNlck1hbmlwdWxhdG9yLmNsYXNzLnBocCIgKTsKCmNsYXNzIEZyb250RW5kVXNlcnNNYW5pcHVsYXRvciBleHRlbmRzIFVzZXJNYW5pcHVsYXRvcgp7CiAgZnVuY3Rpb24gQ291bnRUZW1wQ29kZVJlY29yZHMoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREQigpOwogICAgJHEgPSAiU0VMRUNUIENPVU5UKCopIEFTIGNvdW50IEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvd1snY291bnQnXTsKICB9CgogIGZ1bmN0aW9uIEV4cGlyZVRlbXBDb2RlcygkZXhwaXJ5Y29kZSkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRleHBpcmVzID0gc3RydG90aW1lKCAkZXhwaXJ5Y29kZSApOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSBjcmVhdGVkID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGV4cGlyZXMgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsgICAgCiAgfQoKICBmdW5jdGlvbiBSZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkpOwogICAgaWYoICRkYnJlc3VsdCA9PSBGQUxTRSB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuIGFycmF5KFRSVUUsJHJvdyk7CiAgfQoKCiAgZnVuY3Rpb24gU2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUKICAgICAgICAgIFZBTFVFUyg/LD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRjb2RlLAoJCQkJCSAkZGItPkRCVGltZVN0YW1wKHRpbWUoKSkpICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBTZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5nZXREYigpOwogICAgCiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBTRVQgbmFtZSA9ID8sIHByb21wdCA9ID8sIHR5cGUgPSA/LCBsZW5ndGggPSA/IAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuZXduYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG5hbWUgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZuKCAkbmFtZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBXSEVSRSBuYW1lPT8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8gT1JERVIgQlkgc29ydF9rZXkgREVTQyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHRpdGxlICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIGZ1bmN0aW9uIElzQWNjb3VudEV4cGlyZWQoICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCBleHBpcmVzID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCwgCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAodGltZSgpKSApICk7CiAgICBpZiggJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA9PSAxICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdycGlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFdIRVJFIGdyb3VwX2lkID0gPyBPUkRFUiBCWSBzb3J0X2tleSBERVNDIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZ3JwaWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJYXJyYXlfcHVzaCggJHJlc3VsdCwgJHJvdyApOwogICAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgoKICBmdW5jdGlvbiBBZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lLCAkc29ydGtleSwgJHZhbCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcAogICAgICAgICAgVkFMVUVTKD8sPyw/LD8pIjsgCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHByb3BuYW1lLCAkZ3JwaWQsICRzb3J0a2V5LCAkdmFsICkpOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUpOwogIH0KCgogIGZ1bmN0aW9uIERlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFdIRVJFIGdyb3VwX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGdycGlkICkpOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUpOwogIH0KCgogIGZ1bmN0aW9uIERlbGV0ZUdyb3VwUHJvcGVydHlSZWxhdGlvbiggJGdycGlkLCAkcHJvcG5hbWUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IEFORCBncm91cF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwcm9wbmFtZSwgJGdycGlkICkpOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUpOwogIH0KCgogIGZ1bmN0aW9uIEFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4KICAgICAgICAgIFZBTFVFUyAoPyw/LD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCApKTs7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCAkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZucygpCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gR2V0UHJvcGVydHlEZWZuKCAkbmFtZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBXSEVSRSBuYW1lID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJG5hbWUgKSApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAkcm93ICkKICAgICAgewoJcmV0dXJuICRyb3c7CiAgICAgIH0KICAgIGVsc2UKICAgICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgZnVuY3Rpb24gR2V0UHJvcGVydHlEZWZucygpCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICRyZXQgPSBhcnJheSgpOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkcmV0LCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkcmV0OwogIH0KCiAgCiAgZnVuY3Rpb24gTG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkKICB7CiAgICBpZiggISR0aGlzLT5DaGVja1Bhc3N3b3JkKCAkdXNlcm5hbWUsICRwYXNzd29yZCApICkKICAgICAgewoJJG1vZCA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKCXJldHVybiBhcnJheShGQUxTRSwkbW9kLT5MYW5nKCdlcnJvcl9sb2dpbmZhaWxlZCcpKTsKICAgICAgfQoKICAgICR1aWQgPSAkdGhpcy0+R2V0VXNlcklEKCAkdXNlcm5hbWUgKTsKCiAgICBpZiggJHRoaXMtPklzQWNjb3VudEV4cGlyZWQoICR1aWQgKSApCiAgICAgIHsKCSRtb2QgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsJG1vZC0+TGFuZygnZXJyb3JfYWNjb3VudGV4cGlyZWQnKSk7CiAgICAgIH0KCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBWQUxVRVMgKD8sPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggc2Vzc2lvbl9pZCgpLCB0aW1lKCksICR1aWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsICRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBGZXVzZXJzTWFuaXB1bGF0b3IoICR0aGVfbW9kdWxlICkKICB7CiAgICBwYXJlbnQ6OlVzZXJNYW5pcHVsYXRvciggJHRoZV9tb2R1bGUgKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmF1c2UKICBmdW5jdGlvbiBDaGVja0dyb3VwUGVybWlzc2lvbiggJGdpZCwgJHBlcm0gKQogIHsKICAgIC8vIHdlIGFsd2F5cyBoYXZlIHRvIHJldHVybiBmYWxzZSB1c2luZyB0aGlzIG1lY2hhbmlzbSAKICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGRpZmZlcmVudCB0YWJsZXMgdGhhbiB3aXNoeSBpcyB1c2luZyBmb3IgCiAgICAvLyB1c2VycyBhbmQgZ3JvdXBzCiAgICByZXR1cm4gZmFsc2U7Ci8vICAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAovLyAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4icGVybWlzc2lvbnMgV0hFUkUgcGVybWlzc2lvbl9uYW1lID0gPyI7Ci8vICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHBlcm0gKSApOwovLyAgICAgaWYoICEkZGJyZXN1bHQgfHwgJGRicmVzdWx0LT5Sb3dDb3VudCgpID09IDAgKSByZXR1cm4gZmFsc2U7CgovLyAgICAgJHByb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7Ci8vICAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJncm91cF9wZXJtcyBXSEVSRSBwZXJtaXNzaW9uX2lkID0gPwovLyAgICAgICAgICAgQU5EIGdyb3VwX2lkID0gPyI7Ci8vICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHByb3dbJ3Blcm1pc3Npb25faWQnXSwgJGdpZCApICk7Ci8vICAgICBpZiggISRkYnJlc3VsdCB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApIHJldHVybiBmYWxzZTsKCi8vICAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gQ2hlY2tVc2VyUGVybWlzc2lvbiggJHBlcm0gKQogIHsKICAgICR1aWQgPSAkdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYoICRpZCA9PSBmYWxzZSApIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gQ2hlY2tVc2VyUGVybWlzc2lvbkJ5VWlkKCAkdWlkLCAkcGVybSApOwogIH0KCgogIGZ1bmN0aW9uIENoZWNrVXNlclBlcm1pc3Npb25CeVVpZCggJHVpZCwgJHBlcm0gKQogIHsKICAgIC8vIHdlIGFsd2F5cyBoYXZlIHRvIHJldHVybiBmYWxzZSB1c2luZyB0aGlzIG1lY2hhbmlzbSAKICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGRpZmZlcmVudCB0YWJsZXMgdGhhbiB3aXNoeSBpcyB1c2luZyBmb3IgCiAgICAvLyB1c2VycyBhbmQgZ3JvdXBzCiAgICByZXR1cm4gZmFsc2U7Ci8vICAgICAvLyBpZiB0aGUgdXNlciBiZWxvbmdzIHRvIGEgZ3JvdXAgdGhhdCBoYXMgdGhlIHBlcm1pc3Npb24sIHdlJ3JlIGxhdWdoaW5nCi8vICAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkdWlkICk7Ci8vICAgICBpZiggJGdyb3VwcyA9PSBmYWxzZSApIHJldHVybiBmYWxzZTsKICAgIAovLyAgICAgJGRiID0gJHRoaXMtPkdldERiKCk7Ci8vICAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJwZXJtaXNzaW9ucyBXSEVSRSBwZXJtaXNzaW9uX25hbWUgPSA/IjsKLy8gICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkcGVybSApICk7Ci8vICAgICBpZiggISRkYnJlc3VsdCB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApIHJldHVybiBmYWxzZTsKLy8gICAgICRwcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwoKLy8gICAgIGZvcmVhY2goICRncm91cHMgYXMgJGdyb3VwICkKLy8gICAgIHsKLy8gICAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iZ3JvdXBfcGVybXMgV0hFUkUgcGVybWlzc2lvbl9pZCA9ID8KLy8gICAgICAgICAgIEFORCBncm91cF9pZCA9ID8iOwovLyAgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHByb3dbJ3Blcm1pc3Npb25faWQnXSwgJGdpZCApICk7Ci8vICAgICAgIGlmKCAkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpID4gMCApIHJldHVybiB0cnVlOyAgICAgIAovLyAgICAgfQoKLy8gICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gQXNzaWduVXNlclRvR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIC8vIHZhbGlkYXRlIHRoZSB1c2VyIGlkCiAgICBpZiggISR0aGlzLT5Vc2VyRXhpc3RzQnlJRCggJHVpZCApICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAKICAgIC8vIHZhbGlkYXRlIHRoZSBncm91cCBpZAogICAgaWYoICEkdGhpcy0+R3JvdXBFeGlzdHNCeUlEKCAkZ2lkICkgKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIAogICAgLy8gYWRkIHRoZSByZWNvcmQgdG8gdGhlIHRhYmxlIHRvIG1ha2UgdGhpcyAKICAgIC8vIHVzZXIgYSBtZW1iZXIgb2YgdGhpcyBncm91cAogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyAKICAgICAgICAgICAgICAgIFZBTFVFUyAoPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCwgJGdpZCApICk7CiAgICByZXR1cm4oICRkYnJlc3VsdCAhPSBmYWxzZSApOwogIH0KCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIElzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICkKICB7CiAgICAvLyBhIHBhc3N3b3JkIGlzIHZhbGlkLCBpZiBpdCdzIGxlbmd0aCBpcwogICAgLy8gd2l0aGluIGNlcnRhaW4gcmFuZ2VzCiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJG1pbmxlbiA9ICRtb2R1bGUtPkdldFByZWZlcmVuY2UoJ21pbl9wYXNzd29yZGxlbmd0aCcsIDYgKTsKICAgICRtYXhsZW4gPSAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnLCAyMCApOwogICAgJGxlbiA9IHN0cmxlbigkcGFzc3dvcmQpOwogICAgaWYoICRsZW4gPCAkbWlubGVuICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICBlbHNlIGlmKCAkbGVuID4gJG1heGxlbiApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgCiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheQogIGZ1bmN0aW9uIERlbGV0ZVVzZXJGdWxsKCAkaWQgKQogIHsKICAgIC8vIGxvZyB0aGUgdXNlciBvdXQKICAgICR0aGlzLT5Mb2dvdXRVc2VyKCAkaWQgKTsKCiAgICAvLyBkZWxldGUgdXNlciBwcm9wZXJ0aWVzCiAgICAkdGhpcy0+RGVsZXRlQWxsVXNlclByb3BlcnRpZXNGdWxsKCAkaWQgKTsKCiAgICAvLyBkZWxldGUgdXNlciBmcm9tIGdyb3VwcwogICAgJHJldCA9ICR0aGlzLT5SZW1vdmVVc2VyRnJvbUdyb3VwKCAkaWQsICcnICk7CiAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiAkcmV0OwogICAgICB9CgogICAgLy8gZGVsZXRlIHVzZXIgcmVjb3JkCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFPCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQoKICAgIC8vIGFuZCBkZWxldGUgYW55dGhpbmcgZnJvbSB0aGUgdGVtcGNvZGVzIHRhYmxlIHRvbwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFPCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgCiAgICByZXR1cm4gYXJyYXkoIFRSVUUsICIiICk7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICBmdW5jdGlvbiBHZXRHcm91cEluZm8oICRnaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGdpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuICRyb3c7CiAgfQogIAogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFuIGFycmF5CiAgLy8gc2Vjb25kIGVsZW1lbnQgb2YgYXJyYXkgbWF5IGJlIGFuIGFycmF5CiAgZnVuY3Rpb24gR2V0VXNlckluZm8oICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMKICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAkcm93ICk7CiAgfQogIAoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheSBvciBmYWxzZQogIGZ1bmN0aW9uIEdldFVzZXJzSW5Hcm91cCggJGdyb3VwaWQgPSAnJyApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAnJzsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggJGdyb3VwaWQgPT0gJycgfHwgJGdyb3VwaWQgPCAwICkKICAgICAgewoJJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiOyAKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMsIi4KCSAgY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIGlkPXVzZXJpZCBBTkQgZ3JvdXBpZCA9ID8iOwoJJHBhcm1zID0gYXJyYXkoICRncm91cGlkICk7CiAgICAgIH0KCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCAkcGFybXMgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCiAgICAgIHsKCWFycmF5X3B1c2goICRyZXN1bHQsICRyb3cgKTsKICAgICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gR3JvdXBFeGlzdHNCeUlEKCAkZ2lkICkKICB7CiAgICAkZGF0YSA9ICR0aGlzLT5HZXRHcm91cEluZm8oICRnaWQgKTsKICAgIHJldHVybiggJGRhdGEgIT0gZmFsc2UgKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gR3JvdXBFeGlzdHNCeU5hbWUoICRuYW1lICkKICB7CiAgICAkZ2lkID0gJHRoaXMtPkdldEdyb3VwSUQoICRuYW1lICk7CiAgICByZXR1cm4oICRnaWQgIT0gZmFsc2UgKTsKICB9CiAgCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYXJyYXkKICBmdW5jdGlvbiBJc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgPSBmYWxzZSApCiAgewogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgaWYoICFlcmVnaSgiXltfYS16MC05LV0rKFwuW19hLXowLTktXSspKkBbYS16MC05LV0rKFwuW2EtejAtOS1dKykqKFwuW2Etel17MiwzfSkkIiwgJGVtYWlsICkgKQogICAgICB7CgkkcmVzdWx0WzBdID0gZmFsc2U7CgkkcmVzdWx0WzFdID0gJG1vZHVsZS0+TGFuZygnZXJyb3JfaW1wcm9wZXJlbWFpbGZvcm1hdCcpOwoJcmV0dXJuICRyZXN1bHQ7CiAgICAgIH0KICAgIAogICAgaWYoICRzbXRwdmFsaWRhdGUgPT0gZmFsc2UgKQogICAgICB7CgkkcmVzdWx0WzBdID0gdHJ1ZTsKCXJldHVybiAkcmVzdWx0OwogICAgICB9CiAgICAKICAgIC8vIGdvIGFoZWFkIGFuZCB2YWxpZGF0ZSB0aGUgZW1haWwgYWRkcmVzcyBmdXJ0aGVyCiAgICBsaXN0ICggJHVuYW1lLCAkZG9tYWluICkgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKICAgIGlmKCBnZXRteHJyKCRkb21haW4sICRteGhvc3QgKSApCiAgICAgIHsKCSRjb25uZWN0YWRkcmVzcyA9ICRteGhvc3RbMF07CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSRjb25uZWN0YWRkcmVzcyA9ICRkb21haW47CiAgICAgIH0KICAgICRjb25uZWN0ID0gZnNvY2tvcGVuKCAkY29ubmVjdGFkZHJlc3MsIDI1ICk7CiAgICBpZiggJGNvbm5lY3QgKQogICAgICB7CglpZiggZXJlZygnXjIyMCcsICRvdXQgPSBmZ2V0cyggJGNvbm5lY3QsIDEwMjQgKSApICkKCSAgewoJICAgIGZwdXRzKCAkY29ubmVjdCwgIkhFTE8gJEhUVFBfSE9TVFxyXG4iKTsKCSAgICAkb3V0ID0gZmdldHMoICRjb25uZWN0LCAxMDI0ICk7CgkgICAgZnB1dHMoICRjb25uZWN0LCAiTUFJTCBGUk9NIDx7JGVtYWlsfT5cclxuIik7CgkgICAgJGZyb20gPSBmZ2V0cyggJGNvbm5lY3QsIDEwMjQgKTsKCSAgICBmcHV0cyggJGNvbm5lY3QsICJSQ1BUIFRPOiA8eyRlbWFpbH0+XHJcbiIpOwoJICAgICR0byA9IGZnZXRzKCAkY29ubmVjdC4gMTAyNCApOwoJICAgIGZwdXRzKCAkY29ubmVjdCwgIlFVSVRcclxuIik7CgkgICAgZmNsb3NlKCAkY29ubmVjdCApOwoJICAgIGlmKCAhZXJlZyggIl4yNTAiLCAkZnJvbSApIHx8ICFlcmVnKCJeMjUwIiwgJHRvKSkKCSAgICAgIHsKCQkkcmVzdWx0WzBdID0gZmFsc2U7CgkJJHJlc3VsdFsxXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9zZXJ2ZXJyZWplY3RlZGVtYWlsJyk7CgkJcmV0dXJuICRyZXN1bHQ7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCSRyZXN1bHRbMF0gPSBmYWxzZTsKCQkkcmVzdWx0WzFdID0gJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVzcG9uc2Vmcm9tc2VydmVyJyk7CgkJcmV0dXJuICRyZXN1bHQ7CgkgICAgICB9CgkgIH0KCWVsc2UgCgkgIHsKCSAgICAkcmVzdWx0WzBdID0gZmFsc2U7CgkgICAgJHJlc3VsdFsxXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Jlc3BvbnNlZnJvbXNlcnZlcicpOwoJICAgIHJldHVybiAkcmVzdWx0OwoJICB9CiAgICAgIH0KICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBJc1ZhbGlkVXNlcm5hbWUoICR1c2VybmFtZSApCiAgewogICAgLy8gYSB1c2VybmFtZSBpcyB2YWxpZCwgaWYgaXQncyBsZW5ndGggaXMKICAgIC8vIHdpdGhpbiBjZXJ0YWluIHJhbmdlcywgYW5kIGl0IGNvbnRhaW5zCiAgICAvLyBvbmx5IGFscGhhbnVtZXJpY3MKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CiAgICAkbWlubGVuID0gJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJywgNCApOwogICAgJG1heGxlbiA9ICRtb2R1bGUtPkdldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcsIDIwICk7CiAgICBpZiggc3RybGVuKCAkdXNlcm5hbWUgKSA8ICRtaW5sZW4gfHwgc3RybGVuKCAkdXNlcm5hbWUgKSA+ICRtYXhsZW4gKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICBpZiggIXByZWdfbWF0Y2goICcvXlthLXpBLVowLTlfLV0qJC8nLCAkdXNlcm5hbWUgKSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICBmdW5jdGlvbiBSZW1vdmVVc2VyRnJvbUdyb3VwKCAkdWlkLCAkZ2lkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRwYXJtcyA9IGFycmF5KCAkdWlkICk7CiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncwogICAgICAgICAgV0hFUkUgdXNlcmlkID0gPyI7CiAgICBpZiggJGdpZCAhPSAnJyApCiAgICAgIHsKCSRxIC49ICIgQU5EIGdyb3VwaWQgPSA/IjsKCWFycmF5X3B1c2goICRwYXJtcywgJGdpZCApOwogICAgICB9CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCAkcGFybXMgKTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CglyZXR1cm4gYXJyYXkoIFRSVUUgKTsKICAgICAgfQogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFycmF5CiAgZnVuY3Rpb24gU2V0R3JvdXAoICRpZCwgJG5hbWUsICRkZXNjICkKICB7CiAgICBpZiggIWlzc2V0KCAkbmFtZSApIHx8ICRuYW1lID09ICcnICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRlaWQgPSAkdGhpcy0+R2V0R3JvdXBJRCggJG5hbWUgKTsKICAgIGlmKCAkZWlkICE9IGZhbHNlICYmICRlaWQgIT0gJGlkICkKICAgICAgewoJJG1vZCA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKCXJldHVybiBhcnJheShGQUxTRSwkbW9kLT5MYW5nKCdlcnJvcl9ncm91cG5hbWVfZXhpc3RzJykpOwogICAgICB9CiAgICAKICAgICRxID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFNFVAogICAgICAgICAgICAgICAgZ3JvdXBuYW1lID0gPywgZ3JvdXBkZXNjID0gPyBXSEVSRSBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lLCAkZGVzYywgJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheSggVFJVRSwgJycpOwogIH0KCgogIGZ1bmN0aW9uIFNldFVzZXJQYXNzd29yZCggJHVpZCwgJHBhc3N3b3JkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMKICAgICAgICAgIFNFVCBwYXNzd29yZCA9ID8gV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCBtZDUoJHBhc3N3b3JkKSwgJHVpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFLCIiKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhcnJheQogIGZ1bmN0aW9uIFNldFVzZXIoICR1aWQsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcykKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhpcyB1c2VyIGV4aXN0cwogICAgJHJldCA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl91c2Vybm90Zm91bmQnKSk7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGlzIHVzZXJuYW1lIGlzIG5vdCB0YWtlbiBieSBzb21lIG90aGVyIGlkCiAgICAkbnVpZCA9ICR0aGlzLT5HZXRVc2VySUQoJHVzZXJuYW1lKTsKICAgIGlmKCAkbnVpZCAhPSBmYWxzZSAmJiAkbnVpZCAhPSAkdWlkICkKICAgICAgewoJJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKCXJldHVybiBhcnJheShGQUxTRSwgJG1vZHVsZS0+TGFuZygnZXJyb3JfdXNlcm5hbWV0YWtlbicsJHVpZCkpOwogICAgICB9CgogICAgJGRicmVzdWx0ID0gJyc7CiAgICBpZiggdHJpbSggJHBhc3N3b3JkICkgPT0gJycgKQogICAgICB7CgkvLyB1cGRhdGUgdGhlIHJlY29yZAoJJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBTRVQKICAgICAgICAgdXNlcm5hbWUgPSA/LCBleHBpcmVzID0gPwogICAgICAgICBXSEVSRSBpZCA9ID8iOwoJCgkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVzZXJuYW1lLCAKCQkJCQkgICAgICRkYi0+REJUaW1lU3RhbXAoJGV4cGlyZXMpLCAkdWlkICkpOwogICAgICB9CiAgICBlbHNlIAogICAgICB7CgkvLyB1cGRhdGUgdGhlIHJlY29yZAoJJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBTRVQKICAgICAgICAgdXNlcm5hbWUgPSA/LCBwYXNzd29yZCA9ID8sIGV4cGlyZXMgPSA/CiAgICAgICAgIFdIRVJFIGlkID0gPyI7CgoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1c2VybmFtZSwgbWQ1KCRwYXNzd29yZCksCgkJCQkJICAgICAkZGItPkRCVGltZVN0YW1wKCRleHBpcmVzKSwgJHVpZCApKTsKICAgICAgfQoKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAiIiApOwogIH0KCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIFNldFVzZXJHcm91cHMoICR1aWQsICRncnBpZHMgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGlzIHVzZXIgZXhpc3RzCiAgICAkcmV0ID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwgIlVzZXIgZG9lcyBub3QgZXhpc3QiKTsKICAgICAgfQoKICAgIC8vIHRoZW4gcmVtb3ZlIGFsbCBoaXMgY3VycmVudCBhc3NpZ25tZW50cwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkpOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgICk7CiAgICAgIH0KCiAgICAvLyBhbmQgYWRkIGFsbCBvZiB0aGVtIGluCiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncwogICAgICAgICAgVkFMVUVTICg/LD8pIjsKICAgIGZvcmVhY2goICRncnBpZHMgYXMgJGdycGlkICkKICAgIHsKICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRncnBpZCApICk7CiAgICAgIGlmKCAhJGRicmVzdWx0ICkKCXsKCSAgcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICApOwoJfQogICAgfQogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAiIiApOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBTZXRVc2VyUHJvcGVydGllcyggJHVpZCwgJHByb3BzICkKICB7CiAgICAvLyBEZWxldGUgYWxsIHRoZSB1c2VyIHByb3BlcnRpZXMKICAgIC8vIGFuZCBzZXQgbmV3IG9uZXMKICAgICR0aGlzLT5EZWxldGVVc2VyUHJvcGVydHlGdWxsKCAiIiwgJHVpZCwgdHJ1ZSApOwoKICAgIGZvcmVhY2goICRwcm9wcyBhcyAkcHJvcCApCiAgICB7CiAgICAgIGxpc3QoICRrZXksICR2YWwgKSA9IHNwbGl0KCI9IiwkcHJvcCk7CiAgICAgICR0aGlzLT5TZXRVc2VyUHJvcGVydHkoICRrZXksICR2YWwsICR1aWQgKTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gVXNlckV4aXN0c0J5SUQoICR1aWQgKQogIHsKICAgICRkYXRhID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICByZXR1cm4oICRkYXRhWzBdICE9IGZhbHNlICk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheSBvciBmYWxzZQogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0aWVzKCR1aWQpCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyBXSEVSRSB1c2VyaWQ9PyI7CiAgICAkcD1hcnJheSgkdWlkKTsKICAgICRhcnIgPSBhcnJheSgpOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCiAgICAgIHsKCWFycmF5X3B1c2goICRhcnIsICRyb3cgKTsKICAgICAgfQogICAgcmV0dXJuICRhcnI7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheSBvZiByZWNvcmRzIG9yIGZhbHNlCiAgZnVuY3Rpb24gR2V0TWVtYmVyR3JvdXBzQXJyYXkoJHVzZXJpZCkgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgV0hFUkUgdXNlcmlkPT8iOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSxhcnJheSgkdXNlcmlkKSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcmVzdWx0PWFycmF5KCk7OwogICAgICB3aGlsZSAoJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKCWFycmF5X3B1c2goICRyZXN1bHQsICRyb3cgKTsKICAgICAgfQogICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vCiAgLy8gZW5kIG9mIHJjIGZ1bmN0aW9ucwogIC8vCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHkoJHRpdGxlLCRkZWZhdWx0dmFsdWU9ZmFsc2UpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkPT09ZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAkdGhpcy0+R2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkZGVmYXVsdHZhbHVlKTsKICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsICRkZWZhdWx0dmFsdWU9ZmFsc2UpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0REIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHRpdGxlPT8gQU5EIHVzZXJpZD0/IjsKICAgICRwPWFycmF5KCR0aXRsZSwkdXNlcmlkKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIGlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kcmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1siZGF0YSJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICRkZWZhdWx0dmFsdWU7CiAgICB9CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGF0YSkgCiAgewogICAgJHVzZXJpZD0kdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYgKCR1c2VyaWQ9PT1mYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuICR0aGlzLT5TZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkZGF0YSwkdXNlcmlkKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBTZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkZGF0YSwkdXNlcmlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERCKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyBXSEVSRSB0aXRsZT0/IEFORCB1c2VyaWQ9PyI7CiAgICAkcD1hcnJheSgkdGl0bGUsJHVzZXJpZCk7CiAgICAkcj0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYgKCEkciB8fCAoJHItPk51bVJvd3MoKT09MCkpIHsKICAgICAgJG5ld2lkPSRkYi0+R2VuSUQoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzX3NlcSIpOwogICAgICAkcT0iSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgKGlkLHVzZXJpZCx0aXRsZSxkYXRhKSBWQUxVRVMgKD8sPyw/LD8pIjsKICAgICAgJHA9YXJyYXkoJG5ld2lkLCR1c2VyaWQsJHRpdGxlLCRkYXRhKTsKICAgICAgJHI9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIH0gZWxzZSB7CiAgICAgICRyb3c9JHItPkZldGNoUm93KCk7CiAgICAgICRxPSJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgU0VUIGRhdGE9PyBXSEVSRSBpZD0/IjsKICAgICAgJHA9YXJyYXkoJGRhdGEsJHJvd1siaWQiXSk7CiAgICAgICRyPSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICB9CiAgICByZXR1cm4gKCRyIT1mYWxzZSk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gRGVsZXRlVXNlclByb3BlcnR5KCR0aXRsZSwkYWxsPWZhbHNlKSAKICB7CiAgICAkdXNlcmlkPSR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiAoJHVzZXJpZD09PWZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICAkZGI9JHRoaXMtPkdldERCKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdXNlcmlkPT8iOwogICAgaWYgKCEkYWxsKSAkcS49IiBBTkQgdGl0bGU9PyI7CiAgICAkcD1hcnJheSgpOwogICAgaWYgKCRhbGwpICRwPWFycmF5KCR1c2VyaWQpOyBlbHNlICRwPWFycmF5KCR1c2VyaWQsJHRpdGxlKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIHJldHVybiAoJHJlc3VsdCE9ZmFsc2UpOwogIH0KICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gRGVsZXRlVXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkYWxsPWZhbHNlKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERCKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdXNlcmlkPT8iOwogICAgaWYgKCEkYWxsKSAkcS49IiBBTkQgdGl0bGU9PyI7CiAgICAkcD1hcnJheSgpOwogICAgaWYgKCRhbGwpICRwPWFycmF5KCR1c2VyaWQpOyBlbHNlICRwPWFycmF5KCR1c2VyaWQsJHRpdGxlKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIHJldHVybiAoJHJlc3VsdCE9ZmFsc2UpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzKCkgCiAgewogICAgcmV0dXJuICR0aGlzLT5EZWxldGVVc2VyUHJvcGVydHkoIiIsdHJ1ZSk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gRGVsZXRlQWxsVXNlclByb3BlcnRpZXNGdWxsKCR1c2VyaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5RnVsbCgiIiwkdXNlcmlkLHRydWUpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIENoZWNrUGFzc3dvcmQoJHVzZXJuYW1lLCRwYXNzd29yZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIHVzZXJuYW1lPT8gQU5EIHBhc3N3b3JkPT8iOwogICAgJHA9YXJyYXkoJHVzZXJuYW1lLG1kNSgkcGFzc3dvcmQpKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIGlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nZ2VkSW5OYW1lKCkgCiAgewogICAgJHVzZXJpZD0kdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYgKCR1c2VyaWQhPSIiKSByZXR1cm4gJHRoaXMtPkdldFVzZXJOYW1lKCR1c2VyaWQpOyBlbHNlIHJldHVybiAiIjsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nZ2VkSW5FbWFpbCgpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkIT0iIikgcmV0dXJuICR0aGlzLT5HZXRFbWFpbCgkdXNlcmlkKTsgZWxzZSByZXR1cm4gIiI7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ291dCgpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfbG9nZ2VkaW4gV0hFUkUgc2Vzc2lvbmlkPT8iOwogICAgJHA9YXJyYXkoc2Vzc2lvbl9pZCgpKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dvdXRVc2VyKCR1aWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfbG9nZ2VkaW4gV0hFUkUgdXNlcmlkPT8iOwogICAgJHA9YXJyYXkoJHVpZCk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gRXhwaXJlVXNlcnMoKSAKICB7CiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJGV4cGlyeXRpbWUgPSAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycpOwogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBXSEVSRSBsYXN0dXNlZDw/IjsKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CiAgICAkcD1hcnJheSh0aW1lKCktJGV4cGlyeXRpbWUpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ2dlZEluSWQoKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkdGhpcy0+RXhwaXJlVXNlcnMoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBXSEVSRSBzZXNzaW9uaWQ9PyI7CiAgICAkcD1hcnJheShzZXNzaW9uX2lkKCkpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJ1c2VyaWQiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dnZWRJbigpIAogIHsKICAgIGlmKCAhJHRoaXMtPkxvZ2dlZEluSWQoKSApIAogICAgICB7CglyZXR1cm4gZmFsc2U7IAogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCXJldHVybiB0cnVlOwogICAgICB9CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTWVtYmVyT2ZHcm91cCgkdXNlcmlkLCRncm91cGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iIjsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIHVzZXJpZD0/IEFORCBncm91cGlkPT8iOwogICAgCiAgICAkcGFyYW1zPWFycmF5KCR1c2VyaWQsJGdyb3VwaWQpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtcyk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0VXNlck5hbWUoJHVzZXJpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIGlkPSciLiR1c2VyaWQuIiciOwogICAgCiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1sidXNlcm5hbWUiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEVtYWlsKCR1c2VyaWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSIiOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIGlkPSciLiR1c2VyaWQuIiciOwogICAgCiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1siZW1haWwiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldFVzZXJJRCgkdXNlcm5hbWUpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZT0nIi4kdXNlcm5hbWUuIiciOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImlkIl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFycmF5CiAgZnVuY3Rpb24gQWRkR3JvdXAoICRuYW1lLCAkZGVzY3JpcHRpb24gKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAvLyBzZWUgaWYgaXQgZXhpc3RzIGFscmVhZHkgb3Igbm90IChieSBuYW1lKQogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4KICAgICAgIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBncm91cG5hbWUgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICRyb3cgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJHRoaXMtPkxhbmcoJ2Vycm9yX2dyb3VwbmFtZV9leGlzdHMnKSk7CiAgICAgIH0KICAgIAogICAgJGdycGlkID0gCiAgICAgICRkYi0+R2VuSUQoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzX3NlcSIgKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFZBTFVFUyAoPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZ3JwaWQsICRuYW1lLCAkZGVzY3JpcHRpb24gKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUsJGdycGlkKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhcnJheQogIGZ1bmN0aW9uIEFkZFVzZXIoICRuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgLy8gc2VlIGlmIGl0IGV4aXN0cyBhbHJlYWR5IG9yIG5vdCAoYnkgbmFtZSkKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCiAgICAgICJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggJHJvdyApCiAgICAgIHsKCSRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsJG1vZHVsZS0+TGFuZygnZXJyb3JfdXNlcm5hbWVfZXhpc3RzJykpOwogICAgICB9CiAgICAKICAgIC8vIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZQogICAgJHVpZCA9IAogICAgICAkZGItPkdlbklEKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzX3NlcSIgKTsKCiAgICAvLyBpbnNlcnQgdGhlIHJlY29yZAogICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuCiAgICAgICJtb2R1bGVfZmV1c2Vyc191c2VycyBWQUxVRVMgKD8sPyw/LD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRuYW1lLCBtZDUoJHBhc3N3b3JkKSwgCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAodGltZSgpKSwKCQkJCQkgJGRiLT5EQlRpbWVTdGFtcCgkZXhwaXJlcykgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUsJHVpZCk7CiAgfQogIAogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRHcm91cE5hbWUoJGdyb3VwaWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgaWQ9JyIuJGdyb3VwaWQuIiciOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImdyb3VwbmFtZSJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBEZXNjKCRncm91cGlkKSB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkPSciLiRncm91cGlkLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJncm91cGRlc2MiXTsKICAgIH0gCWVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheQogIGZ1bmN0aW9uIERlbGV0ZUdyb3VwRnVsbCggJGlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0REIoKTsKICAgICRyZXN1bHQgPSBhcnJheSgpOwoKICAgIC8vIGRlbGV0ZSBhbGwgcHJvcGVydHkgcmVsYXRpb25zIGZyb20gdGhpcyBncm91cAogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcCBXSEVSRSBncm91cF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICRkYi0+RXJyb3JNc2coKSApOwogICAgICB9CgogICAgLy8gZGVsZXRlIGFsbCBpbmRpY2F0aW9uIHRoYXQgYW55Ym9keSBpcyBhIG1lbWJlcgogICAgLy8gb2YgdGhpcyBncm91cAogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgV0hFUkUgZ3JvdXBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICRkYi0+RXJyb3JNc2coKSApOwogICAgICB9CiAgICAKICAgIC8vIGFuZCB0aGVuIGRlbGV0ZSB0aGUgZ3JvdXAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgCiAgICByZXR1cm4gYXJyYXkoIFRSVUUsICcnICk7CiAgfQogIAogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRHcm91cExpc3QoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7CiAgICBpZiggJGRicmVzdWx0ICkgewogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CgkkcmVzdWx0WyRyb3dbJ2dyb3VwbmFtZSddXSA9ICRyb3dbJ2lkJ107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KICAKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEdyb3VwTGlzdEZ1bGwoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoJICAKICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSApOwogICAgaWYoICRkYnJlc3VsdCApIHsKICAgICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICAgIHsKCSAgYXJyYXlfcHVzaCgkcmVzdWx0LCRyb3cpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8vIG9sZCB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBJRCgkZ3JvdXBuYW1lKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CgogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBncm91cG5hbWU9JyIuJGdyb3VwbmFtZS4iJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSAKICAgICAgewoJJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CglyZXR1cm4gJHJvd1siaWQiXTsKICAgICAgfSAKICAgIGVsc2UgCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogIH0KCgogIC8vIG9sZCB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0TWVtYmVyR3JvdXBzKCR1c2VyaWQpIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIHVzZXJpZD0nIi4kdXNlcmlkLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJlc3VsdD0iIjsKICAgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CglpZiAoJHJlc3VsdCE9IiIpIHsKCSAgJHJlc3VsdC49IiwiLiR0aGlzLT5HZXRHcm91cE5hbWUoJHJvd1siZ3JvdXBpZCJdKTsKCX0gZWxzZSB7CgkgICRyZXN1bHQ9JHRoaXMtPkdldEdyb3VwTmFtZSgkcm93WyJncm91cGlkIl0pOwoJfQogICAgICB9CiAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJub25lIjsKICAgIH0KICB9CgoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIENoYW5nZVVzZXIoJGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICBpZiAoaXNzZXQoJF9QT1NUWyRpZC4idXNlcmlkIl0pKSAkdXNlcmlkPXRyaW0oJF9QT1NUWyRpZC4idXNlcmlkIl0pOyBlbHNlIHJldHVybiAiVW5yZWNvdmVyYWJsZSBlcnJvciI7CiAgICAkdXNlcm5hbWU9dHJpbSgkX1BPU1RbJGlkLiJ1c2VybmFtZSJdKTsKICAgICRxdWVyeT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWU9JyIuJHVzZXJuYW1lLiInIjsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JHJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgaWYgKCRyb3dbImlkIl0hPSR1c2VyaWQpIHJldHVybiAiVXNlcm5hbWUgYWxyZWFkeSBleGlzdHMhIjsKICAgIH0KICAgIAogICAgaWYgKGlzc2V0KCRfUE9TVFskaWQuImVtYWlsIl0pKSAkZW1haWw9dHJpbSgkX1BPU1RbJGlkLiJlbWFpbCJdKTsgZWxzZSByZXR1cm4gIkVtYWlsIGFkZHJlc3MgbXVzdCBiZSBwcm92aWRlZCI7CiAgICAKICAgIGlmIChpc3NldCgkX1BPU1RbJGlkLiJwYXNzd29yZCJdKSkgJHBhc3N3b3JkPXRyaW0oJF9QT1NUWyRpZC4icGFzc3dvcmQiXSk7IGVsc2UgJHBhc3N3b3JkPSIiOwogICAgaWYgKCRwYXNzd29yZCE9IiIpIHsKICAgICAgJHBhc3N3b3JkMj10cmltKCRfUE9TVFskaWQuInBhc3N3b3JkMiJdKTsKICAgICAgaWYgKCRwYXNzd29yZCE9JHBhc3N3b3JkMikgcmV0dXJuICJQYXNzd29yZHMgZG8gbm90IG1hdGNoISI7CiAgICAgICRxdWVyeT0iVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBTRVQgdXNlcm5hbWU9PyxTRVQgcGFzc3dvcmQ9PyxlbWFpbD0/IFdIRVJFIGlkPT8iOwogICAgICAkcGFyYW1zPWFycmF5KCR1c2VybmFtZSxtZDUoJHBhc3N3b3JkKSwkZW1haWwsJHVzZXJpZCk7CiAgICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwogICAgfSBlbHNlIHsKICAgICAgJHF1ZXJ5PSJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFNFVCB1c2VybmFtZT0/LGVtYWlsPT8gV0hFUkUgaWQ9PyI7CiAgICAgICRwYXJhbXM9YXJyYXkoJHVzZXJuYW1lLCRlbWFpbCwkdXNlcmlkKTsKICAgICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnksJHBhcmFtcyk7CiAgICB9CiAgICAKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICB3aGlsZSAoJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKCS8vRmlyc3QgcmVzZXQgdGhlIGFzc29jaW9hdGlvbnMKCSRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9PyBBTkQgZ3JvdXBpZD0/IjsKCSRwYXJhbXMxPWFycmF5KCR1c2VyaWQsJHJvd1siaWQiXSk7CgkkZGJyZXN1bHQyPSRkYi0+RXhlY3V0ZSgkcSwkcGFyYW1zMSk7CgllY2hvICRkYi0+RXJyb3JNc2coKTsKCS8vVGhlbiBjcmVhdGUgYSBuZXcgb25lIGlmIGl0IHdhcyBzZWxlY3RlZAoJaWYgKCRfUE9TVFskaWQuImdyb3VwIi4kcm93WyJpZCJdXT09InllcyIpIHsKCSAgLy9DcmVhdGUgYW4gYXNzb2NpYXRpb24KCSAgJHE9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzICh1c2VyaWQsZ3JvdXBpZCkgVkFMVUVTICg/LD8pIjsKCSAgJHBhcmFtczI9YXJyYXkoJHVzZXJpZCwkcm93WyJpZCJdKTsKCSAgJGRicmVzdWx0Mj0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtczIpOwoJfQogICAgICB9CiAgICB9CiAgfQoJCgogIC8vIG9sZCB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gRGVsZXRlVXNlcigkaWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgIGlmIChpc3NldCgkX0dFVFskaWQuInVzZXJpZCJdKSkgJHVzZXJpZD0kX0dFVFskaWQuInVzZXJpZCJdOyBlbHNlIHJldHVybjsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgaWQ9JyR1c2VyaWQnIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIHVzZXJpZD0nJHVzZXJpZCciOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgfQoKfSAvLyBjbGFzcwoKPz4K]]></data>
  </file>
  <file>
    <filename>/FrontEndUsers.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKLyoKIEZyb250RW5kVXNlcnMuIEEgcGx1Z2luIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIENvcHlyaWdodCAoYykgMjAwNC0wNSBieSBNb3J0ZW4gUG91bHNlbiA8bW9ydGVuQHBvdWxzZW4ub3JnPgoKIFRyYW5zbGF0aW9uczoKIEZyZW5jaDogUGF0cmljaWEgQnJ1biwgaHR0cDovL3d3dy5icnVtYWxzb2xzdGljZS5jb20KIE5vcndlZ2lhbiAoYm9rbT9sKTogUm9nZXIgIlN0aWdtYSIgS251dHNlbiA8c3RpZ21hc3RlckBnbWFpbC5jb20+CgogQ01TLSBDTVMgTWFkZSBTaW1wbGUgaXMgQ29weXJpZ2h0IChjKSBUZWQgS3VscCAod2lzaHlAdXNlcnMuc2YubmV0KQogVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9jbXNtYWRlc2ltcGxlLnNmLm5ldAoKIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoqLwoKLy8gYSB2ZXJ5IGltcG9ydGFudCBsaW5lIHRoYXQgaW5jbHVkZXMgYWxsIG9mIG91ciBhcGkgZnVuY3Rpb25zCnJlcXVpcmVfb25jZSggIkZyb250RW5kVXNlcnMuYXBpLnBocCIgKTsKcmVxdWlyZV9vbmNlKCAiUmFuZG9tLnBocCIgKTsKCgpmdW5jdGlvbiBpbXBsb2RlX3dpdGhfa2V5KCRhc3NvYywgJGluZ2x1ZSA9ICc9JywgJG91dGdsdWUgPSAnJicpCnsKICAgJHJldHVybiA9IG51bGw7CiAgIGZvcmVhY2ggKCRhc3NvYyBhcyAkdGsgPT4gJHR2KSAkcmV0dXJuIC49ICRvdXRnbHVlLiR0ay4kaW5nbHVlLiR0djsKICAgcmV0dXJuIHN1YnN0cigkcmV0dXJuLHN0cmxlbigkb3V0Z2x1ZSkpOwp9CgpmdW5jdGlvbiBleHBsb2RlX3dpdGhfa2V5KCRzdHIsICRpbmdsdWU9Jz0nLCAkb3V0Z2x1ZT0nJicpCnsKICAkcmV0ID0gYXJyYXkoKTsKICAkYTEgPSBzcGxpdCgkb3V0Z2x1ZSwkc3RyKTsKICBmb3JlYWNoKCAkYTEgYXMgJGEyICkKICB7CiAgICBsaXN0KCAkaywgJHYgKSA9IHNwbGl0KCAkaW5nbHVlLCAkYTIgKTsKICAgICRyZXRbICRrIF0gPSAkdjsKICB9CiAgcmV0dXJuICRyZXQ7Cn0KCmZ1bmN0aW9uIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkYXJyLCAkZXhwciApCnsKICAka2V5cyA9IGFycmF5X2tleXMoICRhcnIgKTsKICBmb3JlYWNoKCAka2V5cyBhcyAkayApCiAgewogICAgaWYoIHN0cnN0ciggJGssICRleHByICkgKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBhcnJheV9maW5kX2tleV9yZWdleHAoICRhcnIsICRleHByICkKewogICRrZXlzID0gYXJyYXlfa2V5cyggJGFyciApOwogIGZvcmVhY2goICRrZXlzIGFzICRrICkKICB7CiAgICBpZiggcHJlZ19tYXRjaCggJGV4cHIsICRrICkgKSByZXR1cm4gJGs7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gYXJyYXlfbWVyZ2VfYnlfbmFtZV9yZXF1aXJlZCggJGFycjEsICRhcnIyICkKewogICR4eHJlc3VsdCA9IGFycmF5KCk7CiAgLy8gYWRkIGl0ZW1zIGNvbW1vbiB0byBhcnIxIGFuZCBhcnIyIAogIC8vIGJ1dCBmYXZvciByZXF1aXJlZCBpdGVtcwogIGlmKCAhaXNfYXJyYXkoICRhcnIxICkgfHwgIWlzX2FycmF5KCAkYXJyMiApICkKICAgIHsKICAgICAgcmV0dXJuOwogICAgfQogIGZvcmVhY2goICRhcnIxIGFzICRhMSApCiAgewogICAgZm9yZWFjaCggJGFycjIgYXMgJGEyICkKICAgIHsKICAgICAgaWYoICRhMVsnbmFtZSddID09ICRhMlsnbmFtZSddICkgCgl7CgkgIGlmKCAkYTFbJ3JlcXVpcmVkJ10gPT0gMiApIAoJICAgIHsKCSAgICAgIGFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CgkgICAgICBicmVhazsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0gICAgCiAgICB9CiAgfQogIAogIC8vIGFkZCBpdGVtcyBpbiBhcnIxIG5vdCBpbiByZXN1bHQKICBmb3JlYWNoKCAkYXJyMSBhcyAkYTEgKQogIHsKICAgICRmb3VuZCA9IGZhbHNlOwogICAgZm9yZWFjaCggJHh4cmVzdWx0IGFzICRyZXMgKQogICAgewogICAgICBpZiggJGExWyduYW1lJ10gPT0gJHJlc1snbmFtZSddICkKCXsKCSAgJGZvdW5kID0gdHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiggISRmb3VuZCApCiAgICAgIHsKCWFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CiAgICAgIH0KICB9CiAgCiAgLy8gYWRkIGl0ZW1zIGluIGFycjIgbm90IGluIHJlc3VsdAogIGZvcmVhY2goICRhcnIyIGFzICRhMiApCiAgewogICAgJGZvdW5kID0gZmFsc2U7CiAgICBmb3JlYWNoKCAkeHhyZXN1bHQgYXMgJHJlcyApCiAgICB7CiAgICAgIGlmKCAkYTJbJ25hbWUnXSA9PSAkcmVzWyduYW1lJ10gKQoJewoJICAkZm91bmQgPSB0cnVlOwoJICBicmVhazsKCX0KICAgIH0KICAgIGlmKCAhJGZvdW5kICkKICAgICAgewoJYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKICAgICAgfQogIH0KICByZXR1cm4gJHh4cmVzdWx0Owp9CgoKZnVuY3Rpb24gY29tcGFyZV9lbGVtZW50c19ieV9zb3J0b3JkZXJfa2V5KCAkZTEsICRlMiApCnsKICBpZiggJGUxWydzb3J0X2tleSddIDwgJGUyWydzb3J0X2tleSddICkKICAgIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIGVsc2UgaWYoICRlMVsnc29ydF9rZXknXSA+ICRlMlsnc29ydF9rZXknXSApCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQogIHJldHVybiAwOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJG5hbWUsICR2YWx1ZT0nJywgJHNlbGVjdGVkdmFsdWU9JycsIAoJCQkgICAgICAgJGFkZHR0ZXh0PScnKQp7CiAgJHRleHQgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwogICRhcnIgPSBzcGxpdCgiLCIsJHNlbGVjdGVkdmFsdWUpOwogIGZvcmVhY2goICRhcnIgYXMgJGEgKQogIHsKICAgIGlmICgkYSA9PSAkdmFsdWUpCiAgICAgIHsKCSR0ZXh0IC49ICcgJyAuICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgIH0KICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICRuYW1lLCAkdmFsdWU9JycsICRpbWFnZT0nJywgJGFkZHR0ZXh0PScnKQp7CiAgZ2xvYmFsICRnQ21zOwogICR0ZXh0ID0gJzxpbnB1dCBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyIgdHlwZT0nOwogIGlmICgkaW1hZ2UgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICciaW1hZ2UiJzsKICAgICAgJGltZyA9ICRnQ21zLT5jb25maWdbJ3Jvb3RfdXJsJ10uRElSRUNUT1JZX1NFUEFSQVRPUi4kaW1hZ2U7CiAgICAgICR0ZXh0IC49ICcgc3JjPSInLiRpbWcuJyInOwogICAgfQogIGVsc2UgCiAgICB7CiAgICAgICR0ZXh0IC49ICcic3VibWl0Iic7CiAgICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAnIC8+JzsKICByZXR1cm4gJHRleHQgLiAiXG4iOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAkbmFtZSwgJHZhbHVlPScnLCAkYWRkdGV4dD0nJywgJGRlbGltPScsJykKewogIGlmKCBpc19hcnJheSggJHZhbHVlICkgKQogICAgewogICAgICAkdmFsID0gaW1wbG9kZV93aXRoX2tleSggJHZhbHVlICk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAkdmFsID0gJHZhbHVlOwogICAgfQogICR2YWwgPSBzdHJfcmVwbGFjZSgnIicsICcmcXVvdDsnLCAkdmFsKTsKICAkdGV4dCA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsLiciJzsKICBpZiAoJGFkZHRleHQgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICcgJy4kYWRkdGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKCmZ1bmN0aW9uIGZpbmRfaW5kZXhfb2ZfdmFsdWUoICRkYXRhLCAkdmFsdWUsICRkZmx0ICkKewogICRpID0gMDsKICBmb3JlYWNoKCAkZGF0YSBhcyAkaz0+JHYgKQogIHsKICAgIGlmKCAkdiA9PSAkdmFsdWUgKQogICAgICB7CglyZXR1cm4gJGk7CiAgICAgIH0KICAgICRpKys7CiAgfQogIHJldHVybiAkZGZsdDsKfQoKCmNsYXNzIEZyb250RW5kVXNlcnMgZXh0ZW5kcyBDTVNNb2R1bGUgewogIC8qKgogICAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHVzZWQgZm9yIHRoZSBsb2dpbiBmb3JtCiAgICovCiAgdmFyICRkZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUxID0gJwo8IS0tIGZvcmdvdCBwYXNzd29yZCB0ZW1wbGF0ZSAtLT4KeyRzdGFydGZvcm19CnskdGl0bGV9CntpZiAkbWVzc2FnZSAhPSBcJ1wnfQogIHtpZiAkZXJyb3IgIT0gXCdcJ30KICAgIDxwPjxmb250IGNvbG9yPSJyZWQiPnskbWVzc2FnZX08L2ZvbnQ+PC9wPgogIHtlbHNlfQogICAgPHA+eyRtZXNzYWdlfTwvcD4KICB7L2lmfQp7L2lmfQo8cD57JGxvc3Rwd19tZXNzYWdlfTwvcD4KPHA+eyRwcm9tcHRfdXNlcm5hbWV9Jm5ic3A7eyRpbnB1dF91c2VybmFtZX08L3A+CjxwPnskaGlkZGVufXskc3VibWl0fSZuYnNweyRjYW5jZWx9PC9wPgp7JGVuZGZvcm19CjwhLS0gZm9yZ290IHBhc3N3b3JkIHRlbXBsYXRlIC0tPiAKICAnOwoKICB2YXIgJGRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTIgPSAnCjwhLS0gZm9yZ290IHBhc3N3b3JkIGVtYWlsIHRlbXBsYXRlIC0tPgo8cD57JG1lc3NhZ2VfZm9yZ290cHdlbWFpbH08L3A+CjxwPnskcHJvbXB0X2NvZGV9Jm5ic3A7eyRkYXRhX2NvZGV9PC9wPgo8cD57JHByb21wdF9saW5rfSZuYnNwO3skZGF0YV9saW5rfTxwPgo8IS0tIGZvcmdvdCBwYXNzd29yZCBlbWFpbCB0ZW1wbGF0ZSAtLT4KICAnOwoKCiAgdmFyICRkZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUzID0gJwo8IS0tIGZvcmdvdCBwYXNzd29yZCB2ZXJpZmljYXRpb24gdGVtcGxhdGUgLS0+Cnskc3RhcnRmb3JtfQp7JHRpdGxlfQp7aWYgJG1lc3NhZ2UgIT0gXCdcJ30KICB7aWYgJGVycm9yICE9IFwnXCd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KPHA+eyRwcm9tcHRfdXNlcm5hbWV9Jm5ic3A7eyRpbnB1dF91c2VybmFtZX08L3A+CjxwPnskcHJvbXB0X2NvZGV9Jm5ic3A7eyRpbnB1dF9jb2RlfTwvcD4KPHA+eyRwcm9tcHRfcGFzc3dvcmR9Jm5ic3A7eyRpbnB1dF9wYXNzd29yZH08L3A+CjxwPnskcHJvbXB0X3JlcGVhdHBhc3N3b3JkfSZuYnNwO3skaW5wdXRfcmVwZWF0cGFzc3dvcmR9PC9wPgo8cD57JGhpZGRlbn17JHN1Ym1pdH08L3A+CnskZW5kZm9ybX0KPCEtLSBmb3Jnb3QgcGFzc3dvcmQgdmVyaWZpY2F0aW9uIHRlbXBsYXRlIC0tPgonOwoKICB2YXIgJGRmbHRfbG9naW5mb3JtdGVtcGxhdGUgPSAnCjwhLS0gTG9naW4gZm9ybSB0ZW1wbGF0ZSAtLT4KIDxmb250IHNpemU9Ii0yIj4KIHskc3RhcnRmb3JtfQoge2lmICRlcnJvcn0KICB7JGVycm9yfTxicj4KIHsvaWZ9CiAgPHA+eyRwcm9tcHRfdXNlcm5hbWV9Jm5ic3A7eyRpbnB1dF91c2VybmFtZX0mbmJzcDt7JHByb21wdF9wYXNzd29yZH0mbmJzcDsKICB7JGlucHV0X3Bhc3N3b3JkfSZuYnNwO3skaW5wdXRfc3VibWl0fTxici8+CiAgeyRsaW5rX2ZvcmdvdH0KIHskZW5kZm9ybX0KICA8L2ZvbnQ+CjwhLS0gTG9naW4gZm9ybSB0ZW1wbGF0ZSAtLT4KICc7CgogIHZhciAkZGZsdF9sb2dvdXRmb3JtdGVtcGxhdGUgPSAnCjwhLS0gTG9nb3V0IGZvcm0gdGVtcGxhdGUgLS0+CiB7JHN0YXJ0Zm9ybX0KICA8cD57JHByb21wdF9sb2dnZWRpbn0mbmJzcDt7JHVzZXJuYW1lfTwvcD4gCiAgPHA+eyRsaW5rX2xvZ291dH08L3A+CiAgPHA+eyRsaW5rX2NoYW5nZXNldHRpbmdzfTwvcD4KIHskZW5kZm9ybX0KPCEtLSBMb2dvdXQgZm9ybSB0ZW1wbGF0ZSAtLT4KICc7CgogIHZhciAkZGZsdF9jaGFuZ2VzZXR0aW5nc3RlbXBsYXRlID0gJwo8IS0tIGNoYW5nZSBzZXR0aW5ncyB0ZW1wbGF0ZSAtLT4KeyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9IFwnXCd9CiAge2lmICRlcnJvciAhPSBcJ1wnfQogICAgPHA+PGZvbnQgY29sb3I9InJlZCI+eyRtZXNzYWdlfTwvZm9udD48L3A+CiAge2Vsc2V9CiAgICA8cD57JG1lc3NhZ2V9PC9wPgogIHsvaWZ9CnsvaWZ9Cnskc3RhcnRmb3JtfQoge2lmICRjb250cm9sY291bnQgPiAwfQogIDxjZW50ZXI+CiAgPHRhYmxlIHdpZHRoPSI3NSUiPgogICAgIHtmb3JlYWNoIGZyb209JGNvbnRyb2xzIGl0ZW09Y29udHJvbH0KICA8dHI+CiAgICAgPHRkPnskY29udHJvbC0+aGlkZGVufTxmb250IGNvbG9yPSJ7JGNvbnRyb2wtPmNvbG9yfSI+eyRjb250cm9sLT5wcm9tcHR9eyRjb250cm9sLT5tYXJrZXJ9PC9mb250PjwvdGQ+CiAgICAgPHRkPnskY29udHJvbC0+Y29udHJvbH17JGNvbnRyb2wtPmFkZHRleHR9PC90ZD4KIHsvZm9yZWFjaH0KICA8L3RhYmxlPgogIDwvY2VudGVyPgogey9pZn0KIHskaGlkZGVufXskaGlkZGVuMn17JHN1Ym1pdH17JGNhbmNlbH0KeyRlbmRmb3JtfQo8IS0tIGNoYW5nZSBzZXR0aW5ncyB0ZW1wbGF0ZSAtLT4KICc7CiAgLy9Ib3cgbWFueSBzZWNvbmRzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGEgdXNlciBpcyBhdXRvbWF0aWNhbGx5IGxvZ2dlZCBvdXQuCiAgdmFyICRleHBpcnl0aW1lOwoKICAvL1NldCB0aGlzIHRvIHRydWUgaWYgdXNlciBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byBkZWZhdWx0IHBhZ2UgYWZ0ZXIgCiAgLy8gbG9nZ2luZyBpbi9vdXQuCiAgdmFyICRsb2dpbnRhcmdldDsKICB2YXIgJG90aGVyaW50YXJnZXQ7CiAgdmFyICRsb2dvdXR0YXJnZXQ7CiAgdmFyICRvdGhlcm91dHRhcmdldDsgIAogIHZhciAkYWxsb3d1c2VyYWRtaW47CiAgdmFyICRlbmFibGVlbWFpbHB3OwogIHZhciAkbGFuZz0iIjsKICB2YXIgJHVzZXJtYW5pcCA9IGZhbHNlOwogIHZhciAkdHlwZXMgPSBmYWxzZTsKCiAgLy8gY29uc3RydWN0b3IKICBmdW5jdGlvbiBGcm9udEVuZFVzZXJzKCkKICB7CiAgICBwYXJlbnQ6OkNNU01vZHVsZSgpOwogICAgJHRoaXMtPnVzZXJtYW5pcCA9IG5ldyBGcm9udEVuZFVzZXJzTWFuaXB1bGF0b3IoICR0aGlzICk7CiAgICAkdGhpcy0+dHlwZXMgPSBhcnJheSggJ3RleHQnID0+IDAsCgkJCSAgJ2NoZWNrYm94JyA9PiAxLAoJCQkgICdlbWFpbCcgPT4gMiApOwogIH0KCiAgZnVuY3Rpb24gR2VuZXJhdGVSYW5kb21QcmludGFibGVTdHJpbmcoICRsZW4gPSAxMCApCiAgewogICAgJG8xID0gbmV3IFJhbmRvbTsKICAgIHJldHVybiAkbzEtPmdldCgkbGVuKTsKICB9CgogIGZ1bmN0aW9uIEdldE5hbWUoKSAJewogICAgcmV0dXJuICdGcm9udEVuZFVzZXJzJzsKICB9CiAgCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gIjAuMTEtYmV0YTUiOwogIH0KICAKICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkJewogICAgcmV0dXJuICcwLjEuNic7CiAgfQoKICBmdW5jdGlvbiBsYW5naWZ5S2V5cyggJGFyciApCiAgewogICAgJG91dCA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkYXJyIGFzICRrPT4kdiApCiAgICB7CiAgICAgICRrID0gJHRoaXMtPkxhbmcoJGspOwogICAgICAkb3V0WyAkayBdID0gJHY7CiAgICB9CiAgICByZXR1cm4gJG91dDsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRGcmllbmRseU5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEhhc0FkbWluICgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgR3JvdXBzJykgfHwKICAgICAgICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IEdyb3VwcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1JlbW92ZSBHcm91cHMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdSZW1vdmUgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgRnJvbnRFbmRVc2VyUHJvcHMnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uICgpCiAgewogICAgcmV0dXJuICd1c2Vyc2dyb3Vwcyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RGVwZW5kZW5jaWVzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSggJ0NNU01haWxlcicgPT4gJzEuNzMuMycgKTsKICB9CiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5EZXNjcmlwdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbiAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZyAoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgZnVuY3Rpb24gSW5zdGFsbCgpIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwogICAgCiAgICAkdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwogICAgCiAgICAvL1VzZXIgbGlzdAogICAgJGZsZHMgPSAiCiAgICAgICAgICAgICBpZCBJIEtFWSwKCSAgICAgdXNlcm5hbWUgQyg4MCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBwYXNzd29yZCBDKDMyKSBOT1QgTlVMTCwKICAgICAgICAgICAgIGNyZWF0ZWRhdGUgVCwKICAgICAgICAgICAgIGV4cGlyZXMgVAogICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiLCAKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiICk7CiAgICAKICAgIC8vR3JvdXAgbGlzdAogICAgJGZsZHMgPSAiCgkgICAgIGlkIEkgS0VZLAoJICAgICBncm91cG5hbWUgQygzMiksCgkgICAgIGdyb3VwZGVzYyBDKDEyOCkKCSAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHNfc2VxIiApOwoKICAgIC8vIGxvZ2dlZGluCiAgICAkZmxkcyA9ICIKCSAgICAgc2Vzc2lvbmlkIEMoMzIpLAoJICAgICBsYXN0dXNlZCBJLAoJICAgICB1c2VyaWQgSQoJICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKICAgIAogICAgLy9Db25uZWN0aW9ucyBiZXR3ZWVuIHVzZXJzIGFuZCBncm91cHMKICAgICRmbGRzID0gIgoJICAgICB1c2VyaWQgSSwKCSAgICAgZ3JvdXBpZCBJCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CgogICAgLy9wcm9wZXJ0eSBkZWZpbml0aW9uCiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgIG5hbWUgICAgIEMoNDApIEtFWSwKICAgICAgICAgICAgIHByb21wdCAgIEMoODApIE5PVCBOVUxMLAogICAgICAgICAgICAgdHlwZSAgICAgQygyMCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBsZW5ndGggICBJCiAgICAgICAgICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTcWwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvLyBncm91cCBwcm9wZXJ0eSBtYXAKICAgICRmbGRzID0gIgogICAgICAgICAgICAgIG5hbWUgICAgQyg0MCkgS0VZLAogICAgICAgICAgICAgIGdyb3VwX2lkIEkgS0VZLAogICAgICAgICAgICAgIHNvcnRfa2V5IEksIAogICAgICAgICAgICAgIHJlcXVpcmVkIEkgTk9UIE5VTEwKICAgICAgICAgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNxbChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcCIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvL3VzZXIgcHJvcGVydGllcwogICAgJGZsZHMgPSAiCgkgICAgIGlkIEkgS0VZLAoJICAgICB1c2VyaWQgSSwKCSAgICAgdGl0bGUgQygxMDApLAoJICAgICBkYXRhIEMoMjU1KQoJICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzX3NlcSIgKTsKCiAgICAvLyBmb3Jnb3R0ZW4gcGFzc3dvcmQgc3R1ZmYKICAgICRmbGRzID0gIgoJICAgICB1c2VyaWQgSSBLRVksCiAgICAgICAgICAgICBjb2RlIEMoMjUpLAogICAgICAgICAgICAgY3JlYXRlZCBUCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgIC8vIHRlbXBsYXRlcwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScsICR0aGlzLT5kZmx0X2xvZ2luZm9ybXRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJywgJHRoaXMtPmRmbHRfbG9nb3V0Zm9ybXRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nLCAkdGhpcy0+ZGZsdF9jaGFuZ2VzZXR0aW5nc3RlbXBsYXRlKTsgCiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZW1haWxmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTIpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScsICR0aGlzLT5kZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUzKTsKCiAgICAvLyBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21pbl9wYXNzd29yZGxlbmd0aCcsIDYpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcsIDIwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtaW5fdXNlcm5hbWVsZW5ndGgnLCA0KTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnLCAyMCk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlcl9zZXNzaW9uX2V4cGlyZXMnLCAxODAwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2dyb3VwJywgLTEpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnLCAwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCAnKicpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywgJ2JsdWUnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlX29uZWdyb3VwJywgMSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicsICchJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywgJ2dyZWVuJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2ZvcmdvdHBhc3N3ZCcsICcnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnLCAnJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJywnJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcsJycpOwoKICAgIC8vIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IEZyb250RW5kVXNlclByb3BzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMnKTsKICB9CgogIAogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCXsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGxtZXNzYWdlJyk7CiAgfQoKCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pIAogIHsKICAgIHN3aXRjaCggJG9sZHZlcnNpb24gKQogICAgICB7CiAgICAgICAgY2FzZSAnMC4xLjAnOgogICAgICAgIGNhc2UgJzAuMS4xJzoKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gcGVybWlzc2lvbnMKICAgICAgICAgICAgJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZGlmeSBGcm9udEVuZFVzZXIgUHJvcGVydGllcycpOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEpOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMik7CiAgICAgICAgICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMyk7CgogICAgICAgICAgICAvLyBmb3Jnb3R0ZW4gcGFzc3dvcmQgc3R1ZmYKICAgICAgICAgICAgJGZsZHMgPSAiCgkgICAgICAgICAgICAgdXNlcmlkIEkgS0VZLAogICAgICAgICAgICAgICAgICAgICBjb2RlIEMoMjUpLAogICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIFQKCSAgICAgICAgICAgICI7CiAgICAgICAgICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgICAgICAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CiAgICAgICAgICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIiwKCQkJCSAgICAgICAgICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgICAgICAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKICAgICAgICAgICAgLy8gbm90aWNlIG5vIGJyZWFrCiAgICAgICAgICB9CgogICAgICAgIGNhc2UgJzAuMS4yJzoKICAgICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9mb3Jnb3RwYXNzd2QnLCAnJyk7CiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnLCAnJyk7CiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9naW4nLCcnKTsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnLCcnKTsKICAgICAgICAgICAgLy8gbm90aWNlIG5vIGJyZWFrCiAgICAgICAgICB9CiAgICAgICB9CiAgfQoKICAKICBmdW5jdGlvbiBVbmluc3RhbGwoKSAKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGRlZm4iICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcCIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUiICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CiAgICAKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzX3NlcSIgKTsKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiICk7CiAgICAkZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzX3NlcSIgKTsKCiAgICAvLyB0ZW1wbGF0ZXMKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19sb2dpbmZvcm0nKTsgCiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfbG9nb3V0Zm9ybScpOyAKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nKTsgCiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJyk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nKTsKCiAgICAvLyBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ21pbl9wYXNzd29yZGxlbmd0aCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ21pbl91c2VybmFtZWxlbmd0aCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3VzZXJfc2Vzc2lvbl9leHBpcmVzJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2ZvcmdvdHBhc3N3ZCcpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnKTsKCiAgICAvLyBwZXJtaXNzaW9ucwogICAgJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycpOwogIH0KCiAgCiAgZnVuY3Rpb24gX0dldFVzZXJMb2dpbkZvcm0oJGlkLCYkcGFyYW1zLCRyZXR1cm5pZCkgCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10pOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19sb2dpbicsICRyZXR1cm5pZCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VzZXJuYW1lJywgJHRoaXMtPkxhbmcoJ3Byb21wdF91c2VybmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXNlcm5hbWUnLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF91c2VybmFtZScsIAoJCQkJCQkgICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10sIDEwLCAyMCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcGFzc3dvcmQnLCAkdGhpcy0+TGFuZygncHJvbXB0X3Bhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAKCQkJCQkJICAgICAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddLCAxMCwgMjApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfc3VibWl0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnYnRuX2xvZ2luJywgCgkJCQkJCSAgICR0aGlzLT5MYW5nKCdsb2dpbicpKSk7CiAgICAkcGFnZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwYWdlaWRmb3Jnb3RwYXNzd2QnKTsKICAgIGlmKCAkcGFnZSApCiAgICB7CiAgICAgICRpZCA9IENvbnRlbnRNYW5hZ2VyOjpHZXRQYWdlSURGcm9tQWxpYXMoICRwYWdlICk7CiAgICAgIGlmKCAkaWQgPT0gZmFsc2UgKQogICAgICB7CiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rX2ZvcmdvdCcsJzwhLS0gRXJyb3IgY291bGQgbm90IGRldGVybWluZSBwYWdlIGZyb20gYWxpYXMvaWQgLS0+Jyk7CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19mb3Jnb3QnLAoJCQkgICAgJHRoaXMtPkNyZWF0ZUNvbnRlbnRMaW5rKCRpZCwkdGhpcy0+TGFuZygnZm9yZ290cHcnKSkpOwogICAgICB9CiAgICB9CiAgICBlbHNlIAogICAgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfZm9yZ290JywKCQkJICAgICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwnZm9yZ290cHcnLCAkcmV0dXJuaWQsCgkJCQkJICAgICR0aGlzLT5MYW5nKCdmb3Jnb3RwdycpKSk7CiAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ2ZldXNlcnNfbG9naW5mb3JtJyk7CiAgfQoKCQogIGZ1bmN0aW9uIF9HZXRVc2VyTG9nb3V0Rm9ybSgkaWQsJiRwYXJhbXMsJHJldHVybmlkKSAKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9sb2dnZWRpbicsCgkJCSAgJHRoaXMtPkxhbmcoJ21zZ19jdXJyZW50bHlsb2dnZWRpbmFzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd1c2VybmFtZScsICR0aGlzLT5Mb2dnZWRJbk5hbWUoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfbG9nb3V0JywKCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsImxvZ291dCIsJHJldHVybmlkLAoJCQkJCSAgICAkdGhpcy0+TGFuZygnbG9nb3V0JykpKTsKICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycpOwogICAgaWYoICRwYWdlICkKICAgIHsKICAgICAgJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhZ2UgKTsKICAgICAgaWYoICRpZCA9PSBmYWxzZSApCiAgICAgIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfY2hhbmdlc2V0dGluZ3MnLCc8IS0tIEVycm9yIGNvdWxkIG5vdCBkZXRlcm1pbmUgcGFnZSBmcm9tIGFsaWFzL2lkIC0tPicpOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfY2hhbmdlc2V0dGluZ3MnLAogICAgICAgICAgICR0aGlzLT5DcmVhdGVDb250ZW50TGluayggJGlkLCAkdGhpcy0+TGFuZygncHJvbXB0X2NoYW5nZXNldHRpbmdzJykpKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rX2NoYW5nZXNldHRpbmdzJywKCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsImNoYW5nZXNldHRpbmdzIiwkcmV0dXJuaWQsCgkJCQkJICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfY2hhbmdlc2V0dGluZ3MnKSkpOwogICAgfQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCdmZXVzZXJzX2xvZ291dGZvcm0nKTsKICB9CgoKICBmdW5jdGlvbiBfSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAkcGVybSA9ICcnICkKICB7CiAgICAkcDEgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnQWRkIFVzZXJzJyApOwogICAgJHAyID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBVc2VycycgKTsKICAgICRwMyA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdSZW1vdmUgVXNlcnMnICk7CiAgICAkcDQgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnQWRkIEdyb3VwcycgKTsKICAgICRwNSA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdNb2RpZnkgR3JvdXBzJyApOwogICAgJHA2ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBHcm91cCBBc3NpZ25tZW50cycgKTsKICAgICRwNyA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdSZW1vdmUgR3JvdXBzJyApOwogICAgJHA4ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyApOwogICAgJHA5ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycgKTsKICAgICRwMTAgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IFRlbXBsYXRlcycgKTsKCiAgICAkcmV0ID0gMDsKICAgIHN3aXRjaCggJHBlcm0gKQogICAgICB7CiAgICAgIGNhc2UgJyc6ICAvLyBhbnkgcGVybWlzc2lvbgoJJHJldCA9ICgkcDEgfHwgJHAyIHx8ICRwMyB8fCAkcDQgfHwgJHA1IHx8ICRwNiB8fCAkcDcgfHwgJHA4IHx8ICRwOSB8fCAkcDEwICk7CglicmVhazsKCiAgICAgIGNhc2UgJ2FkZGdyb3VwJzoKCSRyZXQgPSAoJHA0KTsKCWJyZWFrOwoKICAgICAgY2FzZSAnYWRkdXNlcic6CgkkcmV0ID0gKCRwMSk7CglicmVhazsKCiAgICAgIGNhc2UgJ2FkZHByb3AnOgogICAgICBjYXNlICdlZGl0cHJvcCc6CiAgICAgIGNhc2UgJ2RlbGV0ZXByb3AnOgogICAgICBjYXNlICdwcm9wZXJ0aWVzJzsKICAgICAgICAkcmV0ID0gKCRwOSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdsaXN0dXNlcnMnOgoJJHJldCA9ICgkcDIgfHwgJHAzKTsKCWJyZWFrOwoKICAgICAgY2FzZSAnbGlzdGdyb3Vwcyc6CgkkcmV0ID0gKCRwNSB8fCAkcDYpOwoJYnJlYWs7CgogICAgICBjYXNlICdlZGl0Z3JvdXBzJzoKCSRyZXQgPSAoJHA1IHx8ICRwNik7CglicmVhazsKCiAgICAgIGNhc2UgJ2VkaXR1c2Vycyc6CgkkcmV0ID0gKCRwMik7CglicmVhazsKIAogICAgICBjYXNlICdyZW1vdmVncm91cHMnOgoJJHJldCA9ICgkcDcpOwoJYnJlYWs7CgogICAgICBjYXNlICdyZW1vdmV1c2Vycyc6CgkkcmV0ID0gKCRwMyk7CglicmVhazsKCiAgICAgIGNhc2UgJ2VkaXRwcmVmcyc6CiAgICAgIGNhc2UgJ3NpdGVwcmVmcyc6CgkkcmV0ID0gKCRwOCk7CglicmVhazsKCiAgICAgIGNhc2UgJ3VzZXJzbmdyb3Vwcyc6CiAgICAgICAgJHJldCA9ICgkcDEgfHwgJHAyIHx8ICRwMyB8fCAkcDQgfHwgJHA1IHx8ICRwNiB8fCAkcDcpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndGVtcGxhdGVzJzoKICAgICAgICAkcmV0ID0gKCRwMTApOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKCSRyZXQgPSAwOwoJYnJlYWs7CiAgICAgIH0KCiAgICByZXR1cm4gJHJldDsKICB9CgoKICBmdW5jdGlvbiBHZXRQYWdlSWQoJGFsaWFzKSB7CQkKICAgIGlmICgkYWxpYXM9PSIiKSByZXR1cm4gZmFsc2U7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgY29udGVudF9pZCBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJjb250ZW50IFdIRVJFIGNvbnRlbnRfYWxpYXMgPSAnIi4kYWxpYXMuIiciOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA+IDApCXsKICAgICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbJ2NvbnRlbnRfaWQnXTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgoJCiAgZnVuY3Rpb24gUmVkaXJlY3RUb1RhcmdldCgkcmV0dXJuaWQsJGlub3V0PSJpbiIpIHsJCQogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICBpZiAoJGlub3V0PT0iaW4iKSB7CiAgICAgIHN3aXRjaCAoJHRoaXMtPmxvZ2ludGFyZ2V0KSB7CiAgICAgIGNhc2UgImZyb250IiA6IHsKCSRxdWVyeSA9ICJTRUxFQ1QgY29udGVudF9pZCBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJjb250ZW50IFdIRVJFIGRlZmF1bHRfY29udGVudCA9IDEiOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7CglpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA+IDApCXsKCSAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCSAgJHJlc3VsdCA9ICRyb3dbJ2NvbnRlbnRfaWQnXTsKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmVzdWx0KTsJCQkJCQkKCSAgYnJlYWs7Cgl9CgkvL2ZhbGx0aHJvdWdoIGludGVudGlvbmFsCiAgICAgIH0KICAgICAgY2FzZSAicmV0dXJuaWQiIDogJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmV0dXJuaWQpO2JyZWFrOwogICAgICBjYXNlICJvdGhlciIgOiB7CglpZiAoJGlkPSR0aGlzLT5HZXRQYWdlSWQoJHRoaXMtPm90aGVyaW50YXJnZXQpKSB7CQkJCQkJCgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJGlkKTsgCgkgIGJyZWFrOwoJfSBlbHNlIHsKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmV0dXJuaWQpOwoJICBicmVhazsKCX0KICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKCR0aGlzLT5sb2dvdXR0YXJnZXQpIHsKICAgICAgY2FzZSAiZnJvbnQiIDogewoJJHF1ZXJ5ID0gIlNFTEVDVCBjb250ZW50X2lkIEZST00gIi5jbXNfZGJfcHJlZml4KCkuImNvbnRlbnQgV0hFUkUgZGVmYXVsdF9jb250ZW50ID0gMSI7CgkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKCWlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpID4gMCkJewoJICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwoJICAkcmVzdWx0ID0gJHJvd1snY29udGVudF9pZCddOwoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXN1bHQpOwkJCQkJCQoJICBicmVhazsKCX0KCS8vZmFsbHRocm91Z2ggaW50ZW50aW9uYWwKICAgICAgfQogICAgICBjYXNlICJyZXR1cm5pZCIgOiAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRyZXR1cm5pZCk7YnJlYWs7CiAgICAgIGNhc2UgIm90aGVyIiA6IHsKCWlmICgkaWQ9JHRoaXMtPkdldFBhZ2VJZCgkdGhpcy0+b3RoZXJvdXR0YXJnZXQpKSB7CQkJCQkJCgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJGlkKTsgCgkgIGJyZWFrOwoJfSBlbHNlIHsKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmV0dXJuaWQpOwoJICBicmVhazsKCX0KICAgICAgfQogICAgICB9CiAgICB9CQkKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIG1ldGhvZCB0byBkaXNwbGF5CiAgIGVycm9yIGluZm9ybWF0aW9uIG9uIHRoZSBhZG1pbiBzaWRlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwogICAgICB9CiAgICAgIAogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZEdyb3VwKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICAgIH0KCiAgICAkZ3JvdXBuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwbmFtZSddICkgKQogICAgICB7CgkkZ3JvdXBuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSk7CiAgICAgIH0KICAgICRncm91cGRlc2MgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZ3JvdXBkZXNjJ10gKSApCiAgICAgIHsKCSRncm91cGRlc2MgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICBpZiggJGdyb3VwbmFtZSA9PSAnJyB8fCAkZ3JvdXBkZXNjID09ICcnICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW52YWxpZHBhcmFtcyIpKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGRncm91cCcsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgZ3JvdXAgbmFtZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKICAgIGlmKCAkdGhpcy0+R2V0R3JvdXBJRCggJGdyb3VwbmFtZSApICE9IGZhbHNlICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZ3JvdXBleGlzdHMiKSk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkZ3JvdXAnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB3ZSdyZSBjbGVhciB0byBhZGQKICAgICRyZXQgPSAkdGhpcy0+QWRkR3JvdXAoICRncm91cG5hbWUsICRncm91cGRlc2MgKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICRyZXRbMV0gKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGRncm91cCcsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFsc28gYWRkIHRoZSBwcm9wZXJ0eSBjaG9pY2VzCiAgICAkdGhpcy0+RGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJHJldFsxXSApOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICAkcHJvcG5hbWUgPSAnJzsKICAgICAgJHNvcnRvcmRlciA9ICcnOwogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaW5wdXRfcmVxdWlyZWRfLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0cigka2V5LHN0cmxlbignaW5wdXRfcmVxdWlyZWRfJykpOwoJfQogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3NvcnRvcmRlcl8nLiRwcm9wbmFtZV0gKSApCgl7CgkgICRzb3J0b3JkZXIgPSAkcGFyYW1zWydpbnB1dF9zb3J0b3JkZXJfJy4kcHJvcG5hbWVdOwoJfQoKICAgICAgaWYoICR2YWwgIT0gMCAmJiAkcHJvcG5hbWUgIT0gJycpCgl7CgkgICR0aGlzLT5BZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRyZXRbMV0sICRwcm9wbmFtZSwgJHNvcnRvcmRlciwgJHZhbCApOwoJfQogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJywgJHBhcmFtcyApOyAKICB9CgoKICBmdW5jdGlvbiBfRG9BZGRQcm9wKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgICB9CgogICAgJG5hbWUgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9uYW1lJ10gKSApICRuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9uYW1lJ10pOwogICAgJHByb21wdCA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3Byb21wdCddICkgKSAkcHJvbXB0ID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSk7CiAgICAkbGVuZ3RoID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApICRsZW5ndGggPSB0cmltKCRwYXJhbXNbJ2lucHV0X2xlbmd0aCddKTsKICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfdHlwZSddKSApICR0eXBlID0gJHBhcmFtc1snaW5wdXRfdHlwZSddOwoKICAgIC8vIG5vdyBjaGVjayBldmVyeXRoaW5nIG91dAogICAgLy8gdG9kbywgYWRkIGEgbWF4aW11bSBmaWVsZCBsZW5ndGggcHJlZmVyZW5jZQogICAgaWYoICRuYW1lID09ICcnIHx8ICRwcm9tcHQgPT0gJycgfHwgJGxlbmd0aCA9PSAnJyB8fAoJJGxlbmd0aCA8IDEgfHwgJGxlbmd0aCA+IDI1NSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCRpZCwnYWRkcHJvcCcsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBhbmQgYWRkIHRoZSBwcm9lcHJ0eSBkZWZpbml0aW9uCiAgICAkcmVzdWx0ID0gJHRoaXMtPkFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoICk7CiAgICBpZiggISRyZXN1bHRbMF0gKSB7CiAgICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwogICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwogICAgICAkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRwYXJhbXMpOwogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0dG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvQWRkVXNlclN0ZXAxKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgIHsKICAgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKTsKICAgICRwYXNzd29yZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSk7CiAgICAkcmVwZWF0ICAgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwoKICAgICRyZXQgPSAkdGhpcy0+X2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlLCB0cnVlICk7CiAgICBzd2l0Y2goICRyZXQgKQogICAgICB7CiAgICAgIGNhc2UgLTE6IC8vIGVycm9yCgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRtZXNzYWdlOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZHVzZXInLCAkcGFyYW1zICk7CglyZXR1cm47CglicmVhazsKICAgICAgY2FzZSAwOiAgLy8gbm8gZXJyb3IsIGJ1dCBkb24ndCBjb250aW51ZSBvcGVyYXRpb24KCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGR1c2VyJywgJHBhcmFtcyApOwoJcmV0dXJuOwoJYnJlYWs7CiAgICAgIGNhc2UgMTogIC8vIGFsbCBpcyBnb29kLCBjb250aW51ZSBvcGVyYXRpb24KCWJyZWFrOwogICAgICB9CgoKICAgIC8vIGNvbnZlcnQgdGhlIGV4cGlyZXMgZmllbGQgdG8gYSByZWFsIHRpbWUKICAgICRleHBpcmVzID0gTlVMTDsKCiAgICAvLyBhbmQgc3RvcmUgdGhpcyBhbGwgaW4gdGhlIHBhcmFtcywgCiAgICAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddID0gJHVzZXJuYW1lOwogICAgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSA9ICRwYXNzd29yZDsKICAgICRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10gPSAkcmVwZWF0OwoKICAgIC8vIGFuZCBnbyB0byBzdGVwIDIKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMicsICRwYXJhbXMgKTsKCi8qICAgIAogLy8gYW5kIGFkZCB0aGUgdXNlcgogJHJldCA9ICR0aGlzLT5BZGRVc2VyKCAkdXNlcm5hbWUsICRlbWFpbCwgJHBhc3N3b3JkLCAkZXhwaXJlcyApOwogaWYoICRyZXRbMF0gPT0gZmFsc2UgKQogewogJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHJldFsxXSApOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwkKICAgICAgfQoKICAgICAgJHVpZCA9ICR0aGlzLT5HZXRVc2VySUQoJHVzZXJuYW1lKTsKICAgIGlmKCAkdWlkID09IGZhbHNlICkKICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJykgKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsJCiAgICAgIH0KCiAgICAvLyBhbmQgdGhlbiBhZGQgaGltIHRvIGhpcyBncm91cHMgCiAgICBpZiggYXJyYXlfa2V5X2V4aXN0c19zdWJzdHIoICRwYXJhbXMsICdtZW1iZXJvZl8nKSApCiAgICAgIHsKICAgICAgCgkkZ3JwaWRzID0gc3BsaXQoIiwiLCRwYXJhbXNbJ21lbWJlcm9mJ10pOwoJZm9yZWFjaCggJGdycGlkcyBhcyAkZ2lkICkKCXsKCSAgJHJldCA9ICR0aGlzLT5Bc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApOwoJICBpZiggJHJldCA9PSBmYWxzZSApCgkgICAgewoJICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl9jYW50YXNzaWdudXNlcicpICk7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgICByZXR1cm47CQoJICAgIH0KCX0KICAgICAgfQoKICAgIC8vIGFuZCB0aGVuIGFkZCBoaXMgcHJvcGVydGllcwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWyd1c2VycHJvcHMnXSApICkKICAgICAgewoJJHByb3BzID0gc3BsaXQoIiwiLCRwYXJhbXNbJ3VzZXJwcm9wcyddKTsKCWZvcmVhY2goICRwcm9wcyBhcyAkcHJvcCApCgl7CgkgIGxpc3QoICRrLCAkdiApID0gc3BsaXQoIj0iLCRwcm9wKTsKCSAgJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoJGssJHYsJHVpZCk7Cgl9CiAgICAgIH0KCiAgICAvLyBhbmQgd2UncmUgZG9uZQogICAgJHRoaXMtPm15UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicpOwoqLwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZFVzZXJTdGVwMiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBkbyB3ZSB3YW50IHRvIGdvIGJhY2sKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYmFjayddICkgKQogICAgICB7CgkvLyB5dXAgd2UgZG8KCSRwYXJhbXMgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOzsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGR1c2VyJywgJHBhcmFtcyApOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2NhbmNlbCddICkgKQogICAgICB7CgkvLyB5dXAgd2UgZG8KCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3VzZXJzJyApOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSBmaWVsZCBpbmZvCiAgICAkZmxkaW5mbyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrID0+ICR2ICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goJy9eaGlkZGVuXy8nLCAkayApICkKCXsKCSAgJGZsZG5hbWUgPSBzdWJzdHIoICRrLCBzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRwcm9waW5mbyA9IHNwbGl0KCc7Jywkdik7CgkgICRmbGRpbmZvWyRmbGRuYW1lXSA9ICRwcm9waW5mbzsKCX0KICAgIH0KCiAgICAvLyBub3cgZ2V0IGVhY2ggb2YgdGhlIGZpZWxkcwogICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrID0+ICR2ICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goJy9eaW5wdXRfLycsICRrICkgKQoJewoJICAkZmxkbmFtZSA9IHN1YnN0ciggJGssIHN0cmxlbignaW5wdXRfJykpOwoJICAkZmllbGRzWyRmbGRuYW1lXSA9ICR2OyAKCX0KICAgIH0KCiAgICAvLyBub3cgdmFsaWRhdGUKICAgIGZvcmVhY2goICRmbGRpbmZvIGFzICRuYW1lID0+ICR2YWwgKQogICAgewogICAgICAvLyBwcm9jZXNzIGVtcHR5IHJlcXVpcmVkIGZpZWxkcwogICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGVtcHR5IG9wdGlvbmFsIG9uZXMKICAgICAgaWYoICR2YWxbM10gPT0gMiAmJiAoIWlzc2V0KCAkZmllbGRzWyRuYW1lXSApIHx8ICRmaWVsZHNbJG5hbWVdID09ICcnKSApCgl7CgkgIC8vIGEgcmVxdWlyZWQgZmllbGQgaXMgZW1wdHkKCSAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApKTsKCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5nX3JlcXVpcmVkX3BhcmFtJywkbmFtZSk7CgkgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMicsICRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQoKICAgICAgLy8gdmFsaWRhdGUgZmlsbGVkIGluIGZpZWxkcwogICAgICBpZiggaXNzZXQoICRmaWVsZHNbJG5hbWVdICkgKQoJewoJICBzd2l0Y2goICR2YWxbMV0gKQoJICAgIHsKCSAgICBjYXNlIDA6IC8vIHRleHQKCSAgICAgIC8vIG5vdCBtdWNoIHdlIGNhbiBkbyB0byB2YWxpZGF0ZSBhIHRleHQgZmllbGQuCgkgICAgICBicmVhazsKCSAgICBjYXNlIDE6IC8vIGNoZWNrYm94CgkgICAgICAvLyBvciBhIGNoZWNrYm94CgkgICAgICBicmVhazsKCSAgICBjYXNlIDI6IC8vIGVtYWlsCgkgICAgICAvLyBlbWFpbCBhZGRyZXNzZXMgY2FuIGJlIHZhbGlkYXRlZCB0aG91Z2gKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIGZpcnN0IHN0ZXAKICAgICRwYXJtczEgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOwogICAgCiAgICAvLyBhbmQgbWVyZ2UgZW0gaW50byAkcGFyYW1zIHNvIHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIgYWNjb3VudAogICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkcGFybXMxICk7CgogICAgLy8gbm93IGZpbmQgb3V0IHdoaWNoIGdyb3VwcyBoZSdzIGEgbWVtYmVyIG9mCiAgICAkbWVtYmVyb2YgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXm1lbWJlcm9mXy8nLCAkayApICkKCXsKCSAgJG1lbWJlcm9mW10gPSAkcGFyYW1zWyRrXTsKCX0KICAgIH0KCiAgICAvLyBub3cgd2UgY2FuIGFjdHVhbGx5IGFkZCB0aGUgdXNlcgogICAgJHJldCA9ICR0aGlzLT5BZGRVc2VyKCAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddLCAKCQkgICAgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSwKCQkgICAgJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmV0WzFdOwoJICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcGFyYW1zICk7CgkgIHJldHVybjsKICAgICAgfQogICAgJHVpZCA9ICRyZXRbMV07CgogICAgLy8gYW5kIGFkZCBoaW0gdG8gaGlzIGdyb3VwcwogICAgZm9yZWFjaCggJG1lbWJlcm9mIGFzICRtZW0gKQogICAgewogICAgICBpZiggISR0aGlzLT5Bc3NpZ25Vc2VyVG9Hcm91cCggJHJldFsxXSwgJG1lbSApICkKCXsKCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkZ3JvdXBpZCcsJG1lbSk7CgkgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMicsICRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGFuZCBhZGQgaGlzIHByb3BlcnRpZXMKICAgIGZvcmVhY2goICRmaWVsZHMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoICRrLCAkdiwgJHVpZCApOwogICAgICBpZiggJHJldCA9PSBmYWxzZSApCgl7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHBhcmFtcyApOwoJICByZXR1cm47Cgl9CiAgICB9CgogICAgLy8gYW5kIHRoYXQgc2hvdWxkIGJlIGl0CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICd1c2VycycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9EZWxldGVHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2dyb3VwX2lkJ10pIHx8ICRwYXJhbXNbJ2dyb3VwX2lkJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9ICAKCiAgICAkcmV0ID0gJHRoaXMtPkRlbGV0ZUdyb3VwRnVsbCggJHBhcmFtc1snZ3JvdXBfaWQnXSApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJHJldFsxXSApOwoJcmV0dXJuOwogICAgICB9CiAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0RlbGV0ZVByb3BlcnR5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1sncHJvcG5hbWUnXSApICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2VudHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXMpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IHJlYWR5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkKICAgICRyZXN1bHQgPSAkdGhpcy0+RGVsZXRlUHJvcGVydHlEZWZuKCAkcGFyYW1zWydwcm9wbmFtZSddICk7CiAgICBpZiggISRyZXN1bHQgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2NvdWxkbm90ZGVsZXRlcHJvcGVydHknKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb21wZXJ0aWVzJywkcGFyYW1zKTsKICB9CgoKICBmdW5jdGlvbiBfRG9EZWxldGVVc2VyKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYgKCFpc3NldCAoJHBhcmFtc1sndXNlcl9pZCddKSB8fCAkcGFyYW1zWyd1c2VyX2lkJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9ICAKCiAgICAkcmV0ID0gJHRoaXMtPkRlbGV0ZVVzZXJGdWxsKCAkcGFyYW1zWyd1c2VyX2lkJ10gKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRyZXRbMV0gKTsKCXJldHVybjsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9FZGl0R3JvdXAoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJyApOwogICAgfQoKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2dyb3VwX2lkJ10pIHx8ICRwYXJhbXNbJ2dyb3VwX2lkJ10gPT0gIiIpCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2VkaXRncm91cCcsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfSAgCgogICAgJGdyb3VwbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSApICkKICAgICAgewoJJGdyb3VwbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfZ3JvdXBuYW1lJ10pOwogICAgICB9CiAgICAkZ3JvdXBkZXNjID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddICkgKQogICAgICB7CgkkZ3JvdXBkZXNjID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cGRlc2MnXSk7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgaWYoICRncm91cG5hbWUgPT0gJycgfHwgJGdyb3VwZGVzYyA9PSAnJyApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdlZGl0Z3JvdXAnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmV0ID0gJHRoaXMtPlNldEdyb3VwKCAkcGFyYW1zWydncm91cF9pZCddLCAkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSwKCQkJICAgICRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRyZXRbMV0gKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFsc28gYWRkIHRoZSBwcm9wZXJ0eSBjaG9pY2VzCiAgICAkdGhpcy0+RGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJHBhcmFtc1snZ3JvdXBfaWQnXSApOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaW5wdXRfcmVxdWlyZWRfLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0cigka2V5LHN0cmxlbignaW5wdXRfcmVxdWlyZWRfJykpOwoJfQogICAgICBlbHNlIAoJewoJICBjb250aW51ZTsKCX0KICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9zb3J0b3JkZXJfJy4kcHJvcG5hbWVdICkgKQoJewoJICAkc29ydG9yZGVyID0gJHBhcmFtc1snaW5wdXRfc29ydG9yZGVyXycuJHByb3BuYW1lXTsKCX0KICAgICAgaWYoICR2YWwgIT0gMCAmJiAkcHJvcG5hbWUgIT0gJycgKQoJewoJICAkdGhpcy0+QWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkcGFyYW1zWydncm91cF9pZCddLCAkcHJvcG5hbWUsICRzb3J0b3JkZXIsICR2YWwgKTsKCX0KICAgIH0KCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9FZGl0UHJvcGVydHkoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJG5hbWUgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfbmFtZSddICkgKSAKICAgICAgewoJJG5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X25hbWUnXSk7IAoJJG5hbWUgPSBzdHJ0b2xvd2VyKHByZWdfcmVwbGFjZSgnLyAvJywnXycsJG5hbWUpKTsKICAgICAgfQogICAgJHByb21wdCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSApICkgJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOyAKICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3R5cGUnXSApICkgJHR5cGUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3R5cGUnXSk7IAogICAgJGxlbmd0aCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSApICkgJGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10pOyAKCiAgICBpZiggJG5hbWUgPT0gJycgfHwgJHByb21wdCA9PSAnJykKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwnYWRkcHJvcCcsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmVzID0gJHRoaXMtPlNldFByb3BlcnR5RGVmbiggJHBhcmFtc1sncHJvcG5hbWUnXSwgJG5hbWUsICRwcm9tcHQsICRsZW5ndGgsICR0eXBlICk7CiAgICBpZiggJHJlcyA9PSBmYWxzZSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2RiZXJyb3InKTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCdhZGRwcm9wJywkcGFyYW1zKTsKCXJldHVybjsKICAgICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCdwcm9wZXJ0aWVzJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvRWRpdFVzZXJTdGVwMSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBhcmUgd2UgY2FuY2VsbGluZwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICAgIHsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAndXNlcnMnICk7CiAgICAgIH0KCiAgICBpZiAoICFpc3NldCgkcGFyYW1zWyd1c2VyX2lkJ10pICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICAkdXNlcl9pZCAgID0gdHJpbSgkcGFyYW1zWyd1c2VyX2lkJ10pOwogICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKTsKICAgICRwYXNzd29yZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSk7CiAgICAkcmVwZWF0ICAgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwogICAgJHByb3BuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wcm9wbmFtZSddKTsKICAgICRwcm9wbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvcHZhbHVlJ10pOwoKICAgICRyZXQgPSAkdGhpcy0+X2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlLCBmYWxzZSApOwogICAgc3dpdGNoKCAkcmV0ICkKICAgICAgewogICAgICBjYXNlIC0xOiAvLyBlcnJvcgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICRtZXNzYWdlICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkVkaXRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICBjYXNlIDA6ICAvLyBubyBlcnJvciwgYnV0IGRvbid0IGNvbnRpbnVlIG9wZXJhdGlvbgoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsKICAgICAgY2FzZSAxOiAgLy8gYWxsIGlzIGdvb2QsIGNvbnRpbnVlIG9wZXJhdGlvbgoJYnJlYWs7CiAgICAgIH0KCiAgICAvLyBsb2FkIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwCiAgICAvLyBmb3IgdGhlIG5leHQgcGFnZQogICAgJHByb3BzID0gJHRoaXMtPkdldFVzZXJQcm9wZXJ0aWVzKCAkdXNlcl9pZCApOwogICAgZm9yZWFjaCggJHByb3BzIGFzICRwcm9wICkKICAgIHsKICAgICAgJHBhcmFtc1snaW5wdXRfJy4kcHJvcFsndGl0bGUnXV0gPSAkcHJvcFsnZGF0YSddOwogICAgfQoKICAgIC8vIEFuZCBHbyB0byBzdGVwIDIKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19lZGl0dXNlcjInLCAkcGFyYW1zICk7CgogIH0KCgogIGZ1bmN0aW9uIF9Eb0VkaXRVc2VyU3RlcDMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gZG8gd2Ugd2FudCB0byBnbyBiYWNrCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2JhY2snXSApICkKICAgICAgewoJLy8geXVwIHdlIGRvCgkkcGFyYW1zID0gZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKTs7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZWRpdHVzZXInLCAkcGFyYW1zICk7CiAgICAgIH0KCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd1c2VyX2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSBmaWVsZCBpbmZvCiAgICAkZmxkaW5mbyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrID0+ICR2ICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goJy9eaGlkZGVuXy8nLCAkayApICkKCXsKCSAgJGZsZG5hbWUgPSBzdWJzdHIoICRrLCBzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRwcm9waW5mbyA9IHNwbGl0KCc7Jywkdik7CgkgICRmbGRpbmZvWyRmbGRuYW1lXSA9ICRwcm9waW5mbzsKCX0KICAgIH0KCiAgICAvLyBub3cgZ2V0IGVhY2ggb2YgdGhlIGZpZWxkcwogICAgJGZpZWxkcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrID0+ICR2ICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goJy9eaW5wdXRfLycsICRrICkgKQoJewoJICAkZmxkbmFtZSA9IHN1YnN0ciggJGssIHN0cmxlbignaW5wdXRfJykpOwoJICAkZmllbGRzWyRmbGRuYW1lXSA9ICR2OyAKCX0KICAgIH0KCiAgICAvLyBub3cgdmFsaWRhdGUKICAgIGZvcmVhY2goICRmbGRpbmZvIGFzICRuYW1lID0+ICR2YWwgKQogICAgewogICAgICAvLyBwcm9jZXNzIGVtcHR5IHJlcXVpcmVkIGZpZWxkcwogICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGVtcHR5IG9wdGlvbmFsIG9uZXMKICAgICAgaWYoICR2YWxbM10gPT0gMiAmJiAoIWlzc2V0KCAkZmllbGRzWyRuYW1lXSApIHx8ICRmaWVsZHNbJG5hbWVdID09ICcnKSApCgl7CgkgIC8vIGEgcmVxdWlyZWQgZmllbGQgaXMgZW1wdHkKCSAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApKTsKCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5nX3JlcXVpcmVkX3BhcmFtJywkbmFtZSk7CgkgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkb19hZGR1c2VyMicsICRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQoKICAgICAgLy8gdmFsaWRhdGUgZmlsbGVkIGluIGZpZWxkcwogICAgICBpZiggaXNzZXQoICRmaWVsZHNbJG5hbWVdICkgKQoJewoJICBzd2l0Y2goICR2YWxbMV0gKQoJICAgIHsKCSAgICBjYXNlIDA6IC8vIHRleHQKCSAgICAgIC8vIG5vdCBtdWNoIHdlIGNhbiBkbyB0byB2YWxpZGF0ZSBhIHRleHQgZmllbGQuCgkgICAgICBicmVhazsKCSAgICBjYXNlIDE6IC8vIGNoZWNrYm94CgkgICAgICAvLyBvciBhIGNoZWNrYm94CgkgICAgICBicmVhazsKCSAgICBjYXNlIDI6IC8vIGVtYWlsCgkgICAgICAvLyBlbWFpbCBhZGRyZXNzZXMgY2FuIGJlIHZhbGlkYXRlZCB0aG91Z2gKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIGZpcnN0IHN0ZXAKICAgICRwYXJtczEgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOwogICAgCiAgICAvLyBhbmQgbWVyZ2UgZW0gaW50byAkcGFyYW1zIHNvIHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIgYWNjb3VudAogICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkcGFybXMxICk7CgogICAgLy8gbm93IGZpbmQgb3V0IHdoaWNoIGdyb3VwcyBoZSdzIGEgbWVtYmVyIG9mCiAgICAkZ3JwaWRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15tZW1iZXJvZl8vJywgJGsgKSApCgl7CgkgICRncnBpZHNbXSA9ICRwYXJhbXNbJGtdOwoJfQogICAgfQoKICAgICR1c2VyX2lkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHVzZXJfaWQgPSAkcGFyYW1zWyd1c2VyX2lkJ107CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkcmV0WzFdICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ107CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgJiYgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSAhPSAnJyApCiAgICAgIHsKCSRwYXNzd29yZCA9ICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ107CiAgICAgIH0KICAgICRleHBpcmVzID0gc3RydG90aW1lKCcrMTAgeWVhcnMnLCB0aW1lKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddICkgKQogICAgICB7CgkkZXhwaXJlc2RhdGUgPSAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddOwogICAgICB9CgogICAgLy8gYW5kIFNldCB0aGUgdXNlcgogICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyKCAkdXNlcl9pZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkcmV0WzFdICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgLy8gYW5kIHRoZW4gYWRkIGhpbSB0byBoaXMgZ3JvdXBzCiAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJHcm91cHMoICR1c2VyX2lkLCAkZ3JwaWRzICk7CiAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfY2FudGFzc2lnbnVzZXInKSApOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwkKICAgICAgfSAKCiAgICAvLyBhbmQgdGhlbiBhZGQgaGlzIHByb3BlcnRpZXMKICAgICR0aGlzLT5EZWxldGVVc2VyUHJvcGVydHlGdWxsKCAiIiwgJHVzZXJfaWQsIHRydWUgKTsKICAgIGZvcmVhY2goICRmaWVsZHMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoICRrLCAkdiwgJHVzZXJfaWQgKTsKICAgICAgaWYoICRyZXQgPT0gZmFsc2UgKQoJewoJICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPmxhbmcoJ2Vycm9yJyk7CgkgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGFuZCB3ZSdyZSBkb25lCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3VzZXJzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0ZvcmdvdFBhc3N3b3JkKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSAgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQogICAgCiAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgdGhpcyB1c2VyCiAgICAkdWlkID0gJHRoaXMtPkdldFVzZXJJRCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApOwogICAgaWYoICEkdWlkICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZm9yZ290cHcnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBzZWUgaWYgd2UgY2FuIGRpZyB1cCBhbiBlbWFpbCBhZGRyZXNzIGZvciBoaW0KICAgICRlbWFpbCA9IGZhbHNlOwogICAgJGRlZm5zID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbnMoKTsKICAgICRwcm9wcyA9ICR0aGlzLT5HZXRVc2VyUHJvcGVydGllcyggJHVpZCApOwogICAgaWYoICRwcm9wcyApIAogICAgICB7CgkvLyB3ZSBoYXZlIHByb3BlcnRpZXMgZm9yIHRoaXMgdXNlcgoJLy8gbm93IHNlZSBpZiB3ZSBoYXZlIGFuIGVtYWlsIGZpZWxkCgkvLyB3ZSdyZSBnb25uYSBpdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgdGlsbCBvbmUgaXMgYW4gZW1haWwgdHlwZQoJLy8gdGhlbiB3ZSdyZSBnb25uYSBhc2sgdGhlIHVzZXIgaWYgdGhpcyBpcyB0aGUgcmlnaHQgYWRkcmVzcy4uCglmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3BlICkKCXsKCSAgZm9yZWFjaCggJGRlZm5zIGFzICRkZWZuZSApCgkgIHsKCSAgICBpZiggJHByb3BlWyd0aXRsZSddID09ICRkZWZuZVsnbmFtZSddICYmICRkZWZuZVsndHlwZSddID09IDIgJiYgJGVtYWlsID09IGZhbHNlICkKCSAgICAgIHsKCQkvLyBmb3VuZCBhIG1hdGNoIGFuZCBpdCdzIGFuIGVtYWlsIGZpZWxkCgkJJGVtYWlsID0gJHByb3BlWydkYXRhJ107CgkJYnJlYWs7CgkgICAgICB9CgkgIH0KCgkgIGlmKCAkZW1haWwgIT0gZmFsc2UgKQoJICAgIHsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KCglpZiggJGVtYWlsICkKCSAgewoJICAgICRjbXNtYWlsZXIgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0NNU01haWxlcicpOwoJICAgIGlmKCAhJGNtc21haWxlciApCgkgICAgICB7CgkJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX25vbWFpbGVybW9kdWxlJyk7CgkJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHBhcmFtcyApOwoJCXJldHVybjsKCSAgICAgIH0KCgkgICAgLy8gd2UgZm91bmQgYW5lIG1haWwgYWRkcmVzcwoJICAgIC8vIGdlbmVyYXRlIGEgY29kZSwgYW5kIHN0b3JlIGl0IHNvbWVwbGFjZQoJICAgIC8vIGJ1dCB0aGF0IG1lYW5zIHdlIGdvdHRhIGNsZWFuIHRoZXNlIHRoaW5ncyB1cAoJICAgIC8vIGZyb20gdGltZSB0byB0aW1lLgoJICAgICRjb2RlID0gJHRoaXMtPkdlbmVyYXRlUmFuZG9tUHJpbnRhYmxlU3RyaW5nKCk7CgkgICAgaWYoICEkdGhpcy0+U2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApICkKCSAgICAgIHsKCQkkcGFyYW1zWydlcnJvciddID0gMTsKCQkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcmVzZXRhbHJlYWR5c2VudCcpOwoJCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRwYXJhbXMgKTsKCQlyZXR1cm47CgkgICAgICB9CgoJICAgIC8vIHNlbmQgb3VyIGZ1bmt5IGVtYWlsCgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnLAoJCQkJICAkdGhpcy0+TGFuZygnbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsJykpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2NvZGUnLCR0aGlzLT5MYW5nKCdtZXNzYWdlX2NvZGUnKSk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhX2NvZGUnLCRjb2RlKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9saW5rJywkdGhpcy0+TGFuZygncHJvbXB0X2xpbmsnKSk7CgkgICAgJHBhcm1zID0gYXJyYXkoICdpbnB1dF91aWQnID0+ICR1aWQsICdpbnB1dF9jb2RlJyA9PiAkY29kZSApOwoJICAgICRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCd2ZXJpZnljb2RlJywkcmV0dXJuaWQsJycsJHBhcm1zLCAnJywgdHJ1ZSk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhX2xpbmsnLAoJCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ3ZlcmlmeWNvZGUnLCRyZXR1cm5pZCwkbGluaywkcGFybXMpKTsKCSAgICAkYm9keSA9ICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nKTsKCgkgICAgJGNtc21haWxlci0+QWRkQWRkcmVzcyggJGVtYWlsICk7CgkgICAgJGNtc21haWxlci0+U2V0Qm9keSggJGJvZHkgKTsKCSAgICAkY21zbWFpbGVyLT5Jc0hUTUwodHJ1ZSk7CgkgICAgJGNtc21haWxlci0+U2V0U3ViamVjdCgkdGhpcy0+TGFuZygnbG9zdHBhc3N3b3JkX2VtYWlsc3ViamVjdCcpKTsKCSAgICAkY21zbWFpbGVyLT5TZW5kKCk7CgoJICAgIC8vIGFuZCB0ZWxsIHRoZSB1c2VyIHNvbWV0aGluZwoJICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnLCRlbWFpbCk7CgkgICAgJHBhcmFtc1snc2tpcGZvcm1kaXNwbGF5J10gPSAxOwoJICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRwYXJhbXMgKTsKCSAgICByZXR1cm4gMTsKCSAgfQogICAgICB9CgogICAgLy8gd2UgZm91bmQgbm8gZW1haWwgYWRkcmVzcwogICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CiAgICAkcGFyYW1zWydtZXNhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9jb3VsZG5vdGZpbmRlbWFpbCcpOwogICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHBhcmFtcyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0xvZ2luKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3VzZXJuYW1lJyk7CgkkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CiAgICAgIH0KCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NpbmdwYXNzd29yZCcpOwoJJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IHZhbGlkYXRlIHRoZSBwYXNzd29yZCBhbmQgdXNlcm5hbWUKICAgICRyZXN1bHQgPSAkdGhpcy0+TG9naW4oICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10sICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gKTsKICAgIGlmKCAkcmVzdWx0WzBdID09IGZhbHNlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICRyZXN1bHRbMV07CgkkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB3ZSdyZSBsb2dnZWQgaW4KICAgIC8vIHJlZGlyZWN0IHNvbWV3aGVyZSAKICAgIC8vIHRvZG8sIGFkZCBtb3JlIG9wdGlvbnMgaGVyZS4KICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydyZXR1cm50byddICkgKQogICAgICB7CgkkcGFnZSA9ICRwYXJhbXNbJ3JldHVybnRvJ107CiAgICAgIH0KICAgIGlmKCAkcGFnZSApCiAgICAgIHsKCSRpZCA9IENvbnRlbnRNYW5hZ2VyOjpHZXRQYWdlSURGcm9tQWxpYXMoICRwYWdlICk7CglpZiggJGlkICkKCSAgewoJICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRpZCApOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CiAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkcmV0dXJuaWQgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9Mb2dvdXQoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPkxvZ291dCgpOwoKICAgIC8vIHdlJ3JlIGxvZ2dlZCBvdXQKICAgIC8vIHJlZGlyZWN0IHNvbWV3aGVyZSAKICAgIC8vIHRvZG8sIGFkZCBtb3JlIG9wdGlvbnMgaGVyZS4KICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1sncmV0dXJudG8nXSApICkKICAgICAgewoJJHBhZ2UgPSAkcGFyYW1zWydyZXR1cm50byddOwogICAgICB9CiAgICBpZiggJHBhZ2UgKQogICAgICB7CgkkaWQgPSBDb250ZW50TWFuYWdlcjo6R2V0UGFnZUlERnJvbUFsaWFzKCAkcGFnZSApOwoJaWYoICRpZCApCgkgIHsKCSAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkaWQgKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCggJHJldHVybmlkICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvUmVzZXRVc2VyQWNjb3VudCggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdWlkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VpZCddICkgKQogICAgICB7CgkkdWlkID0gdHJpbSgkcGFyYW1zWydpbnB1dF91aWQnXSk7CiAgICAgIH0KICAgICRjb2RlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2NvZGUnXSApICkKICAgICAgewoJJGNvZGUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2NvZGUnXSk7CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgKQogICAgICB7CgkkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgICB9CiAgICAkcmVwZWF0cGFzc3dvcmQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSApICkKICAgICAgewoJJHJlcGVhdHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgICAgfQoKICAgIGlmKCAkcGFzc3dvcmQgPT0gJycgfHwgJHJlcGVhdHBhc3N3b3JkID09ICcnIHx8IAoJJHBhc3N3b3JkICE9ICRyZXBlYXRwYXNzd29yZCB8fCAhJHRoaXMtPklzVmFsaWRQYXNzd29yZCgkcGFzc3dvcmQpKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFzc3dvcmQnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICd2ZXJpZnljb2RlJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IHdlIGhhdmUgdG8gdmVyaWZ5IHRoZSBjb2RlCiAgICAkcmVzdWx0ID0gJHRoaXMtPkdldFVzZXJUZW1wQ29kZSggJHVpZCApOwogICAgaWYoICRyZXN1bHRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXN1bHRbMV07CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAndmVyaWZ5Y29kZScsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQogICAgJGRiY29kZSA9ICRyZXN1bHRbMV1bJ2NvZGUnXTsKCiAgICBpZiggJGRiY29kZSAhPSAkY29kZSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRjb2RlJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAndmVyaWZ5Y29kZScsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHdoZXcsIHdlIGdvdCBpdC4uLiBub3cgd2UgY2FuIHJlc2V0IHRoZSBwYXNzd29yZAogICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApOwogICAgaWYoICRyZXRbMF0gIT0gVFJVRSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHJldFsxXTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICd2ZXJpZnljb2RlJywgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gYW5kIGRlbGV0ZSB0aGUgY29kZQogICAgJHRoaXMtPlJlbW92ZVVzZXJUZW1wQ29kZSggJHVpZCApOwoKICAgIC8vIGFuZCBkaXNwbGF5IGEgbmljZSB3YXJtIGZ1enp5IG1lc3NhZ2UKICAgIC8vIHRvZG8KICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JyApOwogICAgYnJlYWs7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRDaGFuZ2VTZXR0aW5nc1RlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScsICR0aGlzLT5kZmx0X2NoYW5nZXNldHRpbmdzdGVtcGxhdGUpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSk7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvU2V0Rm9yZ290UFdUZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRzJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMSk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMik7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmR2ZXJpZnlmb3JtJywkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMyk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScsICRwYXJhbXNbJ3RlbXBsYXRlY29udGVudDEnXSk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQyJ10pOzsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQzJ10pOzsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZScgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9TZXRMb2dpblRlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScsICR0aGlzLT5kZmx0X2xvZ2luZm9ybXRlbXBsYXRlKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfbG9naW5mb3JtJywgJHBhcmFtc1sndGVtcGxhdGVsb2dpbmZvcm0nXSk7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnbG9naW50ZW1wbGF0ZScgKTsKICB9CgogIAogIGZ1bmN0aW9uIF9Eb1NldExvZ291dFRlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ291dGZvcm0nLCAkdGhpcy0+ZGZsdF9sb2dvdXRmb3JtdGVtcGxhdGUpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJywgJHBhcmFtc1sndGVtcGxhdGVsb2dvdXRmb3JtJ10pOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2xvZ291dHRlbXBsYXRlJywgJHBhcmFtcyk7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRQcmVmcyggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlbW92ZWFsbCddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctNSB5ZWFycycpOwoJcmV0dXJuOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmUxd2VlayddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctMSB3ZWVrJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3ByZWZzJyk7CiAgICAgIH0KCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlbW92ZTFtb250aCddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctMSBtb250aCcpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycpOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycgKTsKICAgICAgfQoKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtaW5fcGFzc3dvcmRsZW5ndGgnLCRwYXJhbXNbJ2lucHV0X21pbnB3bGVuJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcsJHBhcmFtc1snaW5wdXRfbWF4cHdsZW4nXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJywkcGFyYW1zWydpbnB1dF9taW51bmxlbiddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnLCRwYXJhbXNbJ2lucHV0X21heHVubGVuJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3VzZXJfc2Vzc2lvbl9leHBpcmVzJywgJHBhcmFtc1snaW5wdXRfc2Vzc2lvbnRpbWVvdXQnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcsICRwYXJhbXNbJ2lucHV0X2RmbHRncm91cCddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkb19zbXRwX3ZhbGlkYXRlX2VtYWlsJywgJHBhcmFtc1snaW5wdXRfc210cHZhbGlkYXRlJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsICRwYXJhbXNbJ2lucHV0X3JlcXVpcmVkZmllbGRtYXJrZXInXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCAkcGFyYW1zWydpbnB1dF9yZXF1aXJlZGZpZWxkY29sb3InXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcsICRwYXJhbXNbJ2lucHV0X3JlcXVpcmVvbmVncm91cCddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJywgJHBhcmFtc1snaW5wdXRfaGlkZGVuZmllbGRtYXJrZXInXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywgJHBhcmFtc1snaW5wdXRfaGlkZGVuZmllbGRjb2xvciddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRmb3Jnb3RwYXNzd2QnLCAkcGFyYW1zWydpbnB1dF9mb3Jnb3Rwd19wYWdlJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycsICRwYXJhbXNbJ2lucHV0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJywgJHBhcmFtc1snaW5wdXRfbG9naW5fcGFnZSddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9nb3V0JywgJHBhcmFtc1snaW5wdXRfbG9nb3V0X3BhZ2UnXSk7CiAgICAKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJlZnMnKTsKICB9CgogIAogIGZ1bmN0aW9uIF9Eb1NldFByb3BlcnRpZXMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJLy8gd2UgYXJlIGNhbmNlbGxpbmcKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIgKCRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgICAgIH0KCiAgICAvLyBjaGVjayBpZiB3ZSBhcmUgYWRkaW5nIGEgcHJvcGVydHkKICAgIGlmKCBpc3NldCggJHBhcmFtc1sncHJvcGFkZCddICkgKQogICAgICB7CgkvLyB5dXAKCS8vIHZhbGlkYXRlIGZpZWxkcwoJJG5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X25hbWUnXSk7CgkkbmFtZSA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvIC8nLCdfJywkbmFtZSkpOwoJJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOwoJJGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10pOwoJJHR5cGUgPSAkcGFyYW1zWydpbnB1dF90eXBlJ107CgoJaWYoICRuYW1lID09ICcnIHx8ICRwcm9tcHQgPT0gJycgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKTsKCSAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJywgJHBhcmFtcyApOwoJICAgIHJldHVybjsKCSAgfQoKCWlmKCBpc3NldCgkcGFyYW1zWydwcm9wZGVmbiddKSApCgkgIHsKCSAgICAkcHJvcHMgPSBzcGxpdCgiLCIsJHBhcmFtc1sncHJvcGRlZm4nXSk7CgkgICAgZm9yZWFjaCggJHByb3BzIGFzICRwcm9wICkKCSAgICB7CgkgICAgICBsaXN0KCAkZW5hbWUsICRlcHJvbXB0LCAkZXR5cGUsICRlbGVuZ3RoICkgPSBzcGxpdCgiOyIsJHByb3ApOwoJICAgICAgaWYoICRuYW1lID09ICRlbmFtZSApIAoJCXsKCQkgIC8vIG5hbWUgaXMgYWxyZWFkeSB0YWtlbgoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfZHVwbGljYXRlbmFtZScpOwoJCSAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAncHJvcGVydGllcycsICRwYXJhbXMgKTsKCQkgIHJldHVybjsKCQl9CgkgICAgfQoJICB9CgoJJGVudHJ5ID0gaW1wbG9kZSgiOyIsYXJyYXkoJG5hbWUsJHByb21wdCwkdHlwZSwkbGVuZ3RoKSk7CglpZiggaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkpCgkgIHsKCSAgICAkcGFyYW1zWydwcm9wZGVmbiddIC49ICIsIi4kZW50cnk7CgkgIH0KCWVsc2UgCgkgIHsKCSAgICAkcGFyYW1zWydwcm9wZGVmbiddID0gJGVudHJ5OwoJICB9CgkkcGFyYW1zWydkb25vdGxvYWRwcm9wcyddID0gMTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UgaWYoIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkcGFyYW1zLCAncHJvcGVkaXRfJykgJiYgaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkpCiAgICAgIHsKCSRrID0gYXJyYXlfZmluZF9rZXlfcmVnZXhwKCAkcGFyYW1zLCAnL15wcm9wZWRpdF8vJyApOwoJJHBvczEgPSBzdHJwb3MoICRrLCAnLScgKTsKCSRwb3MyID0gc3RycnBvcyggJGssICdfJyApOwoJJGtleSAgPSBzdWJzdHIoICRrICwgJHBvczErMSwgJHBvczIgLSAkcG9zMSAtIDEpOwoKCS8vIHdlJ3JlIGVkaXRpbmcgYSBwcm9wZXJ0eQoJLy8gc28gd2UgdGFrZSB0aGUgY3VycmVudCBwcm9wZXJ0eSAoJGtleSkgYW5kIHJlbW92ZSBpdAoJLy8gZnJvbSBwcm9wcywgYW5kIHB1dCBpdCBpbiB0aGUgcGFyYW1zCgkkcHJvcHMgPSBzcGxpdCgnLCcsJHBhcmFtc1sncHJvcGRlZm4nXSk7CgkkbmV3cHJvcHMgPSAiIjsKCWZvcmVhY2goICRwcm9wcyBhcyAkcCApCgl7CgkgICRhcHJvcCA9IHNwbGl0KCI7IiwkcCk7CgkgIGlmKCAkYXByb3BbMF0gPT0gJGtleSApCgkgICAgewoJICAgICAgJHBhcmFtc1snaW5wdXRfbmFtZSddID0gJGFwcm9wWzBdOwoJICAgICAgJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gPSAkYXByb3BbMV07CgkgICAgICAkcGFyYW1zWydpbnB1dF90eXBlJ10gPSAkYXByb3BbMl07CgkgICAgICAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSA9ICRhcHJvcFszXTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgaWYoICRuZXdwcm9wcyA9PSAnJyApCgkJewoJCSAgJG5ld3Byb3BzID0gJHA7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICRuZXdwcm9wcyA9ICRuZXdwcm9wcy4iLCIuJHA7CgkJfQoJICAgIH0KCX0KCSRwYXJhbXNbJ3Byb3BkZWZuJ10gPSAkbmV3cHJvcHM7CgkkcGFyYW1zWydkb25vdGxvYWRwcm9wcyddID0gMTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UgaWYoIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkcGFyYW1zLCAncHJvcGRlbGV0ZV8nKSAmJiBpc3NldCgkcGFyYW1zWydwcm9wZGVmbiddKSkKICAgICAgewoJJGsgPSBhcnJheV9maW5kX2tleV9yZWdleHAoICRwYXJhbXMsICcvXnByb3BkZWxldGVfLycgKTsKCWxpc3QoICRqdW5rLCAka2V5ICkgPSBzcGxpdCggIl8iLCAkayApOwoKCS8vIHdlJ3JlIGRlbGV0aW5nIGEgcHJvcGVydHkKCS8vIHNvIHdlIHRha2UgdGhlIGN1cnJlbnQgcHJvcGVydHkgKCRrZXkpIGFuZCByZW1vdmUgaXQKCS8vIGZyb20gcHJvcHMsIAoJJHByb3BzID0gc3BsaXQoJywnLCRwYXJhbXNbJ3Byb3BkZWZuJ10pOwoJJG5ld3Byb3BzID0gIiI7Cglmb3JlYWNoKCAkcHJvcHMgYXMgJHAgKQoJewoJICAkYXByb3AgPSBzcGxpdCgiOyIsJHApOwoJICBpZiggJGFwcm9wWzBdID09ICRrZXkgKQoJICAgIHsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICBpZiggJG5ld3Byb3BzID09ICcnICkKCQl7CgkJICAkbmV3cHJvcHMgPSAkcDsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgJG5ld3Byb3BzID0gJG5ld3Byb3BzLiIsIi4kcDsKCQl9CgkgICAgfQoJfQoJJHBhcmFtc1sncHJvcGRlZm4nXSA9ICRuZXdwcm9wczsKCSRwYXJhbXNbJ2Rvbm90bG9hZHByb3BzJ10gPSAxOwogICAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCgogICAgLy8gd2UncmUgc3VibWl0dGluZyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMKICAgICRwcm9wcyA9IHNwbGl0KCcsJywkcGFyYW1zWydwcm9wZGVmbiddKTsKICAgICR0aGlzLT5EZWxldGVQcm9wZXJ0eURlZm5zKCk7CiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICAkYXByb3AgPSBzcGxpdCgiOyIsJHByb3ApOwoKICAgICAgJHJldCA9ICR0aGlzLT5BZGRQcm9wZXJ0eURlZm4oICRhcHJvcFswXSwgJGFwcm9wWzFdLCAkYXByb3BbMl0sICRhcHJvcFszXSApOwogICAgICBpZiggJHJldFswXSA9PSBmYWxzZSApCgl7CgkgIC8vIG5hbWUgaXMgYWxyZWFkeSB0YWtlbgoJICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnICk7CgkgIHJldHVybjsKCX0KICAgIH0KCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CiAgICByZXR1cm47CiAgfQoKCiAgZnVuY3Rpb24gX0RvVXNlckFjdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2Zvcm0nXSApICkKICAgICAgewoJc3dpdGNoKCAkcGFyYW1zWydmb3JtJ10gKSAKCSAgewoJICBjYXNlICdsb2dpbic6CgkgICAgJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCk7CgkgICAgYnJlYWs7CgkgIGNhc2UgJ2xvZ291dCc6CgkgICAgJHRoaXMtPl9HZXRVc2VyTG9nb3V0Rm9ybSgkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwoJICAgIGJyZWFrOwoJICBjYXNlICdmb3Jnb3Rwdyc6CgkgICAgJHRoaXMtPl9EaXNwbGF5VXNlckZvcmdvdFBhc3N3b3JkUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICBicmVhazsKCSAgY2FzZSAnY2hhbmdlc2V0dGluZ3MnOgoJICAgICR0aGlzLT5fRGlzcGxheVVzZXJTZXR0aW5nc1BhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgYnJlYWs7CgkgIH0KCXJldHVybjsKICAgICAgfQoKICAgIGlmKCAhJHRoaXMtPkxvZ2dlZEluKCkgKSAKICAgICAgewoJJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCk7CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5fR2V0VXNlckxvZ291dEZvcm0oJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKICAgICAgfQogIH0KCgogIGZ1bmN0aW9uIF9Eb1VzZXJDaGFuZ2VTZXR0aW5ncyggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdWlkID0gJHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmKCAkdWlkID09IGZhbHNlICkgCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vdGxvZ2dlZGluJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcmVzdWx0ID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICBpZiggJHJlc3VsdFswXSA9PSBGQUxTRSApCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHJlc3VsdFsxXSk7CglyZXR1cm47CiAgICAgIH0KICAgICR1aW5mbyA9ICRyZXN1bHRbMV07CgogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXQgICA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CiAgICBpZiggJHBhc3N3b3JkICE9ICRyZXBlYXQgJiYgJHBhc3N3b3JkICE9ICcnKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9wYXNzd29yZG1pc21hdGNoJyk7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKICAgICAgfQoKICAgIC8vIGRvIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkcy4KICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXmhpZGRlbl8vJywgJGtleSApICkKCXsKCSAgJHByb3BuYW1lID0gc3Vic3RyKCAka2V5LCBzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRhcnIgPSBzcGxpdCgiOyIsJHBhcmFtc1ska2V5XSk7CgkgICRyZXF1aXJlZCA9ICRhcnJbM107CgkgIGlmKCAkcmVxdWlyZWQgPT0gMiAmJiAKCSAgICAgICghaXNzZXQoJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdKSB8fCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0gPT0gJycgKSApCgkgICAgewoJICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcmVxdWlyZWRmaWVsZCcsJHByb3BuYW1lKTsKCSAgICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCSAgICB9CgoJICBpZiggJGFyclsxXSA9PSAnMicgKQoJICAgIHsKCSAgICAgICRyZXN1bHQgPSAkdGhpcy0+SXNWYWxpZEVtYWlsQWRkcmVzcyggJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdLAoJCQkJCQkgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnKSApOwoJICAgICAgaWYoICRyZXN1bHRbMF0gPT0gZmFsc2UgKQoJCXsKCQkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKCQkgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIC8vCiAgICAvLyBub3cgd2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB1c2VyIHNldHRpbmdzCiAgICAvLwoKICAgIC8vIHBhc3N3b3JkCiAgICBpZiggJHBhc3N3b3JkICE9ICcnKQogICAgICB7CgkkcmVzdWx0ID0gJHRoaXMtPlNldFVzZXIoICR1aWQsICR1aW5mb1sndXNlcm5hbWUnXSwgJHBhc3N3b3JkLCAkdWluZm9bJ2V4cGlyZXMnXSApOwoJaWYoICRyZXN1bHRbMF0gPT0gRkFMU0UgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKCSAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2NoYW5nZXNldHRpbmdzJywgJHJldHVybmlkLCAkcGFyYW1zICk7CgkgIH0KICAgICAgfQoKICAgIC8vIG5vdyB0aGUgcHJvcGVydGllcwogICAgJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoICIiLCAkdWlkLCB0cnVlICk7CgogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaGlkZGVuXy8nLCAka2V5ICkgKQoJewoJICAkcHJvcG5hbWUgPSBzdWJzdHIoICRrZXksIHN0cmxlbignaGlkZGVuXycpKTsKCSAgJGFyciA9IHNwbGl0KCI7IiwkcGFyYW1zWyRrZXldKTsKCSAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0gKSApCgkgICAgewoJICAgICAgJHZhbCA9ICRwYXJhbXNbJ2lucHV0XycuJHByb3BuYW1lXTsKCSAgICAgICRyZXQgPSAkdGhpcy0+U2V0VXNlclByb3BlcnR5RnVsbCggJHByb3BuYW1lLCAkdmFsLCAkdWlkICk7CgkgICAgICBpZiggJHJldCA9PSBmYWxzZSApCgkJewoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCQkgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCQkgIHJldHVybjsKCQl9CgkgICAgfQoJfQogICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmV0dXJudG8nXSApICkKICAgICAgewoJJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhcmFtc1snaW5wdXRfcmV0dXJudG8nXSApOwoJaWYoICRpZCApCgkgIHsKCSAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkaWQgKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQoKICAgIC8vIGFuZCByZWRpcmVjdCBiYWNrIHRvIGRlZmF1bHQKICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoIENvbnRlbnRNYW5hZ2VyOjpHZXREZWZhdWx0UGFnZUlEKCkgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQWRkR3JvdXBQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHByb3BkZWZuID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbnMoKTsKICAgIGlmKCBjb3VudCgkcHJvcGRlZm4pID09IDAgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX25vcHJvcGVydGllcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsICR0aGlzLT5MYW5nKCdhZGRncm91cCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N0YXJ0Zm9ybScsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgJ2RvX2FkZGdyb3VwJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfZ3JvdXBuYW1lJywKCQkJICAgJHRoaXMtPkxhbmcgKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZ3JvdXBuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfZ3JvdXBuYW1lJywKCQkJCQkJICAgIiIsIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2dyb3VwZGVzYycsCgkJCSAgICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9ncm91cGRlc2MnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9ncm91cGRlc2MnLAoJCQkJCQkgICAiIiwgODAsIDI1NSkpOyAgICAKCiAgICAvLyBkaXNwbGF5IGEgbGlzdCBvZiB0aGUgcHJvcGVydGllcyBpbiBhIGZvcm0KICAgIC8vIHRvIGFsbG93IHRoZSB1c2VyIHRvIHBpY2sgd2hpY2ggb25lcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIG9uZXMgYXJlbnQuCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT50eXBlcyk7CiAgICAkb3B0aW9ucyA9IGFycmF5KCAkdGhpcy0+TGFuZygnb2ZmJykgPT4gMCwKCQkgICAgICAkdGhpcy0+TGFuZygnb3B0aW9uYWwnKSA9PiAxLAoJCSAgICAgICR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpID0+IDIsCgkJICAgICAgJHRoaXMtPkxhbmcoJ2hpZGRlbicpID0+IDMpOwogICAgCiAgICBmb3JlYWNoKCAkcHJvcGRlZm4gYXMgJGRlZm4gKQogICAgICB7Cgkkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CiAgICAgICAgJG9uZXJvdy0+bmFtZSA9ICRkZWZuWyduYW1lJ107CiAgICAgICAgJG9uZXJvdy0+cHJvbXB0ID0gJGRlZm5bJ3Byb21wdCddOwoJJG9uZXJvdy0+dHlwZSA9ICR0aGlzLT5MYW5nKCAka2V5c1skZGVmblsndHlwZSddXSApOwoJJG9uZXJvdy0+c29ydG9yZGVyID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfc29ydG9yZGVyXycuJGRlZm5bJ25hbWUnXSwgJycsIDMsIDIgKTsKCSRvbmVyb3ctPnJlcXVpcmVkID0gJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCggJGlkLCAnaW5wdXRfcmVxdWlyZWRfJy4kZGVmblsnbmFtZSddLCAkb3B0aW9ucyApOwoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CgoJYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcHMnLCAkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wY291bnQnLGNvdW50KCRyb3dhcnJheSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzb3J0b3JkZXJ0ZXh0JywgJHRoaXMtPkxhbmcoJ3NvcnRvcmRlcicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHR0ZXh0JywgJHRoaXMtPkxhbmcoJ3Byb21wdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndHlwZXRleHQnLCR0aGlzLT5MYW5nKCd0eXBlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXF1aXJlZHRleHQnLCR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpKTsKCiAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGdyb3VwLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZGRQcm9wZXJ0eVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2VkaXRwcm9wJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2RvX2VkaXRwcm9wJywkcmV0dXJuaWQpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2hpZGRlbicsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdwcm9wbmFtZScsJHBhcmFtc1snZWRpdHByb3AnXSkpOwogICAgICB9CiAgICBlbHNlIAogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLCAKCQkJICAgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdkb19hZGRwcm9wJywkcmV0dXJuaWQpKTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZW5kZm9ybScsCgkJCSAgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydtZXNzYWdlJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRwYXJhbXNbJ21lc3NhZ2UnXSApOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2Vycm9yJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCAkcGFyYW1zWydlcnJvciddICk7CiAgICAgIH0KCiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X25hbWUnXSApICkgJG5hbWUgPSAkcGFyYW1zWydpbnB1dF9uYW1lJ107CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gKSApICRwcm9tcHQgPSAkcGFyYW1zWydpbnB1dF9wcm9tcHQnXTsKICAgICRsZW5ndGggPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSApICkgJGxlbmd0aCA9ICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddOwogICAgJHR5cGUgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF90eXBlJ10pICkgJHR5cGUgPSAkcGFyYW1zWydpbnB1dF90eXBlJ107CiAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRpbmcnXSApICkgJHRpdGxlID0gJHRoaXMtPkxhbmcoJ2VkaXRwcm9wJyk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd0aXRsZScsICR0aXRsZSApOwogICAgJGlkeCA9IGZpbmRfaW5kZXhfb2ZfdmFsdWUoJHRoaXMtPnR5cGVzLCR0eXBlLC0xKTsKICAgICR0eXBlcyA9ICR0aGlzLT5sYW5naWZ5S2V5cygkdGhpcy0+dHlwZXMpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9uYW1lJywkdGhpcy0+TGFuZygnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbmFtZScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X25hbWUnLCRuYW1lLCAzMCwgMzAgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9wcm9tcHQnLCR0aGlzLT5MYW5nKCdwcm9tcHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3Byb21wdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X3Byb21wdCcsJHByb21wdCwgMzAsIDMwICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdHlwZScsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3R5cGUnLCAgCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oICRpZCwgJ2lucHV0X3R5cGUnLCAkdHlwZXMsIAoJCQkJCQkgICAgICAkaWR4LCAkdHlwZSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbGVuZ3RoJywkdGhpcy0+TGFuZygnbGVuZ3RoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9sZW5ndGgnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9sZW5ndGgnLCRsZW5ndGgsIDMsIDMgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCiAJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZGRwcm9wLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDFQYWdlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snY2FuY2VsJ10gKSApCiAgICAgIHsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAndXNlcnMnICk7CiAgICAgIH0KCiAgICAkZ2lkID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfZ3JvdXAnLCAtMSk7CiAgICBpZiggJGdpZCAhPSAtMSApCiAgICAgIHsKCS8vIHRoZSBkZWZhdWx0IGdyb3VwIGhhcyBiZWVuIHNldAoJLy8gc28gd2UnbGwgcHV0IHRoaXMgaW4gdGhlIG1lbWJlcm9mIHBhcmFtZXRlcgoJLy8gaWYgaXQncyBub3QgYWxyZWFkeSBzZXQKCWlmKCAhaXNzZXQoICRwYXJhbXNbJ21lbWJlcm9mJ10gKSApCgkgIHsKCSAgICAkcGFyYW1zWydtZW1iZXJvZiddID0gJGdpZDsKCSAgfQogICAgICB9CgogICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddICk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQoKICAgIC8vIGNhbGN1bGF0ZSB0aGUgdW5pb24gKHllcCwgdW5pb24sIG5vdCBpbnRlcnNlY3Rpb24pCiAgICAvLyBvZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgYWxsIG9mIHRoZSBtZW1iZXIgZ3JvdXBzCiAgICAvLyBwcmVmZXJyaW5nIGFsbCBpdGVtcyB3aXRoIGEgcHJpb3JpdHkgb2YgMgogICAgJHByb3BlcnRpZXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9ebWVtYmVyb2ZfLycsICRrZXkgKSApCgl7CgkgIC8vIGdldCB0aGUgZ3JvdXBpZCBmcm9tIHRoZSBjaGVja2JveAoJICAkZ3JwaWQgPSBzdWJzdHIoJGtleSxzdHJsZW4oJ21lbWJlcm9mXycpKTsKCSAgCgkgIC8vIGhhdmUgdGhlIGdyb3VwIGlkLCBub3cgZ2V0IGEgbGlzdCBvZiB0aGUgcHJvcGVydAoJICAkcHJvcHJlbGF0aW9ucyA9ICR0aGlzLT5HZXRHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKTsKCSAgJHByb3BlcnRpZXMgPSBhcnJheV9tZXJnZV9ieV9uYW1lX3JlcXVpcmVkKCAkcHJvcGVydGllcywgJHByb3ByZWxhdGlvbnMgKTsKCSAgdWFzb3J0KCAkcHJvcGVydGllcywgJ2NvbXBhcmVfZWxlbWVudHNfYnlfc29ydG9yZGVyX2tleScgKTsKCX0KICAgIH0JICAKICAgIGlmKCBjb3VudCgkcHJvcGVydGllcykgPT0gMCApCiAgICAgIHsKCWlmKCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcpID09IDEgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX29uZWdyb3VwcmVxdWlyZWQnKTsKCSAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkdXNlcicsICRwYXJhbXMgKTsKCSAgICByZXR1cm47CgkgIH0KCQoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIzJywgJHBhcmFtcyApOwogICAgICB9CgogICAgLy8gbm93IHdlJ3JlIHJlYWR5IHRvIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwcm9wZXJ0aWVzIGFzICRwcm9wICkKICAgIHsKICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uCiAgICAgICRkZWZuID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbiggJHByb3BbJ25hbWUnXSApOwogICAgICAKICAgICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwoKICAgICAgJGNvbG9yID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJGNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVyaWVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgICBpZiggJHByb3BbJ3JlcXVpcmVkJ10gPT0gMyApICRjb2xvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfY29sb3InLCdncmVlbicpOwogICAgICAkbWFya2VyID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJG1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1cmllZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAzICkgJG1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJywnISEnKTsKICAgICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAoJHByb3BbJ3JlcXVpcmVkJ10gPT0gMik7CiAgICAgICRvbmVyb3ctPmNvbG9yICAgID0gJGNvbG9yOwogICAgICAkb25lcm93LT5tYXJrZXIgICA9ICRtYXJrZXI7CiAgICAgICRvbmVyb3ctPmhpZGRlbiA9IG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2hpZGRlbl8nLiRwcm9wWyduYW1lJ10sCgkJCQkJICAgICBpbXBsb2RlKCI7IixhcnJheSgkcHJvcFsnbmFtZSddLCRkZWZuWyd0eXBlJ10sCgkJCQkJCQkgICAgICAgJGRlZm5bJ2xlbmd0aCddLCRwcm9wWydyZXF1aXJlZCddKSkpOwoKICAgICAgJHZhbCA9IGlzc2V0KCRwYXJhbXNbJ2lucHV0XycuJHByb3BbJ25hbWUnXV0pID8gJHBhcmFtc1snaW5wdXRfJy4kcHJvcFsnbmFtZSddXSA6ICcnOwogICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107CiAgICAgIHN3aXRjaCggJGRlZm5bJ3R5cGUnXSApCgl7CgljYXNlIDA6IC8vIHRleHQKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydsZW5ndGgnXSApOwoJICBicmVhazsKCgljYXNlIDE6IC8vIGNoZWNrYm94CgkgICRvbmVyb3ctPmNvbnRyb2wgPSBteUNyZWF0ZUlucHV0Q2hlY2tib3goICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwgMSwgJHZhbCApOwoJICBicmVhazsKCgljYXNlIDI6IC8vIGVtYWlsCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF8nLiRwcm9wWyduYW1lJ10sCgkJCQkJCSAgICAgJHZhbCwgJGRlZm5bJ2xlbmd0aCddLCAkZGVmblsnbGVuZ3RoJ10gKTsKCSAgYnJlYWs7Cgl9CgogICAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsIAoJCQkgIG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ3N0ZXAxX3BhcmFtcycsICRwYXJhbXMgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udHJvbGNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdiYWNrJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdiYWNrJywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnYmFjaycpKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4yJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ3VzZXJfaWQnLCRwYXJhbXNbJ3VzZXJfaWQnXSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2VkaXR1c2VyMycsCgkJCQkJCQkgICAgICAkcmV0dXJuaWQpKTsKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2FkZHVzZXIzJywKCQkJCQkJCSAgICAgICRyZXR1cm5pZCkpOwogICAgICB9CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSggJ2FkZHVzZXIyLnRwbCcgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluVXNlclBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwoKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgaWYoICRwYXJhbXNbJ2FjdGlvbiddID09ICdlZGl0dXNlcid8fCAkcGFyYW1zWydhY3Rpb24nXSA9PSAnZG9fZWRpdHVzZXIxJyApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ3VzZXJfaWQnLCRwYXJhbXNbJ3VzZXJfaWQnXSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsICR0aGlzLT5MYW5nKCdlZGl0dXNlcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJCSAgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgICAgICdkb19lZGl0dXNlcjEnLAoJCQkJCQkJICAgICAgJHJldHVybmlkKSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsICR0aGlzLT5MYW5nKCdhZGR1c2VyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2FkZHVzZXIxJywKCQkJCQkJCSAgICAgICRyZXR1cm5pZCkpOwogICAgICB9CgogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2Vycm9yJ10pICkKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsJHBhcmFtc1snZXJyb3InXSk7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbWVzc2FnZSddKSApCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsJHBhcmFtc1snbWVzc2FnZSddKTsKICAgICR1c2VybmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pICkKICAgICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKTsKICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pICkKICAgICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pICkKICAgICAgJHJlcGVhdHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgICRleHBpcmVzID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfZXhwaXJlcyddKSApCiAgICAgICRleHBpcmVzID0gdHJpbSgkcGFyYW1zWydpbnB1dF9leHBpcmVzJ10pOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnbmV4dCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91c2VybmFtZScsCgkJCSAgICR0aGlzLT5MYW5nICgnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3VzZXJuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfdXNlcm5hbWUnLAoJCQkJCQkgICAkdXNlcm5hbWUsIDIwLCA4MCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9wYXNzd29yZCcsCgkJCSAgICR0aGlzLT5MYW5nICgncGFzc3dvcmQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkICgkaWQsICdpbnB1dF9wYXNzd29yZCcsCgkJCQkJCSAgICRwYXNzd29yZCwgMjAsIDgwKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3JlcGVhdHBhc3N3b3JkJywKCQkJICAgJHRoaXMtPkxhbmcgKCdyZXBlYXRwYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQgKCRpZCwgJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywKCQkJCQkJICAgJHJlcGVhdHBhc3N3b3JkLCAyMCwgODApKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfZXhwaXJlcycsCgkJCSAgICR0aGlzLT5MYW5nKCdleHBpcmVzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXhwaXJlc19kYXRlcHJlZml4JywgJGlkLidleHBpcmVzZGF0ZV8nKTsKICAgICRleHBpcmVzZGF0ZSA9IHN0cnRvdGltZSgnKzEwIHllYXJzJywgdGltZSgpKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSApICkKICAgICAgewoJJGV4cGlyZXNkYXRlID0gJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXhwaXJlc2RhdGUnLCAkZXhwaXJlc2RhdGUgKTsKICAgIAoKICAgIC8vIERpc3BsYXkgdGhpcyB1c2VyJ3MgcHJvcGVydGllcyBhbmQgYWxsb3cgdXMgdG8gZWRpdCB0aGVtCgogICAgLy8gZGlzcGxheSBhbmQgZWRpdCBncm91cHMKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnZWRpdGdyb3VwcycpICkKICAgICAgewoJLy8gbm93IGRpc3BsYXkgYSBsaXN0IG9mIGdyb3VwcyB0aGF0IHRoaXMgdXNlciBtYXkgb3B0aW9uYWxseSBiZSBpbgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnaWR0ZXh0JywgJHRoaXMtPkxhbmcoJ2lkJykgKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ25hbWV0ZXh0JywgJHRoaXMtPkxhbmcoJ25hbWUnKSApOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZGVzY3RleHQnLCAkdGhpcy0+TGFuZygnZGVzY3JpcHRpb24nKSApOwoJCgkkZ3JvdXBzID0gJHRoaXMtPkdldEdyb3VwTGlzdEZ1bGwoKTsKCSRyb3dhcnJheSA9IGFycmF5KCk7Cgkkcm93Y2xhc3MgPSAncm93MSc7Cglmb3JlYWNoKCAkZ3JvdXBzIGFzICRncm91cCApCgl7CgkgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKCSAgJG9uZXJvdy0+aWQgPSAkZ3JvdXBbJ2lkJ107CgkgICRvbmVyb3ctPm5hbWUgPSAkZ3JvdXBbJ2dyb3VwbmFtZSddOwoJICAkb25lcm93LT5kZXNjID0gJGdyb3VwWydncm91cGRlc2MnXTsKCSAgJG9uZXJvdy0+bWVtYmVyID0gJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCdtZW1iZXJvZl8nLiRncm91cFsnaWQnXSwKCQkJCQkJICAkZ3JvdXBbJ2lkJ10sCgkJCQkJCSAgKGlzc2V0KCRwYXJhbXNbJ21lbWJlcm9mXycuJGdyb3VwWydpZCddXSkgPyAKCQkJCQkJICAgJHBhcmFtc1snbWVtYmVyb2ZfJy4kZ3JvdXBbJ2lkJ11dIDogLTEpKTsKCSAgJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CgkgIAoJICBhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJICAoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7Cgl9CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1jb3VudCcsY291bnQoJHJvd2FycmF5KSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwogICAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wYWRkJywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCAkaWQsICdwcm9wYWRkJywgCgkJCQkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2FkZCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2dyb3Vwc3RpdGxlJywgJHRoaXMtPkxhbmcoJ2dyb3VwcycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcGVydGllc3RpdGxlJywgJHRoaXMtPkxhbmcoJ3Byb3BlcnRpZXMnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wcycsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3Byb3BzJywgJHRoaXMtPkxhbmcoJ3Byb3BlcnRpZXMnKS4iLi4uIikpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZGR1c2VyMS50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCA9IC0xKSAKICB7CiAgICBzd2l0Y2ggKCRhY3Rpb24pCiAgICAgIHsKICAgICAgY2FzZSAnYWRkZ3JvdXAnOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGRncm91cCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRHcm91cFBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2FkZHByb3AnOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdhZGRwcm9wJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFByb3BlcnR5UGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnYWRkdXNlcic6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAiY2hhbmdlc2V0dGluZ3MiOwogICAgICAgIHsKCSAgJHRoaXMtPl9EaXNwbGF5VXNlclNldHRpbmdzUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSAiZGVmYXVsdCI6IAoJewoJICAkdGhpcy0+X0RvVXNlckFjdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICJkZWZhdWx0YWRtaW4iOiAKCXsKCSAgaWYgKCR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCkpICB7CgkgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5QYW5lbCgkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwoJICB9IGVsc2UgewoJICAgIGVjaG8gIkJyZWFraW5nIGFuIGVudHJ5LCBhcmUgd2U/IjsKCSAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2FkZGdyb3VwJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkZ3JvdXAnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fYWRkcHJvcCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRQcm9wKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19hZGR1c2VyMSc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRVc2VyU3RlcDEoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIAogICAgICBjYXNlICdkb19hZGR1c2VyMic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgCiAgICAgIGNhc2UgJ2RvX2FkZHVzZXIzJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkdXNlcicgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0FkZFVzZXJTdGVwMiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZGVsZXRlZ3JvdXAnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdyZW1vdmVncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9EZWxldGVHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19kZWxldGVwcm9wJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZGVsZXRlcHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0RlbGV0ZVByb3BlcnR5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19kZWxldGV1c2VyJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAncmVtb3ZldXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9EZWxldGVVc2VyKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXRncm91cCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXRncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0R3JvdXAoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZWRpdHByb3AnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0VkaXRQcm9wZXJ0eSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19lZGl0dXNlcjEnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0dXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0VXNlclN0ZXAxKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXR1c2VyMic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXR1c2VycycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXR1c2VyMyc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXR1c2VycycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0VkaXRVc2VyU3RlcDMoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZm9yZ290cHcnOgoJewoJICAkdGhpcy0+X0RvRm9yZ290UGFzc3dvcmQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9faGFuZGxlcHJvcGVydHknOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJlZnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRQcm9wZXJ0aWVzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2xvZ2luJzoKCXsKCSAgJHRoaXMtPl9Eb0xvZ2luKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGNoYW5nZXNldHRpbmdzdGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRDaGFuZ2VTZXR0aW5nc1RlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGZvcmdvdHB3dGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRGb3Jnb3RQV1RlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGxvZ2ludGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRMb2dpblRlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGxvZ291dHRlbXBsYXRlJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAndGVtcGxhdGVzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0TG9nb3V0VGVtcGxhdGUoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fc2V0cHJlZnMnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJlZnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRQcmVmcyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb191c2VyY2hhbmdlc2V0dGluZ3MnOgoJewoJICAkdGhpcy0+X0RvVXNlckNoYW5nZVNldHRpbmdzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3ZlcmlmeWNvZGUnOgoJewoJICAkdGhpcy0+X0RvUmVzZXRVc2VyQWNjb3VudCgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2VkaXRncm91cCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXRncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluRWRpdEdyb3VwUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAKICAgICAgY2FzZSAnZWRpdHByb3AnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5FZGl0UHJvcGVydHlQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2VkaXR1c2VyJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHVzZXJzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkVkaXRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdmb3Jnb3Rwdyc6Cgl7CgkgIC8vIHVzZXIgaXRlbQoJICAkdGhpcy0+X0Rpc3BsYXlVc2VyRm9yZ290UGFzc3dvcmRQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2xvZ291dCc6Cgl7CgkgICR0aGlzLT5fRG9Mb2dvdXQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAndmVyaWZ5Y29kZSc6Cgl7CgkgICR0aGlzLT5fRGlzcGxheVVzZXJGb3Jnb3RQYXNzd29yZFZlcmlmaWNhdGlvblBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkVkaXRHcm91cFBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snZ3JvdXBfaWQnXSApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgZ2V0IHRoZSBncm91cCBpbmZvCiAgICAkZ3JvdXAgPSAkdGhpcy0+R2V0R3JvdXBJbmZvKCAkcGFyYW1zWydncm91cF9pZCddICk7CiAgICBpZiggIWlzc2V0KCAkZ3JvdXBbJ2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkZ3JvdXBbMV0gKTsKCQkJCSAKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsICR0aGlzLT5MYW5nKCdlZGl0Z3JvdXAnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnZ3JvdXBfaWQnLCAkZ3JvdXBbJ2lkJ10gKSApOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19lZGl0Z3JvdXAnLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfZ3JvdXBuYW1lJywkdGhpcy0+TGFuZygnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2dyb3VwbmFtZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2dyb3VwbmFtZScsCgkJCQkJCSAgICRncm91cFsnZ3JvdXBuYW1lJ10sIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2dyb3VwZGVzYycsCgkJCSAgICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9ncm91cGRlc2MnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9ncm91cGRlc2MnLAoJCQkJCQkgICAkZ3JvdXBbJ2dyb3VwZGVzYyddLCA4MCwgMjU1KSk7CgogICAgLy8gZGlzcGxheSBhIGxpc3Qgb2YgdGhlIHByb3BlcnRpZXMgaW4gYSBmb3JtCiAgICAvLyB0byBhbGxvdyB0aGUgdXNlciB0byBwaWNrIHdoaWNoIG9uZXMgYXJlIHJlcXVpcmVkIGFuZCB3aGljaCBvbmVzIGFyZW50LgogICAgJHByb3BkZWZuID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbnMoKTsKICAgICRncm91cHByb3BtYXAgPSAkdGhpcy0+R2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdyb3VwWydpZCddICk7CiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT50eXBlcyk7CiAgICAkb3B0aW9ucyA9IGFycmF5KCAkdGhpcy0+TGFuZygnb2ZmJykgPT4gMCwKCQkgICAgICAkdGhpcy0+TGFuZygnb3B0aW9uYWwnKSA9PiAxLAoJCSAgICAgICR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpID0+IDIsCgkJICAgICAgJHRoaXMtPkxhbmcoJ2hpZGRlbicpID0+IDMpOwogICAgZm9yZWFjaCggJHByb3BkZWZuIGFzICRkZWZuICkKICAgICAgewoJLy8gZmluZCB0aGUgZ3JvdXAgcHJvcGVydHkgbWFwIGZvciB0aGlzIGdyb3VwCgkvLyBpZiBpdCBleGlzdHMsIGlmIGl0IGRvZXNuJ3QsIHRoZW4gdGhlIHZhbHVlIGlzIC0xCgkkc2VsZWN0ZWR2YWx1ZSA9IC0xOwoJJHNvcnRvcmRlciA9ICcnOwoJZm9yZWFjaCggJGdyb3VwcHJvcG1hcCBhcyAkbWFwICkKCXsKCSAgaWYoICRtYXBbJ25hbWUnXSA9PSAkZGVmblsnbmFtZSddICkKCSAgICB7CgkgICAgICAkc2VsZWN0ZWR2YWx1ZSA9ICRtYXBbJ3JlcXVpcmVkJ107CgkgICAgICAkc29ydG9yZGVyID0gJG1hcFsnc29ydF9rZXknXTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KCSRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgICAkb25lcm93LT5uYW1lID0gJGRlZm5bJ25hbWUnXTsKICAgICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107Cgkkb25lcm93LT50eXBlID0gJHRoaXMtPkxhbmcoICRrZXlzWyRkZWZuWyd0eXBlJ11dICk7Cgkkb25lcm93LT5zb3J0b3JkZXIgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF9zb3J0b3JkZXJfJy4kZGVmblsnbmFtZSddLAoJCQkJCQkgICAgICRzb3J0b3JkZXIsIDMsIDIpOwoJJG9uZXJvdy0+cmVxdWlyZWQgPSAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKCAkaWQsICdpbnB1dF9yZXF1aXJlZF8nLiRkZWZuWyduYW1lJ10sIAoJCQkJCQkJICAkb3B0aW9ucywkc2VsZWN0ZWR2YWx1ZSAgKTsKCSRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcGNvdW50Jyxjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHR0ZXh0JywgJHRoaXMtPkxhbmcoJ3Byb21wdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndHlwZXRleHQnLCR0aGlzLT5MYW5nKCd0eXBlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzb3J0b3JkZXJ0ZXh0JywkdGhpcy0+TGFuZygnc29ydG9yZGVyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXF1aXJlZHRleHQnLCR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpKTsKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRncm91cC50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluRWRpdFByb3BlcnR5UGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBkaXNwbGF5IGEgZnVua3kgcGFnZSB0byB0aGUgdXNlciB0byBhbGxvdyBoaW0gdG8gZWRpdCBhIHByb3BlcnR5IGRlZmluaXRpb24KICAgIC8vIGFjdHVhbGx5LCB3ZSdsbCBqdXN0IHNldCBzb21lIHN0dWZmIHVwIGFuZCB1c2UgdGhlIGFkZCBwcm9wZXJ0eSBwYWdlCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydwcm9wbmFtZSddICkgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm4oICRwYXJhbXNbJ3Byb3BuYW1lJ10gKTsKICAgIGlmKCAkZGVmbiA9PSBGQUxTRSApIAogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3Byb3Bub3Rmb3VuZCcpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXNbJ3Byb3BuYW1lJ10pOwoJcmV0dXJuOwogICAgICB9CgogICAgJHBhcmFtc1snZWRpdHByb3AnXSA9ICRwYXJhbXNbJ3Byb3BuYW1lJ107CiAgICAkcGFyYW1zWydpbnB1dF9uYW1lJ10gPSAkcGFyYW1zWydwcm9wbmFtZSddOwogICAgJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gPSAkZGVmblsncHJvbXB0J107CiAgICAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSA9ICRkZWZuWydsZW5ndGgnXTsKICAgICRwYXJhbXNbJ2lucHV0X3R5cGUnXSA9ICRkZWZuWyd0eXBlJ107CiAgICAkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRwYXJhbXMpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5FZGl0VXNlclN0ZXAxUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd1c2VyX2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IGdldCB0aGUgdXNlciBpbmZvCiAgICAkdXNlciA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHBhcmFtc1sndXNlcl9pZCddICk7CiAgICBpZiggJHVzZXJbMF0gPT0gZmFsc2UgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJHVzZXJbMV0gKTsKCXJldHVybjsKICAgICAgfQogICAgJHVzZXIgPSAkdXNlclsxXTsKCiAgICAvLyBnZXQgdGhlIHVzZXIgcHJvcGVydGllcwogICAgJHByb3BzID0gJHRoaXMtPkdldFVzZXJQcm9wZXJ0aWVzKCAkcGFyYW1zWyd1c2VyX2lkJ10gKTsKICAgIAogICAgLy8gZ2V0IHRoZSBncm91cCBtZW1iZXJzaGlwcwogICAgJGdyb3VwcyA9ICR0aGlzLT5HZXRNZW1iZXJHcm91cHNBcnJheSggJHBhcmFtc1sndXNlcl9pZCddICk7Ci8vIHRvZG8sIHVzZXJzIG1heSAob3B0aW9uYWxseSkgbm90IGJlIHBhcnQgb2YgYW55IGdydW9wcwovLyAgICAgaWYoICRncm91cHMgPT0gZmFsc2UgKQovLyAgICAgICB7Ci8vIAkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJHRoaXMtPkxhbmcoJ2Vycm9yX21lbWJlcmdyb3VwcycpICk7Ci8vIAlyZXR1cm47Ci8vICAgICAgIH0KCiAgICAvLyBwb3B1bGF0ZSB0aGUgcGFyYW1zIHdpdGggdGhlIGFwcHJvcHJpYXRlIHN0dWZmCiAgICAvLyB0aGF0IHdlIGp1c3QgbG9hZGVkCiAgICAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddID0gJHVzZXJbJ3VzZXJuYW1lJ107CiAgICAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddID0gJHVzZXJbJ2V4cGlyZXMnXTsKLy8gICAgICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gPSAkdXNlclsncGFzc3dvcmQnXTsgIC8vIHRoZSBwYXNzd29yZCByb3cgaXMgbWQ1IGhhc2hlZCwgZG9uJ3QgYm90aGVyIGRpc3BsYXlpbmcgaXQKLy8gICAgICRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10gPSAkdXNlclsncGFzc3dvcmQnXTsKICAgICR1c2VycHJvcHMgPSAnJzsKICAgIGZvcmVhY2goICRwcm9wcyBhcyAkcHJvcCApCiAgICB7CiAgICAgIGlmKCAkdXNlcnByb3BzID09ICcnICkKCXsKCSAgJHVzZXJwcm9wcyA9ICRwcm9wWyd0aXRsZSddLiI9Ii4kcHJvcFsnZGF0YSddOwoJfQogICAgICBlbHNlCgl7CgkgICR1c2VycHJvcHMgLj0gIiwiLiRwcm9wWyd0aXRsZSddLiI9Ii4kcHJvcFsnZGF0YSddOwoJfQogICAgfQogICAgJHBhcmFtc1sndXNlcnByb3BzJ10gPSAkdXNlcnByb3BzOwoKICAgICRtZW1iZXJvZiA9ICcnOwogICAgaWYoICRncm91cHMgIT0gZmFsc2UgKQogICAgICB7Cglmb3JlYWNoKCAkZ3JvdXBzIGFzICRncm91cCApCgl7CgkgICRwYXJhbXNbJ21lbWJlcm9mXycuJGdyb3VwWydncm91cGlkJ11dID0gJGdyb3VwWydncm91cGlkJ107Cgl9CiAgICAgIH0KCiAgICAvLyBhbmQgZGlzcGxheSB0aGUgdXNlciBwYWdlCiAgICAvLyB0b2RvLCBwdXQgYSByZWRpcmVjdCBoZXJlCiAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblVzZXJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5Hcm91cHNUYWIoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRncm91cHMgPSAkdGhpcy0+R2V0R3JvdXBMaXN0RnVsbCgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwoKICAgICRyb3dhcnJheSA9IGFycmF5KCk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdncm91cHNmb3VuZCcsICR0aGlzLT5MYW5nKCdncm91cHNmb3VuZCcpKTsKICAgIGZvcmVhY2goICRncm91cHMgYXMgJG9uZWdyb3VwICkKICAgIHsKICAgICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdsaXN0Z3JvdXBzJykgKQoJewoJICAkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7CgkgICRvbmVyb3ctPmlkID0gJG9uZWdyb3VwWydpZCddOwoJICAkb25lcm93LT5uYW1lID0gJG9uZWdyb3VwWydncm91cG5hbWUnXTsKCSAgJG9uZXJvdy0+ZGVzYyA9ICRvbmVncm91cFsnZ3JvdXBkZXNjJ107CgkgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0Z3JvdXBzJykgKQoJICAgIHsKCSAgICAgICRvbmVyb3ctPmVkaXRsaW5rID0KCQkkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdGdyb3VwJywgJHJldHVybmlkLAoJCQkJICAgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UgKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLAoJCQkJCQkJCQkJICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkgICBhcnJheSAoJ2dyb3VwX2lkJyA9PiAkb25lZ3JvdXBbJ2lkJ10pKTsKCQl9CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygncmVtb3ZlZ3JvdXBzJykgKQoJICAgIHsKCSAgICAgICRvbmVyb3ctPmRlbGV0ZWxpbmsgPQoJCSR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdkb19kZWxldGVncm91cCcsICRyZXR1cm5pZCwKCQkJCSAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCQkJCQkJICR0aGlzLT5MYW5nICgnZGVsZXRlJyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJCSAgIGFycmF5ICgnZ3JvdXBfaWQnID0+ICRvbmVncm91cFsnaWQnXSksCgkJCQkgICAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmVfZGVsZXRlZ3JvdXAnKSk7CgkgICAgfQoJICAKCSAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwoJfQoKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpdGVtY291bnQnLGNvdW50KCRyb3dhcnJheSkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2dyb3Vwc2ZvdW5kJywgJHRoaXMtPkxhbmcoJ2dyb3Vwc2ZvdW5kJykgKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCAkdGhpcy0+TGFuZyggJ2lkJyApKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsICR0aGlzLT5MYW5nKCAnbmFtZScgKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGVzY3RleHQnLCAkdGhpcy0+TGFuZyggJ2Rlc2NyaXB0aW9uJyApKTsKICAgIH0KCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ2xpc3Rncm91cHMnKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkbGluaycsIAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnYWRkZ3JvdXAnLAoJCQkJCQkgJHJldHVybmlkLAoJCQkJCQkgJHRoaXMtPkxhbmcoJ2FkZGdyb3VwJyksCgkJCQkJCSBhcnJheSgpLCAnJywgZmFsc2UsCgkJCQkJCSBmYWxzZSwKCQkJCQkJICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCAnZ3JvdXBsaXN0LnRwbCcgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQ2hhbmdlU2V0dGluZ3NUZW1wbGF0ZVRhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fc2V0Y2hhbmdlc2V0dGluZ3N0ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygndGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlY29udGVudCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWZhdWx0cycsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdHMnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0cycpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZWZvcm0udHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkZvcmdvdFBhc3N3b3JkVGVtcGxhdGVUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX3NldGZvcmdvdHB3dGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90ZW1wbGF0ZTEnLCR0aGlzLT5MYW5nKCdmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdGVtcGxhdGUxJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlY29udGVudDEnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90ZW1wbGF0ZTInLCR0aGlzLT5MYW5nKCdmb3Jnb3RwYXNzd29yZF9lbWFpbHRlbXBsYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF90ZW1wbGF0ZTInLAoJCQkgICR0aGlzLT5DcmVhdGVUZXh0QXJlYSggZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT5HZXRUZW1wbGF0ZSAoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nKSwKCQkJCQkJICd0ZW1wbGF0ZWNvbnRlbnQyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGVtcGxhdGUzJywkdGhpcy0+TGFuZygnZm9yZ290cGFzc3dvcmRfdmVyaWZ5dGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlMycsCgkJCSAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKCBmYWxzZSwgJGlkLAoJCQkJCSAgICAgJHRoaXMtPkdldFRlbXBsYXRlICgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nKSwKCQkJCQkJICd0ZW1wbGF0ZWNvbnRlbnQzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlZmF1bHRzJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0cycsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2RlZmF1bHRzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2ZvcmdvdHB3X3RlbXBsYXRlZm9ybS50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluTG9naW5UZW1wbGF0ZVRhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fc2V0bG9naW50ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3RlbXBsYXRlJywkdGhpcy0+TGFuZygndGVtcGxhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3RlbXBsYXRlJywKCQkJICAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoIGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdmZXVzZXJzX2xvZ2luZm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlbG9naW5mb3JtJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RlZmF1bHRzJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0cycsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2RlZmF1bHRzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3RlbXBsYXRlZm9ybS50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluTG9nb3V0VGVtcGxhdGVUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX3NldGxvZ291dHRlbXBsYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdGVtcGxhdGUnLCR0aGlzLT5MYW5nKCd0ZW1wbGF0ZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdGVtcGxhdGUnLAoJCQkgICR0aGlzLT5DcmVhdGVUZXh0QXJlYSggZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT5HZXRUZW1wbGF0ZSAoJ2ZldXNlcnNfbG9nb3V0Zm9ybScpLAoJCQkJCQkgJ3RlbXBsYXRlbG9nb3V0Zm9ybScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZWZhdWx0cycsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdHMnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdkZWZhdWx0cycpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCd0ZW1wbGF0ZWZvcm0udHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pblByb3BlcnRpZXNUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwogICAgJG1lc3NhZ2UgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkbWVzc2FnZSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywkdGhpcy0+TGFuZygncHJvcGVydGllcycpKTsKCiAgICAkZGVmbnMgPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZucygpOwogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKICAgICRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+dHlwZXMpOwogICAgZm9yZWFjaCggJGRlZm5zIGFzICRkZWZuICkKICAgIHsKICAgICAgJHByb3Bncm91cHMgPSAkdGhpcy0+R2V0UHJvcGVydHlHcm91cFJlbGF0aW9ucygkZGVmblsnbmFtZSddKTsKCiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgJG9uZXJvdy0+bmFtZSA9ICRkZWZuWyduYW1lJ107CiAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKICAgICAgJG9uZXJvdy0+dHlwZSA9ICR0aGlzLT5MYW5nKCAka2V5c1skZGVmblsndHlwZSddXSApOwogICAgICAkb25lcm93LT5sZW5ndGggPSAkZGVmblsnbGVuZ3RoJ107CiAgICAgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKICAgICAgaWYoIGNvdW50KCRwcm9wZ3JvdXBzKSA9PSAwICYmICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0cHJvcCcpKQoJewoJICAkb25lcm93LT5lZGl0bGluayA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2VkaXRwcm9wJywgJHJldHVybmlkLAoJCQkgICAgICAgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsCgkJCQkJCQkJCSAgICAkdGhpcy0+TGFuZyAoJ2VkaXQnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkgICAgICAgYXJyYXkoJ3Byb3BuYW1lJyA9PiAkZGVmblsnbmFtZSddKSk7CgkKCSAgJG9uZXJvdy0+ZGVsZXRlbGluayA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2RvX2RlbGV0ZXByb3AnLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdkZWxldGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkgICAgICAgYXJyYXkoJ3Byb3BuYW1lJyA9PiAkZGVmblsnbmFtZSddKSk7Cgl9CgogICAgICBhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwogICAgICAoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xlbmd0aHRleHQnLCR0aGlzLT5MYW5nKCdsZW5ndGgnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdHRleHQnLCR0aGlzLT5MYW5nKCdwcm9tcHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3R5cGV0ZXh0JywkdGhpcy0+TGFuZygndHlwZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcHMnLCRyb3dhcnJheSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3Bjb3VudCcsIGNvdW50KCRyb3dhcnJheSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wc2ZvdW5kJywkdGhpcy0+TGFuZygncHJvcHNmb3VuZCcpKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ2FkZHByb3AnKSApCiAgICAgIHsKCS8vIHRvZG8sIGFkZCBhIHBlcm1pc3Npb24gY2hlY2sgYXJvdW5kIHRoaXMKCS8vIG1heWJlIGNyZWF0ZSBhbiAiZWRpdCBmcm9udGVuZHVzZXIgcHJvcGVydGllcyIgcGVybWlzc2lvbgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRsaW5rJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdhZGRwcm9wJywKCQkJCQkJICRyZXR1cm5pZCwKCQkJCQkJICR0aGlzLT5MYW5nKCdhZGRwcm9wJyksCgkJCQkJCSBhcnJheSgpLCAnJywgZmFsc2UsCgkJCQkJCSBmYWxzZSwKCQkJCQkJICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwogICAgICB9CgoKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncHJvcGVydGllc2Zvcm0udHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pblVzZXJzVGFiKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyB0aGlzIHRhYiBoYXMgbWVyZWx5IG9uZSBtb2ZvIGxpc3Qgb2YgdXNlcyBhbmQgdGhlIGFiaWxpdHkgdG8gZWRpdCB0aGVtLCAKICAgIC8vIHNlZSBkZXRhaWxzIGFib3V0IHRoZW0sIGFuZCB0aGVuIGRlbGV0ZSB0aGVtCiAgICAvLyBtYXliZSBzZW5kIGFuIGVtYWlsIHRvIHRoZW0gdG9vIGlmIEkgZ2V0IGFyb3VuZCB0byBpdCB0aGF0IGlzLgoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnbGlzdHVzZXJzJykgKQogICAgICB7CgkvLyBmaWx0ZXJpbmcgc3R1ZmYKCSRjdXJncm91cCA9CgkgIChpc3NldCgkcGFyYW1zWydjdXJncm91cCddKSA/ICRwYXJhbXNbJ2N1cmdyb3VwJ10gOiAnJyk7CgkkY3VycmVnZXggPQoJICAoaXNzZXQoJHBhcmFtc1snY3VycmVnZXgnXSkgPyAkcGFyYW1zWydjdXJyZWdleCddIDogJycpOwoJaWYoIGlzc2V0KCAkcGFyYW1zWydmaWx0ZXInXSkgKQoJICB7CgkgICAgJGN1cmdyb3VwID0KCSAgICAgIChpc3NldCAoJHBhcmFtc1snZmlsdGVyX2dyb3VwJ10pID8gJHBhcmFtc1snZmlsdGVyX2dyb3VwJ10gOiAnJyk7CgkgICAgJGN1cnJlZ2V4ID0KCSAgICAgIChpc3NldCAoJHBhcmFtc1snZmlsdGVyX3JlZ2V4J10pID8gJHBhcmFtc1snZmlsdGVyX3JlZ2V4J10gOiAnJyk7CgkgIH0KCQoKCS8vIGdldCBhIGdyb3VwIGxpc3QgZm9yIHRoZSBmaWx0ZXIKCS8vIGl0IHNob3VsZCBiZSByZWFkeSB0byBnbyByaWdodCBpbnRvIHRoZSBkcm9wZG93biAoY29vbCBlaCkKCSRncm91cHMxID0gJHRoaXMtPkdldEdyb3VwTGlzdCgpOwoJJGdyb3VwcyA9IGFycmF5X21lcmdlKCBhcnJheSgiQWxsIEdyb3VwcyIgPT4gLTEpLCAkZ3JvdXBzMSApOwoJCgkvLyBub3cgc2V0dXAgdGhlIHRlbXBsYXRlIGZpZWxkcwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X2ZpbHRlcicsICR0aGlzLT5MYW5nKCdmaWx0ZXInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZGVmYXVsdGFkbWluJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X2dyb3VwJywgJHRoaXMtPkxhbmcoJ2dyb3VwJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAndXNlcnNmb3VuZCcsICR0aGlzLT5MYW5nKCd1c2Vyc2ZvdW5kJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX2dyb3VwJywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfZ3JvdXAnLCAkZ3JvdXBzLCAtMSwKCQkJCQkJCSAgICRjdXJncm91cCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3VzZXJmaWx0ZXInLCAkdGhpcy0+TGFuZygndXNlcmZpbHRlcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2ZpbHRlcl9yZWdleCcsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnZmlsdGVyX3JlZ2V4JywKCQkJCQkJICAgICAgICRjdXJyZWdleCwgMjAsIDIwICkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zZWxlY3QnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoICRpZCwgJ2ZpbHRlcicsIAoJCQkJCQkJJHRoaXMtPkxhbmcoJ2FwcGx5ZmlsdGVyJykpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfaGlkZGVuJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdjdXJncm91cCcsICRjdXJncm91cCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKCgoJJHVzZXJzID0gJHRoaXMtPkdldFVzZXJzSW5Hcm91cCggJGN1cmdyb3VwICk7CglpZiggIWlzX2FycmF5KCR1c2VycykgKQoJICB7CgkgICAgLy8gYW4gZXJyb3Igb2NjdXJyZWQKCSAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAgICRkYi0+RXJyb3JNc2coKSApOwoJICAgIHJldHVybjsKCSAgfQovLyAJJHEgPSAiIjsKLy8gCSRkYnJlc3VsdCA9ICcnOwovLyAJaWYoICRjdXJncm91cCA9PSAtMSB8fCAkY3VyZ3JvdXAgPT0gJycgKQovLyAJICB7Ci8vIAkgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiOyAKLy8gCSAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7Ci8vIAkgIH0KLy8gCWVsc2UKLy8gCSAgewovLyAJICAgIC8vIGZpbGwgaW4gYWxsIG9mIHRoZSB1c2VycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBncm91cCBjdXJyZW50bHkgc2VsZWN0ZWQKLy8gCSAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMsIi4KLy8gCSAgICAgIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSBpZD11c2VyaWQgQU5EIGdyb3VwaWQgPSA/IjsKLy8gCSAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGN1cmdyb3VwICkgKTsKLy8gCSB9CgoJJHJvd2FycmF5ID0gYXJyYXkoKTsKCSRyb3djbGFzcyA9ICJyb3cxIjsKCWdsb2JhbCAkZ0NtczsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlcm5hbWV0ZXh0JywgJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbWFpbHRleHQnLCAkdGhpcy0+TGFuZygnZW1haWwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXR1c3RleHQnLCAkdGhpcy0+TGFuZygnc3RhdHVzJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBpcmVzdGV4dCcsICR0aGlzLT5MYW5nKCdleHBpcmVzJykpOwoJZm9yZWFjaCggJHVzZXJzIGFzICRyb3cgKQoJewoJICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCSAgJG9uZXJvdy0+dXNlcm5hbWUgPSAkcm93Wyd1c2VybmFtZSddOwoJICAkb25lcm93LT5leHBpcmVzICA9ICRyb3dbJ2V4cGlyZXMnXTsKCSAgJG9uZXJvdy0+ZWRpdGxpbmsgPQoJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdlZGl0dXNlcicsICRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdlZGl0JyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJICAgICAgIGFycmF5ICgndXNlcl9pZCcgPT4gJHJvd1snaWQnXSApKTsKCSAgJG9uZXJvdy0+ZGVsZXRlbGluayA9IAoJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsJ2RvX2RlbGV0ZXVzZXInLCRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCSAgICAkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ3VzZXJfaWQnID0+ICRyb3dbJ2lkJ10pLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdhcmV5b3VzdXJlJykpOwoJICAKCSAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwoJfQoKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRyb3dhcnJheSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1jb3VudCcsIGNvdW50KCRyb3dhcnJheSkpOwogICAgICB9CgogICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdhZGR1c2VyJykgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2FkZGxpbmsnLCAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2FkZHVzZXInLAoJCQkJCQkgJHJldHVybmlkLAoJCQkJCQkgJHRoaXMtPkxhbmcoJ2FkZHVzZXInKSwKCQkJCQkJIGFycmF5KCksICcnLCBmYWxzZSwKCQkJCQkJIGZhbHNlLAoJCQkJCQkgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKSk7CiAgICAgIH0KCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoICd1c2VybGlzdC50cGwnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pblBhbmVsKCRpZCwmJHBhcmFtcywkcmV0dXJuaWQpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgogICAgJGFjdGl2ZV90YWIgPSAtMTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydhY3RpdmVfdGFiJ10pKQogICAgICB7CgkkYWN0aXZlX3RhYiA9ICRwYXJhbXNbJ2FjdGl2ZV90YWInXTsKICAgICAgfQoKICAgIC8vIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ3Byb3BlcnRpZXMnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ3Byb3BlcnRpZXMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndXNlcnNuZ3JvdXBzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdncm91cHMnLCAkdGhpcy0+TGFuZygnZ3JvdXBzJyksKCRhY3RpdmVfdGFiID09ICdncm91cHMnKSk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICd1c2VycycsICR0aGlzLT5MYW5nKCd1c2VycycpLCgkYWN0aXZlX3RhYiA9PSAndXNlcnMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdwcmVmcycsICR0aGlzLT5MYW5nKCdwcmVmZXJlbmNlcycpLCgkYWN0aXZlX3RhYiA9PSAncHJlZnMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdsb2dpbnRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ2luX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnbG9naW50ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2xvZ291dHRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ291dF90ZW1wbGF0ZScpLAoJCQkJICAoJGFjdGl2ZV90YWIgPT0gJ2xvZ291dHRlbXBsYXRlJykpOwoJZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCAnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnLCAkdGhpcy0+TGFuZygnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnKSwKCQkJCSAgKCRhY3RpdmVfdGFiID09ICdjaGFuZ2VzZXR0aW5nc190ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKSk7CiAgICAgIH0KICAgIGVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKCiAgICAvLyBUaGVjb250ZW50IG9mIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcm9wZXJ0aWVzJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pblByb3BlcnRpZXNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQogICAgCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3VzZXJzbmdyb3VwcycpICkKICAgICAgewoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2dyb3VwcycpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Hcm91cHNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYigndXNlcnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluVXNlcnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYigncHJlZnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluUHJlZnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYignbG9naW50ZW1wbGF0ZScpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Mb2dpblRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2xvZ291dHRlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkxvZ291dFRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkNoYW5nZVNldHRpbmdzVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYignZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluRm9yZ290UGFzc3dvcmRUZW1wbGF0ZVRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCgpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5QcmVmc1RhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBmaWxsIG91dCB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19zZXRwcmVmcycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21pbnB3bGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9taW5wd2xlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWlucHdsZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21pbnB3bGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9tYXhwd2xlbicsICR0aGlzLT5MYW5nKCdwcm9tcHRfbWF4cHdsZW4nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X21heHB3bGVuJywgCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdpbnB1dF9tYXhwd2xlbicsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcpLCAyLCAyICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbWludW5sZW4nLCAkdGhpcy0+TGFuZygncHJvbXB0X21pbnVubGVuJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9taW51bmxlbicsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfbWludW5sZW4nLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtaW5fdXNlcm5hbWVsZW5ndGgnKSwgMiwgMiApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21heHVubGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9tYXh1bmxlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWF4dW5sZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21heHVubGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJyksIDIsIDIgKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfc2Vzc2lvbnRpbWVvdXQnLCAkdGhpcy0+TGFuZygncHJvbXB0X3Nlc3Npb250aW1lb3V0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zZXNzaW9udGltZW91dCcsIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfc2Vzc2lvbnRpbWVvdXQnLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycpLCA0LCA0ICkpOwoJCQkgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcmVxdWlyZW9uZWdyb3VwJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9yZXF1aXJlb25lZ3JvdXAnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlcXVpcmVvbmVncm91cCcsIAoJCQkgIG15Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdpbnB1dF9yZXF1aXJlb25lZ3JvdXAnLCAxLCAKCQkJCQkJJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3NtdHB2YWxpZGF0ZScsICR0aGlzLT5MYW5nKCdwcm9tcHRfc210cHZhbGlkYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zbXRwdmFsaWRhdGUnLCAKCQkJICBteUNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAnaW5wdXRfc210cHZhbGlkYXRlJywgMSwgCgkJCQkJCSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkb19zbXRwX3ZhbGlkYXRlX2VtYWlsJykpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfZGZsdGdyb3VwJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9kZmx0Z3JvdXAnKSk7CiAgICAkZ3JvdXBzMSA9ICR0aGlzLT5HZXRHcm91cExpc3QoKTsKICAgICRncm91cHMgPSBhcnJheV9tZXJnZSggYXJyYXkoIk5vbmUiID0+IC0xKSwgJGdyb3VwczEgKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfZGZsdGdyb3VwJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biggJGlkLCAnaW5wdXRfZGZsdGdyb3VwJywgJGdyb3VwcywgLTEsCgkJCQkJCSAgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2dyb3VwJykpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9yZXF1aXJlZG1hcmtlcicsCgkJCSAgJHRoaXMtPkxhbmcoJ3JlcXVpcmVkZmllbGRtYXJrZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlcXVpcmVkbWFya2VyJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfcmVxdWlyZWRmaWVsZG1hcmtlcicsCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpLDIsMikpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3JlcXVpcmVkY29sb3InLAoJCQkgICR0aGlzLT5MYW5nKCdyZXF1aXJlZGZpZWxkY29sb3InKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlcXVpcmVkY29sb3InLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9yZXF1aXJlZGZpZWxkY29sb3InLAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpLDEwLDEwKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfaGlkZGVubWFya2VyJywKCQkJICAkdGhpcy0+TGFuZygnaGlkZGVuZmllbGRtYXJrZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2hpZGRlbm1hcmtlcicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X2hpZGRlbmZpZWxkbWFya2VyJywKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJywnISEnKSwyLDIpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9oaWRkZW5jb2xvcicsCgkJCSAgJHRoaXMtPkxhbmcoJ2hpZGRlbmZpZWxkY29sb3InKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2hpZGRlbmNvbG9yJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfaGlkZGVuZmllbGRjb2xvcicsCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywnZ3JlZW4nKSwxMCwxMCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2ZvcmdvdHB3X3BhZ2UnLAoJCQkgICR0aGlzLT5MYW5nKCdwcm9tcHRfZm9yZ290cHdfcGFnZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfZm9yZ290cHdfcGFnZScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X2ZvcmdvdHB3X3BhZ2UnLCAKCQkJCQkJICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdwYWdlaWRmb3Jnb3RwYXNzd2QnKSwgMTUsIDE1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jaGFuZ2VzZXR0aW5nc19wYWdlJywKCQkJICAkdGhpcy0+TGFuZygncHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2UnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2NoYW5nZXNldHRpbmdzX3BhZ2UnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9jaGFuZ2VzZXR0aW5nc19wYWdlJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncGFnZWlkX2NoYW5nZXNldHRpbmdzJyksIDE1LCAxNSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbG9naW5fcGFnZScsCgkJCSAgJHRoaXMtPkxhbmcoJ3Byb21wdF9sb2dpbl9wYWdlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9sb2dpbl9wYWdlJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfbG9naW5fcGFnZScsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dpbicpLCAxNSwgMTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2xvZ291dF9wYWdlJywKCQkJICAkdGhpcy0+TGFuZygncHJvbXB0X2xvZ291dF9wYWdlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9sb2dvdXRfcGFnZScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsJ2lucHV0X2xvZ291dF9wYWdlJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcpLCAxNSwgMTUpKTsKCQkJCQkJIAogICAgJG51bSA9ICR0aGlzLT5Db3VudFRlbXBDb2RlUmVjb3JkcygpOwogICAgaWYoICRudW0gKQogICAgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9udW1yZXNldHJlY29yZHMnLAoJCQkgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF9udW1yZXNldHJlY29yZCcpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhX251bXJlc2V0cmVjb3JkcycsICRudW0pOyAvL3RvZG8KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZW1vdmVhbGwnLAoJCQkgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnaW5wdXRfcmVtb3ZlYWxsJywKCQkJCQkJICAgICAkdGhpcy0+TGFuZygncmVtb3ZlYWxsJyksCgkJCQkJCSAgICAgJ29uY2xpY2s9InJldHVybiBjb25maXJtKFwnJy4kdGhpcy0+TGFuZygnYXJleW91c3VyZScpLidcJykiJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlbW92ZTF3ZWVrJywKCQkJICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2lucHV0X3JlbW92ZTF3ZWVrJywKCQkJCQkJICAgICAkdGhpcy0+TGFuZygncmVtb3ZlMXdlZWsnKSwKCQkJCQkJICAgICAnb25jbGljaz0icmV0dXJuIGNvbmZpcm0oXCcnLiR0aGlzLT5MYW5nKCdhcmV5b3VzdXJlJykuJ1wnKSInKSk7CiAgICAgIAogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlbW92ZTFtb250aCcsCgkJCSAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdpbnB1dF9yZW1vdmUxbW9udGgnLAoJCQkJCQkgICAgICR0aGlzLT5MYW5nKCdyZW1vdmUxbW9udGgnKSwKCQkJCQkJICAgICAnb25jbGljaz0icmV0dXJuIGNvbmZpcm0oXCcnLiR0aGlzLT5MYW5nKCdhcmV5b3VzdXJlJykuJ1wnKSInKSk7CiAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbnByZWZzLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5VXNlckZvcmdvdFBhc3N3b3JkUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdXNlcm5hbWUgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApICkKICAgICAgewoJJHVzZXJuYW1lID0gdHJpbSggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddICk7CiAgICAgIH0KICAgIAogICAgaWYoICFpc3NldCggJHBhcmFtc1snc2tpcGZvcm1kaXNwbGF5J10gKSApCiAgICAgIHsKCS8vIHNldHVwIHRoZSB0ZW1wbGF0ZQoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19mb3Jnb3RwdycsICRyZXR1cm5pZCApKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdmb3Jnb3RwdycpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbG9zdHB3X21lc3NhZ2UnLAoJCQkgICAgICAkdGhpcy0+TGFuZygnbG9zdHB3X21lc3NhZ2UnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF91c2VybmFtZScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdXNlcm5hbWUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VzZXJuYW1lJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfdXNlcm5hbWUnLCAkdXNlcm5hbWUsIDMwLCAzMCApKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdjYW5jZWwnLCR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwoJaWYoIGlzc2V0KCAkcGFyYW1zWydyZXR1cm50byddICkgKQoJICB7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdpbnB1dF9yZXR1cm50bycsJHBhcmFtc1sncmV0dXJudG8nXSkpOwoJICB9CiAgICAgIH0KICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSggJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJyApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5VXNlckZvcmdvdFBhc3N3b3JkVmVyaWZpY2F0aW9uUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBmaWxsIGluIHRoZSB0ZW1wbGF0ZQogICAgJHVpZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF91aWQnXSApICkKICAgICAgewoJJHVpZCA9ICRwYXJhbXNbJ2lucHV0X3VpZCddOwogICAgICB9CiAgICAkdXNlcm5hbWUgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApICkKICAgICAgewoJJHVzZXJuYW1lID0gJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdXNlcm5hbWUgPSAkdGhpcy0+R2V0VXNlck5hbWUoICR1aWQgKTsKICAgICAgfQogICAgJGNvZGUgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfY29kZSddICkgKQogICAgICB7CgkkY29kZSA9ICRwYXJhbXNbJ2lucHV0X2NvZGUnXTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywkcGFyYW1zWydlcnJvciddKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydtZXNzYWdlJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsJHBhcmFtc1snbWVzc2FnZSddKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fdmVyaWZ5Y29kZScsJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ2lucHV0X3VpZCcsJHVpZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXNlcm5hbWUnLCR0aGlzLT5MYW5nKCdwcm9tcHRfdXNlcm5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VzZXJuYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF91c2VybmFtZScsICR1c2VybmFtZSwgMzAsIDMwLAoJCQkJCQkgICdEaXNhYmxlZD0iMSInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9jb2RlJywkdGhpcy0+TGFuZygncHJvbXB0X2NvZGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2NvZGUnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0X2NvZGUnLCAkY29kZSwgMTAsIDEwICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcGFzc3dvcmQnLCR0aGlzLT5MYW5nKCdwcm9tcHRfcGFzc3dvcmQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3Bhc3N3b3JkJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgkaWQsICdpbnB1dF9wYXNzd29yZCcsICcnLCAzMCwgMzAgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9yZXBlYXRwYXNzd29yZCcsJHRoaXMtPkxhbmcoJ3JlcGVhdHBhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZXBlYXRwYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLCAnJywgMzAsIDMwICkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5VXNlclNldHRpbmdzUGFnZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdWlkID0gJHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmKCAkdWlkID09IGZhbHNlICkgCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vdGxvZ2dlZGluJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcmVzdWx0ID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICBpZiggJHJlc3VsdFswXSA9PSBGQUxTRSApCiAgICAgIHsKCS8vIHVzZXIgaXNuJ3QgbG9nZ2VkIGluCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgJHJlc3VsdFsxXSk7CglyZXR1cm47CiAgICAgIH0KICAgICR1aW5mbyA9ICRyZXN1bHRbMV07CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddICk7CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIHVzZXJzIG1lbWJlciBncm91cHMKICAgICRncm91cHMgPSAkdGhpcy0+R2V0TWVtYmVyR3JvdXBzQXJyYXkoICR1aWQgKTsKICAgIGlmKCAhJGdyb3VwcyApCiAgICAgIHsKCS8vIHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgYW55IGdydW9wcy4uLgoJLy8gaGFuZGxlIHRoaXMgbGF0ZXIgdG9kbwoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9ub2dyb3VwcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG5vdyB3ZSBoYXZlIHRoZSBncm91cHMsIHdlIGJ1aWxkIGEgdW5pb24gb2YgYWxsIG9mIHRoZSBncm91cHMgcHJvcGVydGllcwogICAgJHByb3BlcnRpZXMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJGdyb3VwcyBhcyAkZ3JwcmVjb3JkICkKICAgIHsKICAgICAgJGdpZCA9ICRncnByZWNvcmRbJ2dyb3VwaWQnXTsKICAgICAgJHByb3ByZWxhdGlvbnMgPSAkdGhpcy0+R2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdpZCApOwogICAgICAkcHJvcGVydGllcyA9IGFycmF5X21lcmdlX2J5X25hbWVfcmVxdWlyZWQoICRwcm9wZXJ0aWVzLCAkcHJvcHJlbGF0aW9ucyApOwogICAgICB1YXNvcnQoICRwcm9wZXJ0aWVzLCAnY29tcGFyZV9lbGVtZW50c19ieV9zb3J0b3JkZXJfa2V5JyApOwogICAgfQoKICAgIGlmKCBjb3VudCgkcHJvcGVydGllcykgPT0gMCApCiAgICAgIHsKCWlmKCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcpID09IDEgKQoJICB7CgkgICAgLy8gdGhpcyB1c2VyIGlzIG5vdCBhIG1lbWJlciBvZiBhbnkgZ3J1b3BzLi4uCgkgICAgLy8gaGFuZGxlIHRoaXMgbGF0ZXIgdG9kbwoJICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX29uZWdyb3VwcmVxdWlyZWQnKSk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0KCgogICAgLy8gbm93IHdlJ3JlIHJlYWR5IHRvIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgLy8gZmlyc3Qgd2UgcHV0IGluIHN0dWZmIHRoYXQgaXMgcmVxdWlyZWQgKHVzZXJuYW1lLCBwYXNzd29yZCwgZXRjLCBldGMpCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwoKICAgIC8vIG1ha2Ugc3VyZSB1c2VybmFtZSBpcyBpbiB0aGVyZQogICAgJHZhbCA9ICR1aW5mb1sndXNlcm5hbWUnXTsKICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICRvbmVyb3ctPmNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgJG9uZXJvdy0+bWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsJyonKTsKICAgICRvbmVyb3ctPnJlcXVpcmVkID0gMTsKICAgICRvbmVyb3ctPmhpZGRlbiA9IG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2hpZGRlbl91c2VybmFtZScsCgkJCQkJICAgaW1wbG9kZSgiOyIsYXJyYXkoJ3VzZXJuYW1lJywwLDMwLDMpKSk7CiAgICAkb25lcm93LT5wcm9tcHQgPSAkdGhpcy0+TGFuZygndXNlcm5hbWUnKTsKICAgICRvbmVyb3ctPmNvbnRyb2wgPSR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfdXNlcm5hbWUnLCAkdmFsLCAzMCwgMzAsCgkJCQkJICAgICAnRGlzYWJsZWQ9IjEiJyk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCiAgICAvLyBhbmQgcGFzc3dvcmQKICAgICR2YWwgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSApICkKICAgICAgJHZhbCA9ICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ107CiAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CiAgICAkb25lcm93LT5jb2xvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicsJ2JsdWUnKTsKICAgICRvbmVyb3ctPm1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAkb25lcm93LT5yZXF1aXJlZCA9IDE7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fcGFzc3dvcmQnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCdwYXNzd29yZCcsMCwzMCwzKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3Bhc3N3b3JkJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgkaWQsICdpbnB1dF9wYXNzd29yZCcsICR2YWwsIDMwLCAzMCk7CiAgICAkb25lcm93LT5hZGR0ZXh0ID0kdGhpcy0+TGFuZygnaW5mb19lbXB0eXBhc3N3b3JkZmllbGQnKTsKICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwoKICAgIC8vIGFuZCBtYWtlIGhpbSByZXBlYXQgdGhlIHBhc3N3b3JkCiAgICAkdmFsID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10gKSApCiAgICAgICR2YWwgPSAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddOwogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJG9uZXJvdy0+aGlkZGVuID0gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnaGlkZGVuX3JlcGVhdHBhc3N3b3JkJywKCQkJCQkgICBpbXBsb2RlKCI7IixhcnJheSgncmVwZWF0cGFzc3dvcmQnLDAsMzAsMykpKTsKICAgICRvbmVyb3ctPnByb21wdCA9ICR0aGlzLT5MYW5nKCdyZXBlYXRwYXNzd29yZCcpOwogICAgJG9uZXJvdy0+Y29udHJvbCA9JHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLCAkdmFsLCAzMCwgMzApOwogICAgJG9uZXJvdy0+YWRkdGV4dCA9JHRoaXMtPkxhbmcoJ2luZm9fZW1wdHlwYXNzd29yZGZpZWxkJyk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKICAgICAgICAKICAgIGZvcmVhY2goICRwcm9wZXJ0aWVzIGFzICRwcm9wICkKICAgIHsKICAgICAgLy8gZG9uJ3QgcHJvY2VzcyBoaWRkZW4gZmllbGRzIGhlcmUKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDMgKSBjb250aW51ZTsKCiAgICAgIC8vIGdldCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgogICAgICAkZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm4oICRwcm9wWyduYW1lJ10gKTsKICAgICAgJHZhbCA9ICR0aGlzLT5HZXRVc2VyUHJvcGVydHlGdWxsKCAkcHJvcFsnbmFtZSddLCAkdWlkICk7CiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsgCgogICAgICAkY29sb3IgPSAnJzsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDIgKSAkY29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAgICRtYXJrZXIgPSAnJzsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDIgKSAkbWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsJyonKTsKICAgICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAoJHByb3BbJ3JlcXVpcmVkJ10gPT0gMik7CiAgICAgICRvbmVyb3ctPmNvbG9yICAgID0gJGNvbG9yOwogICAgICAkb25lcm93LT5tYXJrZXIgICA9ICRtYXJrZXI7CiAgICAgICRvbmVyb3ctPmhpZGRlbiA9IG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2hpZGRlbl8nLiRwcm9wWyduYW1lJ10sCgkJCQkJICAgICBpbXBsb2RlKCI7IixhcnJheSgkcHJvcFsnbmFtZSddLCRkZWZuWyd0eXBlJ10sCgkJCQkJCQkgICAgICAgJGRlZm5bJ2xlbmd0aCddLCRwcm9wWydyZXF1aXJlZCddKSkpOwoKICAgICAgJG9uZXJvdy0+cHJvbXB0ID0gJGRlZm5bJ3Byb21wdCddOwogICAgICBzd2l0Y2goICRkZWZuWyd0eXBlJ10gKQoJewoJY2FzZSAwOiAvLyB0ZXh0CgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF8nLiRwcm9wWyduYW1lJ10sCgkJCQkJCSAgICAgJHZhbCwgJGRlZm5bJ2xlbmd0aCddLCAkZGVmblsnbGVuZ3RoJ10gKTsKCSAgYnJlYWs7CgoJY2FzZSAxOiAvLyBjaGVja2JveAoJICAkb25lcm93LT5jb250cm9sID0gbXlDcmVhdGVJbnB1dENoZWNrYm94KCAkaWQsICdpbnB1dF8nLiRwcm9wWyduYW1lJ10sIDEsICR2YWwgKTsKCSAgYnJlYWs7CgoJY2FzZSAyOiAvLyBlbWFpbAoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLAoJCQkJCQkgICAgICR2YWwsICRkZWZuWydsZW5ndGgnXSwgJGRlZm5bJ2xlbmd0aCddICk7CgkgIGJyZWFrOwoJfQoKICAgICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CiAgICB9CgogICAgLy8gZmlsbCBpbiB0aGUgdmFyaWFibGVzIGZvciB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCR0aGlzLT5MYW5nKCd1c2VyX3NldHRpbmdzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdkb191c2VyY2hhbmdlc2V0dGluZ3MnLCRyZXR1cm5pZCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ2NhbmNlbCcsJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3JldHVybnRvJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcmV0dXJudG8nLCRwYXJhbXNbJ3JldHVybnRvJ10pKTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250cm9scycsICRyb3dhcnJheSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xjb3VudCcsIGNvdW50KCRyb3dhcnJheSkpOwoKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nKTsKICB9CgoKZnVuY3Rpb24gX2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAmJG1lc3NhZ2UsICRuZWVkcHcgPSB0cnVlLCAkZG9leHBpcmUgPSB0cnVlICkKICB7CiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKTsKICAgICRwYXNzd29yZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSk7CiAgICAkcmVwZWF0ICAgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwoKICAgIGlmKCAkdXNlcm5hbWUgPT0gJycgCgl8fCAoJG5lZWRwdyAmJiAoJHBhc3N3b3JkID09ICcnIHx8ICRyZXBlYXQgPT0gJycpKSAgKQogICAgICB7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nICgiZXJyb3JfaW52YWxpZHBhcmFtcyIpOwoJcmV0dXJuIC0xOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBwYXNzd29yZHMgbWF0Y2gKICAgIGlmKCAkcGFzc3dvcmQgIT0gJHJlcGVhdCApCiAgICAgIHsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcoImVycm9yX3Bhc3N3b3JkbWlzbWF0Y2giKTsKCXJldHVybiAtMTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgdXNlcm5hbWUgZml0cyB0aGUgcnVsZXMKICAgIGlmKCAhJHRoaXMtPklzVmFsaWRVc2VybmFtZSggJHVzZXJuYW1lICkgKQogICAgICB7CgkkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCAiZXJyb3JfaW52YWxpZHVzZXJuYW1lIiApOwoJcmV0dXJuIC0xOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBwYXNzd29yZCBmaXRzIHRoZSBydWxlcwogICAgaWYoICRuZWVkcHcgJiYgISR0aGlzLT5Jc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygiZXJyb3JfaW52YWxpZHBhc3N3b3JkIik7CglyZXR1cm4gLTE7CiAgICAgIH0KCiAgICBpZiggJGRvZXhwaXJlID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIDE7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgYW4gZXhwaXJ5IGRhdGUgaXMgc2V0CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10pICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZGV4cGlyeWRhdGUnKTsKICAgICAgfQoKICAgICRleHBpcmVzID0gbWt0aW1lKCRwYXJhbXNbJ2V4cGlyZXNkYXRlX0hvdXInXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfTWludXRlJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1NlY29uZCddLAoJCSAgICAgICRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX0RheSddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9ZZWFyJ10pOwogICAgJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSA9ICRleHBpcmVzOwogICAgcmV0dXJuIDE7CiAgfQoKCiAgZnVuY3Rpb24gbXlNb2R1bGVQYXRoKCkKICB7CiAgICAkc3RyID0gIi9tb2R1bGVzLyIuJHRoaXMtPkdldE5hbWUoKS4iLyI7CiAgICByZXR1cm4gJHN0cjsKICB9CgogIGZ1bmN0aW9uIG15UmVkaXJlY3RUb1RhYiggJGlkLCAkdGFiLCAkcGFyYW1zID0gJycgKQogIHsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggaXNfYXJyYXkoICRwYXJhbXMgKSApCiAgICAgIHsKCSRwYXJtcyA9ICRwYXJhbXM7CiAgICAgIH0KICAgICRwYXJtc1snYWN0aXZlX3RhYiddID0gJHRhYjsKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkZWZhdWx0YWRtaW4nLCAkcGFybXMgKTsKICB9CgogIGZ1bmN0aW9uIG15UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJHBhcmFtcyA9ICcnICkKICB7CiAgICB1bnNldCggJHBhcmFtc1snYWN0aW9uJ10gKTsKICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAkYWN0aW9uLCAnJywgJHBhcmFtcyApOwogIH0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKQkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgogIGZ1bmN0aW9uIEdldEF1dGhvcigpIAogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQogIAogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwQGhvdG1haWwuY29tJzsKICB9CiAgCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKICB9CgoKICAvLyBvbGQgZnVuY3Rpb24gKG5vdCB1c2VkPykKICAvLyB0b2RvLCBwdXQgdGhpcyBpbnRvIHRoZSBVc2VyTWFuaXB1bGF0b3Igc3R1ZmYKCWZ1bmN0aW9uIENyZWF0ZU5ld1VzZXIoJGlkKSB7CgkgICRkYj0kdGhpcy0+R2V0RGIoKTsKCSAgaWYgKGlzc2V0KCRfUE9TVFskaWQuInVzZXJuYW1lIl0pKSAkbmV3dXNlcm5hbWU9dHJpbSgkX1BPU1RbJGlkLiJ1c2VybmFtZSJdKTsgZWxzZSAkbmV3dXNlcm5hbWU9IiI7CgkgIGlmICgkbmV3dXNlcm5hbWU9PSIiKSByZXR1cm4gIlVzZXJuYW1lIG11c3QgYmUgcHJvdmlkZWQhIjsKCSAgJHF1ZXJ5PSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZT0nIi4kbmV3dXNlcm5hbWUuIiciOwoJICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwogCSAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgcmV0dXJuICJVc2VybmFtZSBhbHJlYWR5IGV4aXN0cyEiOwoJICAKCSAgJG5ld2VtYWlsPXRyaW0oJF9QT1NUWyRpZC4iZW1haWwiXSk7CgkgIAoJICAkbmV3cGFzc3dvcmQ9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZCJdKTsKCSAgaWYgKCRuZXdwYXNzd29yZD09IiIpIHJldHVybiAiUGFzc3dvcmQgY2Fubm90IGJlIGJsYW5rISI7CgkgICRuZXdwYXNzd29yZDI9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZDIiXSk7CgkgIGlmICgkbmV3cGFzc3dvcmQhPSRuZXdwYXNzd29yZDIpIHJldHVybiAiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaCEiOwoJICAkbmV3aWQ9JGRiLT5HZW5JRChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzX3NlcSIpOwoJICAkcXVlcnk9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyAoaWQsdXNlcm5hbWUscGFzc3dvcmQsZW1haWwpIFZBTFVFUyAoPyw/LD8sPykiOwoJICAkcGFyYW1zPWFycmF5KCRuZXdpZCwkbmV3dXNlcm5hbWUsbWQ1KCRuZXdwYXNzd29yZCksJG5ld2VtYWlsKTsKCSAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnksJHBhcmFtcyk7CgkgIAoJICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIjsKCSAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CgkgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CgkgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CgkgICAgICBpZiAoJF9QT1NUWyRpZC4iZ3JvdXAiLiRyb3dbImlkIl1dPT0ieWVzIikgewoJCS8vQ3JlYXRlIGFuIGFzc29jaWF0aW9uCgkJJHE9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzICh1c2VyaWQsZ3JvdXBpZCkgVkFMVUVTICg/LD8pIjsKCQkkcGFyYW1zMj1hcnJheSgkbmV3aWQsJHJvd1siaWQiXSk7CgkJJGRicmVzdWx0Mj0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtczIpOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gIiI7Cgl9CgkKCiAgLy8gb2xkIGZ1bmN0aW9uIChub3QgdXNlZD8pCiAgLy8gdG9kbywgcHV0IHRoaXMgaW50byB0aGUgVXNlck1hbmlwdWxhdG9yIHN0dWZmCglmdW5jdGlvbiBDcmVhdGVOZXdHcm91cCgkaWQpIHsKCQkkZGI9JHRoaXMtPkdldERiKCk7CgkJJG5ld2dyb3VwbmFtZT10cmltKCRfUE9TVFskaWQuImdyb3VwbmFtZSJdKTsKCQlpZiAoJG5ld2dyb3VwbmFtZT09IiIpIHJldHVybiAiQSB1bmlxdWUgZ3JvdXAgbmFtZSBtdXN0IGJlIHByb3ZpZGVkISI7CgkJJHF1ZXJ5PSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lPSciLiRuZXdncm91cG5hbWUuIiciOwoJCSRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSk7CgkJaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgcmV0dXJuICJHcm91cCBuYW1lIGFscmVhZHkgZXhpc3RzISI7CgkJJG5ld2dyb3VwZGVzYz10cmltKCRfUE9TVFskaWQuImdyb3VwZGVzYyJdKTsKCQkkbmV3aWQ9JGRiLT5HZW5JRChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiKTsKCQkkcXVlcnk9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgKGlkLGdyb3VwbmFtZSxncm91cGRlc2MpIFZBTFVFUyAoPyw/LD8pIjsKCQkkcGFyYW1zPWFycmF5KCRuZXdpZCwkbmV3Z3JvdXBuYW1lLCRuZXdncm91cGRlc2MpOwoJCSRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwoJCXJldHVybiAiIjsKCX0KCgogIC8vIG9sZCBmdW5jdGlvbiAobm90IHVzZWQ/KQogIC8vIHRvZG8sIHB1dCB0aGlzIGludG8gdGhlIFVzZXJNYW5pcHVsYXRvciBzdHVmZgoJZnVuY3Rpb24gQ2hhbmdlR3JvdXAoJGlkKSB7CgkJJGRiPSR0aGlzLT5HZXREYigpOwoJCWlmIChpc3NldCgkX1BPU1RbJGlkLiJncm91cGlkIl0pKSAkZ3JvdXBpZD10cmltKCRfUE9TVFskaWQuImdyb3VwaWQiXSk7IGVsc2UgcmV0dXJuICJVbnJlY292ZXJhYmxlIGVycm9yIjsKCQlpZiAoaXNzZXQoJF9QT1NUWyRpZC4iZ3JvdXBuYW1lIl0pKSAkZ3JvdXBuYW1lPXRyaW0oJF9QT1NUWyRpZC4iZ3JvdXBuYW1lIl0pOyBlbHNlIHJldHVybiAiQSB1bmlxdWUgZ3JvdXAgbmFtZSBtdXN0IGJlIHByb3ZpZGVkISI7CgoJCS8vQ2hlY2sgZm9yIGV4aXN0aW5nIGdyb3VwbmFtZQoJCSRxdWVyeT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGdyb3VwbmFtZT0nIi4kZ3JvdXBuYW1lLiInIjsKCQkkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJCWlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHsKCQkJJHJvdz0kcmVzdWx0LT5GZXRjaFJvdygpOwoJCQlpZiAoJHJvd1siaWQiXSE9JGdyb3VwaWQpIHJldHVybiAiR3JvdXAgbmFtZSBhbHJlYWR5IGV4aXN0cyEiOwoJCQkvL0Vsc2Ugc2FtZSBncm91cC4uLgoJCX0KCgkJJGdyb3VwZGVzYz10cmltKCRfUE9TVFskaWQuImdyb3VwZGVzYyJdKTsKCQkkcXVlcnk9IlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFNFVCBncm91cG5hbWU9Pyxncm91cGRlc2M9PyBXSEVSRSBpZD0/IjsKCQkkcGFyYW1zPWFycmF5KCRncm91cG5hbWUsJGdyb3VwZGVzYywkZ3JvdXBpZCk7CgkJJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnksJHBhcmFtcyk7Cgl9CgoKCQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vICBBUEkgRlVOQ1RJT05TIC8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIENvdW50VGVtcENvZGVSZWNvcmRzKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+Q291bnRUZW1wQ29kZVJlY29yZHMoKTsKICB9CgogIGZ1bmN0aW9uIEV4cGlyZVRlbXBDb2RlcyggJGV4cGlyeWNvZGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5FeHBpcmVUZW1wQ29kZXMoICRleHBpcnljb2RlICk7CiAgfQoKICBmdW5jdGlvbiBSZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5SZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKTsKICB9ICAKCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclRlbXBDb2RlKCAkdWlkICk7CiAgfSAgCgogIGZ1bmN0aW9uIFNldFVzZXJUZW1wQ29kZSggJHVpZCwgJGNvZGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyVGVtcENvZGUoICR1aWQsICRjb2RlICk7CiAgfQoKICBmdW5jdGlvbiBTZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUgKTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5R3JvdXBSZWxhdGlvbnMoICR0aXRsZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFByb3BlcnR5R3JvdXBSZWxhdGlvbnMoICR0aXRsZSApOwogIH0KCiAgZnVuY3Rpb24gSXNBY2NvdW50RXhwaXJlZCggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPklzQWNjb3VudEV4cGlyZWQoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApOwogIH0KCiAgZnVuY3Rpb24gQWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSwgJHNvcnRrZXksICR2YWwgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5BZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lLCAkc29ydGtleSwgJHZhbCApOwogIH0KCQogIGZ1bmN0aW9uIERlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCwgJHByb3BuYW1lICk7CiAgfQoKICBmdW5jdGlvbiBBZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoICk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlUHJvcGVydHlEZWZuKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZucygpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVByb3BlcnR5RGVmbnMoKTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbnMoKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRQcm9wZXJ0eURlZm5zKCk7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0UHJvcGVydHlEZWZuKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gTG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICk7CiAgfQoKICBmdW5jdGlvbiBBc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFzc2lnblVzZXJUb0dyb3VwKCAkdWlkLCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBJc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPklzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyRnVsbCggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVVzZXJGdWxsKCAkdWlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cEluZm8oICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cEluZm8oICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJJbmZvKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlckluZm8oICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJzSW5Hcm91cCggJGdpZCA9ICcnICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlcnNJbkdyb3VwKCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBHcm91cEV4aXN0c0J5SUQoICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Hcm91cEV4aXN0c0J5SUQoICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggJGVtYWlsLCAkc210cHZhbGlkYXRlID0gZmFsc2UgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Jc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgKTsKICB9CgogIGZ1bmN0aW9uIElzVmFsaWRVc2VybmFtZSggJHVzZXJuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+SXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKTsKICB9CgogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5SZW1vdmVVc2VyRnJvbUdyb3VwKCAkdWlkLCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBTZXRHcm91cCggJGdpZCwgJG5hbWUsICRkZXNjICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0R3JvdXAoICRnaWQsICRuYW1lLCAkZGVzYyApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclBhc3N3b3JkKCAkdWlkLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgfQoKICBmdW5jdGlvbiBTZXRVc2VyR3JvdXBzKCAkdWlkLCAkZ3JwaWRzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlckdyb3VwcyggJHVpZCwgJGdycGlkcyApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnRpZXMoICR1aWQsICRwcm9wcyApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPlNldFVzZXJQcm9wZXJ0aWVzKCAkdWlkLCAkcHJvcHMgKTsKICB9CgogIGZ1bmN0aW9uIFVzZXJFeGlzdHNCeUlEKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+VXNlckV4aXN0c0J5SUQoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0aWVzKCR1aWQpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJQcm9wZXJ0aWVzKCAkdWlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRNZW1iZXJHcm91cHNBcnJheSgkdXNlcmlkKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRNZW1iZXJHcm91cHNBcnJheSgkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRlZmF1bHR2YWx1ZT1mYWxzZSkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJQcm9wZXJ0eSggJHRpdGxlLCAkZGVmYXVsdHZhbHVlICk7CiAgfQoKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJHVzZXJpZCwkZGVmYXVsdHZhbHVlKTsKICB9CgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRhdGEpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUHJvcGVydHkoJHRpdGxlLCRkYXRhKTsKICB9CgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCRkYXRhLCR1c2VyaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkZGF0YSwkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbD1mYWxzZSkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbCk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRhbGwpOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlQWxsVXNlclByb3BlcnRpZXMoKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlQWxsVXNlclByb3BlcnRpZXMoKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlQWxsVXNlclByb3BlcnRpZXNGdWxsKCR1c2VyaWQpOwogIH0KCiAgZnVuY3Rpb24gQ2hlY2tQYXNzd29yZCgkdXNlcm5hbWUsJHBhc3N3b3JkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+Q2hlY2tQYXNzd29yZCgkdXNlcm5hbWUsJHBhc3NvcmQpOwogIH0KCiAgZnVuY3Rpb24gTG9nZ2VkSW5OYW1lKCkgCiAgewogICAgJHN0ciA9ICR0aGlzLT51c2VybWFuaXAtPkxvZ2dlZEluTmFtZSgpOwogICAgcmV0dXJuICRzdHI7CiAgfQoKICBmdW5jdGlvbiBMb2dnZWRJbkVtYWlsKCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkxvZ2dlZEluRW1haWwoKTsKICB9CgogIGZ1bmN0aW9uIExvZ291dCgpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dvdXQoKTsKICB9CgogIGZ1bmN0aW9uIExvZ291dFVzZXIoJHVpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkxvZ291dFVzZXIoJHVpZCk7CiAgfQoKICBmdW5jdGlvbiBFeHBpcmVVc2VycygpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5FeHBpcmVVc2VycygpOwogIH0KCiAgZnVuY3Rpb24gTG9nZ2VkSW5JZCgpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dnZWRJbklkKCk7CiAgfQoKICBmdW5jdGlvbiBMb2dnZWRJbigpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Mb2dnZWRJbigpOwogIH0KCiAgZnVuY3Rpb24gTWVtYmVyT2ZHcm91cCgkdXNlcmlkLCRncm91cGlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TWVtYmVyT2ZHcm91cCgkdXNlcmlkLCRncm91cGlkKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJOYW1lKCR1c2VyaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRVc2VyTmFtZSgkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIEdldEVtYWlsKCR1c2VyaWQpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRFbWFpbCgkdXNlcmlkKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJJRCgkdXNlcm5hbWUpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRVc2VySUQoJHVzZXJuYW1lKTsKICB9CgogIGZ1bmN0aW9uIEFkZEdyb3VwKCAkbmFtZSwgJGRlc2NyaXB0aW9uICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+QWRkR3JvdXAoICRuYW1lLCAkZGVzY3JpcHRpb24gKTsKICB9CgogIGZ1bmN0aW9uIEFkZFVzZXIoICRuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+QWRkVXNlciggJG5hbWUsICRwYXNzd29yZCwgJGV4cGlyZXMgKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwTmFtZSgkZ3JvdXBpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwTmFtZSggJGdyb3VwaWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwRGVzYygkZ3JvdXBpZCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0R3JvdXBEZXNjKCAkZ3JvdXBpZCApOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlR3JvdXBGdWxsKCAkZ2lkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlR3JvdXBGdWxsKCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cExpc3QoKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cExpc3QoKTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwTGlzdEZ1bGwoKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cExpc3RGdWxsKCk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cElEKCRncm91cG5hbWUpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldEdyb3VwSUQoICRncm91cG5hbWUgKTsKICB9CgogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3VwcygkdXNlcmlkKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRNZW1iZXJHcm91cHMoJHVzZXJpZCk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyKCRpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVVzZXIoICRpZCApOwogIH0KfSAvLyBjbGFzcwoKPz4K]]></data>
  </file>
  <file>
    <filename>/icons/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/icons/delete.gif</filename>
    <isdir>0</isdir>
    <data><![CDATA[R0lGODlhEAAQAOZ/AAE82AkNrcLT4rHS4gpU4iJr4Cs51gBF4gYjqk1Wyhle4R1m4hk0zQZF2QkMlglJ2wAAfAAAggAuqgAAci514gkOpgBD4mWK3A5R22OK35Wh0bXW4rDL4q/J4jh64QpGzBI6pzNtygtL28DA0x000Qcou6e23hVoxoqKyyBXvmGP0gAi1REjtl9fo3FxzszM6BBW4jF84kmN2JTA4T2G0sjZ4ktXzCZmwhVZ3hE3qQADiAATlAAVmDJnyEKD4RcclgBBthNErBtCvVl/21JcxFNb05a43rjW4gAAXwAzrAYfogkUtgAioAA4tgAAbAovqJ2/4j1T15aW0K6/4gNK38XV4rXT4gEhmiY0yWNjtz2G4pSy4cfH4U5XxBVk4h9q4sHB3CRw4hcuyUiM4kFy2U1z2leU4h8ops3c4lCQ4iM01zl70ExXzyVhy6Gh44iItRBR3SArsCkxtnZ23Rg9qwAMjzx/4ghP4IKy4gAdnQAt13ST3xMpvkWG4g1X3ezs7CH5BAEAAH8ALAAAAAAQABAAAAe6gH+Cg4SFhC9zBiQMDGJYLlyFbgZkazcpQSB0QnxShGoyJ0ASeXURExM5LIRRNE0STDs6EE5IVyWERTMhSTyzExBPfkuEbBscRio9KW0FXgcBhDYDAmh4Y1oxXwQW0YMJ1B1mfXYUC9zegglWVVBpPh4U2wcVhF1HNRcAAA0iGHf0CBHZYqLMCn4PEgYcJGfPlCF6GsDBoUABFQeEUMTRkOEAjAVhCnxw8KYQmCxnEKhU8qPFCEMwDQUCADs=]]></data>
  </file>
  <file>
    <filename>/icons/edit.gif</filename>
    <isdir>0</isdir>
    <data><![CDATA[R0lGODlhEAAQAOZ/ANfq//r+/ur0/+Xy/9/1/9rs/9bu/nehxf/+/fX///H4/+32/+j0/+P3/+bz/+Hw/3+ny3mgxV2XzViTyXqhxVuXzePx//z9/3eew3CYv/j7//r9//3+///+/9zu//f7//j8/3GZv/T6//b6/9/u/93u/+3+//b7/+Dv/1qTyVeY0HGYv/r8/8jf84etz26Xv1eTyfP4/+v1/uX1+FuY0NHq+q/L5IWhwVCKwG6fyun5/+n6/8DL2dzj6VaRyVqAp+T4//z+//T5//L5+9zt/6Kyxc/b5ODy/+Dn63ifxD9nkUdoj+P//1KKv9/v/52ww/D6/3KawfP6/1ORylGSzGOc0N/w/9fi64ykvJWmvPT9//f+/+Xx/////uH0/42ryf7+//7//1qQw0N1pkx5pYuetleNwFiVzePt8luWz+v7/9PZ41qX0J650MPM29ni6vH3++Lv/97u//b4+VJwllZzlVWTytjr/+Lx/16Bp+31/4Sdt+b4/3adw////////yH5BAEAAH8ALAAAAAAQABAAAAfjgH95BxQUGIeHfRERBz9/fyt+fgiSlX5dkhCPIX5rWZVgF35FPH6af0lIdWWSHEEgfk9LRi6PUQg9c5IXGx8fcG9DOY8ZlWEXLBonIgpQCRPEfh0dQRvKIgsDFiYp0R28GiNSC1x4cWrQf8UcGyAfMTLaKHI66ZwX4QoCDhZOJQVAYDx64YeDED0M5Hko4KGBj0dmAqCRsc+ClYUAWhiw80jMFTpYEjx4UOKOly9KbKR51MSPmz1aSJAgAuDIjTYmpjzC4WfLDBM7+DQgQKCGASZUHpGpwlSC0woVztBgo2LMn0AAOw==]]></data>
  </file>
  <file>
    <filename>/index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>/lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ3Byb21wdF9mb3Jnb3Rwd19wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIGZvciBGb3Jnb3QgUGFzc3dvcmQgZm9ybSc7CiRsYW5nWydwcm9tcHRfY2hhbmdlc2V0dGluZ3NfcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyBmb3IgQ2hhbmdlIFNldHRpbmdzIGZvcm0nOwokbGFuZ1sncHJvbXB0X2xvZ2luX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgdG8ganVtcCB0byBhZnRlciBsb2dpbic7CiRsYW5nWydwcm9tcHRfbG9nb3V0X3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgdG8ganVtcCB0byBhZnRlciBsb2dvdXQnOwokbGFuZ1snc29ydG9yZGVyJ10gPSAnU29ydCBvcmRlcic7CiRsYW5nWydwcm9tcHRfbnVtcmVzZXRyZWNvcmQnXSA9ICdBIG51bWJlciBvZiB1c2VycyBhcmUgaW4gdGhlIG1pZGRsZSBvZiByZXNldHRpbmcgbG9zdCBwYXNzd29yZHMuICBDdXJyZW50bHkgdGhpcyBjb3VudCBpcyBhdDonOwokbGFuZ1sncmVtb3ZlMXdlZWsnXSA9ICdSZW1vdmUgYWxsIGVudHJpZXMgbW9yZSB0aGFuIGEgd2VlayBvbGQnOwokbGFuZ1sncmVtb3ZlMW1vbnRoJ10gPSAnUmVtb3ZlIGFsbCBlbnRyaWVzIG1vcmUgdGhhbiBhIG1vbnRoIG9sZCc7CiRsYW5nWydyZW1vdmVhbGwnXSA9ICdSZW1vdmUgYWxsIGVudHJpZXMnOwokbGFuZ1snYXJleW91c3VyZSddID0gJ0FyZSB5b3Ugc3VyZT8nOyAKJGxhbmdbJ2Vycm9yX2ludmFsaWRjb2RlJ10gPSAnQW4gaW52YWxpZCBjb2RlIGhhcyBiZWVuIGVudGVyZWQsIHBsZWFzZSB0cnkgYWdhaW4nOwokbGFuZ1snZXJyb3JfdGVtcGNvZGVub3Rmb3VuZCddID0gJ0EgdGVtcG9yYXJ5IGNvZGUgZm9yIHlvdXIgdXNlciBpZCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGRhdGFiYXNlJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX3ZlcmlmeXRlbXBsYXRlJ10gPSAnVGVtcGxhdGUgdXNlZCB0byBkaXNwbGF5IHZlcmlmaWNhdGlvbiBmb3JtJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX2VtYWlsdGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSB1c2VkIGZvciBmb3Jnb3R0ZW4gcGFzc3dvcmQgZW1haWwnOyAKJGxhbmdbJ2Vycm9yX3Jlc2V0YWxyZWFkeXNlbnQnXSA9ICdFaXRoZXIgeW91cnNlbGYgb3Igc29tZW9uZSBlbHNlIGhhcyBhbHJlYWR5IHRyaWdnZXJlZCBhIHBhc3N3b3JkIHJlc2V0IG9wZXJhdGlvbiBmb3IgdGhpcyBhY2NvdW50LiAgQ2hlY2sgeW91ciBlbWFpbCwgeW91IG1heSBoYXZlIGZ1cnRoZXIgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byByZXNldCB5b3VyIHBhc3N3b3JkIGluIHlvdXIgaW5ib3gnOwokbGFuZ1snZXJyb3JfZGJlcnJvciddID0gJ0RhdGFiYXNlIGVycm9yJzsKJGxhbmdbJ21lc3NhZ2VfZm9yZ290cHdlbWFpbCddID0gJ1lvdSBhcmUgcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSBiZWNhdXNlIHNvbWVib2R5IHRvbGQgb3VyIHNpdGUgdGhhdCB5b3UgaGFkIGxvc3QgeW91ciBwYXNzd29yZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdy4gIElmIHlvdSBkb25cJ3QgaGF2ZSBhIGNsdWUgd2hhdCB0aGlzIGlzLCB0aGVuIHlvdSBhcmUgc2FmZSB0byBkZWxldGUgdGhpcyBtZXNzYWdlLCBhbmQgd2UgdGhhbmsgeW91IGZvciB5b3VyIHRpbWUuJzsKJGxhbmdbJ3Byb21wdF9jb2RlJ10gPSAnQ29kZSc7CiRsYW5nWydtZXNzYWdlX2NvZGUnXSA9ICdUaGUgZm9sbG93aW5nIGNvZGUgaGFzIGJlZW4gZ2VuZXJhdGVkIHJhbmRvbWx5IGdlbmVyYXRlZCBpbiBvcmRlciB0byB2ZXJpZnkgdGhlIHVzZXIgYWNjb3VudC4gIHdoZW4geW91IGNsaWNrIG9uIHRoZSBsaW5rIGJlbG93IHlvdSB3aWxsIGJlIHByZXNlbnRlZCB3aXRoIGEgZmllbGQgdG8gZW50ZXIgdGhpcyBjb2RlLiAgTm9ybWFsbHkgdGhlIGZpZWxkIGlzIHByZS1jb21wbGV0ZWQgZm9yIHlvdSwgYnV0IGluY2FzZSBpdCBpc25cJ3QgdGhlIGNvZGUgaXM6JzsKJGxhbmdbJ3Byb21wdF9saW5rJ10gPSAnQ2xpY2tpbmcgb24gdGhlIGZvbGxvd2luZyBsaW5rIHdpbGwgdGFrZSB5b3UgdG8gdGhlIHdlYnNpdGUgd2hlcmUgeW91IGNhbiBlbnRlciB0aGUgYWJvdmUgY29kZSwgYW5kIHJlc2V0IHlvdXIgcGFzc3dvcmQ6JzsKJGxhbmdbJ2xvc3RwYXNzd29yZF9lbWFpbHN1YmplY3QnXSA9ICdMb3N0IFBhc3N3b3JkJzsKJGxhbmdbJ2Vycm9yX25vbWFpbGVybW9kdWxlJ10gPSAnQ291bGQgbm90IGZpbmQgdGhlIENNU01haWxlciBtb2R1bGUnOwokbGFuZ1snaW5mb19mb3Jnb3Rwd21lc3NhZ2VzZW50J10gPSAnQW4gZW1haWwgaGFzIGJlZW4gc2VudCB0byAlcyB3aXRoIGluc3RydWN0aW9ucyBhcyB0byBob3cgdG8gcmVzZXQgeW91ciBwYXNzd29yZC4gIFRoYW5rIHlvdSc7CiRsYW5nWydsb3N0cHdfbWVzc2FnZSddID0gJ1NvIHlvdSBmb3Jnb3Qgb3IgbG9zdCB5b3VyIHBhc3N3b3JkLiBXZWxsLCB0eXBlIHlvdXIgdXNlcm5hbWUgaW4gaGVyZSwgYW5kIGlmIHdlIGNhbiBmaW5kIHlvdSB3ZSB3aWxsIHNlbmQgeW91IGFuIGVtYWlsIHdpdGggaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byByZXNldCBpdCc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZSddID0gJ0ZvcmdvdCBQYXNzd29yZCBUZW1wYXRlcyc7CiRsYW5nWydlcnJvcl9wcm9wbm90Zm91bmQnXSA9ICdQcm9wZXJ0eSAlcyBub3QgZm91bmQnOwokbGFuZ1sncHJvcHNmb3VuZCddID0gJ1Byb3BlcnRpZXMgZm91bmQnOwokbGFuZ1snYWRkcHJvcCddID0gJ0FkZCBQcm9wZXJ0eSc7CiRsYW5nWydlcnJvcl9yZXF1aXJlZGZpZWxkJ10gPSAnQSByZXF1aXJlZCBmaWVsZCAoJXMpIHdhcyBlbXB0eSc7CiRsYW5nWydpbmZvX2VtcHR5cGFzc3dvcmRmaWVsZCddID0gJ0VudGVyIGEgbmV3IHBhc3N3b3JkIGhlcmUgdG8gY2hhbmdlIHlvdXIgcGFzc3dvcmQnOwokbGFuZ1snZXJyb3Jfbm90bG9nZ2VkaW4nXSA9ICdZb3UgZG8gbm90IGFwcGVhciB0byBiZSBsb2dnZWQgaW4nOwokbGFuZ1sndXNlcl9zZXR0aW5ncyddID0gJ1NldHRpbmdzJzsKJGxhbmdbJ3VzZXJfcmVnaXN0cmF0aW9uJ10gPSAnUmVnaXN0cmF0aW9uJzsKJGxhbmdbJ2Vycm9yX2FjY291bnRleHBpcmVkJ10gPSAnVGhpcyBhY2NvdW50IGhhcyBleHBpcmVkJzsKJGxhbmdbJ2Vycm9yX2ltcHJvcGVyZW1haWxmb3JtYXQnXSA9ICdJbXByb3BlciBlbWFpbCBhZGRyZXNzIGZvcm1hdHRpbmcnOwokbGFuZ1snZXJyb3JfaW52YWxpZGV4cGlyeWRhdGUnXSA9ICdJbnZhbGlkIGV4cGlyeSBkYXRlJzsKJGxhbmdbJ2Vycm9yX3Byb2JsZW1zZXR0aW5ncHJvcGVydHknXSA9ICdFcnJvciBzZXR0aW5nIHByb3BlcnR5ICVzIGZvciB1c2VyICRzJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRncm91cGlkJ10gPSAnSW52YWxpZCBncm91cCBpZCAlcyc7CiRsYW5nWydzb3J0b3JkZXInXSA9ICdTb3J0IG9yZGVyJzsKJGxhbmdbJ2hpZGRlbmZpZWxkbWFya2VyJ10gPSAnSGlkZGVuIGZpZWxkIG1hcmtlcic7CiRsYW5nWydoaWRkZW5maWVsZGNvbG9yJ10gPSAnSGlkZGVuIGZpZWxkIGNvbG9yJzsKJGxhbmdbJ2hpZGRlbiddID0gJ0hpZGRlbic7CiRsYW5nWydlcnJvcl9kdXBsaWNhdGVuYW1lJ10gPSAnQSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZSBpcyBhbHJlYWR5IGRlZmluZWQnOwokbGFuZ1snZXJyb3Jfbm9wcm9wZXJ0aWVzJ10gPSAnTm8gcHJvcGVydGllcyBkZWZpbmVkJzsKJGxhbmdbJ2dyb3Vwc2ZvdW5kJ10gPSAnR3JvdXBzIGZvdW5kJzsKJGxhbmdbJ2Vycm9yX29uZWdyb3VwcmVxdWlyZWQnXSA9ICdNZW1iZXJzaGlwIGluIGF0IGxlYXN0IG9uZSBncm91cCBpcyByZXF1aXJlZCc7CiRsYW5nWydwcm9tcHRfcmVxdWlyZW9uZWdyb3VwJ10gPSAnUmVxdWlyZSBtZW1iZXJzaGlwIGluIGF0bGVhc3Qgb25lIGdyb3VwJzsKJGxhbmdbJ2JhY2snXSA9ICdCYWNrJzsKJGxhbmdbJ2Vycm9yX21pc3NpbmdfcmVxdWlyZWRfcGFyYW0nXSA9ICclcyBpcyBhIHJlcXVpcmVkIGZpZWxkJzsKJGxhbmdbJ3JlcXVpcmVkZmllbGRtYXJrZXInXSA9ICdNYXJrIHJlcXVpcmVkIGZpZWxkcyB3aXRoJzsKJGxhbmdbJ3JlcXVpcmVkZmllbGRjb2xvciddID0gJ0hpbGl0ZSByZXF1aXJlZCBmaWVsZHMgaW4nOwokbGFuZ1snbmV4dCddID0gJ05leHQnOwokbGFuZ1snZXJyb3JfZ3JvdXBleGlzdHMnXSA9ICdBIEdyb3VwIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnUmVxdWlyZWQnOwokbGFuZ1snb3B0aW9uYWwnXSA9ICdPcHRpb25hbCc7CiRsYW5nWydvZmYnXSA9ICdPZmYnOwokbGFuZ1snbGVuZ3RoJ10gPSAnTGVuZ3RoJzsKJGxhbmdbJ3llcyddID0gJ1llcyc7CiRsYW5nWydwcm9tcHQnXSA9ICdQcm9tcHQnOwokbGFuZ1sndHlwZSddID0gJ1R5cGUnOwokbGFuZ1sncmVxdWlyZWQnXSA9ICdSZXF1aXJlZCBGaWVsZCc7CiRsYW5nWyd0ZXh0J10gPSAnVGV4dCc7CiRsYW5nWydjaGVja2JveCddID0gJ0NoZWNrYm94JzsKJGxhbmdbJ2VtYWlsJ10gPSAnRW1haWwnOwokbGFuZ1snbXNnX2N1cnJlbnRseWxvZ2dlZGluYXMnXSA9ICdXZWxjb21lJzsKJGxhbmdbJ2xvZ291dCddID0gJ1NpZ24gb3V0JzsKJGxhbmdbJ3Byb21wdF9jaGFuZ2VzZXR0aW5ncyddID0gJ0NoYW5nZSBNeSBTZXR0aW5ncyc7CiRsYW5nWydlcnJvcl9sb2dpbmZhaWxlZCddID0gJ0xvZ2luIGZhaWxlZCAtIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQ/JzsKJGxhbmdbJ2xvZ2luJ10gPSAnU2lnbiBpbic7CiRsYW5nWydwcm9tcHRfdXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWydwcm9tcHRfcGFzc3dvcmQnXSA9ICdQYXNzd29yZCc7CiRsYW5nWydyZWdpc3RlciddID0gJ1JlZ2lzdGVyJzsKJGxhbmdbJ2ZvcmdvdHB3J10gPSAnRm9yZ290IFlvdXIgUGFzc3dvcmQ/JzsKJGxhbmdbJ2RlZmF1bHRzJ10gPSAnRGVmYXVsdHMnOwokbGFuZ1sndGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSc7CiRsYW5nWydlcnJvcl91c2Vybm90Zm91bmQnXSA9ICdVc2VyIElEIG5vdCBmb3VuZCc7CiRsYW5nWydlcnJvcl91c2VybmFtZXRha2VuJ10gPSAnVGhhdCB1c2VybmFtZSAoJXMpIGlzIGFscmVhZHkgaW4gdXNlJzsKJGxhbmdbJ3Byb21wdF9zbXRwdmFsaWRhdGUnXSA9ICdVc2UgU01UUCB0byB2YWxpZGF0ZSBlbWFpbCBhZGRyZXNzZXM/JzsKJGxhbmdbJ3Byb21wdF9taW5wd2xlbiddID0gJ01pbmltdW0gUGFzc3dvcmQgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9tYXhwd2xlbiddID0gJ01heGltdW0gUGFzc3dvcmQgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9taW51bmxlbiddID0gJ01pbmltdW0gVXNlcm5hbWUgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9tYXh1bmxlbiddID0gJ01heGltdW0gVXNlcm5hbWUgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9zZXNzaW9udGltZW91dCddID0gJ1Nlc3Npb24gVGltZW91dCAobWludXRlcyknOwokbGFuZ1sncHJvbXB0X2FsbG93ZW1haWxyZWcnXSA9ICdBbGxvdyBFbWFpbCBSZWdpc3RyYXRpb24nOwokbGFuZ1sncHJvbXB0X2RmbHRncm91cCddID0gJ0RlZmF1bHQgR3JvdXAgZm9yIG5ldyB1c2Vycyc7CiRsYW5nWydjaGFuZ2VzZXR0aW5nc190ZW1wbGF0ZSddID0gJ0NoYW5nZSBTZXR0aW5ncyBUZW1wbGF0ZSc7CiRsYW5nWydlcnJvcl9wYXNzd29yZG1pc21hdGNoJ10gPSAnUGFzc3dvcmRzIERvIG5vdCBtYXRjaCc7CiRsYW5nWydlcnJvcl9pbnZhbGlkdXNlcm5hbWUnXSA9ICdJbnZhbGlkIFVzZXJuYW1lJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXNzd29yZCddID0gJ0ludmFsaWQgUGFzc3dvcmQnOwokbGFuZ1snZWRpdHVzZXInXSA9ICdFZGl0IFVzZXInOwokbGFuZ1sndmFsaWQnXSA9ICdWYWxpZCc7CiRsYW5nWyd1c2VybmFtZSddID0gJ1VzZXJuYW1lJzsKJGxhbmdbJ3N0YXR1cyddID0gJ1N0YXR1cyc7CiRsYW5nWydlcnJvcl9tZW1iZXJncm91cHMnXSA9ICdUaGlzIHVzZXIgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncm91cHMnOwokbGFuZ1snZXJyb3JfcHJvcGVydGllcyddID0gJ05vIFByb3BlcnRpZXMnOwokbGFuZ1sndmFsdWUnXSA9ICdWYWx1ZSc7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cHMnOwokbGFuZ1sncHJvcGVydGllcyddID0gJ1Byb3BlcnRpZXMnOwokbGFuZ1sncHJvcG5hbWUnXSA9ICdQcm9wZXJ0eSBOYW1lJzsKJGxhbmdbJ3Byb3B2YWx1ZSddID0gJ1Byb3BlcnR5IFZhbHVlJzsKJGxhbmdbJ2FkZCddID0gJ0FkZCc7CiRsYW5nWydlZGl0J10gPSAnRWRpdCc7CiRsYW5nWydleHBpcmVzJ10gPSAnRXhwaXJlcyc7CiRsYW5nWydzcGVjaWZ5X2RhdGUnXSA9ICdTcGVjaWZ5IERhdGUnOwokbGFuZ1snMTJocnMnXSA9ICcxMiBIb3Vycyc7CiRsYW5nWycyNGhycyddID0gJzI0IEhvdXJzJzsKJGxhbmdbJzQ4aHJzJ10gPSAnNDggSG91cnMnOwokbGFuZ1snMXdlZWsnXSA9ICcxIFdlZWsnOwokbGFuZ1snMndlZWtzJ10gPSAnMiBXZWVrcyc7CiRsYW5nWycxbW9udGgnXSA9ICcxIE1vbnRoJzsKJGxhbmdbJzNtb250aHMnXSA9ICczIE1vbnRocyc7CiRsYW5nWyc2bW9udGhzJ10gPSAnNiBNb250aHMnOwokbGFuZ1snMXllYXInXSA9ICcxIFllYXInOwokbGFuZ1snbmV2ZXInXSA9ICdOZXZlcic7CiRsYW5nWydwb3N0aW5zdGFsbG1lc3NhZ2UnXSA9ICdNb2R1bGUgaW5zdGFsbGVkIHN1Y2Vzc2Z1bGx5Ljxici8+QmUgc3VyZSB0byBzZXQgdGhlICJNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMgcGVybWlzc2lvbi4iJzsKJGxhbmdbJ2VtYWlsJ10gPSAnRW1haWwgQWRkcmVzcyc7CiRsYW5nWydwYXNzd29yZCddID0gJ1Bhc3N3b3JkJzsKJGxhbmdbJ3JlcGVhdHBhc3N3b3JkJ10gPSAnQWdhaW4nOwokbGFuZ1snZXJyb3JfZ3JvdXBuYW1lX2V4aXN0cyddID0gJ0dyb3VwIGJ5IHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyc7CiRsYW5nWydlZGl0Z3JvdXAnXSA9ICdFZGl0IEdyb3VwJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snZGVsZXRlJ10gPSAnRGVsZXRlJzsKJGxhbmdbJ2FyZXlvdXN1cmVfZGVsZXRlZ3JvdXAnXSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZ3JvdXA/JzsKJGxhbmdbJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcyddID0gJ0luc3VmZmljaWVudCBQYXJhbWV0ZXJzJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snbmFtZSddID0gJ05hbWUnOwokbGFuZ1snZXJyb3JfY2FudGFkZGdvcnVwJ10gPSAnUHJvYmxlbSBhZGRpbmcgZ3JvdXAnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ0ludmFsaWQgUGFyYW1ldGVycyc7CiRsYW5nWydhcHBseWZpbHRlciddID0gJ0FwcGx5JzsKJGxhbmdbJ2ZpbHRlciddID0gJ0ZpbHRlcic7CiRsYW5nWyd1c2VyZmlsdGVyJ10gPSAnVXNlciBSZWd1bGFyIEV4cHJlc3Npb24nOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdEZXNjcmlwdGlvbic7CiRsYW5nWyduYW1lJ10gPSAnTmFtZSc7CiRsYW5nWydncm91cG5hbWUnXSA9ICdHcm91cCBOYW1lJzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQnOwokbGFuZ1snZXJyb3InXSA9ICdFcnJvcic7CiRsYW5nWydhZGRncm91cCddID0gJ0FkZCBHcm91cCc7CiRsYW5nWydhZGR1c2VyJ10gPSAnQWRkIFVzZXInOwokbGFuZ1snZ3JvdXBzZm91bmQnXSA9ICdHcm91cHMgRm91bmQnOwokbGFuZ1sndXNlcnNmb3VuZCddID0gJ1VzZXJzIEZvdW5kJzsKJGxhbmdbJ2dyb3VwJ10gPSAnR3JvdXAnOwokbGFuZ1snc2VsZWN0Z3JvdXAnXSA9ICdTZWxlY3QgR3JvdXAnOwokbGFuZ1sncmVnaXN0cmF0aW9uX3RlbXBsYXRlJ10gPSAnUmVnaXN0cmF0aW9uIFRlbXBsYXRlJzsKJGxhbmdbJ2xvZ291dF90ZW1wbGF0ZSddID0gJ0xvZ291dCBUZW1wbGF0ZSc7CiRsYW5nWydsb2dpbl90ZW1wbGF0ZSddID0gJ0xvZ2luIFRlbXBsYXRlJzsKJGxhbmdbJ3ByZWZlcmVuY2VzJ10gPSAnUHJlZmVyZW5jZXMnOwokbGFuZ1snZ3JvdXBzJ10gPSAnR3JvdXBzJzsKJGxhbmdbJ3VzZXJzJ10gPSAiVXNlcnMiOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnRnJvbnRlbmQgVXNlciBNYW5hZ21lbnQnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdNYW5hZ2UgRnJvbnRlbmQgVXNlcnMnOwokbGFuZ1snZGVmYXVsdGZyb250cGFnZSddID0gIkRlZmF1bHQgZnJvbnQgcGFnZSI7CiRsYW5nWydsYXN0YWNjZXNzZWRwYWdlJ10gPSAnTGFzdCBhY2Nlc3NlZCBwYWdlJzsKJGxhbmdbJ290aGVycGFnZSddID0gJ090aGVyIHBhZ2U6ICc7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9IDw8PEVPRgo8dWw+CjxsaT4wLjAuMSAtIE9jdG9iZXIsIDIwMDUgLSBJbml0aWFsIE5SUFQgKE5vdCBSZWFkeSBmb3IgUHJpbWUgVGltZSkgcmVsZWFzZTwvbGk+CjxsaT4wLjEuMCAtIE9jdG9iZXIsIDIwMDUgLSBJbml0aWFsIHJlbGVhc2U8L2xpPgo8bGk+MC4xLjEgLSBPY3RvYmVyLCAyMDA1IC0gRml4ZWQgaXNzdWVzIHdpdGggcHJvcGVydGllczwvbGk+CjxsaT4wLjEuMiAtIE9jdG9iZXIsIDIwMDUgLSBBZGRlZCBmb3Jnb3R0ZW4gcGFzc3dvcmQgZnVuY3Rpb25hbGl0eTwvbGk+CjxsaT48cD4wLjEuMyAtIE5vdmVtYmVyLCAyMDA1PC9wPgogICAgPHA+QWRkZWQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBhIHJlZGlyZWN0IHBhZ2Ugb24gbG9naW4sIGxvZ291dCwgZm9yZ290IHBhc3N3b3JkLCBhbmQgY2hhbmdlIHNldHRpbmdzLCBhbmQgYWRkZWQgdGhlIHJldHVybnRvIGFuZCBmb3JtIHBhcmFtZXRlcnMgdG8gdGhlIHVzZXIgc2lkZSBvZiB0aGluZ3MsIGFsc28gZGlkIGEgY291cGxlIGxmIGxpdHRsZSBjbGVhbnVwcy4gIFRoaXMgdmVyc2lvbiByZXF1aXJlcyB2MC4xMSBhbmQgYWJvdmUgZm9yIGNlcnRhaW4uPC9wPjwvbGk+CjxsaT4wLjEuNCAtIE5vdmVtYmVyLCAyMDA1IC0gVmVyeSBtaW5vciBjaGFuZ2Ugd2l0aCByZXNwZWN0IHRvIGEgZm9yZ290dGVuIGFuZCBubyBsb25nZXIgbmVlZGVkIGZ1bmN0aW9uIGNhbGw8L2xpPgo8bGk+PHA+MC4xLjUgLSBOb3ZlbWJlciwgMjAwNTwvcD4KICAgIDxwPkFub3RoZXIgdmVyeSBtaW5vciBjaGFuZ2UsIGFkZGVkIHNvbWUgdGV4dCB0byB0aGUgUG9zdEluc3RhbGwgbWVzc2FnZS48L3A+PC9saT4KPGxpPjxwPjAuMS42IC0gSmFudWFyeSwgMjAwNjxwPgogICAgPHA+Q2hhbmdlcyB0byB0aGUgcGVybWlzc2lvbiBtb2RlbCwgYW5kIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgcHJlZmVyZW5jZXMuICBBbHNvIHNvbWUgcGhwNSBmaXhlcyBidXQgSSBhbSBzdXJlIHRoYXQgdGhlcmUgYXJlIG1vcmUgb3V0IHRoZXJlLjwvcD48L2xpPgo8L3VsPgpFT0Y7CiRsYW5nWydoZWxwJ10gPSA8PDxFT0YKPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgbW9kdWxlIGFsbG93cyBtYW5hZ2VtZW50IGFuZCBhZG1pbmlzdHJhdGlvbiBvZiBmcm9udCBlbmQgdXNlcnMgPGk+KHVzZXJzIHdobyBoYXZlIG5vIGFkbWluIGFjY2Vzc3MpPC9pPi4gIEl0IGFsbG93cyBjcmVhdGlvbiBvZiB1c2VyIGdyb3VwcywgYW5kIHVzZXIgYWNjb3VudHMgYW5kIGFsbG93cyB1c2VycyB0byBsb2dpbiBhbmQgbG9nb3V0LiAgaXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQ3VzdG9tQ29udGVudCBtb2R1bGUgdG8gZGlzcGxheSBkaWZmZXJlbnQgY29udGVudCB0byBkaWZmZXJlbnQgdXNlcnMgb25jZSB0aGV5IGhhdmUgbG9nZ2VkIGluPC9wPgo8aDM+RmVhdHVyZXM8L2gzPgo8dWw+CjxsaT48cD5Vc2VyIGFjY291bnQgZXhwaXJhdGlvbi4gIFlvdSBjYW4gY3JlYXRlIHRlbXBvcmFyeSB1c2VyczwvcD48L2xpPgo8bGk+PHA+R3JvdXAgUHJvcGVydGllcy4gIFlvdSBjYW4gYXNrIGZvciBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIG9mIGRpZmZlcmVudCBncm91cHM8L3A+PC9saT4KPGxpPjxwPkNhcGFibGUgb2YgaGFuZGxpbmcgaHVuZHJlZHMgb2YgdXNlcnM8L3A+PC9saT4KPGxpPjxwPkhhcyBhbiBleHRlbnNpdmUgQVBJIGZvciBhZGRpbmcgZnVuY3Rpb25hbGl0eTwvcD48L2xpPgo8L3VsPgo8aDM+SG93IGRvIEkgdXNlIGl0PC9oMz4KPHVsPgo8bGk+PHA+QWZ0ZXIgaW5zdGFsbGF0aW9uIHlvdSBjYW4gYWNjZXNzIGFkbWluIHBhbmVsIHRvIHRoZSBGcm9udEVuZFVzZXJzIG1vZHVsZSB1bmRlciB0aGUgJnF1b3Q7VXNlcnMgJiBnR3JvdXBzJnF1b3Q7IG1lbnUuPC9wPjwvbGk+CjxsaT4KPHA+U2Vjb25kbHksIHlvdSBzaG91bGQgZGVmaW5lIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIGFyZSBlc3NlbnRpYWxseSBmaWVsZCBkZWZpbml0aW9ucywgaGVyZSB5b3Ugc3BlY2lmeSB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiB5b3Ugd2FudCB0byBnYXRoZXIsIGFuZCBsaW1pdHMuIGkuZTogIE5hbWUsIEFnZSwgQ2l0eSwgU3RhdGUsIENvdW50cnksIEVtYWlsIGFkZHJlc3MsIGV0Yy48L3A+CjxwPjxiPk5vdGU6PC9iPiBZb3UgZG8gbm90IG5lZWQgdG8gZGVmaW5lIHByb3BlcnRpZXMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgdGhlc2Ugd2lsbCBiZSBwcm92aWRlZCBmb3IgeW91PC9iPgo8L2xpPgo8bGk+PHA+TmV4dCB5b3Ugc2hvdWxkIGNyZWF0ZSBvbmUgb3IgbW9yZSB1c2VyIGdyb3Vwcy4gIFdoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCB5b3UgYXJlIGFza2VkIGZvciBhIGdyb3VwIG5hbWUsIGEgZGVzY3JpcHRpb24gYW5kIHRvIGFzc29jaWF0ZSBwcm9wZXJ0aWVzIHdpdGggdGhhdCBncm91cCwgc3BlY2lmeSB0aGUgcHJvcGVydGllcyBzb3J0IG9yZGVyLCBhbmQgd2V0aGVyIGl0IGlzIGFuIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgaGlkZGVuIGZpZWxkIDxpPihvZmYgaXMgYWxzbyB2YWxpZCk8L2k+PC9wPjwvbGk+CjxsaT48cD48Yj5Ob3RlOjwvYj4gQmVmb3JlIHByb2NlZWRpbmcsIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHByZWZlcmVuY2VzIGFyZSBzZXQgY29ycmVjdGx5LjwvcD48L2xpPgo8bGk+PHA+VGhpcmRseSB5b3Ugc2hvdWxkIGNyZWF0ZSBzb21lIHVzZXJzLiAgQWRkaW5nIHVzZXJzIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gIFdoZW4gY3JlYXRpbmcgYSB1c2VyIHlvdSBhcmUgYXNrZWQgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIGFuZCBhbiBleHBpcnkgZGF0ZSBmb3IgdGhhdCB1c2VyLiAgWW91IHRoZW4gbXVzdCBzZWxlY3QgdGhlIGdyb3VwcyB0aGF0IHRoYXQgdXNlciBpcyBhIG1lbWJlciBvZiwgYW5kIGNsaWNrIFwnTmV4dFwnPC9wPgo8cD48ZW0+Tm90ZTogPC9lbT5UaGlzIGlzIGEgbGFib3VyIGludGVuc2l2ZSBhbmQgYm9yaW5nIHByb2Nlc3MsIGl0IGlzIGVhc2llciB0byBsZXQgdXNlcnMgcmVnaXN0ZXIgdGhlbXNlbHZlcywgYW5kIHRoZW4geW91IGNhbiBlZGl0IHRoZWlyIGdyb3VwIGluZm9ybWF0aW9uLiAgYnV0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBwbGVhc2UgY3JlYXRlIGF0IGxlc3Qgb25lIHVzZXI8L3A+PC9saT4KPGxpPjxwPkxhc3RseSwgYWZ0ZXIgdGhlIHN5c3RlbSBoYXMgZGV0ZXJtaW5lZCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyB0byBiZSBwcmVzZW50ZWQgZm9yIHRoYXQgdXNlciwgeW91IGFyZSBwcmVzZW50ZWQgd2l0aCBhIGZvcm0gYXNraW5nIGZvciBhbGwgb2YgdGhlIHJlcXVpcmVkIHVzZXIgaW5mb3JtYXRpb24uICBDb21wbGV0ZSB0aGlzIGZvcm0gdG8gY29tcGxldGUgdGhlIHVzZXIgYWRkaXRpb248L3A+PC9saT4KPGxpPjxwPllvdSBhcmUgbm93IHJlYWR5IHRvIGFkZCB0aGUgZnJvbnQgZW5kIGZ1bmN0aW9uYWxpdHkgdG8geW91ciBzaXRlLiAgVGhpcyBpcyBhcyBzaW1wbGUgYXMgYWRkaW5nIHRoZSB7Y21zX21vZHVsZSBtb2R1bGU9RnJvbnRFbmRVc2Vyc30gdGFnIHRvIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZTwvcD48L2xpPgo8L3VsPgo8aDM+U3VwcG9ydDwvaDM+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4KPHVsPgo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IGNhbGd1eVwncwptb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0iaHR0cDovL3RlY2hjb20uZHluZG5zLm9yZyI+dGVjaGNvbS5keW5kbnMub3JnPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8aDM+UGFyYW1ldGVyczwvaDM+Cjx1bD4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZm9ybT0ibmFtZSI8L2xpPgo8cD5Gb3JtczoKPHVsPgogPGxpPjxlbT5sb2dpbjwvZW0+IC0gRGlzcGxheSB0aGUgbG9naW4gZm9ybTwvbGk+CiA8bGk+PGVtPmxvZ291dDwvZW0+IC0gRGlzcGxheSB0aGUgbG9nb3V0IGZvcm08L2xpPgogPGxpPjxlbT5jaGFuZ2VzZXR0aW5nczwvZW0+IC0gRGlzcGxheSB0aGUgY2hhbmdlIHNldHRpbmdzIGZvcm08L2xpPgogPGxpPjxlbT5mb3Jnb3RwdzwvZW0+IC0gRGlzcGxheSB0aGUgZm9yZ290IHBhc3N3b3JkIGZvcm08L2xpPgo8L3VsPgo8L3A+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IHJldHVybnRvPSJwYWdlIjwvbGk+CjxwPlVzZWQgd2l0aCB0aGUgbG9naW4sIGxvZ291dCwgYW5kIGNoYW5nZXNldHRpbmdzIGZvcm1zLCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgcGFnZSBpZCBvciBhbGlhcyBvZiBhIHBhZ2UgdG8gcmVkaXJlY3QgdG8sIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZDwvcD4KPC91bD4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0Cm9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPlJlcXVpcmVtZW50czwvaDM+CjxwPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHksIHRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoZSBDTVNNYWlsZXIgbW9kdWxlIHRvIGJlIHByZXZpb3VzbHkgaW5zdGFsbGVkPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPgpFT0Y7Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>/Random.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHANCg0KLyoqDQogKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycy4NCiAqDQogKiBAYXV0aG9yICAgIExhdXJlbnRpdSBUYW5hc2UgPGV4cGVydHBocEB5YWhvby5jb20+DQogKiBAdmVyc2lvbiAgIDEuMQ0KICovDQoNCmNsYXNzIFJhbmRvbQ0Kew0KCS8qKg0KCSAqIFNldCBkZWZhdWx0IGNoYXJhY3RlcnMuDQogICAgICoNCiAgICAgKiBAdmFyICAgICAgc3RyaW5nDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3ZjcnM7DQoNCgkvKioNCgkgKiBJZiBoYXZlIG51bWJlcg0KICAgICAqDQogICAgICogQHZhciAgICAgIGJvb2wNCiAgICAgKiBAYWNjZXNzICAgcHJpdmF0ZQ0KICAgICAqLw0KDQoJdmFyICRfdm51bTsNCg0KCS8qKg0KCSAqIElmIGRvZXNuJ3QgaGF2ZSBudW1iZXINCiAgICAgKg0KICAgICAqIEB2YXIgICAgICBib29sDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3Zub3Q7DQoNCgkvKioNCgkgKiBDb25zdHJ1Y3Rvcg0KCSAqDQoJICogU2V0IGRlZmF1bHQgdmFsdWVzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgJGNycyAgIENoYXJhY3RlcnMgb3V0cHV0DQoJICogQHBhcmFtICBib29sICAgICRudW0gICBXaXRoIG51bWJlcg0KCSAqIEBwYXJhbSAgYm9vbCAgICAkbm90ICAgV2l0aCBub3QgbnVtYmVyDQoJICovDQoNCglmdW5jdGlvbiBSYW5kb20oJGNycyA9IGZhbHNlLCAkbnVtID0gZmFsc2UsICRub3QgPSBmYWxzZSl7DQoJCSR0aGlzLT5fdm51bSA9ICRudW07DQoJCSR0aGlzLT5fdm5vdCA9ICRub3Q7DQoJCWlmKCEkY3JzKXsNCgkJCSR0aGlzLT5fdmNycyA9ICIwMTIzNDU2Nzg5Ii4NCgkJCQkiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLg0KCQkJCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7DQoJCX1lbHNlew0KCQkJJHRoaXMtPl92Y3JzID0gJGNyczsNCgkJCWlmKCgkbnVtIHx8ICRub3QpICYmICEkdGhpcy0+X3JlYygkY3JzLCAkbnVtLCAkbm90KSl7DQoJCQkJaWYoJG51bSAmJiAkbm90KSAkZXJyID0gIm51bWJlciBvciBub3QgbnVtYmVyIjsNCgkJCQllbHNlaWYoJG51bSkgJGVyciA9ICJudW1iZXIiOw0KCQkJCWVsc2VpZigkbm90KSAkZXJyID0gIm5vdCBudW1iZXIiOw0KCQkJCWVsc2UgJGVyciA9ICJjb21wYXJhdGlvbiI7DQoJCQkJdHJpZ2dlcl9lcnJvcigiQ2xhc3MgUmFuZG9tIC0gU3RyaW5nIGlucHV0IFsgIi4kY3JzLiIgXSBkb2Vzbid0IGhhdmUgIi4kZXJyLCBFX1VTRVJfRVJST1IpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLyoqDQoJICogQ29tcGFyZSBpbnB1dCBzdHJpbmcNCgkgKg0KCSAqIEBhY2Nlc3MgIHByaXZhdGUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkc3RyICAgICAgQ2hhcmFjdGVycyBpbnB1dA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRudW1iZXIgICBIYXZlIG51bWJlcg0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRub3RudW0gICBIYXZlIG5vdCBudW1iZXINCgkgKiBAcmV0dXJuICBib29sICAgICBJZiBoYXZlIG51bWJlciBvci9hbmQgbm90IG51bWJlcg0KCSAqLw0KDQoJZnVuY3Rpb24gX3JlYygkc3RyLCAkbnVtYmVyID0gdHJ1ZSwgJG5vdG51bSA9IHRydWUpew0KCQkkY250ID0gc3RybGVuKCRzdHIpOw0KCQkkc2V0MSA9ICRzZXQyID0gZmFsc2U7DQoJCWlmKCRudW1iZXIgfHwgJG5vdG51bSl7DQoJCQlmb3IoJGk9MDskaTwkY250OyRpKyspew0KCQkJCWlmKCRzdHJ7JGl9ID09PSBzdHJ2YWwoaW50dmFsKCRzdHJ7JGl9KSkpICRzZXQxID0gdHJ1ZTsNCgkJCQllbHNlICRzZXQyID0gdHJ1ZTsNCgkJCQlpZigkc2V0MSAmJiAkc2V0MikgYnJlYWs7DQoJCQl9DQoJCQlpZigkbnVtYmVyICYmICRub3RudW0pIHJldHVybiAoJHNldDEgJiYgJHNldDIpOw0KCQkJZWxzZWlmKCRudW1iZXIpIHJldHVybiAkc2V0MTsNCgkJCWVsc2VpZigkbm90bnVtKSByZXR1cm4gJHNldDI7DQoJCQllbHNlIHJldHVybiB0cnVlOw0KCQl9ZWxzZSByZXR1cm4gdHJ1ZTsNCgl9DQoNCgkvKioNCgkgKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycw0KCSAqDQoJICogQGFjY2VzcyAgcHVibGljDQoJICogQHBhcmFtICAgaW50ICAgICAgJGxlbiAgIExlbmd0aCBvZiB0aGUgc3RyaW5nIHlvdSB3YW50IGdlbmVyYXRlZA0KCSAqIEByZXR1cm4gIHN0cmluZyAgIFJhbmRvbSBjaGFyYWN0ZXJzDQoJICovDQoNCglmdW5jdGlvbiBnZXQoJGxlbil7DQoJCWlmKCEoaXNfaW50KCRsZW4pICYmICRsZW4gPiAwKSkgcmV0dXJuICR0aGlzLT5fdmNyczsNCgkJJHJldCA9ICIiOw0KCQkkY250ID0gc3RybGVuKCR0aGlzLT5fdmNycyktMTsNCgkJZm9yKCRpPTA7JGk8JGxlbjskaSsrKSAkcmV0IC49ICR0aGlzLT5fdmNyc3tyYW5kKDAsICRjbnQpfTsNCgkJaWYoJHRoaXMtPl92bnVtIHx8ICR0aGlzLT5fdm5vdCkgcmV0dXJuICR0aGlzLT5fcmVjKCRyZXQsICR0aGlzLT5fdm51bSwgJHRoaXMtPl92bm90KSA/ICRyZXQgOiBSYW5kb206OmdldCgkbGVuKTsNCgkJZWxzZSByZXR1cm4gJHJldDsNCgl9DQoNCn0NCg0KPz4=]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/addgroup.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2dyb3VwbmFtZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2dyb3VwbmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZ3JvdXBkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZ3JvdXBkZXNjfTwvcD4KICA8L2Rpdj4Ke2lmICRwcm9wY291bnQgPiAwfQo8YnIvPgo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoPnskbmFtZXRleHR9PC90aD4KCSAgICAgICAgICAgICAgICA8dGg+eyRwcm9tcHR0ZXh0fTwvdGg+CgkJCTx0aD57JHR5cGV0ZXh0fTwvdGg+CgkgICAgICAgICAgICAgICAgPHRoPnskc29ydG9yZGVydGV4dH08L3RoPgoJCQk8dGg+eyRyZXF1aXJlZHRleHR9PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kcHJvcHMgaXRlbT1wcm9wZX0KCQk8dHIgY2xhc3M9InskcHJvcC0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskcHJvcGUtPm5hbWV9PC90ZD4KCQkJPHRkPnskcHJvcGUtPnByb21wdH08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+dHlwZX08L3RkPgoJICAgICAgICAgICAgICAgIDx0ZD57JHByb3BlLT5zb3J0b3JkZXJ9PC90ZD4KCQkJPHRkPnskcHJvcGUtPnJlcXVpcmVkfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbn17JHN1Ym1pdH17JGNhbmNlbH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0Key9pZn0K]]></data>
  </file>
  <file>
    <filename>/templates/addprop.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbmFtZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X25hbWV9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3Byb21wdH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3Byb21wdH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfdHlwZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3R5cGV9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xlbmd0aH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2xlbmd0aH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adduser1.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfdXNlcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91c2VybmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcGFzc3dvcmR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wYXNzd29yZH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcmVwZWF0cGFzc3dvcmR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9yZXBlYXRwYXNzd29yZH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwaXJlc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57aHRtbF9zZWxlY3RfZGF0ZSBwcmVmaXg9JGV4cGlyZXNfZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZSBzdGFydF95ZWFyPTIwMDAgZW5kX3llYXI9MjA0MH0ge2h0bWxfc2VsZWN0X3RpbWUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZX08L3A+CiAgPC9kaXY+CntpZiAkaXRlbWNvdW50ID4gMH0KPGJyLz4KeyRncm91cHN0aXRsZX0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskaWR0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlc2N9PC90ZD4KCQkJPHRkPnskZW50cnktPm1lbWJlcn08L3RkPgoJCTwvdHI+CnsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CnsvaWZ9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyR1c2VyX2lkfXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/adduser2.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CntpZiAkY29udHJvbGNvdW50ID4gMH0KICA8Y2VudGVyPgogIDx0YWJsZSB3aWR0aD0iNzUlIj4Ke2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgIDx0ZD57JGNvbnRyb2wtPmhpZGRlbn0KICAgIDxmb250IGNvbG9yPSJ7JGNvbnRyb2wtPmNvbG9yfSI+eyRjb250cm9sLT5wcm9tcHR9eyRjb250cm9sLT5tYXJrZXJ9PC9mb250PgogICAgPC90ZD4KICAgIDx0ZD57JGNvbnRyb2wtPmNvbnRyb2x9PC90ZD4KICA8L3RyPgp7L2ZvcmVhY2h9CiAgPC90YWJsZT4KICA8L2NlbnRlcj4KPGJyLz4Key9pZn0KeyRoaWRkZW59eyRoaWRkZW4yfXskYmFja317JHN1Ym1pdH17JGNhbmNlbH0KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8dGFibGUgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNTAlIj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9taW5wd2xlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWlucHdsZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbWF4cHdsZW59OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X21heHB3bGVufTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X21pbnVubGVufTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9taW51bmxlbn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9tYXh1bmxlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWF4dW5sZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfc2Vzc2lvbnRpbWVvdXR9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3Nlc3Npb250aW1lb3V0fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3NtdHB2YWxpZGF0ZX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfc210cHZhbGlkYXRlfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3JlcXVpcmVvbmVncm91cH06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVxdWlyZW9uZWdyb3VwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2RmbHRncm91cH06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZGZsdGdyb3VwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3JlcXVpcmVkbWFya2VyfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9yZXF1aXJlZG1hcmtlcn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9yZXF1aXJlZGNvbG9yfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9yZXF1aXJlZGNvbG9yfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2hpZGRlbm1hcmtlcn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaGlkZGVubWFya2VyfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2hpZGRlbmNvbG9yfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9oaWRkZW5jb2xvcn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+CiAgIDx0ZD4KICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9mb3Jnb3Rwd19wYWdlfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9mb3Jnb3Rwd19wYWdlfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2V9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NoYW5nZXNldHRpbmdzX3BhZ2V9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbG9naW5fcGFnZX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbG9naW5fcGFnZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9sb2dvdXRfcGFnZX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbG9nb3V0X3BhZ2V9PC9wPgoJPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X251bXJlc2V0cmVjb3Jkc308L3A+Cgk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGRhdGFfbnVtcmVzZXRyZWNvcmRzfTwvcD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVtb3ZlMXdlZWt9eyRpbnB1dF9yZW1vdmUxbW9udGh9eyRpbnB1dF9yZW1vdmVhbGx9PC9wPgogICAgICA8L2Rpdj4KICAgPC90ZD4KIDwvdGFibGU+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/edituserprops.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcHJvcG5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wcm9wbmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcHJvcHZhbHVlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcHJvcHZhbHVlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbnBhcmFtc317JHN1Ym1pdH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>/templates/forgotpw_templateform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxwPnskcHJvbXB0X3RlbXBsYXRlMX08L3A+CnskaW5wdXRfdGVtcGxhdGUxfQo8YnIvPgo8cD57JHByb21wdF90ZW1wbGF0ZTJ9PC9wPgp7JGlucHV0X3RlbXBsYXRlMn0KPGJyLz4KPHA+eyRwcm9tcHRfdGVtcGxhdGUzfTwvcD4KeyRpbnB1dF90ZW1wbGF0ZTN9Cjxici8+Cnskc3VibWl0fXskZGVmYXVsdHN9CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>/templates/grouplist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PHA+eyRpdGVtY291bnR9Jm5ic3A7eyRncm91cHNmb3VuZH08L3A+CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskaWR0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlc2N9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRhZGRsaW5rfTwvcD48L2Rpdj4K]]></data>
  </file>
  <file>
    <filename>/templates/propertiesform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPgo8cD57JHByb3Bjb3VudH0mbmJzcDt7JHByb3BzZm91bmR9PC9wPgp7aWYgJHByb3Bjb3VudCA+IDB9Cjxici8+Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRwcm9tcHR0ZXh0fTwvdGg+CgkJCTx0aD57JHR5cGV0ZXh0fTwvdGg+CgkJCTx0aD57JGxlbmd0aHRleHR9PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kcHJvcHMgaXRlbT1wcm9wZX0KCQk8dHIgY2xhc3M9InskcHJvcGUtPnJvd2NsYXNzfSI+CgkJCTx0ZD57JHByb3BlLT5uYW1lfTwvdGQ+CgkJCTx0ZD57JHByb3BlLT5wcm9tcHR9PC90ZD4KCQkJPHRkPnskcHJvcGUtPnR5cGV9PC90ZD4KCQkJPHRkPnskcHJvcGUtPmxlbmd0aH08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+ZWRpdGxpbmt9PC90ZD4KCQkJPHRkPnskcHJvcGUtPmRlbGV0ZWxpbmt9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQo8L2Rpdj4KPGJyLz4KPHA+eyRhZGRsaW5rfTwvcD4K]]></data>
  </file>
  <file>
    <filename>/templates/templateform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CjxwPnskcHJvbXB0X3RlbXBsYXRlfTwvcD4KeyRpbnB1dF90ZW1wbGF0ZX0KPGJyLz4KeyRzdWJtaXR9eyRkZWZhdWx0c30KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/userlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19CiA8cD57JHByb21wdF9maWx0ZXJ9OjwvcD4KIDxwPnskcHJvbXB0X2dyb3VwfSZuYnNwO3skZmlsdGVyX2dyb3VwfTwvcD4KIDxwPnskcHJvbXB0X3VzZXJmaWx0ZXJ9Jm5ic3A7eyRmaWx0ZXJfcmVnZXh9Jm5ic3A7PGZvbnQgY29sb3I9InJlZCI+bm90IGltcGxlbWVudGVkIHlldDwvZm9udD48L3A+CiA8cD57JGlucHV0X3NlbGVjdH17JGlucHV0X2hpZGRlbn08L3A+PGJyLz4KeyRlbmRmb3JtfQo8aHIgd2lkdGg9IjUwJSIgYWxpZ249ImxlZnQiLz4KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPgogPHA+eyRpdGVtY291bnR9Jm5ic3A7eyR1c2Vyc2ZvdW5kfTwvcD4Ke2lmICRpdGVtY291bnQgPiAwfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoPnskdXNlcm5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGV4cGlyZXN0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+dXNlcm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmV4cGlyZXN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4JIAp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQogPHA+eyRhZGRsaW5rfTwvcD4KPC9kaXY+Cg==]]></data>
  </file>
  <file>
    <filename>/UserManipulator.class.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKCmNsYXNzIFVzZXJNYW5pcHVsYXRvcgp7CiAgdmFyICRtb2Q7CgogIGZ1bmN0aW9uIENvdW50VGVtcENvZGVSZWNvcmRzKCkKICB7CiAgICByZXR1cm4gMDsKICB9CgogIC8qIGV4cGlyeWNvZGUgaXMgYSBzdHJ0b3RpbWUgc3RyaW5nICovCiAgZnVuY3Rpb24gRXhwaXJlVGVtcENvZGVzKCRleHBpcnljb2RlKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIFJlbW92ZVVzZXJUZW1wQ29kZSggJHVpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gR2V0VXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJvcGVydHlEZWZuKCAkbmFtZSwgJG5ld25hbWUsICRwcm9tcHQsICRsZW5ndGgsICR0eXBlICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKICBmdW5jdGlvbiBJc0FjY291bnRFeHBpcmVkKCAkdWlkICkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIEdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBBZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lLCAkc29ydGtleSwgJHZhbCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKICB9CgoKICBmdW5jdGlvbiBMb2dpbiggJHVzZXJuYW1lLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAgfQoKCiAgZnVuY3Rpb24gVXNlck1hbmlwdWxhdG9yKCAkdGhlX21vZHVsZSApCiAgewogICAgJHRoaXMtPm1vZCA9ICR0aGVfbW9kdWxlOwogIH0KCgogIGZ1bmN0aW9uIEdldERiKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPm1vZC0+R2V0RGIoKTsKICB9CgoKICBmdW5jdGlvbiBHZXRNb2R1bGUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+bW9kOwogIH0KCgogIC8vISBDaGVjayBpZiB0aGUgZ3JvdXAgc3BlY2lmaWVkIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbgogIGZ1bmN0aW9uIENoZWNrR3JvdXBQZXJtaXNzaW9uKCAkZ2lkLCAkcGVybSApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uCiAgZnVuY3Rpb24gQ2hlY2tVc2VyUGVybWlzc2lvbiggJHBlcm0gKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCB1c2VyIGhhcyB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24KICBmdW5jdGlvbiBDaGVja1VzZXJQZXJtaXNzaW9uQnlVaWQoICR1aWQsICRwZXJtICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyEgQXNzaWduIHRoZSB1c2VyIHNwZWNpZmllZCAoYnkgaWQpIHRvIHRoZSBncm91cCBzcGVjaWZpZWQgKGJ5IGlkKQogIC8vIQogIC8vIVxwYXJhbSAgdWlkICBUaGUgdXNlcmlkIGZvciB0aGUgbmV3IGFzc29jaWF0aW9uCiAgLy8hXHBhcmFtICBnaWQgIFRoZSBncm91cCBpZCBmb3IgdGhlIG5ldyBhc3NvY2lhdGlvbgogIC8vIVxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBBc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHN1cHBsaWVkIHBhc3N3b3JkCiAgLy8hCiAgLy8hXHBhcmFtICBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdGVzdC4KICAvLyFccmV0dXJuIHRydWUgaWYgdGhlIHBhc3N3b3JkIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBJc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBDb21wbGV0ZWx5IGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgc3VwcGxpZWQgdXNlciBpZAogIC8vIQogIC8vIVRoaXMgbWV0aG9kIGNvbXBsZXRlbHkgZGVsZXRlcyBhbnl0aGluZyBmcm9tIHRoZSBkYXRhYmFzZSByZWxhdGVkIHRvIHRoZSBzcGVjaWZpZWQgdXNlciBpZC4KICAvLyFzcGVjaWZpY2FsbHksIGdyb3VwIGFzc29jaWF0aW9ucywgcHJvcGVydGllcywgYW5kIHRoZSB1c2VyIHJlY29yZCBpdHNlbGYuCiAgLy8hCiAgLy8hXHBhcmFtIHVpZCB0aGUgdXNlcmlkIHRvIGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0bwogIC8vIVxyZXR1cm4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCiAgLy8hICAgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZmFsc2UsIHRoZW4gdGhlIHNlY29uZCBlbGVtZW50IHdpbGwgY29udGFpbiBhbiBlcnJvciBtZXNzYWdlLgogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZVVzZXJGdWxsKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vIGZ1bmN0aW9uIGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBncm91cAogIC8vIQogIC8vISBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIAogIC8vISBncm91cCBpZAogIC8vISAgICBpZCA9PiBUaGUgcmVxdWVzdGVkIGdyb3VwIGlkCiAgLy8hICAgIGdyb3VwbmFtZSA9PiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAKICAvLyEgICAgZ3JvdXBkZXNjID0+IFRoZSBncm91cCBkZXNjcmlwdGlvbgogIC8vIQogIC8vISBccGFyYW0gZ2lkIFRoZSBncm91cCBpZAogIC8vISBccGFyYW0gYXNzb2NpYXRpdmUgYXJyYXksIG9yIGFycmF5IHdpdGggZmlyc3QgZWxlbWVudCBvZiBmYWxzZSwgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgZXJyb3IgbWVzc2FnZQogIC8vISBccmV0dXJuIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggZ3JvdXAgaW5mbywgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRHcm91cEluZm8oICRnaWQgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdXNlcgogIC8vIQogIC8vISBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIAogIC8vISB1c2VyIGlkCiAgLy8hICAgaWQgPSB0aGUgcmVxdWVzdGVkIHVzZXIgaWQKICAvLyEgICB1c2VybmFtZSA9IHRoZSB1c2VycyBuYW1lCiAgLy8hICAgcGFzc3dvcmQgPSB0aGUgKGVuY3J5cHRlZCkgdXNlciBwYXNzd29yZAogIC8vISAgIGVtYWlsICAgID0gdGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MKICAvLyEgICBleHBpcmVzICA9IHRoZSB1c2VycyBleHBpcnkgZGF0ZQogIC8vISAgIHN0YXR1cyAgID0gdGhlIHVzZXJzIHN0YXR1cwogIC8vIQogIC8vISBccGFyYW0gdWlkIFRoZSB1c2VyaWQgdG8gaW5xdWlyZSBhYm91dAogIC8vISBccmV0dXJuIGFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudCBjb250YWlucyByZXR1cm4gc3RhdHVzICh0cnVlL2ZhbHNlKSwgdGhlIHNlY29uZCBlbGVtZW50CiAgLy8hICAgIGlzIGVpdGhlciBhbiBhcnJheSBjb250YWluaW5nIHRoZSBkZXRhaWxzIGFib3ZlLCBvciBhbiBlcnJvciBtZXNzYWdlLgogIC8vIQogIGZ1bmN0aW9uIEdldFVzZXJJbmZvKCAkdWlkICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIik7CiAgfQoKCiAgLy8hIEdldCBhIGxpc3Qgb2YgdGhlIHVzZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEKICAvLyEgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBjb250YWluaW5nIGEgY29tcGxldGUgc2V0IG9mIHRoZQogIC8vISBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb2YgdGhlIHVzZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEgCiAgLy8hIFxwYXJhbSBncm91cGlkIHRoZSBkZXNpcmVkIGdyb3VwIGlkCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXkgb2YgdXNlciBpbmZvcm1hdGlvbiAoc2VlIEdldFVzZXJJbmZvKSwgb3IgZmFsc2UKICAvLyEgXHNhIEdldFVzZXJJbmZvCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlcnNJbkdyb3VwKCAkZ3JvdXBpZCA9ICcnICkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIEEgZnVuY3Rpb24gdGhhdCB0ZXN0cyB3ZXRoZXIgYSBncm91cCB3aXRoIHRoZSBzcGVmaWZpZWQgaWQgZXhpc3RzCiAgLy8hCiAgLy8hIFxwYXJhbSBnaWQgVGhlIGRlc2lyZWQgZ3JvdXAgaWQKICAvLyEgXHJldHVybiBib29sZWFuCiAgIC8vIQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlJRCggJGdpZCApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgd2V0aGVyIGEgZ3JvdXAgd2l0aCB0aGUgbmFtZSBleGlzdHMKICAvLyEKICAvLyEgXHBhcmFtIGdpZCBUaGUgZGVzaXJlZCBncm91cCBuYW1lCiAgLy8hIFxyZXR1cm4gYm9vbGVhbgogICAvLyEKICBmdW5jdGlvbiBHcm91cEV4aXN0c0J5TmFtZSggJG5hbWUgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgVGVzdCB3ZXRoZXIgdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzIHBhc3NlcyB0aGUgcnVsZXMuCiAgLy8hCiAgLy8hIFRoaXMgbWV0aG9kIHdpbGwgdGVzdCBpZiB0aGUgZW1haWwgYWRkcmVzcyBzdXBwbGllZCBtYXRjaGVzIHRoZSAKICAvLyEgc2V0IHJ1bGVzLiAgT3B0aW9uYWxseSwgdGhlIGVtYWlsIGFkZHJlc3MgY2FuIGJlIHZhbGlkYXRlZCB2aWEKICAvLyEgc210cC4KICAvLyEKICAvLyEgXHBhcmFtICBlbWFpbCBUaGUgYWRkcmVzcyB0byB0ZXN0CiAgLy8hIFxwYXJhbSBzbXRwdmFsaWRhdGUgQSBib29sZWFuIGluZGljYXRpbmcgd2V0aGVyIHNtdHAgdmFsaWRhdGlvbiBzaG91bGQgYmUgdXNlZC4KICAvLyEgXHJldHVybiBhbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IGluZGljdWF0ZXMgc3VjY2VzcyBvciBmYWlsdXJlCiAgLy8hICAgIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgZXJyb3IgbWVzc2FnZSwgaWYgYW4gZXJyb3Igb2NjdXJyZWQKICAvLyEKICBmdW5jdGlvbiBJc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgPSBmYWxzZSApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBDaGVjayB3ZXRoZXIgdGhlIHVzZXJuYW1lIHN1cHBsaWVkIHBhc3NlcyB0aGUgcnVsZXMKICAvLyEKICAvLyFccGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIGJlIHRlc3RlZAogIC8vIVxyZXR1cm4gYm9vbGVhbiB0cnVlL2ZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gSXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdXNlciBmcm9tIHRoZSBzcGVjaWZpZWQgZ3JvdXAKICAvLyEKICAvLyFUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBtZW1iZXJzaGlwIG9mIHVzZXIgJHVpZCBmcm9tIGdyb3VwICRnaWQKICAvLyEKICAvLyFccGFyYW0gdWlkCiAgLy8hXHBhcmFtIGdpZAogIC8vIVxyZXR1cm4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGNvbnRhaW5zIGV4aXQgc3RhdHVzIChib29sZWFuKSwgdGhlIHNlY29uZCBlbGVtZW50CiAgLy8hICAgKG9wdGlvbmFsKSByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UsIGlmIGFuIGVycm9yIG9jY3VycmVkLgogIC8vIQogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgQSBtZXRob2QgdG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGdyb3VwCiAgLy8hCiAgLy8hXHBhcmFtIGdpZCBBbiBleGlzdGluZyBncm91cCBpZAogIC8vIVxwYXJhbSBuYW1lIFRoZSBuZXcgZ3JvdXAgbmFtZQogIC8vIVxwYXJhbSBkZXNjIFRoZSBuZXcgZ3JvdXAgZGVzY3JpcHRpb24KICAvLyFccmV0dXJuIEFuIGFycmF5LCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgdGhlCiAgLy8hICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIFNldEdyb3VwKCAkZ2lkLCAkbmFtZSwgJGRlc2MgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICBmdW5jdGlvbiBTZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBNb2RpZnkgYW4gZXhpc3RpbmcgZ3JvdXAKICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgaWQgb2YgdGhlIGV4aXN0aW5nIHVzZXIKICAvLyEgXHBhcmFtIHVzZXJuYW1lIFRoZSBuZXcgdXNlciBuYW1lCiAgLy8hIFxwYXJhbSBlbWFpbCBUaGUgbmV3IGVtYWlsIGFkZHJlc3MKICAvLyEgXHBhcmFtIHBhc3N3b3JkIFRoZSBuZXcgKHVuZW5jcnlwdGVkKSBwYXNzd29yZAogIC8vISBccGFyYW0gZXhwaXJlcyBUaGUgbmV3IGV4cGlyeSBkYXRlCiAgLy8hIFxwYXJhbSBzdGF0dXMgdGhlIG5ldyBzdGF0dXMKICAvLyEgXHJldHVybiBBbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUsIHRoZQogIC8vISAgICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXIoICR1aWQsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcyApCiAgewogICAgcmV0dXJuIGFycmF5KEZBTFNFLCJGdW5jdGlvbiBub3QgZGVmaW5lZCIpOwogIH0KCgogIC8vISBTZXQgdGhlIHVzZXIncyBncm91cCBtZW1iZXJzaGlwcyBhYnNvbHV0ZWx5CiAgLy8hCiAgLy8hVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgcHJldmlvdXMgZ3JvdXAgYXNzb2NpYXRpb25zLCBhbmQgc2V0cyBuZXcgb25lcwogIC8vIXRvIG1hdGNoIHRob3NlIGluIHRoZSBncnBpZHMgYXJyYXkuCiAgLy8hCiAgLy8hXHBhcmFtIHVpZCBUaGUgdXNlciBpZCB0byBlZGl0CiAgLy8hXHBhcmFtIGdycGlkcyBBbiBhcnJheSBvZiB1c2VyIGlkcyB0byBhc3NvY2lhdGUgd2l0aAogIC8vIVxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gU2V0VXNlckdyb3VwcyggJHVpZCwgJGdycGlkcyApCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBTZXQgdGhlIHVzZXIncyBwcm9wZXJ0aWVzIGFic29sdXRlbHkuCiAgLy8hCiAgLy8hIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYW55IGV4aXN0aW5nIHVzZXIgcHJvcGVydGllcyBhbmQgc2V0cyB0aGVtIGFjY29yZGluZyB0byB0aGUgcHJvcGVydGllcwogIC8vISBzdXBwbGllZC4KICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgdXNlciBpZCB0byBiZSBlZGl0ZWQKICAvLyEgXHBhcmFtIHByb3BzIEFuIGFycmF5IG9mIEtleT1WYWx1ZSBzdHJpbmdzIGNvbnNpc3Rpbmcgb2YgdGhlIHVzZXIgcHJvcGVydGllcy4KICAvLyEgXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0aWVzKCAkdWlkLCAkcHJvcHMgKSAgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBUZXN0IGlmIHRoZSB1c2VyIGlkIGlzIGFscmVhZHkgdGFrZW4KICAvLyEKICAvLyEgVGVzdHMgaWYgYSB1c2VyIGJ5IHRoYXQgaWQgYWxyZWFkeSBleGlzdHMKICAvLyEKICAvLyEgXHBhcmFtIHVpZCBUaGUgdXNlcmlkIHRvIHRlc3QKICAvLyEgXHJldHVybiBib29sZWFuCiAgLy8hCiAgZnVuY3Rpb24gVXNlckV4aXN0c0J5SUQoICR1aWQgKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmV0dXJuIGFuIGFycmF5IG9mIHRoZSB1c2VyJ3MgcHJvcGVydGllcwogIC8vIQogIC8vISBSZXR1cm5zIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgdXNlcnMgcHJvcGVydGllcwogIC8vIQogIC8vISBccGFyYW0gdWlkIFRoZSB1aWQgdG8gdGVzdAogIC8vISBccmV0dXJuIGZhbHNlIG9uIGVycm9yLCBvdGhlcndpc2UgYW4gYXJyYXkgb2YgYXNzb2NpYXRpb25zLCBlYWNoIGFzc29jaWF0aW9uCiAgLy8hICAgaGFzIHRoZSBmb2xsb3dpbmcga2V5czoKICAvLyEgICAgICBpZCAgICAgPSBUaGUgcHJvcGVydHkgaWQKICAvLyEgICAgICB1c2VyaWQgPSBUaGUgbWF0Y2hpbmcgdXNlciBpZAogIC8vISAgICAgIHRpdGxlICA9IFRoZSBwcm9wZXJ0eSB0aXRsZQogIC8vISAgICAgIGRhdGEgICA9IFRoZSBwcm9wZXJ0eSBkYXRhCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnRpZXMoJHVpZCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvLyEgUmV0dXJuIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgZ3JvdXBzIHRoYXQgdGhpcyB1c2VyIGJlbG9uZ3MgdG8KICAvLyEKICAvLyEgUmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gcmVjb3JkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBncm91cHMgdGhhdAogIC8vISB0aGlzIHVzZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgogIC8vIQogIC8vISBccGFyYW0gdXNlcmlkIFRoZSB1c2VyaWQgdG8gdGVzdAogIC8vISBccmV0dXJuIGZhbHNlIG9uIGVycm9yLCBvdGhlcndpc2UsIGFuIGFycmF5IG9mIGdyb3VwaW5mbyByZWNvcmRzLgogIC8vIQogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBBZGQgYSBzaW5nbGUgcHJvcGVydHkgZGVmaW5pdGlvbgogIC8vISBccGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKICAvLyEgXHBhcmFtIHByb21wdCBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKICAvLyEgICAgICAgbm90ZSwgdGhpcyB3aWxsIGJlIExhbmdpZmllZAogIC8vISBccGFyYW0gdHlwZSAgVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CiAgLy8hICAgICAgIDAgPSB0ZXh0LCAxID0gY2hlY2tib3gsIDIgPSBlbWFpbAogIC8vISBccGFyYW0gcmVxdWlyZWQgd2V0aGVyIG9yIG5vdCB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQKICAvLyEgXHJldHVybiBBbiBhcnJheSwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUsIHRoZQogIC8vISAgICBzZWNvbmQgZWxlbWVudCAob3B0aW9uYWwpIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgogIC8vIQogIGZ1bmN0aW9uIEFkZFByb3BlcnR5RGVmbiggJG5hbWUsICRwcm9tcHQsICR0eXBlLCAkbGVuZ3RoICkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vdCBJbXBsZW1lbnRlZCIpOwogIH0KCgogIC8vISBEZWxldGUgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zICh1c2Ugd2l0aCBjYXV0aW9uKQogIGZ1bmN0aW9uIERlbGV0ZVByb3BlcnR5RGVmbnMoKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiTm90IEltcGxlbWVudGVkIik7CiAgfQoKICAvLyEgR2V0IGEgc2luZ2xlIHByb3BlcnR5IGRlZmluaXRpb24gYnkgbmFtZQogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbiggJG5hbWUgKQogIHsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8vISBHZXQgYW4gYXJyYXkgb2YgcHJvcGVydHkgZGVmaW5pdGlvbnMKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm5zKCkKICB7CiAgICByZXR1cm4gYXJyYXkoRkFMU0UsIk5vdCBJbXBsZW1lbnRlZCIpOwogIH0KCgogIC8vISBHZXQgYSBzaW5nbGUgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAvLyEKICAvLyEgR2V0IGEgc2luZ2xlIHByb3BlcnR5IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLgogIC8vISAKICAvLyEgXHBhcmFtIHRpdGxlIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gcmV0dXJuCiAgLy8hIFxwYXJhbSBkZWZhdWx0dmFsdWUgQSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0IGZvciB0aGF0IHVzZXIKICAvLyEgXHJldHVybiBUaGUgcHJvcGVydHkgdmFsdWUsIG9yIGZhbHNlLgogIC8vIQogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRlZmF1bHR2YWx1ZT1mYWxzZSkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgcHJvcGVydHkgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdXNlciBpZAogIC8vIQogIC8vISBccGFyYW0gdGl0bGUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBzZWFyY2hpbmcgZm9yCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIHVzZXJpZCBmb3Igd2hvJ3MgcHJvcGVydHkgd2UgYXJlIHNlYXJjaGluZwogIC8vISBccGFyYW0gZGVmYXVsdHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyB1c2VyCiAgLy8hIFxyZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlLCBvciBmYWxzZS4KICAvLyEKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCgogIC8vISBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIGN1cnJlbnQgdXNlcgogIC8vISAKICAvLyEgU2V0cyBhIHByb3BlcnR5IGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgLy8hCiAgLy8hIFxwYXJhbSB0aXRsZSBUaGUgcHJvcGVydHkgbmFtZQogIC8vISBccGFyYW0gZGF0YSAgVGhlIHByb3BlcnR5IHZhbHVlCiAgLy8hIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGF0YSkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBTZXQgYSBwcm9wZXJ0eSBmb3IgdGhlIHByb3ZpZGVkIHVzZXJpZAogIC8vIQogIC8vISBTZXRzIGEgcHJvcGVydHkgZXhjbHVzaXZlbHkgZm9yIGEgY2VydGFpbiB1c2VyCiAgLy8hCiAgLy8hIFxwYXJhbSB0aXRsZSBUaGUgcHJvcGVydHkgbmFtZQogIC8vISBccGFyYW0gZGF0YSAgVGhlIHByb3BlcnR5IHZhbHVlCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIGRlc2lyZWQgdXNlciBpZAogIC8vIQogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCRkYXRhLCR1c2VyaWQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGEgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAvLyEKICAvLyEgUmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIKICAvLyEKICAvLyEgXHBhcmFtIHRpdGxlIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWxldGUKICAvLyEgXHBhcmFtIGFsbCAgIE9wdGlvbmFsbHkgZGVsZXRlIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGlzIHVzZXIgIAogIC8vISBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aHdlcmlzZW4KICAvLyEKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHkoJHRpdGxlLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGEgcHJvcGVydHkgZm9yIGEgc3BlY2lmaWVkIHVzZXIKICAvLyEKICAvLyFccGFyYW0gdGl0bGUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRlbGV0ZQogIC8vIVxwYXJhbSB1c2VyaWQgVGhlIGlkIHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkgZm9yCiAgLy8hXHBhcmFtIGFsbCAob3B0aW9uYWwpIERlbGV0ZSBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHNwZWNpZmllZCB1c2VyaWQuCiAgLy8hXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAvLyEKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIGFsbCBvZiB0aGUgY3VycmVudCB1c2VycyBwcm9wZXJ0aWVzCiAgLy8hCiAgLy8hIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKICAvLyEKICBmdW5jdGlvbiBEZWxldGVBbGxVc2VyUHJvcGVydGllcygpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgRGVsZXRlIEFsbCBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmllZCB1c2VyIGlkCiAgLy8hCiAgLy8hIFxwYXJhbSB1c2VyaWQKICAvLyEgXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIENoZWNrIHRoZSBzdXBwbGllZCBwYXNzd29yZCBhbmQgZW5zdXJlIGl0IG1hY2hlcyB0aGUgb25lIGluIHRoZSBkYXRhYmFzZQogIC8vIQogIC8vIVxwYXJhbXMgdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHRlc3QgZm9yCiAgLy8hXHBhcmFtcyBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdGVzdAogIC8vIVxyZXR1cm4gdHJ1ZSBpZiBwYXNzd29yZHMgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KICAvLyEKICBmdW5jdGlvbiBDaGVja1Bhc3N3b3JkKCR1c2VybmFtZSwkcGFzc3dvcmQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgUmV0dXJuIHRoZSB1c2VybmFtZSBvZiB0aGUgY3VycmVudCB1c2VyCiAgLy8hCiAgLy8hIFxyZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlcgogIC8vISAgIGlmIG5vb25lIGlzIGxvZ2dlZCBpbiwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAvLyEKICBmdW5jdGlvbiBMb2dnZWRJbk5hbWUoKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIFJldHVybiB0aGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCB1c2VyCiAgLy8hCiAgLy8hIFxyZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgLy8hICAgaWYgbm9vbmUgaXMgbG9nZ2VkIGluLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZAogIC8vIQogIGZ1bmN0aW9uIExvZ2dlZEluRW1haWwoKSAKICB7CiAgICByZXR1cm4gIiI7CiAgfQoKCiAgLy8hIExvZ291dCB0aGUgY3VycmVudCB1c2VyCiAgZnVuY3Rpb24gTG9nb3V0KCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBFeHBpcmUgYW55IGFuZCBhbGwgdXNlcnMgdGhhdCBoYXZlIGJlZW4gYXdheSBmb3IgdG9vIGxvbmcKICBmdW5jdGlvbiBFeHBpcmVVc2VycygpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vISBSZXR1cm4gdGhlIHVzZXJpZCBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyCiAgZnVuY3Rpb24gTG9nZ2VkSW5JZCgpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgVGVzdHMgd2V0aGVyIHRoZSBjdXJyZW50IHVzZXIgaXMgbG9nZ2VkIGluIG9yIG5vdC4KICBmdW5jdGlvbiBMb2dnZWRJbigpIAogIHsKICAgIGlmICgkdGhpcy0+TG9nZ2VkSW5JZCgpPT1mYWxzZSkgcmV0dXJuIGZhbHNlOyBlbHNlIHJldHVybiB0cnVlOwogIH0KCgogIC8vISBUZXN0IHdldGhlciBhbiBhc3NvY2lhdGlvbiBleGlzdHMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kIGdyb3VwCiAgLy8hCiAgLy8hIFxwYXJhbSB1c2VyaWQgVGhlIHVzZXJpZCB0byB0ZXN0CiAgLy8hIFxwYXJhbSBncm91cGlkIFRoZSBncm91cGlkIHRvIHRlc3QKICAvLyEgXHJldHVybiB0cnVlIGlmIGFuIGFzc29jaWF0aW9uIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gTWVtYmVyT2ZHcm91cCgkdXNlcmlkLCRncm91cGlkKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIFJldHVybiB0aGUgdXNlcm5hbWUgdGhhdCBtYWNoZXMgdGhlIHNwZWNpZmllZCB1c2VyIGlkCiAgLy8hCiAgLy8hXHJldHVybiBUaGUgbWF0Y2hpbmcgdXNlcm5hbWUsIG9yIGZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gR2V0VXNlck5hbWUoJHVzZXJpZCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkCiAgLy8hCiAgLy8hXHJldHVybiBFbWFpbCBhZGRyZXNzLCBvciBmYWxzZQogIC8vIQogIGZ1bmN0aW9uIEdldEVtYWlsKCR1c2VyaWQpIAogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IHRoZSB1c2VyaWQgb2YgdGhlIHVzZXIgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZQogIC8vIQogIC8vISBccmV0dXJuIFVzZXJJRCwgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRVc2VySUQoJHVzZXJuYW1lKSAKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIEFkZCBhIG5ldyBncm91cAogIC8vIQogIC8vISBBZGRzIGEgbmV3IGdyb3VwIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIGRlc2NyaXB0aW9uCiAgLy8hCiAgLy8hIFxwYXJhbSBuYW1lIFRoZSBuZXcgZ3JvdXAgbmFtZQogIC8vISBccGFyYW0gZGVzY3JpcHRpb24gdGhlIGdyb3VwIGRlc2NyaXB0aW9uCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IuCiAgLy8hCiAgZnVuY3Rpb24gQWRkR3JvdXAoICRuYW1lLCAkZGVzY3JpcHRpb24gKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgQWRkIGEgbmV3IHVzZXIKICAvLyEKICAvLyEgQWRkIHRoZSBzcGVjaWZpZWQgdXNlciB0byB0aGUgZGF0YWJhc2UKICAvLyEKICAvLyEgXHBhcmFtIG5hbWUgVGhlIGRlc2lyZWQgdXNlcm5hbWUKICAvLyEgXHBhcmFtIHBhc3N3b3JkIFRoZSBkZXNpcmVkIHBhc3N3b3JkICh1bmVuY3J5cHRlZCkKICAvLyEgXHBhcmFtIGV4cGlyZXMgVGhlIGV4cGlyeSBkYXRlCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IsIG9yIHRoZSB1c2VyaWQgb3RoZXJ3aXNlCiAgLy8hCiAgZnVuY3Rpb24gQWRkVXNlciggJG5hbWUsICRwYXNzd29yZCwgJGV4cGlyZXMgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IHRoZSBncm91cCBuYW1lIGdpdmVuIGEgZ3JvdXAgaWQKICAvLyEKICAvLyEgXHJldHVybiBncm91cCBuYW1lLCBvciBmYWxzZQogIC8vIQogIGZ1bmN0aW9uIEdldEdyb3VwTmFtZSgkZ3JvdXBpZCkgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBHZXQgdGhlIGdyb3VwIGRlc2NyaXB0aW9uIGdpdmVuIGEgZ3JvdXAgaWQKICAvLyEKICAvLyEgXHJldHVybiBncm91cCBkZXNjcmlwdGlvbiwgb3IgZmFsc2UKICAvLyEKICBmdW5jdGlvbiBHZXRHcm91cERlc2MoJGdyb3VwaWQpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8vISBEZWxldGUgdGhlIHNwZWNpZmllZCBncm91cAogIC8vIQogIC8vISBEZWxldGUgdGhlIGdyb3VwIHJlY29yZCBmb3IgdGhlIG1hdGNoaW5kIGlkCiAgLy8hCiAgLy8hIFxyZXR1cm4gYW4gYXJyYXksIHRoZSBmaXJzdCBlbGVtZW50IGlzIGEgZGVzY3JpcHRpb24gZGVzY3JpYmluZyB0aGUgcmV0dXJuIHN0YXR1cyAKICAvLyEgICAgKHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZXJyb3IpLiAgVGhlIHNlY29uZCBlbGVtZW50IChvcHRpb25hbCkgaXMgYW4gZXJyb3Igc3RyaW5nIGluIHRoZSAKICAvLyEgICAgZXZlbnQgb2YgYW4gZXJyb3IuCiAgLy8hCiAgZnVuY3Rpb24gRGVsZXRlR3JvdXBGdWxsKCAkaWQgKQogIHsKICAgIHJldHVybiBhcnJheShGQUxTRSwiRnVuY3Rpb24gbm90IGRlZmluZWQiKTsKICB9CgoKICAvLyEgR2V0IGEgbGlzdCBvZiBhbGwgb2YgdGhlIGdyb3VwcywgYW5kIHRoZWlyIGlkJ3MKICAvLyEKICAvLyEgXHJldHVybiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBjb250YWluaW5nIGdyb3VwIG5hbWVzIGFzIGtleXMsIGFuZCBpZCdzIGFzIHZhbHVlcwogIC8vIQogIGZ1bmN0aW9uIEdldEdyb3VwTGlzdCgpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLy8hIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGxldGUgbGlzdCBvZiBncm91cHMKICAvLyEKICAvLyEgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gYXNzb2NpYXRpb25zLCByZXByZXNlbnRpbmcgYWxsIG9mIHRoZQogIC8vISBncm91cHMgaW4gdGhlIHRhYmxlLgogIC8vIQogIC8vISBccmV0dXJucyBhbiBhcnJheSBvZiBncm91cGluZm8gYXNzb2NpYXRpb25zCiAgLy8hCiAgZnVuY3Rpb24gR2V0R3JvdXBMaXN0RnVsbCgpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLy8hIEdldCB0aGUgZ3JvdXBpZCBnaXZlbiBhIGdyb3VwIG5hbWUKICAvLyEKICAvLyEgXHJldHVybiBncm91cGlkIG9yIGZhbHNlCiAgLy8hCiAgZnVuY3Rpb24gR2V0R3JvdXBJRCgkZ3JvdXBuYW1lKQogIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyEgR2V0IGEgbGlzdCBvZiB0aGUgZ3JvdXBzIHRoYXQgdGhlIHNwZWNpZmllZCB1c2VyIGJlbG9uZ3MgdG8KICAvLyEKICAvLyEgUmV0dXJuIGEgc3RyaW5nIG9mIGNvbW1hIGRlbGltaXRlZCBncm91cCBuYW1lcywgY29ycmVzcG9uZGluZyB0byB0aGUKICAvLyEgZ3JvdXBzIHRoYXQgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb2YKICAvLyEKICAvLyEgXHJldHVybiBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGdyb3VwIG5hbWVzLCBvciAibm9uZSIKICAvLyEKICBmdW5jdGlvbiBHZXRNZW1iZXJHcm91cHMoJHVzZXJpZCkKICB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCiAgLy8hIERlbGV0ZSB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWQKICAvLyEgXG5vdGUgVGhpcyBpcyBhIGRlcHJlY2F0ZWQgZnVuY3Rpb24gYXMgaXQgcmVsaWVzIG9uIHRoZSB1c2VyaWQgYmVpbmcgc2V0IGluIHRoZSBfR0VUCiAgLy8hIHZhcmlhYmxlLgogIC8vIQogIGZ1bmN0aW9uIERlbGV0ZVVzZXIoJGlkKSAgCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCn0gLy8gY2xhc3MKCj8+]]></data>
  </file>
</module>
