<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!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>
  <dtdversion>1.2</dtdversion>
  <name>FrontEndUsers</name>
  <version>1.0.1</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+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMC4xPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+MC4wLjEgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCBOUlBUIChOb3QgUmVhZHkgZm9yIFByaW1lIFRpbWUpIHJlbGVhc2U8L2xpPgo8bGk+MC4xLjAgLSBPY3RvYmVyLCAyMDA1IC0gSW5pdGlhbCByZWxlYXNlPC9saT4KPGxpPjAuMS4xIC0gT2N0b2JlciwgMjAwNSAtIEZpeGVkIGlzc3VlcyB3aXRoIHByb3BlcnRpZXM8L2xpPgo8bGk+MC4xLjIgLSBPY3RvYmVyLCAyMDA1IC0gQWRkZWQgZm9yZ290dGVuIHBhc3N3b3JkIGZ1bmN0aW9uYWxpdHk8L2xpPgo8bGk+PHA+MC4xLjMgLSBOb3ZlbWJlciwgMjAwNTwvcD4KICAgIDxwPkFkZGVkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSByZWRpcmVjdCBwYWdlIG9uIGxvZ2luLCBsb2dvdXQsIGZvcmdvdCBwYXNzd29yZCwgYW5kIGNoYW5nZSBzZXR0aW5ncywgYW5kIGFkZGVkIHRoZSByZXR1cm50byBhbmQgZm9ybSBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIHNpZGUgb2YgdGhpbmdzLCBhbHNvIGRpZCBhIGNvdXBsZSBsZiBsaXR0bGUgY2xlYW51cHMuICBUaGlzIHZlcnNpb24gcmVxdWlyZXMgdjAuMTEgYW5kIGFib3ZlIGZvciBjZXJ0YWluLjwvcD48L2xpPgo8bGk+MC4xLjQgLSBOb3ZlbWJlciwgMjAwNSAtIFZlcnkgbWlub3IgY2hhbmdlIHdpdGggcmVzcGVjdCB0byBhIGZvcmdvdHRlbiBhbmQgbm8gbG9uZ2VyIG5lZWRlZCBmdW5jdGlvbiBjYWxsPC9saT4KPGxpPjxwPjAuMS41IC0gTm92ZW1iZXIsIDIwMDU8L3A+CiAgICA8cD5Bbm90aGVyIHZlcnkgbWlub3IgY2hhbmdlLCBhZGRlZCBzb21lIHRleHQgdG8gdGhlIFBvc3RJbnN0YWxsIG1lc3NhZ2UuPC9wPjwvbGk+CjxsaT48cD4wLjEuNiAtIEphbnVhcnksIDIwMDY8cD4KICAgIDxwPkNoYW5nZXMgdG8gdGhlIHBlcm1pc3Npb24gbW9kZWwsIGFuZCBtaW5vciBidWcgZml4ZXMgdG8gdGhlIHByZWZlcmVuY2VzLiAgQWxzbyBzb21lIHBocDUgZml4ZXMgYnV0IEkgYW0gc3VyZSB0aGF0IHRoZXJlIGFyZSBtb3JlIG91dCB0aGVyZS48L3A+PC9saT4KPGxpPjxwPjAuMS43IC0gSmFudWFyeSwgMjAwNjxwPgogICAgPHA+TWFueSB0aGFua3MgdG8gPGI+a2F0b248L2I+IGZvciBhZGRpbmcgdGhlIHRleHRhcmVhIGFuZCBkcm9wZG93biBwcm9wZXJ0eSB0eXBlcy48L3A+CiAgICA8cD5GaXhlcyB0byB0aGUgcHJvcGVydHkgYWRkaW5nIHRvIGZpeCBwcm9ibGVtcyB3aXRoIHNwYWNlcyBpbiBwcm9wZXJ0eSBuYW1lcyAod2Ugbm8gbG9uZ2VyIGxldCB0aGF0IGhhcHBlbikuPC9wPgo8L2xpPgo8bGk+PHA+MS4wLjAgLSBGZWJydWFyeSwgMjAwNjxwPgogICAgPHA+QWRkZWQgZmlsdGVyaW5nIGFuZCByb3cgbGltaXRpbmcgdG8gdGhlIGFkbWluIHBhbmVsLiBUaGlzIHdpbGwgaGF2ZSBiaWcgYmVuZWZpdHMgdG8gdGhvc2UgdGhhdCBhcmUgdXNpbmcgdGhpcyBtb2R1bGUgZm9yIGhpZ2ggdHJhZmljLCBhbmQgaGlnaCB1c2VyIHNpdGVzLjwvcD4KICAgIDxwPkFkZGVkIHNvcnRpbmcgdG8gdGhlIGFkbWluIHBhbmVsPC9wPgogICAgPHA+QWRkZWQgbWF4IGxlbmd0aCBhYmlsaXR5IHRvIHRleHQgYW5kIGVtYWlsIGZpZWxkczwvcD4KICAgIDxwPkZpeGVkIGEgc21hbGwgcHJvYmxlbSB3aXRoIHRoZSBkZWZhdWx0IGdyb3VwIG5vdCBiZWluZyBjaGVja2VkIHdoZW4gYWRkaW5nIGEgdXNlcjwvcD4KICAgIDxwPlNhdmUgZmlsdGVyIHNldHRpbmdzIGluIHByZWZlcmVuY2VzLCBhbmQgdGhlIGFjdGl2ZSB0YWIgdG9vLjwvcD4KICAgIDxwPkRlbGV0ZSB1c2VyIHByb3BlcnRpZXMgd2hlbiBhIHByb3BlcnR5IGlzIGRlbGV0ZWQgPGVtPk5vdGU8L2VtPiwgbm90IHdoZW4gaXQgaXMgZGlzYWJsZWQgaW4gdGhlIGVkaXQgZ3JvdXAgZGlhbG9nPC9wPgogICAgPHA+QWRkIGNvbmZpcm1hdGlvbiBtZXNzYWdlIGluIGVkaXQgZ3JvdXBzLjwvcD4KICAgIDxwPkFkZGVkIGEgY291cGxlIG1vcmUgY29uZmlybWF0aW9uIG1lc3NhZ2VzLjwvcD4KICAgIDxwPkFkZGVkIENTViBFeHBvcnQgb3B0aW9uPC9wPgogICAgPHA+VG9kbyAtIEFkZCBwcmVmZXJlbmNlcyBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkbGVuZ3RoPC9wPgo8L2xpPgo8bGk+PHA+MS4wLjEgLSBNYXJjaCwgMjAwNjxwPgogICAgPHA+QWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbWFpbCBhZGRyZXNzZXM8L3A+CiAgICA8cD5GaXggcHJvYmxlbSB3aGVyZSBleHBpcnkgZGF0ZSB3YXMgYmVpbmcgbW9kaWZpZWQgd2hlbiBhZG1pbiBtb2RpZmllZCB1c2VyIHNldHRpbmdzPC9wPgogICAgPHA+QWRkIGEgY29uZmlybWF0aW9uIG1lc3NhZ2UgdG8gdGhlIHByZWZlcmVuY2VzIHN1Ym1pdCBidXR0b248L3A+CiAgICA8cD5GaXhlZCBhIG1pbm9yIGJ1ZyB3aGVuIGNvdXRpbmcgdGhlIG51bWJlciBvZiB1c2VycyBpbiBhIGdyb3VwPC9wPgogICAgPHA+Rml4ZXMgdG8gdGhlIHNpemUgb2YgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcywgYW5kIG1heGxlbmd0aDwvcD4KICAgIDxwPkFkZGVkIGFkdmFuY2VkIGZpbHRlcmluZyBvbiBwcm9wZXJ0aWVzPC9wPgogICAgPHA+Q2hhbmdlcyB0byBsYWJlbGluZyBpbiBhZGQgb3IgZWRpdCB1c2VyPC9wPgogICAgPHA+Rml4ZXMgdG8gcHJvYmxlbXMgd2l0aCBpbmxpbmUgYW5kIG5vbiBpbmxpbmUgZm9ybXMsIHRoZSBwYXNzd29yZCBpcyBuZXZlciBzZW50IG9uIHRoZSBnZXQgbGluZTwvcD4KICAgIDxwPkNoYW5nZWQgdG8gcmVxdWlyZSBDTVMgMC4xMi1iZXRhMiBhdCBhIG1pbmltdW0gKGZvciBzYWZldHkgcHVycG9zZXMpPC9wPgo8L2xpPgo8L3VsPjxiciAvPg==</about>
  <description>Manage Frontend Users</description>
  <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/LD8sPykiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1aWQsICRjb2RlLAoJCQkJCSAkZGItPkRCVGltZVN0YW1wKHRpbWUoKSkpICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBTZXRQcm9wZXJ0eURlZm4oICRuYW1lLCAkbmV3bmFtZSwgJHByb21wdCwgJGxlbmd0aCwgJHR5cGUsICRtYXhsZW5ndGggPSAwICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Z2V0RGIoKTsKICAgIAogICAgaWYoICRtYXhsZW5ndGggPT0gMCApCiAgICAgIHsKCSRtYXhsZW5ndGggPSAkbGVuZ3RoOwogICAgICB9CiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBTRVQgbmFtZSA9ID8sIHByb21wdCA9ID8sIHR5cGUgPSA/LCBsZW5ndGggPSA/LCBtYXhsZW5ndGggPSA/IAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuZXduYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCwgJG5hbWUgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZuKCAkbmFtZSApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuCiAgICAgICAgICBXSEVSRSBuYW1lPT8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcAogICAgICAgICAgV0hFUkUgbmFtZSA9ID8gT1JERVIgQlkgc29ydF9rZXkgREVTQyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHRpdGxlICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIGZ1bmN0aW9uIElzQWNjb3VudEV4cGlyZWQoICR1aWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCBleHBpcmVzID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCwgCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAodGltZSgpKSApICk7CiAgICBpZiggJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA9PSAxICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdycGlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFdIRVJFIGdyb3VwX2lkID0gPyBPUkRFUiBCWSBzb3J0X2tleSBERVNDIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZ3JwaWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJHJlc3VsdFtdID0gJHJvdzsKICAgICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKCiAgZnVuY3Rpb24gQWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSwgJHNvcnRrZXksICR2YWwgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAKICAgICAgICAgIFZBTFVFUyg/LD8sPyw/KSI7IAogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRwcm9wbmFtZSwgJGdycGlkLCAkc29ydGtleSwgJHZhbCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwCiAgICAgICAgICBXSEVSRSBncm91cF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRncnBpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBEZWxldGVHcm91cFByb3BlcnR5UmVsYXRpb24oICRncnBpZCwgJHByb3BuYW1lICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBwcm9wbWFwCiAgICAgICAgICBXSEVSRSBuYW1lID0gPyBBTkQgZ3JvdXBfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkcHJvcG5hbWUsICRncnBpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBBZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCA9IDAgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgIGlmKCAkbWF4bGVuZ3RoID09IDAgKQogICAgICB7CgkkbWF4bGVuZ3RoID09ICRsZW5ndGg7CiAgICAgIH0KCiAgICAkcCA9IGFycmF5KCAkbmFtZSwgJHByb21wdCwgJHR5cGUsICRsZW5ndGgsICRtYXhsZW5ndGggKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbgogICAgICAgICAgVkFMVUVTICg/LD8sPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsICRwICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCAkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gQWRkU2VsZWN0T3B0aW9ucyggJG5hbWUsICRvcHRpb25zICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRpbnNlcnRfdmFscyA9ICcnOwogICAgJG9yZGVyX2lkID0gMDsKICAgIGZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHR0ZXh0KXsKICAgICAgLy8gaWYgbm8gYWN0dWFsIHRleHQgaW4gdGhlIGxpbmUsIG1ha2Ugc3VyZSBpdCBlcXVhbHMgJycsCiAgICAgIC8vIGluIG9yZGVyIG5vdCB0byBhZGQgaXQgdG8gdGhlIGRiCiAgICAgICRvcHR0ZXh0ID0gdHJpbSgkb3B0dGV4dCk7CiAgICAgIGlmKHRyaW0oJG9wdHRleHQpID09ICcnIHx8IHRyaW0oJG9wdHRleHQpID09ICdfXycgKXsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgICRvcHRuYW1lID0gc3RyX3JlcGxhY2UoJyAnLCAnXycsICRvcHR0ZXh0KTsKICAgICAgJG9yZGVyX2lkKys7CiAgICAgICRpbnNlcnRfdmFscyAuPSAiKCciCgkuICRvcmRlcl9pZCAuICInLCAnIgoJLiAkb3B0bmFtZSAuICInLCAnIgoJLiAkb3B0dGV4dCAuICInLCAnIgoJLiAkbmFtZS4gIicpLCAiOwogICAgfQogICAgCiAgICAkaW5zZXJ0X3ZhbHMgPSBzdWJzdHIoJGluc2VydF92YWxzLCAwLCAtMik7CgogICAgJGRiID0gJHRoaXMtPmdldERiKCk7CiAgICAkcXVlcnkgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2Ryb3Bkb3ducwoJCQkob3JkZXJfaWQsIG9wdGlvbl9uYW1lLCBvcHRpb25fdGV4dCwgY29udHJvbF9uYW1lKSAKCQkJVkFMVUVTICIgLiAkaW5zZXJ0X3ZhbHM7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKSB7CiAgICAgIHJldHVybiBhcnJheShGQUxTRSwgJGRiLT5FcnJvck1zZygpKTsKICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgkJCgogIAogIAogIGZ1bmN0aW9uIERlbGV0ZVByb3BlcnR5RGVmbnMoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BkZWZuIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUpOwogIH0KCgogIGZ1bmN0aW9uIERlbGV0ZVNlbGVjdE9wdGlvbnMoICRuYW1lICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19kcm9wZG93bnMKICAgICAgICAgIFdIRVJFIGNvbnRyb2xfbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUpOwogIH0KCgogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbiggJG5hbWUgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbgogICAgICAgICAgV0hFUkUgbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRuYW1lICkgKTsKICAgIGlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggJHJvdyApCiAgICAgIHsKCXJldHVybiAkcm93OwogICAgICB9CiAgICBlbHNlCiAgICAgIHJldHVybiBGQUxTRTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbnMoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7CiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAkcmV0ID0gYXJyYXkoKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJYXJyYXlfcHVzaCggJHJldCwgJHJvdyApOwogICAgICB9CiAgICByZXR1cm4gJHJldDsKICB9CgogIC8qKgogICAqIFJldHVybnMgc2VsZWN0IG9wdGlvbnMgYXMgYSBzaW1wbGUgb3IgYSAyIGRpbWVuc2lvbmFsIGFycmF5CiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRjb250cm9sbmFtZSAtIG5hbWUgb2YgdGhlIGRyb3Bkb3duIGFzIGluIHRoZSBwcm9wZGVmbiB0YWJsZQogICAqIEBwYXJhbSBpbnQgJGRpbSAtIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkKICAgKiAJaWYgJGRpbSA9PSAxLCByZXR1cm5zIGEgMSBkaW1lbnNpb25hbCBhcnJheSBuYW1lPT50ZXh0CiAgICogICAgaWYgJGRpbSA9PSAyLCByZXR1cm5zIGEgMiBkaW1lbnNpb25hbCBhcnJheSwgZWFjaCBpdGVtIGJlaW5nIGFuCiAgICogCQlhcnJheSB3aXRoIHByb3BlcnRpZXMgJ29wdGlvbl9uYW1lJywgJ29wdGlvbl90ZXh0JywgJ2NvbnRyb2xfbmFtZScuCiAgICovCiAgZnVuY3Rpb24gR2V0U2VsZWN0T3B0aW9ucyggJGNvbnRyb2xuYW1lLCAkZGltPTEgKQogIHsKCSRkYiA9ICR0aGlzLT5HZXREYigpOwoJCgkkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19kcm9wZG93bnMKCQlXSEVSRSBjb250cm9sX25hbWUgPSA/IE9SREVSIEJZIG9yZGVyX2lkIjsKCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCRjb250cm9sbmFtZSkgKTsKCWlmKCAkZGJyZXN1bHQgPT0gZmFsc2UgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoJJHJldCA9IGFycmF5KCk7Cgl3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApIHsKCQlpZiAoJGRpbT09Mil7CgkJCQlhcnJheV9wdXNoKCAkcmV0LCAkcm93ICk7CgkJfSBlbHNlIHsKCQkJCSRyZXRbJHJvd1snb3B0aW9uX25hbWUnXV0gPSAkcm93WydvcHRpb25fdGV4dCddOwoJCX0KCX0KCXJldHVybiAkcmV0OwogIH0KCiAgCiAgZnVuY3Rpb24gTG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkKICB7CiAgICBpZiggISR0aGlzLT5DaGVja1Bhc3N3b3JkKCAkdXNlcm5hbWUsICRwYXNzd29yZCApICkKICAgICAgewoJJG1vZCA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKCXJldHVybiBhcnJheShGQUxTRSwkbW9kLT5MYW5nKCdlcnJvcl9sb2dpbmZhaWxlZCcpKTsKICAgICAgfQoKICAgICR1aWQgPSAkdGhpcy0+R2V0VXNlcklEKCAkdXNlcm5hbWUgKTsKCiAgICBpZiggJHRoaXMtPklzQWNjb3VudEV4cGlyZWQoICR1aWQgKSApCiAgICAgIHsKCSRtb2QgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CglyZXR1cm4gYXJyYXkoRkFMU0UsJG1vZC0+TGFuZygnZXJyb3JfYWNjb3VudGV4cGlyZWQnKSk7CiAgICAgIH0KCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBWQUxVRVMgKD8sPyw/KSI7CgogICAgLyogd2UgbWF5IG5lZWQgdG8gc3RhcnQgYSBzZXNzaW9uIG5vdyAqLwogICAgaWYoIHNlc3Npb25faWQoKSA9PSAiIiApCiAgICAgIHsKICAgICAgICBzZXNzaW9uX3N0YXJ0KCk7CiAgICAgIH0KCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggc2Vzc2lvbl9pZCgpLCB0aW1lKCksICR1aWQgKSk7CiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsICRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFKTsKICB9CgoKICBmdW5jdGlvbiBGZXVzZXJzTWFuaXB1bGF0b3IoICR0aGVfbW9kdWxlICkKICB7CiAgICBwYXJlbnQ6OlVzZXJNYW5pcHVsYXRvciggJHRoZV9tb2R1bGUgKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmF1c2UKICBmdW5jdGlvbiBDaGVja0dyb3VwUGVybWlzc2lvbiggJGdpZCwgJHBlcm0gKQogIHsKICAgIC8vIHdlIGFsd2F5cyBoYXZlIHRvIHJldHVybiBmYWxzZSB1c2luZyB0aGlzIG1lY2hhbmlzbSAKICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGRpZmZlcmVudCB0YWJsZXMgdGhhbiB3aXNoeSBpcyB1c2luZyBmb3IgCiAgICAvLyB1c2VycyBhbmQgZ3JvdXBzCiAgICByZXR1cm4gZmFsc2U7Ci8vICAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAovLyAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4icGVybWlzc2lvbnMgV0hFUkUgcGVybWlzc2lvbl9uYW1lID0gPyI7Ci8vICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHBlcm0gKSApOwovLyAgICAgaWYoICEkZGJyZXN1bHQgfHwgJGRicmVzdWx0LT5Sb3dDb3VudCgpID09IDAgKSByZXR1cm4gZmFsc2U7CgovLyAgICAgJHByb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7Ci8vICAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJncm91cF9wZXJtcyBXSEVSRSBwZXJtaXNzaW9uX2lkID0gPwovLyAgICAgICAgICAgQU5EIGdyb3VwX2lkID0gPyI7Ci8vICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHByb3dbJ3Blcm1pc3Npb25faWQnXSwgJGdpZCApICk7Ci8vICAgICBpZiggISRkYnJlc3VsdCB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApIHJldHVybiBmYWxzZTsKCi8vICAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gQ2hlY2tVc2VyUGVybWlzc2lvbiggJHBlcm0gKQogIHsKICAgICR1aWQgPSAkdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYoICRpZCA9PSBmYWxzZSApIHJldHVybiBmYWxzZTsKCiAgICByZXR1cm4gQ2hlY2tVc2VyUGVybWlzc2lvbkJ5VWlkKCAkdWlkLCAkcGVybSApOwogIH0KCgogIGZ1bmN0aW9uIENoZWNrVXNlclBlcm1pc3Npb25CeVVpZCggJHVpZCwgJHBlcm0gKQogIHsKICAgIC8vIHdlIGFsd2F5cyBoYXZlIHRvIHJldHVybiBmYWxzZSB1c2luZyB0aGlzIG1lY2hhbmlzbSAKICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGRpZmZlcmVudCB0YWJsZXMgdGhhbiB3aXNoeSBpcyB1c2luZyBmb3IgCiAgICAvLyB1c2VycyBhbmQgZ3JvdXBzCiAgICByZXR1cm4gZmFsc2U7Ci8vICAgICAvLyBpZiB0aGUgdXNlciBiZWxvbmdzIHRvIGEgZ3JvdXAgdGhhdCBoYXMgdGhlIHBlcm1pc3Npb24sIHdlJ3JlIGxhdWdoaW5nCi8vICAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkdWlkICk7Ci8vICAgICBpZiggJGdyb3VwcyA9PSBmYWxzZSApIHJldHVybiBmYWxzZTsKICAgIAovLyAgICAgJGRiID0gJHRoaXMtPkdldERiKCk7Ci8vICAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJwZXJtaXNzaW9ucyBXSEVSRSBwZXJtaXNzaW9uX25hbWUgPSA/IjsKLy8gICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkcGVybSApICk7Ci8vICAgICBpZiggISRkYnJlc3VsdCB8fCAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPT0gMCApIHJldHVybiBmYWxzZTsKLy8gICAgICRwcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwoKLy8gICAgIGZvcmVhY2goICRncm91cHMgYXMgJGdyb3VwICkKLy8gICAgIHsKLy8gICAgICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iZ3JvdXBfcGVybXMgV0hFUkUgcGVybWlzc2lvbl9pZCA9ID8KLy8gICAgICAgICAgIEFORCBncm91cF9pZCA9ID8iOwovLyAgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHByb3dbJ3Blcm1pc3Npb25faWQnXSwgJGdpZCApICk7Ci8vICAgICAgIGlmKCAkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpID4gMCApIHJldHVybiB0cnVlOyAgICAgIAovLyAgICAgfQoKLy8gICAgIHJldHVybiBmYWxzZTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gQXNzaWduVXNlclRvR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIC8vIHZhbGlkYXRlIHRoZSB1c2VyIGlkCiAgICBpZiggISR0aGlzLT5Vc2VyRXhpc3RzQnlJRCggJHVpZCApICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAKICAgIC8vIHZhbGlkYXRlIHRoZSBncm91cCBpZAogICAgaWYoICEkdGhpcy0+R3JvdXBFeGlzdHNCeUlEKCAkZ2lkICkgKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIAogICAgLy8gYWRkIHRoZSByZWNvcmQgdG8gdGhlIHRhYmxlIHRvIG1ha2UgdGhpcyAKICAgIC8vIHVzZXIgYSBtZW1iZXIgb2YgdGhpcyBncm91cAogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyAKICAgICAgICAgICAgICAgIFZBTFVFUyAoPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCwgJGdpZCApICk7CiAgICByZXR1cm4oICRkYnJlc3VsdCAhPSBmYWxzZSApOwogIH0KCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIElzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICkKICB7CiAgICAvLyBhIHBhc3N3b3JkIGlzIHZhbGlkLCBpZiBpdCdzIGxlbmd0aCBpcwogICAgLy8gd2l0aGluIGNlcnRhaW4gcmFuZ2VzCiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJG1pbmxlbiA9ICRtb2R1bGUtPkdldFByZWZlcmVuY2UoJ21pbl9wYXNzd29yZGxlbmd0aCcsIDYgKTsKICAgICRtYXhsZW4gPSAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnLCAyMCApOwogICAgJGxlbiA9IHN0cmxlbigkcGFzc3dvcmQpOwogICAgaWYoICRsZW4gPCAkbWlubGVuICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICBlbHNlIGlmKCAkbGVuID4gJG1heGxlbiApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgCiAgICAvKgogICAgLy8gdGhlcmUgbXVzdCBiZSBhdGxlYXN0IDMgdW5pcXVlIGNoYXJhY3RlcnMKICAgIGlmKCBzdHJsZW4oY291bnRfY2hhcnMoICR1c2VybmFtZSwgMyApKSA8IG1pbigzLG1pbmxlbikpCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgKi8KICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFuIGFycmF5CiAgZnVuY3Rpb24gRGVsZXRlVXNlckZ1bGwoICRpZCApCiAgewogICAgLy8gbG9nIHRoZSB1c2VyIG91dAogICAgJHRoaXMtPkxvZ291dFVzZXIoICRpZCApOwoKICAgIC8vIGRlbGV0ZSB1c2VyIHByb3BlcnRpZXMKICAgICR0aGlzLT5EZWxldGVBbGxVc2VyUHJvcGVydGllc0Z1bGwoICRpZCApOwoKICAgIC8vIGRlbGV0ZSB1c2VyIGZyb20gZ3JvdXBzCiAgICAkcmV0ID0gJHRoaXMtPlJlbW92ZVVzZXJGcm9tR3JvdXAoICRpZCwgJycgKTsKICAgIGlmKCAkcmV0WzBdID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuICRyZXQ7CiAgICAgIH0KCiAgICAvLyBkZWxldGUgdXNlciByZWNvcmQKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzCiAgICAgICAgICBXSEVSRSBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0U8ICRkYi0+RXJyb3JNc2coKSApOwogICAgICB9CgogICAgLy8gYW5kIGRlbGV0ZSBhbnl0aGluZyBmcm9tIHRoZSB0ZW1wY29kZXMgdGFibGUgdG9vCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdGVtcGNvZGUKICAgICAgICAgIFdIRVJFIHVzZXJpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRpZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0U8ICRkYi0+RXJyb3JNc2coKSApOwogICAgICB9CiAgICAKICAgIHJldHVybiBhcnJheSggVFJVRSwgIiIgKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheQogIGZ1bmN0aW9uIEdldEdyb3VwSW5mbyggJGdpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZ2lkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvdzsKICB9CiAgCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICAvLyBzZWNvbmQgZWxlbWVudCBvZiBhcnJheSBtYXkgYmUgYW4gYXJyYXkKICBmdW5jdGlvbiBHZXRVc2VySW5mbyggJHVpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gYXJyYXkoIFRSVUUsICRyb3cgKTsKICB9CiAgCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFuIGFycmF5IG9yIGZhbHNlCiAgZnVuY3Rpb24gQ291bnRVc2Vyc0luR3JvdXAoICRncm91cGlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgJHEgPSAnJzsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggJGdyb3VwaWQgPT0gJycgfHwgJGdyb3VwaWQgPCAwICkKICAgICAgewoJJHEgPSAiU0VMRUNUIGNvdW50KGlkKSBhcyBudW0gRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiOyAKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkcSA9ICJTRUxFQ1QgY291bnQoaWQpIGFzIG51bSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycywiLgoJICBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgV0hFUkUgaWQ9dXNlcmlkIEFORCBncm91cGlkID0gPyI7CgkkcGFybXNbXSA9ICRncm91cGlkOwogICAgICB9CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHBhcm1zICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvd1snbnVtJ107CiAgfQoKICBmdW5jdGlvbiBHZXRVc2Vyc0luR3JvdXAoICRncm91cGlkID0gJycsICR1c2VycmVnZXggPSAnJywgJGxpbWl0ID0gJycsICRzb3J0ID0gJycsCgkJCSAgICAkcHJvcGVydHkgPSAnJywgJHByb3ByZWdleCA9ICcnKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwoKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICAkd2hlcmUgPSBhcnJheSgpOwogICAgJG9yZGVyc29ydCA9ICIiOwogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgQSI7IAogICAgaWYoICRwcm9wZXJ0eSAhPSAnJyAmJiAkcHJvcHJlZ2V4ICE9ICcnICkKICAgICAgewoJJHEgLj0gIiwiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyBCIjsKCSR3aGVyZVtdID0gIiBBLmlkID0gQi51c2VyaWQiOwogICAgICB9CiAgICBpZiggJGdyb3VwaWQgIT0gJycgJiYgJGdyb3VwaWQgPj0gMCApCiAgICAgIHsKCSRxIC49ICIsIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgQyI7Cgkkd2hlcmVbXSA9ICIgQS5pZCA9IEMudXNlcmlkIjsKCSR3aGVyZVtdID0gIiBncm91cGlkID0gPyI7CgkkcGFybXNbXSA9ICRncm91cGlkOwogICAgICB9CiAgICBpZiggJHByb3BlcnR5ICE9ICcnICYmICRwcm9wcmVnZXggIT0gJycgKQogICAgICB7Cgkkd2hlcmVbXSA9ICIgQi50aXRsZSA9ID8gYW5kIEIuZGF0YSBSRUdFWFAgPyI7CgkkcGFybXNbXSA9ICRwcm9wZXJ0eTsKCSRwYXJtc1tdID0gJHByb3ByZWdleDsKICAgICAgfQogICAgaWYoICR1c2VycmVnZXggIT0gJycgKQogICAgICB7Cgkkd2hlcmVbXSA9ICIgdXNlcm5hbWUgUkVHRVhQID8iOwoJJHBhcm1zW10gPSAkdXNlcnJlZ2V4OwogICAgICB9CiAgICBpZiggJHNvcnQgIT0gJycgKQogICAgICB7Cgkkb3JkZXJzb3J0IC49ICIgT1JERVIgQlkgJHNvcnQiOwogICAgICB9CiAgICBpZiggJGxpbWl0ICE9ICcnICkKICAgICAgewoJJG9yZGVyc29ydCAuPSAiIExJTUlUICRsaW1pdCI7IAogICAgICB9CgogICAgLy8gcHV0IHRoZSBxdWVyeSB0b2dldGhlcgogICAgaWYoIGNvdW50KCR3aGVyZSApICkKICAgICAgewoJJHEgLj0gIiBXSEVSRSAiIC4gaW1wbG9kZSgiIEFORCAiLCR3aGVyZSk7CiAgICAgIH0KICAgICRxIC49ICRvcmRlcnNvcnQ7Ci8vICAgICBlY2hvICJERUJVRyBxdWVyeSA9ICRxPGJyLz4iOwovLyAgICAgZWNobyAiICAgICAgIjsgcHJpbnRfciggJHBhcm1zICk7IGVjaG8gIjxici8+IjsgLy8gZGVidWcKCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCAkcGFybXMgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCiAgICAgIHsKCWFycmF5X3B1c2goICRyZXN1bHQsICRyb3cgKTsKICAgICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlJRCggJGdpZCApCiAgewogICAgJGRhdGEgPSAkdGhpcy0+R2V0R3JvdXBJbmZvKCAkZ2lkICk7CiAgICByZXR1cm4oICRkYXRhICE9IGZhbHNlICk7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApCiAgewogICAgJGdpZCA9ICR0aGlzLT5HZXRHcm91cElEKCAkbmFtZSApOwogICAgcmV0dXJuKCAkZ2lkICE9IGZhbHNlICk7CiAgfQogIAogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFycmF5CiAgZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggJGVtYWlsLCAkc210cHZhbGlkYXRlID0gZmFsc2UgKQogIHsKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIGlmKCAhZXJlZ2koIl5bX2EtejAtOS1dKyhcLltfYS16MC05LV0rKSpAW2EtejAtOS1dKyhcLlthLXowLTktXSspKihcLlthLXpdezIsM30pJCIsICRlbWFpbCApICkKICAgICAgewoJJHJlc3VsdFswXSA9IGZhbHNlOwoJJHJlc3VsdFsxXSA9ICRtb2R1bGUtPkxhbmcoJ2Vycm9yX2ltcHJvcGVyZW1haWxmb3JtYXQnKTsKCXJldHVybiAkcmVzdWx0OwogICAgICB9CgogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKICAgIGlmKCAhJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnYWxsb3dfZHVwbGljYXRlX2VtYWlscycpICkKICAgICAgewoJJGRiID0gJHRoaXMtPkdldERiKCk7CgkkcSA9ICJTRUxFQ1QgZGF0YSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiwiLgoJICBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgbmFtZT10aXRsZSBBTkQKICAgICAgICAgIHR5cGU9MiBBTkQgZGF0YSBMSUtFID8iOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRlbWFpbCApICk7CglpZiggJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSApCgkgIHsKCSAgICAkcmVzdWx0WzBdID0gZmFsc2U7CgkgICAgJHJlc3VsdFsxXSA9ICRtb2R1bGUtPkxhbmcoJ2Vycm9yX2VtYWlsYWxyZWFkeXVzZWQnKTsKCSAgICByZXR1cm4gJHJlc3VsdDsKCSAgfQogICAgICB9CgogICAgaWYoICRzbXRwdmFsaWRhdGUgPT0gZmFsc2UgKQogICAgICB7CgkkcmVzdWx0WzBdID0gdHJ1ZTsKCXJldHVybiAkcmVzdWx0OwogICAgICB9CiAgICAKICAgIC8vIGdvIGFoZWFkIGFuZCB2YWxpZGF0ZSB0aGUgZW1haWwgYWRkcmVzcyBmdXJ0aGVyCiAgICBsaXN0ICggJHVuYW1lLCAkZG9tYWluICkgPSBzcGxpdCggIkAiLCAkZW1haWwgKTsKICAgIGlmKCBnZXRteHJyKCRkb21haW4sICRteGhvc3QgKSApCiAgICAgIHsKCSRjb25uZWN0YWRkcmVzcyA9ICRteGhvc3RbMF07CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSRjb25uZWN0YWRkcmVzcyA9ICRkb21haW47CiAgICAgIH0KICAgICRjb25uZWN0ID0gZnNvY2tvcGVuKCAkY29ubmVjdGFkZHJlc3MsIDI1ICk7CiAgICBpZiggJGNvbm5lY3QgKQogICAgICB7CglpZiggZXJlZygnXjIyMCcsICRvdXQgPSBmZ2V0cyggJGNvbm5lY3QsIDEwMjQgKSApICkKCSAgewoJICAgIGZwdXRzKCAkY29ubmVjdCwgIkhFTE8gJEhUVFBfSE9TVFxyXG4iKTsKCSAgICAkb3V0ID0gZmdldHMoICRjb25uZWN0LCAxMDI0ICk7CgkgICAgZnB1dHMoICRjb25uZWN0LCAiTUFJTCBGUk9NIDx7JGVtYWlsfT5cclxuIik7CgkgICAgJGZyb20gPSBmZ2V0cyggJGNvbm5lY3QsIDEwMjQgKTsKCSAgICBmcHV0cyggJGNvbm5lY3QsICJSQ1BUIFRPOiA8eyRlbWFpbH0+XHJcbiIpOwoJICAgICR0byA9IGZnZXRzKCAkY29ubmVjdC4gMTAyNCApOwoJICAgIGZwdXRzKCAkY29ubmVjdCwgIlFVSVRcclxuIik7CgkgICAgZmNsb3NlKCAkY29ubmVjdCApOwoJICAgIGlmKCAhZXJlZyggIl4yNTAiLCAkZnJvbSApIHx8ICFlcmVnKCJeMjUwIiwgJHRvKSkKCSAgICAgIHsKCQkkcmVzdWx0WzBdID0gZmFsc2U7CgkJJHJlc3VsdFsxXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9zZXJ2ZXJyZWplY3RlZGVtYWlsJyk7CgkJcmV0dXJuICRyZXN1bHQ7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCSRyZXN1bHRbMF0gPSBmYWxzZTsKCQkkcmVzdWx0WzFdID0gJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVzcG9uc2Vmcm9tc2VydmVyJyk7CgkJcmV0dXJuICRyZXN1bHQ7CgkgICAgICB9CgkgIH0KCWVsc2UgCgkgIHsKCSAgICAkcmVzdWx0WzBdID0gZmFsc2U7CgkgICAgJHJlc3VsdFsxXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Jlc3BvbnNlZnJvbXNlcnZlcicpOwoJICAgIHJldHVybiAkcmVzdWx0OwoJICB9CiAgICAgIH0KICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBJc1ZhbGlkVXNlcm5hbWUoICR1c2VybmFtZSApCiAgewogICAgLy8gYSB1c2VybmFtZSBpcyB2YWxpZCwgaWYgaXQncyBsZW5ndGggaXMKICAgIC8vIHdpdGhpbiBjZXJ0YWluIHJhbmdlcywgYW5kIGl0IGNvbnRhaW5zCiAgICAvLyBvbmx5IGFscGhhbnVtZXJpY3MKICAgICRtb2R1bGUgPSAkdGhpcy0+R2V0TW9kdWxlKCk7CiAgICAkbWlubGVuID0gJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJywgNCApOwogICAgJG1heGxlbiA9ICRtb2R1bGUtPkdldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcsIDIwICk7CiAgICBpZiggc3RybGVuKCAkdXNlcm5hbWUgKSA8ICRtaW5sZW4gfHwgc3RybGVuKCAkdXNlcm5hbWUgKSA+ICRtYXhsZW4gKQogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICBpZiggIXByZWdfbWF0Y2goICcvXlthLXpBLVowLTlfLV0qJC8nLCAkdXNlcm5hbWUgKSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQoKICAgIC8qCiAgICAvLyB0aGVyZSBtdXN0IGJlIGF0bGVhc3QgMyB1bmlxdWUgY2hhcmFjdGVycwogICAgaWYoIHN0cmxlbihjb3VudF9jaGFycyggJHVzZXJuYW1lLCAzICkpIDwgbWluKDMsbWlubGVuKSkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAqLwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhbiBhcnJheQogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHBhcm1zID0gYXJyYXkoICR1aWQgKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzCiAgICAgICAgICBXSEVSRSB1c2VyaWQgPSA/IjsKICAgIGlmKCAkZ2lkICE9ICcnICkKICAgICAgewoJJHEgLj0gIiBBTkQgZ3JvdXBpZCA9ID8iOwoJYXJyYXlfcHVzaCggJHBhcm1zLCAkZ2lkICk7CiAgICAgIH0KICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsICRwYXJtcyApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICRkYi0+RXJyb3JNc2coKSApOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCXJldHVybiBhcnJheSggVFJVRSApOwogICAgICB9CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYXJyYXkKICBmdW5jdGlvbiBTZXRHcm91cCggJGlkLCAkbmFtZSwgJGRlc2MgKQogIHsKICAgIGlmKCAhaXNzZXQoICRuYW1lICkgfHwgJG5hbWUgPT0gJycgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIAogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgJGVpZCA9ICR0aGlzLT5HZXRHcm91cElEKCAkbmFtZSApOwogICAgaWYoICRlaWQgIT0gZmFsc2UgJiYgJGVpZCAhPSAkaWQgKQogICAgICB7CgkkbW9kID0gJHRoaXMtPkdldE1vZHVsZSgpOwoJcmV0dXJuIGFycmF5KEZBTFNFLCRtb2QtPkxhbmcoJ2Vycm9yX2dyb3VwbmFtZV9leGlzdHMnKSk7CiAgICAgIH0KICAgIAogICAgJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgU0VUCiAgICAgICAgICAgICAgICBncm91cG5hbWUgPSA/LCBncm91cGRlc2MgPSA/IFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJG5hbWUsICRkZXNjLCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAnJyk7CiAgfQoKCiAgZnVuY3Rpb24gU2V0VXNlclBhc3N3b3JkKCAkdWlkLCAkcGFzc3dvcmQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycwogICAgICAgICAgU0VUIHBhc3N3b3JkID0gPyBXSEVSRSBpZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoIG1kNSgkcGFzc3dvcmQpLCAkdWlkICkpOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgcmV0dXJuIGFycmF5KFRSVUUsIiIpOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIGFycmF5CiAgZnVuY3Rpb24gU2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzID0gZmFsc2UgKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgCiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGlzIHVzZXIgZXhpc3RzCiAgICAkcmV0ID0gJHRoaXMtPkdldFVzZXJJbmZvKCAkdWlkICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwgJHRoaXMtPkxhbmcoJ2Vycm9yX3VzZXJub3Rmb3VuZCcpKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgdXNlcm5hbWUgaXMgbm90IHRha2VuIGJ5IHNvbWUgb3RoZXIgaWQKICAgICRudWlkID0gJHRoaXMtPkdldFVzZXJJRCgkdXNlcm5hbWUpOwogICAgaWYoICRudWlkICE9IGZhbHNlICYmICRudWlkICE9ICR1aWQgKQogICAgICB7CgkkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwoJcmV0dXJuIGFycmF5KEZBTFNFLCAkbW9kdWxlLT5MYW5nKCdlcnJvcl91c2VybmFtZXRha2VuJywkdWlkKSk7CiAgICAgIH0KCiAgICAkZGJyZXN1bHQgPSAnJzsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICAkcSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFNFVAogICAgICAgICB1c2VybmFtZSA9ID8iOwoJCiAgICAkcGFybXNbXSA9ICR1c2VybmFtZTsKICAgIGlmKCB0cmltKCAkcGFzc3dvcmQgKSAhPSAnJyApCiAgICAgIHsKCSRxIC49ICIsIHBhc3N3b3JkID0gPyI7CgkkcGFybXNbXSA9IG1kNSgkcGFzc3dvcmQpOwogICAgICB9CiAgICBpZiggJGV4cGlyZXMgIT0gZmFsc2UgKQogICAgICB7CgkkcSAuPSAiLCBleHBpcmVzID0gPyI7CgkkcGFybXNbXSA9ICRkYi0+REJUaW1lU3RhbXAoJGV4cGlyZXMpOwogICAgICB9CiAgICAkcSAuPSAiIFdIRVJFIGlkID0gPyI7CiAgICAkcGFybXNbXSA9ICR1aWQ7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCAkcGFybXMgKTsKCiAgICBpZiggJGRicmVzdWx0ID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheSggVFJVRSwgIiIgKTsKICB9CgogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICAvLyByZXR1cm5zIHRydWUvZmFsc2UKICBmdW5jdGlvbiBTZXRVc2VyR3JvdXBzKCAkdWlkLCAkZ3JwaWRzICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdGhpcyB1c2VyIGV4aXN0cwogICAgJHJldCA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgaWYoICRyZXRbMF0gPT0gRkFMU0UgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsICJVc2VyIGRvZXMgbm90IGV4aXN0Iik7CiAgICAgIH0KCiAgICAvLyB0aGVuIHJlbW92ZSBhbGwgaGlzIGN1cnJlbnQgYXNzaWdubWVudHMKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIAogICAgICAgICAgV0hFUkUgdXNlcmlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVpZCApKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICApOwogICAgICB9CgogICAgLy8gYW5kIGFkZCBhbGwgb2YgdGhlbSBpbgogICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MKICAgICAgICAgIFZBTFVFUyAoPyw/KSI7CiAgICBmb3JlYWNoKCAkZ3JwaWRzIGFzICRncnBpZCApCiAgICB7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkLCAkZ3JwaWQgKSApOwogICAgICBpZiggISRkYnJlc3VsdCApCgl7CgkgIHJldHVybiBhcnJheSggRkFMU0UsICRkYi0+RXJyb3JNc2coKSAgKTsKCX0KICAgIH0KICAgIHJldHVybiBhcnJheSggVFJVRSwgIiIgKTsKICB9CgoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyB0cnVlL2ZhbHNlCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnRpZXMoICR1aWQsICRwcm9wcyApCiAgewogICAgLy8gRGVsZXRlIGFsbCB0aGUgdXNlciBwcm9wZXJ0aWVzCiAgICAvLyBhbmQgc2V0IG5ldyBvbmVzCiAgICAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5RnVsbCggIiIsICR1aWQsIHRydWUgKTsKCiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICBsaXN0KCAka2V5LCAkdmFsICkgPSBzcGxpdCgiPSIsJHByb3ApOwogICAgICAkdGhpcy0+U2V0VXNlclByb3BlcnR5KCAka2V5LCAkdmFsLCAkdWlkICk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgdHJ1ZS9mYWxzZQogIGZ1bmN0aW9uIFVzZXJFeGlzdHNCeUlEKCAkdWlkICkKICB7CiAgICAkZGF0YSA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgcmV0dXJuKCAkZGF0YVswXSAhPSBmYWxzZSApOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkgb3IgZmFsc2UKICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydGllcygkdWlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdXNlcmlkPT8iOwogICAgJHA9YXJyYXkoJHVpZCk7CiAgICAkYXJyID0gYXJyYXkoKTsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYoICRkYnJlc3VsdCA9PSBmYWxzZSApCiAgICAgIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CglhcnJheV9wdXNoKCAkYXJyLCAkcm93ICk7CiAgICAgIH0KICAgIHJldHVybiAkYXJyOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkgb2YgcmVjb3JkcyBvciBmYWxzZQogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIHVzZXJpZD0/IjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsYXJyYXkoJHVzZXJpZCkpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJlc3VsdD1hcnJheSgpOzsKICAgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CglhcnJheV9wdXNoKCAkcmVzdWx0LCAkcm93ICk7CiAgICAgIH0KICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLwogIC8vIGVuZCBvZiByYyBmdW5jdGlvbnMKICAvLwoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICAkdXNlcmlkPSR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiAoJHVzZXJpZD09PWZhbHNlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gJHRoaXMtPkdldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsJGRlZmF1bHR2YWx1ZSk7CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCAkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERCKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllcyBXSEVSRSB0aXRsZT0/IEFORCB1c2VyaWQ9PyI7CiAgICAkcD1hcnJheSgkdGl0bGUsJHVzZXJpZCk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JHJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImRhdGEiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkZGVmYXVsdHZhbHVlOwogICAgfQogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIFNldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRhdGEpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkPT09ZmFsc2UpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiAkdGhpcy0+U2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJGRhdGEsJHVzZXJpZCk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJGRhdGEsJHVzZXJpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3Byb3BlcnRpZXMgV0hFUkUgdGl0bGU9PyBBTkQgdXNlcmlkPT8iOwogICAgJHA9YXJyYXkoJHRpdGxlLCR1c2VyaWQpOwogICAgJHI9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICAgIGlmICghJHIgfHwgKCRyLT5OdW1Sb3dzKCk9PTApKSB7CiAgICAgICRuZXdpZD0kZGItPkdlbklEKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllc19zZXEiKTsKICAgICAgJHE9IklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIChpZCx1c2VyaWQsdGl0bGUsZGF0YSkgVkFMVUVTICg/LD8sPyw/KSI7CiAgICAgICRwPWFycmF5KCRuZXdpZCwkdXNlcmlkLCR0aXRsZSwkZGF0YSk7CiAgICAgICRyPSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICB9IGVsc2UgewogICAgICAkcm93PSRyLT5GZXRjaFJvdygpOwogICAgICAkcT0iVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFNFVCBkYXRhPT8gV0hFUkUgaWQ9PyI7CiAgICAgICRwPWFycmF5KCRkYXRhLCRyb3dbImlkIl0pOwogICAgICAkcj0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgfQogICAgcmV0dXJuICgkciE9ZmFsc2UpOwogIH0KCiAgLy8gZGVsZXRlIGFsbCBvY2N1cmFuY2VzIG9mIHRoZSB1c2VycHJvcGVydHkgYnkgbmFtZQogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eUJ5TmFtZSggJHRpdGxlICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0REIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHRpdGxlPT8iOwogICAgJHAgPSBhcnJheSggJHRpdGxlICk7CiAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgJHAgKTsKICAgIHJldHVybiAoJHJlc3VsdCE9ZmFsc2UpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbD1mYWxzZSkgCiAgewogICAgJHVzZXJpZD0kdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYgKCR1c2VyaWQ9PT1mYWxzZSkgcmV0dXJuIGZhbHNlOwogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHVzZXJpZD0/IjsKICAgIGlmICghJGFsbCkgJHEuPSIgQU5EIHRpdGxlPT8iOwogICAgJHA9YXJyYXkoKTsKICAgIGlmICgkYWxsKSAkcD1hcnJheSgkdXNlcmlkKTsgZWxzZSAkcD1hcnJheSgkdXNlcmlkLCR0aXRsZSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICByZXR1cm4gKCRyZXN1bHQhPWZhbHNlKTsKICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsJGFsbD1mYWxzZSkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREQigpOwogICAgJHE9IkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIFdIRVJFIHVzZXJpZD0/IjsKICAgIGlmICghJGFsbCkgJHEuPSIgQU5EIHRpdGxlPT8iOwogICAgJHA9YXJyYXkoKTsKICAgIGlmICgkYWxsKSAkcD1hcnJheSgkdXNlcmlkKTsgZWxzZSAkcD1hcnJheSgkdXNlcmlkLCR0aXRsZSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICByZXR1cm4gKCRyZXN1bHQhPWZhbHNlKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBEZWxldGVBbGxVc2VyUHJvcGVydGllcygpIAogIHsKICAgIHJldHVybiAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5KCIiLHRydWUpOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZUFsbFVzZXJQcm9wZXJ0aWVzRnVsbCgkdXNlcmlkKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoIiIsJHVzZXJpZCx0cnVlKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBDaGVja1Bhc3N3b3JkKCR1c2VybmFtZSwkcGFzc3dvcmQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSB1c2VybmFtZT0/IEFORCBwYXNzd29yZD0/IjsKICAgICRwPWFycmF5KCR1c2VybmFtZSxtZDUoJHBhc3N3b3JkKSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgICBpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ2dlZEluTmFtZSgpIAogIHsKICAgICR1c2VyaWQ9JHRoaXMtPkxvZ2dlZEluSWQoKTsKICAgIGlmICgkdXNlcmlkIT0iIikgcmV0dXJuICR0aGlzLT5HZXRVc2VyTmFtZSgkdXNlcmlkKTsgZWxzZSByZXR1cm4gIiI7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIExvZ2dlZEluRW1haWwoKSAKICB7CiAgICAkdXNlcmlkPSR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiAoJHVzZXJpZCE9IiIpIHJldHVybiAkdGhpcy0+R2V0RW1haWwoJHVzZXJpZCk7IGVsc2UgcmV0dXJuICIiOwogIH0KCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dvdXQoKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIFdIRVJFIHNlc3Npb25pZD0/IjsKICAgICRwPWFycmF5KHNlc3Npb25faWQoKSk7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSwkcCk7CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nb3V0VXNlcigkdWlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIFdIRVJFIHVzZXJpZD0/IjsKICAgICRwPWFycmF5KCR1aWQpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEV4cGlyZVVzZXJzKCkgCiAgewogICAgJG1vZHVsZSA9ICR0aGlzLT5HZXRNb2R1bGUoKTsKICAgICRleHBpcnl0aW1lID0gJG1vZHVsZS0+R2V0UHJlZmVyZW5jZSgndXNlcl9zZXNzaW9uX2V4cGlyZXMnKTsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfbG9nZ2VkaW4gV0hFUkUgbGFzdHVzZWQ8PyI7CiAgICAkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwogICAgJHA9YXJyYXkodGltZSgpLSRleHBpcnl0aW1lKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwKTsKICB9CgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBMb2dnZWRJbklkKCkgCiAgewogICAgaWYoIHNlc3Npb25faWQoKSA9PSAiIiApCiAgICAgIHsKCS8vIGlmIHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uIGlkLCB0aGVuIHdlIGFyZW4ndCBsb2dnZWQgaW4uCglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkdGhpcy0+RXhwaXJlVXNlcnMoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBXSEVSRSBzZXNzaW9uaWQ9PyI7CiAgICAkcD1hcnJheShzZXNzaW9uX2lkKCkpOwogICAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHEsJHApOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgICRyZXR2YWwgPSAkcm93WyJ1c2VyaWQiXTsKCiAgICAgIC8vIG5vdyB0b3VjaCB0aGUgbGFzdHVzZWQKICAgICAgLy8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IGV2ZXJ5IHRpbWUgd2UgY2hlY2sgdGhhdCBhIHVzZXIgaXMKICAgICAgLy8gbG9nZ2VkIGluLCBpdCB0b3VjaGVzIGhpcyBsb2dnZWQgaW4gZW50cnkKICAgICAgJHEgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiBTRVQgbGFzdHVzZWQgPSA/IHdoZXJlIHNlc3Npb25pZCA9ID8iOwogICAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoIHRpbWUoKSwgc2Vzc2lvbl9pZCgpICkgKTsKICAgICAgcmV0dXJuICRyZXR2YWw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gTG9nZ2VkSW4oKSAKICB7CiAgICBpZiggISR0aGlzLT5Mb2dnZWRJbklkKCkgKSAKICAgICAgewoJcmV0dXJuIGZhbHNlOyAKICAgICAgfQogICAgZWxzZQogICAgICB7CglyZXR1cm4gdHJ1ZTsKICAgICAgfQogIH0KCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIE1lbWJlck9mR3JvdXAoJHVzZXJpZCwkZ3JvdXBpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IiI7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9PyBBTkQgZ3JvdXBpZD0/IjsKICAgIAogICAgJHBhcmFtcz1hcnJheSgkdXNlcmlkLCRncm91cGlkKTsKICAgICRyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxLCRwYXJhbXMpOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldFVzZXJOYW1lKCR1c2VyaWQpIAogIHsKICAgICRkYj0kdGhpcy0+R2V0RGIoKTsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSBpZD0nIi4kdXNlcmlkLiInIjsKICAgIAogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbInVzZXJuYW1lIl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRFbWFpbCgkdXNlcmlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iIjsKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBXSEVSRSBpZD0nIi4kdXNlcmlkLiInIjsKICAgIAogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgcmV0dXJuICRyb3dbImVtYWlsIl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIAogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRVc2VySUQoJHVzZXJuYW1lKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWU9JyIuJHVzZXJuYW1lLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJpZCJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgLy8gcmV0dXJucyBhcnJheQogIGZ1bmN0aW9uIEFkZEdyb3VwKCAkbmFtZSwgJGRlc2NyaXB0aW9uICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgLy8gc2VlIGlmIGl0IGV4aXN0cyBhbHJlYWR5IG9yIG5vdCAoYnkgbmFtZSkKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCiAgICAgICJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJG5hbWUgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoRkFMU0UsJGRiLT5FcnJvck1zZygpKTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAkcm93ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCR0aGlzLT5MYW5nKCdlcnJvcl9ncm91cG5hbWVfZXhpc3RzJykpOwogICAgICB9CiAgICAKICAgICRncnBpZCA9IAogICAgICAkZGItPkdlbklEKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3Vwc19zZXEiICk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4KICAgICAgIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBWQUxVRVMgKD8sPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGdycGlkLCAkbmFtZSwgJGRlc2NyaXB0aW9uICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFLCRncnBpZCk7CiAgfQoKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYXJyYXkKICBmdW5jdGlvbiBBZGRVc2VyKCAkbmFtZSwgJHBhc3N3b3JkLCAkZXhwaXJlcyApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAKICAgIC8vIHNlZSBpZiBpdCBleGlzdHMgYWxyZWFkeSBvciBub3QgKGJ5IG5hbWUpCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWUgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkbmFtZSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICRyb3cgKQogICAgICB7CgkkbW9kdWxlID0gJHRoaXMtPkdldE1vZHVsZSgpOwoJcmV0dXJuIGFycmF5KEZBTFNFLCRtb2R1bGUtPkxhbmcoJ2Vycm9yX3VzZXJuYW1lX2V4aXN0cycpKTsKICAgICAgfQogICAgCiAgICAvLyBnZW5lcmF0ZSB0aGUgc2VxdWVuY2UKICAgICR1aWQgPSAKICAgICAgJGRiLT5HZW5JRCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiICk7CgogICAgLy8gaW5zZXJ0IHRoZSByZWNvcmQKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAibW9kdWxlX2ZldXNlcnNfdXNlcnMgVkFMVUVTICg/LD8sPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkLCAkbmFtZSwgbWQ1KCRwYXNzd29yZCksIAoJCQkJCSAkZGItPkRiVGltZVN0YW1wKHRpbWUoKSksCgkJCQkJICRkYi0+RGJUaW1lU3RhbXAoJGV4cGlyZXMpICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KEZBTFNFLCRkYi0+RXJyb3JNc2coKSk7CiAgICAgIH0KICAgIHJldHVybiBhcnJheShUUlVFLCR1aWQpOwogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBOYW1lKCRncm91cGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkPSciLiRncm91cGlkLiInIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgJHJvdz0kZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93WyJncm91cG5hbWUiXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgCiAgCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEdyb3VwRGVzYygkZ3JvdXBpZCkgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBpZD0nIi4kZ3JvdXBpZC4iJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICByZXR1cm4gJHJvd1siZ3JvdXBkZXNjIl07CiAgICB9IAllbHNlIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICAKCiAgLy8gdXNlcmlkIGFwaSBmdW5jdGlvbgogIC8vIHJldHVybnMgYW4gYXJyYXkKICBmdW5jdGlvbiBEZWxldGVHcm91cEZ1bGwoICRpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERCKCk7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAvLyBkZWxldGUgYWxsIHByb3BlcnR5IHJlbGF0aW9ucyBmcm9tIHRoaXMgZ3JvdXAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAgV0hFUkUgZ3JvdXBfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQoKICAgIC8vIGRlbGV0ZSBhbGwgaW5kaWNhdGlvbiB0aGF0IGFueWJvZHkgaXMgYSBtZW1iZXIKICAgIC8vIG9mIHRoaXMgZ3JvdXAKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIFdIRVJFIGdyb3VwaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CglyZXR1cm4gYXJyYXkoIEZBTFNFLCAkZGItPkVycm9yTXNnKCkgKTsKICAgICAgfQogICAgCiAgICAvLyBhbmQgdGhlbiBkZWxldGUgdGhlIGdyb3VwCiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGlkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIAogICAgcmV0dXJuIGFycmF5KCBUUlVFLCAnJyApOwogIH0KICAKICAKICAvLyB1c2VyaWQgYXBpIGZ1bmN0aW9uCiAgZnVuY3Rpb24gR2V0R3JvdXBMaXN0KCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIAogICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSApOwogICAgaWYoICRkYnJlc3VsdCApIHsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJHJlc3VsdFskcm93Wydncm91cG5hbWUnXV0gPSAkcm93WydpZCddOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CiAgCgogIC8vIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBHZXRHcm91cExpc3RGdWxsKCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSAgCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKICAgIGlmKCAkZGJyZXN1bHQgKSB7CiAgICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgICB7CgkgIGFycmF5X3B1c2goJHJlc3VsdCwkcm93KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldEdyb3VwSUQoJGdyb3VwbmFtZSkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwoKICAgICRxPSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMgV0hFUkUgZ3JvdXBuYW1lPSciLiRncm91cG5hbWUuIiciOwogICAgJGRicmVzdWx0PSRkYi0+RXhlY3V0ZSgkcSk7CiAgICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgCiAgICAgIHsKCSRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpOwoJcmV0dXJuICRyb3dbImlkIl07CiAgICAgIH0gCiAgICBlbHNlIAogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICB9CgoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3VwcygkdXNlcmlkKSB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9JyIuJHVzZXJpZC4iJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgIGlmICgkZGJyZXN1bHQgJiYgJGRicmVzdWx0LT5Sb3dDb3VudCgpKSB7CiAgICAgICRyZXN1bHQ9IiI7CiAgICAgIHdoaWxlICgkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewoJaWYgKCRyZXN1bHQhPSIiKSB7CgkgICRyZXN1bHQuPSIsIi4kdGhpcy0+R2V0R3JvdXBOYW1lKCRyb3dbImdyb3VwaWQiXSk7Cgl9IGVsc2UgewoJICAkcmVzdWx0PSR0aGlzLT5HZXRHcm91cE5hbWUoJHJvd1siZ3JvdXBpZCJdKTsKCX0KICAgICAgfQogICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAibm9uZSI7CiAgICB9CiAgfQoKCiAgLy8gb2xkIHVzZXJpZCBhcGkgZnVuY3Rpb24KICBmdW5jdGlvbiBDaGFuZ2VVc2VyKCRpZCkgCiAgewogICAgJGRiPSR0aGlzLT5HZXREYigpOwogICAgaWYgKGlzc2V0KCRfUE9TVFskaWQuInVzZXJpZCJdKSkgJHVzZXJpZD10cmltKCRfUE9TVFskaWQuInVzZXJpZCJdKTsgZWxzZSByZXR1cm4gIlVucmVjb3ZlcmFibGUgZXJyb3IiOwogICAgJHVzZXJuYW1lPXRyaW0oJF9QT1NUWyRpZC4idXNlcm5hbWUiXSk7CiAgICAkcXVlcnk9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIHVzZXJuYW1lPSciLiR1c2VybmFtZS4iJyI7CiAgICAkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgaWYgKCRyZXN1bHQgJiYgJHJlc3VsdC0+Um93Q291bnQoKSkgewogICAgICAkcm93PSRyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIGlmICgkcm93WyJpZCJdIT0kdXNlcmlkKSByZXR1cm4gIlVzZXJuYW1lIGFscmVhZHkgZXhpc3RzISI7CiAgICB9CiAgICAKICAgIGlmIChpc3NldCgkX1BPU1RbJGlkLiJlbWFpbCJdKSkgJGVtYWlsPXRyaW0oJF9QT1NUWyRpZC4iZW1haWwiXSk7IGVsc2UgcmV0dXJuICJFbWFpbCBhZGRyZXNzIG11c3QgYmUgcHJvdmlkZWQiOwogICAgCiAgICBpZiAoaXNzZXQoJF9QT1NUWyRpZC4icGFzc3dvcmQiXSkpICRwYXNzd29yZD10cmltKCRfUE9TVFskaWQuInBhc3N3b3JkIl0pOyBlbHNlICRwYXNzd29yZD0iIjsKICAgIGlmICgkcGFzc3dvcmQhPSIiKSB7CiAgICAgICRwYXNzd29yZDI9dHJpbSgkX1BPU1RbJGlkLiJwYXNzd29yZDIiXSk7CiAgICAgIGlmICgkcGFzc3dvcmQhPSRwYXNzd29yZDIpIHJldHVybiAiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaCEiOwogICAgICAkcXVlcnk9IlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgU0VUIHVzZXJuYW1lPT8sU0VUIHBhc3N3b3JkPT8sZW1haWw9PyBXSEVSRSBpZD0/IjsKICAgICAgJHBhcmFtcz1hcnJheSgkdXNlcm5hbWUsbWQ1KCRwYXNzd29yZCksJGVtYWlsLCR1c2VyaWQpOwogICAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSwkcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgICRxdWVyeT0iVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2VycyBTRVQgdXNlcm5hbWU9PyxlbWFpbD0/IFdIRVJFIGlkPT8iOwogICAgICAkcGFyYW1zPWFycmF5KCR1c2VybmFtZSwkZW1haWwsJHVzZXJpZCk7CiAgICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwogICAgfQogICAgCiAgICAkcT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkpIHsKICAgICAgd2hpbGUgKCRyb3c9JGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CgkvL0ZpcnN0IHJlc2V0IHRoZSBhc3NvY2lvYXRpb25zCgkkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MgV0hFUkUgdXNlcmlkPT8gQU5EIGdyb3VwaWQ9PyI7CgkkcGFyYW1zMT1hcnJheSgkdXNlcmlkLCRyb3dbImlkIl0pOwoJJGRicmVzdWx0Mj0kZGItPkV4ZWN1dGUoJHEsJHBhcmFtczEpOwoJZWNobyAkZGItPkVycm9yTXNnKCk7CgkvL1RoZW4gY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCB3YXMgc2VsZWN0ZWQKCWlmICgkX1BPU1RbJGlkLiJncm91cCIuJHJvd1siaWQiXV09PSJ5ZXMiKSB7CgkgIC8vQ3JlYXRlIGFuIGFzc29jaWF0aW9uCgkgICRxPSJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyAodXNlcmlkLGdyb3VwaWQpIFZBTFVFUyAoPyw/KSI7CgkgICRwYXJhbXMyPWFycmF5KCR1c2VyaWQsJHJvd1siaWQiXSk7CgkgICRkYnJlc3VsdDI9JGRiLT5FeGVjdXRlKCRxLCRwYXJhbXMyKTsKCX0KICAgICAgfQogICAgfQogIH0KCQoKICAvLyBvbGQgdXNlcmlkIGFwaSBmdW5jdGlvbgogIGZ1bmN0aW9uIERlbGV0ZVVzZXIoJGlkKSAKICB7CiAgICAkZGI9JHRoaXMtPkdldERiKCk7CiAgICBpZiAoaXNzZXQoJF9HRVRbJGlkLiJ1c2VyaWQiXSkpICR1c2VyaWQ9JF9HRVRbJGlkLiJ1c2VyaWQiXTsgZWxzZSByZXR1cm47CiAgICAkcT0iREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIFdIRVJFIGlkPSckdXNlcmlkJyI7CiAgICAkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxKTsKICAgICRxPSJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyBXSEVSRSB1c2VyaWQ9JyR1c2VyaWQnIjsKICAgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwogIH0KCn0gLy8gY2xhc3MKCj8+Cg==]]></data>
  </file>
  <file>
    <filename>/FrontEndUsers.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKLyoKIEZyb250RW5kVXNlcnMuIEEgcGx1Z2luIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIENvcHlyaWdodCAoYykgMjAwNC0wNSBieSBNb3J0ZW4gUG91bHNlbiA8bW9ydGVuQHBvdWxzZW4ub3JnPgoKIFRyYW5zbGF0aW9uczoKIEZyZW5jaDogUGF0cmljaWEgQnJ1biwgaHR0cDovL3d3dy5icnVtYWxzb2xzdGljZS5jb20KIE5vcndlZ2lhbiAoYm9rbT9sKTogUm9nZXIgIlN0aWdtYSIgS251dHNlbiA8c3RpZ21hc3RlckBnbWFpbC5jb20+CgogQ01TLSBDTVMgTWFkZSBTaW1wbGUgaXMgQ29weXJpZ2h0IChjKSBUZWQgS3VscCAod2lzaHlAdXNlcnMuc2YubmV0KQogVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly9jbXNtYWRlc2ltcGxlLnNmLm5ldAoKIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoqLwoKLy8gYSB2ZXJ5IGltcG9ydGFudCBsaW5lIHRoYXQgaW5jbHVkZXMgYWxsIG9mIG91ciBhcGkgZnVuY3Rpb25zCnJlcXVpcmVfb25jZSggIkZyb250RW5kVXNlcnMuYXBpLnBocCIgKTsKcmVxdWlyZV9vbmNlKCAiUmFuZG9tLnBocCIgKTsKCgpmdW5jdGlvbiBpbXBsb2RlX3dpdGhfa2V5KCRhc3NvYywgJGluZ2x1ZSA9ICc9JywgJG91dGdsdWUgPSAnJicpCnsKICAgJHJldHVybiA9IG51bGw7CiAgIGZvcmVhY2ggKCRhc3NvYyBhcyAkdGsgPT4gJHR2KSAkcmV0dXJuIC49ICRvdXRnbHVlLiR0ay4kaW5nbHVlLiR0djsKICAgcmV0dXJuIHN1YnN0cigkcmV0dXJuLHN0cmxlbigkb3V0Z2x1ZSkpOwp9CgpmdW5jdGlvbiBleHBsb2RlX3dpdGhfa2V5KCRzdHIsICRpbmdsdWU9Jz0nLCAkb3V0Z2x1ZT0nJicpCnsKICAkcmV0ID0gYXJyYXkoKTsKICAkYTEgPSBzcGxpdCgkb3V0Z2x1ZSwkc3RyKTsKICBmb3JlYWNoKCAkYTEgYXMgJGEyICkKICB7CiAgICBsaXN0KCAkaywgJHYgKSA9IHNwbGl0KCAkaW5nbHVlLCAkYTIgKTsKICAgICRyZXRbICRrIF0gPSAkdjsKICB9CiAgcmV0dXJuICRyZXQ7Cn0KCmZ1bmN0aW9uIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkYXJyLCAkZXhwciApCnsKICAka2V5cyA9IGFycmF5X2tleXMoICRhcnIgKTsKICBmb3JlYWNoKCAka2V5cyBhcyAkayApCiAgewogICAgaWYoIHN0cnN0ciggJGssICRleHByICkgKSByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBhcnJheV9maW5kX2tleV9yZWdleHAoICRhcnIsICRleHByICkKewogICRrZXlzID0gYXJyYXlfa2V5cyggJGFyciApOwogIGZvcmVhY2goICRrZXlzIGFzICRrICkKICB7CiAgICBpZiggcHJlZ19tYXRjaCggJGV4cHIsICRrICkgKSByZXR1cm4gJGs7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gYXJyYXlfbWVyZ2VfYnlfbmFtZV9yZXF1aXJlZCggJGFycjEsICRhcnIyICkKewogICR4eHJlc3VsdCA9IGFycmF5KCk7CiAgLy8gYWRkIGl0ZW1zIGNvbW1vbiB0byBhcnIxIGFuZCBhcnIyIAogIC8vIGJ1dCBmYXZvciByZXF1aXJlZCBpdGVtcwogIGlmKCAhaXNfYXJyYXkoICRhcnIxICkgfHwgIWlzX2FycmF5KCAkYXJyMiApICkKICAgIHsKICAgICAgcmV0dXJuOwogICAgfQogIGZvcmVhY2goICRhcnIxIGFzICRhMSApCiAgewogICAgZm9yZWFjaCggJGFycjIgYXMgJGEyICkKICAgIHsKICAgICAgaWYoICRhMVsnbmFtZSddID09ICRhMlsnbmFtZSddICkgCgl7CgkgIGlmKCAkYTFbJ3JlcXVpcmVkJ10gPT0gMiApIAoJICAgIHsKCSAgICAgIGFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CgkgICAgICBicmVhazsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0gICAgCiAgICB9CiAgfQogIAogIC8vIGFkZCBpdGVtcyBpbiBhcnIxIG5vdCBpbiByZXN1bHQKICBmb3JlYWNoKCAkYXJyMSBhcyAkYTEgKQogIHsKICAgICRmb3VuZCA9IGZhbHNlOwogICAgZm9yZWFjaCggJHh4cmVzdWx0IGFzICRyZXMgKQogICAgewogICAgICBpZiggJGExWyduYW1lJ10gPT0gJHJlc1snbmFtZSddICkKCXsKCSAgJGZvdW5kID0gdHJ1ZTsKCSAgYnJlYWs7Cgl9CiAgICB9CiAgICBpZiggISRmb3VuZCApCiAgICAgIHsKCWFycmF5X3B1c2goICR4eHJlc3VsdCwgJGExICk7CiAgICAgIH0KICB9CiAgCiAgLy8gYWRkIGl0ZW1zIGluIGFycjIgbm90IGluIHJlc3VsdAogIGZvcmVhY2goICRhcnIyIGFzICRhMiApCiAgewogICAgJGZvdW5kID0gZmFsc2U7CiAgICBmb3JlYWNoKCAkeHhyZXN1bHQgYXMgJHJlcyApCiAgICB7CiAgICAgIGlmKCAkYTJbJ25hbWUnXSA9PSAkcmVzWyduYW1lJ10gKQoJewoJICAkZm91bmQgPSB0cnVlOwoJICBicmVhazsKCX0KICAgIH0KICAgIGlmKCAhJGZvdW5kICkKICAgICAgewoJYXJyYXlfcHVzaCggJHh4cmVzdWx0LCAkYTIgKTsKICAgICAgfQogIH0KICByZXR1cm4gJHh4cmVzdWx0Owp9CgoKZnVuY3Rpb24gY29tcGFyZV9lbGVtZW50c19ieV9zb3J0b3JkZXJfa2V5KCAkZTEsICRlMiApCnsKICBpZiggJGUxWydzb3J0X2tleSddIDwgJGUyWydzb3J0X2tleSddICkKICAgIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIGVsc2UgaWYoICRlMVsnc29ydF9rZXknXSA+ICRlMlsnc29ydF9rZXknXSApCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQogIHJldHVybiAwOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJG5hbWUsICR2YWx1ZT0nJywgJHNlbGVjdGVkdmFsdWU9JycsIAoJCQkgICAgICAgJGFkZHR0ZXh0PScnKQp7CiAgJHRleHQgPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwogICRhcnIgPSBzcGxpdCgiLCIsJHNlbGVjdGVkdmFsdWUpOwogIGZvcmVhY2goICRhcnIgYXMgJGEgKQogIHsKICAgIGlmICgkYSA9PSAkdmFsdWUpCiAgICAgIHsKCSR0ZXh0IC49ICcgJyAuICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgIH0KICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICRuYW1lLCAkdmFsdWU9JycsICRpbWFnZT0nJywgJGFkZHR0ZXh0PScnKQp7CiAgZ2xvYmFsICRnQ21zOwogICR0ZXh0ID0gJzxpbnB1dCBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyIgdHlwZT0nOwogIGlmICgkaW1hZ2UgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICciaW1hZ2UiJzsKICAgICAgJGltZyA9ICRnQ21zLT5jb25maWdbJ3Jvb3RfdXJsJ10uRElSRUNUT1JZX1NFUEFSQVRPUi4kaW1hZ2U7CiAgICAgICR0ZXh0IC49ICcgc3JjPSInLiRpbWcuJyInOwogICAgfQogIGVsc2UgCiAgICB7CiAgICAgICR0ZXh0IC49ICcic3VibWl0Iic7CiAgICB9CiAgaWYgKCRhZGR0dGV4dCAhPSAnJykKICAgIHsKICAgICAgJHRleHQgLj0gJyAnLiRhZGR0dGV4dDsKICAgIH0KICAkdGV4dCAuPSAnIC8+JzsKICByZXR1cm4gJHRleHQgLiAiXG4iOwp9CgoKZnVuY3Rpb24gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAkbmFtZSwgJHZhbHVlPScnLCAkYWRkdGV4dD0nJywgJGRlbGltPScsJykKewogIGlmKCBpc19hcnJheSggJHZhbHVlICkgKQogICAgewogICAgICAkdmFsID0gaW1wbG9kZV93aXRoX2tleSggJHZhbHVlICk7CiAgICB9CiAgZWxzZQogICAgewogICAgICAkdmFsID0gJHZhbHVlOwogICAgfQogICR2YWwgPSBzdHJfcmVwbGFjZSgnIicsICcmcXVvdDsnLCAkdmFsKTsKICAkdGV4dCA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInLiRpZC4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsLiciJzsKICBpZiAoJGFkZHRleHQgIT0gJycpCiAgICB7CiAgICAgICR0ZXh0IC49ICcgJy4kYWRkdGV4dDsKICAgIH0KICAkdGV4dCAuPSAiIC8+XG4iOwogIHJldHVybiAkdGV4dDsKfQoKCmZ1bmN0aW9uIGZpbmRfaW5kZXhfb2ZfdmFsdWUoICRkYXRhLCAkdmFsdWUsICRkZmx0ICkKewogICRpID0gMDsKICBmb3JlYWNoKCAkZGF0YSBhcyAkaz0+JHYgKQogIHsKICAgIGlmKCAkdiA9PSAkdmFsdWUgKQogICAgICB7CglyZXR1cm4gJGk7CiAgICAgIH0KICAgICRpKys7CiAgfQogIHJldHVybiAkZGZsdDsKfQoKCmNsYXNzIEZyb250RW5kVXNlcnMgZXh0ZW5kcyBDTVNNb2R1bGUgewoJdmFyICRkZXZkZWJ1ZyA9IDA7CiAgLyoqCiAgICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgdXNlZCBmb3IgdGhlIGxvZ2luIGZvcm0KICAgKi8KICB2YXIgJGRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEgPSAnCjwhLS0gZm9yZ290IHBhc3N3b3JkIHRlbXBsYXRlIC0tPgp7JHN0YXJ0Zm9ybX0KeyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9IFwnXCd9CiAge2lmICRlcnJvciAhPSBcJ1wnfQogICAgPHA+PGZvbnQgY29sb3I9InJlZCI+eyRtZXNzYWdlfTwvZm9udD48L3A+CiAge2Vsc2V9CiAgICA8cD57JG1lc3NhZ2V9PC9wPgogIHsvaWZ9CnsvaWZ9CjxwPnskbG9zdHB3X21lc3NhZ2V9PC9wPgo8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfTwvcD4KPHA+eyRoaWRkZW59eyRzdWJtaXR9Jm5ic3B7JGNhbmNlbH08L3A+CnskZW5kZm9ybX0KPCEtLSBmb3Jnb3QgcGFzc3dvcmQgdGVtcGxhdGUgLS0+IAogICc7CgogIHZhciAkZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMiA9ICcKPCEtLSBmb3Jnb3QgcGFzc3dvcmQgZW1haWwgdGVtcGxhdGUgLS0+CjxwPnskbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsfTwvcD4KPHA+eyRwcm9tcHRfY29kZX0mbmJzcDt7JGRhdGFfY29kZX08L3A+CjxwPnskcHJvbXB0X2xpbmt9Jm5ic3A7eyRkYXRhX2xpbmt9PHA+CjwhLS0gZm9yZ290IHBhc3N3b3JkIGVtYWlsIHRlbXBsYXRlIC0tPgogICc7CgoKICB2YXIgJGRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTMgPSAnCjwhLS0gZm9yZ290IHBhc3N3b3JkIHZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAtLT4KeyRzdGFydGZvcm19CnskdGl0bGV9CntpZiAkbWVzc2FnZSAhPSBcJ1wnfQogIHtpZiAkZXJyb3IgIT0gXCdcJ30KICAgIDxwPjxmb250IGNvbG9yPSJyZWQiPnskbWVzc2FnZX08L2ZvbnQ+PC9wPgogIHtlbHNlfQogICAgPHA+eyRtZXNzYWdlfTwvcD4KICB7L2lmfQp7L2lmfQo8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfTwvcD4KPHA+eyRwcm9tcHRfY29kZX0mbmJzcDt7JGlucHV0X2NvZGV9PC9wPgo8cD57JHByb21wdF9wYXNzd29yZH0mbmJzcDt7JGlucHV0X3Bhc3N3b3JkfTwvcD4KPHA+eyRwcm9tcHRfcmVwZWF0cGFzc3dvcmR9Jm5ic3A7eyRpbnB1dF9yZXBlYXRwYXNzd29yZH08L3A+CjxwPnskaGlkZGVufXskc3VibWl0fTwvcD4KeyRlbmRmb3JtfQo8IS0tIGZvcmdvdCBwYXNzd29yZCB2ZXJpZmljYXRpb24gdGVtcGxhdGUgLS0+Cic7CgogIHZhciAkZGZsdF9sb2dpbmZvcm10ZW1wbGF0ZSA9ICcKPCEtLSBMb2dpbiBmb3JtIHRlbXBsYXRlIC0tPgogPGZvbnQgc2l6ZT0iLTIiPgogeyRzdGFydGZvcm19CiB7aWYgJGVycm9yfQogIHskZXJyb3J9PGJyPgogey9pZn0KICA8cD57JHByb21wdF91c2VybmFtZX0mbmJzcDt7JGlucHV0X3VzZXJuYW1lfSZuYnNwO3skcHJvbXB0X3Bhc3N3b3JkfSZuYnNwOwogIHskaW5wdXRfcGFzc3dvcmR9Jm5ic3A7eyRpbnB1dF9zdWJtaXR9PGJyLz4KICB7JGxpbmtfZm9yZ290fQogeyRlbmRmb3JtfQogIDwvZm9udD4KPCEtLSBMb2dpbiBmb3JtIHRlbXBsYXRlIC0tPgogJzsKCiAgdmFyICRkZmx0X2xvZ291dGZvcm10ZW1wbGF0ZSA9ICcKPCEtLSBMb2dvdXQgZm9ybSB0ZW1wbGF0ZSAtLT4KIHskc3RhcnRmb3JtfQogIDxwPnskcHJvbXB0X2xvZ2dlZGlufSZuYnNwO3skdXNlcm5hbWV9PC9wPiAKICA8cD57JGxpbmtfbG9nb3V0fTwvcD4KICA8cD57JGxpbmtfY2hhbmdlc2V0dGluZ3N9PC9wPgogeyRlbmRmb3JtfQo8IS0tIExvZ291dCBmb3JtIHRlbXBsYXRlIC0tPgogJzsKCiAgdmFyICRkZmx0X2NoYW5nZXNldHRpbmdzdGVtcGxhdGUgPSAnCjwhLS0gY2hhbmdlIHNldHRpbmdzIHRlbXBsYXRlIC0tPgp7JHRpdGxlfQp7aWYgJG1lc3NhZ2UgIT0gXCdcJ30KICB7aWYgJGVycm9yICE9IFwnXCd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiB7aWYgJGNvbnRyb2xjb3VudCA+IDB9CiAgPGNlbnRlcj4KICA8dGFibGUgd2lkdGg9Ijc1JSI+CiAgICAge2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgICA8dGQ+eyRjb250cm9sLT5oaWRkZW59PGZvbnQgY29sb3I9InskY29udHJvbC0+Y29sb3J9Ij57JGNvbnRyb2wtPnByb21wdH17JGNvbnRyb2wtPm1hcmtlcn08L2ZvbnQ+PC90ZD4KICAgICA8dGQ+eyRjb250cm9sLT5jb250cm9sfXskY29udHJvbC0+YWRkdGV4dH08L3RkPgogey9mb3JlYWNofQogIDwvdGFibGU+CiAgPC9jZW50ZXI+CiB7L2lmfQogeyRoaWRkZW59eyRoaWRkZW4yfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19CjwhLS0gY2hhbmdlIHNldHRpbmdzIHRlbXBsYXRlIC0tPgogJzsKICAvL0hvdyBtYW55IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgYSB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgbG9nZ2VkIG91dC4KICB2YXIgJGV4cGlyeXRpbWU7CgogIC8vU2V0IHRoaXMgdG8gdHJ1ZSBpZiB1c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIGRlZmF1bHQgcGFnZSBhZnRlciAKICAvLyBsb2dnaW5nIGluL291dC4KICB2YXIgJGxvZ2ludGFyZ2V0OwogIHZhciAkb3RoZXJpbnRhcmdldDsKICB2YXIgJGxvZ291dHRhcmdldDsKICB2YXIgJG90aGVyb3V0dGFyZ2V0OyAgCiAgdmFyICRhbGxvd3VzZXJhZG1pbjsKICB2YXIgJGVuYWJsZWVtYWlscHc7CiAgdmFyICRsYW5nPSIiOwogIHZhciAkdXNlcm1hbmlwID0gZmFsc2U7CiAgdmFyICR0eXBlcyA9IGZhbHNlOwoKICAvLyBjb25zdHJ1Y3RvcgogIGZ1bmN0aW9uIEZyb250RW5kVXNlcnMoKQogIHsKICAgIHBhcmVudDo6Q01TTW9kdWxlKCk7CiAgICAkdGhpcy0+dXNlcm1hbmlwID0gbmV3IEZyb250RW5kVXNlcnNNYW5pcHVsYXRvciggJHRoaXMgKTsKICAgICR0aGlzLT50eXBlcyA9IGFycmF5KCAndGV4dCcgPT4gMCwKCQkJICAnY2hlY2tib3gnID0+IDEsCgkJCSAgJ2VtYWlsJyA9PiAyLAoJCQkgICd0ZXh0YXJlYScgPT4gMywKCQkJICAnZHJvcGRvd24nID0+IDQgKTsKICB9CgogIGZ1bmN0aW9uIEdlbmVyYXRlUmFuZG9tUHJpbnRhYmxlU3RyaW5nKCAkbGVuID0gMTAgKQogIHsKICAgICRvMSA9IG5ldyBSYW5kb20oIjIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RVVldYWVoiKTsKICAgIHJldHVybiAkbzEtPmdldCgkbGVuKTsKICB9CgogIGZ1bmN0aW9uIEdldE5hbWUoKSAJewogICAgcmV0dXJuICdGcm9udEVuZFVzZXJzJzsKICB9CiAgCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gIjAuMTItYmV0YTIiOwogIH0KICAKICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkJewogICAgcmV0dXJuICcxLjAuMSc7CiAgfQoKICBmdW5jdGlvbiBsYW5naWZ5S2V5cyggJGFyciApCiAgewogICAgJG91dCA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkYXJyIGFzICRrPT4kdiApCiAgICB7CiAgICAgICRrID0gJHRoaXMtPkxhbmcoJGspOwogICAgICAkb3V0WyAkayBdID0gJHY7CiAgICB9CiAgICByZXR1cm4gJG91dDsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRGcmllbmRseU5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIENvbnRlbnRQcmVSZW5kZXIoJiRjb250ZW50KQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZmV1c2Vyc19sb2dnZWRpbicsKCR0aGlzLT5Mb2dnZWRJbklkKCkgPiAwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZldXNlcnNfbG9nZ2lubmFtZScsJHRoaXMtPkxvZ2dlZEluTmFtZSgpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRGcmllbmRseU5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEhhc0FkbWluICgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBUZW1wbGF0ZXMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgR3JvdXBzJykgfHwKICAgICAgICAgICAgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IEdyb3VwcycpIHx8CiAgICAgICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1JlbW92ZSBHcm91cHMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdBZGQgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdSZW1vdmUgVXNlcnMnKSB8fAogICAgICAgICAgICAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgRnJvbnRFbmRVc2VyUHJvcHMnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uICgpCiAgewogICAgcmV0dXJuICd1c2Vyc2dyb3Vwcyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RGVwZW5kZW5jaWVzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSggJ0NNU01haWxlcicgPT4gJzEuNzMuMycgKTsKICB9CiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QWRtaW5EZXNjcmlwdGlvbigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbiAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZyAoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQoKCiAgZnVuY3Rpb24gSW5zdGFsbCgpIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwogICAgCiAgICAkdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwogICAgCiAgICAvL1VzZXIgbGlzdAogICAgJGZsZHMgPSAiCiAgICAgICAgICAgICBpZCBJIEtFWSwKCSAgICAgdXNlcm5hbWUgQyg4MCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBwYXNzd29yZCBDKDMyKSBOT1QgTlVMTCwKICAgICAgICAgICAgIGNyZWF0ZWRhdGUgVCwKICAgICAgICAgICAgIGV4cGlyZXMgVAogICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMiLCAKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiICk7CiAgICAKICAgIC8vR3JvdXAgbGlzdAogICAgJGZsZHMgPSAiCgkgICAgIGlkIEkgS0VZLAoJICAgICBncm91cG5hbWUgQygzMiksCgkgICAgIGdyb3VwZGVzYyBDKDEyOCkKCSAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHNfc2VxIiApOwoKICAgIC8vIGxvZ2dlZGluCiAgICAkZmxkcyA9ICIKCSAgICAgc2Vzc2lvbmlkIEMoMzIpLAoJICAgICBsYXN0dXNlZCBJLAoJICAgICB1c2VyaWQgSQoJICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19sb2dnZWRpbiIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKICAgIAogICAgLy9Db25uZWN0aW9ucyBiZXR3ZWVuIHVzZXJzIGFuZCBncm91cHMKICAgICRmbGRzID0gIgoJICAgICB1c2VyaWQgSSwKCSAgICAgZ3JvdXBpZCBJCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2JlbG9uZ3MiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CgogICAgLy9wcm9wZXJ0eSBkZWZpbml0aW9uCiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgIG5hbWUgICAgICBDKDQwKSBLRVksCiAgICAgICAgICAgICBwcm9tcHQgICAgQyg4MCkgTk9UIE5VTEwsCiAgICAgICAgICAgICB0eXBlICAgICAgQygyMCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBsZW5ndGggICAgSSwKICAgICAgICAgICAgIG1heGxlbmd0aCBJCiAgICAgICAgICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTcWwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvL2Ryb3Bkb3duIHNlbGVjdCBvcHRpb25zCiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgIG9yZGVyX2lkCQlJLAogICAgICAgICAgICAgb3B0aW9uX25hbWUJQyg0MCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBvcHRpb25fdGV4dAlDKDgwKSBOT1QgTlVMTCwKICAgICAgICAgICAgIGNvbnRyb2xfbmFtZQlDKDQwKSBOT1QgTlVMTDsKICAgICAgICAgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNxbChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2Ryb3Bkb3ducyIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvLyBncm91cCBwcm9wZXJ0eSBtYXAKICAgICRmbGRzID0gIgogICAgICAgICAgICAgIG5hbWUgICAgQyg0MCkgS0VZLAogICAgICAgICAgICAgIGdyb3VwX2lkIEkgS0VZLAogICAgICAgICAgICAgIHNvcnRfa2V5IEksIAogICAgICAgICAgICAgIHJlcXVpcmVkIEkgTk9UIE5VTEwKICAgICAgICAgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNxbChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcHJvcG1hcCIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5ICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAvL3VzZXIgcHJvcGVydGllcwogICAgJGZsZHMgPSAiCgkgICAgIGlkIEkgS0VZLAoJICAgICB1c2VyaWQgSSwKCSAgICAgdGl0bGUgQygxMDApLAoJICAgICBkYXRhIEMoMjU1KQoJICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzX3NlcSIgKTsKCiAgICAvLyBmb3Jnb3R0ZW4gcGFzc3dvcmQgc3R1ZmYKICAgICRmbGRzID0gIgoJICAgICB1c2VyaWQgSSBLRVksCiAgICAgICAgICAgICBjb2RlIEMoMjUpLAogICAgICAgICAgICAgY3JlYXRlZCBUCgkgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwoKICAgIC8vIHRlbXBsYXRlcwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScsICR0aGlzLT5kZmx0X2xvZ2luZm9ybXRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJywgJHRoaXMtPmRmbHRfbG9nb3V0Zm9ybXRlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nLCAkdGhpcy0+ZGZsdF9jaGFuZ2VzZXR0aW5nc3RlbXBsYXRlKTsgCiAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZW1haWxmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTIpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkdmVyaWZ5Zm9ybScsICR0aGlzLT5kZmx0X2ZvcmdvdHBhc3N3b3JkdGVtcGxhdGUzKTsKCiAgICAvLyBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21pbl9wYXNzd29yZGxlbmd0aCcsIDYpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcsIDIwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtaW5fdXNlcm5hbWVsZW5ndGgnLCA0KTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnLCAyMCk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlcl9zZXNzaW9uX2V4cGlyZXMnLCAxODAwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2dyb3VwJywgLTEpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnLCAwKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCAnKicpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywgJ2JsdWUnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlX29uZWdyb3VwJywgMSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicsICchJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywgJ2dyZWVuJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2ZvcmdvdHBhc3N3ZCcsICcnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnLCAnJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJywnJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ291dCcsJycpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FsbG93X2R1cGxpY2F0ZV9lbWFpbHMnLDEpOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGlibGl0eQoKICAgIC8vIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IEZyb250RW5kVXNlclByb3BzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMnKTsKICB9CgogIAogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCXsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdGluc3RhbGxtZXNzYWdlJyk7CiAgfQoKCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pIAogIHsKICAgIHN3aXRjaCggJG9sZHZlcnNpb24gKQogICAgICB7CiAgICAgICAgY2FzZSAnMC4xLjAnOgogICAgICAgIGNhc2UgJzAuMS4xJzoKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gcGVybWlzc2lvbnMKICAgICAgICAgICAgJHRoaXMtPkNyZWF0ZVBlcm1pc3Npb24oJ01vZGlmeSBGcm9udEVuZFVzZXJQcm9wcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZGlmeSBGcm9udEVuZFVzZXIgUHJvcGVydGllcycpOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRmb3JtJywgJHRoaXMtPmRmbHRfZm9yZ290cGFzc3dvcmR0ZW1wbGF0ZTEpOwogICAgICAgICAgICAkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMik7CiAgICAgICAgICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMyk7CgogICAgICAgICAgICAvLyBmb3Jnb3R0ZW4gcGFzc3dvcmQgc3R1ZmYKICAgICAgICAgICAgJGZsZHMgPSAiCgkgICAgICAgICAgICAgdXNlcmlkIEkgS0VZLAogICAgICAgICAgICAgICAgICAgICBjb2RlIEMoMjUpLAogICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIFQKCSAgICAgICAgICAgICI7CiAgICAgICAgICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgICAgICAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CiAgICAgICAgICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIiwKCQkJCSAgICAgICAgICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgICAgICAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKICAgICAgICAgICAgLy8gbm90aWNlIG5vIGJyZWFrCiAgICAgICAgICB9CgogICAgICAgIGNhc2UgJzAuMS4yJzoKICAgICAgICAgIHsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9mb3Jnb3RwYXNzd2QnLCAnJyk7CiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnLCAnJyk7CiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9naW4nLCcnKTsKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnLCcnKTsKICAgICAgICAgICAgLy8gbm90aWNlIG5vIGJyZWFrCiAgICAgICAgICB9CgljYXNlICcwLjEuMyc6CgljYXNlICcwLjEuNCc6CgljYXNlICcwLjEuNSc6CgljYXNlICcwLjEuNic6CgkgIHsKCQkvL2Ryb3Bkb3duIHNlbGVjdCBvcHRpb25zCgkJJGRiID0gJHRoaXMtPkdldERiKCk7CgkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJCSR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CgkJJGZsZHMgPSAiCgkJCQkgb3JkZXJfaWQJCUksCgkJCQkgb3B0aW9uX25hbWUJQyg0MCkgTk9UIE5VTEwsCgkJCQkgb3B0aW9uX3RleHQJQyg4MCkgTk9UIE5VTEwsCgkJCQkgY29udHJvbF9uYW1lCUMoNDApIE5PVCBOVUxMOwoJCQkJIjsKCQkkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTcWwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19kcm9wZG93bnMiLAoJCQkJCQkgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKCQkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKCiAgICAgICAgICAgICAgICAvLyBhbmQgY2xlYW51cCBwcm9wZXJ0eSBuYW1lcwogICAgICAgICAgICAgICAgJHEgPSAndXBkYXRlICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiBzZXQgbmFtZSA9IGxjYXNlKHJlcGxhY2UobmFtZSwiICIsIl8iKSknOwogICAgICAgICAgICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSApOwoJICB9IC8vY2FzZQoJY2FzZSAnMC4xLjcnOgogICAgICAgICAgewoJCSRkYiA9ICR0aGlzLT5HZXREYigpOwoJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKICAgICAgICAgICAgICAgICRzcWxhcnJheSA9ICRkaWN0LT5BZGRjb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhsZW5ndGggSSIpOwoJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgICAgICAgfSAvLyBjYXNlCiAgICAgICAgY2FzZSAnMS4wLjAnOgogICAgICAgICAgewogICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FsbG93X2R1cGxpY2F0ZV9lbWFpbHMnLDEpOwogICAgICAgICAgfQogICAgICAgfSAvLyBzd2l0Y2gKCiAgfSAvLyB1cGdyYWRlCgogIAogIGZ1bmN0aW9uIFVuaW5zdGFsbCgpIAogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3VzZXJzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHMiICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2xvZ2dlZGluIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19iZWxvbmdzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZXJ0aWVzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19wcm9wZGVmbiIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZHJvcGRvd25zIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHByb3BtYXAiICk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX3RlbXBjb2RlIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgCiAgICAkZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiICk7CiAgICAkZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHNfc2VxIiApOwogICAgJGRiLT5Ecm9wU2VxdWVuY2UoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfcHJvcGVydGllc19zZXEiICk7CgogICAgLy8gdGVtcGxhdGVzCiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfbG9naW5mb3JtJyk7IAogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2xvZ291dGZvcm0nKTsgCiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfY2hhbmdlc2V0dGluZ3Nmb3JtJyk7IAogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScpOwogICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZW1haWxmb3JtJyk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmR2ZXJpZnlmb3JtJyk7CgogICAgLy8gcHJlZmVyZW5jZXMKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdtaW5fcGFzc3dvcmRsZW5ndGgnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdtaW5fdXNlcm5hbWVsZW5ndGgnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCd1c2VyX3Nlc3Npb25fZXhwaXJlcycpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2RlZmF1bHRfZ3JvdXAnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdkb19zbXRwX3ZhbGlkYXRlX2VtYWlsJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdyZXF1aXJlX29uZWdyb3VwJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX21hcmtlcicpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9jb2xvcicpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3BhZ2VpZF9mb3Jnb3RwYXNzd2QnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdwYWdlaWRfY2hhbmdlc2V0dGluZ3MnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdwYWdlaWRfbG9naW4nKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdwYWdlaWRfbG9nb3V0Jyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnY3VycmVudF9ncm91cCcpOwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2N1cnJlbnRfcmVnZXgnKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdjdXJyZW50X2xpbWl0Jyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnY3VycmVudF9zb3J0Jyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnY3VycmVudF9wcm9wc2VsJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnY3VycmVudF9wcm9wdmFsJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnYWN0aXZlX3RhYicpOwoKICAgIC8vIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignTW9kaWZ5IEZyb250RW5kVXNlclByb3BzJyk7CiAgfQoKICAKICBmdW5jdGlvbiBfR2V0VXNlcnNJbkNTVkZvcm1hdCgpCiAgewogICAgIC8vIHRoaXMgY291bGQgYmUgYW4gZXhwZW5zaXZlIGZ1bmN0aW9uIHRvIGNhbGwKICAgICAkYWxsdXNlcnMgPSAkdGhpcy0+R2V0VXNlcnNJbkdyb3VwKCk7CiAgICAgaWYoICEkYWxsdXNlcnMgKQogICAgIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CgogICAgICRvdXRwdXQgPSAnJzsKCiAgICAgLy8gZ2V0IGEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb3BlcnR5IGRlZmluaXRpb25zCiAgICAgJGRlZm5zID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbnMoKTsKCiAgICAgLy8gbm93IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHVzZXJzCiAgICAgZm9yZWFjaCggJGFsbHVzZXJzIGFzICRvbmV1c2VyICkKICAgICB7CiAgICAgICAgJG91dHB1dCAuPSAkb25ldXNlclsnaWQnXS4iLCIuJG9uZXVzZXJbJ3VzZXJuYW1lJ10uIiwiLiRvbmV1c2VyWydjcmVhdGVkYXRlJ10uCiAgICAgICAgICAgICAgICAgICAkb25ldXNlclsnZXhwaXJlcyddLiIsIjsKCiAgICAgICAgLy8gZ2V0IHRoZSB1c2VyIHByb3BlcnRpZXMKICAgICAgICAkdXNlcnByb3BzID0gJHRoaXMtPkdldFVzZXJQcm9wZXJ0aWVzKCAkb25ldXNlclsnaWQnXSApOwoKICAgICAgICAvLyBhcyB3ZSB3YW50IGVhY2ggcmVjb3JkIGluIHRoZSBjc3YgZmlsZSB0byBiZSBleGFjdGx5IHRoZSBzYW1lCiAgICAgICAgLy8gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucywgYW5kIHNlZSBpZiB3ZSBoYXZlCiAgICAgICAgLy8gdGhhdCBwcm9wZXJ0eSBmb3IgdGhpcyB1c2VyLCBpZiBub3QsIHdlIGVjaG8gYW4gZW1wdHkgZmllbGQuCiAgICAgICAgZm9yZWFjaCggJGRlZm5zIGFzICRkZWZuICkKICAgICAgICB7CiAgICAgICAgICAgLy8gc2VlIGlmIHRoZSB1c2VyIGhhcyB0aGlzIHByb3BlcnR5CiAgICAgICAgICAgJGZsZCA9ICcnOwogICAgICAgICAgIGZvcmVhY2goICR1c2VycHJvcHMgYXMgJHByb3AgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmKCAkcHJvcFsndGl0bGUnXSA9PSAkZGVmblsnbmFtZSddICkKICAgICAgICAgICAgICAgeyAgCiAgICAgICAgICAgICAgICAgLy8gZ290IGEgbWF0Y2gKICAgICAgICAgICAgICAgICAkZmxkID0gJHByb3BbJ2RhdGEnXTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICAkb3V0cHV0IC49ICRmbGQuIiwiOwogICAgICAgIH0KCiAgICAgICAgLy8gZW5kIG9mIG9uZSByZWNvcmQKICAgICAgICAkb3V0cHV0IC49ICJlbmRcbiI7CiAgICAgfQoKICAgICByZXR1cm4gJG91dHB1dDsKICB9CgogIGZ1bmN0aW9uIF9HZXRVc2VyTG9naW5Gb3JtKCRpZCwmJHBhcmFtcywkcmV0dXJuaWQpIAogIHsKICAgICR1c2VybmFtZSA9IChpc3NldCgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKT8kcGFyYW1zWydpbnB1dF91c2VybmFtZSddOicnKTsKICAgICRwYXNzd29yZCA9IChpc3NldCgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKT8kcGFyYW1zWydpbnB1dF9wYXNzd29yZCddOicnKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCAkcGFyYW1zWydlcnJvciddKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgCgkJCSAgJHRoaXMtPmZlQ3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19sb2dpbicsICRyZXR1cm5pZCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VzZXJuYW1lJywgJHRoaXMtPkxhbmcoJ3Byb21wdF91c2VybmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXNlcm5hbWUnLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF91c2VybmFtZScsIAoJCQkJCQkgICRpbnB1dF91c2VybmFtZSwgMjAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcGFzc3dvcmQnLCAkdGhpcy0+TGFuZygncHJvbXB0X3Bhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAKCQkJCQkJICAgICAkaW5wdXRfcGFzc3dvcmQsIDIwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9zdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdidG5fbG9naW4nLCAKCQkJCQkJICAgJHRoaXMtPkxhbmcoJ2xvZ2luJykpKTsKICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZGZvcmdvdHBhc3N3ZCcpOwogICAgaWYoICRwYWdlICkKICAgIHsKICAgICAgJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhZ2UgKTsKICAgICAgaWYoICRpZCA9PSBmYWxzZSApCiAgICAgIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfZm9yZ290JywnPCEtLSBFcnJvciBjb3VsZCBub3QgZGV0ZXJtaW5lIHBhZ2UgZnJvbSBhbGlhcy9pZCAtLT4nKTsKICAgICAgfQogICAgICBlbHNlIAogICAgICB7CiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rX2ZvcmdvdCcsCgkJCSAgICAkdGhpcy0+Q3JlYXRlQ29udGVudExpbmsoJGlkLCR0aGlzLT5MYW5nKCdmb3Jnb3RwdycpKSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19mb3Jnb3QnLAoJCQkgICAgJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdmb3Jnb3RwdycsICRyZXR1cm5pZCwKCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2ZvcmdvdHB3JykpKTsKICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19sb2dpbmZvcm0nKTsKICB9CgoJCiAgZnVuY3Rpb24gX0dldFVzZXJMb2dvdXRGb3JtKCRpZCwmJHBhcmFtcywkcmV0dXJuaWQpIAogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2xvZ2dlZGluJywKCQkJICAkdGhpcy0+TGFuZygnbXNnX2N1cnJlbnRseWxvZ2dlZGluYXMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZXJuYW1lJywgJHRoaXMtPkxvZ2dlZEluTmFtZSgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19sb2dvdXQnLAoJCQkgICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwibG9nb3V0IiwkcmV0dXJuaWQsCgkJCQkJICAgICR0aGlzLT5MYW5nKCdsb2dvdXQnKSkpOwogICAgJHBhZ2UgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncGFnZWlkX2NoYW5nZXNldHRpbmdzJyk7CiAgICBpZiggJHBhZ2UgKQogICAgewogICAgICAkaWQgPSBDb250ZW50TWFuYWdlcjo6R2V0UGFnZUlERnJvbUFsaWFzKCAkcGFnZSApOwogICAgICBpZiggJGlkID09IGZhbHNlICkKICAgICAgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19jaGFuZ2VzZXR0aW5ncycsJzwhLS0gRXJyb3IgY291bGQgbm90IGRldGVybWluZSBwYWdlIGZyb20gYWxpYXMvaWQgLS0+Jyk7CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbGlua19jaGFuZ2VzZXR0aW5ncycsCiAgICAgICAgICAgJHRoaXMtPkNyZWF0ZUNvbnRlbnRMaW5rKCAkaWQsICR0aGlzLT5MYW5nKCdwcm9tcHRfY2hhbmdlc2V0dGluZ3MnKSkpOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2xpbmtfY2hhbmdlc2V0dGluZ3MnLAoJCQkgICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwiY2hhbmdlc2V0dGluZ3MiLCRyZXR1cm5pZCwKCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF9jaGFuZ2VzZXR0aW5ncycpKSk7CiAgICB9CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ2ZldXNlcnNfbG9nb3V0Zm9ybScpOwogIH0KCgogIGZ1bmN0aW9uIF9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICRwZXJtID0gJycgKQogIHsKICAgICRwMSA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdBZGQgVXNlcnMnICk7CiAgICAkcDIgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IFVzZXJzJyApOwogICAgJHAzID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ1JlbW92ZSBVc2VycycgKTsKICAgICRwNCA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdBZGQgR3JvdXBzJyApOwogICAgJHA1ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ01vZGlmeSBHcm91cHMnICk7CiAgICAkcDYgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IEdyb3VwIEFzc2lnbm1lbnRzJyApOwogICAgJHA3ID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbiggJ1JlbW92ZSBHcm91cHMnICk7CiAgICAkcDggPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnICk7CiAgICAkcDkgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCAnTW9kaWZ5IEZyb250RW5kVXNlclByb3BzJyApOwogICAgJHAxMCA9ICR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdNb2RpZnkgVGVtcGxhdGVzJyApOwoKICAgICRyZXQgPSAwOwogICAgc3dpdGNoKCAkcGVybSApCiAgICAgIHsKICAgICAgY2FzZSAnJzogIC8vIGFueSBwZXJtaXNzaW9uCgkkcmV0ID0gKCRwMSB8fCAkcDIgfHwgJHAzIHx8ICRwNCB8fCAkcDUgfHwgJHA2IHx8ICRwNyB8fCAkcDggfHwgJHA5IHx8ICRwMTAgKTsKCWJyZWFrOwoKICAgICAgY2FzZSAnYWRkZ3JvdXAnOgoJJHJldCA9ICgkcDQpOwoJYnJlYWs7CgogICAgICBjYXNlICdhZGR1c2VyJzoKCSRyZXQgPSAoJHAxKTsKCWJyZWFrOwoKICAgICAgY2FzZSAnYWRkcHJvcCc6CiAgICAgIGNhc2UgJ2FkZHByb3AyJzoKICAgICAgY2FzZSAnZWRpdHByb3AnOgogICAgICBjYXNlICdkZWxldGVwcm9wJzoKICAgICAgY2FzZSAncHJvcGVydGllcyc7CiAgICAgICAgJHJldCA9ICgkcDkpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnbGlzdHVzZXJzJzoKCSRyZXQgPSAoJHAyIHx8ICRwMyk7CglicmVhazsKCiAgICAgIGNhc2UgJ2xpc3Rncm91cHMnOgoJJHJldCA9ICgkcDUgfHwgJHA2KTsKCWJyZWFrOwoKICAgICAgY2FzZSAnZWRpdGdyb3Vwcyc6CgkkcmV0ID0gKCRwNSB8fCAkcDYpOwoJYnJlYWs7CgogICAgICBjYXNlICdlZGl0dXNlcnMnOgoJJHJldCA9ICgkcDIpOwoJYnJlYWs7CiAKICAgICAgY2FzZSAncmVtb3ZlZ3JvdXBzJzoKCSRyZXQgPSAoJHA3KTsKCWJyZWFrOwoKICAgICAgY2FzZSAncmVtb3ZldXNlcnMnOgoJJHJldCA9ICgkcDMpOwoJYnJlYWs7CgogICAgICBjYXNlICdlZGl0cHJlZnMnOgogICAgICBjYXNlICdzaXRlcHJlZnMnOgoJJHJldCA9ICgkcDgpOwoJYnJlYWs7CgogICAgICBjYXNlICd1c2Vyc25ncm91cHMnOgogICAgICAgICRyZXQgPSAoJHAxIHx8ICRwMiB8fCAkcDMgfHwgJHA0IHx8ICRwNSB8fCAkcDYgfHwgJHA3KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6CiAgICAgICAgJHJldCA9ICgkcDEwKTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CgkkcmV0ID0gMDsKCWJyZWFrOwogICAgICB9CgogICAgcmV0dXJuICRyZXQ7CiAgfQoKCiAgZnVuY3Rpb24gR2V0UGFnZUlkKCRhbGlhcykgewkJCiAgICBpZiAoJGFsaWFzPT0iIikgcmV0dXJuIGZhbHNlOwogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcXVlcnkgPSAiU0VMRUNUIGNvbnRlbnRfaWQgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iY29udGVudCBXSEVSRSBjb250ZW50X2FsaWFzID0gJyIuJGFsaWFzLiInIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPiAwKQl7CiAgICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIHJldHVybiAkcm93Wydjb250ZW50X2lkJ107CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKCQogIGZ1bmN0aW9uIFJlZGlyZWN0VG9UYXJnZXQoJHJldHVybmlkLCRpbm91dD0iaW4iKSB7CQkKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgaWYgKCRpbm91dD09ImluIikgewogICAgICBzd2l0Y2ggKCR0aGlzLT5sb2dpbnRhcmdldCkgewogICAgICBjYXNlICJmcm9udCIgOiB7CgkkcXVlcnkgPSAiU0VMRUNUIGNvbnRlbnRfaWQgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4iY29udGVudCBXSEVSRSBkZWZhdWx0X2NvbnRlbnQgPSAxIjsKCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPlJvd0NvdW50KCkgPiAwKQl7CgkgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CgkgICRyZXN1bHQgPSAkcm93Wydjb250ZW50X2lkJ107CgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJlc3VsdCk7CQkJCQkJCgkgIGJyZWFrOwoJfQoJLy9mYWxsdGhyb3VnaCBpbnRlbnRpb25hbAogICAgICB9CiAgICAgIGNhc2UgInJldHVybmlkIiA6ICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTticmVhazsKICAgICAgY2FzZSAib3RoZXIiIDogewoJaWYgKCRpZD0kdGhpcy0+R2V0UGFnZUlkKCR0aGlzLT5vdGhlcmludGFyZ2V0KSkgewkJCQkJCQoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRpZCk7IAoJICBicmVhazsKCX0gZWxzZSB7CgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoICgkdGhpcy0+bG9nb3V0dGFyZ2V0KSB7CiAgICAgIGNhc2UgImZyb250IiA6IHsKCSRxdWVyeSA9ICJTRUxFQ1QgY29udGVudF9pZCBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJjb250ZW50IFdIRVJFIGRlZmF1bHRfY29udGVudCA9IDEiOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7CglpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSA+IDApCXsKCSAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCSAgJHJlc3VsdCA9ICRyb3dbJ2NvbnRlbnRfaWQnXTsKCSAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmVzdWx0KTsJCQkJCQkKCSAgYnJlYWs7Cgl9CgkvL2ZhbGx0aHJvdWdoIGludGVudGlvbmFsCiAgICAgIH0KICAgICAgY2FzZSAicmV0dXJuaWQiIDogJHRoaXMtPlJlZGlyZWN0Q29udGVudCgkcmV0dXJuaWQpO2JyZWFrOwogICAgICBjYXNlICJvdGhlciIgOiB7CglpZiAoJGlkPSR0aGlzLT5HZXRQYWdlSWQoJHRoaXMtPm90aGVyb3V0dGFyZ2V0KSkgewkJCQkJCQoJICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCRpZCk7IAoJICBicmVhazsKCX0gZWxzZSB7CgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoJHJldHVybmlkKTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICAgICAgfQogICAgfQkJCiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIG1ldGhvZCB0byBkaXNwbGF5CiAgIGVycm9yIGluZm9ybWF0aW9uIG9uIHRoZSBhZG1pbiBzaWRlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2U9JycpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwogICAgICB9CiAgICAgIAogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2Vycm9yLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZEdyb3VwKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICAgIH0KCiAgICAkZ3JvdXBuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwbmFtZSddICkgKQogICAgICB7CgkkZ3JvdXBuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSk7CiAgICAgIH0KICAgICRncm91cGRlc2MgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZ3JvdXBkZXNjJ10gKSApCiAgICAgIHsKCSRncm91cGRlc2MgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICBpZiggJGdyb3VwbmFtZSA9PSAnJyB8fCAkZ3JvdXBkZXNjID09ICcnICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkZ3JvdXAnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgZ3JvdXAgbmFtZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKICAgIGlmKCAkdGhpcy0+R2V0R3JvdXBJRCggJGdyb3VwbmFtZSApICE9IGZhbHNlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ncm91cGV4aXN0cycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHJldHVybmlkLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmVsbmFkZGVkID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgJHByb3BuYW1lID0gJyc7CiAgICAgICRzb3J0b3JkZXIgPSAnJzsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXmlucHV0X3JlcXVpcmVkXy8nLCAka2V5ICkgJiYgKCR2YWwgIT0gMCkgKQoJewoJICAkcmVsbmFkZGVkKys7Cgl9CiAgICB9CiAgICBpZiggJHJlbG5hZGRlZCA9PSAwICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3JlbGF0aW9ucycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHJldHVybmlkLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB3ZSdyZSBjbGVhciB0byBhZGQKICAgICRyZXQgPSAkdGhpcy0+QWRkR3JvdXAoICRncm91cG5hbWUsICRncm91cGRlc2MgKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXRbMV07CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkZ3JvdXAnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFsc28gYWRkIHRoZSBwcm9wZXJ0eSBjaG9pY2VzCiAgICAkdGhpcy0+RGVsZXRlQWxsR3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJHJldFsxXSApOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICAkcHJvcG5hbWUgPSAnJzsKICAgICAgJHNvcnRvcmRlciA9ICcnOwogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaW5wdXRfcmVxdWlyZWRfLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0cigka2V5LHN0cmxlbignaW5wdXRfcmVxdWlyZWRfJykpOwoJfQogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3NvcnRvcmRlcl8nLiRwcm9wbmFtZV0gKSApCgl7CgkgICRzb3J0b3JkZXIgPSAkcGFyYW1zWydpbnB1dF9zb3J0b3JkZXJfJy4kcHJvcG5hbWVdOwoJfQoKICAgICAgaWYoICR2YWwgIT0gMCAmJiAkcHJvcG5hbWUgIT0gJycpCgl7CgkgICR0aGlzLT5BZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRyZXRbMV0sICRwcm9wbmFtZSwgJHNvcnRvcmRlciwgJHZhbCApOwoJfQogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJywgJHBhcmFtcyApOyAKICB9CgoKICBmdW5jdGlvbiBfRG9BZGRQcm9wKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgICB7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgICAgIH0KICAgIAogICAgJG5hbWUgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9uYW1lJ10gKSApIHsKICAgICAgJG5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X25hbWUnXSk7CiAgICAgICRuYW1lID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoJy8gLycsJ18nLCRuYW1lKSk7CiAgICB9CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gKSApIHsKICAgICAgJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOwogICAgfQogICAgJHR5cGUgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF90eXBlJ10pICkgewogICAgICAkdHlwZSA9ICRwYXJhbXNbJ2lucHV0X3R5cGUnXTsKICAgIH0KICAgICRzZWxvcHRpb25zID0gJyc7CiAgICAkb3B0aW9ucyA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X3NlbG9wdGlvbnMnXSApICkgewogICAgICAkc2Vsb3B0aW9ucyA9ICRwYXJhbXNbJ2lucHV0X3NlbG9wdGlvbnMnXTsKICAgICAgJG9wdGlvbnMgPSBleHBsb2RlKCJcbiIsICRzZWxvcHRpb25zKTsKICAgIH0KICAgIAogICAgLy8gbm93IGNoZWNrIGV2ZXJ5dGhpbmcgb3V0CiAgICAvLyB0b2RvLCBhZGQgYSBtYXhpbXVtIGZpZWxkIGxlbmd0aCBwcmVmZXJlbmNlCiAgICBpZiggJG5hbWUgPT0gJycgfHwgJHByb21wdCA9PSAnJyApewogICAgICAkcGFyYW1zWydlcnJvciddID0gMTsKICAgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKICAgICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcmV0dXJuaWQsJHBhcmFtcyk7CiAgICAgIHJldHVybjsKICAgIH0gCgogICAgc3dpdGNoKCR0eXBlKXsKICAgIGNhc2UgMDoKICAgIGNhc2UgMjoKICAgICAgJGxlbmd0aCA9IDIwOwogICAgICAkbWF4bGVuZ3RoID0gMjA7CiAgICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApIHsKCSRsZW5ndGggPSB0cmltKCRwYXJhbXNbJ2lucHV0X2xlbmd0aCddKTsKICAgICAgfQogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X21heGxlbmd0aCddICkgKSB7CgkkbWF4bGVuZ3RoID0gdHJpbSgkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgICRsZW5ndGggPSAxOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgJGxlbmd0aCA9IDI1NTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIGVtcHR5IHZhbHVlcwogICAgICAvLyBhbmQgc3VidHJhY3QgaXQgZnJvbSB0aGUgYXJyYXkgY291bnQKICAgICAgJGVsZW1lbnRfY291bnRfYXJyYXkgPSBhcnJheV9jb3VudF92YWx1ZXMoJG9wdGlvbnMpOwogICAgICAkZW1wdHlfZWxlbWVudF9jb3VudCA9IAoJJGVsZW1lbnRfY291bnRfYXJyYXlbIiJdICsKCSRlbGVtZW50X2NvdW50X2FycmF5WyJcciJdICsKCSRlbGVtZW50X2NvdW50X2FycmF5WyJfXyJdICsKCSRlbGVtZW50X2NvdW50X2FycmF5WyJfX1xyIl07CiAgICAgICRsZW5ndGggPSBjb3VudCgkb3B0aW9ucykgLSAkZW1wdHlfZWxlbWVudF9jb3VudDsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAkbGVuZ3RoID0gMTsKICAgIH0KICAgIAogICAgCiAgICBpZiggKCgkdHlwZSA9PSAwIHx8ICR0eXBlID09IDIpICYmICggJGxlbmd0aCA8IDEgfHwgJGxlbmd0aCA+IDI1NSApKSB8fAoJKCR0eXBlID09IDQgJiYgJHNlbG9wdGlvbnMgPT0gJycgKSApewogICAgICAkcGFyYW1zWydlcnJvciddID0gMTsKICAgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKICAgICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wMicsJHJldHVybmlkLCRwYXJhbXMpOwogICAgICByZXR1cm47CiAgICB9CgogICAgCiAgICAvLyBBZGQgc2VsZWN0IG9wdGlvbnMKICAgIGlmICgkc2Vsb3B0aW9ucykgewogICAgICAkcmVzdWx0ID0gJHRoaXMtPkFkZFNlbGVjdE9wdGlvbnMoICRuYW1lLCAkb3B0aW9ucyApOwogICAgICBpZiggISRyZXN1bHRbMF0gKSB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXN1bHRbMV07CgkkdGhpcy0+bXlSZWRpcmVjdCgkaWQsJ2FkZHByb3AnLCRyZXR1cm5pZCwkcGFyYW1zKTsKICAgICAgfQogICAgfQoKICAgIAogICAgLy8gYW5kIGFkZCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgogICAgJHJlc3VsdCA9ICR0aGlzLT5BZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCApOwogICAgaWYoICEkcmVzdWx0WzBdICkgewogICAgICAkcGFyYW1zWydlcnJvciddID0gMTsKICAgICAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKICAgICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcmV0dXJuaWQsJHBhcmFtcyk7CiAgICB9CiAgICAKICAgICR0aGlzLT5teVJlZGlyZWN0dG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvQWRkVXNlclN0ZXAxKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgIHsKICAgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgJHVzZXJuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKTsKICAgICRwYXNzd29yZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSk7CiAgICAkcmVwZWF0ICAgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwoKICAgICRyZXQgPSAkdGhpcy0+X2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlLCB0cnVlICk7CiAgICBzd2l0Y2goICRyZXQgKQogICAgICB7CiAgICAgIGNhc2UgLTE6IC8vIGVycm9yCgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRtZXNzYWdlOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZHVzZXInLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJcmV0dXJuOwoJYnJlYWs7CiAgICAgIGNhc2UgMDogIC8vIG5vIGVycm9yLCBidXQgZG9uJ3QgY29udGludWUgb3BlcmF0aW9uCgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnYWRkdXNlcicsICRyZXR1cm5pZCwkcGFyYW1zICk7CglyZXR1cm47CglicmVhazsKICAgICAgY2FzZSAxOiAgLy8gYWxsIGlzIGdvb2QsIGNvbnRpbnVlIG9wZXJhdGlvbgoJYnJlYWs7CiAgICAgIH0KCgogICAgLy8gY29udmVydCB0aGUgZXhwaXJlcyBmaWVsZCB0byBhIHJlYWwgdGltZQogICAgJGV4cGlyZXMgPSBOVUxMOwoKICAgIC8vIGFuZCBzdG9yZSB0aGlzIGFsbCBpbiB0aGUgcGFyYW1zLCAKICAgICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gPSAkdXNlcm5hbWU7CiAgICAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddID0gJHBhc3N3b3JkOwogICAgJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSA9ICRyZXBlYXQ7CgogICAgLy8gYW5kIGdvIHRvIHN0ZXAgMgogICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCi8qICAgIAogLy8gYW5kIGFkZCB0aGUgdXNlcgogJHJldCA9ICR0aGlzLT5BZGRVc2VyKCAkdXNlcm5hbWUsICRlbWFpbCwgJHBhc3N3b3JkLCAkZXhwaXJlcyApOwogaWYoICRyZXRbMF0gPT0gZmFsc2UgKQogewogJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHJldFsxXSApOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwkKICAgICAgfQoKICAgICAgJHVpZCA9ICR0aGlzLT5HZXRVc2VySUQoJHVzZXJuYW1lKTsKICAgIGlmKCAkdWlkID09IGZhbHNlICkKICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJykgKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsJCiAgICAgIH0KCiAgICAvLyBhbmQgdGhlbiBhZGQgaGltIHRvIGhpcyBncm91cHMgCiAgICBpZiggYXJyYXlfa2V5X2V4aXN0c19zdWJzdHIoICRwYXJhbXMsICdtZW1iZXJvZl8nKSApCiAgICAgIHsKICAgICAgCgkkZ3JwaWRzID0gc3BsaXQoIiwiLCRwYXJhbXNbJ21lbWJlcm9mJ10pOwoJZm9yZWFjaCggJGdycGlkcyBhcyAkZ2lkICkKCXsKCSAgJHJldCA9ICR0aGlzLT5Bc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApOwoJICBpZiggJHJldCA9PSBmYWxzZSApCgkgICAgewoJICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl9jYW50YXNzaWdudXNlcicpICk7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgICByZXR1cm47CQoJICAgIH0KCX0KICAgICAgfQoKICAgIC8vIGFuZCB0aGVuIGFkZCBoaXMgcHJvcGVydGllcwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWyd1c2VycHJvcHMnXSApICkKICAgICAgewoJJHByb3BzID0gc3BsaXQoIiwiLCRwYXJhbXNbJ3VzZXJwcm9wcyddKTsKCWZvcmVhY2goICRwcm9wcyBhcyAkcHJvcCApCgl7CgkgIGxpc3QoICRrLCAkdiApID0gc3BsaXQoIj0iLCRwcm9wKTsKCSAgJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoJGssJHYsJHVpZCk7Cgl9CiAgICAgIH0KCiAgICAvLyBhbmQgd2UncmUgZG9uZQogICAgJHRoaXMtPm15UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicpOwoqLwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkZFVzZXJTdGVwMiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBkbyB3ZSB3YW50IHRvIGdvIGJhY2sKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYmFjayddICkgKQogICAgICB7CgkvLyB5dXAgd2UgZG8KCSRwYXJhbXMgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOzsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGR1c2VyJywgJHJldHVybmlkLCRwYXJhbXMgKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJLy8geXVwIHdlIGRvCgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICd1c2VycycgKTsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgZmllbGQgaW5mbwogICAgJGZsZGluZm8gPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmhpZGRlbl8vJywgJGsgKSApCgl7CgkgICRmbGRuYW1lID0gc3Vic3RyKCAkaywgc3RybGVuKCdoaWRkZW5fJykpOwoJICAkcHJvcGluZm8gPSBzcGxpdCgnOycsJHYpOwoJICAkZmxkaW5mb1skZmxkbmFtZV0gPSAkcHJvcGluZm87Cgl9CiAgICB9CgogICAgLy8gbm93IGdldCBlYWNoIG9mIHRoZSBmaWVsZHMKICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmlucHV0Xy8nLCAkayApICkKCXsKCSAgJGZsZG5hbWUgPSBzdWJzdHIoICRrLCBzdHJsZW4oJ2lucHV0XycpKTsKCSAgJGZpZWxkc1skZmxkbmFtZV0gPSAkdjsgCgl9CiAgICB9CgogICAgLy8gbm93IHZhbGlkYXRlCiAgICBmb3JlYWNoKCAkZmxkaW5mbyBhcyAkbmFtZSA9PiAkdmFsICkKICAgIHsKICAgICAgLy8gcHJvY2VzcyBlbXB0eSByZXF1aXJlZCBmaWVsZHMKICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBlbXB0eSBvcHRpb25hbCBvbmVzCiAgICAgIGlmKCAkdmFsWzNdID09IDIgJiYgKCFpc3NldCggJGZpZWxkc1skbmFtZV0gKSB8fCAkZmllbGRzWyRuYW1lXSA9PSAnJykgKQoJewoJICAvLyBhIHJlcXVpcmVkIGZpZWxkIGlzIGVtcHR5CgkgICRwYXJhbXMgPSBhcnJheV9tZXJnZSggJHBhcmFtcywgZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKSk7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ19yZXF1aXJlZF9wYXJhbScsJG5hbWUpOwoJICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJICByZXR1cm47Cgl9CgogICAgICAvLyB2YWxpZGF0ZSBmaWxsZWQgaW4gZmllbGRzCiAgICAgIGlmKCBpc3NldCggJGZpZWxkc1skbmFtZV0gKSApCgl7CgkgIHN3aXRjaCggJHZhbFsxXSApCgkgICAgewoJICAgIGNhc2UgMDogLy8gdGV4dAoJICAgICAgLy8gbm90IG11Y2ggd2UgY2FuIGRvIHRvIHZhbGlkYXRlIGEgdGV4dCBmaWVsZC4KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMTogLy8gY2hlY2tib3gKCSAgICAgIC8vIG9yIGEgY2hlY2tib3gKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMjogLy8gZW1haWwKCSAgICAgIC8vIGVtYWlsIGFkZHJlc3NlcyBjYW4gYmUgdmFsaWRhdGVkIHRob3VnaAoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAzOiAvLyB0ZXh0YXJlYQoJICAgICAgLy8gYSB0ZXh0YXJlYSBjYW4gYmUgdmFsaWRhdGVkIGZvciBsZW5ndGguCgkgICAgICBicmVhazsKCSAgICBjYXNlIDQ6IC8vIGRyb3Bkb3duCgkgICAgICAvLyBob3cgY2FuIHdlIHZhbGlkYXRlIGEgZHJvcGRvd24/CgkgICAgICBicmVhazsKCSAgICB9Cgl9CiAgICB9CgogICAgLy8gZ2V0IHRoZSBwYXJtcyBmcm9tIHRoZSBmaXJzdCBzdGVwCiAgICAkcGFybXMxID0gZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKTsKICAgIAogICAgLy8gYW5kIG1lcmdlIGVtIGludG8gJHBhcmFtcyBzbyB3ZSBjYW4gYWN0dWFsbHkgYWRkIHRoZSB1c2VyIGFjY291bnQKICAgICRwYXJhbXMgPSBhcnJheV9tZXJnZSggJHBhcmFtcywgJHBhcm1zMSApOwoKICAgIC8vIG5vdyBmaW5kIG91dCB3aGljaCBncm91cHMgaGUncyBhIG1lbWJlciBvZgogICAgJG1lbWJlcm9mID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15tZW1iZXJvZl8vJywgJGsgKSApCgl7CgkgICRtZW1iZXJvZltdID0gJHBhcmFtc1ska107Cgl9CiAgICB9CgogICAgLy8gbm93IHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIKICAgICRyZXQgPSAkdGhpcy0+QWRkVXNlciggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSwgCgkJICAgICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10sCgkJICAgICRwYXJhbXNbJ2lucHV0X2V4cGlyZXNkYXRlJ10gKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHJldFsxXTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCSAgcmV0dXJuOwogICAgICB9CiAgICAkdWlkID0gJHJldFsxXTsKCiAgICAvLyBhbmQgYWRkIGhpbSB0byBoaXMgZ3JvdXBzCiAgICBmb3JlYWNoKCAkbWVtYmVyb2YgYXMgJG1lbSApCiAgICB7CiAgICAgIGlmKCAhJHRoaXMtPkFzc2lnblVzZXJUb0dyb3VwKCAkcmV0WzFdLCAkbWVtICkgKQoJewoJICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRncm91cGlkJywkbWVtKTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGFuZCBhZGQgaGlzIHByb3BlcnRpZXMKICAgIGZvcmVhY2goICRmaWVsZHMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICAkcmV0ID0gJHRoaXMtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoICRrLCAkdiwgJHVpZCApOwogICAgICBpZiggJHJldCA9PSBmYWxzZSApCgl7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCSAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIyJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgIC8vIGtlZXAgYSBsb2cgb2YgaXQKICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJCSAgJHRoaXMtPkxhbmcoJ3VzZXJfYWRkZWQnLGFycmF5KCR1aWQsJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSkpKTsKCiAgICAvLyBhbmQgdGhhdCBzaG91bGQgYmUgaXQKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3VzZXJzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0FkbWluQWN0aW9ucyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYnV0dG9uX2V4cG9ydCddICkgKQogICAgICB7CgkvLyB3ZSB3YW50IHRvIGV4cG9ydCBhIGNzdiBmaWxlIGRvIHdlCgkkY3N2ID0gJHRoaXMtPl9HZXRVc2Vyc0luQ1NWRm9ybWF0KCk7CglpZiggJGNzdiA9PSAnJyApCgkgIHsKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCRwYXJhbXMsJHJldHVybmlkLAoJCQkJICAgICAkdGhpcy0+TGFuZygnbm9jc3ZyZXN1bHRzJykpOwoJICAgIHJldHVybjsKCSAgfQoJaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7CgloZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQnKTsKCWhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9dHJhcHBlZGluc2VsZnJlZy5jc3YnKTsKCXdoaWxlKEBvYl9lbmRfY2xlYW4oKSk7CgllY2hvICRjc3Y7CglleGl0KCk7CiAgICAgIH0KICB9CgogIGZ1bmN0aW9uIF9Eb0RlbGV0ZUdyb3VwKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snZ3JvdXBfaWQnXSkgfHwgJHBhcmFtc1snZ3JvdXBfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfSAgCgogICAgJHJldCA9ICR0aGlzLT5EZWxldGVHcm91cEZ1bGwoICRwYXJhbXNbJ2dyb3VwX2lkJ10gKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHJldFsxXSApOwoJcmV0dXJuOwogICAgICB9CiAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0RlbGV0ZVByb3BlcnR5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1sncHJvcG5hbWUnXSApICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2VudHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXMpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZGVsZXRlIGFsbCBvY2N1cmFuY2VzIG9mIHRoaXMgcHJvcGVydHkgbmFtZSBpbiB0aGUgcHJvcGVydGllcyB0YWJsZQogICAgJHJlc3VsdCA9ICR0aGlzLT5EZWxldGVVc2VyUHJvcGVydHlCeU5hbWUoICRwYXJhbXNbJ3Byb3BuYW1lJ10gKTsKCiAgICAvLyBXZSBuZWVkIHRvIGRlbGV0ZSBzZWxlY3Qgb3B0aW9ucyByZWdhcmRsZXNzIG9mIHRoZSBjb250cm9sIHR5cGUsCiAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRlbGV0ZSBzZWxlY3Qgb3B0aW9ucyB3aGVuIGNoYW5naW5nIGNvbnRyb2wgdHlwZXMKICAgICRyZXN1bHQgPSAkdGhpcy0+RGVsZXRlU2VsZWN0T3B0aW9ucyggJHBhcmFtc1sncHJvcG5hbWUnXSApOwogICAgLy8gbm93IHJlYWR5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkKICAgICRyZXN1bHQgPSAkdGhpcy0+RGVsZXRlUHJvcGVydHlEZWZuKCAkcGFyYW1zWydwcm9wbmFtZSddICk7CiAgICBpZiggISRyZXN1bHQgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2NvdWxkbm90ZGVsZXRlcHJvcGVydHknKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXMpOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0RlbGV0ZVVzZXIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWyd1c2VyX2lkJ10pIHx8ICRwYXJhbXNbJ3VzZXJfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfSAgCgogICAgJHJldCA9ICR0aGlzLT5EZWxldGVVc2VyRnVsbCggJHBhcmFtc1sndXNlcl9pZCddICk7CiAgICBpZiggJHJldFswXSA9PSBGQUxTRSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRyZXRbMV0gKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFuZCBsb2cgaXQKICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJCSAgJHRoaXMtPkxhbmcoJ3VzZXJfZGVsZXRlZCcsJHBhcmFtc1sndXNlcl9pZCddKSApOwoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAndXNlcnMnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvRWRpdEdyb3VwKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2dyb3VwcycgKTsKICAgIH0KCiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydncm91cF9pZCddKSB8fCAkcGFyYW1zWydncm91cF9pZCddID09ICIiKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdlZGl0Z3JvdXAnLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9ICAKCiAgICAkZ3JvdXBuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwbmFtZSddICkgKQogICAgICB7CgkkZ3JvdXBuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cG5hbWUnXSk7CiAgICAgIH0KICAgICRncm91cGRlc2MgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZ3JvdXBkZXNjJ10gKSApCiAgICAgIHsKCSRncm91cGRlc2MgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2dyb3VwZGVzYyddKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICBpZiggJGdyb3VwbmFtZSA9PSAnJyB8fCAkZ3JvdXBkZXNjID09ICcnICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2VkaXRncm91cCcsICRyZXR1cm5pZCwkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkcmVsbmFkZGVkID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgJHByb3BuYW1lID0gJyc7CiAgICAgICRzb3J0b3JkZXIgPSAnJzsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXmlucHV0X3JlcXVpcmVkXy8nLCAka2V5ICkgJiYgKCR2YWwgIT0gMCkgKQoJewoJICAkcmVsbmFkZGVkKys7Cgl9CiAgICB9CiAgICBpZiggJHJlbG5hZGRlZCA9PSAwICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICcxJzsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub3JlbGF0aW9ucycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZGdyb3VwJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgICRyZXQgPSAkdGhpcy0+U2V0R3JvdXAoICRwYXJhbXNbJ2dyb3VwX2lkJ10sICRwYXJhbXNbJ2lucHV0X2dyb3VwbmFtZSddLAoJCQkgICAgJHBhcmFtc1snaW5wdXRfZ3JvdXBkZXNjJ10gKTsKICAgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHJldFsxXSApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gYWxzbyBhZGQgdGhlIHByb3BlcnR5IGNob2ljZXMKICAgICR0aGlzLT5EZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkcGFyYW1zWydncm91cF9pZCddICk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCAnL15pbnB1dF9yZXF1aXJlZF8vJywgJGtleSApICkKCXsKCSAgJHByb3BuYW1lID0gc3Vic3RyKCRrZXksc3RybGVuKCdpbnB1dF9yZXF1aXJlZF8nKSk7Cgl9CiAgICAgIGVsc2UgCgl7CgkgIGNvbnRpbnVlOwoJfQogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3NvcnRvcmRlcl8nLiRwcm9wbmFtZV0gKSApCgl7CgkgICRzb3J0b3JkZXIgPSAkcGFyYW1zWydpbnB1dF9zb3J0b3JkZXJfJy4kcHJvcG5hbWVdOwoJfQogICAgICBpZiggJHZhbCAhPSAwICYmICRwcm9wbmFtZSAhPSAnJyApCgl7CgkgICR0aGlzLT5BZGRHcm91cFByb3BlcnR5UmVsYXRpb24oICRwYXJhbXNbJ2dyb3VwX2lkJ10sICRwcm9wbmFtZSwgJHNvcnRvcmRlciwgJHZhbCApOwoJfQogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZ3JvdXBzJyApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0VkaXRQcm9wZXJ0eSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9uYW1lJ10gKSApIAogICAgICB7CgkkbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbmFtZSddKTsgCgkkbmFtZSA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvIC8nLCdfJywkbmFtZSkpOwogICAgICB9CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3Byb21wdCddICkgKXsKICAgICAgJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOyAKICAgIH0KICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3R5cGUnXSApICkgewogICAgICAkdHlwZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdHlwZSddKTsgCiAgICB9CiAgICAkc2Vsb3B0aW9ucyA9ICcnOwogICAgJG9wdGlvbnMgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9leHRyYSddICkgKSB7CiAgICAgICRzZWxvcHRpb25zID0gdHJpbSgkcGFyYW1zWydpbnB1dF9leHRyYSddKTsKICAgICAgJG9wdGlvbnMgPSBleHBsb2RlKCJfXyIsICRzZWxvcHRpb25zKTsKICAgIH0KCQogICAgaWYoICRuYW1lID09ICcnIHx8ICRwcm9tcHQgPT0gJycpCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpOwoJZWNobyAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICBzd2l0Y2goJHR5cGUpewogICAgY2FzZSAwOiAvLyB0ZXh0IGlucHV0CiAgICBjYXNlIDI6IC8vIGVtYWlsCiAgICAgICRsZW5ndGggPSAyMDsKICAgICAgJG1heGxlbmd0aCA9IDIwOwogICAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddICkgKSB7CgkkbGVuZ3RoID0gdHJpbSgkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSk7CiAgICAgIH0KICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXSApICkgewoJJG1heGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbWF4bGVuZ3RoJ10pOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOiAvLyBjaGVja2JveAogICAgICAkbGVuZ3RoID0gMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6IC8vIHRleHRhcmVhCiAgICAgICRsZW5ndGggPSAyNTU7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OiAvLyBkcm9wZG93bgogICAgICAvLyBnZXQgdGhlIG51bWJlciBvZiBlbXB0eSB2YWx1ZXMKICAgICAgLy8gYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIGFycmF5IGNvdW50CiAgICAgICRlbGVtZW50X2NvdW50X2FycmF5ID0gYXJyYXlfY291bnRfdmFsdWVzKCRvcHRpb25zKTsKICAgICAgJGVtcHR5X2VsZW1lbnRfY291bnQgPSAKCSRlbGVtZW50X2NvdW50X2FycmF5WyIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiXHIiXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX18iXSArCgkkZWxlbWVudF9jb3VudF9hcnJheVsiX19cciJdOwogICAgICAkbGVuZ3RoID0gY291bnQoJG9wdGlvbnMpIC0gJGVtcHR5X2VsZW1lbnRfY291bnQ7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgJGxlbmd0aCA9IDE7CiAgICB9CgkKICAgIGlmKCAoJHR5cGUgPT0gMCAmJiAoICRsZW5ndGggPCAxIHx8ICRsZW5ndGggPiAyNTUgKSkgfHwKCSgkdHlwZSA9PSA0ICYmICRzZWxvcHRpb25zID09ICcnICkgKXsKICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CiAgICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFyYW1zJyk7CiAgICAgIGVjaG8gJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRwYXJhbXMnKTsKICAgICAgZWNobyAic2Vsb3B0aW9ucyA9ICIgLiAkc2Vsb3B0aW9uczsKICAgICAgJHRoaXMtPm15UmVkaXJlY3QoJGlkLCdhZGRwcm9wJywkcmV0dXJuaWQsJHBhcmFtcyk7CiAgICAgIHJldHVybjsKICAgIH0KCQogICAgLy8gYW5kIGFkZCB0aGUgcHJvZXBydHkgZGVmaW5pdGlvbgogICAgaWYgKCRzZWxvcHRpb25zKSB7CiAgICAgICRzZWxvcHRpb25zID0gdHJpbSgkc2Vsb3B0aW9ucyk7IC8vIHRyaW0gc3BhY2VzIGV0YwogICAgICAkc2Vsb3B0aW9ucyA9IHRyaW0oJHNlbG9wdGlvbnMsICJfIik7IC8vIHRyaW0gdW5kZXJzY29yZXMgYXQgdGhlIGVuZAogICAgICAkb3B0aW9ucyA9IGV4cGxvZGUoIl9fIiwgJHNlbG9wdGlvbnMpOwogICAgICAkdGhpcy0+RGVsZXRlU2VsZWN0T3B0aW9ucyggJG5hbWUgKTsKICAgICAgJHJlc3VsdCA9ICR0aGlzLT5BZGRTZWxlY3RPcHRpb25zKCAkbmFtZSwgJG9wdGlvbnMgKTsKCiAgICAgIGlmKCAhJHJlc3VsdFswXSApIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHJlc3VsdFsxXTsKCWVjaG8gJHJlc3VsdFsxXTsKCSR0aGlzLT5teVJlZGlyZWN0KCRpZCwnYWRkcHJvcCcsJHJldHVybmlkLCRwYXJhbXMpOwogICAgICB9CiAgICB9CgogICAgJHJlcyA9ICR0aGlzLT5TZXRQcm9wZXJ0eURlZm4oICRwYXJhbXNbJ3Byb3BuYW1lJ10sICRuYW1lLCAkcHJvbXB0LCAkbGVuZ3RoLCAkdHlwZSwgJG1heGxlbmd0aCApOwogICAgaWYoICRyZXMgPT0gZmFsc2UgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9kYmVycm9yJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycpOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0VkaXRVc2VyU3RlcDEoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgICB7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3VzZXJzJyApOwogICAgICB9CgogICAgaWYgKCAhaXNzZXQoJHBhcmFtc1sndXNlcl9pZCddKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCBpbgogICAgJHVzZXJfaWQgICA9IHRyaW0oJHBhcmFtc1sndXNlcl9pZCddKTsKICAgICR1c2VybmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSk7CiAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgJHJlcGVhdCAgID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgIC8vIG1vcm9uIGxvb2sgaGVyZQovLyAgICAgJHByb3BuYW1lID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wcm9wbmFtZSddKTsKLy8gICAgICRwcm9wbmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvcHZhbHVlJ10pOwoKICAgICRyZXQgPSAkdGhpcy0+X2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlLCBmYWxzZSwgCgkJCQkJICAgICB0cnVlLCBmYWxzZSApOwogICAgc3dpdGNoKCAkcmV0ICkKICAgICAgewogICAgICBjYXNlIC0xOiAvLyBlcnJvcgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICRtZXNzYWdlICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkVkaXRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICBjYXNlIDA6ICAvLyBubyBlcnJvciwgYnV0IGRvbid0IGNvbnRpbnVlIG9wZXJhdGlvbgoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsKICAgICAgY2FzZSAxOiAgLy8gYWxsIGlzIGdvb2QsIGNvbnRpbnVlIG9wZXJhdGlvbgoJYnJlYWs7CiAgICAgIH0KCiAgICAvLyBsb2FkIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwCiAgICAvLyBmb3IgdGhlIG5leHQgcGFnZQogICAgJHByb3BzID0gJHRoaXMtPkdldFVzZXJQcm9wZXJ0aWVzKCAkdXNlcl9pZCApOwogICAgZm9yZWFjaCggJHByb3BzIGFzICRwcm9wICkKICAgIHsKICAgICAgJHBhcmFtc1snaW5wdXRfJy4kcHJvcFsndGl0bGUnXV0gPSB1cmxlbmNvZGUoJHByb3BbJ2RhdGEnXSk7CiAgICB9CgogICAgLy8gQW5kIEdvIHRvIHN0ZXAgMgogICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2VkaXR1c2VyMicsICRyZXR1cm5pZCwkcGFyYW1zICk7CgogIH0KCgogIGZ1bmN0aW9uIF9Eb0VkaXRVc2VyU3RlcDMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gZG8gd2Ugd2FudCB0byBnbyBiYWNrCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2JhY2snXSApICkKICAgICAgewoJLy8geXVwIHdlIGRvCgkkcGFyYW1zID0gZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKTs7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZWRpdHVzZXInLCAkcmV0dXJuaWQsJHBhcmFtcyApOwogICAgICB9CgogICAgaWYoICFpc3NldCggJHBhcmFtc1sndXNlcl9pZCddICkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgZmllbGQgaW5mbwogICAgJGZsZGluZm8gPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmhpZGRlbl8vJywgJGsgKSApCgl7CgkgICRmbGRuYW1lID0gc3Vic3RyKCAkaywgc3RybGVuKCdoaWRkZW5fJykpOwoJICAkcHJvcGluZm8gPSBzcGxpdCgnOycsJHYpOwoJICAkZmxkaW5mb1skZmxkbmFtZV0gPSAkcHJvcGluZm87Cgl9CiAgICB9CgogICAgLy8gbm93IGdldCBlYWNoIG9mIHRoZSBmaWVsZHMKICAgICRmaWVsZHMgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCcvXmlucHV0Xy8nLCAkayApICkKCXsKCSAgJGZsZG5hbWUgPSBzdWJzdHIoICRrLCBzdHJsZW4oJ2lucHV0XycpKTsKCSAgJGZpZWxkc1skZmxkbmFtZV0gPSAkdjsgCgl9CiAgICB9CgogICAgLy8gbm93IHZhbGlkYXRlCiAgICBmb3JlYWNoKCAkZmxkaW5mbyBhcyAkbmFtZSA9PiAkdmFsICkKICAgIHsKICAgICAgLy8gcHJvY2VzcyBlbXB0eSByZXF1aXJlZCBmaWVsZHMKICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBlbXB0eSBvcHRpb25hbCBvbmVzCiAgICAgIGlmKCAkdmFsWzNdID09IDIgJiYgKCFpc3NldCggJGZpZWxkc1skbmFtZV0gKSB8fCAkZmllbGRzWyRuYW1lXSA9PSAnJykgKQoJewoJICAvLyBhIHJlcXVpcmVkIGZpZWxkIGlzIGVtcHR5CgkgICRwYXJhbXMgPSBhcnJheV9tZXJnZSggJHBhcmFtcywgZXhwbG9kZV93aXRoX2tleSggJHBhcmFtc1snc3RlcDFfcGFyYW1zJ10gKSk7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ19yZXF1aXJlZF9wYXJhbScsJG5hbWUpOwoJICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZG9fYWRkdXNlcjInLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJICByZXR1cm47Cgl9CgogICAgICAvLyB2YWxpZGF0ZSBmaWxsZWQgaW4gZmllbGRzCiAgICAgIGlmKCBpc3NldCggJGZpZWxkc1skbmFtZV0gKSApCgl7CgkgIHN3aXRjaCggJHZhbFsxXSApCgkgICAgewoJICAgIGNhc2UgMDogLy8gdGV4dAoJICAgICAgLy8gbm90IG11Y2ggd2UgY2FuIGRvIHRvIHZhbGlkYXRlIGEgdGV4dCBmaWVsZC4KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMTogLy8gY2hlY2tib3gKCSAgICAgIC8vIG9yIGEgY2hlY2tib3gKCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgMjogLy8gZW1haWwKCSAgICAgIC8vIGVtYWlsIGFkZHJlc3NlcyBjYW4gYmUgdmFsaWRhdGVkIHRob3VnaAoJICAgICAgYnJlYWs7CgkgICAgY2FzZSAzOiAvLyB0ZXh0YXJlYQoJICAgICAgLy8gbWF5YmUgc2l6ZT8KCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgNDogLy8gZHJvcGRvd24KCSAgICAgIC8vIEhvdyBjYW4gd2UgdmFsaWRhdGUgYSBkcm9wZG93bj8KCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHBhcm1zIGZyb20gdGhlIGZpcnN0IHN0ZXAKICAgICRwYXJtczEgPSBleHBsb2RlX3dpdGhfa2V5KCAkcGFyYW1zWydzdGVwMV9wYXJhbXMnXSApOwogICAgCiAgICAvLyBhbmQgbWVyZ2UgZW0gaW50byAkcGFyYW1zIHNvIHdlIGNhbiBhY3R1YWxseSBhZGQgdGhlIHVzZXIgYWNjb3VudAogICAgJHBhcmFtcyA9IGFycmF5X21lcmdlKCAkcGFyYW1zLCAkcGFybXMxICk7CgogICAgLy8gbm93IGZpbmQgb3V0IHdoaWNoIGdyb3VwcyBoZSdzIGEgbWVtYmVyIG9mCiAgICAkZ3JwaWRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGsgPT4gJHYgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCgnL15tZW1iZXJvZl8vJywgJGsgKSApCgl7CgkgICRncnBpZHNbXSA9ICRwYXJhbXNbJGtdOwoJfQogICAgfQoKICAgICR1c2VyX2lkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHVzZXJfaWQgPSAkcGFyYW1zWyd1c2VyX2lkJ107CiAgICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkcmV0WzFdICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9CgogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ107CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgJiYgJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSAhPSAnJyApCiAgICAgIHsKCSRwYXNzd29yZCA9ICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ107CiAgICAgIH0KICAgICRleHBpcmVzID0gc3RydG90aW1lKCcrMTAgeWVhcnMnLCB0aW1lKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddICkgKQogICAgICB7CgkkZXhwaXJlc2RhdGUgPSAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddOwogICAgICB9CgogICAgLy8gYW5kIFNldCB0aGUgdXNlcgogICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyKCAkdXNlcl9pZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQgKTsKICAgIGlmKCAkcmV0WzBdID09IGZhbHNlICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICRyZXRbMV0gKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCXJldHVybjsJCiAgICAgIH0KCiAgICAvLyBhbmQgdGhlbiBhZGQgaGltIHRvIGhpcyBncm91cHMKICAgICRyZXQgPSAkdGhpcy0+U2V0VXNlckdyb3VwcyggJHVzZXJfaWQsICRncnBpZHMgKTsKICAgIGlmKCAkcmV0WzBdID09IGZhbHNlICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl9jYW50YXNzaWdudXNlcicpICk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMlBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CQogICAgICB9IAoKICAgIC8vIGFuZCB0aGVuIGFkZCBoaXMgcHJvcGVydGllcwogICAgJHRoaXMtPkRlbGV0ZVVzZXJQcm9wZXJ0eUZ1bGwoICIiLCAkdXNlcl9pZCwgdHJ1ZSApOwogICAgZm9yZWFjaCggJGZpZWxkcyBhcyAkayA9PiAkdiApCiAgICB7CiAgICAgICRyZXQgPSAkdGhpcy0+U2V0VXNlclByb3BlcnR5RnVsbCggJGssICR2LCAkdXNlcl9pZCApOwogICAgICBpZiggJHJldCA9PSBmYWxzZSApCgl7CgkgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+bGFuZygnZXJyb3InKTsKCSAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICByZXR1cm47Cgl9CiAgICB9CgogICAgLy8gYW5kIHdlJ3JlIGRvbmUKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAndXNlcnMnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvRm9yZ290UGFzc3dvcmQoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApICApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHJldHVybmlkLCRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQogICAgCiAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgdGhpcyB1c2VyCiAgICAkdWlkID0gJHRoaXMtPkdldFVzZXJJRCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApOwogICAgaWYoICEkdWlkICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJyk7CgkkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZm9yZ290cHcnLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgoKICAgIC8vIHNlZSBpZiB3ZSBjYW4gZGlnIHVwIGFuIGVtYWlsIGFkZHJlc3MgZm9yIGhpbQogICAgJGVtYWlsID0gZmFsc2U7CiAgICAkZGVmbnMgPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZucygpOwogICAgJHByb3BzID0gJHRoaXMtPkdldFVzZXJQcm9wZXJ0aWVzKCAkdWlkICk7CiAgICBpZiggJHByb3BzICkgCiAgICAgIHsKCS8vIHdlIGhhdmUgcHJvcGVydGllcyBmb3IgdGhpcyB1c2VyCgkvLyBub3cgc2VlIGlmIHdlIGhhdmUgYW4gZW1haWwgZmllbGQKCS8vIHdlJ3JlIGdvbm5hIGl0ZXJhdGUgdGhyb3VnaCB0aGUgcHJvcGVydGllcyB0aWxsIG9uZSBpcyBhbiBlbWFpbCB0eXBlCgkvLyB0aGVuIHdlJ3JlIGdvbm5hIGFzayB0aGUgdXNlciBpZiB0aGlzIGlzIHRoZSByaWdodCBhZGRyZXNzLi4KCWZvcmVhY2goICRwcm9wcyBhcyAkcHJvcGUgKQoJewoJICBmb3JlYWNoKCAkZGVmbnMgYXMgJGRlZm5lICkKCSAgewoJICAgIGlmKCAkcHJvcGVbJ3RpdGxlJ10gPT0gJGRlZm5lWyduYW1lJ10gJiYgJGRlZm5lWyd0eXBlJ10gPT0gMiAmJiAkZW1haWwgPT0gZmFsc2UgKQoJICAgICAgewoJCS8vIGZvdW5kIGEgbWF0Y2ggYW5kIGl0J3MgYW4gZW1haWwgZmllbGQKCQkkZW1haWwgPSAkcHJvcGVbJ2RhdGEnXTsKCQlicmVhazsKCSAgICAgIH0KCSAgfQoKCSAgaWYoICRlbWFpbCAhPSBmYWxzZSApCgkgICAgewoJICAgICAgYnJlYWs7CgkgICAgfQoJfQoKCWlmKCAhJGVtYWlsICkKCSAgewoJICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub2VtYWlsYWRkcmVzcycpOwoJICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRyZXR1cm5pZCwkcGFyYW1zICk7CgkgICAgcmV0dXJuOwoJICB9CgllbHNlCgkgIHsKCSAgICAkY21zbWFpbGVyID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdDTVNNYWlsZXInKTsKCSAgICBpZiggISRjbXNtYWlsZXIgKQoJICAgICAgewoJCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9ub21haWxlcm1vZHVsZScpOwoJCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRyZXR1cm5pZCwkcGFyYW1zICk7CgkJcmV0dXJuOwoJICAgICAgfQoKCSAgICAvLyB3ZSBmb3VuZCBhbmUgbWFpbCBhZGRyZXNzCgkgICAgLy8gZ2VuZXJhdGUgYSBjb2RlLCBhbmQgc3RvcmUgaXQgc29tZXBsYWNlCgkgICAgLy8gYnV0IHRoYXQgbWVhbnMgd2UgZ290dGEgY2xlYW4gdGhlc2UgdGhpbmdzIHVwCgkgICAgLy8gZnJvbSB0aW1lIHRvIHRpbWUuCgkgICAgJGNvZGUgPSAkdGhpcy0+R2VuZXJhdGVSYW5kb21QcmludGFibGVTdHJpbmcoKTsKCSAgICBpZiggISR0aGlzLT5TZXRVc2VyVGVtcENvZGUoICR1aWQsICRjb2RlICkgKQoJICAgICAgewoJCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9yZXNldGFscmVhZHlzZW50Jyk7CgkJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2ZvcmdvdHB3JywgJHJldHVybmlkLCRwYXJhbXMgKTsKCQlyZXR1cm47CgkgICAgICB9CgoJICAgIC8vIHNlbmQgb3VyIGZ1bmt5IGVtYWlsCgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnLAoJCQkJICAkdGhpcy0+TGFuZygnbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsJykpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2NvZGUnLCR0aGlzLT5MYW5nKCdtZXNzYWdlX2NvZGUnKSk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhX2NvZGUnLCRjb2RlKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9saW5rJywkdGhpcy0+TGFuZygncHJvbXB0X2xpbmsnKSk7CgkgICAgJHBhcm1zID0gYXJyYXkoICdpbnB1dF91aWQnID0+ICR1aWQsICdpbnB1dF9jb2RlJyA9PiAkY29kZSApOwoJICAgICRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCd2ZXJpZnljb2RlJywkcmV0dXJuaWQsJycsJHBhcm1zLCAnJywgdHJ1ZSk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRhX2xpbmsnLAoJCQkJICAkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ3ZlcmlmeWNvZGUnLCRyZXR1cm5pZCwkbGluaywkcGFybXMpKTsKCSAgICAkYm9keSA9ICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nKTsKCgkgICAgJGNtc21haWxlci0+QWRkQWRkcmVzcyggJGVtYWlsICk7CgkgICAgJGNtc21haWxlci0+U2V0Qm9keSggJGJvZHkgKTsKCSAgICAkY21zbWFpbGVyLT5Jc0hUTUwodHJ1ZSk7CgkgICAgJGNtc21haWxlci0+U2V0U3ViamVjdCgkdGhpcy0+TGFuZygnbG9zdHBhc3N3b3JkX2VtYWlsc3ViamVjdCcpKTsKCSAgICAkY21zbWFpbGVyLT5TZW5kKCk7CgoJICAgIC8vIGFuZCB0ZWxsIHRoZSB1c2VyIHNvbWV0aGluZwoJICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnLCRlbWFpbCk7CgkgICAgJHBhcmFtc1snc2tpcGZvcm1kaXNwbGF5J10gPSAxOwoJICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRyZXR1cm5pZCwkcGFyYW1zICk7CgkgICAgcmV0dXJuIDE7CgkgIH0KICAgICAgfQoKICAgIC8vIHdlIGZvdW5kIG5vIGVtYWlsIGFkZHJlc3MKICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwogICAgJHBhcmFtc1snbWVzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfY291bGRub3RmaW5kZW1haWwnKTsKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdmb3Jnb3RwdycsICRyZXR1cm5pZCwkcGFyYW1zICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvTG9naW4oICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApIHx8ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gPT0gJycgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3Npbmd1c2VybmFtZScpOwoJJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICB9CgogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSApIHx8ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gPT0gJycgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3NpbmdwYXNzd29yZCcpOwoJJHRoaXMtPl9HZXRVc2VyTG9naW5Gb3JtKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IHZhbGlkYXRlIHRoZSBwYXNzd29yZCBhbmQgdXNlcm5hbWUKICAgICRyZXN1bHQgPSAkdGhpcy0+TG9naW4oICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10sICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gKTsKICAgIGlmKCAkcmVzdWx0WzBdID09IGZhbHNlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9ICRyZXN1bHRbMV07CgkkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglyZXR1cm47CiAgICAgIH0KICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJCSAgJHRoaXMtPkxhbmcoJ2Zyb250ZW5kdXNlcl9sb2dnZWRpbicpLiI6ICIuJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSApOwoKICAgIC8vIHdlJ3JlIGxvZ2dlZCBpbgogICAgLy8gcmVkaXJlY3Qgc29tZXdoZXJlIAogICAgJHBhZ2UgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJyk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3JldHVybnRvJ10gKSApCiAgICAgIHsKCSRwYWdlID0gJHBhcmFtc1sncmV0dXJudG8nXTsKICAgICAgfQogICAgaWYoICRwYWdlICkKICAgICAgewoJJGlkID0gQ29udGVudE1hbmFnZXI6OkdldFBhZ2VJREZyb21BbGlhcyggJHBhZ2UgKTsKCWlmKCAkaWQgKQoJICB7CgkgICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCggJGlkICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0KICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRyZXR1cm5pZCApOwogIH0KCgogIGZ1bmN0aW9uIF9Eb0xvZ291dCggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+TG9nb3V0KCk7CiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwKCQkgICR0aGlzLT5MYW5nKCdmcm9udGVuZHVzZXJfbG9nb3V0JykpOwoKICAgIC8vIHdlJ3JlIGxvZ2dlZCBvdXQKICAgIC8vIHJlZGlyZWN0IHNvbWV3aGVyZSAKICAgIC8vIHRvZG8sIGFkZCBtb3JlIG9wdGlvbnMgaGVyZS4KICAgICRwYWdlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3BhZ2VpZF9sb2dvdXQnKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1sncmV0dXJudG8nXSApICkKICAgICAgewoJJHBhZ2UgPSAkcGFyYW1zWydyZXR1cm50byddOwogICAgICB9CiAgICBpZiggJHBhZ2UgKQogICAgICB7CgkkaWQgPSBDb250ZW50TWFuYWdlcjo6R2V0UGFnZUlERnJvbUFsaWFzKCAkcGFnZSApOwoJaWYoICRpZCApCgkgIHsKCSAgICAkdGhpcy0+UmVkaXJlY3RDb250ZW50KCAkaWQgKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCggJHJldHVybmlkICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvUmVzZXRVc2VyQWNjb3VudCggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdWlkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VpZCddICkgKQogICAgICB7CgkkdWlkID0gdHJpbSgkcGFyYW1zWydpbnB1dF91aWQnXSk7CiAgICAgIH0KICAgICRjb2RlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2NvZGUnXSApICkKICAgICAgewoJJGNvZGUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2NvZGUnXSk7CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgKQogICAgICB7CgkkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgICB9CiAgICAkcmVwZWF0cGFzc3dvcmQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSApICkKICAgICAgewoJJHJlcGVhdHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgICAgfQoKICAgIGlmKCAkcGFzc3dvcmQgPT0gJycgfHwgJHJlcGVhdHBhc3N3b3JkID09ICcnIHx8IAoJJHBhc3N3b3JkICE9ICRyZXBlYXRwYXNzd29yZCB8fCAhJHRoaXMtPklzVmFsaWRQYXNzd29yZCgkcGFzc3dvcmQpKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFzc3dvcmQnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICd2ZXJpZnljb2RlJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG5vdyB3ZSBoYXZlIHRvIHZlcmlmeSB0aGUgY29kZQogICAgJHJlc3VsdCA9ICR0aGlzLT5HZXRVc2VyVGVtcENvZGUoICR1aWQgKTsKICAgIGlmKCAkcmVzdWx0WzBdID09IEZBTFNFICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ3ZlcmlmeWNvZGUnLCAkcmV0dXJuaWQsJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICAkZGJjb2RlID0gJHJlc3VsdFsxXVsnY29kZSddOwoKICAgIGlmKCAkZGJjb2RlICE9ICRjb2RlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZGNvZGUnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICd2ZXJpZnljb2RlJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHdoZXcsIHdlIGdvdCBpdC4uLiBub3cgd2UgY2FuIHJlc2V0IHRoZSBwYXNzd29yZAogICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApOwogICAgaWYoICRyZXRbMF0gIT0gVFJVRSApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHJldFsxXTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICd2ZXJpZnljb2RlJywgJHJldHVybmlkLCRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFuZCBkZWxldGUgdGhlIGNvZGUKICAgICR0aGlzLT5SZW1vdmVVc2VyVGVtcENvZGUoICR1aWQgKTsKCiAgICAvLyBhbmQgZGlzcGxheSBhIG5pY2Ugd2FybSBmdXp6eSBtZXNzYWdlCiAgICAvLyB0b2RvCiAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCApOwogICAgYnJlYWs7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRDaGFuZ2VTZXR0aW5nc1RlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2NoYW5nZXNldHRpbmdzZm9ybScsICR0aGlzLT5kZmx0X2NoYW5nZXNldHRpbmdzdGVtcGxhdGUpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSk7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnICk7CiAgfQoKCiAgZnVuY3Rpb24gX0RvU2V0Rm9yZ290UFdUZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRzJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMSk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMik7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmR2ZXJpZnlmb3JtJywkdGhpcy0+ZGZsdF9mb3Jnb3RwYXNzd29yZHRlbXBsYXRlMyk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScsICRwYXJhbXNbJ3RlbXBsYXRlY29udGVudDEnXSk7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfZm9yZ290cGFzc3dvcmRlbWFpbGZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQyJ10pOzsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQzJ10pOzsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZScgKTsKICB9CgoKICBmdW5jdGlvbiBfRG9TZXRMb2dpblRlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ2luZm9ybScsICR0aGlzLT5kZmx0X2xvZ2luZm9ybXRlbXBsYXRlKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoJ2ZldXNlcnNfbG9naW5mb3JtJywgJHBhcmFtc1sndGVtcGxhdGVsb2dpbmZvcm0nXSk7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnbG9naW50ZW1wbGF0ZScgKTsKICB9CgogIAogIGZ1bmN0aW9uIF9Eb1NldExvZ291dFRlbXBsYXRlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZGVmYXVsdHMnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCdmZXVzZXJzX2xvZ291dGZvcm0nLCAkdGhpcy0+ZGZsdF9sb2dvdXRmb3JtdGVtcGxhdGUpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSgnZmV1c2Vyc19sb2dvdXRmb3JtJywgJHBhcmFtc1sndGVtcGxhdGVsb2dvdXRmb3JtJ10pOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2xvZ291dHRlbXBsYXRlJywgJHBhcmFtcyk7CiAgfQoKICAKICBmdW5jdGlvbiBfRG9TZXRQcmVmcyggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlbW92ZWFsbCddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctNSB5ZWFycycpOwoJcmV0dXJuOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmUxd2VlayddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctMSB3ZWVrJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3ByZWZzJyk7CiAgICAgIH0KCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3JlbW92ZTFtb250aCddICkgKQogICAgICB7CgkkdGhpcy0+RXhwaXJlVGVtcENvZGVzKCctMSBtb250aCcpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycpOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycgKTsKICAgICAgfQoKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtaW5fcGFzc3dvcmRsZW5ndGgnLCRwYXJhbXNbJ2lucHV0X21pbnB3bGVuJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcsJHBhcmFtc1snaW5wdXRfbWF4cHdsZW4nXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJywkcGFyYW1zWydpbnB1dF9taW51bmxlbiddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnLCRwYXJhbXNbJ2lucHV0X21heHVubGVuJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3VzZXJfc2Vzc2lvbl9leHBpcmVzJywgJHBhcmFtc1snaW5wdXRfc2Vzc2lvbnRpbWVvdXQnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcsICRwYXJhbXNbJ2lucHV0X2RmbHRncm91cCddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkb19zbXRwX3ZhbGlkYXRlX2VtYWlsJywgJHBhcmFtc1snaW5wdXRfc210cHZhbGlkYXRlJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsICRwYXJhbXNbJ2lucHV0X3JlcXVpcmVkZmllbGRtYXJrZXInXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCAkcGFyYW1zWydpbnB1dF9yZXF1aXJlZGZpZWxkY29sb3InXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcsICRwYXJhbXNbJ2lucHV0X3JlcXVpcmVvbmVncm91cCddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdoaWRkZW5fZmllbGRfbWFya2VyJywgJHBhcmFtc1snaW5wdXRfaGlkZGVuZmllbGRtYXJrZXInXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnaGlkZGVuX2ZpZWxkX2NvbG9yJywgJHBhcmFtc1snaW5wdXRfaGlkZGVuZmllbGRjb2xvciddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRmb3Jnb3RwYXNzd2QnLCAkcGFyYW1zWydpbnB1dF9mb3Jnb3Rwd19wYWdlJ10pOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3BhZ2VpZF9jaGFuZ2VzZXR0aW5ncycsICRwYXJhbXNbJ2lucHV0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncGFnZWlkX2xvZ2luJywgJHBhcmFtc1snaW5wdXRfbG9naW5fcGFnZSddKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdwYWdlaWRfbG9nb3V0JywgJHBhcmFtc1snaW5wdXRfbG9nb3V0X3BhZ2UnXSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnYWxsb3dfZHVwbGljYXRlX2VtYWlscycsICRwYXJhbXNbJ2lucHV0X2FsbG93X2R1cGxpY2F0ZV9lbWFpbHMnXSk7CiAgICAKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJlZnMnKTsKICB9CgogIAogIGZ1bmN0aW9uIF9Eb1NldFByb3BlcnRpZXMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJLy8gd2UgYXJlIGNhbmNlbGxpbmcKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIgKCRpZCwgJ3Byb3BlcnRpZXMnICk7CiAgICAgIH0KCiAgICAvLyBjaGVjayBpZiB3ZSBhcmUgYWRkaW5nIGEgcHJvcGVydHkKICAgIGlmKCBpc3NldCggJHBhcmFtc1sncHJvcGFkZCddICkgKQogICAgICB7CgkvLyB5dXAKCS8vIHZhbGlkYXRlIGZpZWxkcwoJJG5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X25hbWUnXSk7CgkkbmFtZSA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvIC8nLCdfJywkbmFtZSkpOwoJJHByb21wdCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcHJvbXB0J10pOwoJJGxlbmd0aCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10pOwoJJHR5cGUgPSAkcGFyYW1zWydpbnB1dF90eXBlJ107CgoJaWYoICRuYW1lID09ICcnIHx8ICRwcm9tcHQgPT0gJycgKQoJICB7CgkgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgJHBhcmFtc1snbWVzc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKTsKCSAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdwcm9wZXJ0aWVzJywgJHBhcmFtcyApOwoJICAgIHJldHVybjsKCSAgfQoKCWlmKCBpc3NldCgkcGFyYW1zWydwcm9wZGVmbiddKSApCgkgIHsKCSAgICAkcHJvcHMgPSBzcGxpdCgiLCIsJHBhcmFtc1sncHJvcGRlZm4nXSk7CgkgICAgZm9yZWFjaCggJHByb3BzIGFzICRwcm9wICkKCSAgICB7CgkgICAgICBsaXN0KCAkZW5hbWUsICRlcHJvbXB0LCAkZXR5cGUsICRlbGVuZ3RoICkgPSBzcGxpdCgiOyIsJHByb3ApOwoJICAgICAgaWYoICRuYW1lID09ICRlbmFtZSApIAoJCXsKCQkgIC8vIG5hbWUgaXMgYWxyZWFkeSB0YWtlbgoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfZHVwbGljYXRlbmFtZScpOwoJCSAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAncHJvcGVydGllcycsICRwYXJhbXMgKTsKCQkgIHJldHVybjsKCQl9CgkgICAgfQoJICB9CgoJJGVudHJ5ID0gaW1wbG9kZSgiOyIsYXJyYXkoJG5hbWUsJHByb21wdCwkdHlwZSwkbGVuZ3RoKSk7CglpZiggaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkpCgkgIHsKCSAgICAkcGFyYW1zWydwcm9wZGVmbiddIC49ICIsIi4kZW50cnk7CgkgIH0KCWVsc2UgCgkgIHsKCSAgICAkcGFyYW1zWydwcm9wZGVmbiddID0gJGVudHJ5OwoJICB9CgkkcGFyYW1zWydkb25vdGxvYWRwcm9wcyddID0gMTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UgaWYoIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkcGFyYW1zLCAncHJvcGVkaXRfJykgJiYgaXNzZXQoJHBhcmFtc1sncHJvcGRlZm4nXSkpCiAgICAgIHsKCSRrID0gYXJyYXlfZmluZF9rZXlfcmVnZXhwKCAkcGFyYW1zLCAnL15wcm9wZWRpdF8vJyApOwoJJHBvczEgPSBzdHJwb3MoICRrLCAnLScgKTsKCSRwb3MyID0gc3RycnBvcyggJGssICdfJyApOwoJJGtleSAgPSBzdWJzdHIoICRrICwgJHBvczErMSwgJHBvczIgLSAkcG9zMSAtIDEpOwoKCS8vIHdlJ3JlIGVkaXRpbmcgYSBwcm9wZXJ0eQoJLy8gc28gd2UgdGFrZSB0aGUgY3VycmVudCBwcm9wZXJ0eSAoJGtleSkgYW5kIHJlbW92ZSBpdAoJLy8gZnJvbSBwcm9wcywgYW5kIHB1dCBpdCBpbiB0aGUgcGFyYW1zCgkkcHJvcHMgPSBzcGxpdCgnLCcsJHBhcmFtc1sncHJvcGRlZm4nXSk7CgkkbmV3cHJvcHMgPSAiIjsKCWZvcmVhY2goICRwcm9wcyBhcyAkcCApCgl7CgkgICRhcHJvcCA9IHNwbGl0KCI7IiwkcCk7CgkgIGlmKCAkYXByb3BbMF0gPT0gJGtleSApCgkgICAgewoJICAgICAgJHBhcmFtc1snaW5wdXRfbmFtZSddID0gJGFwcm9wWzBdOwoJICAgICAgJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gPSAkYXByb3BbMV07CgkgICAgICAkcGFyYW1zWydpbnB1dF90eXBlJ10gPSAkYXByb3BbMl07CgkgICAgICAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXSA9ICRhcHJvcFszXTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgaWYoICRuZXdwcm9wcyA9PSAnJyApCgkJewoJCSAgJG5ld3Byb3BzID0gJHA7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICRuZXdwcm9wcyA9ICRuZXdwcm9wcy4iLCIuJHA7CgkJfQoJICAgIH0KCX0KCSRwYXJhbXNbJ3Byb3BkZWZuJ10gPSAkbmV3cHJvcHM7CgkkcGFyYW1zWydkb25vdGxvYWRwcm9wcyddID0gMTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UgaWYoIGFycmF5X2tleV9leGlzdHNfc3Vic3RyKCAkcGFyYW1zLCAncHJvcGRlbGV0ZV8nKSAmJiBpc3NldCgkcGFyYW1zWydwcm9wZGVmbiddKSkKICAgICAgewoJJGsgPSBhcnJheV9maW5kX2tleV9yZWdleHAoICRwYXJhbXMsICcvXnByb3BkZWxldGVfLycgKTsKCWxpc3QoICRqdW5rLCAka2V5ICkgPSBzcGxpdCggIl8iLCAkayApOwoKCS8vIHdlJ3JlIGRlbGV0aW5nIGEgcHJvcGVydHkKCS8vIHNvIHdlIHRha2UgdGhlIGN1cnJlbnQgcHJvcGVydHkgKCRrZXkpIGFuZCByZW1vdmUgaXQKCS8vIGZyb20gcHJvcHMsIAoJJHByb3BzID0gc3BsaXQoJywnLCRwYXJhbXNbJ3Byb3BkZWZuJ10pOwoJJG5ld3Byb3BzID0gIiI7Cglmb3JlYWNoKCAkcHJvcHMgYXMgJHAgKQoJewoJICAkYXByb3AgPSBzcGxpdCgiOyIsJHApOwoJICBpZiggJGFwcm9wWzBdID09ICRrZXkgKQoJICAgIHsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICBpZiggJG5ld3Byb3BzID09ICcnICkKCQl7CgkJICAkbmV3cHJvcHMgPSAkcDsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgJG5ld3Byb3BzID0gJG5ld3Byb3BzLiIsIi4kcDsKCQl9CgkgICAgfQoJfQoJJHBhcmFtc1sncHJvcGRlZm4nXSA9ICRuZXdwcm9wczsKCSRwYXJhbXNbJ2Rvbm90bG9hZHByb3BzJ10gPSAxOwogICAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3Byb3BlcnRpZXMnLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCgogICAgLy8gd2UncmUgc3VibWl0dGluZyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMKICAgICRwcm9wcyA9IHNwbGl0KCcsJywkcGFyYW1zWydwcm9wZGVmbiddKTsKICAgICR0aGlzLT5EZWxldGVQcm9wZXJ0eURlZm5zKCk7CiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICAkYXByb3AgPSBzcGxpdCgiOyIsJHByb3ApOwoKICAgICAgJHJldCA9ICR0aGlzLT5BZGRQcm9wZXJ0eURlZm4oICRhcHJvcFswXSwgJGFwcm9wWzFdLCAkYXByb3BbMl0sICRhcHJvcFszXSwgJGFwcm9wWzRdICk7CiAgICAgIGlmKCAkcmV0WzBdID09IGZhbHNlICkKCXsKCSAgLy8gbmFtZSBpcyBhbHJlYWR5IHRha2VuCgkgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJvcGVydGllcycgKTsKCSAgcmV0dXJuOwoJfQogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJvcGVydGllcycsICRwYXJhbXMgKTsKICAgIHJldHVybjsKICB9CgoKICBmdW5jdGlvbiBfRG9Vc2VyQWN0aW9uKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZm9ybSddICkgKQogICAgICB7Cglzd2l0Y2goICRwYXJhbXNbJ2Zvcm0nXSApIAoJICB7CgkgIGNhc2UgJ2xvZ2luJzoKCSAgICAkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKCSAgICBicmVhazsKCSAgY2FzZSAnbG9nb3V0JzoKCSAgICAkdGhpcy0+X0dldFVzZXJMb2dvdXRGb3JtKCRpZCwkcGFyYW1zLCRyZXR1cm5pZCk7CgkgICAgYnJlYWs7CgkgIGNhc2UgJ2ZvcmdvdHB3JzoKCSAgICAkdGhpcy0+X0Rpc3BsYXlVc2VyRm9yZ290UGFzc3dvcmRQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIGJyZWFrOwoJICBjYXNlICdjaGFuZ2VzZXR0aW5ncyc6CgkgICAgJHRoaXMtPl9EaXNwbGF5VXNlclNldHRpbmdzUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICBicmVhazsKCSAgfQoJcmV0dXJuOwogICAgICB9CgogICAgaWYoICEkdGhpcy0+TG9nZ2VkSW4oKSApIAogICAgICB7CgkkdGhpcy0+X0dldFVzZXJMb2dpbkZvcm0oJGlkLCRwYXJhbXMsJHJldHVybmlkKTsKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHRoaXMtPl9HZXRVc2VyTG9nb3V0Rm9ybSgkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwogICAgICB9CiAgfQoKCiAgZnVuY3Rpb24gX0RvVXNlckNoYW5nZVNldHRpbmdzKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgICR1aWQgPSAkdGhpcy0+TG9nZ2VkSW5JZCgpOwogICAgaWYoICR1aWQgPT0gZmFsc2UgKSAKICAgICAgewoJLy8gdXNlciBpc24ndCBsb2dnZWQgaW4KCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm90bG9nZ2VkaW4nKSk7CglyZXR1cm47CiAgICAgIH0KICAgICRyZXN1bHQgPSAkdGhpcy0+R2V0VXNlckluZm8oICR1aWQgKTsKICAgIGlmKCAkcmVzdWx0WzBdID09IEZBTFNFICkKICAgICAgewoJLy8gdXNlciBpc24ndCBsb2dnZWQgaW4KCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICAkcmVzdWx0WzFdKTsKCXJldHVybjsKICAgICAgfQogICAgJHVpbmZvID0gJHJlc3VsdFsxXTsKCiAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgJHJlcGVhdCAgID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgIGlmKCAkcGFzc3dvcmQgIT0gJHJlcGVhdCAmJiAkcGFzc3dvcmQgIT0gJycpCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3Bhc3N3b3JkbWlzbWF0Y2gnKTsKCSR0aGlzLT5SZWRpcmVjdCgkaWQsICdjaGFuZ2VzZXR0aW5ncycsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CgogICAgLy8gZG8gdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRzLgogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaGlkZGVuXy8nLCAka2V5ICkgKQoJewoJICAkcHJvcG5hbWUgPSBzdWJzdHIoICRrZXksIHN0cmxlbignaGlkZGVuXycpKTsKCSAgJGFyciA9IHNwbGl0KCI7IiwkcGFyYW1zWyRrZXldKTsKCSAgJHJlcXVpcmVkID0gJGFyclszXTsKCSAgaWYoICRyZXF1aXJlZCA9PSAyICYmIAoJICAgICAgKCFpc3NldCgkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0pIHx8ICRwYXJhbXNbJ2lucHV0XycuJHByb3BuYW1lXSA9PSAnJyApICkKCSAgICB7CgkgICAgICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9yZXF1aXJlZGZpZWxkJywkcHJvcG5hbWUpOwoJICAgICAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdjaGFuZ2VzZXR0aW5ncycsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJICAgIH0KCgkgIGlmKCAkYXJyWzFdID09ICcyJyApCgkgICAgewoJICAgICAgJHJlc3VsdCA9ICR0aGlzLT5Jc1ZhbGlkRW1haWxBZGRyZXNzKCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0sCgkJCQkJCSAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZG9fc210cF92YWxpZGF0ZV9lbWFpbCcpICk7CgkgICAgICBpZiggJHJlc3VsdFswXSA9PSBmYWxzZSApCgkJewoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJCSAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdjaGFuZ2VzZXR0aW5ncycsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgLy8KICAgIC8vIG5vdyB3ZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHVzZXIgc2V0dGluZ3MKICAgIC8vCgogICAgLy8gcGFzc3dvcmQKICAgIGlmKCAkcGFzc3dvcmQgIT0gJycpCiAgICAgIHsKCSRyZXN1bHQgPSAkdGhpcy0+U2V0VXNlciggJHVpZCwgJHVpbmZvWyd1c2VybmFtZSddLCAkcGFzc3dvcmQsICR1aW5mb1snZXhwaXJlcyddICk7CglpZiggJHJlc3VsdFswXSA9PSBGQUxTRSApCgkgIHsKCSAgICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnY2hhbmdlc2V0dGluZ3MnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCSAgfQogICAgICB9CgogICAgLy8gbm93IHRoZSBwcm9wZXJ0aWVzCiAgICAkdGhpcy0+RGVsZXRlVXNlclByb3BlcnR5RnVsbCggIiIsICR1aWQsIHRydWUgKTsKCiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCAnL15oaWRkZW5fLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0ciggJGtleSwgc3RybGVuKCdoaWRkZW5fJykpOwoJICAkYXJyID0gc3BsaXQoIjsiLCRwYXJhbXNbJGtleV0pOwoJICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0XycuJHByb3BuYW1lXSApICkKCSAgICB7CgkgICAgICAkdmFsID0gJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdOwoJICAgICAgJHJldCA9ICR0aGlzLT5TZXRVc2VyUHJvcGVydHlGdWxsKCAkcHJvcG5hbWUsICR2YWwsICR1aWQgKTsKCSAgICAgIGlmKCAkcmV0ID09IGZhbHNlICkKCQl7CgkJICAkcGFyYW1zWydlcnJvciddID0gMTsKCQkgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5sYW5nKCdlcnJvcicpOwoJCSAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdjaGFuZ2VzZXR0aW5ncycsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJCSAgcmV0dXJuOwoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZXR1cm50byddICkgKQogICAgICB7CgkkaWQgPSBDb250ZW50TWFuYWdlcjo6R2V0UGFnZUlERnJvbUFsaWFzKCAkcGFyYW1zWydpbnB1dF9yZXR1cm50byddICk7CglpZiggJGlkICkKCSAgewoJICAgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRpZCApOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CgogICAgLy8gYW5kIHJlZGlyZWN0IGJhY2sgdG8gZGVmYXVsdAogICAgJHRoaXMtPlJlZGlyZWN0Q29udGVudCggQ29udGVudE1hbmFnZXI6OkdldERlZmF1bHRQYWdlSUQoKSApOwogIH0KCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkFkbWluVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gYSBmb3JtIGZvciBwZXJmb3JtaW5nIHZhcmlvdXMgYWRtaW4gdGFza3MKICAgIC8vIGxpa2UgZXhwb3J0aW5nIHVzZXJzIHRvIENTViwgcmVzZXR0aW5nIGV4cGlyeSBkYXRlcywgZXRjLCBldGMuCiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnZG9fYWRtaW50YXNrcycgKSApOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2V4cG9ydCcsJHRoaXMtPkxhbmcoJ3Byb21wdF9leHBvcnRjc3YnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2V4cG9ydCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnYnV0dG9uX2V4cG9ydCcsCgkJCQkJCSAgICR0aGlzLT5MYW5nKCdleHBvcnRjc3YnKSkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbnRhc2tzLnRwbCcpOwogIH0KCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkFkZEdyb3VwUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgICRwcm9wZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm5zKCk7CiAgICBpZiggY291bnQoJHByb3BkZWZuKSA9PSAwICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Byb3BlcnRpZXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsJHBhcmFtc1snZXJyb3InXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCRwYXJhbXNbJ21lc3NhZ2UnXSk7CiAgICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCAkdGhpcy0+TGFuZygnYWRkZ3JvdXAnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19hZGRncm91cCcsCgkJCQkJCQkgICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2dyb3VwbmFtZScsCgkJCSAgICR0aGlzLT5MYW5nICgnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2dyb3VwbmFtZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2dyb3VwbmFtZScsCgkJCQkJCSAgICIiLCAyMCwgODApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ncm91cGRlc2MnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZ3JvdXBkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfZ3JvdXBkZXNjJywKCQkJCQkJICAgIiIsIDgwLCAyNTUpKTsgICAgCgogICAgLy8gZGlzcGxheSBhIGxpc3Qgb2YgdGhlIHByb3BlcnRpZXMgaW4gYSBmb3JtCiAgICAvLyB0byBhbGxvdyB0aGUgdXNlciB0byBwaWNrIHdoaWNoIG9uZXMgYXJlIHJlcXVpcmVkIGFuZCB3aGljaCBvbmVzIGFyZW50LgogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKICAgICRrZXlzID0gYXJyYXlfa2V5cygkdGhpcy0+dHlwZXMpOwogICAgJG9wdGlvbnMgPSBhcnJheSggJHRoaXMtPkxhbmcoJ29mZicpID0+IDAsCgkJICAgICAgJHRoaXMtPkxhbmcoJ29wdGlvbmFsJykgPT4gMSwKCQkgICAgICAkdGhpcy0+TGFuZygncmVxdWlyZWQnKSA9PiAyLAoJCSAgICAgICR0aGlzLT5MYW5nKCdoaWRkZW4nKSA9PiAzKTsKICAgIAogICAgZm9yZWFjaCggJHByb3BkZWZuIGFzICRkZWZuICkKICAgICAgewoJJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgICAgICRvbmVyb3ctPm5hbWUgPSAkZGVmblsnbmFtZSddOwogICAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKCSRvbmVyb3ctPnR5cGUgPSAkdGhpcy0+TGFuZyggJGtleXNbJGRlZm5bJ3R5cGUnXV0gKTsKCSRvbmVyb3ctPnNvcnRvcmRlciA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0X3NvcnRvcmRlcl8nLiRkZWZuWyduYW1lJ10sICcnLCAzLCAyICk7Cgkkb25lcm93LT5yZXF1aXJlZCA9ICR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoICRpZCwgJ2lucHV0X3JlcXVpcmVkXycuJGRlZm5bJ25hbWUnXSwgJG9wdGlvbnMgKTsKCSRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcGNvdW50Jyxjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc29ydG9yZGVydGV4dCcsICR0aGlzLT5MYW5nKCdzb3J0b3JkZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ25hbWV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0dGV4dCcsICR0aGlzLT5MYW5nKCdwcm9tcHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3R5cGV0ZXh0JywkdGhpcy0+TGFuZygndHlwZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncmVxdWlyZWR0ZXh0JywkdGhpcy0+TGFuZygncmVxdWlyZWQnKSk7CgogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRncm91cC50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQWRkUHJvcGVydHlQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKXsKICAgICAgaWYoIGlzc2V0KCRwYXJhbXNbJ29yaWdfdHlwZSddKSAmJiAkcGFyYW1zWydvcmlnX3R5cGUnXSA9PSAkcGFyYW1zWyduZXdfdHlwZSddICl7CgkkcGFyYW1zWydpbnB1dF90eXBlJ10gPSAkcGFyYW1zWyduZXdfdHlwZSddOwoJJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RvX2VkaXRwcm9wJywkcmV0dXJuaWQsICRwYXJhbXMpOwoJcmV0dXJuOwogICAgICB9CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsIAoJCQkgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCdlZGl0cHJvcCcsJHJldHVybmlkKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2hpZGRlbicsCgkJCSAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwncHJvcG5hbWUnLCRwYXJhbXNbJ2VkaXRwcm9wJ10pKTsKICAgIH0KICAgIGVsc2UgCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsJ2FkZHByb3AyJywkcmV0dXJuaWQpKTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbmZvbXNnMScsCgkJCSAgJHRoaXMtPkxhbmcoJ21zZ19kb250Y3JlYXRldXNlcm5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdlbmRmb3JtJywKCQkJICAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddICk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQogICAgCiAgICAkbmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X25hbWUnXSApICkgJG5hbWUgPSAkcGFyYW1zWydpbnB1dF9uYW1lJ107CiAgICAkcHJvbXB0ID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcHJvbXB0J10gKSApICRwcm9tcHQgPSAkcGFyYW1zWydpbnB1dF9wcm9tcHQnXTsKICAgICR0eXBlID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbmV3X3R5cGUnXSkgKSB7CiAgICAgICR0eXBlID0gJHBhcmFtc1snbmV3X3R5cGUnXTsKICAgIH0gZWxzZSBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfdHlwZSddKSApIHsKICAgICAgJHR5cGUgPSAkcGFyYW1zWydpbnB1dF90eXBlJ107CiAgICB9CiAgICBpZigkdGhpcy0+ZGV2ZGVidWcpewogICAgICBlY2hvICJpbnB1dF90eXBlID0gIiAuICRwYXJhbXNbJ2lucHV0X3R5cGUnXSAuICI8YnI+IjsKICAgICAgZWNobyAidHlwZSA9ICIgLiAkdHlwZSAuICI8YnI+IjsKICAgIH0KICAgIAogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKQl7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5mb21zZzInLCR0aGlzLT5MYW5nKCdlZGl0cHJvcF9pbmZvbXNnJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VkaXRwcm9wJywgIAoJCQkgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ2VkaXRwcm9wJywgJHBhcmFtc1snZWRpdHByb3AnXSkpOwogICAgICAKICAgICAgaWYoICR0eXBlID09IDAgfHwgJHR5cGUgPT0gMiApeyAvLyB0ZXh0IG9yIGVtYWlsIGlucHV0CgkkbGVuZ3RoID0gJyc7CglpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApIHsKCSAgJGxlbmd0aCA9ICRwYXJhbXNbJ2lucHV0X2xlbmd0aCddOwoJfQoJJG1heGxlbmd0aCA9ICcnOwoJaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X21heGxlbmd0aCddICkgKSB7CgkgICRtYXhsZW5ndGggPSAkcGFyYW1zWydpbnB1dF9tYXhsZW5ndGgnXTsKCX0KCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0JywkdGhpcy0+TGFuZygnbGVuZ3RoJykKCQkJICAgICAgLiR0aGlzLT5MYW5nKCdsZW5ndGhjb21tZW50JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9sZW5ndGgnLCRsZW5ndGgsIDMsIDMgKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDInLCR0aGlzLT5MYW5nKCdtYXhsZW5ndGgnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MicsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9tYXhsZW5ndGgnLCRtYXhsZW5ndGgsIDMsIDMgKSk7CiAgICAgIH0gZWxzZSBpZigkdHlwZSA9PSA0KXsgLy8gZHJvcGRvd24KCSRzZWxvcHRpb25zID0gJHRoaXMtPkdldFNlbGVjdE9wdGlvbnMoICRuYW1lLCAxICk7Cgkkc2Vsb3B0aW9uc1N0ciA9IGltcGxvZGUoIlxuIiwgJHNlbG9wdGlvbnMpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHQnLCR0aGlzLT5MYW5nKCdzZWxvcHRpb25zJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dCcsICAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCAkaWQsICRzZWxvcHRpb25zU3RyLCAnaW5wdXRfZXh0cmEnKSk7CiAgICAgIH0KICAgIH0KICAgIAogICAgJHN1Ym1pdCA9ICR0aGlzLT5MYW5nKCduZXh0Jyk7CiAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRwcm9wJ10gKSApIAogICAgICB7CgkkdGl0bGUgPSAkdGhpcy0+TGFuZygnZWRpdHByb3AnKTsKCSRzdWJtaXQgPSAkdGhpcy0+TGFuZygnc3VibWl0Jyk7CiAgICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3RpdGxlJywgJHRpdGxlICk7CiAgICAkaWR4ID0gZmluZF9pbmRleF9vZl92YWx1ZSgkdGhpcy0+dHlwZXMsJHR5cGUsLTEpOwogICAgJHR5cGVzID0gJHRoaXMtPmxhbmdpZnlLZXlzKCR0aGlzLT50eXBlcyk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X25hbWUnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9uYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfbmFtZScsJG5hbWUsIDMwLCAzMCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3Byb21wdCcsJHRoaXMtPkxhbmcoJ3Byb21wdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcHJvbXB0JywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfcHJvbXB0JywkcHJvbXB0LCA1MCwgODAgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF90eXBlJywkdGhpcy0+TGFuZygndHlwZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdHlwZScsICAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93biggJGlkLCAnaW5wdXRfdHlwZScsICR0eXBlcywgCgkJCQkJCSAgICAgICRpZHgsICR0eXBlKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ29yaWdfdHlwZScsICAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnb3JpZ190eXBlJywgJHR5cGUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywgJHN1Ym1pdCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJICAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRkcHJvcC50cGwnKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluQWRkUHJvcGVydHlQYWdlMiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCRwYXJhbXNbJ2lucHV0X3R5cGUnXSA9PSAxIHx8IC8vY2hlY2tib3gKICAgICAgICRwYXJhbXNbJ2lucHV0X3R5cGUnXSA9PSAzICl7IC8vdGV4dGFyZWEKICAgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlZGl0cHJvcCddICkgKSB7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZG9fZWRpdHByb3AnLCRyZXR1cm5pZCwgJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0gZWxzZSB7CgkkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZG9fYWRkcHJvcCcsJHJldHVybmlkLCAkcGFyYW1zKTsKCXJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZWRpdHByb3AnXSApICkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLCAKCQkJICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fZWRpdHByb3AnLCRyZXR1cm5pZCkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdoaWRkZW4nLAoJCQkgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ3Byb3BuYW1lJywkcGFyYW1zWydlZGl0cHJvcCddKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdzdGFydGZvcm0nLCAKCQkJICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fYWRkcHJvcCcsJHJldHVybmlkKSk7CiAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZW5kZm9ybScsICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkcGFyYW1zWydtZXNzYWdlJ10gKTsKICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkJewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgfQoKICAgIGlmICgkcGFyYW1zWydpbnB1dF90eXBlJ10gPT0gNCkgeyAvL2Ryb3AtZG93bgogICAgICAkc2Vsb3B0aW9ucyA9ICcnOwogICAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfc2Vsb3B0aW9ucyddICkgKSB7Cgkkc2Vsb3B0aW9ucyA9ICRwYXJhbXNbJ2lucHV0X3NlbG9wdGlvbnMnXTsKICAgICAgfQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDEnLCR0aGlzLT5MYW5nKCdzZWxvcHRpb25zJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MScsICAKCQkJICAgICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwgJGlkLCAkc2Vsb3B0aW9ucywgJ2lucHV0X3NlbG9wdGlvbnMnKSk7CiAgICB9IGVsc2UgeyAvL3RleHQgaW5wdXQgb3IgZW1haWwKICAgICAgJGxlbmd0aCA9ICcnOwogICAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfbGVuZ3RoJ10gKSApIHsKCSRsZW5ndGggPSAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXTsKICAgICAgfQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDEnLCR0aGlzLT5MYW5nKCdsZW5ndGgnKQoJCQkgICAgLiR0aGlzLT5MYW5nKCdsZW5ndGhjb21tZW50JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0MScsCgkJCSAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfbGVuZ3RoJywkbGVuZ3RoLCAzLCAzICkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdDInLCR0aGlzLT5MYW5nKCdtYXhsZW5ndGgnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXQyJywKCQkJICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9tYXhsZW5ndGgnLCRsZW5ndGgsIDMsIDMgKSk7CiAgICB9CiAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2VkaXRpbmcnXSApICkgewogICAgICAkdGl0bGUgPSAkdGhpcy0+TGFuZygnZWRpdHByb3AnKTsKICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3RpdGxlJywgJHRpdGxlICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X25hbWUnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsICdpbnB1dF9uYW1lJywgJHBhcmFtc1snaW5wdXRfbmFtZSddKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3Byb21wdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcHJvbXB0JywkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF90eXBlJywgIAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsICdpbnB1dF90eXBlJywgJHBhcmFtc1snaW5wdXRfdHlwZSddKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRkcHJvcDIudHBsJyk7CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkFkZFVzZXJTdGVwMVBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydjYW5jZWwnXSApICkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1c2VycycgKTsKICAgICAgfQoKICAgICRnaWQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcsIC0xKTsKICAgIGlmKCAkZ2lkICE9IC0xICkKICAgICAgewoJLy8gdGhlIGRlZmF1bHQgZ3JvdXAgaGFzIGJlZW4gc2V0CgkvLyBzbyB3ZSdsbCBwdXQgdGhpcyBpbiB0aGUgbWVtYmVyb2YgcGFyYW1ldGVyCgkvLyBpZiBpdCdzIG5vdCBhbHJlYWR5IHNldAoJaWYoICFpc3NldCggJHBhcmFtc1snbWVtYmVyb2YnXSApICkKCSAgewoJICAgICRwYXJhbXNbJ21lbWJlcm9mXycuJGdpZF0gPSAkZ2lkOwoJICB9CiAgICAgIH0KCiAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblVzZXJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkcGFyYW1zWydtZXNzYWdlJ10gKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSApOwogICAgICB9CgogICAgLy8gY2FsY3VsYXRlIHRoZSB1bmlvbiAoeWVwLCB1bmlvbiwgbm90IGludGVyc2VjdGlvbikKICAgIC8vIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiBhbGwgb2YgdGhlIG1lbWJlciBncm91cHMKICAgIC8vIHByZWZlcnJpbmcgYWxsIGl0ZW1zIHdpdGggYSBwcmlvcml0eSBvZiAyCiAgICAkcHJvcGVydGllcyA9IGFycmF5KCk7CiAgICAkZ3JvdXBzID0gMDsKICAgIGZvcmVhY2goICRwYXJhbXMgYXMgJGtleSA9PiAkdmFsICkKICAgIHsKICAgICAgaWYoIHByZWdfbWF0Y2goICcvXm1lbWJlcm9mXy8nLCAka2V5ICkgKQoJewoJICAkZ3JvdXBzKys7CgkgIC8vIGdldCB0aGUgZ3JvdXBpZCBmcm9tIHRoZSBjaGVja2JveAoJICAkZ3JwaWQgPSBzdWJzdHIoJGtleSxzdHJsZW4oJ21lbWJlcm9mXycpKTsKCSAgCgkgIC8vIGhhdmUgdGhlIGdyb3VwIGlkLCBub3cgZ2V0IGEgbGlzdCBvZiB0aGUgcHJvcGVydAoJICAkcHJvcHJlbGF0aW9ucyA9ICR0aGlzLT5HZXRHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKTsKCSAgJHByb3BlcnRpZXMgPSBhcnJheV9tZXJnZV9ieV9uYW1lX3JlcXVpcmVkKCAkcHJvcGVydGllcywgJHByb3ByZWxhdGlvbnMgKTsKCSAgdWFzb3J0KCAkcHJvcGVydGllcywgJ2NvbXBhcmVfZWxlbWVudHNfYnlfc29ydG9yZGVyX2tleScgKTsKCX0KICAgIH0JICAKICAgIGlmKCAkZ3JvdXBzID09IDAgKQogICAgICB7CglpZiggJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSA9PSAxICkKCSAgewoJICAgICRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9vbmVncm91cHJlcXVpcmVkJyk7CgkgICAgJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2FkZHVzZXInLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCSAgICByZXR1cm47CgkgIH0KCQoJJHRoaXMtPm15UmVkaXJlY3QoICRpZCwgJ2RvX2FkZHVzZXIzJywgJHJldHVybmlkLCAkcGFyYW1zICk7CiAgICAgIH0KICAgIGlmKCBjb3VudCgkcHJvcGVydGllcykgPT0gMCApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3Byb3BlcnRpZXMnKTsKCSR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdhZGR1c2VyJywgJHJldHVybmlkLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgd2UncmUgcmVhZHkgdG8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgZm9yZWFjaCggJHByb3BlcnRpZXMgYXMgJHByb3AgKQogICAgewogICAgICAvLyBnZXQgdGhlIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgJGRlZm4gPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZuKCAkcHJvcFsnbmFtZSddICk7CiAgICAgIAogICAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CgogICAgICAkY29sb3IgPSAnJzsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDIgKSAkY29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdXJpZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAzICkgJGNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9jb2xvcicsJ2dyZWVuJyk7CiAgICAgICRtYXJrZXIgPSAnJzsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDIgKSAkbWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVyaWVkX2ZpZWxkX21hcmtlcicsJyonKTsKICAgICAgaWYoICRwcm9wWydyZXF1aXJlZCddID09IDMgKSAkbWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2hpZGRlbl9maWVsZF9tYXJrZXInLCchIScpOwogICAgICAkb25lcm93LT5yZXF1aXJlZCA9ICgkcHJvcFsncmVxdWlyZWQnXSA9PSAyKTsKICAgICAgJG9uZXJvdy0+Y29sb3IgICAgPSAkY29sb3I7CiAgICAgICRvbmVyb3ctPm1hcmtlciAgID0gJG1hcmtlcjsKICAgICAgJG9uZXJvdy0+aGlkZGVuID0gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnaGlkZGVuXycuJHByb3BbJ25hbWUnXSwKCQkJCQkgICAgIGltcGxvZGUoIjsiLGFycmF5KCRwcm9wWyduYW1lJ10sJGRlZm5bJ3R5cGUnXSwKCQkJCQkJCSAgICAgICAkZGVmblsnbGVuZ3RoJ10sJHByb3BbJ3JlcXVpcmVkJ10sCgkJCQkJCQkgICAgICAgJGRlZm5bJ21heGxlbmd0aCddKSkpOwoKICAgICAgJHZhbCA9IGlzc2V0KCRwYXJhbXNbJ2lucHV0XycuJHByb3BbJ25hbWUnXV0pID8gJHBhcmFtc1snaW5wdXRfJy4kcHJvcFsnbmFtZSddXSA6ICcnOwogICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107CiAgICAgIHN3aXRjaCggJGRlZm5bJ3R5cGUnXSApCgl7CgljYXNlIDA6IC8vIHRleHQKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydtYXhsZW5ndGgnXSApOwoJICBicmVhazsKCgljYXNlIDE6IC8vIGNoZWNrYm94CgkgICRvbmVyb3ctPmNvbnRyb2wgPSBteUNyZWF0ZUlucHV0Q2hlY2tib3goICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwgMSwgJHZhbCApOwoJICBicmVhazsKCgljYXNlIDI6IC8vIGVtYWlsCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF8nLiRwcm9wWyduYW1lJ10sCgkJCQkJCSAgICAgJHZhbCwgJGRlZm5bJ2xlbmd0aCddLCAkZGVmblsnbWF4bGVuZ3RoJ10gKTsKCSAgYnJlYWs7CgoJY2FzZSAzOiAvLyB0ZXh0YXJlYQoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCAkaWQsICR2YWwsICdpbnB1dF8nLiRwcm9wWyduYW1lJ10pOwoJICBicmVhazsKCgljYXNlIDQ6IC8vIGRyb3Bkb3duCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93biggCgkJCQkJCQkkaWQsIAoJCQkJCQkJJ2lucHV0XycuJHByb3BbJ25hbWUnXSwgCgkJCQkJCQkkdGhpcy0+R2V0U2VsZWN0T3B0aW9ucygkZGVmblsnbmFtZSddLCAxKSwgCgkJCQkJCQktMSwgCgkJCQkJCQkkdmFsKTsKCSAgYnJlYWs7Cgl9CgogICAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsIAoJCQkgIG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ3N0ZXAxX3BhcmFtcycsICRwYXJhbXMgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udHJvbGNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdiYWNrJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdiYWNrJywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnYmFjaycpKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3VzZXJfaWQnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4yJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ3VzZXJfaWQnLCRwYXJhbXNbJ3VzZXJfaWQnXSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2VkaXR1c2VyMycsCgkJCQkJCQkgICAgICAkcmV0dXJuaWQpKTsKICAgICAgfQogICAgZWxzZSAKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2FkZHVzZXIzJywKCQkJCQkJCSAgICAgICRyZXR1cm5pZCkpOwogICAgICB9CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSggJ2FkZHVzZXIyLnRwbCcgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluVXNlclBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwoKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJGVkaXRpbmcgPSAwOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydhY3Rpb24nXSApICYmIAoJKCRwYXJhbXNbJ2FjdGlvbiddID09ICdlZGl0dXNlcid8fCAkcGFyYW1zWydhY3Rpb24nXSA9PSAnZG9fZWRpdHVzZXIxJyApICkKICAgICAgewoJJGVkaXRpbmcgPSAxOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLCAKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwndXNlcl9pZCcsJHBhcmFtc1sndXNlcl9pZCddKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2VkaXR1c2VyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAgICAgJ2RvX2VkaXR1c2VyMScsCgkJCQkJCQkgICAgICAkcmV0dXJuaWQpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkxhbmcoJ2FkZHVzZXInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCQkgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICAgICAnZG9fYWRkdXNlcjEnLAoJCQkJCQkJICAgICAgJHJldHVybmlkKSk7CiAgICAgIH0KCiAgICBpZiggaXNzZXQoJHBhcmFtc1snZXJyb3InXSkgKQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywkcGFyYW1zWydlcnJvciddKTsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydtZXNzYWdlJ10pICkKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywkcGFyYW1zWydtZXNzYWdlJ10pOwogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSkgKQogICAgICAkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSkgKQogICAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgJHJlcGVhdHBhc3N3b3JkID0gJyc7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSkgKQogICAgICAkcmVwZWF0cGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3JlcGVhdHBhc3N3b3JkJ10pOwogICAgJGV4cGlyZXMgPSAnJzsKICAgIGlmKCBpc3NldCgkcGFyYW1zWydpbnB1dF9leHBpcmVzJ10pICkKICAgICAgJGV4cGlyZXMgPSB0cmltKCRwYXJhbXNbJ2lucHV0X2V4cGlyZXMnXSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCduZXh0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3VzZXJuYW1lJywKCQkJICAgJHRoaXMtPkxhbmcgKCd1c2VybmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3VzZXJuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfdXNlcm5hbWUnLAoJCQkJCQkgICAkdXNlcm5hbWUsIDIwLCAKCQkJCQkJICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3Bhc3N3b3JkJywKCQkJICAgJHRoaXMtPkxhbmcgKCdwYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3Bhc3N3b3JkJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQgKCRpZCwgJ2lucHV0X3Bhc3N3b3JkJywKCQkJCQkJICAgICAgICRwYXNzd29yZCwgMjAsIAoJCQkJCQkgICAgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF9wYXNzd29yZGxlbmd0aCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3JlcGVhdHBhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCAoJGlkLCAnaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkJCQkgICAgICAgJHJlcGVhdHBhc3N3b3JkLCAyMCwgCgkJCQkJCSAgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJykpKTsKCiAgICBpZiggJGVkaXRpbmcgPT0gMSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9fcGFzc3dvcmQnLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdpbmZvX2FkbWluX3Bhc3N3b3JkJykpOwoJCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX3JlcGVhdHBhc3N3b3JkJywKCQkJICAgICAgICR0aGlzLT5MYW5nICgnaW5mb19hZG1pbl9yZXBlYXRwYXNzd29yZCcpKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9leHBpcmVzJywKCQkJICAgJHRoaXMtPkxhbmcoJ2V4cGlyZXMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzX2RhdGVwcmVmaXgnLCAkaWQuJ2V4cGlyZXNkYXRlXycpOwogICAgJGV4cGlyZXNkYXRlID0gc3RydG90aW1lKCcrMTAgeWVhcnMnLCB0aW1lKCkpOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddICkgKQogICAgICB7CgkkZXhwaXJlc2RhdGUgPSAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzZGF0ZScsICRleHBpcmVzZGF0ZSApOwogICAgCgogICAgLy8gRGlzcGxheSB0aGlzIHVzZXIncyBwcm9wZXJ0aWVzIGFuZCBhbGxvdyB1cyB0byBlZGl0IHRoZW0KCiAgICAvLyBkaXNwbGF5IGFuZCBlZGl0IGdyb3VwcwogICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0Z3JvdXBzJykgKQogICAgICB7CgkvLyBub3cgZGlzcGxheSBhIGxpc3Qgb2YgZ3JvdXBzIHRoYXQgdGhpcyB1c2VyIG1heSBvcHRpb25hbGx5IGJlIGluCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdpZHRleHQnLCAkdGhpcy0+TGFuZygnaWQnKSApOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnbmFtZXRleHQnLCAkdGhpcy0+TGFuZygnbmFtZScpICk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdkZXNjdGV4dCcsICR0aGlzLT5MYW5nKCdkZXNjcmlwdGlvbicpICk7CgkKCSRncm91cHMgPSAkdGhpcy0+R2V0R3JvdXBMaXN0RnVsbCgpOwoJJHJvd2FycmF5ID0gYXJyYXkoKTsKCSRyb3djbGFzcyA9ICdyb3cxJzsKCWZvcmVhY2goICRncm91cHMgYXMgJGdyb3VwICkKCXsKCSAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwoJICAkb25lcm93LT5pZCA9ICRncm91cFsnaWQnXTsKCSAgJG9uZXJvdy0+bmFtZSA9ICRncm91cFsnZ3JvdXBuYW1lJ107CgkgICRvbmVyb3ctPmRlc2MgPSAkZ3JvdXBbJ2dyb3VwZGVzYyddOwoJICAkb25lcm93LT5tZW1iZXIgPSAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsJ21lbWJlcm9mXycuJGdyb3VwWydpZCddLAoJCQkJCQkgICRncm91cFsnaWQnXSwKCQkJCQkJICAoaXNzZXQoJHBhcmFtc1snbWVtYmVyb2ZfJy4kZ3JvdXBbJ2lkJ11dKSA/IAoJCQkJCQkgICAkcGFyYW1zWydtZW1iZXJvZl8nLiRncm91cFsnaWQnXV0gOiAtMSkpOwoJICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCSAgCgkgIGFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkgICgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCX0KCSR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbWNvdW50Jyxjb3VudCgkcm93YXJyYXkpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRyb3dhcnJheSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BhZGQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoICRpZCwgJ3Byb3BhZGQnLCAKCQkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWRkJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZ3JvdXBzdGl0bGUnLCAkdGhpcy0+TGFuZygnZ3JvdXBzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wZXJ0aWVzdGl0bGUnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAncHJvcHMnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpLiIuLi4iKSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkZHVzZXIxLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybmlkID0gLTEpIAogIHsKICAgIGlmKCAhIGlzc2V0KCRwYXJhbXNbJ2FjdGlvbiddKSApCiAgICAgIHsKCSRwYXJhbXNbJ2FjdGlvbiddID0gJGFjdGlvbjsKICAgICAgfQogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CiAgICAgIGNhc2UgJ2FkZGdyb3VwJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkZ3JvdXAnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkR3JvdXBQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdhZGRwcm9wJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkcHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRQcm9wZXJ0eVBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIC8vIFRoaXMgaXMgcmVzcG9uc2libGUgZm9yIHN0ZXAgMiBpbiBhZGRpbmcgYSBwcm9wZXJ0eQogICAgICBjYXNlICdhZGRwcm9wMic6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkUHJvcGVydHlQYWdlMiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnYWRkdXNlcic6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAxUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAiY2hhbmdlc2V0dGluZ3MiOwogICAgICAgIHsKCSAgJHRoaXMtPl9EaXNwbGF5VXNlclNldHRpbmdzUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSAiZGVmYXVsdCI6IAoJewoJICAkdGhpcy0+X0RvVXNlckFjdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICJkZWZhdWx0YWRtaW4iOiAKCXsKCSAgaWYgKCR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCkpICB7CgkgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5QYW5lbCgkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwoJICB9IGVsc2UgewoJICAgIGVjaG8gIkJyZWFraW5nIGFuIGVudHJ5LCBhcmUgd2U/IjsKCSAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2FkZGdyb3VwJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkZ3JvdXAnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fYWRkcHJvcCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHByb3AnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRQcm9wKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19hZGR1c2VyMSc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZGRVc2VyU3RlcDEoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlIAoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIAogICAgICBjYXNlICdkb19hZGR1c2VyMic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2FkZHVzZXInICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluQWRkVXNlclN0ZXAyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgCiAgICAgIGNhc2UgJ2RvX2FkZHVzZXIzJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnYWRkdXNlcicgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0FkZFVzZXJTdGVwMiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UgCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fYWRtaW50YXNrcyc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndXNlcnNuZ3JvdXBzJykgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZG1pbkFjdGlvbnMoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZGVsZXRlZ3JvdXAnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdyZW1vdmVncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9EZWxldGVHcm91cCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19kZWxldGVwcm9wJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZGVsZXRlcHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0RlbGV0ZVByb3BlcnR5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZSAKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19kZWxldGV1c2VyJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAncmVtb3ZldXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9EZWxldGVVc2VyKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXRncm91cCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXRncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0R3JvdXAoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZWRpdHByb3AnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0VkaXRQcm9wZXJ0eSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb19lZGl0dXNlcjEnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0dXNlcnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9FZGl0VXNlclN0ZXAxKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXR1c2VyMic6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXR1c2VycycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5BZGRVc2VyU3RlcDJQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2VkaXR1c2VyMyc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXR1c2VycycgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9Eb0VkaXRVc2VyU3RlcDMoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fZm9yZ290cHcnOgoJewoJICAkdGhpcy0+X0RvRm9yZ290UGFzc3dvcmQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9faGFuZGxlcHJvcGVydHknOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJlZnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRQcm9wZXJ0aWVzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX2xvZ2luJzoKCXsKCSAgJHRoaXMtPl9Eb0xvZ2luKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGNoYW5nZXNldHRpbmdzdGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRDaGFuZ2VTZXR0aW5nc1RlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGZvcmdvdHB3dGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRGb3Jnb3RQV1RlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGxvZ2ludGVtcGxhdGUnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICd0ZW1wbGF0ZXMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRMb2dpblRlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3NldGxvZ291dHRlbXBsYXRlJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAndGVtcGxhdGVzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0RvU2V0TG9nb3V0VGVtcGxhdGUoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnZG9fc2V0cHJlZnMnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJlZnMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9TZXRQcmVmcyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdkb191c2VyY2hhbmdlc2V0dGluZ3MnOgoJewoJICAkdGhpcy0+X0RvVXNlckNoYW5nZVNldHRpbmdzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2RvX3ZlcmlmeWNvZGUnOgoJewoJICAkdGhpcy0+X0RvUmVzZXRVc2VyQWNjb3VudCgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2VkaXRncm91cCc6Cgl7CgkgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucyggJ2VkaXRncm91cHMnICkgKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluRWRpdEdyb3VwUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAKICAgICAgY2FzZSAnZWRpdHByb3AnOgoJewoJICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoICdlZGl0cHJvcCcgKSApCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5FZGl0UHJvcGVydHlQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2VkaXR1c2VyJzoKCXsKCSAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCAnZWRpdHVzZXJzJyApICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pbkVkaXRVc2VyU3RlcDFQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdmb3Jnb3Rwdyc6Cgl7CgkgIC8vIHVzZXIgaXRlbQoJICAkdGhpcy0+X0Rpc3BsYXlVc2VyRm9yZ290UGFzc3dvcmRQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KCiAgICAgIGNhc2UgJ2xvZ291dCc6Cgl7CgkgICR0aGlzLT5fRG9Mb2dvdXQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAndmVyaWZ5Y29kZSc6Cgl7CgkgICR0aGlzLT5fRGlzcGxheVVzZXJGb3Jnb3RQYXNzd29yZFZlcmlmaWNhdGlvblBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICB9CiAgfQoKCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pbkVkaXRHcm91cFBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snZ3JvdXBfaWQnXSApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIG5vdyBnZXQgdGhlIGdyb3VwIGluZm8KICAgICRncm91cCA9ICR0aGlzLT5HZXRHcm91cEluZm8oICRwYXJhbXNbJ2dyb3VwX2lkJ10gKTsKICAgIGlmKCAhaXNzZXQoICRncm91cFsnaWQnXSApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJGdyb3VwWzFdICk7CgkJCQkgCglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsJHBhcmFtc1snZXJyb3InXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCRwYXJhbXNbJ21lc3NhZ2UnXSk7CiAgICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCAkdGhpcy0+TGFuZygnZWRpdGdyb3VwJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2dyb3VwX2lkJywgJGdyb3VwWydpZCddICkgKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAnZG9fZWRpdGdyb3VwJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpLCAnJywgJycsIAoJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2NvbmZpcm1fZWRpdGdyb3VwJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfZ3JvdXBuYW1lJywkdGhpcy0+TGFuZygnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2dyb3VwbmFtZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2dyb3VwbmFtZScsCgkJCQkJCSAgICRncm91cFsnZ3JvdXBuYW1lJ10sIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2dyb3VwZGVzYycsCgkJCSAgICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9ncm91cGRlc2MnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9ncm91cGRlc2MnLAoJCQkJCQkgICAkZ3JvdXBbJ2dyb3VwZGVzYyddLCA4MCwgMjU1KSk7CgogICAgLy8gZGlzcGxheSBhIGxpc3Qgb2YgdGhlIHByb3BlcnRpZXMgaW4gYSBmb3JtCiAgICAvLyB0byBhbGxvdyB0aGUgdXNlciB0byBwaWNrIHdoaWNoIG9uZXMgYXJlIHJlcXVpcmVkIGFuZCB3aGljaCBvbmVzIGFyZW50LgogICAgJHByb3BkZWZuID0gJHRoaXMtPkdldFByb3BlcnR5RGVmbnMoKTsKICAgICRncm91cHByb3BtYXAgPSAkdGhpcy0+R2V0R3JvdXBQcm9wZXJ0eVJlbGF0aW9ucyggJGdyb3VwWydpZCddICk7CiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgJGtleXMgPSBhcnJheV9rZXlzKCR0aGlzLT50eXBlcyk7CiAgICAkb3B0aW9ucyA9IGFycmF5KCAkdGhpcy0+TGFuZygnb2ZmJykgPT4gMCwKCQkgICAgICAkdGhpcy0+TGFuZygnb3B0aW9uYWwnKSA9PiAxLAoJCSAgICAgICR0aGlzLT5MYW5nKCdyZXF1aXJlZCcpID0+IDIsCgkJICAgICAgJHRoaXMtPkxhbmcoJ2hpZGRlbicpID0+IDMpOwogICAgZm9yZWFjaCggJHByb3BkZWZuIGFzICRkZWZuICkKICAgICAgewoJLy8gZmluZCB0aGUgZ3JvdXAgcHJvcGVydHkgbWFwIGZvciB0aGlzIGdyb3VwCgkvLyBpZiBpdCBleGlzdHMsIGlmIGl0IGRvZXNuJ3QsIHRoZW4gdGhlIHZhbHVlIGlzIC0xCgkkc2VsZWN0ZWR2YWx1ZSA9IDA7Cgkkc29ydG9yZGVyID0gJyc7Cglmb3JlYWNoKCAkZ3JvdXBwcm9wbWFwIGFzICRtYXAgKQoJewoJICBpZiggJG1hcFsnbmFtZSddID09ICRkZWZuWyduYW1lJ10gKQoJICAgIHsKCSAgICAgICRzZWxlY3RlZHZhbHVlID0gJG1hcFsncmVxdWlyZWQnXTsKCSAgICAgICRzb3J0b3JkZXIgPSAkbWFwWydzb3J0X2tleSddOwoJICAgICAgYnJlYWs7CgkgICAgfQoJfQoJJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgICAgICRvbmVyb3ctPm5hbWUgPSAkZGVmblsnbmFtZSddOwogICAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKCSRvbmVyb3ctPnR5cGUgPSAkdGhpcy0+TGFuZyggJGtleXNbJGRlZm5bJ3R5cGUnXV0gKTsKCSRvbmVyb3ctPnNvcnRvcmRlciA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0X3NvcnRvcmRlcl8nLiRkZWZuWyduYW1lJ10sCgkJCQkJCSAgICAgJHNvcnRvcmRlciwgMywgMik7Cgkkb25lcm93LT5yZXF1aXJlZCA9ICR0aGlzLT5DcmVhdGVJbnB1dFJhZGlvR3JvdXAoICRpZCwgJ2lucHV0X3JlcXVpcmVkXycuJGRlZm5bJ25hbWUnXSwgCgkJCQkJCQkgICRvcHRpb25zLCRzZWxlY3RlZHZhbHVlICApOwoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CgoJYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcHMnLCAkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wY291bnQnLGNvdW50KCRyb3dhcnJheSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdHRleHQnLCAkdGhpcy0+TGFuZygncHJvbXB0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0eXBldGV4dCcsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NvcnRvcmRlcnRleHQnLCR0aGlzLT5MYW5nKCdzb3J0b3JkZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3JlcXVpcmVkdGV4dCcsJHRoaXMtPkxhbmcoJ3JlcXVpcmVkJykpOwoKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGdyb3VwLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5FZGl0UHJvcGVydHlQYWdlKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIEZvciB0aGUgYmVsb3cgY29udHJvbCB0eXBlcyBkb24ndCByZWRyYXcgdGhlIHBhZ2UsIGp1c3QgdXBkYXRlLgogICAgLy8gT3RoZXJ3aXNlIHdlJ2xsIG5lZWQgdG8gcmVkcmF3IHRoZSBwYWdlIHdpdGggYWRkaXRpb25hbCBwYXJhbXMsCiAgICAvLyBzdWNoIGFzIGxlbmd0aCBvciBkcm9wZG93biBzZWxlY3Qgb3B0aW9ucy4KICAgIC8vIFRoZSBpbnB1dCB0eXBlIHdpbGwgYmUga25vd24gb25seSBhdCB0aGUgc2Vjb25kIGdvLgogICAgaWYoJHBhcmFtc1snaW5wdXRfdHlwZSddID09IDEgfHwgLy9jaGVja2JveAogICAgICAgJHBhcmFtc1snaW5wdXRfdHlwZSddID09IDIgfHwgLy9lbWFpbAogICAgICAgJHBhcmFtc1snaW5wdXRfdHlwZSddID09IDMgKXsgLy90ZXh0YXJlYQogICAgICAkdGhpcy0+UmVkaXJlY3QoJGlkLCAnZG9fZWRpdHByb3AnLCRyZXR1cm5pZCwgJHBhcmFtcyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBkaXNwbGF5IGEgZnVua3kgcGFnZSB0byB0aGUgdXNlciB0byBhbGxvdyBoaW0gdG8gZWRpdCBhIHByb3BlcnR5IGRlZmluaXRpb24KICAgIC8vIGFjdHVhbGx5LCB3ZSdsbCBqdXN0IHNldCBzb21lIHN0dWZmIHVwIGFuZCB1c2UgdGhlIGFkZCBwcm9wZXJ0eSBwYWdlCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydwcm9wbmFtZSddICkgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljZW50cGFyYW1zJyk7CgkkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwncHJvcGVydGllcycsJHBhcmFtcyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkZGVmbiA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm4oICRwYXJhbXNbJ3Byb3BuYW1lJ10gKTsKICAgIGlmKCAkZGVmbiA9PSBGQUxTRSApIAogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3Byb3Bub3Rmb3VuZCcpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ3Byb3BlcnRpZXMnLCRwYXJhbXNbJ3Byb3BuYW1lJ10pOwoJcmV0dXJuOwogICAgICB9CiAgICAKICAgICRwYXJhbXNbJ2VkaXRwcm9wJ10JPSAkcGFyYW1zWydwcm9wbmFtZSddOwogICAgaWYgKCFpc3NldCgkcGFyYW1zWydpbnB1dF9uYW1lJ10pKSB7CiAgICAgICRwYXJhbXNbJ2lucHV0X25hbWUnXSAJPSAkcGFyYW1zWydwcm9wbmFtZSddOwogICAgfQogICAgaWYgKCFpc3NldCgkcGFyYW1zWydpbnB1dF9wcm9tcHQnXSkpIHsKICAgICAgJHBhcmFtc1snaW5wdXRfcHJvbXB0J10JPSAkZGVmblsncHJvbXB0J107CiAgICB9CiAgICBpZihpc3NldCgkcGFyYW1zWydpbnB1dF90eXBlJ10pKXsKICAgICAgJHBhcmFtc1snbmV3X3R5cGUnXQk9ICRwYXJhbXNbJ2lucHV0X3R5cGUnXTsKICAgIH0KICAgICRwYXJhbXNbJ2lucHV0X3R5cGUnXQk9ICRkZWZuWyd0eXBlJ107CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ2lucHV0X2xlbmd0aCddKSkgewogICAgICAkcGFyYW1zWydpbnB1dF9sZW5ndGgnXQk9ICRkZWZuWydsZW5ndGgnXTsKICAgIH0KICAgIGlmICghaXNzZXQoJHBhcmFtc1snaW5wdXRfbWF4bGVuZ3RoJ10pKSB7CiAgICAgICRwYXJhbXNbJ2lucHV0X21heGxlbmd0aCddID0gJGRlZm5bJ21heGxlbmd0aCddOwogICAgfQoKICAgICR0aGlzLT5teVJlZGlyZWN0KCRpZCwnYWRkcHJvcCcsJHJldHVybmlkLCAkcGFyYW1zKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluRWRpdFVzZXJTdGVwMVBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1sndXNlcl9pZCddICkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gbm93IGdldCB0aGUgdXNlciBpbmZvCiAgICAkdXNlciA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHBhcmFtc1sndXNlcl9pZCddICk7CiAgICBpZiggJHVzZXJbMF0gPT0gZmFsc2UgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdXNlclsxXSApOwoJcmV0dXJuOwogICAgICB9CiAgICAkdXNlciA9ICR1c2VyWzFdOwoKICAgIC8vIGdldCB0aGUgdXNlciBwcm9wZXJ0aWVzCiAgICAkcHJvcHMgPSAkdGhpcy0+R2V0VXNlclByb3BlcnRpZXMoICRwYXJhbXNbJ3VzZXJfaWQnXSApOwogICAgCiAgICAvLyBnZXQgdGhlIGdyb3VwIG1lbWJlcnNoaXBzCiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkcGFyYW1zWyd1c2VyX2lkJ10gKTsKLy8gdG9kbywgdXNlcnMgbWF5IChvcHRpb25hbGx5KSBub3QgYmUgcGFydCBvZiBhbnkgZ3J1b3BzCi8vICAgICBpZiggJGdyb3VwcyA9PSBmYWxzZSApCi8vICAgICAgIHsKLy8gCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdlcnJvcl9tZW1iZXJncm91cHMnKSApOwovLyAJcmV0dXJuOwovLyAgICAgICB9CgogICAgLy8gcG9wdWxhdGUgdGhlIHBhcmFtcyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdHVmZgogICAgLy8gdGhhdCB3ZSBqdXN0IGxvYWRlZAogICAgJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSA9ICR1c2VyWyd1c2VybmFtZSddOwogICAgJHBhcmFtc1snaW5wdXRfZXhwaXJlc2RhdGUnXSA9ICR1c2VyWydleHBpcmVzJ107Ci8vICAgICAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddID0gJHVzZXJbJ3Bhc3N3b3JkJ107ICAvLyB0aGUgcGFzc3dvcmQgcm93IGlzIG1kNSBoYXNoZWQsIGRvbid0IGJvdGhlciBkaXNwbGF5aW5nIGl0Ci8vICAgICAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddID0gJHVzZXJbJ3Bhc3N3b3JkJ107CiAgICAkdXNlcnByb3BzID0gJyc7CiAgICBmb3JlYWNoKCAkcHJvcHMgYXMgJHByb3AgKQogICAgewogICAgICBpZiggJHVzZXJwcm9wcyA9PSAnJyApCgl7CgkgICR1c2VycHJvcHMgPSAkcHJvcFsndGl0bGUnXS4iPSIuJHByb3BbJ2RhdGEnXTsKCX0KICAgICAgZWxzZQoJewoJICAkdXNlcnByb3BzIC49ICIsIi4kcHJvcFsndGl0bGUnXS4iPSIuJHByb3BbJ2RhdGEnXTsKCX0KICAgIH0KICAgICRwYXJhbXNbJ3VzZXJwcm9wcyddID0gJHVzZXJwcm9wczsKCiAgICAkbWVtYmVyb2YgPSAnJzsKICAgIGlmKCAkZ3JvdXBzICE9IGZhbHNlICkKICAgICAgewoJZm9yZWFjaCggJGdyb3VwcyBhcyAkZ3JvdXAgKQoJewoJICAkcGFyYW1zWydtZW1iZXJvZl8nLiRncm91cFsnZ3JvdXBpZCddXSA9ICRncm91cFsnZ3JvdXBpZCddOwoJfQogICAgICB9CgogICAgLy8gYW5kIGRpc3BsYXkgdGhlIHVzZXIgcGFnZQogICAgLy8gdG9kbywgcHV0IGEgcmVkaXJlY3QgaGVyZQogICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5Vc2VyUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheUFkbWluR3JvdXBzVGFiKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldEdyb3VwTGlzdEZ1bGwoKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZ3JvdXBzZm91bmQnLCAkdGhpcy0+TGFuZygnZ3JvdXBzZm91bmQnKSk7CiAgICBmb3JlYWNoKCAkZ3JvdXBzIGFzICRvbmVncm91cCApCiAgICB7CiAgICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnbGlzdGdyb3VwcycpICkKCXsKCSAgJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJICAkb25lcm93LT5pZCA9ICRvbmVncm91cFsnaWQnXTsKCSAgJG9uZXJvdy0+bmFtZSA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ2VkaXRncm91cCcsICRyZXR1cm5pZCwgJG9uZWdyb3VwWydncm91cG5hbWUnXSwKCQkJICAgICAgIGFycmF5ICgnZ3JvdXBfaWQnID0+ICRvbmVncm91cFsnaWQnXSkpOwkJCSAgICAgICAKCSAgJG9uZXJvdy0+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+R2V0UHJvcGVydHlHcm91cFJlbGF0aW9ucygkZGVmblsnbmFtZSddKTsKCiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdlZGl0cHJvcCcpKSAKCXsKCSAgJG9uZXJvdy0+bmFtZSA9IAoJICAgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdlZGl0cHJvcCcsICRyZXR1cm5pZCwgJGRlZm5bJ25hbWUnXSwKCQkJICAgICAgIGFycmF5KCdwcm9wbmFtZScgPT4gJGRlZm5bJ25hbWUnXSkpOwoJfQogICAgICBlbHNlCgl7CgkgICRvbmVyb3ctPm5hbWUgPSAkZGVmblsnbmFtZSddOwoJfQogICAgICAkb25lcm93LT5wcm9tcHQgPSAkZGVmblsncHJvbXB0J107CiAgICAgICRvbmVyb3ctPnR5cGUgPSAkdGhpcy0+TGFuZyggJGtleXNbJGRlZm5bJ3R5cGUnXV0gKTsKICAgICAgJG9uZXJvdy0+bGVuZ3RoID0gJGRlZm5bJ2xlbmd0aCddOwogICAgICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCiAgICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnZWRpdHByb3AnKSkKCXsKCSAgJG9uZXJvdy0+ZWRpdGxpbmsgPQoJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdlZGl0cHJvcCcsICRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZWRpdC5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdlZGl0JyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJICAgICAgIGFycmF5KCdwcm9wbmFtZScgPT4gJGRlZm5bJ25hbWUnXSkpOwoKCSAgaWYoIGNvdW50KCRwcm9wZ3JvdXBzKSA9PSAwICkKCSAgICB7CgkgICAgICAkb25lcm93LT5kZWxldGVsaW5rID0KCQkkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZG9fZGVsZXRlcHJvcCcsICRyZXR1cm5pZCwKCQkJCSAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCQkkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkgICBhcnJheSgncHJvcG5hbWUnID0+ICRkZWZuWyduYW1lJ10sICdwcm9wdHlwZScgPT4gJGRlZm5bJ3R5cGUnXSksIAoJCQkJICAgJHRoaXMtPkxhbmcoJ2NvbmZpcm1fZGVsZXRlX3Byb3AnKSk7CgkgICAgfQoJfQoKICAgICAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKICAgICAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwogICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmFtZXRleHQnLCR0aGlzLT5MYW5nKCduYW1lJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsZW5ndGh0ZXh0JywkdGhpcy0+TGFuZygnbGVuZ3RoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHR0ZXh0JywkdGhpcy0+TGFuZygncHJvbXB0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0eXBldGV4dCcsJHRoaXMtPkxhbmcoJ3R5cGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb3BzJywkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9wY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvcHNmb3VuZCcsJHRoaXMtPkxhbmcoJ3Byb3BzZm91bmQnKSk7CgogICAgaWYoICR0aGlzLT5fSGFzU3VmZmljaWVudFBlcm1pc3Npb25zKCdhZGRwcm9wJykgKQogICAgICB7CgkvLyB0b2RvLCBhZGQgYSBwZXJtaXNzaW9uIGNoZWNrIGFyb3VuZCB0aGlzCgkvLyBtYXliZSBjcmVhdGUgYW4gImVkaXQgZnJvbnRlbmR1c2VyIHByb3BlcnRpZXMiIHBlcm1pc3Npb24KCSR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkbGluaycsIAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnYWRkcHJvcCcsCgkJCQkJCSAkcmV0dXJuaWQsCgkJCQkJCSAkdGhpcy0+TGFuZygnYWRkcHJvcCcpLAoJCQkJCQkgYXJyYXkoKSwgJycsIGZhbHNlLAoJCQkJCQkgZmFsc2UsCgkJCQkJCSAnY2xhc3M9InBhZ2VvcHRpb25zIicpKTsKICAgICAgfQoKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3Byb3BlcnRpZXNmb3JtLnRwbCcpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5Vc2Vyc1RhYigkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gdGhpcyB0YWIgaGFzIG1lcmVseSBvbmUgbW9mbyBsaXN0IG9mIHVzZXMgYW5kIHRoZSBhYmlsaXR5IHRvIGVkaXQgdGhlbSwgCiAgICAvLyBzZWUgZGV0YWlscyBhYm91dCB0aGVtLCBhbmQgdGhlbiBkZWxldGUgdGhlbQogICAgLy8gbWF5YmUgc2VuZCBhbiBlbWFpbCB0byB0aGVtIHRvbyBpZiBJIGdldCBhcm91bmQgdG8gaXQgdGhhdCBpcy4KCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ2xpc3R1c2VycycpICkKICAgICAgewoJLy8gZmlsdGVyaW5nIHN0dWZmCglpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlciddKSApCgkgIHsKCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9ncm91cCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X2dyb3VwJywgJHBhcmFtc1snZmlsdGVyX2dyb3VwJ10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9yZWdleCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X3JlZ2V4JywgJHBhcmFtc1snZmlsdGVyX3JlZ2V4J10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9saW1pdCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X2xpbWl0JywgJHBhcmFtc1snZmlsdGVyX2xpbWl0J10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9zb3J0YnknXSApICkKCSAgICAgIHsKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnY3VycmVudF9zb3J0JywgJHBhcmFtc1snZmlsdGVyX3NvcnRieSddICk7CgkgICAgICB9CgkgICAgaWYoIGlzc2V0KCAkcGFyYW1zWydmaWx0ZXJfcHJvcGVydHlzZWwnXSApICkKCSAgICAgIHsKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgnY3VycmVudF9wcm9wc2VsJywgJHBhcmFtc1snZmlsdGVyX3Byb3BlcnR5c2VsJ10gKTsKCSAgICAgIH0KCSAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2ZpbHRlcl9wcm9wZXJ0eXNlbCddICkgKQoJICAgICAgewoJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjdXJyZW50X3Byb3B2YWwnLCAkcGFyYW1zWydmaWx0ZXJfcHJvcGVydHknXSApOwoJICAgICAgfQoJICB9CgkkY3VyZ3JvdXAgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY3VycmVudF9ncm91cCcsICcnKTsKCSRjdXJyZWdleCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjdXJyZW50X3JlZ2V4JywgJycpOwoJJGN1cmxpbWl0ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2N1cnJlbnRfbGltaXQnLCAxMDApOwoJJGN1cnNvcnQgID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2N1cnJlbnRfc29ydCcsICcnKTsKCSRjdXJwcm9wc2VsID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2N1cnJlbnRfcHJvcHNlbCcsICdub25lJyk7CgkkY3VycHJvcHZhbCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjdXJyZW50X3Byb3B2YWwnLCAnJyk7IAoJCgkvLyBnZXQgYSBncm91cCBsaXN0IGZvciB0aGUgZmlsdGVyCgkvLyBpdCBzaG91bGQgYmUgcmVhZHkgdG8gZ28gcmlnaHQgaW50byB0aGUgZHJvcGRvd24gKGNvb2wgZWgpCgkkZ3JvdXBzMSA9ICR0aGlzLT5HZXRHcm91cExpc3QoKTsKCSRncm91cHMgPSBhcnJheV9tZXJnZSggYXJyYXkoIkFsbCBHcm91cHMiID0+IC0xKSwgJGdyb3VwczEgKTsKCQoJLy8gYSBwdWxsZG93biBsaXN0IGZvciBsaW1pdHMKCSRsaW1pdHMgPSBhcnJheSggJzEwMCcgPT4gMTAwLAoJCQkgJzEwJyA9PiAxMCwKCQkJICcyNScgPT4gMjUsCgkJCSAnNTAnID0+IDUwLAoJCQkgJzI1MCcgPT4gMjUwLAoJCQkgJzUwMCcgPT4gNTAwICk7CgoJLy8gYSBwdWxsZG93biBsaXN0IGZvciBwcm9wZXJ0eSBkZWZpbml0aW9ucwoJJGRlZm5zMSA9ICR0aGlzLT5HZXRQcm9wZXJ0eURlZm5zKCk7CgkkZGVmbnMgPSBhcnJheSgpOwoJJGRlZm5zWydOb25lJ10gPSAnbm9uZSc7Cglmb3JlYWNoKCAkZGVmbnMxIGFzICRkZWYgKQoJICB7CgkgICAgJGRlZm5zWyRkZWZbJ3Byb21wdCddXSA9ICRkZWZbJ25hbWUnXTsKCSAgfQoJCgkvLyBhIHB1bGxkb3duIGxpc3QgZm9yIHNvcnRpbmcKCSRzb3J0cyA9IGFycmF5ICgnVXNlcm5hbWUnID0+ICd1c2VybmFtZScsCgkJCSdVc2VybmFtZSAoZGVzY2VuZGluZyknID0+ICd1c2VybmFtZSBkZXNjJywKCQkJJ0NyZWF0ZSBEYXRlJyA9PiAnY3JlYXRlZGF0ZScsCgkJCSdDcmVhdGUgRGF0ZSAoZGVzY2VuZGluZyknID0+ICdjcmVhdGVkYXRlIGRlc2MnLAoJCQknRXhwaXJ5IERhdGUnID0+ICdleHBpcmVzJywKCQkJJ0V4cGlyeSBEYXRlIChkZXNjZW5kaW5nKScgPT4gJ2V4cGlyZXMgZGVzYycpOwoJLy8gbm93IHNldHVwIHRoZSB0ZW1wbGF0ZSBmaWVsZHMKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3Byb21wdF9maWx0ZXInLCAkdGhpcy0+TGFuZygnZmlsdGVyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3NvcnQnLCAkdGhpcy0+TGFuZygnc29ydCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3N0YXJ0Zm9ybScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkZWZhdWx0YWRtaW4nKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdwcm9tcHRfZ3JvdXAnLCAkdGhpcy0+TGFuZygnZ3JvdXAnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd1c2Vyc2ZvdW5kJywgJHRoaXMtPkxhbmcoJ3VzZXJzZm91bmQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd1c2Vyc2luZ3JvdXAnLCAkdGhpcy0+TGFuZygndXNlcnNpbmdyb3VwJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX2dyb3VwJywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfZ3JvdXAnLCAkZ3JvdXBzLCAtMSwKCQkJCQkJCSAgICRjdXJncm91cCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3VzZXJmaWx0ZXInLCAkdGhpcy0+TGFuZygndXNlcmZpbHRlcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2ZpbHRlcl9yZWdleCcsIAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnZmlsdGVyX3JlZ2V4JywKCQkJCQkJICAgICAgICRjdXJyZWdleCwgMjAsIDIwICkpOwoKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3Byb21wdF9wcm9wZXJ0eWZpbHRlcnNlbCcsJHRoaXMtPkxhbmcoJ3Byb3BlcnR5ZmlsdGVyJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX3Byb3BlcnR5c2VsJywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfcHJvcGVydHlzZWwnLAoJCQkJCQkJICAgJGRlZm5zLCAtMSwgJGN1cnByb3BzZWwgKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdwcm9tcHRfcHJvcGVydHlmaWx0ZXInLCR0aGlzLT5MYW5nKCd2YWx1ZXJlZ2V4JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX3Byb3BlcnR5JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2ZpbHRlcl9wcm9wZXJ0eScsCgkJCQkJCSAgICAgICAkY3VycHJvcHZhbCwgMjAsIDIwICkpOwoKCSR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3Byb21wdF9saW1pdCcsCgkJCSAgICAgICAkdGhpcy0+TGFuZygndXNlcmxpbWl0JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX2xpbWl0JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duKCAkaWQsICdmaWx0ZXJfbGltaXQnLCAkbGltaXRzLCAtMSwKCQkJCQkJCSAgICRjdXJsaW1pdCkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAncHJvbXB0X3NvcnRieScsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnc29ydGJ5JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnZmlsdGVyX3NvcnRieScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biggJGlkLCAnZmlsdGVyX3NvcnRieScsICRzb3J0cywgLTEsCgkJCQkJCQkgICAkY3Vyc29ydCkpOwoKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfc2VsZWN0JywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCAkaWQsICdmaWx0ZXInLCAKCQkJCQkJCSR0aGlzLT5MYW5nKCdhcHBseWZpbHRlcicpKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2hpZGRlbicsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnYWN0aXZlX3RhYicsICd1c2VycycpCgkJCSAgICAgICk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKCgkkdXNlcnMgPSAkdGhpcy0+R2V0VXNlcnNJbkdyb3VwKCAkY3VyZ3JvdXAsICRjdXJyZWdleCwgJGN1cmxpbWl0LCAkY3Vyc29ydCwKCQkJCQkgJGN1cnByb3BzZWwsICRjdXJwcm9wdmFsICk7CglpZiggIWlzX2FycmF5KCR1c2VycykgKQoJICB7CgkgICAgLy8gYW4gZXJyb3Igb2NjdXJyZWQKCSAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJGRiLT5FcnJvck1zZygpICk7CgkgICAgcmV0dXJuOwoJICB9CgoJLy8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgdXNlcnMKCSRudW11c2VycyA9ICR0aGlzLT5Db3VudFVzZXJzSW5Hcm91cCggJGN1cmdyb3VwICk7CgoJJHJvd2FycmF5ID0gYXJyYXkoKTsKCSRyb3djbGFzcyA9ICJyb3cxIjsKCWdsb2JhbCAkZ0NtczsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbnVtdXNlcnMnLCAkbnVtdXNlcnMgKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlcm5hbWV0ZXh0JywgJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbWFpbHRleHQnLCAkdGhpcy0+TGFuZygnZW1haWwnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXR1c3RleHQnLCAkdGhpcy0+TGFuZygnc3RhdHVzJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjcmVhdGVkdGV4dCcsICR0aGlzLT5MYW5nKCdjcmVhdGVkJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBpcmVzdGV4dCcsICR0aGlzLT5MYW5nKCdleHBpcmVzJykpOwoJZm9yZWFjaCggJHVzZXJzIGFzICRyb3cgKQoJewoJICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CgkgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoJICAkb25lcm93LT5jcmVhdGVkICA9ICRyb3dbJ2NyZWF0ZWRhdGUnXTsKCSAgJG9uZXJvdy0+dXNlcm5hbWUgPSAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdlZGl0dXNlcicsICRyZXR1cm5pZCwgJHJvd1sndXNlcm5hbWUnXSwKCQkJCQkJYXJyYXkoJ3VzZXJfaWQnID0+ICRyb3dbJ2lkJ10pKTsKCSAgJG9uZXJvdy0+ZXhwaXJlcyAgPSAkcm93WydleHBpcmVzJ107CgkgICRvbmVyb3ctPmVkaXRsaW5rID0KCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdHVzZXInLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkJCQkJICAgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ3VzZXJfaWQnID0+ICRyb3dbJ2lkJ10gKSk7CgkgICRvbmVyb3ctPmRlbGV0ZWxpbmsgPSAKCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCdkb19kZWxldGV1c2VyJywkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCQkJCQkgICAgJHRoaXMtPkxhbmcgKCdkZWxldGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkgICAgICAgYXJyYXkgKCd1c2VyX2lkJyA9PiAkcm93WydpZCddKSwKCQkJICAgICAgICR0aGlzLT5MYW5nICgnYXJleW91c3VyZScpKTsKCSAgCgkgIGFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkgICgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCX0KCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpdGVtY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnYWRkdXNlcicpICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRsaW5rJywgCgkJCSAgICAgICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdhZGR1c2VyJywKCQkJCQkJICRyZXR1cm5pZCwKCQkJCQkJICR0aGlzLT5MYW5nKCdhZGR1c2VyJyksCgkJCQkJCSBhcnJheSgpLCAnJywgZmFsc2UsCgkJCQkJCSBmYWxzZSwKCQkJCQkJICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCAndXNlcmxpc3QudHBsJyApOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5QYW5lbCgkaWQsJiRwYXJhbXMsJHJldHVybmlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoKICAgICRhY3RpdmVfdGFiID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2FjdGl2ZV90YWInLC0xKTsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snYWN0aXZlX3RhYiddICkgKQogICAgICB7CgkkYWN0aXZlX3RhYiA9ICRwYXJhbXNbJ2FjdGl2ZV90YWInXTsKICAgICAgfQoKICAgIC8vIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ3Byb3BlcnRpZXMnLCAkdGhpcy0+TGFuZygncHJvcGVydGllcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ3Byb3BlcnRpZXMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndXNlcnNuZ3JvdXBzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdncm91cHMnLCAkdGhpcy0+TGFuZygnZ3JvdXBzJyksKCRhY3RpdmVfdGFiID09ICdncm91cHMnKSk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICd1c2VycycsICR0aGlzLT5MYW5nKCd1c2VycycpLCgkYWN0aXZlX3RhYiA9PSAndXNlcnMnKSk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdhZG1pbicsICR0aGlzLT5MYW5nKCdhZG1pbicpLCgkYWN0aXZlX3RhYiA9PSAnYWRtaW4nKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdwcmVmcycsICR0aGlzLT5MYW5nKCdwcmVmZXJlbmNlcycpLCgkYWN0aXZlX3RhYiA9PSAncHJlZnMnKSk7CiAgICAgIH0KICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoICdsb2dpbnRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ2luX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnbG9naW50ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2xvZ291dHRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2xvZ291dF90ZW1wbGF0ZScpLAoJCQkJICAoJGFjdGl2ZV90YWIgPT0gJ2xvZ291dHRlbXBsYXRlJykpOwoJZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCAnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnLCAkdGhpcy0+TGFuZygnY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnKSwKCQkJCSAgKCRhY3RpdmVfdGFiID09ICdjaGFuZ2VzZXR0aW5nc190ZW1wbGF0ZScpKTsKCWVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciggJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJyksCgkJCQkgICgkYWN0aXZlX3RhYiA9PSAnZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKSk7CiAgICAgIH0KICAgIGVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKCiAgICAvLyBUaGVjb250ZW50IG9mIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3Byb3BlcnRpZXMnKSApCiAgICAgIHsKCWVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcm9wZXJ0aWVzJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pblByb3BlcnRpZXNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQogICAgCiAgICBpZiggJHRoaXMtPl9IYXNTdWZmaWNpZW50UGVybWlzc2lvbnMoJ3VzZXJzbmdyb3VwcycpICkKICAgICAgewoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2dyb3VwcycpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Hcm91cHNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYigndXNlcnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluVXNlcnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYignYWRtaW4nKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluQWRtaW5UYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygnc2l0ZXByZWZzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYigncHJlZnMnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluUHJlZnNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKICAgICAgfQoKICAgIGlmKCAkdGhpcy0+X0hhc1N1ZmZpY2llbnRQZXJtaXNzaW9ucygndGVtcGxhdGVzJykgKQogICAgICB7CgllY2hvICR0aGlzLT5TdGFydFRhYignbG9naW50ZW1wbGF0ZScpOwoJJHRoaXMtPl9EaXNwbGF5QWRtaW5Mb2dpblRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2xvZ291dHRlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkxvZ291dFRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJZWNobyAkdGhpcy0+RW5kVGFiKCk7CgoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJyk7CgkkdGhpcy0+X0Rpc3BsYXlBZG1pbkNoYW5nZVNldHRpbmdzVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgllY2hvICR0aGlzLT5FbmRUYWIoKTsKCgllY2hvICR0aGlzLT5TdGFydFRhYignZm9yZ290cGFzc3dvcmRfdGVtcGxhdGUnKTsKCSR0aGlzLT5fRGlzcGxheUFkbWluRm9yZ290UGFzc3dvcmRUZW1wbGF0ZVRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCgpOwogIH0KCgogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5QcmVmc1RhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAvLyBmaWxsIG91dCB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCAkaWQsICdkb19zZXRwcmVmcycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21pbnB3bGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9taW5wd2xlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWlucHdsZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21pbnB3bGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2luZm9fbWlucHdsZW4nLAoJCQkgICR0aGlzLT5MYW5nKCd3YXJuaW5nX2VmZmVjdHNmaWVsZGxlbmd0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21heHB3bGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9tYXhwd2xlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWF4cHdsZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21heHB3bGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2luZm9fbWF4cHdsZW4nLAoJCQkgICR0aGlzLT5MYW5nKCd3YXJuaW5nX2VmZmVjdHNmaWVsZGxlbmd0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21pbnVubGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9taW51bmxlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWludW5sZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21pbnVubGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2luZm9fbWludW5sZW4nLAoJCQkgICR0aGlzLT5MYW5nKCd3YXJuaW5nX2VmZmVjdHNmaWVsZGxlbmd0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X21heHVubGVuJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9tYXh1bmxlbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfbWF4dW5sZW4nLCAKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X21heHVubGVuJywgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJyksIDIsIDIgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2luZm9fbWF4dW5sZW4nLAoJCQkgICR0aGlzLT5MYW5nKCd3YXJuaW5nX2VmZmVjdHNmaWVsZGxlbmd0aCcpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9zZXNzaW9udGltZW91dCcsICR0aGlzLT5MYW5nKCdwcm9tcHRfc2Vzc2lvbnRpbWVvdXQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3Nlc3Npb250aW1lb3V0JywgCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdpbnB1dF9zZXNzaW9udGltZW91dCcsIAoJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3VzZXJfc2Vzc2lvbl9leHBpcmVzJyksIDQsIDQgKSk7CgkJCSAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9yZXF1aXJlb25lZ3JvdXAnLCAkdGhpcy0+TGFuZygncHJvbXB0X3JlcXVpcmVvbmVncm91cCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcmVxdWlyZW9uZWdyb3VwJywgCgkJCSAgbXlDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2lucHV0X3JlcXVpcmVvbmVncm91cCcsIDEsIAoJCQkJCQkkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZV9vbmVncm91cCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfc210cHZhbGlkYXRlJywgJHRoaXMtPkxhbmcoJ3Byb21wdF9zbXRwdmFsaWRhdGUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3NtdHB2YWxpZGF0ZScsIAoJCQkgIG15Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdpbnB1dF9zbXRwdmFsaWRhdGUnLCAxLCAKCQkJCQkJJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RvX3NtdHBfdmFsaWRhdGVfZW1haWwnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbmZvX3NtdHB2YWxpZGF0ZScsICR0aGlzLT5MYW5nKCdpbmZvX3NtdHB2YWxpZGF0ZScpKTsKCgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfYWxsb3dfZHVwbGljYXRlX2VtYWlscycsIAoJCQkgICR0aGlzLT5MYW5nKCdwcm9tcHRfYWxsb3dfZHVwbGljYXRlX2VtYWlscycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfYWxsb3dfZHVwbGljYXRlX2VtYWlscycsIAoJCQkgIG15Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsICdpbnB1dF9hbGxvd19kdXBsaWNhdGVfZW1haWxzJywgMSwgCgkJCQkJCSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdhbGxvd19kdXBsaWNhdGVfZW1haWxzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5mb19hbGxvd19kdXBsaWNhdGVfZW1haWxzJywgJHRoaXMtPkxhbmcoJ2luZm9fYWxsb3dfZHVwbGljYXRlX2VtYWlscycpKTsKCiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2RmbHRncm91cCcsICR0aGlzLT5MYW5nKCdwcm9tcHRfZGZsdGdyb3VwJykpOwogICAgJGdyb3VwczEgPSAkdGhpcy0+R2V0R3JvdXBMaXN0KCk7CiAgICAkZ3JvdXBzID0gYXJyYXlfbWVyZ2UoIGFycmF5KCJOb25lIiA9PiAtMSksICRncm91cHMxICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2RmbHRncm91cCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcERvd24oICRpZCwgJ2lucHV0X2RmbHRncm91cCcsICRncm91cHMsIC0xLAoJCQkJCQkgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9ncm91cCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpLCcnLCcnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjb25maXJtX3N1Ym1pdHByZWZzJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAkdGhpcy0+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+ZmVDcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX2ZvcmdvdHB3JywgJHJldHVybmlkICkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ2ZvcmdvdHB3JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsb3N0cHdfbWVzc2FnZScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdsb3N0cHdfbWVzc2FnZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VzZXJuYW1lJywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF91c2VybmFtZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXNlcm5hbWUnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF91c2VybmFtZScsIAoJCQkJCQkgICAgICAkdXNlcm5hbWUsIDIwLCAKCQkJCQkJICAgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcpKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKCWlmKCBpc3NldCggJHBhcmFtc1sncmV0dXJudG8nXSApICkKCSAgewoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcmV0dXJudG8nLCRwYXJhbXNbJ3JldHVybnRvJ10pKTsKCSAgfQogICAgICB9CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoICdmZXVzZXJzX2ZvcmdvdHBhc3N3b3JkZm9ybScgKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheVVzZXJGb3Jnb3RQYXNzd29yZFZlcmlmaWNhdGlvblBhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gZmlsbCBpbiB0aGUgdGVtcGxhdGUKICAgICR1aWQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfdWlkJ10gKSApCiAgICAgIHsKCSR1aWQgPSAkcGFyYW1zWydpbnB1dF91aWQnXTsKICAgICAgfQogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9ICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ107CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHVzZXJuYW1lID0gJHRoaXMtPkdldFVzZXJOYW1lKCAkdWlkICk7CiAgICAgIH0KICAgICRjb2RlID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2NvZGUnXSApICkKICAgICAgewoJJGNvZGUgPSAkcGFyYW1zWydpbnB1dF9jb2RlJ107CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsJHBhcmFtc1snZXJyb3InXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCRwYXJhbXNbJ21lc3NhZ2UnXSk7CiAgICAgIH0KCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPmZlQ3JlYXRlRm9ybVN0YXJ0KCRpZCwnZG9fdmVyaWZ5Y29kZScsJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ2lucHV0X3VpZCcsJHVpZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXNlcm5hbWUnLCR0aGlzLT5MYW5nKCdwcm9tcHRfdXNlcm5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VzZXJuYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF91c2VybmFtZScsICR1c2VybmFtZSwgMzAsIAoJCQkJCQkgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtYXhfdXNlcm5hbWVsZW5ndGgnKSwKCQkJCQkJICAnRGlzYWJsZWQ9IjEiJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfY29kZScsJHRoaXMtPkxhbmcoJ3Byb21wdF9jb2RlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jb2RlJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdpbnB1dF9jb2RlJywgJGNvZGUsIDEwLCAxMCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3Bhc3N3b3JkJywkdGhpcy0+TGFuZygncHJvbXB0X3Bhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAnJywgMjAsIAoJCQkJCQkgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtYXhfcGFzc3dvcmRsZW5ndGgnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfcmVwZWF0cGFzc3dvcmQnLCR0aGlzLT5MYW5nKCdyZXBlYXRwYXNzd29yZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfcmVwZWF0cGFzc3dvcmQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCRpZCwgJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywgCgkJCQkJCSAgICAgJycsIDIwLCAKCQkJCQkJICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJykpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19mb3Jnb3RwYXNzd29yZHZlcmlmeWZvcm0nKTsKICB9CgoKICBmdW5jdGlvbiBfRGlzcGxheVVzZXJTZXR0aW5nc1BhZ2UoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHVpZCA9ICR0aGlzLT5Mb2dnZWRJbklkKCk7CiAgICBpZiggJHVpZCA9PSBmYWxzZSApIAogICAgICB7CgkvLyB1c2VyIGlzbid0IGxvZ2dlZCBpbgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9ub3Rsb2dnZWRpbicpKTsKCXJldHVybjsKICAgICAgfQogICAgJHJlc3VsdCA9ICR0aGlzLT5HZXRVc2VySW5mbyggJHVpZCApOwogICAgaWYoICRyZXN1bHRbMF0gPT0gRkFMU0UgKQogICAgICB7CgkvLyB1c2VyIGlzbid0IGxvZ2dlZCBpbgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgCgkJCQkgICRyZXN1bHRbMV0pOwoJcmV0dXJuOwogICAgICB9CiAgICAkdWluZm8gPSAkcmVzdWx0WzFdOwoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10gKTsKICAgICAgfQogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydtZXNzYWdlJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRwYXJhbXNbJ21lc3NhZ2UnXSApOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSB1c2VycyBtZW1iZXIgZ3JvdXBzCiAgICAkZ3JvdXBzID0gJHRoaXMtPkdldE1lbWJlckdyb3Vwc0FycmF5KCAkdWlkICk7CiAgICBpZiggISRncm91cHMgKQogICAgICB7CgkvLyB0aGlzIHVzZXIgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncnVvcHMuLi4KCS8vIGhhbmRsZSB0aGlzIGxhdGVyIHRvZG8KCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsIAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9ncm91cHMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgd2UgaGF2ZSB0aGUgZ3JvdXBzLCB3ZSBidWlsZCBhIHVuaW9uIG9mIGFsbCBvZiB0aGUgZ3JvdXBzIHByb3BlcnRpZXMKICAgICRwcm9wZXJ0aWVzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRncm91cHMgYXMgJGdycHJlY29yZCApCiAgICB7CiAgICAgICRnaWQgPSAkZ3JwcmVjb3JkWydncm91cGlkJ107CiAgICAgICRwcm9wcmVsYXRpb25zID0gJHRoaXMtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRnaWQgKTsKICAgICAgJHByb3BlcnRpZXMgPSBhcnJheV9tZXJnZV9ieV9uYW1lX3JlcXVpcmVkKCAkcHJvcGVydGllcywgJHByb3ByZWxhdGlvbnMgKTsKICAgICAgdWFzb3J0KCAkcHJvcGVydGllcywgJ2NvbXBhcmVfZWxlbWVudHNfYnlfc29ydG9yZGVyX2tleScgKTsKICAgIH0KCiAgICBpZiggY291bnQoJHByb3BlcnRpZXMpID09IDAgKQogICAgICB7CglpZiggJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVfb25lZ3JvdXAnKSA9PSAxICkKCSAgewoJICAgIC8vIHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgYW55IGdydW9wcy4uLgoJICAgIC8vIGhhbmRsZSB0aGlzIGxhdGVyIHRvZG8KCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdlcnJvcl9vbmVncm91cHJlcXVpcmVkJykpOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CgoKICAgIC8vIG5vdyB3ZSdyZSByZWFkeSB0byBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgIC8vIGZpcnN0IHdlIHB1dCBpbiBzdHVmZiB0aGF0IGlzIHJlcXVpcmVkICh1c2VybmFtZSwgcGFzc3dvcmQsIGV0YywgZXRjKQogICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKCiAgICAvLyBtYWtlIHN1cmUgdXNlcm5hbWUgaXMgaW4gdGhlcmUKICAgICR2YWwgPSAkdWluZm9bJ3VzZXJuYW1lJ107CiAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7CiAgICAkb25lcm93LT5jb2xvciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicsJ2JsdWUnKTsKICAgICRvbmVyb3ctPm1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAkb25lcm93LT5yZXF1aXJlZCA9IDE7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fdXNlcm5hbWUnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCd1c2VybmFtZScsMCwzMCwzKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X3VzZXJuYW1lJywgJHZhbCwgMzAsIAoJCQkJCSAgICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF91c2VybmFtZWxlbmd0aCcpLAoJCQkJCSAgICAgJ0Rpc2FibGVkPSIxIicpOwogICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CgogICAgLy8gYW5kIHBhc3N3b3JkCiAgICAkdmFsID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10gKSApCiAgICAgICR2YWwgPSAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddOwogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJG9uZXJvdy0+aGlkZGVuID0gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnaGlkZGVuX3Bhc3N3b3JkJywKCQkJCQkgICBpbXBsb2RlKCI7IixhcnJheSgncGFzc3dvcmQnLDAsMzAsMykpKTsKICAgICRvbmVyb3ctPnByb21wdCA9ICR0aGlzLT5MYW5nKCdwYXNzd29yZCcpOwogICAgJG9uZXJvdy0+Y29udHJvbCA9JHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCAnaW5wdXRfcGFzc3dvcmQnLCAkdmFsLCAyMCwgCgkJCQkJCSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJykpOwogICAgJG9uZXJvdy0+YWRkdGV4dCA9JHRoaXMtPkxhbmcoJ2luZm9fZW1wdHlwYXNzd29yZGZpZWxkJyk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCiAgICAvLyBhbmQgbWFrZSBoaW0gcmVwZWF0IHRoZSBwYXNzd29yZAogICAgJHZhbCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddICkgKQogICAgICAkdmFsID0gJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXTsKICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKICAgICRvbmVyb3ctPmNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgJG9uZXJvdy0+bWFya2VyID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX21hcmtlcicsJyonKTsKICAgICRvbmVyb3ctPnJlcXVpcmVkID0gMTsKICAgICRvbmVyb3ctPmhpZGRlbiA9IG15Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2hpZGRlbl9yZXBlYXRwYXNzd29yZCcsCgkJCQkJICAgaW1wbG9kZSgiOyIsYXJyYXkoJ3JlcGVhdHBhc3N3b3JkJywwLDMwLDMpKSk7CiAgICAkb25lcm93LT5wcm9tcHQgPSAkdGhpcy0+TGFuZygncmVwZWF0cGFzc3dvcmQnKTsKICAgICRvbmVyb3ctPmNvbnRyb2wgPSR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCRpZCwgJ2lucHV0X3JlcGVhdHBhc3N3b3JkJywgJHZhbCwgMzAsIDMwKTsKICAgICRvbmVyb3ctPmFkZHRleHQgPSR0aGlzLT5MYW5nKCdpbmZvX2VtcHR5cGFzc3dvcmRmaWVsZCcpOwogICAgYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CiAgICAgICAgCiAgICBmb3JlYWNoKCAkcHJvcGVydGllcyBhcyAkcHJvcCApCiAgICB7CiAgICAgIC8vIGRvbid0IHByb2Nlc3MgaGlkZGVuIGZpZWxkcyBoZXJlCiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAzICkgY29udGludWU7CgogICAgICAvLyBnZXQgdGhlIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgJGRlZm4gPSAkdGhpcy0+R2V0UHJvcGVydHlEZWZuKCAkcHJvcFsnbmFtZSddICk7CiAgICAgICR2YWwgPSAkdGhpcy0+R2V0VXNlclByb3BlcnR5RnVsbCggJHByb3BbJ25hbWUnXSwgJHVpZCApOwogICAgICAkb25lcm93ID0gbmV3IFN0ZENsYXNzKCk7IAoKICAgICAgJGNvbG9yID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJGNvbG9yID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlcXVpcmVkX2ZpZWxkX2NvbG9yJywnYmx1ZScpOwogICAgICAkbWFya2VyID0gJyc7CiAgICAgIGlmKCAkcHJvcFsncmVxdWlyZWQnXSA9PSAyICkgJG1hcmtlciA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9tYXJrZXInLCcqJyk7CiAgICAgICRvbmVyb3ctPnJlcXVpcmVkID0gKCRwcm9wWydyZXF1aXJlZCddID09IDIpOwogICAgICAkb25lcm93LT5jb2xvciAgICA9ICRjb2xvcjsKICAgICAgJG9uZXJvdy0+bWFya2VyICAgPSAkbWFya2VyOwogICAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fJy4kcHJvcFsnbmFtZSddLAoJCQkJCSAgICAgaW1wbG9kZSgiOyIsYXJyYXkoJHByb3BbJ25hbWUnXSwkZGVmblsndHlwZSddLAoJCQkJCQkJICAgICAgICRkZWZuWydsZW5ndGgnXSwkcHJvcFsncmVxdWlyZWQnXSkpKTsKCiAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKICAgICAgc3dpdGNoKCAkZGVmblsndHlwZSddICkKCXsKCWNhc2UgMDogLy8gdGV4dAoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLAoJCQkJCQkgICAgICR2YWwsICRkZWZuWydsZW5ndGgnXSwgJGRlZm5bJ21heGxlbmd0aCddICk7CgkgIGJyZWFrOwoKCWNhc2UgMTogLy8gY2hlY2tib3gKCSAgJG9uZXJvdy0+Y29udHJvbCA9IG15Q3JlYXRlSW5wdXRDaGVja2JveCggJGlkLCAnaW5wdXRfJy4kcHJvcFsnbmFtZSddLCAxLCAkdmFsICk7CgkgIGJyZWFrOwoKCWNhc2UgMjogLy8gZW1haWwKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydtYXhsZW5ndGgnXSApOwoJICBicmVhazsKCgljYXNlIDM6IC8vIHRleHRhcmVhCgkgICRvbmVyb3ctPmNvbnRyb2wgPSAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsICRpZCwgJHZhbCwgJ2lucHV0XycuJHByb3BbJ25hbWUnXSk7CgkgIGJyZWFrOwoKCWNhc2UgNDogLy8gZHJvcGRvd24KCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCAKCQkJCQkJCSRpZCwgCgkJCQkJCQknaW5wdXRfJy4kcHJvcFsnbmFtZSddLCAKCQkJCQkJCSR0aGlzLT5HZXRTZWxlY3RPcHRpb25zKCRkZWZuWyduYW1lJ10sIDEpLCAKCQkJCQkJCS0xLCAKCQkJCQkJCSR2YWwpOwoJICBicmVhazsKCX0KCiAgICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwogICAgfQoKICAgIC8vIGZpbGwgaW4gdGhlIHZhcmlhYmxlcyBmb3IgdGhlIHRlbXBsYXRlCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywkdGhpcy0+TGFuZygndXNlcl9zZXR0aW5ncycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+ZmVDcmVhdGVGb3JtU3RhcnQoJGlkLCdkb191c2VyY2hhbmdlc2V0dGluZ3MnLCRyZXR1cm5pZCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignZW5kZm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ3N1Ym1pdCcsJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwgJ2NhbmNlbCcsJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ3JldHVybnRvJ10gKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfcmV0dXJudG8nLCRwYXJhbXNbJ3JldHVybnRvJ10pKTsKICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250cm9scycsICRyb3dhcnJheSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xjb3VudCcsIGNvdW50KCRyb3dhcnJheSkpOwoKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnZmV1c2Vyc19jaGFuZ2VzZXR0aW5nc2Zvcm0nKTsKICB9CgoKZnVuY3Rpb24gX2hhbmRsZVVzZXJJbmZvVmFsaWRhdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAmJG1lc3NhZ2UsICRuZWVkcHcgPSB0cnVlLCAkZG9leHBpcmUgPSB0cnVlLCAkY2hlY2t1c2VybmFtZSA9IHRydWUgKQogIHsKICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVycyBhcmUgZmlsbGVkIGluCiAgICAkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICRyZXBlYXQgICA9IHRyaW0oJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSk7CgogICAgaWYoICR1c2VybmFtZSA9PSAnJyAKCXx8ICgkbmVlZHB3ICYmICgkcGFzc3dvcmQgPT0gJycgfHwgJHJlcGVhdCA9PSAnJykpICApCiAgICAgIHsKCSRtZXNzYWdlID0gJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnZhbGlkcGFyYW1zIik7CglyZXR1cm4gLTE7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgdGhlIHBhc3N3b3JkcyBtYXRjaAogICAgaWYoICRwYXNzd29yZCAhPSAkcmVwZWF0ICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygiZXJyb3JfcGFzc3dvcmRtaXNtYXRjaCIpOwoJcmV0dXJuIC0xOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSB1c2VybmFtZSBmaXRzIHRoZSBydWxlcwogICAgaWYoICRjaGVja3VzZXJuYW1lICkKICAgICAgewoJaWYoICEkdGhpcy0+SXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKSApCgkgIHsKCSAgICAkbWVzc2FnZSA9ICR0aGlzLT5MYW5nKCAiZXJyb3JfaW52YWxpZHVzZXJuYW1lIiApOwoJICAgIHJldHVybiAtMTsKCSAgfQogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHRoZSBwYXNzd29yZCBmaXRzIHRoZSBydWxlcwogICAgaWYoICRuZWVkcHcgJiYgISR0aGlzLT5Jc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygiZXJyb3JfaW52YWxpZHBhc3N3b3JkIik7CglyZXR1cm4gLTE7CiAgICAgIH0KCiAgICBpZiggJGRvZXhwaXJlID09IGZhbHNlICkKICAgICAgewoJcmV0dXJuIDE7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgYW4gZXhwaXJ5IGRhdGUgaXMgc2V0CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10pICkKICAgICAgewoJJG1lc3NhZ2UgPSAkdGhpcy0+TGFuZygnZXJyb3JfaW52YWxpZGV4cGlyeWRhdGUnKTsKICAgICAgfQoKICAgICRleHBpcmVzID0gbWt0aW1lKCRwYXJhbXNbJ2V4cGlyZXNkYXRlX0hvdXInXSwgCgkJJHBhcmFtc1snZXhwaXJlc2RhdGVfTWludXRlJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1NlY29uZCddLAoJICAgICAgICAkcGFyYW1zWydleHBpcmVzZGF0ZV9Nb250aCddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9EYXknXSwgCgkgICAgICAgICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1llYXInXSk7CiAgICAkcGFyYW1zWydpbnB1dF9leHBpcmVzZGF0ZSddID0gJGV4cGlyZXM7CiAgICByZXR1cm4gMTsKICB9CgoKICBmdW5jdGlvbiBteU1vZHVsZVBhdGgoKQogIHsKICAgICRzdHIgPSAiL21vZHVsZXMvIi4kdGhpcy0+R2V0TmFtZSgpLiIvIjsKICAgIHJldHVybiAkc3RyOwogIH0KCiAgZnVuY3Rpb24gbXlSZWRpcmVjdFRvVGFiKCAkaWQsICR0YWIsICRwYXJhbXMgPSAnJyApCiAgewogICAgJHBhcm1zID0gYXJyYXkoKTsKICAgIGlmKCBpc19hcnJheSggJHBhcmFtcyApICkKICAgICAgewoJJHBhcm1zID0gJHBhcmFtczsKICAgICAgfQogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2FjdGl2ZV90YWInLCAkdGFiKTsKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgJHBhcm1zLCB0cnVlICk7CiAgfQoKICBmdW5jdGlvbiBteVJlZGlyZWN0KCAkaWQsICRhY3Rpb24sICRyZXR1cm5pZCwgJHBhcmFtcyA9ICcnICkKICB7CiAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJHJldHVybmlkLCAkcGFyYW1zICk7CiAgfQoKICBmdW5jdGlvbiBmZUNyZWF0ZUZvcm1TdGFydCggJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQsICRpbmxpbmU9dHJ1ZSwgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaWRzdWZmaXg9JycgKQogIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwkYWN0aW9uLCRyZXR1cm5pZCwkbWV0aG9kLCRlbmN0eXBlLCRpbmxpbmUsJGlkc3VmZml4KTsKICB9CgogIGZ1bmN0aW9uIEdldEhlbHAoJGxhbmc9J2VuX1VTJykJCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQoKICBmdW5jdGlvbiBHZXRBdXRob3IoKSAKICB7CiAgICByZXR1cm4gJ2NhbGd1eTEwMDAnOwogIH0KICAKICBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMEBob3RtYWlsLmNvbSc7CiAgfQogIAogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgfQoKICAvKioKICAgKiBUaGlzIGlzIGEgYXdlc29tZSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgdmlydHVhbGx5IGFsbCBoZWxwZnVsCiAgICogZGVidWcgaW5mby4gIFJlbGllcyBvbiB0aGUgdmFsdWUgb2YgdGhlICR2YXJkZWJ1ZyBvZiB0aGUgY2xhc3MuCiAgICoKICAgKiBAcGFyYW0gYXJyYXkgJGRlYnVnYXJyYXkgc2luZ2xlLSBvciBtdWx0aWRpbWVudGlvbmFsIGFycmF5CiAgICogQHBhcmFtIFN0cmluZyAkbWVzc2FnZSB0aGF0IGhlbHAgaWRlbnRpZnkgdGhlIGZ1bmN0aW9uIGNhbGwKICAgKi8KICBmdW5jdGlvbiBfZGVidWdhcnJheSgkZGVidWdhcnJheSwgJG1lc3NhZ2U9JycpCiAgewogICAgaWYgKCR0aGlzLT5kZXZkZWJ1ZyA9PSAxKXsKICAgICAgZWNobyAiXG5cbjxicj48YnI+LS0tLS0tLS0tLS0tLSBEZWJ1ZyBpbmZvOiAtLS0tLS0tLS0tLS0tLS0tPGJyPlxuIjsKICAgICAgJHN0YWNrdHJhY2UgPSBkZWJ1Z19iYWNrdHJhY2UoKTsKICAgICAgaWYgKGNvdW50KCRzdGFja3RyYWNlKSA+IDEgJiYgJHN0YWNrdHJhY2VbMV1bJ2Z1bmN0aW9uJ10gIT0gJycpewoJZWNobyAiSW5zaWRlICIgLiAkc3RhY2t0cmFjZVsxXVsnZnVuY3Rpb24nXSAuICI8YnI+XG4iOwoJZWNobyAiQ2FsbGVkIGZyb20gIgoJICAuICRzdGFja3RyYWNlWzNdWydmdW5jdGlvbiddIC4gIiwgIgoJICAuICRzdGFja3RyYWNlWzJdWydmdW5jdGlvbiddIC4gIjxicj5cbiI7CiAgICAgIH0KICAgICAgaWYgKCRtZXNzYWdlICE9ICcnKXsKCWVjaG8gJG1lc3NhZ2UgLiAiPGJyPiI7CiAgICAgIH0KICAgICAgZWNobyAiXG48dGFibGUgY2VsbHBhZGRpbmc9MTAgYm9yZGVyPTA+XG48dHI+XG48dGQ+IjsKICAgICAgZm9yZWFjaCggJGRlYnVnYXJyYXkgYXMgJGtleSA9PiAkdmFsICl7CgkvLwkJCQllY2hvICI8Yj4ka2V5PC9iPjxicj4iOwoJaWYoaXNfYXJyYXkoJHZhbCkpewoJICBlY2hvICI8L3RkPlxuPHRkPiI7CgkgIGVjaG8gIjxiPkFycmF5PC9iPjxicj4iOwoJICAkdGhpcy0+X2RlYnVnc3ViYXJyYXkoJHZhbCk7Cgl9IGVsc2UgaWYgKGlzX29iamVjdCgkdmFsKSl7CgkgIGVjaG8gIjwvdGQ+XG48dGQ+IjsKCSAgZWNobyAiPGI+T2JqZWN0PC9iPjxicj4iOwoJICAkdGhpcy0+X2RlYnVnc3ViYXJyYXkoZ2V0X29iamVjdF92YXJzKCR2YWwpKTsKCX0gZWxzZSB7CgkgIGVjaG8gIjxiPlZlY3RvcjwvYj48YnI+IjsKCSAgZWNobyAiXHQ8c3BhbiBzdHlsZT1ccGFkZGluZy1sZWZ0OjIwcHhcIj4iCgkgICAgLiAka2V5IC4gIjogIiAuICR2YWwgLiAiPC9zcGFuPjxicj5cbiI7Cgl9CiAgICAgIH07CiAgICAgIGVjaG8gIjwvdGQ+XG48L3RyPlxuPC90YWJsZT5cbiI7CiAgICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0gRW5kIGRlYnVnIGluZm8gLS0tLS0tLS0tLS0tLS0tLTxicj48YnI+XG5cbiI7CiAgICB9CiAgfQoKCS8qKgoJICogVXRpbGl0eSBmdW5jdGlvbiwgdXNlZCBieSB0aGUgX2RlYnVnYXJyYXkgZnVuY3Rpb24KCSAqLwoJZnVuY3Rpb24gX2RlYnVnc3ViYXJyYXkoJGRlYnVnYXJyYXkpewoJCWZvcmVhY2goICRkZWJ1Z2FycmF5IGFzICRrZXkgPT4gJHZhbCApewoJCQlpZihpc19hcnJheSgkdmFsKSl7CgkJCQllY2hvICJcdCIgLiAka2V5IC4gIjogIiAuIHByaW50X3IoJHZhbCkgLiAiPGJyPlxuIjsKCQkJfSBlbHNlIHsKCQkJCWVjaG8gIlx0IiAuICRrZXkgLiAiOiAiIC4gJHZhbCAuICI8YnI+XG4iOwoJCQl9CgkJfQoJfQoKCiAgLy8gb2xkIGZ1bmN0aW9uIChub3QgdXNlZD8pCiAgLy8gdG9kbywgcHV0IHRoaXMgaW50byB0aGUgVXNlck1hbmlwdWxhdG9yIHN0dWZmCglmdW5jdGlvbiBDcmVhdGVOZXdVc2VyKCRpZCkgewoJICAkZGI9JHRoaXMtPkdldERiKCk7CgkgIGlmIChpc3NldCgkX1BPU1RbJGlkLiJ1c2VybmFtZSJdKSkgJG5ld3VzZXJuYW1lPXRyaW0oJF9QT1NUWyRpZC4idXNlcm5hbWUiXSk7IGVsc2UgJG5ld3VzZXJuYW1lPSIiOwoJICBpZiAoJG5ld3VzZXJuYW1lPT0iIikgcmV0dXJuICJVc2VybmFtZSBtdXN0IGJlIHByb3ZpZGVkISI7CgkgICRxdWVyeT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgV0hFUkUgdXNlcm5hbWU9JyIuJG5ld3VzZXJuYW1lLiInIjsKCSAgJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKIAkgIGlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHJldHVybiAiVXNlcm5hbWUgYWxyZWFkeSBleGlzdHMhIjsKCSAgCgkgICRuZXdlbWFpbD10cmltKCRfUE9TVFskaWQuImVtYWlsIl0pOwoJICAKCSAgJG5ld3Bhc3N3b3JkPXRyaW0oJF9QT1NUWyRpZC4icGFzc3dvcmQiXSk7CgkgIGlmICgkbmV3cGFzc3dvcmQ9PSIiKSByZXR1cm4gIlBhc3N3b3JkIGNhbm5vdCBiZSBibGFuayEiOwoJICAkbmV3cGFzc3dvcmQyPXRyaW0oJF9QT1NUWyRpZC4icGFzc3dvcmQyIl0pOwoJICBpZiAoJG5ld3Bhc3N3b3JkIT0kbmV3cGFzc3dvcmQyKSByZXR1cm4gIlBhc3N3b3JkcyBkbyBub3QgbWF0Y2ghIjsKCSAgJG5ld2lkPSRkYi0+R2VuSUQoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc191c2Vyc19zZXEiKTsKCSAgJHF1ZXJ5PSJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfdXNlcnMgKGlkLHVzZXJuYW1lLHBhc3N3b3JkLGVtYWlsKSBWQUxVRVMgKD8sPyw/LD8pIjsKCSAgJHBhcmFtcz1hcnJheSgkbmV3aWQsJG5ld3VzZXJuYW1lLG1kNSgkbmV3cGFzc3dvcmQpLCRuZXdlbWFpbCk7CgkgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwoJICAKCSAgJHE9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyI7CgkgICRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHEpOwoJICBpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+Um93Q291bnQoKSkgewoJICAgIHdoaWxlICgkcm93PSRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewoJICAgICAgaWYgKCRfUE9TVFskaWQuImdyb3VwIi4kcm93WyJpZCJdXT09InllcyIpIHsKCQkvL0NyZWF0ZSBhbiBhc3NvY2lhdGlvbgoJCSRxPSJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfYmVsb25ncyAodXNlcmlkLGdyb3VwaWQpIFZBTFVFUyAoPyw/KSI7CgkJJHBhcmFtczI9YXJyYXkoJG5ld2lkLCRyb3dbImlkIl0pOwoJCSRkYnJlc3VsdDI9JGRiLT5FeGVjdXRlKCRxLCRwYXJhbXMyKTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCSAgcmV0dXJuICIiOwoJfQoJCgogIC8vIG9sZCBmdW5jdGlvbiAobm90IHVzZWQ/KQogIC8vIHRvZG8sIHB1dCB0aGlzIGludG8gdGhlIFVzZXJNYW5pcHVsYXRvciBzdHVmZgoJZnVuY3Rpb24gQ3JlYXRlTmV3R3JvdXAoJGlkKSB7CgkJJGRiPSR0aGlzLT5HZXREYigpOwoJCSRuZXdncm91cG5hbWU9dHJpbSgkX1BPU1RbJGlkLiJncm91cG5hbWUiXSk7CgkJaWYgKCRuZXdncm91cG5hbWU9PSIiKSByZXR1cm4gIkEgdW5pcXVlIGdyb3VwIG5hbWUgbXVzdCBiZSBwcm92aWRlZCEiOwoJCSRxdWVyeT0iU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIFdIRVJFIGdyb3VwbmFtZT0nIi4kbmV3Z3JvdXBuYW1lLiInIjsKCQkkcmVzdWx0PSRkYi0+RXhlY3V0ZSgkcXVlcnkpOwoJCWlmICgkcmVzdWx0ICYmICRyZXN1bHQtPlJvd0NvdW50KCkpIHJldHVybiAiR3JvdXAgbmFtZSBhbHJlYWR5IGV4aXN0cyEiOwoJCSRuZXdncm91cGRlc2M9dHJpbSgkX1BPU1RbJGlkLiJncm91cGRlc2MiXSk7CgkJJG5ld2lkPSRkYi0+R2VuSUQoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfZmV1c2Vyc19ncm91cHNfc2VxIik7CgkJJHF1ZXJ5PSJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2ZldXNlcnNfZ3JvdXBzIChpZCxncm91cG5hbWUsZ3JvdXBkZXNjKSBWQUxVRVMgKD8sPyw/KSI7CgkJJHBhcmFtcz1hcnJheSgkbmV3aWQsJG5ld2dyb3VwbmFtZSwkbmV3Z3JvdXBkZXNjKTsKCQkkZGJyZXN1bHQ9JGRiLT5FeGVjdXRlKCRxdWVyeSwkcGFyYW1zKTsKCQlyZXR1cm4gIiI7Cgl9CgoKICAvLyBvbGQgZnVuY3Rpb24gKG5vdCB1c2VkPykKICAvLyB0b2RvLCBwdXQgdGhpcyBpbnRvIHRoZSBVc2VyTWFuaXB1bGF0b3Igc3R1ZmYKCWZ1bmN0aW9uIENoYW5nZUdyb3VwKCRpZCkgewoJCSRkYj0kdGhpcy0+R2V0RGIoKTsKCQlpZiAoaXNzZXQoJF9QT1NUWyRpZC4iZ3JvdXBpZCJdKSkgJGdyb3VwaWQ9dHJpbSgkX1BPU1RbJGlkLiJncm91cGlkIl0pOyBlbHNlIHJldHVybiAiVW5yZWNvdmVyYWJsZSBlcnJvciI7CgkJaWYgKGlzc2V0KCRfUE9TVFskaWQuImdyb3VwbmFtZSJdKSkgJGdyb3VwbmFtZT10cmltKCRfUE9TVFskaWQuImdyb3VwbmFtZSJdKTsgZWxzZSByZXR1cm4gIkEgdW5pcXVlIGdyb3VwIG5hbWUgbXVzdCBiZSBwcm92aWRlZCEiOwoKCQkvL0NoZWNrIGZvciBleGlzdGluZyBncm91cG5hbWUKCQkkcXVlcnk9IlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBXSEVSRSBncm91cG5hbWU9JyIuJGdyb3VwbmFtZS4iJyI7CgkJJHJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5KTsKCQlpZiAoJHJlc3VsdCAmJiAkcmVzdWx0LT5Sb3dDb3VudCgpKSB7CgkJCSRyb3c9JHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJaWYgKCRyb3dbImlkIl0hPSRncm91cGlkKSByZXR1cm4gIkdyb3VwIG5hbWUgYWxyZWFkeSBleGlzdHMhIjsKCQkJLy9FbHNlIHNhbWUgZ3JvdXAuLi4KCQl9CgoJCSRncm91cGRlc2M9dHJpbSgkX1BPU1RbJGlkLiJncm91cGRlc2MiXSk7CgkJJHF1ZXJ5PSJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9mZXVzZXJzX2dyb3VwcyBTRVQgZ3JvdXBuYW1lPT8sZ3JvdXBkZXNjPT8gV0hFUkUgaWQ9PyI7CgkJJHBhcmFtcz1hcnJheSgkZ3JvdXBuYW1lLCRncm91cGRlc2MsJGdyb3VwaWQpOwoJCSRkYnJlc3VsdD0kZGItPkV4ZWN1dGUoJHF1ZXJ5LCRwYXJhbXMpOwoJfQoKCgkKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyAgQVBJIEZVTkNUSU9OUyAvLwogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICBmdW5jdGlvbiBDb3VudFRlbXBDb2RlUmVjb3JkcygpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkNvdW50VGVtcENvZGVSZWNvcmRzKCk7CiAgfQoKICBmdW5jdGlvbiBFeHBpcmVUZW1wQ29kZXMoICRleHBpcnljb2RlICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RXhwaXJlVGVtcENvZGVzKCAkZXhwaXJ5Y29kZSApOwogIH0KCiAgZnVuY3Rpb24gUmVtb3ZlVXNlclRlbXBDb2RlKCAkdWlkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+UmVtb3ZlVXNlclRlbXBDb2RlKCAkdWlkICk7CiAgfSAgCgogIGZ1bmN0aW9uIEdldFVzZXJUZW1wQ29kZSggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldFVzZXJUZW1wQ29kZSggJHVpZCApOwogIH0gIAoKICBmdW5jdGlvbiBTZXRVc2VyVGVtcENvZGUoICR1aWQsICRjb2RlICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlclRlbXBDb2RlKCAkdWlkLCAkY29kZSApOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJvcGVydHlEZWZuKCAkbmFtZSwgJG5ld25hbWUsICRwcm9tcHQsICRsZW5ndGgsICR0eXBlLCAkbWF4bGVuZ3RoICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0UHJvcGVydHlEZWZuKCAkbmFtZSwgJG5ld25hbWUsICRwcm9tcHQsICRsZW5ndGgsICR0eXBlLCAkbWF4bGVuZ3RoICk7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRQcm9wZXJ0eUdyb3VwUmVsYXRpb25zKCAkdGl0bGUgKTsKICB9CgogIGZ1bmN0aW9uIElzQWNjb3VudEV4cGlyZWQoICR1aWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Jc0FjY291bnRFeHBpcmVkKCAkdWlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKTsKICB9CgogIGZ1bmN0aW9uIEFkZEdyb3VwUHJvcGVydHlSZWxhdGlvbiggJGdycGlkLCAkcHJvcG5hbWUsICRzb3J0a2V5LCAkdmFsICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+QWRkR3JvdXBQcm9wZXJ0eVJlbGF0aW9uKCAkZ3JwaWQsICRwcm9wbmFtZSwgJHNvcnRrZXksICR2YWwgKTsKICB9CgkKICBmdW5jdGlvbiBEZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQgKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZUFsbEdyb3VwUHJvcGVydHlSZWxhdGlvbiggJGdycGlkLCAkcHJvcG5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVBbGxHcm91cFByb3BlcnR5UmVsYXRpb25zKCAkZ3JwaWQsICRwcm9wbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gQWRkUHJvcGVydHlEZWZuKCAkbmFtZSwgJHByb21wdCwgJHR5cGUsICRsZW5ndGgsICRtYXhsZW5ndGggKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5BZGRQcm9wZXJ0eURlZm4oICRuYW1lLCAkcHJvbXB0LCAkdHlwZSwgJGxlbmd0aCwgJG1heGxlbmd0aCApOwogIH0KCiAgZnVuY3Rpb24gQWRkU2VsZWN0T3B0aW9ucyggJG5hbWUsICRzZWxvcHRpb25zICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+QWRkU2VsZWN0T3B0aW9ucyggJG5hbWUsICRzZWxvcHRpb25zICk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlUHJvcGVydHlEZWZuKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlUHJvcGVydHlEZWZucygpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVByb3BlcnR5RGVmbnMoKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVNlbGVjdE9wdGlvbnMoICRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+RGVsZXRlU2VsZWN0T3B0aW9ucyggJG5hbWUgKTsKICB9CgogIGZ1bmN0aW9uIEdldFByb3BlcnR5RGVmbnMoKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRQcm9wZXJ0eURlZm5zKCk7CiAgfQoKICBmdW5jdGlvbiBHZXRQcm9wZXJ0eURlZm4oICRuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0UHJvcGVydHlEZWZuKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gR2V0U2VsZWN0T3B0aW9ucyggJG5hbWUsICRkaW0gKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRTZWxlY3RPcHRpb25zKCAkbmFtZSwgJGRpbSApOwogIH0KCiAgZnVuY3Rpb24gTG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+TG9naW4oICR1c2VybmFtZSwgJHBhc3N3b3JkICk7CiAgfQoKICBmdW5jdGlvbiBBc3NpZ25Vc2VyVG9Hcm91cCggJHVpZCwgJGdpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkFzc2lnblVzZXJUb0dyb3VwKCAkdWlkLCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBJc1ZhbGlkUGFzc3dvcmQoICRwYXNzd29yZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPklzVmFsaWRQYXNzd29yZCggJHBhc3N3b3JkICk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyRnVsbCggJHVpZCApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVVzZXJGdWxsKCAkdWlkICk7CiAgfQoKICBmdW5jdGlvbiBHZXRHcm91cEluZm8oICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRHcm91cEluZm8oICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIENvdW50VXNlcnNJbkdyb3VwKCAkZ2lkID0gJycgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Db3VudFVzZXJzSW5Hcm91cCggJGdpZCApOwogIH0KCiAgZnVuY3Rpb24gR2V0VXNlckluZm8oICR1aWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRVc2VySW5mbyggJHVpZCApOwogIH0KIAogIGZ1bmN0aW9uIEdldFVzZXJzSW5Hcm91cCggJGdpZCA9ICcnLCAkcmVnZXggPSAnJywgJGxpbWl0ID0gJycsICRzb3J0ID0gJycsCgkJCSAgJHByb3BlcnR5ID0gJycsICRwcm9wcmVnZXggPSAnJykKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlcnNJbkdyb3VwKCAkZ2lkLCAkcmVnZXgsICRsaW1pdCwgJHNvcnQsCgkJCQkJICAgICAgJHByb3BlcnR5LCAkcHJvcHJlZ2V4ICk7CiAgfQoKICBmdW5jdGlvbiBHcm91cEV4aXN0c0J5SUQoICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Hcm91cEV4aXN0c0J5SUQoICRnaWQgKTsKICB9CgogIGZ1bmN0aW9uIEdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdyb3VwRXhpc3RzQnlOYW1lKCAkbmFtZSApOwogIH0KCiAgZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggJGVtYWlsLCAkc210cHZhbGlkYXRlID0gZmFsc2UgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Jc1ZhbGlkRW1haWxBZGRyZXNzKCAkZW1haWwsICRzbXRwdmFsaWRhdGUgKTsKICB9CgogIGZ1bmN0aW9uIElzVmFsaWRVc2VybmFtZSggJHVzZXJuYW1lICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+SXNWYWxpZFVzZXJuYW1lKCAkdXNlcm5hbWUgKTsKICB9CgogIGZ1bmN0aW9uIFJlbW92ZVVzZXJGcm9tR3JvdXAoICR1aWQsICRnaWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5SZW1vdmVVc2VyRnJvbUdyb3VwKCAkdWlkLCAkZ2lkICk7CiAgfQoKICBmdW5jdGlvbiBTZXRHcm91cCggJGdpZCwgJG5hbWUsICRkZXNjICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0R3JvdXAoICRnaWQsICRuYW1lLCAkZGVzYyApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclBhc3N3b3JkKCAkdWlkLCAkcGFzc3dvcmQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyUGFzc3dvcmQoICR1aWQsICRwYXNzd29yZCApOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlciggJHVpZCwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzID0gZmFsc2UgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyKCAkdWlkLCAkdXNlcm5hbWUsICRwYXNzd29yZCwgJGV4cGlyZXMgKTsKICB9CgogIGZ1bmN0aW9uIFNldFVzZXJHcm91cHMoICR1aWQsICRncnBpZHMgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5TZXRVc2VyR3JvdXBzKCAkdWlkLCAkZ3JwaWRzICk7CiAgfQoKICBmdW5jdGlvbiBTZXRVc2VyUHJvcGVydGllcyggJHVpZCwgJHByb3BzICkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+U2V0VXNlclByb3BlcnRpZXMoICR1aWQsICRwcm9wcyApOwogIH0KCiAgZnVuY3Rpb24gVXNlckV4aXN0c0J5SUQoICR1aWQgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5Vc2VyRXhpc3RzQnlJRCggJHVpZCApOwogIH0KCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnRpZXMoJHVpZCkKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclByb3BlcnRpZXMoICR1aWQgKTsKICB9CgogIGZ1bmN0aW9uIEdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkdldE1lbWJlckdyb3Vwc0FycmF5KCR1c2VyaWQpOwogIH0KCiAgZnVuY3Rpb24gR2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGVmYXVsdHZhbHVlPWZhbHNlKSAKICB7CiAgICByZXR1cm4gJHRoaXMtPnVzZXJtYW5pcC0+R2V0VXNlclByb3BlcnR5KCAkdGl0bGUsICRkZWZhdWx0dmFsdWUgKTsKICB9CgogIGZ1bmN0aW9uIEdldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCR1c2VyaWQsICRkZWZhdWx0dmFsdWU9ZmFsc2UpIAogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5HZXRVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRkZWZhdWx0dmFsdWUpOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5KCR0aXRsZSwkZGF0YSkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPlNldFVzZXJQcm9wZXJ0eSgkdGl0bGUsJGRhdGEpOwogIH0KCiAgZnVuY3Rpb24gU2V0VXNlclByb3BlcnR5RnVsbCgkdGl0bGUsJGRhdGEsJHVzZXJpZCkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPlNldFVzZXJQcm9wZXJ0eUZ1bGwoJHRpdGxlLCRkYXRhLCR1c2VyaWQpOwogIH0KCiAgZnVuY3Rpb24gRGVsZXRlVXNlclByb3BlcnR5QnlOYW1lKCAkdGl0bGUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+dXNlcm1hbmlwLT5EZWxldGVVc2VyUHJvcGVydHlCeU5hbWUoJHRpdGxlKTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbD1mYWxzZSkgCiAgewogICAgcmV0dXJuICR0aGlzLT51c2VybWFuaXAtPkRlbGV0ZVVzZXJQcm9wZXJ0eSgkdGl0bGUsJGFsbCk7CiAgfQoKICBmdW5jdGlvbiBEZWxldGVVc2VyUHJvcGVydHlGdWxsKCR0aXRsZSwkdXNlcmlkLCRhbGw9ZmFsc2UpIAogIHsKICAgIHJldHVybiAkdGhpcy0+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[PD9waHAKJGxhbmdbJ2Vycm9yX25vZW1haWxhZGRyZXNzJ10gPSAnV2UgY291bGQgbm90IGZpbmQgYW4gZW1haWwgYWRkcmVzcyBmb3IgdGhpcyBhY2NvdW50JzsKJGxhbmdbJ3VzZXJfYWRkZWQnXSA9ICdVc2VyIEFkZGVkICVzID0gJXMnOwokbGFuZ1sndXNlcl9kZWxldGVkJ10gPSAnVXNlciBEZWxldGVkIHVpZD0lcyc7CiRsYW5nWydwcm9wZXJ0eWZpbHRlciddID0gJ1Byb3BlcnR5JzsKJGxhbmdbJ3ZhbHVlcmVnZXgnXSA9ICdWYWx1ZSAocmVndWxhciBleHByZXNzaW9uKSc7CiRsYW5nWyd3YXJuaW5nX2VmZmVjdHNmaWVsZGxlbmd0aCddID0gJ1dhcm5pbmc6IFRoZXNlIGZpZWxkcyBhZmZlY3QgdGhlIHNpemUgb2YgaW5wdXQgZmllbGRzIGZvciBmb3Jtcy4gIERlY3JlYXNpbmcgdGhpcyBudW1iZXIgb24gYW4gZXhpc3Rpbmcgc2l0ZSBtYXkgbm90IGJlIGFkdmlzYWJsZSc7CiRsYW5nWydjb25maXJtX3N1Ym1pdHByZWZzJ10gPSAnQ2hhbmdlIGFkbWluIHByZWZlcmVuY2VzPyc7CiRsYW5nWydlcnJvcl9lbWFpbGFscmVhZHl1c2VkJ10gPSAnRW1haWwgYWRkcmVzcyBhbHJlYWR5IHVzZWQnOwokbGFuZ1sncHJvbXB0X2FsbG93X2R1cGxpY2F0ZV9lbWFpbHMnXSA9ICdBbGxvdyBkdXBsaWNhdGUgZW1haWxzJzsKJGxhbmdbJ2luZm9fYWxsb3dfZHVwbGljYXRlX2VtYWlscyddID0gJyhhbGxvdyBtdWx0aXBsZSB1c2VycyB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MpJzsKJGxhbmdbJ2Vycm9yX21pc3Npbmd1c2VybmFtZSddID0gJ1lvdSBkaWQgbm90IGVudGVyIGEgdXNlcm5hbWUnOwokbGFuZ1snZXJyb3JfbWlzc2luZ3Bhc3N3b3JkJ10gPSAnWW91IGRpZCBub3QgZW50ZXIgYSBwYXNzd29yZCc7CiRsYW5nWydmcm9udGVuZHVzZXJfbG9nb3V0J10gPSAnRnJvbnRlbmQgVXNlciBMb2dvdXQnOwokbGFuZ1snZnJvbnRlbmR1c2VyX2xvZ2dlZGluJ10gPSAnRnJvbnRlbmQgVXNlciBMb2dpbic7CiRsYW5nWydlZGl0cHJvcF9pbmZvbXNnJ10gPSAnPGZvbnQgY29sb3I9InJlZCI+PGI+VVNFIENBVVRJT048L2I+IHdoZW4gY2hhbmdpbmcgZXhpc3RpbmcgcHJvcGVydGllcyB0aGF0IGFyZSBhc3NpZ25lZCB0byBncm91cHMsIHlvdSBtYXkgcG90ZW50aWFsbHkgY2F1c2UgZGFtYWdlIGFuZCBicmVhayBhbiBleGlzdGluZyBzaXRlIDxpPihlc3BlY2lhbGx5IGlmIHlvdSByZWR1Y2UgZmllbGQgbGVuZ3RocywgZXRjKTwvaT48L2ZvbnQ+JzsKJGxhbmdbJ2luZm9fc210cHZhbGlkYXRlJ10gPSAnVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIG9uIHdpbmRvd3MnOwokbGFuZ1snbXNnX2RvbnRjcmVhdGV1c2VybmFtZSddID0gJ0RvIG5vdCBjcmVhdGUgYSBwcm9wZXJ0eSBmb3IgdXNlcm5hbWUsIG9yIHNvbWUgc3VjaCB0aGluZyBhcyB0aGlzIGlzIGJ1aWx0aW4gdG8gdGhlIEZyb250RW5kVXNlcnMgbW9kdWxlJzsKJGxhbmdbJ3Byb21wdF9leHBvcnRjc3YnXSA9ICdFeHBvcnQgVXNlcnMgdG8gQ1NWJzsKJGxhbmdbJ2V4cG9ydGNzdiddID0gJ0V4cG9ydCc7CiRsYW5nWydhZG1pbiddID0gJ0FkbWluJzsKJGxhbmdbJ2VkaXRwcm9wJ10gPSAnRWRpdCBQcm9wZXJ0eSc7CiRsYW5nWydtYXhsZW5ndGgnXSA9ICdNYXhpbXVtIExlbmd0aCc7CiRsYW5nWydjcmVhdGVkJ10gPSAnQ3JlYXRlZCc7CiRsYW5nWydzb3J0YnknXSA9ICdTb3J0IEJ5JzsKJGxhbmdbJ3NvcnQnXSA9ICdTb3J0aW5nJzsKJGxhbmdbJ3VzZXJzaW5ncm91cCddID0gJ1VzZXJzIGluIHRoZSBzZWxlY3RlZCBncm91cChzKSc7CiRsYW5nWyd1c2VybGltaXQnXSA9ICdMaW1pdCByZXN1bHRzIHRvJzsKJGxhbmdbJ2Vycm9yX25vZW1haWxmaWVsZCddID0gJ0NvdWxkIG5vdCBmaW5kIGFuIGVtYWlsIGZpZWxkIGZvciB0aGlzIHVzZXIuICBZb3UgbWF5IG5lZWQgdG8gY29udGFjdCB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3InOwokbGFuZ1sncHJvbXB0X2ZvcmdvdHB3X3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgZm9yIEZvcmdvdCBQYXNzd29yZCBmb3JtJzsKJGxhbmdbJ3Byb21wdF9jaGFuZ2VzZXR0aW5nc19wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIGZvciBDaGFuZ2UgU2V0dGluZ3MgZm9ybSc7CiRsYW5nWydwcm9tcHRfbG9naW5fcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyB0byBqdW1wIHRvIGFmdGVyIGxvZ2luJzsKJGxhbmdbJ3Byb21wdF9sb2dvdXRfcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyB0byBqdW1wIHRvIGFmdGVyIGxvZ291dCc7CiRsYW5nWydzb3J0b3JkZXInXSA9ICdTb3J0IG9yZGVyJzsKJGxhbmdbJ3Byb21wdF9udW1yZXNldHJlY29yZCddID0gJ0EgbnVtYmVyIG9mIHVzZXJzIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHJlc2V0dGluZyBsb3N0IHBhc3N3b3Jkcy4gIEN1cnJlbnRseSB0aGlzIGNvdW50IGlzIGF0Oic7CiRsYW5nWydyZW1vdmUxd2VlayddID0gJ1JlbW92ZSBhbGwgZW50cmllcyBtb3JlIHRoYW4gYSB3ZWVrIG9sZCc7CiRsYW5nWydyZW1vdmUxbW9udGgnXSA9ICdSZW1vdmUgYWxsIGVudHJpZXMgbW9yZSB0aGFuIGEgbW9udGggb2xkJzsKJGxhbmdbJ3JlbW92ZWFsbCddID0gJ1JlbW92ZSBhbGwgZW50cmllcyc7CiRsYW5nWydhcmV5b3VzdXJlJ10gPSAnQXJlIHlvdSBzdXJlPyc7IAokbGFuZ1snZXJyb3JfaW52YWxpZGNvZGUnXSA9ICdBbiBpbnZhbGlkIGNvZGUgaGFzIGJlZW4gZW50ZXJlZCwgcGxlYXNlIHRyeSBhZ2Fpbic7CiRsYW5nWydlcnJvcl90ZW1wY29kZW5vdGZvdW5kJ10gPSAnQSB0ZW1wb3JhcnkgY29kZSBmb3IgeW91ciB1c2VyIGlkIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgZGF0YWJhc2UnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfdmVyaWZ5dGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSB1c2VkIHRvIGRpc3BsYXkgdmVyaWZpY2F0aW9uIGZvcm0nOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfZW1haWx0ZW1wbGF0ZSddID0gJ1RlbXBsYXRlIHVzZWQgZm9yIGZvcmdvdHRlbiBwYXNzd29yZCBlbWFpbCc7IAokbGFuZ1snZXJyb3JfcmVzZXRhbHJlYWR5c2VudCddID0gJ0VpdGhlciB5b3Vyc2VsZiBvciBzb21lb25lIGVsc2UgaGFzIGFscmVhZHkgdHJpZ2dlcmVkIGEgcGFzc3dvcmQgcmVzZXQgb3BlcmF0aW9uIGZvciB0aGlzIGFjY291bnQuICBDaGVjayB5b3VyIGVtYWlsLCB5b3UgbWF5IGhhdmUgZnVydGhlciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHJlc2V0IHlvdXIgcGFzc3dvcmQgaW4geW91ciBpbmJveCc7CiRsYW5nWydlcnJvcl9kYmVycm9yJ10gPSAnRGF0YWJhc2UgZXJyb3InOwokbGFuZ1snbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsJ10gPSAnWW91IGFyZSByZWNlaXZpbmcgdGhpcyBtZXNzYWdlIGJlY2F1c2Ugc29tZWJvZHkgdG9sZCBvdXIgc2l0ZSB0aGF0IHlvdSBoYWQgbG9zdCB5b3VyIHBhc3N3b3JkLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93LiAgSWYgeW91IGRvblwndCBoYXZlIGEgY2x1ZSB3aGF0IHRoaXMgaXMsIHRoZW4geW91IGFyZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIG1lc3NhZ2UsIGFuZCB3ZSB0aGFuayB5b3UgZm9yIHlvdXIgdGltZS4nOwokbGFuZ1sncHJvbXB0X2NvZGUnXSA9ICdDb2RlJzsKJGxhbmdbJ21lc3NhZ2VfY29kZSddID0gJ1RoZSBmb2xsb3dpbmcgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQgcmFuZG9tbHkgZ2VuZXJhdGVkIGluIG9yZGVyIHRvIHZlcmlmeSB0aGUgdXNlciBhY2NvdW50LiAgd2hlbiB5b3UgY2xpY2sgb24gdGhlIGxpbmsgYmVsb3cgeW91IHdpbGwgYmUgcHJlc2VudGVkIHdpdGggYSBmaWVsZCB0byBlbnRlciB0aGlzIGNvZGUuICBOb3JtYWxseSB0aGUgZmllbGQgaXMgcHJlLWNvbXBsZXRlZCBmb3IgeW91LCBidXQgaW5jYXNlIGl0IGlzblwndCB0aGUgY29kZSBpczonOwokbGFuZ1sncHJvbXB0X2xpbmsnXSA9ICdDbGlja2luZyBvbiB0aGUgZm9sbG93aW5nIGxpbmsgd2lsbCB0YWtlIHlvdSB0byB0aGUgd2Vic2l0ZSB3aGVyZSB5b3UgY2FuIGVudGVyIHRoZSBhYm92ZSBjb2RlLCBhbmQgcmVzZXQgeW91ciBwYXNzd29yZDonOwokbGFuZ1snbG9zdHBhc3N3b3JkX2VtYWlsc3ViamVjdCddID0gJ0xvc3QgUGFzc3dvcmQnOwokbGFuZ1snZXJyb3Jfbm9tYWlsZXJtb2R1bGUnXSA9ICdDb3VsZCBub3QgZmluZCB0aGUgQ01TTWFpbGVyIG1vZHVsZSc7CiRsYW5nWydpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnXSA9ICdBbiBlbWFpbCBoYXMgYmVlbiBzZW50IHRvICVzIHdpdGggaW5zdHJ1Y3Rpb25zIGFzIHRvIGhvdyB0byByZXNldCB5b3VyIHBhc3N3b3JkLiAgVGhhbmsgeW91JzsKJGxhbmdbJ2xvc3Rwd19tZXNzYWdlJ10gPSAnU28geW91IGZvcmdvdCBvciBsb3N0IHlvdXIgcGFzc3dvcmQuIFdlbGwsIHR5cGUgeW91ciB1c2VybmFtZSBpbiBoZXJlLCBhbmQgaWYgd2UgY2FuIGZpbmQgeW91IHdlIHdpbGwgc2VuZCB5b3UgYW4gZW1haWwgd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHJlc2V0IGl0JzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJ10gPSAnRm9yZ290IFBhc3N3b3JkIFRlbXBhdGVzJzsKJGxhbmdbJ2Vycm9yX3Byb3Bub3Rmb3VuZCddID0gJ1Byb3BlcnR5ICVzIG5vdCBmb3VuZCc7CiRsYW5nWydwcm9wc2ZvdW5kJ10gPSAnUHJvcGVydGllcyBmb3VuZCc7CiRsYW5nWydhZGRwcm9wJ10gPSAnQWRkIFByb3BlcnR5JzsKJGxhbmdbJ2Vycm9yX3JlcXVpcmVkZmllbGQnXSA9ICdBIHJlcXVpcmVkIGZpZWxkICglcykgd2FzIGVtcHR5JzsKJGxhbmdbJ2luZm9fZW1wdHlwYXNzd29yZGZpZWxkJ10gPSAnRW50ZXIgYSBuZXcgcGFzc3dvcmQgaGVyZSB0byBjaGFuZ2UgeW91ciBwYXNzd29yZCc7CiRsYW5nWydlcnJvcl9ub3Rsb2dnZWRpbiddID0gJ1lvdSBkbyBub3QgYXBwZWFyIHRvIGJlIGxvZ2dlZCBpbic7CiRsYW5nWyd1c2VyX3NldHRpbmdzJ10gPSAnU2V0dGluZ3MnOwokbGFuZ1sndXNlcl9yZWdpc3RyYXRpb24nXSA9ICdSZWdpc3RyYXRpb24nOwokbGFuZ1snZXJyb3JfYWNjb3VudGV4cGlyZWQnXSA9ICdUaGlzIGFjY291bnQgaGFzIGV4cGlyZWQnOwokbGFuZ1snZXJyb3JfaW1wcm9wZXJlbWFpbGZvcm1hdCddID0gJ0ltcHJvcGVyIGVtYWlsIGFkZHJlc3MgZm9ybWF0dGluZyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkZXhwaXJ5ZGF0ZSddID0gJ0ludmFsaWQgZXhwaXJ5IGRhdGUnOwokbGFuZ1snZXJyb3JfcHJvYmxlbXNldHRpbmdwcm9wZXJ0eSddID0gJ0Vycm9yIHNldHRpbmcgcHJvcGVydHkgJXMgZm9yIHVzZXIgJHMnOwokbGFuZ1snZXJyb3JfaW52YWxpZGdyb3VwaWQnXSA9ICdJbnZhbGlkIGdyb3VwIGlkICVzJzsKJGxhbmdbJ3NvcnRvcmRlciddID0gJ1NvcnQgb3JkZXInOwokbGFuZ1snaGlkZGVuZmllbGRtYXJrZXInXSA9ICdIaWRkZW4gZmllbGQgbWFya2VyJzsKJGxhbmdbJ2hpZGRlbmZpZWxkY29sb3InXSA9ICdIaWRkZW4gZmllbGQgY29sb3InOwokbGFuZ1snaGlkZGVuJ10gPSAnSGlkZGVuJzsKJGxhbmdbJ2Vycm9yX2R1cGxpY2F0ZW5hbWUnXSA9ICdBIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lIGlzIGFscmVhZHkgZGVmaW5lZCc7CiRsYW5nWydlcnJvcl9ub3Byb3BlcnRpZXMnXSA9ICdObyBwcm9wZXJ0aWVzIGRlZmluZWQnOwokbGFuZ1snZXJyb3Jfbm9yZWxhdGlvbnMnXSA9ICdObyBwcm9wZXJ0aWVzIHdlcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZ3JvdXAnOwokbGFuZ1snZ3JvdXBzZm91bmQnXSA9ICdHcm91cHMgZm91bmQnOwokbGFuZ1snZXJyb3Jfb25lZ3JvdXByZXF1aXJlZCddID0gJ01lbWJlcnNoaXAgaW4gYXQgbGVhc3Qgb25lIGdyb3VwIGlzIHJlcXVpcmVkJzsKJGxhbmdbJ3Byb21wdF9yZXF1aXJlb25lZ3JvdXAnXSA9ICdSZXF1aXJlIG1lbWJlcnNoaXAgaW4gYXRsZWFzdCBvbmUgZ3JvdXAnOwokbGFuZ1snYmFjayddID0gJ0JhY2snOwokbGFuZ1snZXJyb3JfbWlzc2luZ19yZXF1aXJlZF9wYXJhbSddID0gJyVzIGlzIGEgcmVxdWlyZWQgZmllbGQnOwokbGFuZ1sncmVxdWlyZWRmaWVsZG1hcmtlciddID0gJ01hcmsgcmVxdWlyZWQgZmllbGRzIHdpdGgnOwokbGFuZ1sncmVxdWlyZWRmaWVsZGNvbG9yJ10gPSAnSGlsaXRlIHJlcXVpcmVkIGZpZWxkcyBpbic7CiRsYW5nWyduZXh0J10gPSAnTmV4dCc7CiRsYW5nWydlcnJvcl9ncm91cGV4aXN0cyddID0gJ0EgR3JvdXAgd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMnOwokbGFuZ1sncmVxdWlyZWQnXSA9ICdSZXF1aXJlZCc7CiRsYW5nWydvcHRpb25hbCddID0gJ09wdGlvbmFsJzsKJGxhbmdbJ29mZiddID0gJ09mZic7CiRsYW5nWydsZW5ndGgnXSA9ICdMZW5ndGgnOwokbGFuZ1snbGVuZ3RoY29tbWVudCddID0gJzxicj4oY2hhcnMgaW4gdGhlIHRleHQgaW5wdXQpJzsKJGxhbmdbJ3NlbG9wdGlvbnMnXSA9ICdEcm9wZG93biBvcHRpb25zLCBzZXBhcmF0ZWQgYnkgbGluZSBicmVha3MnOwokbGFuZ1sneWVzJ10gPSAnWWVzJzsKJGxhbmdbJ3Byb21wdCddID0gJ1Byb21wdCc7CiRsYW5nWyd0eXBlJ10gPSAnVHlwZSc7CiRsYW5nWydyZXF1aXJlZCddID0gJ1JlcXVpcmVkIEZpZWxkJzsKJGxhbmdbJ3RleHQnXSA9ICdUZXh0JzsKJGxhbmdbJ2NoZWNrYm94J10gPSAnQ2hlY2tib3gnOwokbGFuZ1snZW1haWwnXSA9ICdFbWFpbCc7CiRsYW5nWyd0ZXh0YXJlYSddID0gJ1RleHRhcmVhJzsKJGxhbmdbJ2Ryb3Bkb3duJ10gPSAnRHJvcGRvd24nOwokbGFuZ1snbXNnX2N1cnJlbnRseWxvZ2dlZGluYXMnXSA9ICdXZWxjb21lJzsKJGxhbmdbJ2xvZ291dCddID0gJ1NpZ24gb3V0JzsKJGxhbmdbJ3Byb21wdF9jaGFuZ2VzZXR0aW5ncyddID0gJ0NoYW5nZSBNeSBTZXR0aW5ncyc7CiRsYW5nWydlcnJvcl9sb2dpbmZhaWxlZCddID0gJ0xvZ2luIGZhaWxlZCAtIEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQ/JzsKJGxhbmdbJ2xvZ2luJ10gPSAnU2lnbiBpbic7CiRsYW5nWydwcm9tcHRfdXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWydwcm9tcHRfcGFzc3dvcmQnXSA9ICdQYXNzd29yZCc7CiRsYW5nWydyZWdpc3RlciddID0gJ1JlZ2lzdGVyJzsKJGxhbmdbJ2ZvcmdvdHB3J10gPSAnRm9yZ290IFlvdXIgUGFzc3dvcmQ/JzsKJGxhbmdbJ2RlZmF1bHRzJ10gPSAnRGVmYXVsdHMnOwokbGFuZ1sndGVtcGxhdGUnXSA9ICdUZW1wbGF0ZSc7CiRsYW5nWydlcnJvcl91c2Vybm90Zm91bmQnXSA9ICdVc2VyIElEIG5vdCBmb3VuZCc7CiRsYW5nWydlcnJvcl91c2VybmFtZXRha2VuJ10gPSAnVGhhdCB1c2VybmFtZSAoJXMpIGlzIGFscmVhZHkgaW4gdXNlJzsKJGxhbmdbJ3Byb21wdF9zbXRwdmFsaWRhdGUnXSA9ICdVc2UgU01UUCB0byB2YWxpZGF0ZSBlbWFpbCBhZGRyZXNzZXM/JzsKJGxhbmdbJ3Byb21wdF9taW5wd2xlbiddID0gJ01pbmltdW0gUGFzc3dvcmQgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9tYXhwd2xlbiddID0gJ01heGltdW0gUGFzc3dvcmQgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9taW51bmxlbiddID0gJ01pbmltdW0gVXNlcm5hbWUgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9tYXh1bmxlbiddID0gJ01heGltdW0gVXNlcm5hbWUgTGVuZ3RoJzsKJGxhbmdbJ3Byb21wdF9zZXNzaW9udGltZW91dCddID0gJ1Nlc3Npb24gVGltZW91dCAoc2Vjb25kcyknOwokbGFuZ1sncHJvbXB0X2FsbG93ZW1haWxyZWcnXSA9ICdBbGxvdyBFbWFpbCBSZWdpc3RyYXRpb24nOwokbGFuZ1sncHJvbXB0X2RmbHRncm91cCddID0gJ0RlZmF1bHQgR3JvdXAgZm9yIG5ldyB1c2Vycyc7CiRsYW5nWydjaGFuZ2VzZXR0aW5nc190ZW1wbGF0ZSddID0gJ0NoYW5nZSBTZXR0aW5ncyBUZW1wbGF0ZSc7CiRsYW5nWydlcnJvcl9wYXNzd29yZG1pc21hdGNoJ10gPSAnUGFzc3dvcmRzIERvIG5vdCBtYXRjaCc7CiRsYW5nWydlcnJvcl9pbnZhbGlkdXNlcm5hbWUnXSA9ICdJbnZhbGlkIFVzZXJuYW1lJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXNzd29yZCddID0gJ0ludmFsaWQgUGFzc3dvcmQnOwokbGFuZ1snZWRpdHVzZXInXSA9ICdFZGl0IFVzZXInOwokbGFuZ1sndmFsaWQnXSA9ICdWYWxpZCc7CiRsYW5nWyd1c2VybmFtZSddID0gJ1VzZXJuYW1lJzsKJGxhbmdbJ3N0YXR1cyddID0gJ1N0YXR1cyc7CiRsYW5nWydlcnJvcl9tZW1iZXJncm91cHMnXSA9ICdUaGlzIHVzZXIgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncm91cHMnOwokbGFuZ1snZXJyb3JfcHJvcGVydGllcyddID0gJ05vIFByb3BlcnRpZXMnOwokbGFuZ1sndmFsdWUnXSA9ICdWYWx1ZSc7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cHMnOwokbGFuZ1sncHJvcGVydGllcyddID0gJ1Byb3BlcnRpZXMnOwokbGFuZ1sncHJvcG5hbWUnXSA9ICdQcm9wZXJ0eSBOYW1lJzsKJGxhbmdbJ3Byb3B2YWx1ZSddID0gJ1Byb3BlcnR5IFZhbHVlJzsKJGxhbmdbJ2FkZCddID0gJ0FkZCc7CiRsYW5nWydlZGl0J10gPSAnRWRpdCc7CiRsYW5nWydleHBpcmVzJ10gPSAnRXhwaXJlcyc7CiRsYW5nWydzcGVjaWZ5X2RhdGUnXSA9ICdTcGVjaWZ5IERhdGUnOwokbGFuZ1snMTJocnMnXSA9ICcxMiBIb3Vycyc7CiRsYW5nWycyNGhycyddID0gJzI0IEhvdXJzJzsKJGxhbmdbJzQ4aHJzJ10gPSAnNDggSG91cnMnOwokbGFuZ1snMXdlZWsnXSA9ICcxIFdlZWsnOwokbGFuZ1snMndlZWtzJ10gPSAnMiBXZWVrcyc7CiRsYW5nWycxbW9udGgnXSA9ICcxIE1vbnRoJzsKJGxhbmdbJzNtb250aHMnXSA9ICczIE1vbnRocyc7CiRsYW5nWyc2bW9udGhzJ10gPSAnNiBNb250aHMnOwokbGFuZ1snMXllYXInXSA9ICcxIFllYXInOwokbGFuZ1snbmV2ZXInXSA9ICdOZXZlcic7CiRsYW5nWydwb3N0aW5zdGFsbG1lc3NhZ2UnXSA9ICdNb2R1bGUgaW5zdGFsbGVkIHN1Y2Vzc2Z1bGx5Ljxici8+QmUgc3VyZSB0byBzZXQgdGhlICJNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMgcGVybWlzc2lvbi4iJzsKJGxhbmdbJ2VtYWlsJ10gPSAnRW1haWwgQWRkcmVzcyc7CiRsYW5nWydwYXNzd29yZCddID0gJ1Bhc3N3b3JkJzsKJGxhbmdbJ3JlcGVhdHBhc3N3b3JkJ10gPSAnQWdhaW4nOwokbGFuZ1snZXJyb3JfZ3JvdXBuYW1lX2V4aXN0cyddID0gJ0dyb3VwIGJ5IHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cyc7CiRsYW5nWydlZGl0Z3JvdXAnXSA9ICdFZGl0IEdyb3VwJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snZGVsZXRlJ10gPSAnRGVsZXRlJzsKJGxhbmdbJ2NvbmZpcm1fZWRpdGdyb3VwJ10gPSAnQXJlIHlvdSBzdXJlIHRoaXMgaXMgdGhlIHByb3BlciBzZXR0aW5ncyBmb3IgdGhpcyBncm91cD9cblR1cm5pbmcgYSBwcm9wZXJ0eSBvZmYgd2lsbCBub3QgZGVsZXRlIGFueSBlbnRyaWVzIGluIHRoZSBwcm9wZXJ0aWVzIHRhYmxlIGZvciB0aGlzIGdyb3VwL3VzZXIuICBUaGV5IHdpbGwgbWVyZWx5IGJlIHVuYXZhaWxhYmxlLic7CiRsYW5nWydhcmV5b3VzdXJlX2RlbGV0ZWdyb3VwJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGdyb3VwPyc7CiRsYW5nWydjb25maXJtX2RlbGV0ZV9wcm9wJ10gPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgZGVsZXRlIHRoaXMgcHJvcGVydHk/XG5Eb2luZyBzbyB3aWxsIGFsc28gZXJhc2UgYW55IHVzZXIgZW50cmllcyBmb3IgdGhpcyBwcm9wZXJ0eS4nOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnSW5zdWZmaWNpZW50IFBhcmFtZXRlcnMnOwokbGFuZ1snaWQnXSA9ICdJZCc7CiRsYW5nWyd1c2VybmFtZSddID0gJ1VzZXJuYW1lJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ2Vycm9yX2NhbnRhZGRnb3J1cCddID0gJ1Byb2JsZW0gYWRkaW5nIGdyb3VwJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXJhbXMnXSA9ICdJbnZhbGlkIFBhcmFtZXRlcnMnOwokbGFuZ1snYXBwbHlmaWx0ZXInXSA9ICdBcHBseSc7CiRsYW5nWydmaWx0ZXInXSA9ICdGaWx0ZXInOwokbGFuZ1sndXNlcmZpbHRlciddID0gJ1VzZXJuYW1lIFJlZ3VsYXIgRXhwcmVzc2lvbic7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ2dyb3VwbmFtZSddID0gJ0dyb3VwIE5hbWUnOwokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAnQWNjZXNzIERlbmllZCc7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yJzsKJGxhbmdbJ2FkZGdyb3VwJ10gPSAnQWRkIEdyb3VwJzsKJGxhbmdbJ2FkZHVzZXInXSA9ICdBZGQgVXNlcic7CiRsYW5nWydncm91cHNmb3VuZCddID0gJ0dyb3VwcyBGb3VuZCc7CiRsYW5nWyd1c2Vyc2ZvdW5kJ10gPSAnVXNlcnMgZm91bmQgdGhhdCBtYXRjaCB0aGUgY3JpdGVyaWEnOwokbGFuZ1snZ3JvdXAnXSA9ICdHcm91cCc7CiRsYW5nWydzZWxlY3Rncm91cCddID0gJ1NlbGVjdCBHcm91cCc7CiRsYW5nWydyZWdpc3RyYXRpb25fdGVtcGxhdGUnXSA9ICdSZWdpc3RyYXRpb24gVGVtcGxhdGUnOwokbGFuZ1snbG9nb3V0X3RlbXBsYXRlJ10gPSAnTG9nb3V0IFRlbXBsYXRlJzsKJGxhbmdbJ2xvZ2luX3RlbXBsYXRlJ10gPSAnTG9naW4gVGVtcGxhdGUnOwokbGFuZ1sncHJlZmVyZW5jZXMnXSA9ICdQcmVmZXJlbmNlcyc7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cHMnOwokbGFuZ1sndXNlcnMnXSA9ICJVc2VycyI7CiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdGcm9udGVuZCBVc2VyIE1hbmFnbWVudCc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ01hbmFnZSBGcm9udGVuZCBVc2Vycyc7CiRsYW5nWydkZWZhdWx0ZnJvbnRwYWdlJ10gPSAiRGVmYXVsdCBmcm9udCBwYWdlIjsKJGxhbmdbJ2xhc3RhY2Nlc3NlZHBhZ2UnXSA9ICdMYXN0IGFjY2Vzc2VkIHBhZ2UnOwokbGFuZ1snb3RoZXJwYWdlJ10gPSAnT3RoZXIgcGFnZTogJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gPDw8RU9GCjx1bD4KPGxpPjAuMC4xIC0gT2N0b2JlciwgMjAwNSAtIEluaXRpYWwgTlJQVCAoTm90IFJlYWR5IGZvciBQcmltZSBUaW1lKSByZWxlYXNlPC9saT4KPGxpPjAuMS4wIC0gT2N0b2JlciwgMjAwNSAtIEluaXRpYWwgcmVsZWFzZTwvbGk+CjxsaT4wLjEuMSAtIE9jdG9iZXIsIDIwMDUgLSBGaXhlZCBpc3N1ZXMgd2l0aCBwcm9wZXJ0aWVzPC9saT4KPGxpPjAuMS4yIC0gT2N0b2JlciwgMjAwNSAtIEFkZGVkIGZvcmdvdHRlbiBwYXNzd29yZCBmdW5jdGlvbmFsaXR5PC9saT4KPGxpPjxwPjAuMS4zIC0gTm92ZW1iZXIsIDIwMDU8L3A+CiAgICA8cD5BZGRlZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IGEgcmVkaXJlY3QgcGFnZSBvbiBsb2dpbiwgbG9nb3V0LCBmb3Jnb3QgcGFzc3dvcmQsIGFuZCBjaGFuZ2Ugc2V0dGluZ3MsIGFuZCBhZGRlZCB0aGUgcmV0dXJudG8gYW5kIGZvcm0gcGFyYW1ldGVycyB0byB0aGUgdXNlciBzaWRlIG9mIHRoaW5ncywgYWxzbyBkaWQgYSBjb3VwbGUgbGYgbGl0dGxlIGNsZWFudXBzLiAgVGhpcyB2ZXJzaW9uIHJlcXVpcmVzIHYwLjExIGFuZCBhYm92ZSBmb3IgY2VydGFpbi48L3A+PC9saT4KPGxpPjAuMS40IC0gTm92ZW1iZXIsIDIwMDUgLSBWZXJ5IG1pbm9yIGNoYW5nZSB3aXRoIHJlc3BlY3QgdG8gYSBmb3Jnb3R0ZW4gYW5kIG5vIGxvbmdlciBuZWVkZWQgZnVuY3Rpb24gY2FsbDwvbGk+CjxsaT48cD4wLjEuNSAtIE5vdmVtYmVyLCAyMDA1PC9wPgogICAgPHA+QW5vdGhlciB2ZXJ5IG1pbm9yIGNoYW5nZSwgYWRkZWQgc29tZSB0ZXh0IHRvIHRoZSBQb3N0SW5zdGFsbCBtZXNzYWdlLjwvcD48L2xpPgo8bGk+PHA+MC4xLjYgLSBKYW51YXJ5LCAyMDA2PHA+CiAgICA8cD5DaGFuZ2VzIHRvIHRoZSBwZXJtaXNzaW9uIG1vZGVsLCBhbmQgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSBwcmVmZXJlbmNlcy4gIEFsc28gc29tZSBwaHA1IGZpeGVzIGJ1dCBJIGFtIHN1cmUgdGhhdCB0aGVyZSBhcmUgbW9yZSBvdXQgdGhlcmUuPC9wPjwvbGk+CjxsaT48cD4wLjEuNyAtIEphbnVhcnksIDIwMDY8cD4KICAgIDxwPk1hbnkgdGhhbmtzIHRvIDxiPmthdG9uPC9iPiBmb3IgYWRkaW5nIHRoZSB0ZXh0YXJlYSBhbmQgZHJvcGRvd24gcHJvcGVydHkgdHlwZXMuPC9wPgogICAgPHA+Rml4ZXMgdG8gdGhlIHByb3BlcnR5IGFkZGluZyB0byBmaXggcHJvYmxlbXMgd2l0aCBzcGFjZXMgaW4gcHJvcGVydHkgbmFtZXMgKHdlIG5vIGxvbmdlciBsZXQgdGhhdCBoYXBwZW4pLjwvcD4KPC9saT4KPGxpPjxwPjEuMC4wIC0gRmVicnVhcnksIDIwMDY8cD4KICAgIDxwPkFkZGVkIGZpbHRlcmluZyBhbmQgcm93IGxpbWl0aW5nIHRvIHRoZSBhZG1pbiBwYW5lbC4gVGhpcyB3aWxsIGhhdmUgYmlnIGJlbmVmaXRzIHRvIHRob3NlIHRoYXQgYXJlIHVzaW5nIHRoaXMgbW9kdWxlIGZvciBoaWdoIHRyYWZpYywgYW5kIGhpZ2ggdXNlciBzaXRlcy48L3A+CiAgICA8cD5BZGRlZCBzb3J0aW5nIHRvIHRoZSBhZG1pbiBwYW5lbDwvcD4KICAgIDxwPkFkZGVkIG1heCBsZW5ndGggYWJpbGl0eSB0byB0ZXh0IGFuZCBlbWFpbCBmaWVsZHM8L3A+CiAgICA8cD5GaXhlZCBhIHNtYWxsIHByb2JsZW0gd2l0aCB0aGUgZGVmYXVsdCBncm91cCBub3QgYmVpbmcgY2hlY2tlZCB3aGVuIGFkZGluZyBhIHVzZXI8L3A+CiAgICA8cD5TYXZlIGZpbHRlciBzZXR0aW5ncyBpbiBwcmVmZXJlbmNlcywgYW5kIHRoZSBhY3RpdmUgdGFiIHRvby48L3A+CiAgICA8cD5EZWxldGUgdXNlciBwcm9wZXJ0aWVzIHdoZW4gYSBwcm9wZXJ0eSBpcyBkZWxldGVkIDxlbT5Ob3RlPC9lbT4sIG5vdCB3aGVuIGl0IGlzIGRpc2FibGVkIGluIHRoZSBlZGl0IGdyb3VwIGRpYWxvZzwvcD4KICAgIDxwPkFkZCBjb25maXJtYXRpb24gbWVzc2FnZSBpbiBlZGl0IGdyb3Vwcy48L3A+CiAgICA8cD5BZGRlZCBhIGNvdXBsZSBtb3JlIGNvbmZpcm1hdGlvbiBtZXNzYWdlcy48L3A+CiAgICA8cD5BZGRlZCBDU1YgRXhwb3J0IG9wdGlvbjwvcD4KICAgIDxwPlRvZG8gLSBBZGQgcHJlZmVyZW5jZXMgZm9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmaWVsZGxlbmd0aDwvcD4KPC9saT4KPGxpPjxwPjEuMC4xIC0gTWFyY2gsIDIwMDY8cD4KICAgIDxwPkFkZGVkIHRoZSBhYmlsaXR5IHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgZW1haWwgYWRkcmVzc2VzPC9wPgogICAgPHA+Rml4IHByb2JsZW0gd2hlcmUgZXhwaXJ5IGRhdGUgd2FzIGJlaW5nIG1vZGlmaWVkIHdoZW4gYWRtaW4gbW9kaWZpZWQgdXNlciBzZXR0aW5nczwvcD4KICAgIDxwPkFkZCBhIGNvbmZpcm1hdGlvbiBtZXNzYWdlIHRvIHRoZSBwcmVmZXJlbmNlcyBzdWJtaXQgYnV0dG9uPC9wPgogICAgPHA+Rml4ZWQgYSBtaW5vciBidWcgd2hlbiBjb3V0aW5nIHRoZSBudW1iZXIgb2YgdXNlcnMgaW4gYSBncm91cDwvcD4KICAgIDxwPkZpeGVzIHRvIHRoZSBzaXplIG9mIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmaWVsZHMsIGFuZCBtYXhsZW5ndGg8L3A+CiAgICA8cD5BZGRlZCBhZHZhbmNlZCBmaWx0ZXJpbmcgb24gcHJvcGVydGllczwvcD4KICAgIDxwPkNoYW5nZXMgdG8gbGFiZWxpbmcgaW4gYWRkIG9yIGVkaXQgdXNlcjwvcD4KICAgIDxwPkZpeGVzIHRvIHByb2JsZW1zIHdpdGggaW5saW5lIGFuZCBub24gaW5saW5lIGZvcm1zLCB0aGUgcGFzc3dvcmQgaXMgbmV2ZXIgc2VudCBvbiB0aGUgZ2V0IGxpbmU8L3A+CiAgICA8cD5DaGFuZ2VkIHRvIHJlcXVpcmUgQ01TIDAuMTItYmV0YTIgYXQgYSBtaW5pbXVtIChmb3Igc2FmZXR5IHB1cnBvc2VzKTwvcD4KPC9saT4KPC91bD4KRU9GOwokbGFuZ1snaGVscCddID0gPDw8RU9GCjxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhbGxvd3MgbWFuYWdlbWVudCBhbmQgYWRtaW5pc3RyYXRpb24gb2YgZnJvbnQgZW5kIHVzZXJzIDxpPih1c2VycyB3aG8gaGF2ZSBubyBhZG1pbiBhY2Nlc3NzKTwvaT4uICBJdCBhbGxvd3MgY3JlYXRpb24gb2YgdXNlciBncm91cHMsIGFuZCB1c2VyIGFjY291bnRzIGFuZCBhbGxvd3MgdXNlcnMgdG8gbG9naW4gYW5kIGxvZ291dC4gIGl0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEN1c3RvbUNvbnRlbnQgbW9kdWxlIHRvIGRpc3BsYXkgZGlmZmVyZW50IGNvbnRlbnQgdG8gZGlmZmVyZW50IHVzZXJzIG9uY2UgdGhleSBoYXZlIGxvZ2dlZCBpbjwvcD4KPGgzPkZlYXR1cmVzPC9oMz4KPHVsPgo8bGk+PHA+VXNlciBhY2NvdW50IGV4cGlyYXRpb24uICBZb3UgY2FuIGNyZWF0ZSB0ZW1wb3JhcnkgdXNlcnM8L3A+PC9saT4KPGxpPjxwPkdyb3VwIFByb3BlcnRpZXMuICBZb3UgY2FuIGFzayBmb3IgZGlmZmVyZW50IGluZm9ybWF0aW9uIGZyb20gbWVtYmVycyBvZiBkaWZmZXJlbnQgZ3JvdXBzPC9wPjwvbGk+CjxsaT48cD5DYXBhYmxlIG9mIGhhbmRsaW5nIGh1bmRyZWRzIG9mIHVzZXJzPC9wPjwvbGk+CjxsaT48cD5IYXMgYW4gZXh0ZW5zaXZlIEFQSSBmb3IgYWRkaW5nIGZ1bmN0aW9uYWxpdHk8L3A+PC9saT4KPC91bD4KPGgzPkhvdyBkbyBJIHVzZSBpdDwvaDM+Cjx1bD4KPGxpPjxwPkFmdGVyIGluc3RhbGxhdGlvbiB5b3UgY2FuIGFjY2VzcyBhZG1pbiBwYW5lbCB0byB0aGUgRnJvbnRFbmRVc2VycyBtb2R1bGUgdW5kZXIgdGhlICZxdW90O1VzZXJzICYgZ0dyb3VwcyZxdW90OyBtZW51LjwvcD48L2xpPgo8bGk+CjxwPlNlY29uZGx5LCB5b3Ugc2hvdWxkIGRlZmluZSBwcm9wZXJ0aWVzLiAgUHJvcGVydGllcyBhcmUgZXNzZW50aWFsbHkgZmllbGQgZGVmaW5pdGlvbnMsIGhlcmUgeW91IHNwZWNpZnkgdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24geW91IHdhbnQgdG8gZ2F0aGVyLCBhbmQgbGltaXRzLiBpLmU6ICBOYW1lLCBBZ2UsIENpdHksIFN0YXRlLCBDb3VudHJ5LCBFbWFpbCBhZGRyZXNzLCBldGMuPC9wPgo8cD48Yj5Ob3RlOjwvYj4gWW91IGRvIG5vdCBuZWVkIHRvIGRlZmluZSBwcm9wZXJ0aWVzIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIHRoZXNlIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHlvdTwvYj4KPC9saT4KPGxpPjxwPk5leHQgeW91IHNob3VsZCBjcmVhdGUgb25lIG9yIG1vcmUgdXNlciBncm91cHMuICBXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgeW91IGFyZSBhc2tlZCBmb3IgYSBncm91cCBuYW1lLCBhIGRlc2NyaXB0aW9uIGFuZCB0byBhc3NvY2lhdGUgcHJvcGVydGllcyB3aXRoIHRoYXQgZ3JvdXAsIHNwZWNpZnkgdGhlIHByb3BlcnRpZXMgc29ydCBvcmRlciwgYW5kIHdldGhlciBpdCBpcyBhbiBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIGhpZGRlbiBmaWVsZCA8aT4ob2ZmIGlzIGFsc28gdmFsaWQpPC9pPjwvcD48L2xpPgo8bGk+PHA+PGI+Tm90ZTo8L2I+IEJlZm9yZSBwcm9jZWVkaW5nLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBhcmUgc2V0IGNvcnJlY3RseS48L3A+PC9saT4KPGxpPjxwPlRoaXJkbHkgeW91IHNob3VsZCBjcmVhdGUgc29tZSB1c2Vycy4gIEFkZGluZyB1c2VycyBpcyBhIHR3byBzdGVwIHByb2Nlc3MuICBXaGVuIGNyZWF0aW5nIGEgdXNlciB5b3UgYXJlIGFza2VkIGZvciB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCBhbmQgYW4gZXhwaXJ5IGRhdGUgZm9yIHRoYXQgdXNlci4gIFlvdSB0aGVuIG11c3Qgc2VsZWN0IHRoZSBncm91cHMgdGhhdCB0aGF0IHVzZXIgaXMgYSBtZW1iZXIgb2YsIGFuZCBjbGljayBcJ05leHRcJzwvcD4KPHA+PGVtPk5vdGU6IDwvZW0+VGhpcyBpcyBhIGxhYm91ciBpbnRlbnNpdmUgYW5kIGJvcmluZyBwcm9jZXNzLCBpdCBpcyBlYXNpZXIgdG8gbGV0IHVzZXJzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMsIGFuZCB0aGVuIHlvdSBjYW4gZWRpdCB0aGVpciBncm91cCBpbmZvcm1hdGlvbi4gIGJ1dCBmb3IgdGVzdGluZyBwdXJwb3NlcywgcGxlYXNlIGNyZWF0ZSBhdCBsZXN0IG9uZSB1c2VyPC9wPjwvbGk+CjxsaT48cD5MYXN0bHksIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIGRldGVybWluZWQgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMgdG8gYmUgcHJlc2VudGVkIGZvciB0aGF0IHVzZXIsIHlvdSBhcmUgcHJlc2VudGVkIHdpdGggYSBmb3JtIGFza2luZyBmb3IgYWxsIG9mIHRoZSByZXF1aXJlZCB1c2VyIGluZm9ybWF0aW9uLiAgQ29tcGxldGUgdGhpcyBmb3JtIHRvIGNvbXBsZXRlIHRoZSB1c2VyIGFkZGl0aW9uPC9wPjwvbGk+CjxsaT48cD5Zb3UgYXJlIG5vdyByZWFkeSB0byBhZGQgdGhlIGZyb250IGVuZCBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgc2l0ZS4gIFRoaXMgaXMgYXMgc2ltcGxlIGFzIGFkZGluZyB0aGUge2Ntc19tb2R1bGUgbW9kdWxlPUZyb250RW5kVXNlcnN9IHRhZyB0byB5b3VyIHBhZ2Ugb3IgdGVtcGxhdGU8L3A+PC9saT4KPC91bD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGlzIG1vZHVsZSBkb2VzIG5vdCBpbmNsdWRlIGNvbW1lcmNpYWwgc3VwcG9ydC4gSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkZvciB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUsIEZBUXMsIG9yIHRvIGZpbGUgYSBCdWcgUmVwb3J0IG9yIGJ1eSBjb21tZXJjaWFsIHN1cHBvcnQsIHBsZWFzZSB2aXNpdCBjYWxndXlcJ3MKbW9kdWxlIGhvbWVwYWdlIGF0IDxhIGhyZWY9Imh0dHA6Ly90ZWNoY29tLmR5bmRucy5vcmciPnRlY2hjb20uZHluZG5zLm9yZzwvYT4uPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi48L2xpPgo8bGk+VGhlIGF1dGhvciwgY2FsZ3V5MTAwMCwgY2FuIG9mdGVuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyNjbXMiPkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4KPGxpPkxhc3RseSwgeW91IG1heSBoYXZlIHNvbWUgc3VjY2VzcyBlbWFpbGluZyB0aGUgYXV0aG9yIGRpcmVjdGx5LjwvbGk+ICAKPC91bD4KPGgzPlBhcmFtZXRlcnM8L2gzPgo8dWw+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGZvcm09Im5hbWUiPC9saT4KPHA+Rm9ybXM6Cjx1bD4KIDxsaT48ZW0+bG9naW48L2VtPiAtIERpc3BsYXkgdGhlIGxvZ2luIGZvcm08L2xpPgogPGxpPjxlbT5sb2dvdXQ8L2VtPiAtIERpc3BsYXkgdGhlIGxvZ291dCBmb3JtPC9saT4KIDxsaT48ZW0+Y2hhbmdlc2V0dGluZ3M8L2VtPiAtIERpc3BsYXkgdGhlIGNoYW5nZSBzZXR0aW5ncyBmb3JtPC9saT4KIDxsaT48ZW0+Zm9yZ290cHc8L2VtPiAtIERpc3BsYXkgdGhlIGZvcmdvdCBwYXNzd29yZCBmb3JtPC9saT4KPC91bD4KPC9wPgo8bGk+PGVtPihvcHRpb25hbCk8L2VtPiByZXR1cm50bz0icGFnZSI8L2xpPgo8cD5Vc2VkIHdpdGggdGhlIGxvZ2luLCBsb2dvdXQsIGFuZCBjaGFuZ2VzZXR0aW5ncyBmb3JtcywgdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHBhZ2UgaWQgb3IgYWxpYXMgb2YgYSBwYWdlIHRvIHJlZGlyZWN0IHRvLCB3aGVuIHRoZSBmb3JtIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQ8L3A+CjwvdWw+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dApvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+CjxoMz5SZXF1aXJlbWVudHM8L2gzPgo8cD5JbiBvcmRlciB0byBpbXBsZW1lbnQgdGhlIGZvcmdvdHRlbiBwYXNzd29yZCBmdW5jdGlvbmFsaXR5LCB0aGlzIG1vZHVsZSByZXF1aXJlcyB0aGUgQ01TTWFpbGVyIG1vZHVsZSB0byBiZSBwcmV2aW91c2x5IGluc3RhbGxlZDwvcD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAaG90bWFpbC5jb20iPiZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KRU9GOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>/lang/ext/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/lang/ext/fr_FR.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ3Byb21wdF9mb3Jnb3Rwd19wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIGR1IGZvcm11bGFpcmUgbW90IGRlIHBhc3NlIG91Ymxpw6knOwokbGFuZ1sncHJvbXB0X2NoYW5nZXNldHRpbmdzX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgZHUgZm9ybXVsYWlyZSBkZSBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzJzsKJGxhbmdbJ3Byb21wdF9sb2dpbl9wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIG/DuSByZWRpcmlnZXIgbFwndXRpbGlzYXRldXIgYXByw6hzIHF1XCdpbCBzZSBzb2l0IGNvbm5lY3TDqSc7CiRsYW5nWydwcm9tcHRfbG9nb3V0X3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgb8O5IHJlZGlyaWdlciBsXCd1dGlsaXNhdGV1ciBhcHLDqHMgcXVcJ2lsIHNlIHNvaXQgZMOpY29ubmVjdMOpJzsKJGxhbmdbJ3NvcnRvcmRlciddID0gJ09yZGUgZGUgdHJpJzsKJGxhbmdbJ3Byb21wdF9udW1yZXNldHJlY29yZCddID0gJ1VuIG5vbWJyZSBkXCd1dGlsaXNhdGV1cnMgZXN0IGVuIGNvdXJzIGRlIHLDqWluaXRpYWxpc2F0aW9uIGRlIG1vdHMgZGUgcGFzc2UuIENlIG5vbWJyZSBlc3QgYWN0dWVsbGVtZW50IGRlOic7CiRsYW5nWydyZW1vdmUxd2VlayddID0gJ1N1cHByaW1lciB0b3V0ZXMgbGVzIGVudHLDqWVzIHZpZWlsbGVzIGRlIHBsdXMgZFwndW5lIHNlbWFpbmUnOwokbGFuZ1sncmVtb3ZlMW1vbnRoJ10gPSAnU3VwcHJpbWVyIHRvdXRlcyBsZXMgZW50csOpZXMgdmllaWxsZXMgZGUgcGx1cyBkXCd1biBtb2lzJzsKJGxhbmdbJ3JlbW92ZWFsbCddID0gJ1N1cHByaW1lciB0b3V0ZXMgbGVzIGVudHLDqWVzJzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICfDinRlcy12b3VzIHPDu3I/JzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRjb2RlJ10gPSAnVW4gY29kZSBpbnZhbGlkZSBhIMOpdMOpIGVudHLDqSwgdmV1aWxsZXogcsOpZXNzYXllcic7CiRsYW5nWydlcnJvcl90ZW1wY29kZW5vdGZvdW5kJ10gPSAnTGUgY29kZSB0ZW1wb3JhaXJlIHBvdXIgdm90cmUgaWQgdXRpbGlzYXR1ZXIgblwnYSBwYXMgcHUgw6p0cmUgdHJvdXbDqSBkYW5zIGxhIGJhc2UgZGUgZG9ubsOpZXMnOwokbGFuZ1snZm9yZ290cGFzc3dvcmRfdmVyaWZ5dGVtcGxhdGUnXSA9ICdHYWJhcml0IHV0aWxpc8OpIHBvdXIgYWZmaWNoZXIgbGUgZm9ybXVsYWlyZSBkZSB2w6lyaWZpY2F0aW9uJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX2VtYWlsdGVtcGxhdGUnXSA9ICdHYWJhcml0IHV0aWxpc8OpIHBvdXIgbFwnZW1haWwgZW52b3nDqSBsb3JzIGRlIGxcJ291YmxpIGR1IG1vdCBkZSBwYXNzZSc7CiRsYW5nWydlcnJvcl9yZXNldGFscmVhZHlzZW50J10gPSAnVW5lIGRlbWFuZGUgZGUgcsOpaW5pdGlhbGlzYXRpb24gZGUgbW90IGRlIHBhc3NlIGEgw6l0w6kgc291bWlzZSBwb3VyIGNlIGNvbXB0ZSwgc29pdCBwYXIgdm91cy1tw6ptZSwgc29pdCBwYXIgcXVlbHF1XCd1biBkXCdhdXRyZS4gVsOpcmlmaWV6IHZvdHJlIGVtYWlsLCB2b3VzIHkgdHJvdXZlcmV6IGxlcyBpbnN0cnVjdGlvbnMgcG91ciBsYSByw6lpbml0aWFsaXNhdGlvbiBkZSB2b3RyZSBtb3QgZGUgcGFzc2UuJzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdFcnJldXIgZGUgYmFzZSBkZSBkb25uw6llcyc7CiRsYW5nWydtZXNzYWdlX2ZvcmdvdHB3ZW1haWwnXSA9ICdWb3VzIHJlY2V2ZXogY2UgbWVzc2FnZSBjYXIgcXVlbHF1XCd1biBub3VzIGEgZGl0IHF1ZSB2b3VzIGF2aWV6IHBlcmR1IHZvdHJlIG1vdCBkZSBwYXNzZS4gU2kgY1wnZXN0IGxlIGNhcywgbGlzZXogbGVzIGluc3RydWN0aW9ucyBjaS1kZXNzb3VzLiBTaSB2b3VzIG5lIHNhdmV6IHBhcyBkZSBxdW9pIGlsIHNcJ2FnaXQsIHZvdXMgcG91dmV6IHNpbXBsZW1lbnQgZWZmYWNlciBjZSBtZXNzYWdlLiBOb3VzIHZvdXMgcmVtZXJjaW9ucy4nOwokbGFuZ1sncHJvbXB0X2NvZGUnXSA9ICdDb2RlJzsKJGxhbmdbJ21lc3NhZ2VfY29kZSddID0gJ0xlIGNvZGUgc3VpdmFudCBhIMOpdMOpIGfDqW7DqXLDqSBhdSBoYXNhcmQgcG91ciBsYSB2w6lyaWZpY2F0aW9uIGR1IGNvbXBlIHV0aWxpc2F0ZXVyLiBMb3JzcXVlIHZvdXMgY2xpcXVlcmV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMsIHZvdXMgdHJvdXZlcmV6IHVuIGNoYW1wIGRhbnMgbGVxdWVsIGVudHJlciBjZSBjb2RlLiBOb3JtYWxlbWVudCwgY2UgY2hhbXAgZXN0IHJlbXBsaSBwb3VyIHZvdXMsIG1haXMgZGFucyBsZSBjYXMgY29udHJhaXJlLCBsZSBjb2RlIGVzdCZuYnNwOzonOwokbGFuZ1sncHJvbXB0X2xpbmsnXSA9ICdMZSBsaWVuIHN1aXZhbnQgdm91cyBhbcOobmUgYXUgc2l0ZSBvw7kgdm91cyBwb3V2ZXogZW50cmVyIGxlIGNvZGUgY2ktZGVzc3VzLCBldCByw6lpbml0aWFsaXNlciB2b3RyZSBtb3QgZGUgcGFzc2UmbmJzcDs6JzsKJGxhbmdbJ2xvc3RwYXNzd29yZF9lbWFpbHN1YmplY3QnXSA9ICdNb3QgZGUgcGFzc2Ugb3VibGnDqSc7CiRsYW5nWydlcnJvcl9ub21haWxlcm1vZHVsZSddID0gJ0xlIG1vZHVsZSBDTVNNYWlsZXIgblwnYSBwYXMgw6l0w6kgdHJvdXbDqSc7CiRsYW5nWydpbmZvX2ZvcmdvdHB3bWVzc2FnZXNlbnQnXSA9ICdVbiBlbWFpbCBhIMOpdMOpIGVudm95w6kgw6AgJXMgYXZlYyBsZXMgaW5zdHJ1Y3Rpb25zIHBvdXIgbGEgcsOpaW5pdGlhbGlzYXRpb24gZHUgbW90IGRlIHBhc3NlLiBNZXJjaSc7CiRsYW5nWydsb3N0cHdfbWVzc2FnZSddID0gJ1NpIHZvdXMgYXZleiBvdWJsacOpIHZvdHJlIG1vdCBkZSBwYXNzZSwgdmV1aWxsZXogZW50cmVyIHZvdHJlIGlkZW50aWZpYW50IGljaSwgZXQgc2kgbm91cyBsZSB0cm91dm9ucywgdm91cyByZWNldnJleiB1biBlbWFpbCBhdmVjIGxlcyBpbnN0cnVjdGlvbnMgcG91ciBsYSByw6lpbml0aWFsaXNhdGlvbiBkdSBtb3QgZGUgcGFzc2UuJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX3RlbXBsYXRlJ10gPSAnR2FiYXJpdHMgcG91ciBsXCdvdWJsaSBkdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1snZXJyb3JfcHJvcG5vdGZvdW5kJ10gPSAnTGEgcHJvcHJpw6l0w6kgJXMgblwnYSBwYXMgw6l0w6kgdHJvdXbDqWUnOwokbGFuZ1sncHJvcHNmb3VuZCddID0gJ3Byb3ByacOpdMOpcyB0cm91dsOpZXMnOwokbGFuZ1snYWRkcHJvcCddID0gJ0Fqb3V0ZXIgdW5lIHByb3ByacOpdMOpJzsKJGxhbmdbJ2Vycm9yX3JlcXVpcmVkZmllbGQnXSA9ICdVbiBjaGFtcCByZXF1aXMgKCVzKSBlc3QgdmlkZSc7CiRsYW5nWydpbmZvX2VtcHR5cGFzc3dvcmRmaWVsZCddID0gJ1ZldWlsbGV6IGVudHJlciBpY2kgdW4gbm91dmVhdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1snZXJyb3Jfbm90bG9nZ2VkaW4nXSA9ICdWb3VzIG5lIHNlbWJsZXogcGFzIMOqdHJlIGNvbm5lY3TDqSc7CiRsYW5nWyd1c2VyX3NldHRpbmdzJ10gPSAnUGFyYW3DqHRyZXMnOwokbGFuZ1sndXNlcl9yZWdpc3RyYXRpb24nXSA9ICdFbnJlZ2lzdHJlbWVudCc7CiRsYW5nWydlcnJvcl9hY2NvdW50ZXhwaXJlZCddID0gJ0NlIGNvbXB0ZSBhIGV4cGlyw6knOwokbGFuZ1snZXJyb3JfaW1wcm9wZXJlbWFpbGZvcm1hdCddID0gJ0Zvcm1hdCBkXCdhZHJlc3NlIGVtYWlsIGludmFsaWRlJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRleHBpcnlkYXRlJ10gPSAnRGF0ZSBkXCdleHBpcmF0aW9uIGludmFsaWRlJzsKJGxhbmdbJ2Vycm9yX3Byb2JsZW1zZXR0aW5ncHJvcGVydHknXSA9ICdJbCB5IGEgZXUgdW5lIGVycmV1ciBsb3JzIGRlIGxhIGTDqWZpbml0aW9uICVzIHBvdXIgbFwndXRpbGlzYXRldXIgJHMnOwokbGFuZ1snZXJyb3JfaW52YWxpZGdyb3VwaWQnXSA9ICdpZCBkZSBncm91cGUgJXMgaW52YWxpZGUnOwokbGFuZ1snaGlkZGVuZmllbGRtYXJrZXInXSA9ICdNYXJxdWV1ciBkZSBjaGFtcCBjYWNow6knOwokbGFuZ1snaGlkZGVuZmllbGRjb2xvciddID0gJ0NvdWxldXIgZGUgY2hhbXAgY2FjaMOpJzsKJGxhbmdbJ2hpZGRlbiddID0gJ0NhY2jDqSc7CiRsYW5nWydlcnJvcl9kdXBsaWNhdGVuYW1lJ10gPSAnVW5lIHByb3ByacOpdMOpIGR1IG3Dqm1lIG5vbSBlc3QgZMOpasOgIGTDqWZpbmllJzsKJGxhbmdbJ2Vycm9yX25vcHJvcGVydGllcyddID0gJ0F1Y3VuZSBwcm9wcmnDqXTDqSBkw6lmaW5pZSc7CiRsYW5nWydncm91cHNmb3VuZCddID0gJ0dyb3VwZXMgdHJvdXbDqXMnOwokbGFuZ1snZXJyb3Jfb25lZ3JvdXByZXF1aXJlZCddID0gJ0xcJ2FwcGFydGVuYW5jZSDDoCBhdSBtb2lucyB1biBncm91cGUgZXN0IHJlcXVpc2UnOwokbGFuZ1sncHJvbXB0X3JlcXVpcmVvbmVncm91cCddID0gJ1JlcXVpZXJ0IGxcJ2FwcGFydGVuYW5jZSDDoCBhdSBtb2lucyB1biBncm91cGUnOwokbGFuZ1snYmFjayddID0gJ1JldG91cic7CiRsYW5nWydlcnJvcl9taXNzaW5nX3JlcXVpcmVkX3BhcmFtJ10gPSAnJXMgZXN0IHVuIGNoYW1wIHJlcXVpcyc7CiRsYW5nWydyZXF1aXJlZGZpZWxkbWFya2VyJ10gPSAnTWFycXVlIGxlcyBjaGFtcHMgcmVxdWlzIGF2ZWMnOwokbGFuZ1sncmVxdWlyZWRmaWVsZGNvbG9yJ10gPSAnTWlzZSBlbiDDqXZpZGVuY2UgZGVzIGNoYW1wcyByZXF1aXMgZW4nOwokbGFuZ1snbmV4dCddID0gJ1Byb2NoYWluJzsKJGxhbmdbJ2Vycm9yX2dyb3VwZXhpc3RzJ10gPSAnVW4gZ3JvdXBlIGR1IG3Dqm1lIG5vbSBleGlzdGUgZMOpasOgJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnQ2hhbXAgcmVxdWlzJzsKJGxhbmdbJ29wdGlvbmFsJ10gPSAnT3B0aW9uZWwnOwokbGFuZ1snb2ZmJ10gPSAnT2ZmJzsKJGxhbmdbJ2xlbmd0aCddID0gJ0xvbmd1ZXVyJzsKJGxhbmdbJ3llcyddID0gJ091aSc7CiRsYW5nWydwcm9tcHQnXSA9ICdJbnZpdGUnOwokbGFuZ1sndHlwZSddID0gJ1R5cGUnOwokbGFuZ1sndGV4dCddID0gJ1RleHRlJzsKJGxhbmdbJ2NoZWNrYm94J10gPSAnQ2FzZSDDoCBjb2NoZXInOwokbGFuZ1snZW1haWwnXSA9ICdBZHJlc3NlIGVtYWlsJzsKJGxhbmdbJ3RleHRhcmVhJ10gPSAnVGV4dGFyZWEnOwokbGFuZ1snbXNnX2N1cnJlbnRseWxvZ2dlZGluYXMnXSA9ICdCaWVudmVudWUnOwokbGFuZ1snbG9nb3V0J10gPSAnRMOpY29ubmV4aW9uJzsKJGxhbmdbJ3Byb21wdF9jaGFuZ2VzZXR0aW5ncyddID0gJ0NoYW5nZW1lbnQgZGUgTWVzIFBhcmFtw6h0cmVzJzsKJGxhbmdbJ2Vycm9yX2xvZ2luZmFpbGVkJ10gPSAnTGEgY29ubmV4aW9uIGEgw6ljaG91w6kgLSBpZGVudGlmaWFudCBvdSBtb3QgZGUgcGFzc2UgaW52YWxpZGU/JzsKJGxhbmdbJ2xvZ2luJ10gPSAnU2lnbiBpbic7CiRsYW5nWydwcm9tcHRfdXNlcm5hbWUnXSA9ICdJZGVudGlmaWFudCc7CiRsYW5nWydwcm9tcHRfcGFzc3dvcmQnXSA9ICdNb3QgZGUgcGFzc2UnOwokbGFuZ1sncmVnaXN0ZXInXSA9ICdFbnJlZ2lzdHJlei12b3VzJzsKJGxhbmdbJ2ZvcmdvdHB3J10gPSAnQXZlei12b3VzIG91Ymxpw6kgdm90cmUgbW90IGRlIHBhc3NlPyc7CiRsYW5nWydkZWZhdWx0cyddID0gJ1BhciBkw6lmYXV0JzsKJGxhbmdbJ3RlbXBsYXRlJ10gPSAnR2FiYXJpdCc7CiRsYW5nWydlcnJvcl91c2Vybm90Zm91bmQnXSA9ICdJRCB1dGlsaXNhdGV1ciBub24gdHJvdXbDqSc7CiRsYW5nWydlcnJvcl91c2VybmFtZXRha2VuJ10gPSAnQ2V0IGlkZW50aWZpYW50ICglcykgZXhpc3RlIGTDqWrDoCc7CiRsYW5nWydwcm9tcHRfc210cHZhbGlkYXRlJ10gPSAnVXRpbGlzZXIgU01UUCBwb3VyIGxhIHZhbGlkYXRpb24gZGVzIGFkcmVzc2VzIGVtYWlsPyc7CiRsYW5nWydwcm9tcHRfbWlucHdsZW4nXSA9ICdMb25ndWV1ciBtaW5pbWFsZSBkdSBtb3QgZGUgcGFzc2UnOwokbGFuZ1sncHJvbXB0X21heHB3bGVuJ10gPSAnTG9uZ3VldXIgbWF4aW1hbGUgZHUgbW90IGRlIHBhc3NlJzsKJGxhbmdbJ3Byb21wdF9taW51bmxlbiddID0gJ0xvbmd1ZXVyIG1pbmltYWxlIGRlIGxcJ2lkZW50aWZpYW50JzsKJGxhbmdbJ3Byb21wdF9tYXh1bmxlbiddID0gJ0xvbmd1ZXVyIG1heGltYWxlIGRlIGxcJ2lkZW50aWZpYW50JzsKJGxhbmdbJ3Byb21wdF9zZXNzaW9udGltZW91dCddID0gJ0V4cGlyYXRpb24gZGUgc2Vzc2lvbiAobWludXRlcyknOwokbGFuZ1sncHJvbXB0X2FsbG93ZW1haWxyZWcnXSA9ICdBdXRvcmlzZSBsXCdlbnJlZ2lzdHJlbWVudCBwYXIgZW1haWwnOwokbGFuZ1sncHJvbXB0X2RmbHRncm91cCddID0gJ0dyb3VwZSBwYXIgZMOpZmF1dCBwb3VyIGxlcyBub3V2ZWF1eCB1dGlsaXNhdGV1cnMnOwokbGFuZ1snY2hhbmdlc2V0dGluZ3NfdGVtcGxhdGUnXSA9ICdDaGFuZ2VyIGxlIGdhYmFyaXQgZGVzIHBhcmFtw6h0cmVzJzsKJGxhbmdbJ2Vycm9yX3Bhc3N3b3JkbWlzbWF0Y2gnXSA9ICdMZXMgbW90cyBkZSBwYXNzZSBuZSBjb25jb3JkZW50IHBhcyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkdXNlcm5hbWUnXSA9ICdJZGVudGlmaWFudCBub24gdmFsaWRlJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXNzd29yZCddID0gJ01vdCBkZSBwYXNzZSBub24gdmFsaWRlJzsKJGxhbmdbJ2VkaXR1c2VyJ10gPSAnw4lkaXRlciBsXCd1dGlsaXNhdGV1cic7CiRsYW5nWyd2YWxpZCddID0gJ1ZhbGlkZSc7CiRsYW5nWyd1c2VybmFtZSddID0gJ0lkZW50aWZpYW50JzsKJGxhbmdbJ3N0YXR1cyddID0gJ1N0YXR1dCc7CiRsYW5nWydlcnJvcl9tZW1iZXJncm91cHMnXSA9ICdDZXQgdXRpbGlzYXRldXIgblwnZXN0IG1lbWJyZSBkXCdhdWN1biBncm91cGUnOwokbGFuZ1snZXJyb3JfcHJvcGVydGllcyddID0gJ0F1Y3VuZSBwcm9wcmnDqXTDqSc7CiRsYW5nWyd2YWx1ZSddID0gJ1ZhbGV1cic7CiRsYW5nWydncm91cHMnXSA9ICdHcm91cGVzJzsKJGxhbmdbJ3Byb3BlcnRpZXMnXSA9ICdQcm9wcmnDqXTDqXMnOwokbGFuZ1sncHJvcG5hbWUnXSA9ICdOb20gZGUgcHJvcHJpw6l0w6knOwokbGFuZ1sncHJvcHZhbHVlJ10gPSAnVmFsZXVyIGRlIGxhIHByb3ByacOpdMOpJzsKJGxhbmdbJ2FkZCddID0gJ0Fqb3V0ZXInOwokbGFuZ1snZWRpdCddID0gJ8OJZGl0ZXInOwokbGFuZ1snZXhwaXJlcyddID0gJ0V4cGlyZSc7CiRsYW5nWydzcGVjaWZ5X2RhdGUnXSA9ICdTcMOpY2lmaWV6IHVuZSBkYXRlJzsKJGxhbmdbJzEyaHJzJ10gPSAnMTIgaGV1cmVzJzsKJGxhbmdbJzI0aHJzJ10gPSAnMjQgaGV1cmVzJzsKJGxhbmdbJzQ4aHJzJ10gPSAnNDggaGV1cmVzJzsKJGxhbmdbJzF3ZWVrJ10gPSAnMSBzZW1haW5lJzsKJGxhbmdbJzJ3ZWVrcyddID0gJzIgc2VtYWluZXMnOwokbGFuZ1snMW1vbnRoJ10gPSAnMSBtb2lzJzsKJGxhbmdbJzNtb250aHMnXSA9ICczIG1vaXMnOwokbGFuZ1snNm1vbnRocyddID0gJzYgbW9pcyc7CiRsYW5nWycxeWVhciddID0gJzEgYW4nOwokbGFuZ1snbmV2ZXInXSA9ICdKYW1haXMnOwokbGFuZ1sncG9zdGluc3RhbGxtZXNzYWdlJ10gPSAnTGUgbW9kdWxlIGEgw6l0w6kgaW5zdGFsbMOpIGF2ZWMgc3VjY8Oocy48YnIvPkFzc3VyZXotdm91cyBkZSBkw6lmaW5pciBsYSBwZXJtaXNzaW9uICJNb2RpZnkgRnJvbnRFbmRVc2VyIFByb3BlcnRpZXMiJzsKJGxhbmdbJ3Bhc3N3b3JkJ10gPSAnTW90IGRlIHBhc3NlJzsKJGxhbmdbJ3JlcGVhdHBhc3N3b3JkJ10gPSAnRW5jb3JlJzsKJGxhbmdbJ2Vycm9yX2dyb3VwbmFtZV9leGlzdHMnXSA9ICdVbiBncm91cGUgZHUgbcOqbWUgbm9tIGV4aXN0ZSBkw6lqw6AnOwokbGFuZ1snZWRpdGdyb3VwJ10gPSAnw4lkaXRlciBsZSBncm91cGUnOwokbGFuZ1snc3VibWl0J10gPSAnRW52b3llcic7CiRsYW5nWydjYW5jZWwnXSA9ICdBbm51bGVyJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ1N1cHByaW1lcic7CiRsYW5nWydhcmV5b3VzdXJlX2RlbGV0ZWdyb3VwJ10gPSAnw4p0ZXMtdm91cyBzw7tyIGRlIHZvdWxvaXIgc3VwcHJpbWVyIGNlIGdyb3VwZT8nOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnUGFyYW3DqHRyZXMgaW5zdWZmaXNhbnRzJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snbmFtZSddID0gJ05vbSc7CiRsYW5nWydlcnJvcl9jYW50YWRkZ29ydXAnXSA9ICdwcm9ibMOobWUgbG9ycyBkZSBsXCdham91dCBkdSBncm91cGUnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ1BhcmFtw6h0cmVzIG5vbiB2YWxpZGVzJzsKJGxhbmdbJ2FwcGx5ZmlsdGVyJ10gPSAnQXBwbGlxdWVyJzsKJGxhbmdbJ2ZpbHRlciddID0gJ0ZpbHRyZSc7CiRsYW5nWyd1c2VyZmlsdGVyJ10gPSAnVXNlciBSZWd1bGFyIEV4cHJlc3Npb24nOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdEZXNjcmlwdGlvbic7CiRsYW5nWydncm91cG5hbWUnXSA9ICdOb20gZHUgZ3JvdXBlJzsKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY8OocyByZWZ1c8OpJzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyZXVyJzsKJGxhbmdbJ2FkZGdyb3VwJ10gPSAnQWpvdXRlciB1biBncm91cGUnOwokbGFuZ1snYWRkdXNlciddID0gJ0Fqb3V0ZXIgdW4gdXRpbGlzYXRldXInOwokbGFuZ1sndXNlcnNmb3VuZCddID0gJ1V0aWxpc2F0ZXVycyB0cm91dsOpcyc7CiRsYW5nWydncm91cCddID0gJ0dyb3VwZSc7CiRsYW5nWydzZWxlY3Rncm91cCddID0gJ1PDqWxlY3Rpb25uZXIgbGUgZ3JvdXBlJzsKJGxhbmdbJ3JlZ2lzdHJhdGlvbl90ZW1wbGF0ZSddID0gJ0dhYmFyaXQgZFwnZW5yZWdpc3RyZW1lbnQnOwokbGFuZ1snbG9nb3V0X3RlbXBsYXRlJ10gPSAnR2FiYXJpdCBkZSBkw6ljb25uZXhpb24nOwokbGFuZ1snbG9naW5fdGVtcGxhdGUnXSA9ICdHYWJhcml0IGRlIGNvbm5leGlvbic7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ1Byw6lmw6lyZW5jZXMnOwokbGFuZ1sndXNlcnMnXSA9ICdVdGlsaXNhdGV1cnMnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnR2VzdGlvbiBkZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdHw6hyZSBsZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUnOwokbGFuZ1snZGVmYXVsdGZyb250cGFnZSddID0gJ1BhZ2UgcGFyIGTDqWZhdXQnOwokbGFuZ1snbGFzdGFjY2Vzc2VkcGFnZSddID0gJ0Rlcm5pw6hyZSBwYWdlIGFjY8OpZMOpZSc7CiRsYW5nWydvdGhlcnBhZ2UnXSA9ICdBdXRyZSBwYWdlJm5ic3A7Oic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+DQo8bGk+MC4wLjEgLSBPY3RvYmVyIDIwMDUgLSBWZXJzaW9uIGluaXRpYWxlLCBub24gZm9uY3Rpb25uZWxsZTwvbGk+DQo8bGk+MC4xLjAgLSBPY3RvYmVyIDIwMDUgLSBWZXJzaW9uIGluaXRpYWxlPC9saT4NCjxsaT4wLjEuMSAtIE9jdG9icmUgMjAwNSAtIENvcnJlY3Rpb24gZGVzIHByb2Jsw6htZXMgYXZlYyBsZXMgcHJvcHJpw6l0w6lzPC9saT4NCjxsaT4wLjEuMiAtIE9jdG9icmUgMjAwNSAtIEFqb3V0IGRlIGxhIGZvbmN0aW9uIHBvdXIgbGVzIG1vdHMgZGUgcGFzc2Ugb3VibGnDqXM8L2xpPg0KPGxpPjxwPjAuMS4zIC0gTm92ZW1icmUgMjAwNTwvcD4NCiAgICA8cD5Bam91dCBkZSBsYSBwb3NzaWJpbGl0w6kgZGUgc3DDqWNpZmllciBsZXMgcGFnZXMgZGUgcmVkaXJlY3Rpb24gYXByw6hzIGNvbm5leGlvbiBldCBkw6ljb25uZXhpb24sIG91YmxpIGRlIG1vdCBkZSBwYXNzZSBldCBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzLCBham91dCBkZXMgcGFyYW3DqHRyZXMgcmV0dXJudG8gZXQgZGUgZm9ybXVsYWlyZXMgZGFucyBsZSBwYW5uZWF1IHV0aWxpc2F0ZXVyLCBuZXR0b3lhZ2UgZGUgY29kZS4gIENldHRlIHZlcnNpb24gcmVxdWllcnQgQ01TTVMgdjAuMTEgZXQgc3VpdmFudGVzLjwvcD48L2xpPg0KPGxpPjAuMS40IC0gTm92ZW1icmUgMjAwNSAtIFBldGl0IGNoYW5nZW1lbnQgZW4gcmFwcG9ydCBhdmVjIHVuZSBmb25jdGlvbiBvdWJsacOpZSBxdWkgblwnZXN0IHBsdXMgdXRpbGlzw6llPC9saT4NCjxsaT48cD4wLjEuNSAtIE5vdmVtYnJlIDIwMDU8L3A+DQogICAgPHA+VW4gYXV0cmUgcGV0aXQgY2hhbmdlbWVudCwgYWpvdXQgZGUgdGV4dGUgYXUgbWVzc2FnZSBhZmZpY2jDqSBhcHLDqHMgbFwnaW5zdGFsbGF0aW9uLjwvcD48L2xpPg0KPGxpPjxwPjAuMS42IC0gSmFudmllciAyMDA2PHA+DQogICAgPHA+Q2hhbmdlbWVudCBkYW5zIGxlcyBwcm9jZXNzdXMgZGUgcGVybWlzc2lvbnMsIGV0IHBldGl0ZXMgY29ycmVjdGlvbnMgZGFucyBsZXMgcHLDqWbDqXJlbmNlcy4gIMOJZ2FsZW1lbnQgcXVlbHF1ZXMgY29ycmVjdGlvbiBlbiByYXBwb3J0IGF2ZWMgcGhwNSwgaWwgZG9pdCBjZXBlbmRhbnQgcmVzdGVyIHF1ZWxxdWVzIGVycmV1cnMuPC9wPjwvbGk+DQo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPlF1ZSBmYWl0IGNlIG1vZHVsZSA/PC9oMz4NCjxwPkNlIG1vZHVsZSBwZXJtZXQgbGEgZ2VzdGlvbiBldCBsXCdhZG1pbmlzdHJhdGlvbiBkZXMgdXRpbGlzYXRldXJzIGR1IHNpdGUgc3VyIGxhIHBhcnRpZSBwdWJsaXF1ZSA8aT4odXRpbGlzYXRldXJzIHF1aSBuXCdvbnQgcGFzIGFjY8OocyBhdSBwYW5uZWF1IGRcJ2FkbWluaXN0cmF0aW9uKTwvaT4uIElsIHBlcm1ldCBsYSBjcsOpYXRpb24gZGUgZ3JvdXBlcyBkXCd1dGlsaXNhdGV1cnMsIGRlIGNvbXB0ZXMgdXRpbGlzYXRldXIsIGV0IHBlcm1ldCBhdXggdXRpbGlzYXRldXJzIGRlIHNlIGNvbm5lY3RlciBldCBzZSBkw6ljb25uZWN0ZXIuIElsIHBldXQgw6p0cmUgdXRpbGlzw6kgYXZlYyBsZSBtb2R1bGUgQ3VzdG9tQ29udGVudCBwb3VyIGFmZmljaGVyIGR1IGNvbnRlbnUgZGlmZsOpcmVudCBzZWxvbiBsZXMgdXRpbGlzYXRldXJzLCB1bmUgZm9pcyBxdVwnaWxzIHNvbnQgY29ubmVjdMOpcy48L3A+DQo8aDM+Rm9uY3Rpb25uYWxpdMOpczwvaDM+DQo8dWw+DQo8bGk+PHA+RXhwaXJhdGlvbiBkdSBjb21wdGUgdXRpbGlzYXRldXIuICBWb3VzIHBvdXZleiBjcsOpZXIgZGVzIHV0aWxpc2F0ZXVycyB0ZW1wb3JhaXJlczwvcD48L2xpPg0KPGxpPjxwPlByb3ByacOpdMOpcyBkZSBncm91cGUuICBWb3VzIHBvdXZleiBkZW1hbmRlciBkZXMgaW5mb3JtYXRpb25zIGRpZmbDqXJlbnRlcyBhdXggbWVtYnJlcyBkZSBkaWZmw6lyZW50cyBncm91cGVzPC9wPjwvbGk+DQo8bGk+PHA+UGV1dCBnw6lyZXIgZGVzIGNlbnRhaW5lcyBkXCd1dGlsaXNhdGV1cnM8L3A+PC9saT4NCjxsaT48cD5Db250aWVudCB1bmUgQVBJIMOpdGVuZHVlLCBwb3VyIGxcJ2Fqb3V0IGRlIGZvbmN0aW9ubmFsaXTDqXM8L3A+PC9saT4NCjwvdWw+DQo8aDM+Q29tbWVudCBsXCd1dGlsaXNlcjwvaDM+DQo8dWw+DQo8bGk+PHA+QXByw6hzIGluc3RhbGxhdGlvbiwgdm91cyBwb3V2ZXogYWNjw6lkZXIgYXUgbW9kdWxlIEZyb250RW5kVXNlcnMgcGFyIGxlIHBhbm5lYXUgZFwnYWRtaW5pc3RyYXRpb24gc291cyBsZSBtZW51ICZxdW90O0dyb3VwZXMgJiBVdGlsaXNhdGV1cnMmcXVvdDsuPC9wPjwvbGk+DQo8bGk+DQo8cD5EZXV4acOobWVtZW50LCB2b3VzIGRldnJpZXogZMOpZmluaXIgZGVzIHByb3ByacOpdMOpcy4gTGVzIHByb3ByacOpdMOpcyBzb250IGVzc2VudGllbGxlbWVudCBkZXMgZMOpZmluaXRpb25zIGRlIGNoYW1wLCB2b3VzIHBvdXZleiBpY2kgZMOpZmluaXIgbGUgdHlwZSBkXCdpbmZvcm1hdGlvbiBxdWUgdm91cyBkw6lzaXJleiBjb2xsZWN0ZXIsIGV0IGxlcyBsaW1pdGVzLiBwLmV4LiBOb20sIEFnZSwgVmlsbGUsIETDqXBhcnRlbWVudCwgUGF5cywgQWRyZXNzZSBlbWFpbCwgZXRjLiA8L3A+DQo8cD48Yj5Ob3RlOjwvYj4gVm91cyBuXCdhdmV6IHBhcyBiZXNvaW4gZGUgZMOpZmluaXIgbGVzIHByb3ByacOpdMOpcyBkZSBsXCdpZGVudGlmaWFudCBldCBkdSBtb3QgZGUgcGFzc2UsIGlscyBzb250IGNyw6nDqXMgcG91ciB2b3VzLjwvYj4NCjwvbGk+DQo8bGk+PHA+RW5zdWl0ZSwgdm91cyBkZXZyaWV6IGNyw6llciB1biBvdSBwbHVzaWV1cnMgbm9tKHMpIGRlIGdyb3VwZS4gUXVhbmQgdm91cyBjcsOpw6l6IHVuIGdyb3VwZSwgdm91cyBkZXZleiBlbnRyZXIgdW4gbm9tIGRlIGdyb3VwZSwgdW5lIGRlc2NyaXB0aW9uIGV0IGRldmV6IGFzc29jaWVyIGRlcyBwcm9wcmnDqXTDqXMgYXUgZ3JvdXBlLCBzcMOpY2lmaWVyIGxcJ29yZHJlIGRlcyBwcm9wcmnDqXTDqXMsIHNpIGNlbGxlcy1jaSBzb250IG9wdGlvbm5lbGxlcywgcmVxdWlzZXMgb3UgZGUgY2hhbXAgY2FjaMOpPGk+KG9mZiBlc3QgYXVzc2kgdmFsaWRlKTwvaT48L3A+PC9saT4NCjxsaT48cD48Yj5Ob3RlOjwvYj4gQXZhbnQgZGUgY29udGludWVyLCB2ZXVpbGxleiB2b3VzIGFzc3VyZXIgcXVlIGxlcyBwcsOpZsOpcmVuY2VzIHNvbnQgZMOpZmluaWVzIGNvcnJlY3RlbWVudC48L3A+PC9saT4NCjxsaT48cD5Ucm9pc2nDqG1lbWVudCwgY3LDqWV6IGxlcyB1dGlsaXNhdGV1cnMuIExcJ2Fqb3V0IGRcJ3V0aWxpc2F0ZXVyIGVzdCB1biBwcm9jZXNzdXMgZW4gZGV1eCB0ZW1wcy4gUXVhbmQgdm91cyBjcsOpw6l6IHVuIHV0aWxpc2F0ZXVyLCB2b3VzIGRldmV6IGVudHJlciB1biBpZGVudGlmaWFudCBldCB1biBtb3QgZGUgcGFzc2UsIGFpbnNpIHF1XCd1bmUgZGF0ZSBkXCdleHBpcmF0aW9uLiBWb3VzIGRldmV6IGVuc3VpdGUgc8OpbGVjdGlvbm5lciBsZSBvdSBsZXMgZ3JvdXBlKHMpIGF1KHgpcXVlbChzKSBjZXQgdXRpbGlzYXRldXIgYXBwYXJ0aWVuZHJhLCBwdWlzIGNsaXF1ZXIgc3VyIFxcXCdTdWl2YW50XFxcJzwvcD4NCjxwPjxlbT5Ob3RlOiA8L2VtPkNlY2kgZXN0IHVuIHRyYXZhaWwgbG9uZyBldCBsYWJvcmlldXgsIGlsIGVzdCBwbHVzIGZhY2lsZSBkZSBsYWlzc2VyIGxlcyB1dGlsaXNhdGV1cnMgc1wnZW5yZWdpc3RyZXIgZXV4LW3Dqm1lcy4gUHVpcyB2b3VzIHBvdXZleiDDqWRpdGVyIGxldXIgZ3JvdXBlIGRcJ2FwcGFydGVuYW5jZS4gQ2VwZW5kYW50LCBjcsOpw6l6IGF1IG1vaW5zIHVuIHV0aWxpc2F0ZXVyLXRlc3QuPC9wPjwvbGk+DQo8bGk+PHA+RW5maW4sIGFwcsOocyBxdWUgbGUgc3lzdMOobWUgYWllIGTDqXRlcm1pbsOpIHRvdXMgbGVzIGNoYW1wcyBhIHByw6lzZW50ZXIgw6AgbFwndXRpbGlzYXRldXIsIHZvdXMgdmVycmV6IHVuIGZvcm11bGFpcmUgcXVpIHZvdXMgZGVtYW5kZXJhIGRlIGTDqWZpbmlyIHRvdXMgbGVzIGNoYW1wcyBvYmxpZ2F0b2lyZXMuIFJlbXBsaXNzZXogY2UgZm9ybXVsYWlyZSBwb3VyIHRlcm1pbmVyIGxcJ2Fqb3V0IGRlIGxcJ3V0aWxpc2F0ZXVyLjwvcD48L2xpPg0KPGxpPjxwPlZvdXMgw6p0ZXMgbWFpbnRlbmFudCBwcsOqdCDDoCBham91dGVyIGxhIGZvbmN0aW9uIGF1eCBwYWdlcyBkZSB2b3RyZSBzaXRlLiBDXCdlc3QgdHLDqHMgc2ltcGxlLCBham91dGV6IGxhIGJhc2xpc2UgU21hcnR5IHtjbXNfbW9kdWxlIG1vZHVsZT1Gcm9udEVuZFVzZXJzfSDDoCB2b3RyZSBwYWdlIG91IGdhYmFyaXQ8L3A+PC9saT4NCjwvdWw+DQo8aDM+U3VwcG9ydDwvaDM+DQo8cD5DZSBtb2R1bGUgbmUgY29udGllbnQgYXVjdW4gc3VwcG9ydCBjb21tZXJjaWFsLiBDZXBlbmRhbnQsIGNlcyByZXNzb3VyY2VzIHNvbnQgZGlzcG9uaWJsZXMgcG91ciB2b3VzIGFpZGVyJm5ic3A7OjwvcD4NCjx1bD4NCjxsaT5Qb3VyIGxhIGRlcm5pw6hyZSB2ZXJzaW9uIGRlIGNlIG1vZHVsZSwgbGVzIEZBUXMsIG91IHBvdXIgYW5ub25jZXIgdW4gYnVnLCBvdSBwb3VyIGFjaGV0ZXIgZHUgc3VwcG9ydCBjb21tZXJjaWFsLCB2ZXVpbGxleiB2aXNpdGVyIGxlIHNpdGUgZGUgY2FsZ3V5XCdzIDxhIGhyZWY9Imh0dHA6Ly90ZWNoY29tLmR5bmRucy5vcmciPnRlY2hjb20uZHluZG5zLm9yZzwvYT4uPC9saT4NCjxsaT5EZXMgZGlzY3Vzc2lvbnMgY29tcGzDqW1lbnRhaXJlcyByZWxhdGl2ZXMgw6AgY2UgbW9kdWxlIHBldXZlbnQgYXVzc2kgw6p0cmUgdHJvdXbDqWVzIHN1ciBsZXMgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIiB0YXJnZXQ9Il9ibGFuayI+Rm9ydW1zIENNUyBNYWRlIFNpbXBsZTwvYT4uPC9saT4NCjxsaT5MXCdhdXRldXIsIGNhbGd1eTEwMDAsIGVzdCBzb3V2ZW50IHN1ciBJUkMgc3VyIGNhbmFsICNjbXM6IGlyYy5mcmVlbm9kZS5uZXQvI2NtczwvbGk+DQo8bGk+RXQgZW5maW4sIHZvdXMgcG91dmV6IHJlbmNvbnRyZXIgdW4gY2VydGFpbiBzdWNjw6hzIGVuIGVudm95YW50IHVuIGVtYWlsIGRpcmVjdGVtZW50IMOgIGxcJ2F1dGV1ci48L2xpPiAgDQo8L3VsPg0KPGgzPlBhcmFtw6h0cmVzPC9oMz4NCjx1bD4NCjxsaT48ZW0+KG9wdGlvbmVsKTwvZW0+IGZvcm09Im5hbWUiPC9saT4NCjxwPkZvcm11bGFpcmVzOg0KPHVsPg0KIDxsaT48ZW0+bG9naW48L2VtPiAtIEFmZmljaGUgbGUgZm9ybXVsYWlyZSBkZSBjb25uZXhpb248L2xpPg0KIDxsaT48ZW0+bG9nb3V0PC9lbT4gLSBBZmZpY2hlIGxlIGZvcm11bGFpcmUgZGUgZMOpY29ubmV4aW9uPC9saT4NCiA8bGk+PGVtPmNoYW5nZXNldHRpbmdzPC9lbT4gLSBBZmZpY2hlIGxlIGZvcm11bGFpcmUgZGUgY2hhbmdlbWVudCBkZSBwYXJhbcOodHJlczwvbGk+DQogPGxpPjxlbT5mb3Jnb3RwdzwvZW0+IC0gQWZmaWNoZSBsZSBmb3JtdWxhaXJlIGRcJ291YmxpIGRlIG1vdCBkZSBwYXNzZTwvbGk+DQo8L3VsPg0KPC9wPg0KPGxpPjxlbT4ob3B0aW9uZWwpPC9lbT4gcmV0dXJudG89InBhZ2UiPC9saT4NCjxwPlV0aWxpc8OpIGF2ZWMgbGVzIGZvcm11bGFpcmVzIGRlIGNvbm5leGlvbiwgZGUgZMOpY29ubmV4aW9uLCBldCBkZSBjaGFuZ2VtZW50IGRlIHBhcmFtw6h0cmVzLCBjZSBwYXJhbcOodHJlIGNvbnRpZW50IGxcJ2lkIG91IGxcJ2FsaWFzIGRlIGxhIHBhZ2Ugw6AgbGFxdWVsbGUgcmVkaXJpZ2VyIGxcJ3V0aWxpc2F0ZXVyIGFwcsOocyBsXCdlbnZvaSBkdSBmb3JtdWxhaXJlLCBzaSBjZWx1aS1jaSBhIMOpdMOpIHRyYWl0w6kgYXZlYyBzdWNjw6hzPC9wPg0KPC91bD4NCjxwPkNvbmZvcm3DqW1lbnQgw6AgbGEgbGljZW5jZSBHUEwsIGNlIG1vZHVsZSBlc3QgZGlzdHJpYnXDqSB0ZWwgcXVlbC4gVmV1aWxsZXogdm91cyByw6lmw6lyZXIgZGlyZWN0ZW1lbnQgw6AgbGEgbGljZW5jZSBwb3VyIHRvdXQgYXZpcyBkZSBub24gcmVzcG9uc2FiaWxpdMOpLjwvcD4NCjxoMz5SZXF1aXM8L2gzPg0KPHA+UG91ciBsXCdpbXBsw6ltZW50YXRpb24gZGUgbGEgcsOpaW5pdGlhbGlzYXRpb24gZGUgbW90IGRlIHBhc3NlIG91Ymxpw6ksIGNlIG1vZHVsZSByZXF1aWVydCBxdWUgbGUgbW9kdWxlIENNU01haWxlciBzb2l0IHByw6lhbGFibGVtZW50IGluc3RhbGzDqS48L3A+DQo8aDM+Q29weXJpZ2h0IGV0IExpY2VuY2U8L2gzPg0KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA1LCBSb2JlcnQgQ2FtcGJlbCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gVG91cyBkcm9pdHMgcsOpc2VydsOpcy48L3A+DQo8cD5DZSBtb2R1bGUgZXN0IGRpc3RyaWJ1w6kgc291cyBsYSBsaWNlbmNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCIgdGFyZ2V0PSJfYmxhbmsiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFZvdXMgZGV2ZXogYWdyw6llciBhdXggdGVybWVzIGRlIGNldHRlIGxpY2VuY2UgcG91ciBwb3V2b2lyIHV0aWxpc2VyIGNlIG1vZHVsZS48L3A+JzsKPz4=]]></data>
  </file>
  <file>
    <filename>/lang/ext/it_IT.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2Zyb250ZW5kdXNlcl9sb2dvdXQnXSA9ICdGcm9udGVuZCBVc2VyIExvZ291dCc7CiRsYW5nWydmcm9udGVuZHVzZXJfbG9nZ2VkaW4nXSA9ICdGcm9udGVuZCBVc2VyIExvZ2luJzsKJGxhbmdbJ2VkaXRwcm9wX2luZm9tc2cnXSA9ICc8Zm9udCBjb2xvcj0mcXVvdDtyZWQmcXVvdDs+PGI+VVNBUkUgQ09OIENBVVRFTEE8L2I+IHF1YW5kbyBtb2RpZmljYXRlIHByb3ByaWV0JmFncmF2ZTsgZXNpc3RlbnRpIGNoZSBzb25vIGFzc2VnbmF0ZSBhIGdydXBwaSwgcG90ZW56aWFsbWVudGUgcG90ZXRlIGNhdXNhcmUgZGFubmVnZ2lhbWVudGkgZSBmZXJtYXJlIHVuIHNpdGUgZXNpc3RlbnRlPGk+IChzcGVjaWFsbWVudGUgc2UgcmlkdWNldGUgbGEgbHVuZ2hlenphIGRlaSBjYW1waSwgZXRjKTwvaT48L2ZvbnQ+JzsKJGxhbmdbJ2luZm9fc210cHZhbGlkYXRlJ10gPSAnUXVlc3RhIGZ1bnppb25lIG5vbiBsYXZvcmEgc3Ugd2luZG93cyc7CiRsYW5nWydtc2dfZG9udGNyZWF0ZXVzZXJuYW1lJ10gPSAnRG8gbm90IGNyZWF0ZSBhIHByb3BlcnR5IGZvciB1c2VybmFtZSwgb3Igc29tZSBzdWNoIHRoaW5nIGFzIHRoaXMgaXMgYnVpbHRpbiB0byB0aGUgRnJvbnRFbmRVc2VycyBtb2R1bGUnOwokbGFuZ1sncHJvbXB0X2V4cG9ydGNzdiddID0gJ0VzcG9ydGEgZ2xpIHV0ZW50aSBpbiBDU1YnOwokbGFuZ1snZXhwb3J0Y3N2J10gPSAnRXNwb3J0YSc7CiRsYW5nWydhZG1pbiddID0gJ0FtbWluaXN0YXppb25lJzsKJGxhbmdbJ2VkaXRwcm9wJ10gPSAnTW9kaWZpY2EgcHJvcHJpZXQmYWdyYXZlOyc7CiRsYW5nWydtYXhsZW5ndGgnXSA9ICdNYXNzaW1hIGx1bmdoZXp6YSc7CiRsYW5nWydjcmVhdGVkJ10gPSAnQ3JlYXRvJzsKJGxhbmdbJ3NvcnRieSddID0gJ09yZGluYXRvIHBlcic7CiRsYW5nWydzb3J0J10gPSAnT3JkaW5hbWVudG8nOwokbGFuZ1sndXNlcnNpbmdyb3VwJ10gPSAnVXRlbnRpIG5lbCBncnVwcG8nOwokbGFuZ1sndXNlcmxpbWl0J10gPSAnTGltaXQgcmVzdWx0cyB0byc7CiRsYW5nWydlcnJvcl9ub2VtYWlsZmllbGQnXSA9ICdDb3VsZCBub3QgZmluZCBhbiBlbWFpbCBmaWVsZCBmb3IgdGhpcyB1c2VyLiAgWW91IG1heSBuZWVkIHRvIGNvbnRhY3QgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yJzsKJGxhbmdbJ3Byb21wdF9mb3Jnb3Rwd19wYWdlJ10gPSAnUGFnZUlEL0FsaWFzIGZvciBGb3Jnb3QgUGFzc3dvcmQgZm9ybSc7CiRsYW5nWydwcm9tcHRfY2hhbmdlc2V0dGluZ3NfcGFnZSddID0gJ1BhZ2VJRC9BbGlhcyBmb3IgQ2hhbmdlIFNldHRpbmdzIGZvcm0nOwokbGFuZ1sncHJvbXB0X2xvZ2luX3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgdG8ganVtcCB0byBhZnRlciBsb2dpbic7CiRsYW5nWydwcm9tcHRfbG9nb3V0X3BhZ2UnXSA9ICdQYWdlSUQvQWxpYXMgdG8ganVtcCB0byBhZnRlciBsb2dvdXQnOwokbGFuZ1snc29ydG9yZGVyJ10gPSAnT3JkaW5lJzsKJGxhbmdbJ3Byb21wdF9udW1yZXNldHJlY29yZCddID0gJ0EgbnVtYmVyIG9mIHVzZXJzIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHJlc2V0dGluZyBsb3N0IHBhc3N3b3Jkcy4gIEN1cnJlbnRseSB0aGlzIGNvdW50IGlzIGF0Oic7CiRsYW5nWydyZW1vdmUxd2VlayddID0gJ1JpbXVvdmkgdHV0dGUgbGUgZW50aXQmYWdyYXZlOyBwaSZ1Z3JhdmU7IHZlY2NoaWUgZGkgdW5hIHNldHRpbWFuYSc7CiRsYW5nWydyZW1vdmUxbW9udGgnXSA9ICdSaW11b3ZpIHR1dHRlIGxlIGVudGl0JmFncmF2ZTsgcGkmdWdyYXZlOyB2ZWNjaGllIGRpIHVuIG1lc2UnOwokbGFuZ1sncmVtb3ZlYWxsJ10gPSAnUmltdW92aSB0dXR0ZSBsZSBlbnRpdCZhZ3JhdmU7JzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICdTZWkgc2ljdXJvPyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkY29kZSddID0gJ1VuIGNvZGljZSBpbnZhbGlkbyAmZWdyYXZlOyBzdGF0byBhZ2dpdW50bywgcHJvdmEgZGkgbnVvdm8nOwokbGFuZ1snZXJyb3JfdGVtcGNvZGVub3Rmb3VuZCddID0gJ0EgdGVtcG9yYXJ5IGNvZGUgZm9yIHlvdXIgdXNlciBpZCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIGRhdGFiYXNlJzsKJGxhbmdbJ2ZvcmdvdHBhc3N3b3JkX3ZlcmlmeXRlbXBsYXRlJ10gPSAnTW9kZWxsbyB1c2F0byBwZXIgdmlzdWFsaXp6YXJlIGlsIG1vZHVsbyBkaSB2ZXJpZmljYSc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF9lbWFpbHRlbXBsYXRlJ10gPSAnTW9kZWxsbyB1c2F0byBwZXIgbGEgcGFzc29yZCBkaW1lbnRpY2F0YSc7CiRsYW5nWydlcnJvcl9yZXNldGFscmVhZHlzZW50J10gPSAnRWl0aGVyIHlvdXJzZWxmIG9yIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSB0cmlnZ2VyZWQgYSBwYXNzd29yZCByZXNldCBvcGVyYXRpb24gZm9yIHRoaXMgYWNjb3VudC4gIENoZWNrIHlvdXIgZW1haWwsIHlvdSBtYXkgaGF2ZSBmdXJ0aGVyIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBpbiB5b3VyIGluYm94JzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdFcnJvcmUgZGF0YWJhc2UnOwokbGFuZ1snbWVzc2FnZV9mb3Jnb3Rwd2VtYWlsJ10gPSAnSGFpIHJpY2V2dXRvIHF1ZXN0byBtZXNzYWdnaW8gcGVyY2gmZWdyYXZlOyBxdWFsY3VubyBoYSBzZWduYWxhdG8gY2hlIGhhaSBwZXJzbyBsYSB0dWEgcGFzc3dvcmQuIFNlIHF1ZXN0byAmZWdyYXZlOyB2ZXJvLCBsZWdnaSBsZSBpc3RydXppb25pIHNvdHRvc3RhbnRpLiBTZSBpbnZlY2Ugbm9uICZlZ3JhdmU7IGlsIGNhc28gYWxsb3JhIHNlaSBwcmVnYXRvIGRpIGNhbmNlbGxhcmUgcXVlc3RvIG1lc3NhZ2dpbyBlIHRpIHJpbmdyYXppYW1vIHBlciBpbCB0dW8gdGVtcG8uJzsKJGxhbmdbJ3Byb21wdF9jb2RlJ10gPSAnQ29kaWNlJzsKJGxhbmdbJ21lc3NhZ2VfY29kZSddID0gJ0lsIHNlZ3VlbnRlIGNvZGljZSAmZWdyYXZlOyBzdGF0byBnZW5lcmF0byBpbiBtYW5pZXJhIHJhbmRvbSBwZXIgdmVyaWZpY2FyZSBsbyB1c2VyIGFjY291bnQuIFF1YW5kbyBmYXRlIGNsaWNrIHN1bCBsaW5rIHNvdHRvc3RhbnRlIHZpIHNhciZhZ3JhdmU7IHByZXNlbnRhdG8gdW4gY2FtcG8gcGVyIGluc2VyaXJlIHF1ZXN0byBjb2RpY2UuIE5vcm1hbG1lbnRlIGlsIGNhbXBvICZlZ3JhdmU7IHByZS1jb21waWxhdG8sIG1hIHNlIGNvcyZpZ3JhdmU7IG5vbiBmb3NzZSBpbCBjb2RpY2UgJmVncmF2ZTs6JzsKJGxhbmdbJ3Byb21wdF9saW5rJ10gPSAnQ2xpY2tpbmcgb24gdGhlIGZvbGxvd2luZyBsaW5rIHdpbGwgdGFrZSB5b3UgdG8gdGhlIHdlYnNpdGUgd2hlcmUgeW91IGNhbiBlbnRlciB0aGUgYWJvdmUgY29kZSwgYW5kIHJlc2V0IHlvdXIgcGFzc3dvcmQ6JzsKJGxhbmdbJ2xvc3RwYXNzd29yZF9lbWFpbHN1YmplY3QnXSA9ICdQYXNzd29yZCBwZXJzYSc7CiRsYW5nWydlcnJvcl9ub21haWxlcm1vZHVsZSddID0gJ05vbiB0cm92byBpbCBtb2R1bG8gQ01TTWFpbGVyJzsKJGxhbmdbJ2luZm9fZm9yZ290cHdtZXNzYWdlc2VudCddID0gJ1VuYSBlbWFpbCAmZWdyYXZlOyBzdGF0YSBzcGVkaXRhIGEgJXMgY29uIGxlIGlzdHJ1emlvbmkgZGkgY29tZSBhenplcmFyZSBsYSB2b3N0cmEgcGFzc3dvcmQuIEdyYXppZSc7CiRsYW5nWydsb3N0cHdfbWVzc2FnZSddID0gJ1NvIHlvdSBmb3Jnb3Qgb3IgbG9zdCB5b3VyIHBhc3N3b3JkLiBXZWxsLCB0eXBlIHlvdXIgdXNlcm5hbWUgaW4gaGVyZSwgYW5kIGlmIHdlIGNhbiBmaW5kIHlvdSB3ZSB3aWxsIHNlbmQgeW91IGFuIGVtYWlsIHdpdGggaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byByZXNldCBpdCc7CiRsYW5nWydmb3Jnb3RwYXNzd29yZF90ZW1wbGF0ZSddID0gJ0ZvcmdvdCBQYXNzd29yZCBUZW1wYXRlcyc7CiRsYW5nWydlcnJvcl9wcm9wbm90Zm91bmQnXSA9ICdQcm9wcmlldCZhZ3JhdmU7ICVzIG5vbiB0cm92YXRhJzsKJGxhbmdbJ3Byb3BzZm91bmQnXSA9ICdQcm9wcmlldCZhZ3JhdmU7IHRyb3ZhdGEnOwokbGFuZ1snYWRkcHJvcCddID0gJ0FkZCBQcm9wZXJ0eSc7CiRsYW5nWydlcnJvcl9yZXF1aXJlZGZpZWxkJ10gPSAnVW4gY2FtcG8gcmljaGllc3RvICglcykgZXJhIHZ1b3RvJzsKJGxhbmdbJ2luZm9fZW1wdHlwYXNzd29yZGZpZWxkJ10gPSAnRW50ZXIgYSBuZXcgcGFzc3dvcmQgaGVyZSB0byBjaGFuZ2UgeW91ciBwYXNzd29yZCc7CiRsYW5nWydlcnJvcl9ub3Rsb2dnZWRpbiddID0gJ1lvdSBkbyBub3QgYXBwZWFyIHRvIGJlIGxvZ2dlZCBpbic7CiRsYW5nWyd1c2VyX3NldHRpbmdzJ10gPSAnQ29uZmlndXJhemlvbmknOwokbGFuZ1sndXNlcl9yZWdpc3RyYXRpb24nXSA9ICdSZWdpc3RyYXppb25lJzsKJGxhbmdbJ2Vycm9yX2FjY291bnRleHBpcmVkJ10gPSAnUXVlc3RvIGFjY291bnQgJmVncmF2ZTsgc3BpcmF0byc7CiRsYW5nWydlcnJvcl9pbXByb3BlcmVtYWlsZm9ybWF0J10gPSAnSW1wcm9wZXIgZW1haWwgYWRkcmVzcyBmb3JtYXR0aW5nJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRleHBpcnlkYXRlJ10gPSAnSW52YWxpZCBleHBpcnkgZGF0ZSc7CiRsYW5nWydlcnJvcl9wcm9ibGVtc2V0dGluZ3Byb3BlcnR5J10gPSAnRXJyb3Igc2V0dGluZyBwcm9wZXJ0eSAlcyBmb3IgdXNlciAkcyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkZ3JvdXBpZCddID0gJ0ludmFsaWQgZ3JvdXAgaWQgJXMnOwokbGFuZ1snaGlkZGVuZmllbGRtYXJrZXInXSA9ICdNYXJjYXRvcmUgZGVsIGNhbXBvIG5hc2Nvc3RvJzsKJGxhbmdbJ2hpZGRlbmZpZWxkY29sb3InXSA9ICdDb2xvcmUgZGVsIGNhbXBvIG5hc2Nvc3RvJzsKJGxhbmdbJ2hpZGRlbiddID0gJ05hc2Nvc3RvJzsKJGxhbmdbJ2Vycm9yX2R1cGxpY2F0ZW5hbWUnXSA9ICdBIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lIGlzIGFscmVhZHkgZGVmaW5lZCc7CiRsYW5nWydlcnJvcl9ub3Byb3BlcnRpZXMnXSA9ICdOZXNzdW5hIHByb3ByaWV0JmFncmF2ZTsgZGVmaW5pdGEnOwokbGFuZ1snZXJyb3Jfbm9yZWxhdGlvbnMnXSA9ICdObyBwcm9wZXJ0aWVzIHdlcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZ3JvdXAnOwokbGFuZ1snZ3JvdXBzZm91bmQnXSA9ICdHcnVwcGkgdHJvdmF0aSc7CiRsYW5nWydlcnJvcl9vbmVncm91cHJlcXVpcmVkJ10gPSAnTWVtYmVyc2hpcCBpbiBhdCBsZWFzdCBvbmUgZ3JvdXAgaXMgcmVxdWlyZWQnOwokbGFuZ1sncHJvbXB0X3JlcXVpcmVvbmVncm91cCddID0gJ1JlcXVpcmUgbWVtYmVyc2hpcCBpbiBhdGxlYXN0IG9uZSBncm91cCc7CiRsYW5nWydiYWNrJ10gPSAnSW5kaWV0cm8nOwokbGFuZ1snZXJyb3JfbWlzc2luZ19yZXF1aXJlZF9wYXJhbSddID0gJyVzICZlZ3JhdmU7IHVuIGNhbXBvIHJpY2hpZXN0byc7CiRsYW5nWydyZXF1aXJlZGZpZWxkbWFya2VyJ10gPSAnTWFyayByZXF1aXJlZCBmaWVsZHMgd2l0aCc7CiRsYW5nWydyZXF1aXJlZGZpZWxkY29sb3InXSA9ICdIaWxpdGUgcmVxdWlyZWQgZmllbGRzIGluJzsKJGxhbmdbJ25leHQnXSA9ICdBdmFudGknOwokbGFuZ1snZXJyb3JfZ3JvdXBleGlzdHMnXSA9ICdBIEdyb3VwIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ3JlcXVpcmVkJ10gPSAnQ2FtcG8gcmljaGllc3RvJzsKJGxhbmdbJ29wdGlvbmFsJ10gPSAnT3B6aW9uYWxlJzsKJGxhbmdbJ29mZiddID0gJ09mZic7CiRsYW5nWydsZW5ndGgnXSA9ICdMdW5naGV6emEnOwokbGFuZ1snbGVuZ3RoY29tbWVudCddID0gJzxicj4oY2hhcnMgaW4gdGhlIHRleHQgaW5wdXQpJzsKJGxhbmdbJ3NlbG9wdGlvbnMnXSA9ICdEcm9wZG93biBvcHRpb25zLCBzZXBhcmF0ZWQgYnkgbGluZSBicmVha3MnOwokbGFuZ1sneWVzJ10gPSAnUyZpZ3JhdmU7JzsKJGxhbmdbJ3Byb21wdCddID0gJ1Byb21wdCc7CiRsYW5nWyd0eXBlJ10gPSAnVHlwZSc7CiRsYW5nWyd0ZXh0J10gPSAnVGV4dCc7CiRsYW5nWydjaGVja2JveCddID0gJ0NoZWNrYm94JzsKJGxhbmdbJ2VtYWlsJ10gPSAnSW5kaXJpenpvIGVtYWlsJzsKJGxhbmdbJ3RleHRhcmVhJ10gPSAnVGV4dGFyZWEnOwokbGFuZ1snZHJvcGRvd24nXSA9ICdEcm9wZG93bic7CiRsYW5nWydtc2dfY3VycmVudGx5bG9nZ2VkaW5hcyddID0gJ0JlbnZlbnV0byc7CiRsYW5nWydsb2dvdXQnXSA9ICdTaWduIG91dCc7CiRsYW5nWydwcm9tcHRfY2hhbmdlc2V0dGluZ3MnXSA9ICdDaGFuZ2UgTXkgU2V0dGluZ3MnOwokbGFuZ1snZXJyb3JfbG9naW5mYWlsZWQnXSA9ICdMb2dpbiBmYWlsZWQgLSBJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkPyc7CiRsYW5nWydsb2dpbiddID0gJ1NpZ24gaW4nOwokbGFuZ1sncHJvbXB0X3VzZXJuYW1lJ10gPSAnVXNlcm5hbWUnOwokbGFuZ1sncHJvbXB0X3Bhc3N3b3JkJ10gPSAnUGFzc3dvcmQnOwokbGFuZ1sncmVnaXN0ZXInXSA9ICdSZWdpc3Rlcic7CiRsYW5nWydmb3Jnb3RwdyddID0gJ0RpbWVudGljYXRhIGxhIHBhc3N3b3JkPyc7CiRsYW5nWydkZWZhdWx0cyddID0gJ1ByZWRlZmluaXRvJzsKJGxhbmdbJ3RlbXBsYXRlJ10gPSAnTW9kZWxsbyc7CiRsYW5nWydlcnJvcl91c2Vybm90Zm91bmQnXSA9ICdVc2VyIElEIG5vbiB0cm92YXRvJzsKJGxhbmdbJ2Vycm9yX3VzZXJuYW1ldGFrZW4nXSA9ICdRdWVzdG8gdXNlcm5hbWUgKCVzKSAmZWdyYXZlOyBnaSZhZ3JhdmU7IGluIHVzbyc7CiRsYW5nWydwcm9tcHRfc210cHZhbGlkYXRlJ10gPSAnVXNlIFNNVFAgdG8gdmFsaWRhdGUgZW1haWwgYWRkcmVzc2VzPyc7CiRsYW5nWydwcm9tcHRfbWlucHdsZW4nXSA9ICdMdW5naGV6emEgbWluaW1hIGRlbGxhIHBhc3N3b3JkJzsKJGxhbmdbJ3Byb21wdF9tYXhwd2xlbiddID0gJ0x1bmdoZXp6YSBtYXNzaW1hIGRlbGxhIHBhc3N3b3JkJzsKJGxhbmdbJ3Byb21wdF9taW51bmxlbiddID0gJ0x1bmdoZXp6YSBtaW5pbWEgZGVsbG8gdXNlcm5hbWUnOwokbGFuZ1sncHJvbXB0X21heHVubGVuJ10gPSAnTHVuZ2hlenphIG1hc3NpbWEgZGVsbG8gdXNlcm5hbWUnOwokbGFuZ1sncHJvbXB0X3Nlc3Npb250aW1lb3V0J10gPSAnU2Vzc2lvbiBUaW1lb3V0IChtaW51dGVzKSc7CiRsYW5nWydwcm9tcHRfYWxsb3dlbWFpbHJlZyddID0gJ0FsbG93IEVtYWlsIFJlZ2lzdHJhdGlvbic7CiRsYW5nWydwcm9tcHRfZGZsdGdyb3VwJ10gPSAnRGVmYXVsdCBHcm91cCBmb3IgbmV3IHVzZXJzJzsKJGxhbmdbJ2NoYW5nZXNldHRpbmdzX3RlbXBsYXRlJ10gPSAnQ2hhbmdlIFNldHRpbmdzIFRlbXBsYXRlJzsKJGxhbmdbJ2Vycm9yX3Bhc3N3b3JkbWlzbWF0Y2gnXSA9ICdMZSBwYXNzd29yZCBub24gY29pbmNpZG9ubyc7CiRsYW5nWydlcnJvcl9pbnZhbGlkdXNlcm5hbWUnXSA9ICdVc2VybmFtZSBub24gdmFsaWRvJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRwYXNzd29yZCddID0gJ1Bhc3N3b3JkIG5vbiB2YWxpZGEnOwokbGFuZ1snZWRpdHVzZXInXSA9ICdFZGl0IFVzZXInOwokbGFuZ1sndmFsaWQnXSA9ICdWYWxpZG8nOwokbGFuZ1sndXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWydzdGF0dXMnXSA9ICdTdGF0byc7CiRsYW5nWydlcnJvcl9tZW1iZXJncm91cHMnXSA9ICdUaGlzIHVzZXIgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncm91cHMnOwokbGFuZ1snZXJyb3JfcHJvcGVydGllcyddID0gJ05lc3N1bmEgUHJvcHJpZXQmYWdyYXZlOyc7CiRsYW5nWyd2YWx1ZSddID0gJ1ZhbG9yZSc7CiRsYW5nWydncm91cHMnXSA9ICdHcnVwcGknOwokbGFuZ1sncHJvcGVydGllcyddID0gJ1Byb3ByaWV0JmFncmF2ZTsnOwokbGFuZ1sncHJvcG5hbWUnXSA9ICdOb21lIGRlbGxhIHByb3ByaWV0JmFncmF2ZTsnOwokbGFuZ1sncHJvcHZhbHVlJ10gPSAnVmFsb3JlIGRlbGxhIHByb3ByaWV0JmFncmF2ZTsnOwokbGFuZ1snYWRkJ10gPSAnQWRkJzsKJGxhbmdbJ2VkaXQnXSA9ICdNb2RpZmljYSc7CiRsYW5nWydleHBpcmVzJ10gPSAnRXhwaXJlcyc7CiRsYW5nWydzcGVjaWZ5X2RhdGUnXSA9ICdTcGVjaWZ5IERhdGUnOwokbGFuZ1snMTJocnMnXSA9ICcxMiBPcmUnOwokbGFuZ1snMjRocnMnXSA9ICcyNCBPcmUnOwokbGFuZ1snNDhocnMnXSA9ICc0OCBPcmUnOwokbGFuZ1snMXdlZWsnXSA9ICcxIFNldHRpbWFuYSc7CiRsYW5nWycyd2Vla3MnXSA9ICcyIFNldHRpbWFuZSc7CiRsYW5nWycxbW9udGgnXSA9ICcxIE1lc2UnOwokbGFuZ1snM21vbnRocyddID0gJzMgTWVzaSc7CiRsYW5nWyc2bW9udGhzJ10gPSAnNiBNZXNpJzsKJGxhbmdbJzF5ZWFyJ10gPSAnMSBBbm5vJzsKJGxhbmdbJ25ldmVyJ10gPSAnTWFpJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsbWVzc2FnZSddID0gJ01vZHVsbyBpbnN0YWxsYXRvLjxici8+RXNzZXJlIHNpY3VyaSBkaSBjb25maWd1cmFyZSAmcXVvdDtNb2RpZmljYSBGcm9udEVuZFVzZXIgcHJvcHJpZXQmYWdyYXZlOyBwZXJtZXNzaS4mcXVvdDsnOwokbGFuZ1sncGFzc3dvcmQnXSA9ICdQYXNzd29yZCc7CiRsYW5nWydyZXBlYXRwYXNzd29yZCddID0gJ0RpIG51b3ZvJzsKJGxhbmdbJ2Vycm9yX2dyb3VwbmFtZV9leGlzdHMnXSA9ICdHcm91cCBieSB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMnOwokbGFuZ1snZWRpdGdyb3VwJ10gPSAnRWRpdCBHcm91cCc7CiRsYW5nWydzdWJtaXQnXSA9ICdJbnZpYSc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWxsYSc7CiRsYW5nWydkZWxldGUnXSA9ICdDYW5jZWxsYSc7CiRsYW5nWydjb25maXJtX2VkaXRncm91cCddID0gJ0FyZSB5b3Ugc3VyZSB0aGlzIGlzIHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoaXMgZ3JvdXA/XG5UdXJuaW5nIGEgcHJvcGVydHkgb2ZmIHdpbGwgbm90IGRlbGV0ZSBhbnkgZW50cmllcyBpbiB0aGUgcHJvcGVydGllcyB0YWJsZSBmb3IgdGhpcyBncm91cC91c2VyLiAgVGhleSB3aWxsIG1lcmVseSBiZSB1bmF2YWlsYWJsZS4nOwokbGFuZ1snYXJleW91c3VyZV9kZWxldGVncm91cCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBncm91cD8nOwokbGFuZ1snY29uZmlybV9kZWxldGVfcHJvcCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb21wbGV0ZWx5IGRlbGV0ZSB0aGlzIHByb3BlcnR5P1xuRG9pbmcgc28gd2lsbCBhbHNvIGVyYXNlIGFueSB1c2VyIGVudHJpZXMgZm9yIHRoaXMgcHJvcGVydHkuJzsKJGxhbmdbJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcyddID0gJ1BhcmFtZXRyaSBpbnN1ZmZpY2llbnRpJzsKJGxhbmdbJ2lkJ10gPSAnSUQnOwokbGFuZ1snbmFtZSddID0gJ05vbWUnOwokbGFuZ1snZXJyb3JfY2FudGFkZGdvcnVwJ10gPSAnUHJvYmxlbSBhZGRpbmcgZ3JvdXAnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhcmFtcyddID0gJ0ludmFsaWQgUGFyYW1ldGVycyc7CiRsYW5nWydhcHBseWZpbHRlciddID0gJ0FwcGxpY2EnOwokbGFuZ1snZmlsdGVyJ10gPSAnRmlsdHJvJzsKJGxhbmdbJ3VzZXJmaWx0ZXInXSA9ICdVc2VybmFtZSBSZWd1bGFyIEV4cHJlc3Npb24nOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdEZXNjcml6aW9uZSc7CiRsYW5nWydncm91cG5hbWUnXSA9ICdOb21lIGdydXBwbyc7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3NvIG5lZ2F0byc7CiRsYW5nWydlcnJvciddID0gJ0Vycm9yZSc7CiRsYW5nWydhZGRncm91cCddID0gJ0FkZCBHcm91cCc7CiRsYW5nWydhZGR1c2VyJ10gPSAnQWRkIFVzZXInOwokbGFuZ1sndXNlcnNmb3VuZCddID0gJ1VzZXJzIGZvdW5kIHRoYXQgbWF0Y2ggdGhlIGNyaXRlcmlhJzsKJGxhbmdbJ2dyb3VwJ10gPSAnR3J1cHBvJzsKJGxhbmdbJ3NlbGVjdGdyb3VwJ10gPSAnU2VsZWN0IEdyb3VwJzsKJGxhbmdbJ3JlZ2lzdHJhdGlvbl90ZW1wbGF0ZSddID0gJ01vZGVsbG8gcmVnaXN0cmF6aW9uZSc7CiRsYW5nWydsb2dvdXRfdGVtcGxhdGUnXSA9ICdMb2dvdXQgVGVtcGxhdGUnOwokbGFuZ1snbG9naW5fdGVtcGxhdGUnXSA9ICdMb2dpbiBUZW1wbGF0ZSc7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ1ByZWZlcmVuY2VzJzsKJGxhbmdbJ3VzZXJzJ10gPSAnVXNlcnMnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnRnJvbnRlbmQgVXNlciBNYW5hZ21lbnQnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdNYW5hZ2UgRnJvbnRlbmQgVXNlcnMnOwokbGFuZ1snZGVmYXVsdGZyb250cGFnZSddID0gJ0Zyb250IHBhZ2UgcHJlZGVmaW5pdGEnOwokbGFuZ1snbGFzdGFjY2Vzc2VkcGFnZSddID0gJ1VsdGltYSBwYWdpbmEgYWNjZWR1dGEnOwokbGFuZ1snb3RoZXJwYWdlJ10gPSAnQWx0cmEgcGFnaW5hOiAnOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPg0KPGxpPjAuMC4xIC0gT2N0b2JlciwgMjAwNSAtIEluaXRpYWwgTlJQVCAoTm90IFJlYWR5IGZvciBQcmltZSBUaW1lKSByZWxlYXNlPC9saT4NCjxsaT4wLjEuMCAtIE9jdG9iZXIsIDIwMDUgLSBJbml0aWFsIHJlbGVhc2U8L2xpPg0KPGxpPjAuMS4xIC0gT2N0b2JlciwgMjAwNSAtIEZpeGVkIGlzc3VlcyB3aXRoIHByb3BlcnRpZXM8L2xpPg0KPGxpPjAuMS4yIC0gT2N0b2JlciwgMjAwNSAtIEFkZGVkIGZvcmdvdHRlbiBwYXNzd29yZCBmdW5jdGlvbmFsaXR5PC9saT4NCjxsaT48cD4wLjEuMyAtIE5vdmVtYmVyLCAyMDA1PC9wPg0KICAgIDxwPkFkZGVkIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgYSByZWRpcmVjdCBwYWdlIG9uIGxvZ2luLCBsb2dvdXQsIGZvcmdvdCBwYXNzd29yZCwgYW5kIGNoYW5nZSBzZXR0aW5ncywgYW5kIGFkZGVkIHRoZSByZXR1cm50byBhbmQgZm9ybSBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIHNpZGUgb2YgdGhpbmdzLCBhbHNvIGRpZCBhIGNvdXBsZSBsZiBsaXR0bGUgY2xlYW51cHMuICBUaGlzIHZlcnNpb24gcmVxdWlyZXMgdjAuMTEgYW5kIGFib3ZlIGZvciBjZXJ0YWluLjwvcD48L2xpPg0KPGxpPjAuMS40IC0gTm92ZW1iZXIsIDIwMDUgLSBWZXJ5IG1pbm9yIGNoYW5nZSB3aXRoIHJlc3BlY3QgdG8gYSBmb3Jnb3R0ZW4gYW5kIG5vIGxvbmdlciBuZWVkZWQgZnVuY3Rpb24gY2FsbDwvbGk+DQo8bGk+PHA+MC4xLjUgLSBOb3ZlbWJlciwgMjAwNTwvcD4NCiAgICA8cD5Bbm90aGVyIHZlcnkgbWlub3IgY2hhbmdlLCBhZGRlZCBzb21lIHRleHQgdG8gdGhlIFBvc3RJbnN0YWxsIG1lc3NhZ2UuPC9wPjwvbGk+DQo8bGk+PHA+MC4xLjYgLSBKYW51YXJ5LCAyMDA2PHA+DQogICAgPHA+Q2hhbmdlcyB0byB0aGUgcGVybWlzc2lvbiBtb2RlbCwgYW5kIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgcHJlZmVyZW5jZXMuICBBbHNvIHNvbWUgcGhwNSBmaXhlcyBidXQgSSBhbSBzdXJlIHRoYXQgdGhlcmUgYXJlIG1vcmUgb3V0IHRoZXJlLjwvcD48L2xpPg0KPGxpPjxwPjAuMS43IC0gSmFudWFyeSwgMjAwNjxwPg0KICAgIDxwPk1hbnkgdGhhbmtzIHRvIDxiPmthdG9uPC9iPiBmb3IgYWRkaW5nIHRoZSB0ZXh0YXJlYSBhbmQgZHJvcGRvd24gcHJvcGVydHkgdHlwZXMuPC9wPg0KICAgIDxwPkZpeGVzIHRvIHRoZSBwcm9wZXJ0eSBhZGRpbmcgdG8gZml4IHByb2JsZW1zIHdpdGggc3BhY2VzIGluIHByb3BlcnR5IG5hbWVzICh3ZSBubyBsb25nZXIgbGV0IHRoYXQgaGFwcGVuKS48L3A+DQo8L2xpPg0KPGxpPjxwPjEuMC4wIC0gRmVicnVhcnksIDIwMDY8cD4NCiAgICA8cD5BZGRlZCBmaWx0ZXJpbmcgYW5kIHJvdyBsaW1pdGluZyB0byB0aGUgYWRtaW4gcGFuZWwuIFRoaXMgd2lsbCBoYXZlIGJpZyBiZW5lZml0cyB0byB0aG9zZSB0aGF0IGFyZSB1c2luZyB0aGlzIG1vZHVsZSBmb3IgaGlnaCB0cmFmaWMsIGFuZCBoaWdoIHVzZXIgc2l0ZXMuPC9wPg0KICAgIDxwPkFkZGVkIHNvcnRpbmcgdG8gdGhlIGFkbWluIHBhbmVsPC9wPg0KICAgIDxwPkFkZGVkIG1heCBsZW5ndGggYWJpbGl0eSB0byB0ZXh0IGFuZCBlbWFpbCBmaWVsZHM8L3A+DQogICAgPHA+Rml4ZWQgYSBzbWFsbCBwcm9ibGVtIHdpdGggdGhlIGRlZmF1bHQgZ3JvdXAgbm90IGJlaW5nIGNoZWNrZWQgd2hlbiBhZGRpbmcgYSB1c2VyPC9wPg0KICAgIDxwPlNhdmUgZmlsdGVyIHNldHRpbmdzIGluIHByZWZlcmVuY2VzLCBhbmQgdGhlIGFjdGl2ZSB0YWIgdG9vLjwvcD4NCiAgICA8cD5EZWxldGUgdXNlciBwcm9wZXJ0aWVzIHdoZW4gYSBwcm9wZXJ0eSBpcyBkZWxldGVkIDxlbT5Ob3RlPC9lbT4sIG5vdCB3aGVuIGl0IGlzIGRpc2FibGVkIGluIHRoZSBlZGl0IGdyb3VwIGRpYWxvZzwvcD4NCiAgICA8cD5BZGQgY29uZmlybWF0aW9uIG1lc3NhZ2UgaW4gZWRpdCBncm91cHMuPC9wPg0KICAgIDxwPkFkZGVkIGEgY291cGxlIG1vcmUgY29uZmlybWF0aW9uIG1lc3NhZ2VzLjwvcD4NCiAgICA8cD5BZGRlZCBDU1YgRXhwb3J0IG9wdGlvbjwvcD4NCiAgICA8cD5Ub2RvIC0gQWRkIHByZWZlcmVuY2VzIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZmllbGRsZW5ndGg8L3A+DQo8L2xpPg0KPC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPg0KPHA+VGhpcyBtb2R1bGUgYWxsb3dzIG1hbmFnZW1lbnQgYW5kIGFkbWluaXN0cmF0aW9uIG9mIGZyb250IGVuZCB1c2VycyA8aT4odXNlcnMgd2hvIGhhdmUgbm8gYWRtaW4gYWNjZXNzcyk8L2k+LiAgSXQgYWxsb3dzIGNyZWF0aW9uIG9mIHVzZXIgZ3JvdXBzLCBhbmQgdXNlciBhY2NvdW50cyBhbmQgYWxsb3dzIHVzZXJzIHRvIGxvZ2luIGFuZCBsb2dvdXQuICBpdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDdXN0b21Db250ZW50IG1vZHVsZSB0byBkaXNwbGF5IGRpZmZlcmVudCBjb250ZW50IHRvIGRpZmZlcmVudCB1c2VycyBvbmNlIHRoZXkgaGF2ZSBsb2dnZWQgaW48L3A+DQo8aDM+RmVhdHVyZXM8L2gzPg0KPHVsPg0KPGxpPjxwPlVzZXIgYWNjb3VudCBleHBpcmF0aW9uLiAgWW91IGNhbiBjcmVhdGUgdGVtcG9yYXJ5IHVzZXJzPC9wPjwvbGk+DQo8bGk+PHA+R3JvdXAgUHJvcGVydGllcy4gIFlvdSBjYW4gYXNrIGZvciBkaWZmZXJlbnQgaW5mb3JtYXRpb24gZnJvbSBtZW1iZXJzIG9mIGRpZmZlcmVudCBncm91cHM8L3A+PC9saT4NCjxsaT48cD5DYXBhYmxlIG9mIGhhbmRsaW5nIGh1bmRyZWRzIG9mIHVzZXJzPC9wPjwvbGk+DQo8bGk+PHA+SGFzIGFuIGV4dGVuc2l2ZSBBUEkgZm9yIGFkZGluZyBmdW5jdGlvbmFsaXR5PC9wPjwvbGk+DQo8L3VsPg0KPGgzPkhvdyBkbyBJIHVzZSBpdDwvaDM+DQo8dWw+DQo8bGk+PHA+QWZ0ZXIgaW5zdGFsbGF0aW9uIHlvdSBjYW4gYWNjZXNzIGFkbWluIHBhbmVsIHRvIHRoZSBGcm9udEVuZFVzZXJzIG1vZHVsZSB1bmRlciB0aGUgJnF1b3Q7VXNlcnMgJmFtcDsgZ0dyb3VwcyZxdW90OyBtZW51LjwvcD48L2xpPg0KPGxpPg0KPHA+U2Vjb25kbHksIHlvdSBzaG91bGQgZGVmaW5lIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIGFyZSBlc3NlbnRpYWxseSBmaWVsZCBkZWZpbml0aW9ucywgaGVyZSB5b3Ugc3BlY2lmeSB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiB5b3Ugd2FudCB0byBnYXRoZXIsIGFuZCBsaW1pdHMuIGkuZTogIE5hbWUsIEFnZSwgQ2l0eSwgU3RhdGUsIENvdW50cnksIEVtYWlsIGFkZHJlc3MsIGV0Yy48L3A+DQo8cD48Yj5Ob3RlOjwvYj4gWW91IGRvIG5vdCBuZWVkIHRvIGRlZmluZSBwcm9wZXJ0aWVzIGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQsIHRoZXNlIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHlvdTwvYj4NCjwvbGk+DQo8bGk+PHA+TmV4dCB5b3Ugc2hvdWxkIGNyZWF0ZSBvbmUgb3IgbW9yZSB1c2VyIGdyb3Vwcy4gIFdoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCB5b3UgYXJlIGFza2VkIGZvciBhIGdyb3VwIG5hbWUsIGEgZGVzY3JpcHRpb24gYW5kIHRvIGFzc29jaWF0ZSBwcm9wZXJ0aWVzIHdpdGggdGhhdCBncm91cCwgc3BlY2lmeSB0aGUgcHJvcGVydGllcyBzb3J0IG9yZGVyLCBhbmQgd2V0aGVyIGl0IGlzIGFuIG9wdGlvbmFsLCByZXF1aXJlZCwgb3IgaGlkZGVuIGZpZWxkIDxpPihvZmYgaXMgYWxzbyB2YWxpZCk8L2k+PC9wPjwvbGk+DQo8bGk+PHA+PGI+Tm90ZTo8L2I+IEJlZm9yZSBwcm9jZWVkaW5nLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBhcmUgc2V0IGNvcnJlY3RseS48L3A+PC9saT4NCjxsaT48cD5UaGlyZGx5IHlvdSBzaG91bGQgY3JlYXRlIHNvbWUgdXNlcnMuICBBZGRpbmcgdXNlcnMgaXMgYSB0d28gc3RlcCBwcm9jZXNzLiAgV2hlbiBjcmVhdGluZyBhIHVzZXIgeW91IGFyZSBhc2tlZCBmb3IgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgYW5kIGFuIGV4cGlyeSBkYXRlIGZvciB0aGF0IHVzZXIuICBZb3UgdGhlbiBtdXN0IHNlbGVjdCB0aGUgZ3JvdXBzIHRoYXQgdGhhdCB1c2VyIGlzIGEgbWVtYmVyIG9mLCBhbmQgY2xpY2sgXCYjMDM5O05leHRcJiMwMzk7PC9wPg0KPHA+PGVtPk5vdGU6IDwvZW0+VGhpcyBpcyBhIGxhYm91ciBpbnRlbnNpdmUgYW5kIGJvcmluZyBwcm9jZXNzLCBpdCBpcyBlYXNpZXIgdG8gbGV0IHVzZXJzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMsIGFuZCB0aGVuIHlvdSBjYW4gZWRpdCB0aGVpciBncm91cCBpbmZvcm1hdGlvbi4gIGJ1dCBmb3IgdGVzdGluZyBwdXJwb3NlcywgcGxlYXNlIGNyZWF0ZSBhdCBsZXN0IG9uZSB1c2VyPC9wPjwvbGk+DQo8bGk+PHA+TGFzdGx5LCBhZnRlciB0aGUgc3lzdGVtIGhhcyBkZXRlcm1pbmVkIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gZmllbGRzIHRvIGJlIHByZXNlbnRlZCBmb3IgdGhhdCB1c2VyLCB5b3UgYXJlIHByZXNlbnRlZCB3aXRoIGEgZm9ybSBhc2tpbmcgZm9yIGFsbCBvZiB0aGUgcmVxdWlyZWQgdXNlciBpbmZvcm1hdGlvbi4gIENvbXBsZXRlIHRoaXMgZm9ybSB0byBjb21wbGV0ZSB0aGUgdXNlciBhZGRpdGlvbjwvcD48L2xpPg0KPGxpPjxwPllvdSBhcmUgbm93IHJlYWR5IHRvIGFkZCB0aGUgZnJvbnQgZW5kIGZ1bmN0aW9uYWxpdHkgdG8geW91ciBzaXRlLiAgVGhpcyBpcyBhcyBzaW1wbGUgYXMgYWRkaW5nIHRoZSB7Y21zX21vZHVsZSBtb2R1bGU9RnJvbnRFbmRVc2Vyc30gdGFnIHRvIHlvdXIgcGFnZSBvciB0ZW1wbGF0ZTwvcD48L2xpPg0KPC91bD4NCjxoMz5TdXBwb3J0PC9oMz4NCjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4NCjx1bD4NCjxsaT5Gb3IgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLCBGQVFzLCBvciB0byBmaWxlIGEgQnVnIFJlcG9ydCBvciBidXkgY29tbWVyY2lhbCBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgY2FsZ3V5XCYjMDM5O3MNCm1vZHVsZSBob21lcGFnZSBhdCA8YSBocmVmPSZxdW90O2h0dHA6Ly90ZWNoY29tLmR5bmRucy5vcmcmcXVvdDs+dGVjaGNvbS5keW5kbnMub3JnPC9hPi48L2xpPg0KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0mcXVvdDtodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmcmcXVvdDs+Q01TIE1hZGUgU2ltcGxlIEZvcnVtczwvYT4uPC9saT4NCjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9JnF1b3Q7aXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zJnF1b3Q7PkNNUyBJUkMgQ2hhbm5lbDwvYT4uPC9saT4NCjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS48L2xpPiAgDQo8L3VsPg0KPGgzPlBhcmFtZXRlcnM8L2gzPg0KPHVsPg0KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZm9ybT0mcXVvdDtuYW1lJnF1b3Q7PC9saT4NCjxwPkZvcm1zOg0KPHVsPg0KIDxsaT48ZW0+bG9naW48L2VtPiAtIERpc3BsYXkgdGhlIGxvZ2luIGZvcm08L2xpPg0KIDxsaT48ZW0+bG9nb3V0PC9lbT4gLSBEaXNwbGF5IHRoZSBsb2dvdXQgZm9ybTwvbGk+DQogPGxpPjxlbT5jaGFuZ2VzZXR0aW5nczwvZW0+IC0gRGlzcGxheSB0aGUgY2hhbmdlIHNldHRpbmdzIGZvcm08L2xpPg0KIDxsaT48ZW0+Zm9yZ290cHc8L2VtPiAtIERpc3BsYXkgdGhlIGZvcmdvdCBwYXNzd29yZCBmb3JtPC9saT4NCjwvdWw+DQo8L3A+DQo8bGk+PGVtPihvcHRpb25hbCk8L2VtPiByZXR1cm50bz0mcXVvdDtwYWdlJnF1b3Q7PC9saT4NCjxwPlVzZWQgd2l0aCB0aGUgbG9naW4sIGxvZ291dCwgYW5kIGNoYW5nZXNldHRpbmdzIGZvcm1zLCB0aGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgcGFnZSBpZCBvciBhbGlhcyBvZiBhIHBhZ2UgdG8gcmVkaXJlY3QgdG8sIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZDwvcD4NCjwvdWw+DQo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQNCm9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4NCjxoMz5SZXF1aXJlbWVudHM8L2gzPg0KPHA+SW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBmb3Jnb3R0ZW4gcGFzc3dvcmQgZnVuY3Rpb25hbGl0eSwgdGhpcyBtb2R1bGUgcmVxdWlyZXMgdGhlIENNU01haWxlciBtb2R1bGUgdG8gYmUgcHJldmlvdXNseSBpbnN0YWxsZWQ8L3A+DQo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4NCjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0mcXVvdDttYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSZxdW90Oz48Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbT48L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+DQo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwmcXVvdDs+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4nOwo/Pg==]]></data>
  </file>
  <file>
    <filename>/Random.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHANCg0KLyoqDQogKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycy4NCiAqDQogKiBAYXV0aG9yICAgIExhdXJlbnRpdSBUYW5hc2UgPGV4cGVydHBocEB5YWhvby5jb20+DQogKiBAdmVyc2lvbiAgIDEuMQ0KICovDQoNCmNsYXNzIFJhbmRvbQ0Kew0KCS8qKg0KCSAqIFNldCBkZWZhdWx0IGNoYXJhY3RlcnMuDQogICAgICoNCiAgICAgKiBAdmFyICAgICAgc3RyaW5nDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3ZjcnM7DQoNCgkvKioNCgkgKiBJZiBoYXZlIG51bWJlcg0KICAgICAqDQogICAgICogQHZhciAgICAgIGJvb2wNCiAgICAgKiBAYWNjZXNzICAgcHJpdmF0ZQ0KICAgICAqLw0KDQoJdmFyICRfdm51bTsNCg0KCS8qKg0KCSAqIElmIGRvZXNuJ3QgaGF2ZSBudW1iZXINCiAgICAgKg0KICAgICAqIEB2YXIgICAgICBib29sDQogICAgICogQGFjY2VzcyAgIHByaXZhdGUNCiAgICAgKi8NCg0KCXZhciAkX3Zub3Q7DQoNCgkvKioNCgkgKiBDb25zdHJ1Y3Rvcg0KCSAqDQoJICogU2V0IGRlZmF1bHQgdmFsdWVzDQoJICoNCgkgKiBAcGFyYW0gIHN0cmluZyAgJGNycyAgIENoYXJhY3RlcnMgb3V0cHV0DQoJICogQHBhcmFtICBib29sICAgICRudW0gICBXaXRoIG51bWJlcg0KCSAqIEBwYXJhbSAgYm9vbCAgICAkbm90ICAgV2l0aCBub3QgbnVtYmVyDQoJICovDQoNCglmdW5jdGlvbiBSYW5kb20oJGNycyA9IGZhbHNlLCAkbnVtID0gZmFsc2UsICRub3QgPSBmYWxzZSl7DQoJCSR0aGlzLT5fdm51bSA9ICRudW07DQoJCSR0aGlzLT5fdm5vdCA9ICRub3Q7DQoJCWlmKCEkY3JzKXsNCgkJCSR0aGlzLT5fdmNycyA9ICIwMTIzNDU2Nzg5Ii4NCgkJCQkiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLg0KCQkJCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7DQoJCX1lbHNlew0KCQkJJHRoaXMtPl92Y3JzID0gJGNyczsNCgkJCWlmKCgkbnVtIHx8ICRub3QpICYmICEkdGhpcy0+X3JlYygkY3JzLCAkbnVtLCAkbm90KSl7DQoJCQkJaWYoJG51bSAmJiAkbm90KSAkZXJyID0gIm51bWJlciBvciBub3QgbnVtYmVyIjsNCgkJCQllbHNlaWYoJG51bSkgJGVyciA9ICJudW1iZXIiOw0KCQkJCWVsc2VpZigkbm90KSAkZXJyID0gIm5vdCBudW1iZXIiOw0KCQkJCWVsc2UgJGVyciA9ICJjb21wYXJhdGlvbiI7DQoJCQkJdHJpZ2dlcl9lcnJvcigiQ2xhc3MgUmFuZG9tIC0gU3RyaW5nIGlucHV0IFsgIi4kY3JzLiIgXSBkb2Vzbid0IGhhdmUgIi4kZXJyLCBFX1VTRVJfRVJST1IpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJLyoqDQoJICogQ29tcGFyZSBpbnB1dCBzdHJpbmcNCgkgKg0KCSAqIEBhY2Nlc3MgIHByaXZhdGUNCgkgKiBAcGFyYW0gICBzdHJpbmcgICAkc3RyICAgICAgQ2hhcmFjdGVycyBpbnB1dA0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRudW1iZXIgICBIYXZlIG51bWJlcg0KCSAqIEBwYXJhbSAgIGJvb2wgICAgICRub3RudW0gICBIYXZlIG5vdCBudW1iZXINCgkgKiBAcmV0dXJuICBib29sICAgICBJZiBoYXZlIG51bWJlciBvci9hbmQgbm90IG51bWJlcg0KCSAqLw0KDQoJZnVuY3Rpb24gX3JlYygkc3RyLCAkbnVtYmVyID0gdHJ1ZSwgJG5vdG51bSA9IHRydWUpew0KCQkkY250ID0gc3RybGVuKCRzdHIpOw0KCQkkc2V0MSA9ICRzZXQyID0gZmFsc2U7DQoJCWlmKCRudW1iZXIgfHwgJG5vdG51bSl7DQoJCQlmb3IoJGk9MDskaTwkY250OyRpKyspew0KCQkJCWlmKCRzdHJ7JGl9ID09PSBzdHJ2YWwoaW50dmFsKCRzdHJ7JGl9KSkpICRzZXQxID0gdHJ1ZTsNCgkJCQllbHNlICRzZXQyID0gdHJ1ZTsNCgkJCQlpZigkc2V0MSAmJiAkc2V0MikgYnJlYWs7DQoJCQl9DQoJCQlpZigkbnVtYmVyICYmICRub3RudW0pIHJldHVybiAoJHNldDEgJiYgJHNldDIpOw0KCQkJZWxzZWlmKCRudW1iZXIpIHJldHVybiAkc2V0MTsNCgkJCWVsc2VpZigkbm90bnVtKSByZXR1cm4gJHNldDI7DQoJCQllbHNlIHJldHVybiB0cnVlOw0KCQl9ZWxzZSByZXR1cm4gdHJ1ZTsNCgl9DQoNCgkvKioNCgkgKiBHZW5lcmF0ZSByYW5kb20gY2hhcmFjdGVycw0KCSAqDQoJICogQGFjY2VzcyAgcHVibGljDQoJICogQHBhcmFtICAgaW50ICAgICAgJGxlbiAgIExlbmd0aCBvZiB0aGUgc3RyaW5nIHlvdSB3YW50IGdlbmVyYXRlZA0KCSAqIEByZXR1cm4gIHN0cmluZyAgIFJhbmRvbSBjaGFyYWN0ZXJzDQoJICovDQoNCglmdW5jdGlvbiBnZXQoJGxlbil7DQoJCWlmKCEoaXNfaW50KCRsZW4pICYmICRsZW4gPiAwKSkgcmV0dXJuICR0aGlzLT5fdmNyczsNCgkJJHJldCA9ICIiOw0KCQkkY250ID0gc3RybGVuKCR0aGlzLT5fdmNycyktMTsNCgkJZm9yKCRpPTA7JGk8JGxlbjskaSsrKSAkcmV0IC49ICR0aGlzLT5fdmNyc3tyYW5kKDAsICRjbnQpfTsNCgkJaWYoJHRoaXMtPl92bnVtIHx8ICR0aGlzLT5fdm5vdCkgcmV0dXJuICR0aGlzLT5fcmVjKCRyZXQsICR0aGlzLT5fdm51bSwgJHRoaXMtPl92bm90KSA/ICRyZXQgOiBSYW5kb206OmdldCgkbGVuKTsNCgkJZWxzZSByZXR1cm4gJHJldDsNCgl9DQoNCn0NCg0KPz4=]]></data>
  </file>
  <file>
    <filename>/svn-commit.tmp</filename>
    <isdir>0</isdir>
    <data><![CDATA[Rml4ZWQgYSBvbmUgbGluZSBsaW1pdCBwcm9ibGVtCi0tVGhpcyBsaW5lLCBhbmQgdGhvc2UgYmVsb3csIHdpbGwgYmUgaWdub3JlZC0tCgpNICAgIEZyb250RW5kVXNlcnMubW9kdWxlLnBocAo=]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/addgroup.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZ3JvdXBuYW1lfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZ3JvdXBuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9ncm91cGRlc2N9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9ncm91cGRlc2N9PC9wPgogIDwvZGl2Pgp7aWYgJHByb3Bjb3VudCA+IDB9Cjxici8+Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJICAgICAgICAgICAgICAgIDx0aD57JHByb21wdHRleHR9PC90aD4KCQkJPHRoPnskdHlwZXRleHR9PC90aD4KCSAgICAgICAgICAgICAgICA8dGg+eyRzb3J0b3JkZXJ0ZXh0fTwvdGg+CgkJCTx0aD57JHJlcXVpcmVkdGV4dH08L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRwcm9wcyBpdGVtPXByb3BlfQoJCTx0ciBjbGFzcz0ieyRwcm9wLT5yb3djbGFzc30iPgoJCQk8dGQ+eyRwcm9wZS0+bmFtZX08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+cHJvbXB0fTwvdGQ+CgkJCTx0ZD57JHByb3BlLT50eXBlfTwvdGQ+CgkgICAgICAgICAgICAgICAgPHRkPnskcHJvcGUtPnNvcnRvcmRlcn08L3RkPgoJCQk8dGQ+eyRwcm9wZS0+cmVxdWlyZWR9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/addprop.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19Cnskb3JpZ190eXBlfQp7JGVkaXRwcm9wfTxici8+CnskaW5mb21zZzF9PGJyLz4KeyRpbmZvbXNnMn08aHIvPgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X25hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9uYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9wcm9tcHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wcm9tcHR9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3R5cGV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF90eXBlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdDJ9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dDJ9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/addprop2.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgeyRpbnB1dF9uYW1lfQogIHskaW5wdXRfcHJvbXB0fQogIHskaW5wdXRfdHlwZX0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdDF9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dDF9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0Mn08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0Mn08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adduser1.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfdXNlcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91c2VybmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfcGFzc3dvcmR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9wYXNzd29yZH0mbmJzcDt7JGluZm9fcGFzc3dvcmR9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3JlcGVhdHBhc3N3b3JkfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVwZWF0cGFzc3dvcmR9Jm5ic3A7eyRpbmZvX3JlcGVhdHBhc3N3b3JkfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9leHBpcmVzfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPntodG1sX3NlbGVjdF9kYXRlIHByZWZpeD0kZXhwaXJlc19kYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlIHN0YXJ0X3llYXI9MjAwMCBlbmRfeWVhcj0yMDQwfSB7aHRtbF9zZWxlY3RfdGltZSBwcmVmaXg9JGV4cGlyZXNkYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlfTwvcD4KICA8L2Rpdj4Ke2lmICRpdGVtY291bnQgPiAwfQo8YnIvPgp7JGdyb3Vwc3RpdGxlfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoIHdpZHRoPSI1JSI+eyRpZHRleHR9PC90aD4KCQkJPHRoPnskbmFtZXRleHR9PC90aD4KCQkJPHRoPnskZGVzY3RleHR9PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1lbnRyeX0KCQk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+CgkJCTx0ZD57JGVudHJ5LT5pZH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+bmFtZX08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZGVzY308L3RkPgoJCQk8dGQ+eyRlbnRyeS0+bWVtYmVyfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbn17JHVzZXJfaWR9eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adduser2.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CntpZiAkY29udHJvbGNvdW50ID4gMH0KICA8Y2VudGVyPgogIDx0YWJsZSB3aWR0aD0iNzUlIj4Ke2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgIDx0ZD57JGNvbnRyb2wtPmhpZGRlbn08Zm9udCBjb2xvcj0ieyRjb250cm9sLT5jb2xvcn0iPnskY29udHJvbC0+cHJvbXB0fXskY29udHJvbC0+bWFya2VyfTwvZm9udD48L3RkPgogICAgPHRkPnskY29udHJvbC0+Y29udHJvbH08L3RkPgogIDwvdHI+CnsvZm9yZWFjaH0KICA8L3RhYmxlPgogIDwvY2VudGVyPgo8YnIvPgp7L2lmfQp7JGhpZGRlbn17JGhpZGRlbjJ9eyRiYWNrfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8dGFibGUgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNTAlIj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgICAgICA8cD48c3Ryb25nPnskaW5mb19taW5wd2xlbn08L3N0cm9uZz48L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9taW5wd2xlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWlucHdsZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbWF4cHdsZW59OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X21heHB3bGVufTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X21pbnVubGVufTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9taW51bmxlbn08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9tYXh1bmxlbn06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWF4dW5sZW59PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICAgICAgPGhyLz4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3Nlc3Npb250aW1lb3V0fTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9zZXNzaW9udGltZW91dH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9zbXRwdmFsaWRhdGV9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3NtdHB2YWxpZGF0ZX0mbmJzcDs8c3Ryb25nPnskaW5mb19zbXRwdmFsaWRhdGV9PC9zdHJvbmc+PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfYWxsb3dfZHVwbGljYXRlX2VtYWlsc306PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYWxsb3dfZHVwbGljYXRlX2VtYWlsc30mbmJzcDs8c3Ryb25nPnskaW5mb19hbGxvd19kdXBsaWNhdGVfZW1haWxzfTwvc3Ryb25nPjwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3JlcXVpcmVvbmVncm91cH06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfcmVxdWlyZW9uZWdyb3VwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2RmbHRncm91cH06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZGZsdGdyb3VwfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3JlcXVpcmVkbWFya2VyfTo8L3A+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/admintasks.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwb3J0fTo8L3A+CiAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9leHBvcnR9PC9wPgo8L2Rpdj4KPGhyLz4KeyRlbmRmb3JtfQo=]]></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[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPjxzdHJvbmc+eyRwcm9tcHRfZmlsdGVyfTo8L3N0cm9uZz48L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij4mbmJzcDs8L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9ncm91cH08L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGZpbHRlcl9ncm91cH08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91c2VyZmlsdGVyfTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3JlZ2V4fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3Byb3BlcnR5ZmlsdGVyc2VsfTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3Byb3BlcnR5c2VsfTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3Byb3BlcnR5ZmlsdGVyfTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3Byb3BlcnR5fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2xpbWl0fTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX2xpbWl0fTwvcD4KPC9kaXY+CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiA8cCBjbGFzcz0icGFnZXRleHQiPjxzdHJvbmc+eyRwcm9tcHRfc29ydH06PC9zdHJvbmc+PC9wPgogPHAgY2xhc3M9InBhZ2VpbnB1dCI+Jm5ic3A7PC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfc29ydGJ5fTwvcD4KIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZmlsdGVyX3NvcnRieX08L3A+CjwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3NlbGVjdH17JGlucHV0X2hpZGRlbn08L3A+PGJyLz4KPC9kaXY+CnskZW5kZm9ybX0KPGhyIHdpZHRoPSI1MCUiIGFsaWduPSJsZWZ0Ii8+CjxkaXYgY2xhc3M9InBhZ2VvcHRpb25zIj4KIDxwPnskbnVtdXNlcnN9Jm5ic3A7eyR1c2Vyc2luZ3JvdXB9PC9wPgogPHA+eyRpdGVtY291bnR9Jm5ic3A7eyR1c2Vyc2ZvdW5kfTwvcD4Ke2lmICRpdGVtY291bnQgPiAwfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoPnskdXNlcm5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGNyZWF0ZWR0ZXh0fTwvdGg+CgkJCTx0aD57JGV4cGlyZXN0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9CgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPgoJCQk8dGQ+eyRlbnRyeS0+dXNlcm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPmNyZWF0ZWR9PC90ZD4KCQkJPHRkPnskZW50cnktPmV4cGlyZXN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+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>
