<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
  <name>Banners</name>
  <version>2.0.6</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgYmFubmVyIG1hbmFnZXMgbnVtZXJvdXMgY2F0ZWdvcmllcyBvZiBiYW5uZXJzLCB0cmFja3MgaGl0cywgaW1wcmVzc2lvbnMsIGFuZCBleHBpcnkgZGF0ZXMsIGFuZCByYW5kb21seSBzZWxlY3RzIGZyb20gYWxsIGF2YWlsYWJsZSBhbmQgdmFsaWQgYmFubmVycyBmb3Igb25lIHRvIGRpc3BsYXk8L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5UbyB1c2UgdGhpcyBtb2R1bGUsIHBsYWNlIHRoZSBtb2R1bGUgY29kZSBpbiBhIHBhZ2Ugb3IgdGVtcGxhdGUgdXNpbmcgdGhlIHNtYXJ0eSB0YWcgJiMxMjM7Y21zX21vZHVsZSBtb2R1bGU9J0Jhbm5lcnMnIGNhdGVnb3J5PSI8Y2F0ZWdvcnk+In08L3A+IAo8cD5Zb3UgbXVzdCBhbHNvIHVwbG9hZCBiYW5uZXJzIHRvIGEgc3VpdGFibGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgdXBsb2FkcyBkaXJlY3RvcnkgYW5kIG11c3QgdXNlIHRoZSBhZG1pbiBwYW5lbCBpbnRlcmZhY2UgdG8gYWRkIGJhbm5lcnMgdG8gdGhlIGRhdGFiYXNlLjwvcAo8aDM+UGFyYW1ldGVyczwvaDM+Cjx1bD4KPGxpPjxlbT4oUkVRVUlSRUQpPC9lbT4gY2F0ZWdvcnk9ImNhdGVnb3J5IiA9IHJhbmRvbWx5IHNlbGVjdCBmcm9tIGFsbCBhdmFpbGFibGUgaW4gdGhpcyBjYXRlZ29yeTwvbGk+CjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5hbWU9Im5hbWUiID0gc2VsZWN0IG9ubHkgdGhlIGJhbm5lciB3aXRoIHRoaXMgbmFtZTwvbGk+CjwvdWw+CjxoND5IaW50PC9oND4KPHA+VGhlIHVwbG9hZHMgbW9kdWxlIGFuZCB0aGUgYmFubmVycyBtb2R1bGUgd29yayB3ZWxsIHRvZ2V0aGVyLiAgWW91IGNhbiBjcmVhdGUgYSAiYmFubmVycyIgY2F0ZWdvcnkgaW4gdGhlIHVwbG9hZHMgbW9kdWxlLCBhbmQgdXBsb2FkIHlvdXIgYmFubmVyIGltYWdlcyB0aGVyZSwgdGhlbiBzcGVjaWZ5ICJiYW5uZXJzLzxmaWxlbmFtZT4iIHdoZW4gYWRkaW5nIGEgYmFubmVyIGluIHRoZSBiYW5uZXJzIG1vZHVsZS48L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=</help>
  <about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtyb2JAdGVjaGNvbS5keW5kbnMub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDIuMC42PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgo8bGk+VmVyc2lvbiAxLjAuIDYgQXVndXN0IDIwMDUuIEluaXRpYWwgUmVsZWFzZS48L2xpPgo8bGk+VmVyc2lvbiAyLjAuIFNlcHRlbWJlciAyMDA1LiBJbml0aWFsIFJlbGVhc2UgZm9yIDAuMS4uPC9saT4KPGxpPlZlcnNpb24gMi4wLjEuIFNlcHRlbWJlciAyMDA1LiBEaXNwbGF5IHNhbXBsZSBiYW5uZXIgaW4gdGhlIGVkaXQgYmFubmVyIHBhZ2UsIGFkZGVkIG5hbWU9IHBhcmFtZXRlciwgYW5kIG1hZGUgc3VibmV0IGV4Y2x1c2lvbnMgd29yay4gIEFsc28gY2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YWJhc2UgdG8gYWxsb3cgZm9yIGFkZGl0aW9uYWwgdGV4dCBpbiB0aGUgbGluayBhbmQgaW1hZ2UgdGFncy48L2xpPgo8bGk+VmVyc2lvbiAyLjAuMi4gU2VwdGVtYmVyIDIwMDUuIEFkZGVkIGludGVncmF0aW9uIHdpdGggdGhlIHVwbG9hZHMgbW9kdWxlICgxLjAuNikgc28gdGhhdCB3ZSBjYW4gZ2V0IGxpdHMgb2YgZmlsZXMgZm9yIGJhbm5lcnMsIGV0Yy4gIFRoZSBiYW5uZXJzIG1vZHVsZSBpcyBzdGlsbCBvcHRpb25hbCB0aG91Z2guPC9saT4KPGxpPlZlcnNpb24gMi4wLjMuIFNlcHRlbWJlciAyMDA1LiBGaXhlZCBhIHZlcnkgbWlub3IgaXNzdWUgd2l0aCBuZXZlciBleHBpcmVzLi48L2xpPgo8bGk+VmVyc2lvbiAyLjAuNC4gU2VwdGVtYmVyIDIwMDUuIEZpeGVkIGEgdmVyeSBtaW5vciBpc3N1ZSB3aXRoIG1vZHVsZSBkZXBlbmRlbmNpZXMsIGFuZCBhIGJpZyBidWcgaW4gdGhlIGRhdGFiYXNlIHNwZWMgaWYgeW91IGRpZCBhIHNjcmF0Y2ggaW5zdGFsbC48L2xpPgo8bGk+VmVyc2lvbiAyLjAuNS4gT2N0b2JlciAyMDA1LiBBZGQgY29tZW50cyBhcm91bmQgdGhlIG91dHB1dDwvbGk+CjxsaT5WZXJzaW9uIDIuMC42LiBEZWNlbWJlciAyMDA1LiBNaW5vciB2YWxpZGF0aW9uIGZpeGVzLCBkZXNjcmlwdGlvbiBpcyBub3cgb3V0cHV0IGJldHdlZW4gdGhlIDxpbWc+YW5kPC9pbWc+IHRhZ3MsIGFuZCBhbiBhbHQgYXR0cmlidXRlIGlzIGluIHRoZSBpbWcgdGFnLjwvbGk+CjwvdWw+PGJyIC8+</about>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/Banners.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEJhbm5lcnMgLSBBIGJhbm5lciBhZG1pbmlzdHJhdGlvbiBtb2R1bGUKIyBWZXJzaW9uOiAyLjAuNiwgQ2FsZ3V5MTAwMAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBCYW5uZXJzIGV4dGVuZHMgQ01TTW9kdWxlCnsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfdGVzdGlwKCRyYW5nZSwkaXApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gbWF0Y2ggYW4gSVAgYWRkcmVzcyBhZ2FpbnN0IGFuIAogICBhZGRyZXNzIHJhbmdlIHNwZWNpZmljYXRpb24uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX3Rlc3RpcCgkcmFuZ2UsJGlwKSAKICB7CiAgICAkcmVzdWx0ID0gMTsKCiAgICAjIElQIFBhdHRlcm4gTWF0Y2hlcgogICAgIyBKLkFkYW1zIDxqbmFAcmV0aW5hLm5ldD4KICAgICMKICAgICMgTWF0Y2hlczoKICAgICMKICAgICMgeHh4Lnh4eC54eHgueHh4ICAgICAgICAoZXhhY3QpCiAgICAjIHh4eC54eHgueHh4Llt5eXktenp6XSAgKHJhbmdlKQogICAgIyB4eHgueHh4Lnh4eC54eHgvbm4gICAgKG5uID0gIyBiaXRzLCBjaXNjbyBzdHlsZSAtLSBpLmUuIC8yNCA9IGNsYXNzIEMpCiAgICAjCiAgICAjIERvZXMgbm90IG1hdGNoOgogICAgIyB4eHgueHh4Lnh4eC54eFt5eXktenp6XSAgKHJhbmdlLCBwYXJ0aWFsIG9jdGV0cyBub3Qgc3VwcG9ydGVkKQoKICAgIGlmIChlcmVnKCIoWzAtOV0rKVwuKFswLTldKylcLihbMC05XSspXC4oWzAtOV0rKS8oWzAtOV0rKSIsJHJhbmdlLCRyZWdzKSkgewoKICAgICAgIyBwZXJmb3JtIGEgbWFzayBtYXRjaAogICAgICAkaXBsID0gaXAybG9uZygkaXApOwogICAgICAkcmFuZ2VsID0gaXAybG9uZygkcmVnc1sxXSAuICIuIiAuICRyZWdzWzJdIC4gIi4iIC4gJHJlZ3NbM10gLiAiLiIgLiAkcmVnc1s0XSk7CiAgICAgIAogICAgICAkbWFza2wgPSAwOwogICAgICAKICAgICAgZm9yICgkaSA9IDA7ICRpPCAzMTsgJGkrKykgewoJaWYgKCRpIDwgJHJlZ3NbNV0tMSkgewoJICAkbWFza2wgPSAkbWFza2wgKyBwb3coMiwoMzAtJGkpKTsKCX0KICAgICAgfQogICAgICAKICAgICAgaWYgKCgkbWFza2wgJiAkcmFuZ2VsKSA9PSAoJG1hc2tsICYgJGlwbCkpIHsKCXJldHVybiAxOwogICAgICB9IGVsc2UgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIAogICAgICAjIHJhbmdlIGJhc2VkCiAgICAgICRtYXNrb2N0cyA9IHNwbGl0KCJcLiIsJHJhbmdlKTsKICAgICAgJGlwb2N0cyA9IHNwbGl0KCJcLiIsJGlwKTsKICAgICAgCiAgICAgICMgcGVyZm9ybSBhIHJhbmdlIG1hdGNoCiAgICAgIGZvciAoJGk9MDsgJGk8NDsgJGkrKykgewoJaWYgKGVyZWcoIlxbKFswLTldKylcLShbMC05XSspXF0iLCRtYXNrb2N0c1skaV0sJHJlZ3MpKSB7CgkgIGlmICggKCRpcG9jdHNbJGldID4gJHJlZ3NbMl0pIHx8ICgkaXBvY3RzWyRpXSA8ICRyZWdzWzFdKSkgewoJICAgICRyZXN1bHQgPSAwOwoJICB9Cgl9CgllbHNlCgkgIHsKCSAgICBpZiAoJG1hc2tvY3RzWyRpXSA8PiAkaXBvY3RzWyRpXSkgewoJICAgICAgJHJlc3VsdCA9IDA7CgkgICAgfQoJICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkFkZEJhbm5lciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgUHJvdmlkZSBhIGZvcm0gdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGEgYmFubmVyIHRvIGEgY2F0ZWdvcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5BZGRCYW5uZXIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCgkcGFyYW1zWydjYXRlZ29yeV9pZCddKSApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3RpdGxlJywgJHRoaXMtPkxhbmcgKCdhZGRiYW5uZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19hZGRiYW5uZXInLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJ1N1Ym1pdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywKCQkJCQkJCSAgICAnQ2FuY2VsJykpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfYmFubmVybmFtZScsCgkJCSAgICR0aGlzLT5MYW5nICgnbmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2Jhbm5lcm5hbWUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9iYW5uZXJuYW1lJywKCQkJCQkJICAgIiIsIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2Jhbm5lcmRlc2MnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfYmFubmVyZGVzYycsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2Jhbm5lcmRlc2MnLAoJCQkJCQkgICAiIiwgODAsIDI1NSkpOwoKICAgIC8vIHdlJ3JlIGdvbm5hIHF1ZXJ5IHRoZSB1cGxvYWRzIG1vZHVsZSAob3B0aW9uYWxseSkgdG8gcHJvdmlkZSBhIGxpc3Qgb2YKICAgIC8vIGJhbm5lcnMsIHJhdGhlciB0aGFuIGhhdmUgdGhlIHVzZXIgdHlwZSBpbiBhIGZpbGUKICAgICRtb2R1bGUgPSAkdGhpcy0+X2dldFVwbG9hZHNNb2R1bGUoKTsKICAgIGlmKCAkbW9kdWxlICkKICAgICAgewoJLy8gdG9kbwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfaW1hZ2UnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2ltYWdlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2UnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9pbWFnZScsCgkJCQkJCSAgICIiLCA1MCwgMjU1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX2ltYWdlJywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbmZvX2ltYWdlJykpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91cmwnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3VybCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3VybCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X3VybCcsCgkJCQkJCSAgICIiLCA1MCwgMjU1KSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2hyZWZfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaHJlZl90ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaHJlZl90ZXh0JywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfaHJlZl90ZXh0JywKCQkJCQkJICAgJycsIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9faHJlZl90ZXh0JywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbmZvX2hyZWZfdGV4dCcpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfaW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaW1hZ2VfdGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2ltYWdlX3RleHQnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9pbWFnZV90ZXh0JywKCQkJCQkJICAgIiIsIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9faW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZV90ZXh0JykpOwoKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfbWF4X2ltcHJlc3Npb25zJywKCQkJICAgJHRoaXMtPkxhbmcgKCdtYXhfaW1wcmVzc2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkJCQkgICAiMCIsIDMsIDUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9fbWF4X2ltcHJlc3Npb25zJywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbmZvX21heF9pbXByZXNzaW9ucycpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfZXhwaXJlcycsCgkJCSAgICR0aGlzLT5MYW5nICgnZXhwaXJlcycpKTsKICAgICRleHBpcmVzZGF0ZSA9IHN0cnRvdGltZSgnKzYgbW9udGhzJywgdGltZSgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlcHJlZml4JywgJGlkLidleHBpcmVzZGF0ZV8nKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlJywgJGV4cGlyZXNkYXRlICk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduZXZlcmV4cGlyZXMnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwnaW5wdXRfbmV2ZXJleHBpcmVzJywwLDEpLiR0aGlzLT5MYW5nKCduZXZlcicpKTsKCiAgICAkbW9kdWxlID0gJHRoaXMtPl9nZXRVcGxvYWRzTW9kdWxlKCk7CiAgICBpZiggJG1vZHVsZSApCiAgICAgIHsKCS8vIGdldCB0aGUgY2F0ZWdvcnkgaW5mbywgYW5kIGZpbmQgdGhlIHVwbG9hZCBjYXRlZ29yeSBpZAoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyAiLgoJICAiV0hFUkUgY2F0ZWdvcnlfaWQgPSA/IjsKCSRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApICk7Cgkkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwoJaWYoIGlzc2V0KCRyb3dbJ3VwbG9hZHNfY2F0ZWdvcnlfaWQnXSkgKSB7CgkgIC8vIG5vdyBnZXQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhhdCBjYXRlZ29yeQoJICAkZmlsZWxpc3QgPSAkbW9kdWxlLT5nZXRGaWxlTGlzdCggJHJvd1sndXBsb2Fkc19jYXRlZ29yeV9pZCddICk7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VwbG9hZF9maWxlJywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF91cGxvYWRfZmlsZScpKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF91cGxvYWRfZmlsZScsCgkJCQkkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfdXBsb2FkX2ZpbGUiLCAkZmlsZWxpc3QsIC0xKSk7Cgl9CiAgICAgIH0KICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdoaWRkZW4nLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigkaWQsJ2lucHV0X2NhdGVnb3J5X2lkJywkcGFyYW1zWydjYXRlZ29yeV9pZCddKSk7CgogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRiYW5uZXIudHBsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluQWRkQ2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFByb3ZpZGUgYSBmb3JtIHRvIGFsbG93IHVzZXJzIHRvIGFkZCBhIGNhdGVnb3J5CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0FkbWluQWRkQ2F0ZWdvcnkoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd0aXRsZScsICR0aGlzLT5MYW5nICgnYWRkY2F0ZWdvcnknKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19hZGRjYXRlZ29yeScsCgkJCQkJCQkgICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAnU3VibWl0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLAoJCQkJCQkJICAgICdDYW5jZWwnKSk7CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeW5hbWUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9jYXRlZ29yeW5hbWUnLAoJCQkJCQkgICAiIiwgMjAsIDgwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfY2F0ZWdvcnlkZXNjJywKCQkJICAgJHRoaXMtPkxhbmcgKCdwcm9tcHRfY2F0ZWdvcnlkZXNjJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJCQkJICAgIiIsIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZXdpZHRoJywKCQkJICAgJHRoaXMtPkxhbmcgKCdwcm9tcHRfaW1hZ2V3aWR0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2ltYWdld2lkdGgnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9pbWFnZXdpZHRoJywKCQkJCQkJICAgIiIsIDMsIDUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZWhlaWdodCcsCgkJCSAgICR0aGlzLT5MYW5nICgncHJvbXB0X2ltYWdlaGVpZ2h0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2VoZWlnaHQnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9pbWFnZWhlaWdodCcsCgkJCQkJCSAgICIiLCAzLCA1KSk7CgogICAgJG1vZHVsZSA9ICR0aGlzLT5fZ2V0VXBsb2Fkc01vZHVsZSgpOwogICAgaWYoICRtb2R1bGUgKQogICAgICB7CiAJJGNhdGVnb3J5bGlzdCA9ICRtb2R1bGUtPmdldENhdGVnb3J5TGlzdCgpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VwbG9hZF9jYXRlZ29yeScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdXBsb2FkX2NhdGVnb3J5JykpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXBsb2FkX2NhdGVnb3J5JywKCQkkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfdXBsb2FkX2NhdGVnb3J5IiwgJGNhdGVnb3J5bGlzdCwgLTEpKTsKICAgICAgfQogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRjYXRlZ29yeS50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5Eb0FkZEJhbm5lcigkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBY3R1YWxseSBwZXJmb3JtIHRoZSB3b3JrIG9mIGFkZGluZyBhIGJhbm5lciB0byB0aGUKICAgZGF0YWJhc2UgYW5kIHRvIHRoZSBmaWxlc3lzdGVtCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0FkbWluRG9BZGRCYW5uZXIgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyBhcmUgd2UgY2FuY2VsbGluZwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICAgIH0KCiAgICAkZXJyb3IgPSBmYWxzZTsKCiAgICAkbW9kdWxlID0gJHRoaXMtPl9nZXRVcGxvYWRzTW9kdWxlKCk7CiAgICAkaW1hZ2UgPSAkcGFyYW1zWydpbnB1dF9pbWFnZSddOwogICAgaWYoICRtb2R1bGUgJiYgdHJpbSgkaW1hZ2UpID09ICcnKQogICAgICB7CgkvLyBoYXZlIHRvIGdldCB0aGUgZmlsZSBuYW1lIGZyb20gCgkvLyB0aGUgdXBsb2FkcyBwdWxsZG93biB0aGluZ3kKCWlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfdXBsb2FkX2ZpbGUnXSApICkKCSAgewoJICAgICRpbWFnZSA9ICRtb2R1bGUtPmdldENhdGVnb3J5UGF0aEZyb21GaWxlSUQoJHBhcmFtc1snaW5wdXRfdXBsb2FkX2ZpbGUnXSk7CgkgICAgJGltYWdlIC49IERJUkVDVE9SWV9TRVBBUkFUT1IuJG1vZHVsZS0+Z2V0RmlsZU5hbWUoJHBhcmFtc1snaW5wdXRfdXBsb2FkX2ZpbGUnXSk7CgkgIH0KICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyB0byB3b3JrIHdpdGgKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2Jhbm5lcm5hbWUnXSkKCXx8ICRwYXJhbXNbJ2lucHV0X2Jhbm5lcm5hbWUnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZW1wdHliYW5uZXJuYW1lIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfdXJsJ10pICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgaWYgKCRpbWFnZSA9PSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZSBpZiggIWlzc2V0KCRwYXJhbXNbJ2lucHV0X25ldmVyZXhwaXJlcyddKSAmJiAhaXNzZXQoJHBhcmFtc1snZXhwaXJlc2RhdGVfTW9udGgnXSkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlIGlmKCAhaXNzZXQoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlfaWQnXSkgKSAKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkvLyBjaGVjayBpZiB0aGUgYmFubmVycyBkb2Vzbid0IGFscmVhZHkgZXhpc3QKCSRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJJHF1ZXJ5ID0KCSAgIlNFTEVDVCAqIGZyb20gIi5jbXNfZGJfcHJlZml4ICgpLgoJICAibW9kdWxlX2Jhbm5lcnMgV0hFUkUgbmFtZSA9ID8iOwoJJGRicmVzdWx0ID0KCSAgJGRiLT5FeGVjdXRlICgkcXVlcnksIGFycmF5ICgkcGFyYW1zWydpbnB1dF9iYW5uZXJuYW1lJ10pKTsKCQoJaWYgKCRkYnJlc3VsdCAmJiAkZGJyZXN1bHQtPkZldGNoUm93ICgpKQoJICB7CgkgICAgLy8geWVwIGl0IGRvZXMKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsCgkJCQkgICAkdGhpcy0+TGFuZyAoImVycm9yX2Jhbm5lcmV4aXN0cyIpKTsKCSAgICAkZXJyb3IgPSB0cnVlOwoJICB9CgllbHNlCgkgIHsKCSAgICAvLyB3ZSdyZSBjbGVhciB0byBhZGQgKHlhaG9vKQoJICAgICRleHBpcmVzID0gc3RydG90aW1lKCcrIDUgeWVhcnMnLCB0aW1lKCkpOwoJICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X25ldmVyZXhwaXJlcyddICkgfHwgJHBhcmFtc1snaW5wdXRfbmV2ZXJleHBpcmVzJ10gPT0gMCApIAoJICAgICAgewoJCSRleHBpcmVzID0gbWt0aW1lKCRwYXJhbXNbJ2V4cGlyZXNkYXRlX0hvdXInXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfTWludXRlJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1NlY29uZCddLAoJCQkJICAkcGFyYW1zWydleHBpcmVzZGF0ZV9Nb250aCddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9EYXknXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfWWVhciddKTsKCSAgICAgIH0KCSAgICAkYmFubmVyaWQgPQoJICAgICAgJGRiLT5HZW5JRCAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX2Jhbm5lcnNfc2VxIik7CgkgICAgJHF1ZXJ5ID0KCSAgICAgICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXggKCkuCgkgICAgICAibW9kdWxlX2Jhbm5lcnMgVkFMVUVTICg/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPykiOwoJICAgICRkYnJlc3VsdCA9CgkgICAgICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJICAgIGFycmF5ICgkYmFubmVyaWQsCgkJCQkgICAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeV9pZCddLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfYmFubmVybmFtZSJdLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfYmFubmVyZGVzYyJdLAoJCQkJICAgJGltYWdlLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfdXJsIl0sCgkJCQkgICAkcGFyYW1zWydpbnB1dF9pbWFnZV90ZXh0J10sCgkJCQkgICAkZGItPkRCVGltZVN0YW1wKHRpbWUoKSksCgkJCQkgICAkZGItPkRCVGltZVN0YW1wKCRleHBpcmVzKSwKCQkJCSAgICRwYXJhbXNbJ2lucHV0X21heF9pbXByZXNzaW9ucyddLAoJCQkJICAgMCwKCQkJCSAgICRwYXJhbXNbJ2lucHV0X2hyZWZfdGV4dCddCgkJCQkgICApKTsKCSAgICBpZiAoISRkYnJlc3VsdCkKCSAgICAgIHsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsCgkJCQkgICAgICAgJHRoaXMtPkxhbmcgKCJlcnJvcl9kYmVycm9yIikpOwoJCSRlcnJvciA9IHRydWU7CgkgICAgICB9CgkgIH0KICAgICAgfQogICAgCiAgICBpZiAoJGVycm9yKQogICAgICB7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRiYW5uZXIudHBsJyk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRG9BZGRDYXRlZ29yeSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBY3R1YWxseSBwZXJmb3JtIHRoZSB3b3JrIG9mIGFkZGluZyBhIGNhdGVnb3J5IHRvIHRoZQogICBkYXRhYmFzZSBhbmQgdG8gdGhlIGZpbGVzeXN0ZW0KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5Eb0FkZENhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICB9CgogICAgJGVycm9yID0gZmFsc2U7CiAgICAKICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyB0byB3b3JrIHdpdGgKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddKQoJfHwgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnluYW1lJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2VtcHR5Y2F0ZWdvcnkiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCS8vIGNoZWNrIGlmIHRoZSBjYXRlZ29yeSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKCSRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJJHF1ZXJ5ID0KCSAgIlNFTEVDVCAqIGZyb20gIi5jbXNfZGJfcHJlZml4ICgpLgoJICAibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyBXSEVSRSBuYW1lID0gPyI7CgkkZGJyZXN1bHQgPQoJICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddKSk7CgkKCS8vIHllcCBpdCBkb2VzCglpZiAoJGRicmVzdWx0LT5GZXRjaFJvdyAoKSkKCSAgewoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywKCQkJCSAgICR0aGlzLT5MYW5nICgiZXJyb3JfY2F0ZWdvcnlleGlzdHMiKSk7CgkgICAgJGVycm9yID0gdHJ1ZTsKCSAgfQoJZWxzZQoJICB7CgkgICAgLy8gd2UncmUgY2xlYXIgdG8gYWRkICh5YWhvbykKCSAgICAkY2F0aWQgPQoJICAgICAgJGRiLT5HZW5JRCAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllc19zZXEiKTsKCSAgICAkcGFyYW1zWydjYXRlZ29yeV9pZCddID0gJGNhdGlkOwoJICAgICRxdWVyeSA9CgkgICAgICAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4ICgpLgoJICAgICAgIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMgVkFMVUVTICg/LD8sPyw/LD8sPykiOwoJICAgICRkYnJlc3VsdCA9CgkgICAgICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJICAgIGFycmF5ICgkY2F0aWQsCgkJCQkgICAkcGFyYW1zWyJpbnB1dF9jYXRlZ29yeW5hbWUiXSwKCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5ZGVzYyJdLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfaW1hZ2V3aWR0aCJdLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfaW1hZ2VoZWlnaHQiXSwKCQkJCSAgICRwYXJhbXNbImlucHV0X3VwbG9hZF9jYXRlZ29yeSJdKSk7CgkgICAgaWYgKCEkZGJyZXN1bHQpCgkgICAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLAoJCQkJICAgICAgICR0aGlzLT5MYW5nICgiZXJyb3JfZGJlcnJvciIpKTsKCQkkZXJyb3IgPSB0cnVlOwoJICAgICAgfQoJICB9CiAgICAgIH0KICAgIAogICAgaWYgKCRlcnJvcikKICAgICAgewoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRGVsZXRlQ2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBGdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGEgZm9ybSB0byBhbGxvdyB0aGUgdXNlciB0byBkZWxldGUKICAgYSBjYXRlZ29yeSBmcm9tIHRoZSBkYXRhYmFzZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5EZWxldGVDYXRlZ29yeSAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gdGVzdCB0byBzZWUgaWYgdGhlcmUgYXJlIHN0aWxsIGl0ZW1zIGxlZnQgaW4gdGhpcyBjYXRlZ29yeSwgaWYgdGhlcmUgYXJlLCB0aGVuIHB1a2UKICAgIC8vIG90aGVyd2lzZSBkZWxldGUgdGhlIGRpcmVjdG9yeSB0b28gKG1heWJlKQogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApICk7CiAgICAkYyA9ICRkYnJlc3VsdC0+UmVjb3JkQ291bnQoKTsKICAgIGlmKCAkZGJyZXN1bHQtPlJlY29yZENvdW50KCkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2NhdGVnb3J5bm90ZW1wdHknKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB3ZSBhcmUgZnJlZSB0byBkZWxldGUgdGhlIGNhdGVnb3J5CiAgICAkcXVlcnkgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/IjsKCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gKSApOwogICAgaWYoICEgJGRicmVzdWx0ICkgewogICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2Vycm9yX2RiZXJyb3InKSk7CiAgICB9CgogICAgJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvRGVsZXRlQmFubmVyKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEFjdHVhbGx5IGRlbGV0ZSBhIGJhbm5lci4KICAgQWxzbyBkZWxldGVzIHRoZSBlbnRyaWVzIGZyb20gdGhlIGhpdHMgZGF0YWJhc2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5Eb0RlbGV0ZUJhbm5lciAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pIHx8ICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2Jhbm5lcl9pZCddKSB8fCAkcGFyYW1zWydiYW5uZXJfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIAogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2hpdHMgV0hFUkUKICAgICAgICBiYW5uZXJfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJHBhcmFtc1snYmFubmVyX2lkJ10gKSApOwoKICAgICRxdWVyeSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMgV0hFUkUKICAgICAgICBjYXRlZ29yeV9pZCA9ID8gQU5EIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddLCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICk7CiAgICBpZiggISRkYnJlc3VsdCApIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgIH0KCiAgICAkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRG9FZGl0QmFubmVyKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEFjdHVhbGx5IGVkaXQgYSBiYW5uZXIgZ2l2ZW4gdGhlIGluZm9ybWF0aW9uIGdpdmVuCiAgIGluIHRoZSBlZGl0IGJhbm5lciBmb3JtLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRWRpdEJhbm5lciAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgICAgewoJJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgICB9CiAgICAKICAgICRtb2R1bGUgPSAkdGhpcy0+X2dldFVwbG9hZHNNb2R1bGUoKTsKICAgICRpbWFnZSA9ICRwYXJhbXNbJ2lucHV0X2ltYWdlJ107CiAgICBpZiggJG1vZHVsZSAmJiB0cmltKCRpbWFnZSkgPT0gJycpCiAgICAgIHsKCS8vIGhhdmUgdG8gZ2V0IHRoZSBmaWxlIG5hbWUgZnJvbSAKCS8vIHRoZSB1cGxvYWRzIHB1bGxkaXduIHRoaW5neQoJJGltYWdlID0gJG1vZHVsZS0+Z2V0Q2F0ZWdvcnlQYXRoRnJvbUZpbGVJRCgkcGFyYW1zWydpbnB1dF91cGxvYWRfZmlsZSddKTsKCSRpbWFnZSAuPSBESVJFQ1RPUllfU0VQQVJBVE9SOwoJJGltYWdlIC49ICRtb2R1bGUtPmdldEZpbGVOYW1lKCRwYXJhbXNbJ2lucHV0X3VwbG9hZF9maWxlJ10pOwogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlfaWQnXSkgfHwgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2Jhbm5lcl9pZCddKSB8fCAkcGFyYW1zWydpbnB1dF9iYW5uZXJfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2Jhbm5lcm5hbWUnXSkKCXx8ICRwYXJhbXNbJ2lucHV0X2Jhbm5lcm5hbWUnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZW1wdHliYW5uZXJuYW1lIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZSBpZiAoJGltYWdlID09ICcnKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X3VybCddKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2luc3VmZmljaWVudHBhcmFtcyIpKTsKCSRlcnJvciA9IHRydWU7CiAgICAgIH0KICAgIGVsc2UgaWYoICFpc3NldCgkcGFyYW1zWydpbnB1dF9uZXZlcmV4cGlyZXMnXSkgJiYgIWlzc2V0KCRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10pICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkZXhwaXJlcyA9IHN0cnRvdGltZSgnKyA1IHllYXJzJywgdGltZSgpKTsKCWlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X25ldmVyZXhwaXJlcyddICkgKQoJICB7CgkgICAgJGV4cGlyZXMgPSBta3RpbWUoJHBhcmFtc1snZXhwaXJlc2RhdGVfSG91ciddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9NaW51dGUnXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfU2Vjb25kJ10sCgkJCSAgICAgICRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX0RheSddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9ZZWFyJ10pOwoJICB9CgoJJHF1ZXJ5ID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMKICAgICAgICAgICAgU0VUIG5hbWUgPSA/LCBkZXNjcmlwdGlvbiA9ID8sIGltYWdlID0gPywgdXJsID0gPywKICAgICAgICAgICAgdGV4dCA9ID8sIGV4cGlyZXMgPSA/LCBtYXhfaW1wcmVzc2lvbnMgPSA/LAogICAgICAgICAgICBocmVmX3RleHQgPSA/IAogICAgICAgICAgICBXSEVSRSBjYXRlZ29yeV9pZCA9ID8gYW5kIGJhbm5lcl9pZCA9ID8iOwoJICAgICRkYnJlc3VsdCA9CgkgICAgICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJICAgIGFycmF5ICggJHBhcmFtc1siaW5wdXRfYmFubmVybmFtZSJdLAoJCQkJICAgICRwYXJhbXNbImlucHV0X2Jhbm5lcmRlc2MiXSwKCQkJCSAgICAkaW1hZ2UsCgkJCQkgICAgJHBhcmFtc1siaW5wdXRfdXJsIl0sCgkJCQkgICAgJHBhcmFtc1snaW5wdXRfaW1hZ2VfdGV4dCddLAoJCQkJICAgICRkYi0+REJUaW1lU3RhbXAoJGV4cGlyZXMpLAoJCQkJICAgICRwYXJhbXNbJ2lucHV0X21heF9pbXByZXNzaW9ucyddLAoJCQkJICAgICRwYXJhbXNbJ2lucHV0X2hyZWZfdGV4dCddLAoJCQkJICAgICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5X2lkJ10sCgkJCQkgICAgJHBhcmFtc1snaW5wdXRfYmFubmVyX2lkJ10KCQkJCSAgICkpOwoJICAgIGlmICghJGRicmVzdWx0KQoJICAgICAgewoJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywKIAkJCQkgICAgICAgJHRoaXMtPkxhbmcgKCJlcnJvcl9kYmVycm9yIikpOwoJCSRlcnJvciA9IHRydWU7CgkgICAgICB9CiAgICAgIH0KCiAgICBpZiAoJGVycm9yKQogICAgICB7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRiYW5uZXIudHBsJyk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRG9FZGl0Q2F0ZWdvcnkoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgQWN0dWFsbHkgZWRpdCBhIGNhdGVnb3J5IGdpdmVuIHRoZSBpbmZvcm1hdGlvbiBnaXZlbgogICBpbiB0aGUgZWRpdCBjYXRlZ29yeSBmb3JtLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRWRpdENhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgICAgewoJJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgICB9CiAgICAKICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWV0aGluZyB0byB3b3JrIHdpdGgKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pIHx8ICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX25vY2F0ZWdvcnlpZCIpKTsKICAgICAgfQogICAgZWxzZSBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSkKCSAgICAgfHwgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnluYW1lJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2VtcHR5Y2F0ZWdvcnkiKSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gbm93IHByZXBhcmUgdG8gdXBkYXRlIHRoZSByZWNvcmQKCSRxdWVyeSA9CgkgICJVUERBVEUgIi5jbXNfZGJfcHJlZml4ICgpLgoJICAibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyBTRVQgbmFtZSA9ID8sIi4KCSAgImRlc2NyaXB0aW9uID0gPywgaW1hZ2Vfd2lkdGggPSA/LCBpbWFnZV9oZWlnaHQgPSA/LCIuCgkgICJ1cGxvYWRzX2NhdGVnb3J5X2lkID0gPyAiLgoJICAiV0hFUkUgY2F0ZWdvcnlfaWQgPSA/IjsKCSRkYnJlc3VsdCA9CgkgICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LAoJCQlhcnJheSAoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnluYW1lJ10sCgkJCSAgICAgICAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeWRlc2MnXSwKCQkJICAgICAgICRwYXJhbXNbJ2lucHV0X2ltYWdld2lkdGgnXSwKCQkJICAgICAgICRwYXJhbXNbJ2lucHV0X2ltYWdlaGVpZ2h0J10sCgkJCSAgICAgICAkcGFyYW1zWydpbnB1dF91cGxvYWRfY2F0ZWdvcnknXSwKCQkJICAgICAgICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKCWlmICghJGRicmVzdWx0KQoJICB7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2RiZXJyb3IiKSk7CgkgIH0KCWVsc2UKCSAgewoJICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgCiAgICAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgiYWRkY2F0ZWdvcnkudHBsIik7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRWRpdEJhbm5lciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgUHJvdmlkZSBhIGZvcm0gdG8gYWxsb3cgdXNlcnMgdG8gZWRpdCBhIGJhbm5lcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkVkaXRCYW5uZXIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCgkcGFyYW1zWydjYXRlZ29yeV9pZCddKSApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQogICAgaWYoICFpc3NldCgkcGFyYW1zWydiYW5uZXJfaWQnXSkgKSAKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGJhbm5lciBpbmZvCiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycwogICAgICAgICBXSEVSRSBjYXRlZ29yeV9pZCA9ID8gQU5EIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddLAoJCQkJCSAgICAgJHBhcmFtc1snYmFubmVyX2lkJ10gKSApOwogICAgaWYoICEkZGJyZXN1bHQgKSAKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICEkcm93ICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3RpdGxlJywgJHRoaXMtPkxhbmcgKCdhZGRiYW5uZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19lZGl0YmFubmVyJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLAoJCQkJCQkJICAgICdTdWJtaXQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJ0NhbmNlbCcpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2Jhbm5lcm5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9iYW5uZXJuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYmFubmVybmFtZScsCgkJCQkJCSAgICRyb3dbJ25hbWUnXSwgMjAsIDgwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfYmFubmVyZGVzYycsCgkJCSAgICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9iYW5uZXJkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYmFubmVyZGVzYycsCgkJCQkJCSAgICRyb3dbJ2Rlc2NyaXB0aW9uJ10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZScsCgkJCSAgICR0aGlzLT5MYW5nICgnaW1hZ2UnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlJywKCQkJCQkJICAgJHJvd1snaW1hZ2UnXSwgNTAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19pbWFnZScsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZScpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfdXJsJywKCQkJICAgJHRoaXMtPkxhbmcgKCd1cmwnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cmwnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF91cmwnLAoJCQkJCQkgICAkcm93Wyd1cmwnXSwgNTAsIDI1NSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ocmVmX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2hyZWZfdGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2hyZWZfdGV4dCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2hyZWZfdGV4dCcsCgkJCQkJCSAgICRyb3dbJ3RleHQnXSwgODAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19ocmVmX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2luZm9faHJlZl90ZXh0JykpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZV90ZXh0JywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbWFnZV90ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlX3RleHQnLAoJCQkJCQkgICAkcm93Wyd0ZXh0J10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9faW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZV90ZXh0JykpOwoKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfaW1wcmVzc2lvbnMnLAoJCQkgICAkdGhpcy0+TGFuZygnaW1wcmVzc2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd2YWx1ZV9pbXByZXNzaW9ucycsCgkJCSAgICRyb3dbJ251bV9pbXByZXNzaW9ucyddICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfbWF4X2ltcHJlc3Npb25zJywKCQkJICAgJHRoaXMtPkxhbmcgKCdtYXhfaW1wcmVzc2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkJCQkgICAkcm93WydtYXhfaW1wcmVzc2lvbnMnXSwgMywgNSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbWFnZScsCgkJCSAgIjxpbWcgYWx0PVwiIi4kcm93WyduYW1lJ10uIlwiIHNyYz1cIiIuIi91cGxvYWRzIi5ESVJFQ1RPUllfU0VQQVJBVE9SLiRyb3dbJ2ltYWdlJ10uIlwiPiIuJHJvd1snZGVzY3JpcHRpb24nXS4iPC9pbWc+Iik7CgkJCQkgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX21heF9pbXByZXNzaW9ucycsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19tYXhfaW1wcmVzc2lvbnMnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2V4cGlyZXMnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2V4cGlyZXMnKSk7CiAgICAkZXhwaXJlc2RhdGUgPSBzdHJ0b3RpbWUoJHJvd1snZXhwaXJlcyddKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlcHJlZml4JywgJGlkLidleHBpcmVzZGF0ZV8nKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlJywgJGV4cGlyZXNkYXRlICk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduZXZlcmV4cGlyZXMnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwnaW5wdXRfbmV2ZXJleHBpcmVzJywwLDEpLiR0aGlzLT5MYW5nKCduZXZlcicpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfYmFubmVyX2lkJywkcGFyYW1zWydiYW5uZXJfaWQnXSkuCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfY2F0ZWdvcnlfaWQnLCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKCiAgICAvLyBub3cgZG8gdGhlIGhpdHMKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19oaXRzIFdIRVJFIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICk7CiAgICAkcm93Y2xhc3MgPSAncm93MSc7CiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpcHRleHQnLCR0aGlzLT5MYW5nKCdpcGFkZHJlc3MnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RhdGV0ZXh0JywkdGhpcy0+TGFuZygnZGF0ZScpKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7Cgkkb25lcm93LT5pcCA9ICRyb3dbJ2lwX2FkZHJlc3MnXTsKCSRvbmVyb3ctPmRhdGUgPSAkcm93Wyd0aW1lJ107CglhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKICAgICAgfQoKICAgICRtb2R1bGUgPSAkdGhpcy0+X2dldFVwbG9hZHNNb2R1bGUoKTsKICAgIGlmKCAkbW9kdWxlICkKICAgICAgewoJLy8gZ2V0IHRoZSBjYXRlZ29yeSBpbmZvLCBhbmQgZmluZCB0aGUgdXBsb2FkIGNhdGVnb3J5IGlkCgkkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzICIuCgkgICJXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKTsKCSRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CglpZiggaXNzZXQoJHJvd1sndXBsb2Fkc19jYXRlZ29yeV9pZCddKSApIHsKCSAgLy8gbm93IGdldCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGF0IGNhdGVnb3J5CgkgICRmaWxlbGlzdCA9ICRtb2R1bGUtPmdldEZpbGVMaXN0KCAkcm93Wyd1cGxvYWRzX2NhdGVnb3J5X2lkJ10gKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXBsb2FkX2ZpbGUnLAoJCQkgICAgICAkdGhpcy0+TGFuZygncHJvbXB0X3VwbG9hZF9maWxlJykpOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VwbG9hZF9maWxlJywKCQkJCSR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duICgkaWQsICJpbnB1dF91cGxvYWRfZmlsZSIsICRmaWxlbGlzdCwgLTEpKTsKCX0KICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbXMnLCRyb3dhcnJheSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1jb3VudCcsIGNvdW50KCRyb3dhcnJheSkpOwoKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnZWRpdGJhbm5lci50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5FZGl0Q2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgdGhlIGZvcm0gZm9yIHRoZSB1c2VyIHRvIGVkaXQKICAgY2F0ZWdvcnkgZGV0YWlscy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5FZGl0Q2F0ZWdvcnkgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3RpdGxlJywgJHRoaXMtPkxhbmcgKCdlZGl0Y2F0ZWdvcnknKSk7CiAgICAKICAgIC8vIGNoZWNrIHRoaW5ncyBvdXQKICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCdlcnJvcl9ub2NhdGVnb3J5JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAxKTsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSBjYXRlZ29yeSBpbmZvIGZyb20gdGhlIGRhdGFiYXNlIChmb3IgdGhpcyBjYXRlZ29yeSkKICAgICRxdWVyeSA9CiAgICAgICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCAoKS4KICAgICAgIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LCBhcnJheSgkcGFyYW1zWydjYXRlZ29yeV9pZCddKSk7CiAgICBpZiAoISRkYnJlc3VsdCkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgMSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRjYXRlZ29yeS50cGwnKTsKCXJldHVybjsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3cgKCk7CiAgICBpZiAoISRyb3cpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoInN0YXJ0Zm9ybSIsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ2RvX2VkaXRjYXRlZ29yeScsICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnc3VibWl0JywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLCAnU3VibWl0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLCAnQ2FuY2VsJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5bmFtZScsICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5bmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5bmFtZScsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5bmFtZScsCgkJCQkJCQkJCSAkcm93WyduYW1lJ10sIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5ZGVzYycsICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5ZGVzYycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5ZGVzYycsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5ZGVzYycsCgkJCQkJCSAgICRyb3dbJ2Rlc2NyaXB0aW9uJ10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZXdpZHRoJywkdGhpcy0+TGFuZyAoJ3Byb21wdF9pbWFnZXdpZHRoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2V3aWR0aCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdld2lkdGgnLCRyb3dbJ2ltYWdlX3dpZHRoJ10sCgkJCQkJCSAgIDMsIDUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZWhlaWdodCcsJHRoaXMtPkxhbmcgKCdwcm9tcHRfaW1hZ2VoZWlnaHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZWhlaWdodCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlaGVpZ2h0Jywkcm93WydpbWFnZV9oZWlnaHQnXSwKCQkJCQkJICAgMywgNSkpOwogICAgJG1vZHVsZSA9ICR0aGlzLT5fZ2V0VXBsb2Fkc01vZHVsZSgpOwogICAgaWYoICRtb2R1bGUgKQogICAgICB7CiAJJGNhdGVnb3J5bGlzdCA9ICRtb2R1bGUtPmdldENhdGVnb3J5TGlzdCgpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VwbG9hZF9jYXRlZ29yeScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdXBsb2FkX2NhdGVnb3J5JykpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXBsb2FkX2NhdGVnb3J5JywKCQkkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfdXBsb2FkX2NhdGVnb3J5IiwgJGNhdGVnb3J5bGlzdCwgLTEpKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2hpZGRlbicsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiAoJGlkLCAnY2F0ZWdvcnlfaWQnLAoJCQkJCQkJICAgICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKICAgIAogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0TmFtZSgpCiAgIG11c3QgcmV0dXJuIHRoZSBleGFjdCBjbGFzcyBuYW1lIG9mIHRoZSBtb2R1bGUuCiAgIElmIHRoZXNlIGRvIG5vdCBtYXRjaCwgYmFkIHRoaW5ncyBoYXBwZW4uCiAgIAogICBUaGlzIGlzIHRoZSBuYW1lIHRoYXQncyBzaG93biBpbiB0aGUgbWFpbiBNb2R1bGVzCiAgIHBhZ2UgaW4gdGhlIEFkbWluLgogICAKICAgSWYgeW91IHdhbnQgdG8gYmUgc2FmZSwgeW91IGNhbiBqdXN0IHJlcGxhY2UgdGhlIGJvZHkKICAgb2YgdGhpcyBmdW5jdGlvbiB3aXRoOgogICByZXR1cm4gZ2V0X2NsYXNzKCR0aGlzKTsgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0TmFtZSgpCiAgewogICAgcmV0dXJuICdCYW5uZXJzJzsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbG9jYWxpemVkIG5hbWUKICAgb2YgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgbmFtZSB0aGF0J3Mgc2hvd24gaW4gdGhlCiAgIEFkbWluIE1lbnVzIGFuZCBzZWN0aW9uIHBhZ2VzIChpZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbgogICBjb21wb25lbnQpLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQogIAoJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0VmVyc2lvbigpCiAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbnVtYmVyIG9yCiAgIHNvbWV0aGluZyB0aGF0IG1ha2VzIHNlbnNlIGZvciBkZXNpZ25hdGluZyBhIHZlcnNpb24uCiAgIFRoZSBDTVMgd2lsbCB1c2UgdGhpcyB0byBpZGVudGlmeSB3aGV0aGVyIG9yIG5vdAogICB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBpcyBjdXJyZW50LCBhbmQKICAgdGhlIG1vZHVsZSB3aWxsIHVzZSBpdCB0byBmaWd1cmUgb3V0IGhvdyB0byB1cGdyYWRlCiAgIGl0c2VsZiBpZiByZXF1ZXN0ZWQuCSAgIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMi4wLjYnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEhlbHAoKQogICBUaGlzIHJldHVybnMgSFRNTCBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kdWxlLgogICBUeXBpY2FsbHksIHlvdSdsbCB3YW50IHRvIGluY2x1ZGUgaW5mb3JtYXRpb24gb24gaG93IHRvCiAgIHVzZSB0aGUgbW9kdWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEhlbHAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwogIH0KICAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBNb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSAiQWJvdXQiIGxpbmsuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yKCkKICB7CiAgICByZXR1cm4gJ2NhbGd1eTEwMDAnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvckVtYWlsKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBNb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSAiQWJvdXQiIGxpbmsuIEl0IGhlbHBzIHVzZXJzCiAgIG9mIHlvdXIgbW9kdWxlIGdldCBpbiB0b3VjaCB3aXRoIHlvdSB0byBzZW5kIGJ1ZyByZXBvcnRzLAogICBxdWVzdGlvbnMsIGNhc2VzIG9mIGJlZXIsIGFuZC9vciBsYXJnZSBzdW1zIG9mIG1vbmV5LgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkKICB7CiAgICByZXR1cm4gJ3JvYkB0ZWNoY29tLmR5bmRucy5vcmcnOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRDaGFuZ2VMb2coKQogICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIG1vZHVsZQogICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlIEFib3V0IGxpbmsuIEl0IGhlbHBzIHVzZXJzCiAgIGZpZ3VyZSBvdXQgd2hhdCdzIGNoYW5nZWQgYmV0d2VlbiByZWxlYXNlcy4KICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgfQogIAogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIElzUGx1Z2luTW9kdWxlKCkKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgb3IgZmFsc2UsIGRlcGVuZGluZyB1cG9uCiAgIHdoZXRoZXIgdXNlcnMgY2FuIGluY2x1ZGUgdGhlIG1vZHVsZSBpbiBhIHBhZ2Ugb3IKICAgdGVtcGxhdGUgdXNpbmcgYSBzbWFydHkgdGFnIG9mIHRoZSBmb3JtCiAgIHtjbXNfbW9kdWxlIG1vZHVsZT0nQmFubmVycycgcGFyYW0xPXZhbCBwYXJhbTI9dmFsLi4ufQogICAKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBub3QgZ2V0IGluY2x1ZGVkIGluIHBhZ2VzIG9yCiAgIHRlbXBsYXRlcywgcmV0dXJuICJmYWxzZSIgaGVyZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQogIAogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uCiAgIHdoZXRoZXIgeW91ciBtb2R1bGUgYWRkcyBhbnl0aGluZyB0byB0aGUgQWRtaW4gYXJlYSBvZgogICB0aGUgc2l0ZS4gRm9yIHRoZSByZXN0IG9mIHRoZXNlIGNvbW1lbnRzLCBJJ2xsIGJlIGNhbGxpbmcKICAgdGhlIGFkbWluIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhlICJBZG1pbiBQYW5lbCIgZm9yCiAgIHdhbnQgb2YgYSBiZXR0ZXIgdGVybS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbigpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQogIAogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIElmIHlvdXIgbW9kdWxlIGhhcyBhbiBBZG1pbiBQYW5lbCwgeW91IGNhbiBzcGVjaWZ5CiAgIHdoaWNoIEFkbWluIFNlY3Rpb24gKG9yIHRvcC1sZXZlbCBBZG1pbiBNZW51KSBpdCBzaG93cwogICB1cCBpbi4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB0byBzcGVjaWZ5IHRoYXQKICAgc2VjdGlvbi4gVmFsaWQgcmV0dXJuIHZhbHVlcyBhcmU6CiAgIAogICBtYWluICAgICAgICAtIHRoZSBNYWluIG1lbnUgdGFiLgogICBjb250ZW50ICAgICAtIHRoZSBDb250ZW50IG1lbnUKICAgbGF5b3V0ICAgICAgLSB0aGUgTGF5b3V0IG1lbnUKICAgdXNlcnNncm91cHMgLSB0aGUgVXNlcnMgYW5kIEdyb3VwcyBtZW51CiAgIGV4dGVuc2lvbnMgIC0gdGhlIEV4dGVuc2lvbnMgbWVudSAodGhpcyBpcyB0aGUgZGVmYXVsdCkKICAgc2l0ZWFkbWluICAgLSB0aGUgU2l0ZSBBZG1pbiBtZW51CiAgIHZpZXdzaXRlICAgIC0gdGhlIFZpZXcgU2l0ZSBtZW51IHRhYgogICBsb2dvdXQgICAgICAtIHRoZSBMb2dvdXQgbWVudSB0YWIKICAgCiAgIE5vdGUgdGhhdCBpZiB5b3UgcGxhY2UgeW91ciBtb2R1bGUgaW4gdGhlIG1haW4sCiAgIHZpZXdzaXRlLCBvciBsb2dvdXQgc2VjdGlvbnMsIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUKICAgbWVudXMsIGJ1dCB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIGFueSB0b3AtbGV2ZWwKICAgc2VjdGlvbiBwYWdlcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKQogIHsKICAgIHJldHVybiAnY29udGVudCc7CiAgfQogIAogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluRGVzY3JpcHRpb24oKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gaGF2ZSBpdCByZXR1cm4gYSBkZXNjcmlwdGlvbiBzdHJpbmcgdGhhdCBnZXRzIHNob3duCiAgIGluIHRoZSBBZG1pbiBTZWN0aW9uIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gY29udHJvbCB3aGV0aGVyIG9yIG5vdCBpdCdzIGRpc3BsYXllZCBieSB0aGUgYm9vbGVhbgogICB0aGF0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkCiAgIHRvIGhpZGUgbW9kdWxlcyBmcm9tIGFkbWlucyB3aG8gbGFjayBwZXJtaXNzaW9uIHRvIHVzZQogICB0aGVtLgogICBJbiB0aGlzIGNhc2UsIHRoZSBtb2R1bGUgd2lsbCBvbmx5IGJlIHZpc2libGUgdG8gYWRtaW5zCiAgIHdobyBoYXZlICJNYW5hZ2UgQmFubmVycyIgcGVybWlzc2lvbnMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIEJhbm5lcnMnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldERlcGVuZGVuY2llcygpCiAgIFlvdXIgbW9kdWxlIG1heSBuZWVkIGFub3RoZXIgbW9kdWxlIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkCiAgIGJlZm9yZSB5b3UgY2FuIGluc3RhbGwgaXQuCiAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHRob3NlIGRlcGVuZGVuY2llcyBhbmQKICAgbWluaW11bSB2ZXJzaW9uIG51bWJlcnMgdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KCSAgIAogICBJdCBzaG91bGQgcmV0dXJuIGFuIGhhc2gsIGVnLgogICByZXR1cm4gYXJyYXkoJ3NvbWVtb2R1bGUnPT4nMS4wJywgJ290aGVybW9kdWxlJz0+JzEuMScpOwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAgewogICAgcmV0dXJuIGFycmF5KCk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbCgpCiAgIFdoZW4geW91ciBtb2R1bGUgaXMgaW5zdGFsbGVkLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZQogICBzZXR1cC4gVHlwaWNhbCB0aGluZ3MgdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIGNyZWF0aW9uCiAgIGFuZCBwcmVwb3B1bGF0aW9uIG9mIGRhdGFiYXNlIHRhYmxlcywgZGF0YWJhc2Ugc2VxdWVuY2VzLAogICBwZXJtaXNzaW9ucywgcHJlZmVyZW5jZXMsIGV0Yy4KCSAgIAogICBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIEJhbm5lcnMgZGF0YWJhc2UgdGFibGUgYW5kCiAgIHNlcXVlbmNlLCBpdCBjcmVhdGVzIHRoZSAiTWFuYWdlIEJhbm5lcnMiIHBlcm1pc3Npb24sCiAgIGFuZCBzZXRzIHRoZSAiU2luZyBMb3VkbHkiIHByZWZlcmVuY2UuCgkgICAKICAgVGhlIGRhdGFiYXNlIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIHRoaXMgZXhhbXBsZTsKICAgY2hlY2sgYW55IG9uZSBvZiB0aGUgb3RoZXIgbW9kdWxlcyBpZiB5b3Ugd2FudCB0byBzZWUKICAgbWV0aG9kIGNvZGUgdGhhdCB1c2VzIHRoZSBkYXRhYmFzZS4KCSAgIAogICBGb3IgaW5mb3JtYXRpb24gb24gdGhlIGNyZWF0aW9uIG9mIGRhdGFiYXNlIHRhYmxlcywKICAgY2hlY2sgb3V0IHRoZSBBRE9EQiBEYXRhIERpY3Rpb25hcnkgcGFnZSBhdAogICBodHRwOi8vcGhwbGVucy5jb20vbGVucy9hZG9kYi9kb2NzLWRhdGFkaWN0Lmh0bQoJICAgCiAgIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhICJmYWxzZSIgaW4gY2FzZSBvZiBhbnkgZXJyb3IsCiAgIGFuZCBDTVMgd2lsbCBub3QgY29uc2lkZXIgdGhlIG1vZHVsZSBpbnN0YWxsZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbCgpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkgIAogICAgLy8gbXlzcWwtc3BlY2lmaWMsIGJ1dCBpZ25vcmVkIGJ5IG90aGVyIGRhdGFiYXNlCiAgICAkdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwoJICAKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKCSAgCiAgICAvLyB0YWJsZSBzY2hlbWEgZGVzY3JpcHRpb24KICAgIC8vIGlmIHVybCBhbmQgaW1hZ2UgYXJlIE5VTEwsIHRleHQgY2Fubm90IGJlLgogICAgJGZsZHMgPSAiCiAgICAgICAgICAgICAgICAgICBiYW5uZXJfaWQgSSBLRVksCiAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9pZCBJIE5PVE5VTEwsCiAgICAgICAgICAgICAgICAgICBuYW1lIEMoODApIE5PVE5VTEwsCiAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBDKDI1NSksCiAgICAgICAgICAgICAgICAgICBpbWFnZSAgQygyNTUpLCAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgdXJsICAgIEMoMjU1KSwKICAgICAgICAgICAgICAgICAgIHRleHQgICBYLCAKICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgVCBOT1ROVUxMLAogICAgICAgICAgICAgICAgICAgZXhwaXJlcyBULAogICAgICAgICAgICAgICAgICAgbWF4X2ltcHJlc3Npb25zIEk0LAogICAgICAgICAgICAgICAgICAgbnVtX2ltcHJlc3Npb25zIEk0IERFRkFVTFQgMCBOT1ROVUxMLAogICAgICAgICAgICAgICAgICAgaHJlZl90ZXh0IEMoMjU1KSAKCQkiOwoJICAKICAgIC8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4KICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkpOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJICAKICAgIC8vIGNyZWF0ZSBhIHNlcXVlbmNlIGZvciB0aGlzIHRhYmxlCiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfc2VxIik7CgogICAgLy8gY3JlYXRlIGEgdGFibGUgZm9yIHRoZSBjYXRlZ29yaWVzCiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgIGNhdGVnb3J5X2lkICBJIEtFWSwKICAgICAgICAgICAgIG5hbWUgICAgICAgICBDKDgwKSBOT1ROVUxMLAogICAgICAgICAgICAgZGVzY3JpcHRpb24gIEMoMjU1KSwKICAgICAgICAgICAgIGltYWdlX3dpZHRoICBJLAogICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0IEksCgkgICAgIHVwbG9hZHNfY2F0ZWdvcnlfaWQgSQogICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiAgICAvLyBhbmQgYSBzZXF1ZW5jZSBmb3IgdGhpcyBvbmUgdG9vCiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllc19zZXEiKTsKCSAgCiAgICAvLyBhbmQgYSB0YWJsZSBzbyB3ZSBjYW4ga2VlcCB0cmFjayBvZiBoaXRzL2NsaWNrdGhydXMKICAgICRmbGRzID0gIgogICAgICAgICAgICAgICAgICAgYmFubmVyX2lkICBJIEtFWSwKICAgICAgICAgICAgICAgICAgIHRpbWUgICAgICAgVCBLRVksCiAgICAgICAgICAgICAgICAgICBpcF9hZGRyZXNzIEMoMTYpIE5PVE5VTEwgS0VZCiAgICAgICAgICAgICAgICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19oaXRzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkpOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKICAgIC8vIGNyZWF0ZSBhIHBlcm1pc3Npb24KICAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2UgQmFubmVycycsICdNYW5hZ2UgQmFubmVycycpOwoKICAgIC8vIGFuZCBzb21lIHByZWZlcmVuY2VzCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic3VibmV0X2V4Y2x1c2lvbnMiLCAiIik7CgogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwogIH0KCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogICBBZnRlciBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKICAgc3RyaW5nIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkLgoJICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogICBBZnRlciByZW1vdmluZyBhIG1vZHVsZSwgdGhlcmUgbWF5IGJlIHRoaW5ncyB5b3Ugd2FudCB0bwogICBjb21tdW5pY2F0ZSB0byB5b3VyIGFkbWluLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYQogICBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQuCgkgICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVXBncmFkZSgpCiAgIElmIHlvdXIgbW9kdWxlIHZlcnNpb24gbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSB2ZXJzaW9uCiAgIG51bWJlciBvZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSwgdGhlIENNUyBBZG1pbiB3aWxsIGdpdmUKICAgeW91IGEgY2hhbmNlIHRvIHVwZ3JhZGUgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgZnVuY3Rpb24KICAgdGhhdCBhY3R1YWxseSBoYW5kbGVzIHRoZSB1cGdyYWRlLgogICBJZGVhbGx5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgdXBncmFkZXMgaW5jcmVtZW50YWxseSwKICAgc28geW91IGNvdWxkIHVwZ3JhZGUgZnJvbSB2ZXJzaW9uIDAuMC4xIHRvIDEwLjUuNyB3aXRoCiAgIGEgc2luZ2xlIGNhbGwuIEZvciBhIGdyZWF0IGV4YW1wbGUgb2YgdGhpcywgc2VlIHRoZSBOZXdzCiAgIG1vZHVsZSBpbiB0aGUgc3RhbmRhcmQgQ01TIGluc3RhbGwuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pCiAgewogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwogICAgc3dpdGNoKCRjdXJyZW50X3ZlcnNpb24pCiAgICAgIHsKICAgICAgY2FzZSAiMS4wIjoKCS8vIGRvbid0IGRvIGFueXRoaW5nLi4uIHdlIGNhbid0IHVwZ3JhZGUgdGhpcwoJYnJlYWs7CiAgICAgIGNhc2UgIjIuMCI6CgkvLyB3ZSBuZWVkIHRvIGFkZCBhIGNvbHVtbiB0byB0aGUgYmFubmVycyB0YWJsZQoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7Cgkkc3FsYXJyYXkgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMiLCAiaHJlZl90ZXh0IEMoMjU1KSIpOwoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJJGN1cnJlbnRfdmVyc2lvbiA9ICIyLjAuMSI7CglicmVhazsKICAgICAgY2FzZSAiMi4wLjEiOgogICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGEgY29sdW1uIHRvIHRoZSBjYXRlZ29yaWVzIHRhYmxlCgkkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKCSRzcWxhcnJheSA9ICRkaWN0LT5BZGRDb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzIiwgInVwbG9hZHNfY2F0ZWdvcnlfaWQgSSIpOwoJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJYnJlYWs7CiAgICAgIH0KCSAgCiAgICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAKCQkgICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwogIH0KCQoJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsKCkKICAgU29tZXRpbWVzLCBhbiBleGNlcHRpb25hbGx5IHVuZW5saWdodGVuZWQgb3IgaWdub3JhbnQKICAgYWRtaW4gd2lsbCB3aXNoIHRvIHVuaW5zdGFsbCB5b3VyIG1vZHVsZS4gV2hpbGUgaXQKICAgd291bGQgYmUgYmVzdCB0byBsYXkgaW50byB0aGVzZSBpZGlvdHMgd2l0aCBhIGNsdWVzdGljaywKICAgd2Ugd2lsbCBkbyB0aGUgbWFnbmFuaW1vdXMgdGhpbmcgYW5kIHJlbW92ZSB0aGUgbW9kdWxlCiAgIGFuZCBjbGVhbiB1cCB0aGUgZGF0YWJhc2UsIHBlcm1pc3Npb25zLCBhbmQgcHJlZmVyZW5jZXMKICAgdGhhdCBhcmUgc3BlY2lmaWMgdG8gaXQuCiAgIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGVyZSB3ZSBkbyB0aGlzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVuaW5zdGFsbCgpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkgIAogICAgLy8gcmVtb3ZlIHRoZSBkYXRhYmFzZSB0YWJsZQogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19oaXRzIiApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJICAKICAgIC8vIHJlbW92ZSB0aGUgc2VxdWVuY2UKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9jb25zdWx0YW50X3NlcSIgKTsKCSAgCiAgICAvLyByZW1vdmUgdGhlIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignTWFuYWdlIEJhbm5lcnMnKTsKCiAgICAvLyBhbmQgdGhlIHByZWZlcmVuY2VzCiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSAoInN1Ym5ldF9leGNsdXNpb25zIik7CgkgIAogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGlmIHlvdXIgbW9kdWxlCiAgIGlzIGEgcGx1Zy1pbiB0eXBlIG1vZHVsZS4KCSAgIAogICBJbiBnZW5lcmFsLCB5b3UnbGwgd2FudCB0byBjYWxsIHZhcmlvdXMgZGlmZmVyZW50CiAgIG1ldGhvZHMsIGRlcGVuZGluZyB1cG9uIHRoZSByZXF1ZXN0ZWQgImFjdGlvbi4iCgkgICAKICAgVGhlcmUgYXJlIHR3byBidWlsdC1pbiBhY3Rpb25zOiAiZGVmYXVsdCIgd2hpY2ggZ2V0cwogICBjYWxsZWQgaWYgdGhlIG1vZHVsZSBpcyBhY2Nlc3NlZCBmcm9tIGEgcGFnZSBvciB0ZW1wbGF0ZSwKICAgYW5kICJkZWZhdWx0YWRtaW4iIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gdGhlIEFkbWluCiAgIHBhbmVsLgoJICAgCiAgIFRoZSBBY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhIGRpZmZlcmVudAogICBhY3Rpb24gZWl0aGVyIGluIHlvdXIgdGFnLCBlLmcuLAogICB7Y21zX21vZHVsZSBtb2R1bGU9J0Jhbm5lcnMnIGFjdGlvbj0nc29tZXRoaW5nJ30KICAgb3IgYnkgcGFzc2luZyBpdCBpbiBhIGxpbmsgY3JlYXRlIGJ5IHRoZSBDcmVhdGVMaW5rCiAgIG1ldGhvZC4gTW9yZSBvbiB0aGF0IGNhbiBiZSBzZWVuIGJlbG93IGluIHRoZQogICBEaXNwbGF5QWRtaW5OYXYgbWV0aG9kLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybl9pZD0tMSkKICB7CiAgICBzd2l0Y2ggKCRhY3Rpb24pCiAgICAgIHsKICAgICAgY2FzZSAnYWRkYmFubmVyJzoKCXsKCSAgaWYoICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkFkZEJhbm5lciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnYWRkY2F0ZWdvcnknOgoJewoJICBpZiggJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluQWRkQ2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RlZmF1bHQnOgoJewoJICAvLyB0aGlzIGlzIHRoZSBwbHVnLWluIHNpZGUsIGkuZS4sIG5vbi1BZG1pbgoJICAkdGhpcy0+X0Rpc3BsYXlNb2R1bGVPdXRwdXQoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RlZmF1bHRhZG1pbic6Cgl7CgkgIC8vIG9ubHkgbGV0IHBlb3BsZSBhY2Nlc3MgbW9kdWxlIHByZWZlcmVuY2VzIGlmIHRoZXkgaGF2ZSBwZXJtaXNzaW9uCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkZWxldGVjYXRlZ29yeSc6Cgl7CgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRGVsZXRlQ2F0ZWdvcnkgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZG9fYWRkYmFubmVyJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5Eb0FkZEJhbm5lciAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb19hZGRjYXRlZ29yeSc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRG9BZGRDYXRlZ29yeSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb19kZWxldGViYW5uZXInOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRGVsZXRlQmFubmVyICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RvX2VkaXRiYW5uZXInOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRWRpdEJhbm5lciAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb19lZGl0Y2F0ZWdvcnknOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRWRpdENhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2VkaXRiYW5uZXInOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkVkaXRCYW5uZXIgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZWRpdGNhdGVnb3J5JzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5FZGl0Q2F0ZWdvcnkgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnbGluayc6Cgl7CgkgICR0aGlzLT5fRG9MaW5rQWN0aW9uKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQgKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ3NhdmVfYWRtaW5fcHJlZnMnOgoJewoJICAkdGhpcy0+X0RvU2F2ZUFkbWluUHJlZnMoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApOwoJICBicmVhazsKCX0KICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5TW9kdWxlT3V0cHV0KCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgbWV0aG9kIHRvIGRpc3BsYXkKICAgc29tZXRoaW5nIHdoZXJlIGEgcGFnZSBvciB0ZW1wbGF0ZSBoYXMgYSB0YWcgY2FsbGluZwogICB0aGlzIG1vZHVsZS4KCSAgIAogICBOb3RlIHRoYXQgaXQgdXNlcyBhIHRlbXBsYXRlLCBhbmQgaXMgdGh1cyB2ZXJ5IHBvd2VyZnVsLAogICBldmVuIGlmIGl0J3Mgc2ltcGxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5TW9kdWxlT3V0cHV0KCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCiAgICAvLyB0ZXN0IGlmIHdlIGFyZSBleGNsdWRpbmcgdGhpcyBJUCBmcm9tIHRoZSBjb3VudGluZwogICAgJGV4Y2x1ZGUgPSAwOwogICAgJHN1Ym5ldHMgPSBzcGxpdCgiLCIsJHRoaXMtPkdldFByZWZlcmVuY2UoInN1Ym5ldF9leGNsdXNpb25zIikpOwogICAgJHRlc3QgPSAwOwogICAgZm9yZWFjaCgkc3VibmV0cyBhcyAkc3VibmV0KQogICAgewogICAgICAkdGVzdCA9ICR0aGlzLT5fdGVzdGlwKCAkc3VibmV0LCBnZXRlbnYoIlJFTU9URV9BRERSIiApICk7CiAgICAgIGlmKCAkdGVzdCApCgl7CgkgIC8vIGRvbid0IGFsbG93IGFueSBtb3JlIHByb2Nlc3NpbmcKCSAgJGV4Y2x1ZGUgPSAxOwoJfQogICAgfQogICAgCgogICAgLy8gdGVzdCBpZiB3ZSBhcmUgZXhjbHVkaW5nIHRoZSBSRU1PVEVfQUREUiBmcm9tIHN0YXRpc3RpY3MgZ2F0aGVyaW5nCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydjYXRlZ29yeSddICkgKSAKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgJGNhdGVnb3J5X2lkPS0xOwogICAgJGNhdGVnb3J5PSIiOwogICAgewogICAgICAvLyBsb29rdXAgdGhlIGNhdGVnb3J5IG5hbWUgYW5kIGdldCB0aGUgaWQKICAgICAgJHEyID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMgV0hFUkUgCiAgICAgICAgICAgbmFtZSA9ID8iOwogICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxMiwgYXJyYXkoICRwYXJhbXNbJ2NhdGVnb3J5J10gKSApOwogICAgICBpZiggISRkYnJlc3VsdCApIAoJewoJICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CgkgIHJldHVybjsKCX0KICAgICAgJGNhdGVnb3J5ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICBpZiggISRjYXRlZ29yeSApIAoJewoJICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CgkgIHJldHVybjsKCX0KICAgICAgJGNhdGVnb3J5X2lkID0gJGNhdGVnb3J5WydjYXRlZ29yeV9pZCddOwogICAgfQoKICAgICRmcm9tID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzIFdIRVJFIChjYXRlZ29yeV9pZCA9IFwiJGNhdGVnb3J5X2lkXCIpIEFORCI7CiAgICAkd2hlcmUgLj0gIihleHBpcmVzID4gXCIiLiRkYi0+REJUaW1lU3RhbXAodGltZSgpKS4iXCIpCiAgICAgICBBTkQgKG1heF9pbXByZXNzaW9ucyA9IDAgT1IgbnVtX2ltcHJlc3Npb25zIDwgbWF4X2ltcHJlc3Npb25zKSI7CiAgICAkb3JkZXIgPSAiT1JERVIgQlkgUkFORCgpIExJTUlUIDAsMSI7CgogICAgLy8gZG8gd2Ugd2FudCBhIHNwZWNpZmljIGJhbm5lcgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWyduYW1lJ10gKSApCiAgICAgIHsKCSR3aGVyZSAuPSAiQU5EIE5BTUUgPSBcIiIuJHBhcmFtc1snbmFtZSddLiJcIiI7CiAgICAgIH0KCiAgICAkcXVlcnkgPSAkZnJvbSAuICIgIiAuICR3aGVyZSAuICIgIiAuICRvcmRlcjsKCiAgICAkZGJyZXN1bHQgPSAkZGItPnF1ZXJ5KCAkcXVlcnkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CglyZXR1cm47CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRyb3cgKSAKICAgICAgewoJLy8gcXVlcnkgd29ya2VkLCBidXQgbm8gcmVzdWx0cywgbm93IHdoYXQgZG8gd2UgZG8KCS8vIGZvciBkZWJ1ZyBwdXJwb3NlcywgcmV0dXJuIGFuIGVycm9yCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcgKCdlcnJvcl9ub3Jlc3VsdHMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBpbWFnZSx1cmwgb3IgdGV4dCBtYXkgYmUgc2V0IGhlcmUuCiAgICAvLyBnb3R0YSBmaWd1cmUgb3V0IHdoaWNoCiAgICBlY2hvICc8IS0tIEJlZ2luIEJhbm5lciBPdXRwdXQgLS0+JzsKICAgICR0eHQgPSAiIjsKICAgIGlmKCBpc3NldCggJHJvd1snaW1hZ2UnXSApICYmIGlzc2V0KCAkcm93Wyd1cmwnXSApICkgCiAgICAgIHsKCSRpbWFnZSA9ICI8aW1nIHNyYz1cIiIuInVwbG9hZHMiLkRJUkVDVE9SWV9TRVBBUkFUT1IuJHJvd1snaW1hZ2UnXS4iXCIiOwogICAgICAgIGlmKCAkY2F0ZWdvcnlbJ2ltYWdlX3dpZHRoJ10gKQoJICB7CgkgICAgJGltYWdlIC49ICIgd2lkdGg9XCIiLiRjYXRlZ29yeVsnaW1hZ2Vfd2lkdGgnXS4iXCIgIjsKCSAgfQogICAgICAgIGlmKCAkY2F0ZWdvcnlbJ2ltYWdlX2hlaWdodCddICkKCSAgewoJICAgICRpbWFnZSAuPSAiIGhlaWdodD1cIiIuJGNhdGVnb3J5WydpbWFnZV9oZWlnaHQnXS4iXCIgIjsKCSAgfQoJaWYoICRyb3dbJ3RleHQnXSApCgkgIHsKCSAgICAkaW1hZ2UgLj0gJHJvd1sndGV4dCddOwoJICB9CgkkaW1hZ2UgLj0gIj4iOwoJZWNobyAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdsaW5rJywgJHJldHVybmlkLCAkaW1hZ2UsCgkJCSAgICAgICBhcnJheSgnYmFubmVyX2lkJz0+JHJvd1snYmFubmVyX2lkJ10sCgkJCQkgICAgICdjYXRlZ29yeV9pZCc9PiRjYXRlZ29yeV9pZCksCgkJCSAgICAgICAnJywgZmFsc2UsIGZhbHNlLCAkcm93WydocmVmX3RleHQnXSk7CiAgICAgICAgZWNobyAnPCEtLSBFbmQgQmFubmVyIE91dHB1dCAtLT4nOwogICAgfQogICAgCiAgICAvLyB1cGRhdGUgdGhlIGV4cHJlc3Npb25zCiAgICBpZiggJGV4Y2x1ZGUgPT0gMCApIHsKICAgICAgJGltcHJlc3Npb25zID0gJHJvd1sibnVtX2ltcHJlc3Npb25zIl0gKyAxOwogICAgICAkcXVlcnkgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBTRVQgbnVtX2ltcHJlc3Npb25zID0gJGltcHJlc3Npb25zIFdIRVJFIGJhbm5lcl9pZD0iLiRyb3dbImJhbm5lcl9pZCJdOyAKICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsgCiAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gZGlzcGxheQogICBlcnJvciBpbmZvcm1hdGlvbiBvbiB0aGUgYWRtaW4gc2lkZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3InKSk7CiAgICBpZiAoJG1lc3NhZ2UgIT0gJycpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICRtZXNzYWdlKTsKICAgICAgfQogICAgICAKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gcHJlc2VudCBhbiBBZG1pbgogICBwYW5lbC4KCSAgIAogICBJdCBzZXRzIHNtYXJ0eSB0YWcgdmFsdWVzLCBhbmQgdGhlbiBjYWxscyB0aGUKICAgY29kZSBuZWNlc3NhcnkgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZS4gICAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZT0nJykKICB7CiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignYmFubmVycycsICR0aGlzLT5MYW5nKCdiYW5uZXJzJykpOwogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyICgnY2F0ZWdvcmllcycsICR0aGlzLT5MYW5nICgnY2F0ZWdvcmllcycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciAoJ3ByZWZlcmVuY2VzJywgJHRoaXMtPkxhbmcoJ3ByZWZlcmVuY2VzJykpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwogICAgICAKICAgIC8vIHRoZSBiYW5uZXJzIHRhYgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Jhbm5lcnMnKTsKICAgICR0aGlzLT5fRGlzcGxheUJhbm5lcnNUYWIoJGlkLCAkcGFyYW1zLCRyZXR1cm5pZCk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICAvLyB0aGUgY2F0ZWdvcmllcyB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdjYXRlZ29yaWVzJyk7CiAgICAkdGhpcy0+X0Rpc3BsYXlDYXRlZ29yaWVzVGFiKCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIC8vIHRoZSBwcmVmZXJlbmNlcyB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcmVmZXJlbmNlcycpOwogICAgJHRoaXMtPl9EaXNwbGF5UHJlZnNUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgLy8gZG9uZSB0YWJzCiAgICBlY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7CiAgICByZXR1cm47CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlCYW5uZXJzVGFiKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0Rpc3BsYXlCYW5uZXJzVGFiKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKCiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY2F0ZWdvcnkgZm9yIHRoZSBmaWx0ZXIKICAgICRjdXJjYXRlZ29yeSA9IAogICAgICAoaXNzZXQoJHBhcmFtc1snY3VyY2F0ZWdvcnknXSkgPyAkcGFyYW1zWydjdXJjYXRlZ29yeSddIDogJycpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdGNhdGVnb3J5J10pICkKICAgICAgewoJJGN1cmNhdGVnb3J5ID0KCSAgKGlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeSddKSA/ICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5J10gOgoJICAgJycpOwogICAgICB9CgogICAgLy8gZ2V0IGEgY2F0ZWdvcnkgbGlzdCBmb3IgdGhlIGZpbHRlcgogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkY2F0ZWdvcnlsaXN0ID0gYXJyYXkoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzCiAgICAgICAgICBPUkRFUiBCWSBuYW1lIEFTQyI7CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKCiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywxKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl9ub2NhdGVnb3JpZXMnKSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQoJICB7CgkgICAgaWYoICRjdXJjYXRlZ29yeSA9PSAnJyApCgkgICAgICB7CgkJJGN1cmNhdGVnb3J5ID0gJHJvd1snY2F0ZWdvcnlfaWQnXTsKCSAgICAgIH0KCSAgICAkY2F0ZWdvcnlsaXN0WyRyb3dbJ25hbWUnXV0gPSAkcm93WydjYXRlZ29yeV9pZCddOwoJICB9CgoJLy8gc2V0dXAgdGhlIGZvcm0gcGFydCBvZiB0aGUgdGVtcGxhdGUKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N0YXJ0Zm9ybScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdkZWZhdWx0YWRtaW4nKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYXRlZ29yeScsICR0aGlzLT5MYW5nICgnY2F0ZWdvcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfY2F0ZWdvcnkiLCAkY2F0ZWdvcnlsaXN0LCAtMSwKCQkJCQkJCSAgICRjdXJjYXRlZ29yeSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfc2VsZWN0JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0Y2F0ZWdvcnknLAoJCQkJCQkJICR0aGlzLT5MYW5nKCdzZWxlY3RjYXRlZ29yeScpKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9oaWRkZW4nLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuICgkaWQsICdjdXJjYXRlZ29yeScsCgkJCQkJCQkgJGN1cmNhdGVnb3J5KSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKCWlmKCAkY3VyY2F0ZWdvcnkgIT0gJycgKSAKCSAgewoJICAgIC8vIGZpbGwgaW4gdGhlIGJhbm5lcnMgcGFydCBvZiB0aGUgcmVwb3J0CgkgICAgJGRicmVzdWx0ID0gJyc7CgkgICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKCSAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgY3JlYXRlZCI7CgkgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCRjdXJjYXRlZ29yeSkpOwoKCSAgICAkcm93Y2xhc3MgPSAncm93MSc7CgkgICAgaWYoICEgJGRicmVzdWx0ICkKCSAgICAgIHsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywxKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfYmFubmVycycpKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCR0aGlzLT5MYW5nKCdpZCcpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ25hbWV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZScpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Rlc2N0ZXh0JywkdGhpcy0+TGFuZygnZGVzY3JpcHRpb24nKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjcmVhdGVkdGV4dCcsJHRoaXMtPkxhbmcoJ2NyZWF0ZWQnKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBpcmVzdGV4dCcsJHRoaXMtPkxhbmcoJ2V4cGlyZXMnKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbXByZXNzaW9uc3RleHQnLCR0aGlzLT5MYW5nKCdpbXByZXNzaW9ucycpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpdHN0ZXh0JywkdGhpcy0+TGFuZygnaGl0cycpKTsKCQl3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCgkJICB7CgkJICAgICRvbmVyb3cgPSBuZXcgc3RkQ2xhc3MoKTsKCiAgICAgICAgICAgICAgICAgICAgJHEzID0gIlNFTEVDVCBDT1VOVChiYW5uZXJfaWQpIEFTIGNvdW50IEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2hpdHMKICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGJhbm5lcl9pZCA9ID8iOwogICAgICAgICAgICAgICAgICAgICRkYnJlc3VsdDIgPSAkZGItPkV4ZWN1dGUoICRxMywgYXJyYXkoICRyb3dbJ2Jhbm5lcl9pZCddICkgKTsKCQkgICAgaWYoICRkYnJlc3VsdDIgKSB7CgkJICAgICAgJHIyID0gJGRicmVzdWx0Mi0+RmV0Y2hSb3coKTsKCQkgICAgICBpZiggJHIyICkgewoJCSAgICAgICAgJG9uZXJvdy0+aGl0cyA9ICRyMlsnY291bnQnXTsKICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoKCQkgICAgJG9uZXJvdy0+aWQgPSAkcm93WydiYW5uZXJfaWQnXTsKCQkgICAgJG9uZXJvdy0+bmFtZSA9ICRyb3dbJ25hbWUnXTsKCQkgICAgJG9uZXJvdy0+ZGVzY3JpcHRpb24gPSAkcm93WydkZXNjcmlwdGlvbiddOwoJCSAgICAkb25lcm93LT5jcmVhdGVkID0gJHJvd1snY3JlYXRlZCddOwoJCSAgICAkb25lcm93LT5leHBpcmVzID0gJHJvd1snZXhwaXJlcyddOwoJCSAgICAkb25lcm93LT5pbXByZXNzaW9ucyA9ICRyb3dbJ251bV9pbXByZXNzaW9ucyddOwoJCSAgICAkb25lcm93LT5tYXhfaW1wcmVzc2lvbnMgPSAoJHJvd1snbWF4X2ltcHJlc3Npb25zJ10gPT0gJycpID8gMCA6ICRyb3dbJ21heF9pbXByZXNzaW9ucyddOwoJCSAgICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCQkgICAgCgkJICAgICRvbmVyb3ctPmVkaXRsaW5rID0KCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdGJhbm5lcicsICRyZXR1cm5pZCwKCQkJCQkgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsCgkJCQkJCQkJCQkgICAgICAkdGhpcy0+TGFuZyAoJ2VkaXQnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkJCSBhcnJheSAoJ2Jhbm5lcl9pZCcgPT4gJHJvd1snYmFubmVyX2lkJ10sCgkJCQkJCSdjYXRlZ29yeV9pZCcgPT4gJGN1cmNhdGVnb3J5KSk7CgkJICAgIAoJCSAgICAkb25lcm93LT5kZWxldGVsaW5rID0gCgkJICAgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwnZG9fZGVsZXRlYmFubmVyJywkcmV0dXJuaWQsCgkJCQkJICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCQkgICAgICAkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkJIGFycmF5ICgnYmFubmVyX2lkJyA9PiAkcm93WydiYW5uZXJfaWQnXSwKCQkJCQkJJ2NhdGVnb3J5X2lkJyA9PiAkY3VyY2F0ZWdvcnkpLAoJCQkJCSAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmUnKSk7CgkJICAgIAoJCSAgICBhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJCSAgICAoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CgkJICAgIAoJCSAgfSAvLyB3aGlsZQoJICAgICAgfSAvLyBpZgoKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywkcm93YXJyYXkpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbWNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CgkgIH0gLy8gaWYKICAgICAgfSAvLyBlbHNlCgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnYWRkbGluaycsCgkJCQkgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdhZGRiYW5uZXInLAoJCQkJCQkgICAgICRyZXR1cm5pZCwKCQkJCQkJICAgICAkdGhpcy0+TGFuZyAoJ2FkZGJhbm5lcicpLAoJCQkJCQkgICAgIGFycmF5ICgnY2F0ZWdvcnlfaWQnID0+ICRjdXJjYXRlZ29yeSksICcnLCBmYWxzZSwKCQkJCQkJICAgICBmYWxzZSwKCQkJCQkJICAgICAnY2xhc3M9InBhZ2VvcHRpb25zIicpKTsKICAgIAogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdiYW5uZXJsaXN0LnRwbCcpOwogICAgcmV0dXJuOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5Q2F0ZWdvcmllc1RhYigkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5Q2F0ZWdvcmllc1RhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRyb3dhcnJheSA9IGFycmF5KCk7CiAgICAkZGJyZXN1bHQgPSAnJzsKICAgIAogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKCiAgICBnbG9iYWwgJGdDbXM7CgogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7Cgkkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7Cgkkb25lcm93LT5pZCA9ICRyb3dbJ2NhdGVnb3J5X2lkJ107Cgkkb25lcm93LT5uYW1lID0gJHJvd1snbmFtZSddOwoJJG9uZXJvdy0+ZGVzY3JpcHRpb24gPSAkcm93WydkZXNjcmlwdGlvbiddOwoJJG9uZXJvdy0+d2lkdGggPSAkcm93WydpbWFnZV93aWR0aCddOwoJJG9uZXJvdy0+aGVpZ2h0ID0gJHJvd1snaW1hZ2VfaGVpZ2h0J107Cgkkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCgkkb25lcm93LT5lZGl0bGluayA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2VkaXRjYXRlZ29yeScsICRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkgICAgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ2NhdGVnb3J5X2lkJyA9PiAkcm93WydjYXRlZ29yeV9pZCddKSk7Cgkkb25lcm93LT5kZWxldGVsaW5rID0KCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZGVsZXRlY2F0ZWdvcnknLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSAoJ2ljb25zL3N5c3RlbS9kZWxldGUuZ2lmJywKCQkJCQkgICAgICR0aGlzLT5MYW5nICgnZGVsZXRlJyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJICAgICAgIGFycmF5ICgnY2F0ZWdvcnlfaWQnID0+ICRyb3dbJ2NhdGVnb3J5X2lkJ10pLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdhcmV5b3VzdXJlJykpOwoKCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0KCgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYXRlZ29yeXRleHQnLCAkdGhpcy0+TGFuZyAoJ2NhdGVnb3J5JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCduYW1ldGV4dCcsICR0aGlzLT5MYW5nICgnbmFtZScpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZGVzY3RleHQnLCAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd3aWR0aHRleHQnLCAkdGhpcy0+TGFuZyAoJ3dpZHRoJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdoZWlnaHR0ZXh0JywgJHRoaXMtPkxhbmcgKCdoZWlnaHQnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2l0ZW1zJywgJHJvd2FycmF5KTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaXRlbWNvdW50JywgY291bnQgKCRyb3dhcnJheSkpOwoKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnYWRkbGluaycsCgkJCQkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2FkZGNhdGVnb3J5JywKCQkJCQkJICAgICAgICRyZXR1cm5pZCwKCQkJCQkJICAgICAgICR0aGlzLT4KCQkJCQkJICAgICAgIExhbmcgKCdhZGRjYXRlZ29yeScpLAoJCQkJCQkgICAgICAgYXJyYXkgKCksICcnLCBmYWxzZSwKCQkJCQkJICAgICAgIGZhbHNlLAoJCQkJCQkgICAgICAgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKSk7CgogICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdjYXRlZ29yeWxpc3QudHBsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlQcmVmc1RhYigkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5UHJlZnNUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnc3RhcnRmb3JtJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAnc2F2ZV9hZG1pbl9wcmVmcycsCgkJCQkJCQkgICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsgICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOyAgICAKICAgICAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9zdWJuZXRfZXhjbHVzaW9ucycsCgkJCQkgICR0aGlzLT5MYW5nKCdwcm9tcHRfc3VibmV0X2V4Y2x1c2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3N1Ym5ldF9leGNsdXNpb25zJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnc3VibmV0X2V4Y2x1c2lvbnMnLAoJCQkJCQkgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc3VibmV0X2V4Y2x1c2lvbnMnLCIiKSw1MCwyNTUpKTsKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZG1pbnByZWZzLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9Eb0xpbmtBY3Rpb24oJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgZG9lcyB0aGUgYWN0dWFsIHVwZGF0aW5nIGFuZCBmb3J3YXJkaW5nIHRvIHRoZSAKICAgcmVxdWVzdGVkIHBhZ2UuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0RvTGlua0FjdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKQogICAgICB7CiAgICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgZWxzZSBpZiggIWlzc2V0KCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICkKICAgICAgewogICAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGRldGFpbHMgYWJvdXQgdGhpcyBiYW5uZXIKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBXSEVSRSAKICAgICAgICBjYXRlZ29yeV9pZCA9ID8gQU5EIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddLAoJCQkJCSAgICAgJHBhcmFtc1snYmFubmVyX2lkJ10gKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CiAgICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICRiYW5uZXIgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRiYW5uZXIgKSAKICAgICAgewogICAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgLy8gYWRkIHRoZSBoaXQKICAgIC8vIHRlc3QgaWYgd2UgYXJlIGV4Y2x1ZGluZyB0aGlzIElQIGZyb20gdGhlIGNvdW50aW5nCiAgICAkZXhjbHVkZSA9IDA7CiAgICAkc3VibmV0cyA9IHNwbGl0KCIsIiwkdGhpcy0+R2V0UHJlZmVyZW5jZSgic3VibmV0X2V4Y2x1c2lvbiIpKTsKICAgICR0ZXN0ID0gMDsKICAgIGZvcmVhY2goJHN1Ym5ldHMgYXMgJHN1Ym5ldCkKICAgIHsKICAgICAgJHRlc3QgPSAkdGhpcy0+X3Rlc3RpcCggJHN1Ym5ldCwgZ2V0ZW52KCJSRU1PVEVfQUREUiIgKSApOwogICAgICBpZiggJHRlc3QgKQoJewoJICAvLyBkb24ndCBhbGxvdyBhbnkgbW9yZSBwcm9jZXNzaW5nCgkgICRleGNsdWRlID0gMTsKCX0KICAgIH0KICAgIAogICAgaWYoICRleGNsdWRlID09IDAgKQogICAgICB7CgkkcXVlcnkgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2hpdHMgdmFsdWVzICg/LD8sPykiOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydiYW5uZXJfaWQnXSwKCQkJCQkJICRkYi0+REJUaW1lU3RhbXAodGltZSgpKSwKCQkJCQkJIGdldGVudignUkVNT1RFX0FEZFInKSApICk7CiAgICAgIH0KCiAgICAvLyByZWRpcmVjdCB0byB0byB0aGUgZGVzdGluYXRpb24KICAgIHJlZGlyZWN0KCAkYmFubmVyWyd1cmwnXSApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9Eb1NhdmVBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBTYXZlIHRoZSBhZG1pbidzIHByZWZlcmVuY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0RvU2F2ZUFkbWluUHJlZnMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICAgIH0KCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSAoJ3N1Ym5ldF9leGNsdXNpb25zJywKCQkJICBpc3NldCAoJHBhcmFtc1snc3VibmV0X2V4Y2x1c2lvbnMnXSkgPwoJCQkgICRwYXJhbXNbJ3N1Ym5ldF9leGNsdXNpb25zJ10gOiAnMCcpOwogICAgLy8kdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9HZXRVc2VySURNb2R1bGUoKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgR2V0IHRoZSB1c2VyIGlkIG1vZHVsZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9nZXRVcGxvYWRzTW9kdWxlKCkKICB7CiAgICAkbW9kdWxlID0gJHRoaXMtPmdldE1vZHVsZUluc3RhbmNlKCJVcGxvYWRzIik7CiAgICBpZiggJG1vZHVsZSApCiAgICAgIHsKCSR2ZXIgPSAkbW9kdWxlLT5HZXRWZXJzaW9uKCk7CglpZiggdmVyc2lvbl9jb21wYXJlKCAiMS4wLjYiLCAkdmVyICkgKQoJICB7CgkgICAgcmV0dXJuICRtb2R1bGU7CgkgIH0KICAgICAgfQogICAgcmV0dXJuOwogIH0KCn0gLy8gZW5kIG9mIGNsYXNzCgo/Pgo=]]></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[PD9waHAKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLic7CiRsYW5nWydhZGRiYW5uZXInXSA9ICdBZGQgQmFubmVyJzsKJGxhbmdbJ2FkZGNhdGVnb3J5J10gPSAnQWRkIENhdGVnb3J5JzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICdBcmUgWW91IFN1cmU/JzsKJGxhbmdbJ2Jhbm5lcnMnXSA9ICdCYW5uZXJzJzsKJGxhbmdbJ2NhbmNlbCddID0gJ0NhbmNlbCc7CiRsYW5nWydjYXRlZ29yaWVzJ10gPSAnQ2F0ZWdvcmllcyc7CiRsYW5nWydjYXRlZ29yeSddID0gJ0NhdGVnb3J5JzsKJGxhbmdbJ2NyZWF0ZWQnXSA9ICdDcmVhdGVkJzsKJGxhbmdbJ2RhdGUnXSA9ICdEYXRlJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ0RlbGV0ZSc7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsKJGxhbmdbJ2VkaXRjYXRlZ29yeSddID0gJ0VkaXQgQ2F0ZWdvcnknOwokbGFuZ1snZXJyb3InXSA9ICdFcnJvciEnOwokbGFuZ1snZXJyb3JfYmFuZXJleGlzdHMnXSA9ICdCYW5uZXIgd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMnOwokbGFuZ1snZXJyb3JfY2F0ZWdvcnlub3RlbXB0eSddID0gJ0Vycm9yOiBDYXRlZ29yeSBOb3QgRW1wdHkhJzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdFcnJvcjogRGF0YWJhc2UgRXJyb3IhJzsKJGxhbmdbJ2Vycm9yX2VtcHR5YmFubmVybmFtZSddID0gJ0Vycm9yOiBFbXB0eSBiYW5uZXIgbmFtZSEnOwokbGFuZ1snZXJyb3JfZW1wdHljYXRlZ29yeSddID0gJ0Vycm9yOiBFbXB0eSBDYXRlZ29yeSEnOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnRXJyb3I6IEluc3VmZmljaWVudCBJbnB1dCc7CiRsYW5nWydlcnJvcl9ub3Jlc3VsdHMnXSA9ICdObyBiYW5uZXJzIG1hdGNoZWQgdGhlIHF1ZXJ5JzsKJGxhbmdbJ2Vycm9yX3RleHRvcmltYWdlJ10gPSAnU3BlY2lmeSBVUkwgYW5kIElNQUdFIG9yIFRFWFQsIG5vdCBib3RoJzsKJGxhbmdbJ2V4cGlyZXMnXSA9ICdFeHBpcmVzJzsKJGxhbmdbJ2V4cGlyZXMnXSA9ICdFeHBpcmVzJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01hbmFnZSBCYW5uZXJzJzsKJGxhbmdbJ2hlaWdodCddID0gJ0hlaWdodCc7CiRsYW5nWydoaXRzJ10gPSAnSGl0cyc7CiRsYW5nWydocmVmX3RleHQnXSA9ICdMaW5rIFRleHQnOwokbGFuZ1snaWQnXSA9ICdJRCc7CiRsYW5nWydpbWFnZSddID0gJ0ltYWdlJzsKJGxhbmdbJ2ltYWdlX3RleHQnXSA9ICdJbWFnZSBUZXh0JzsKJGxhbmdbJ2ltcHJlc3Npb25zJ10gPSAnSW1wcmVzc2lvbnMnOwokbGFuZ1snaW5mb19ocmVmX3RleHQnXSA9ICdBZGRpdGlvbmFsIHRleHQgZm9yIHRoZSBsaW5rIHRhZyc7CiRsYW5nWydpbmZvX2ltYWdlJ10gPSAnU3BlY2lmeSBhIGZpbGUgcmVsYXRpdmUgdG8geW91ciB1cGxvYWRzIGRpcmVjdG9yeSc7CiRsYW5nWydpbmZvX2ltYWdlX3RleHQnXSA9ICdBZGRpdGlvbmFsIHRleHQgZm9yIHRoZSBpbWFnZSB0YWcnOwokbGFuZ1snaW5mb19tYXhfaGl0cyddID0gJ1VzZSAwIGZvciB1bmxpbWl0ZWQgaGl0cyc7CiRsYW5nWydpbmZvX21heF9pbXByZXNzaW9ucyddID0gJ1VzZSAwIGZvciB1bmxpbWl0ZWQgaW1wcmVzc2lvbnMnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydpcGFkZHJlc3MnXSA9ICdJUCBBZGRyZXNzJzsKJGxhbmdbJ21heF9oaXRzJ10gPSAnTWF4aW11bSBIaXRzJzsKJGxhbmdbJ21heF9pbXByZXNzaW9ucyddID0gJ01heGltdW0gSW1wcmVzc2lvbnMnOwokbGFuZ1snbmFtZSddID0gJ05hbWUnOwokbGFuZ1snbmV2ZXInXSA9ICdOZXZlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1Bvc3QgSW5zdGFsbCBNZXNzYWdlLCBlLmcuLCBCZSBzdXJlIHRvIHNldCAiTWFuYWdlIEJhbm5lcnMiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEnOyAgCiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSwgZS5nLiwgIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sncHJlZmVyZW5jZXMnXSA9ICdQcmVmZXJlbmNlcyc7CiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1sncHJvbXB0X2NhdGVnb3J5ZGVzYyddID0gJ0NhdGVnb3J5IERlc2NyaXB0aW9uJzsKJGxhbmdbJ3Byb21wdF9jYXRlZ29yeW5hbWUnXSA9ICdDYXRlZ29yeSBOYW1lJzsKJGxhbmdbJ3Byb21wdF9pbWFnZWhlaWdodCddID0gJ0ltYWdlIEhlaWdodCc7CiRsYW5nWydwcm9tcHRfaW1hZ2V3aWR0aCddID0gJ0ltYWdlIFdpZHRoJzsKJGxhbmdbJ3Byb21wdF9zdWJuZXRfZXhjbHVzaW9ucyddID0gJ0V4Y2x1ZGUgdGhlc2Ugc3VibmV0cyBmcm9tIGFueSBzdGF0aXN0aWNzIGdhdGhlcmluZyc7CiRsYW5nWydwcm9tcHRfdXBsb2FkX2NhdGVnb3J5J10gPSAnQ2F0ZWdvcnkgKFVwbG9hZHMgTW9kdWxlKSc7CiRsYW5nWydwcm9tcHRfdXBsb2FkX2ZpbGUnXSA9ICdJbWFnZSAoVXBsb2FkcyBNb2R1bGUpJzsKJGxhbmdbJ3NlbGVjdGNhdGVnb3J5J10gPSAnU2VsZWN0IENhdGVnb3J5JzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWyd0ZXh0J10gPSAnVGV4dCc7CiRsYW5nWyd0aXRsZV9tb2RfYWRtaW4nXSA9ICdNb2R1bGUgQWRtaW4gUGFuZWwnOwokbGFuZ1sndGl0bGVfbW9kX3ByZWZzJ10gPSAnTW9kdWxlIFByZWZlcmVuY2VzJzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWyd1cGdyYWRlZCddID0gJ01vZHVsZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWyd1cmwnXSA9ICdVUkwnOwokbGFuZ1snd2lkdGgnXSA9ICdXaWR0aCc7CiRsYW5nWyd0aXRsZV9hZG1pbl9wYW5lbCddID0gJ0Jhbm5lcnMgTW9kdWxlJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBtb2R1bGUgdG8gbWFuYWdlIHJvdGF0aW5nIGJhbm5lcnMnOwokbGFuZ1snd2VsY29tZV90ZXh0J10gPSAnPHA+V2VsY29tZSB0byB0aGUgQmFubmVyIE1hbmFnZW1lbnQgTW9kdWxlIGFkbWluIHNlY3Rpb24uIFNvbWV0aGluZyBlbHNlIHdvdWxkIHByb2JhYmx5IGdvIGhlcmUgaWYgdGhlIG1vZHVsZSBhY3R1YWxseSBkaWQgc29tZXRoaW5nLjwvcD4nOyAKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4KPGxpPlZlcnNpb24gMS4wLiA2IEF1Z3VzdCAyMDA1LiBJbml0aWFsIFJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMi4wLiBTZXB0ZW1iZXIgMjAwNS4gSW5pdGlhbCBSZWxlYXNlIGZvciAwLjEuLjwvbGk+CjxsaT5WZXJzaW9uIDIuMC4xLiBTZXB0ZW1iZXIgMjAwNS4gRGlzcGxheSBzYW1wbGUgYmFubmVyIGluIHRoZSBlZGl0IGJhbm5lciBwYWdlLCBhZGRlZCBuYW1lPSBwYXJhbWV0ZXIsIGFuZCBtYWRlIHN1Ym5ldCBleGNsdXNpb25zIHdvcmsuICBBbHNvIGNoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIHRvIGFsbG93IGZvciBhZGRpdGlvbmFsIHRleHQgaW4gdGhlIGxpbmsgYW5kIGltYWdlIHRhZ3MuPC9saT4KPGxpPlZlcnNpb24gMi4wLjIuIFNlcHRlbWJlciAyMDA1LiBBZGRlZCBpbnRlZ3JhdGlvbiB3aXRoIHRoZSB1cGxvYWRzIG1vZHVsZSAoMS4wLjYpIHNvIHRoYXQgd2UgY2FuIGdldCBsaXRzIG9mIGZpbGVzIGZvciBiYW5uZXJzLCBldGMuICBUaGUgYmFubmVycyBtb2R1bGUgaXMgc3RpbGwgb3B0aW9uYWwgdGhvdWdoLjwvbGk+CjxsaT5WZXJzaW9uIDIuMC4zLiBTZXB0ZW1iZXIgMjAwNS4gRml4ZWQgYSB2ZXJ5IG1pbm9yIGlzc3VlIHdpdGggbmV2ZXIgZXhwaXJlcy4uPC9saT4KPGxpPlZlcnNpb24gMi4wLjQuIFNlcHRlbWJlciAyMDA1LiBGaXhlZCBhIHZlcnkgbWlub3IgaXNzdWUgd2l0aCBtb2R1bGUgZGVwZW5kZW5jaWVzLCBhbmQgYSBiaWcgYnVnIGluIHRoZSBkYXRhYmFzZSBzcGVjIGlmIHlvdSBkaWQgYSBzY3JhdGNoIGluc3RhbGwuPC9saT4KPGxpPlZlcnNpb24gMi4wLjUuIE9jdG9iZXIgMjAwNS4gQWRkIGNvbWVudHMgYXJvdW5kIHRoZSBvdXRwdXQ8L2xpPgo8bGk+VmVyc2lvbiAyLjAuNi4gRGVjZW1iZXIgMjAwNS4gTWlub3IgdmFsaWRhdGlvbiBmaXhlcywgZGVzY3JpcHRpb24gaXMgbm93IG91dHB1dCBiZXR3ZWVuIHRoZSA8aW1nPmFuZDwvaW1nPiB0YWdzLCBhbmQgYW4gYWx0IGF0dHJpYnV0ZSBpcyBpbiB0aGUgaW1nIHRhZy48L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgYmFubmVyIG1hbmFnZXMgbnVtZXJvdXMgY2F0ZWdvcmllcyBvZiBiYW5uZXJzLCB0cmFja3MgaGl0cywgaW1wcmVzc2lvbnMsIGFuZCBleHBpcnkgZGF0ZXMsIGFuZCByYW5kb21seSBzZWxlY3RzIGZyb20gYWxsIGF2YWlsYWJsZSBhbmQgdmFsaWQgYmFubmVycyBmb3Igb25lIHRvIGRpc3BsYXk8L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5UbyB1c2UgdGhpcyBtb2R1bGUsIHBsYWNlIHRoZSBtb2R1bGUgY29kZSBpbiBhIHBhZ2Ugb3IgdGVtcGxhdGUgdXNpbmcgdGhlIHNtYXJ0eSB0YWcgJiMxMjM7Y21zX21vZHVsZSBtb2R1bGU9XCdCYW5uZXJzXCcgY2F0ZWdvcnk9IjxjYXRlZ29yeT4ifTwvcD4gCjxwPllvdSBtdXN0IGFsc28gdXBsb2FkIGJhbm5lcnMgdG8gYSBzdWl0YWJsZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSB1cGxvYWRzIGRpcmVjdG9yeSBhbmQgbXVzdCB1c2UgdGhlIGFkbWluIHBhbmVsIGludGVyZmFjZSB0byBhZGQgYmFubmVycyB0byB0aGUgZGF0YWJhc2UuPC9wCjxoMz5QYXJhbWV0ZXJzPC9oMz4KPHVsPgo8bGk+PGVtPihSRVFVSVJFRCk8L2VtPiBjYXRlZ29yeT0iY2F0ZWdvcnkiID0gcmFuZG9tbHkgc2VsZWN0IGZyb20gYWxsIGF2YWlsYWJsZSBpbiB0aGlzIGNhdGVnb3J5PC9saT4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbmFtZT0ibmFtZSIgPSBzZWxlY3Qgb25seSB0aGUgYmFubmVyIHdpdGggdGhpcyBuYW1lPC9saT4KPC91bD4KPGg0PkhpbnQ8L2g0Pgo8cD5UaGUgdXBsb2FkcyBtb2R1bGUgYW5kIHRoZSBiYW5uZXJzIG1vZHVsZSB3b3JrIHdlbGwgdG9nZXRoZXIuICBZb3UgY2FuIGNyZWF0ZSBhICJiYW5uZXJzIiBjYXRlZ29yeSBpbiB0aGUgdXBsb2FkcyBtb2R1bGUsIGFuZCB1cGxvYWQgeW91ciBiYW5uZXIgaW1hZ2VzIHRoZXJlLCB0aGVuIHNwZWNpZnkgImJhbm5lcnMvPGZpbGVuYW1lPiIgd2hlbiBhZGRpbmcgYSBiYW5uZXIgaW4gdGhlIGJhbm5lcnMgbW9kdWxlLjwvcD4nOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/addbanner.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2Jhbm5lcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iYW5uZXJuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iYW5uZXJkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYmFubmVyZGVzY308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2V9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZX0mbmJzcDt7JGluZm9faW1hZ2V9PC9wPgogIDwvZGl2Pgp7aWYgJGlucHV0X3VwbG9hZF9maWxlfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9maWxlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdXBsb2FkX2ZpbGV9PC9wPgogIDwvZGl2Pgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VybH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VybH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaHJlZl90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaHJlZl90ZXh0fSZuYnNwO3skaW5mb19ocmVmdF90ZXh0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbWFnZV90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW1hZ2VfdGV4dH0mbmJzcDt7JGluZm9faW1hZ2VfdGV4dH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbWF4X2ltcHJlc3Npb25zfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWF4X2ltcHJlc3Npb25zfSZuYnNwO3skaW5mb19tYXhfaW1wcmVzc2lvbnN9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2V4cGlyZXN9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+e2h0bWxfc2VsZWN0X2RhdGUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZSBzdGFydF95ZWFyPTIwMDAgZW5kX3llYXI9MjAxMH0ge2h0bWxfc2VsZWN0X3RpbWUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JG5ldmVyZXhwaXJlc308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19CnsvaWZ9Cg==]]></data>
  </file>
  <file>
    <filename>/templates/addcategory.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2NhdGVnb3J5bmFtZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NhdGVnb3J5bmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfY2F0ZWdvcnlkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2F0ZWdvcnlkZXNjfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbWFnZXdpZHRofTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW1hZ2V3aWR0aH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2VoZWlnaHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZWhlaWdodH08L3A+CiAgPC9kaXY+CntpZiAkaW5wdXRfdXBsb2FkX2NhdGVnb3J5fQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9jYXRlZ29yeX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VwbG9hZF9jYXRlZ29yeX08L3A+CiAgPC9kaXY+CnsvaWZ9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19CnsvaWZ9Cg==]]></data>
  </file>
  <file>
    <filename>/templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3N1Ym5ldF9leGNsdXNpb25zfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9zdWJuZXRfZXhjbHVzaW9uc308L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jcmVhdGVwYXRofTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JHN1Ym1pdH17JGNhbmNlbH08L3A+Cgk8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>/templates/bannerlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRpdGVtY291bnR9IEJhbm5lcnMgRm91bmQ8L3A+PC9kaXY+Cnskc3RhcnRmb3JtfQogPHA+eyRjYXRlZ29yeX0mbmJzcDt7JGlucHV0X2NhdGVnb3J5fXskaW5wdXRfc2VsZWN0fXskaW5wdXRfaGlkZGVufTwvcD4KeyRlbmRmb3JtfQp7aWYgJGl0ZW1jb3VudCA+IDB9Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGggd2lkdGg9IjUlIj57JGlkdGV4dH08L3RoPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRkZXNjdGV4dH08L3RoPgoJCQk8dGg+eyRjcmVhdGVkdGV4dH08L3RoPgoJCQk8dGg+eyRleHBpcmVzdGV4dH08L3RoPgoJCQk8dGg+eyRpbXByZXNzaW9uc3RleHR9PC90aD4KCQkJPHRoPnskaGl0c3RleHR9PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1lbnRyeX0KCQk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+CgkJCTx0ZD57JGVudHJ5LT5pZH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+bmFtZX08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZGVzY3JpcHRpb259PC90ZD4KCQkJPHRkPnskZW50cnktPmNyZWF0ZWR9PC90ZD4KCQkJPHRkPnskZW50cnktPmV4cGlyZXN9PC90ZD4KCQkJPHRkPnskZW50cnktPmltcHJlc3Npb25zfS97JGVudHJ5LT5tYXhfaW1wcmVzc2lvbnN9PC90ZD4KCQkJPHRkPnskZW50cnktPmhpdHN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4KCSAKey9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRhZGRsaW5rfTwvcD48L2Rpdj4K]]></data>
  </file>
  <file>
    <filename>/templates/categorylist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRpdGVtY291bnR9IENhdGVnb3JpZXMgRm91bmQ8L3A+PC9kaXY+CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskY2F0ZWdvcnl0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCB3aWR0aD0iNSUiPnskd2lkdGh0ZXh0fTwvdGg+CgkJCTx0aCB3aWR0aD0iNSUiPnskaGVpZ2h0dGV4dH08L3RoPgoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPmlkfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5uYW1lfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZXNjcmlwdGlvbn08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+d2lkdGh9PC90ZD4KCQkJPHRkPnskZW50cnktPmhlaWdodH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZWRpdGxpbmt9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlbGV0ZWxpbmt9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQo8ZGl2IGNsYXNzPSJwYWdlb3B0aW9ucyI+PHAgY2xhc3M9InBhZ2VvcHRpb25zIj57JGFkZGxpbmt9PC9wPjwvZGl2Pgo=]]></data>
  </file>
  <file>
    <filename>/templates/editbanner.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2Jhbm5lcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iYW5uZXJuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iYW5uZXJkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYmFubmVyZGVzY308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2V9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZX0mbmJzcDt7JGluZm9faW1hZ2V9PC9wPgogIDwvZGl2Pgp7aWYgJGlucHV0X3VwbG9hZF9maWxlfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9maWxlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdXBsb2FkX2ZpbGV9PC9wPgogIDwvZGl2Pgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VybH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VybH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaHJlZl90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaHJlZl90ZXh0fSZuYnNwO3skaW5mb19ocmVmX3RleHR9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2ltYWdlX3RleHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZV90ZXh0fSZuYnNwO3skaW5mb19pbWFnZV90ZXh0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbXByZXNzaW9uc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHZhbHVlX2ltcHJlc3Npb25zfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9tYXhfaW1wcmVzc2lvbnN9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9tYXhfaW1wcmVzc2lvbnN9Jm5ic3A7eyRpbmZvX21heF9pbXByZXNzaW9uc308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwaXJlc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57aHRtbF9zZWxlY3RfZGF0ZSBwcmVmaXg9JGV4cGlyZXNkYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlIHN0YXJ0X3llYXI9MjAwMCBlbmRfeWVhcj0yMDEwfSB7aHRtbF9zZWxlY3RfdGltZSBwcmVmaXg9JGV4cGlyZXNkYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskbmV2ZXJleHBpcmVzfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbn17JHN1Ym1pdH17JGNhbmNlbH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0KPGJyLz57JGltYWdlfTxici8+CntpZiAkaXRlbWNvdW50ID4gMH0KPGJyLz4KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aD57JGlwdGV4dH08L3RoPgoJCQk8dGg+eyRkYXRldGV4dH08L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPmlwfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0Key9pZn0K]]></data>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>/templates/plugin.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskbG91ZG5lc3N9PC9oMz4=]]></data>
  </file>
</module>
