  <dtdversion>1.2</dtdversion>
  <name>ModuleManager</name>
  <version>1.0</version>
  <help>PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPkEgY2xpZW50IGZvciB0aGUgTW9kdWxlUmVwb3NpdG9yeSwgdGhpcyBtb2R1bGUgYWxsb3dzIHByZXZpZXdpbmcsIGFuZCBpbnN0YWxsaW5nIG1vZHVsZXMgZnJvbSByZW1vdGUgc2l0ZXMgd2l0aG91dCB0aGUgbmVlZCBmb3IgZnRwaW5nLCBvciB1bnppcHBpbmcgYXJjaGl2ZXMuICBNb2R1bGUgWE1MIGZpbGVzIGFyZSBkb3dubG9hZGVkIHVzaW5nIFNPQVAsIGludGVncml0eSB2ZXJpZmllZCwgYW5kIHRoZW4gZXhwYW5kZWQgYXV0b21hdGljYWxseS48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5JbiBvcmRlciB0byB1c2UgdGhpcyBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdGhlICdNb2RpZnkgTW9kdWxlcycgcGVybWlzc2lvbiwgYW5kIHlvdSB3aWxsIGFsc28gbmVlZCB0aGUgY29tcGxldGUsIGFuZCBmdWxsIFVSTCB0byBhICdNb2R1bGUgUmVwb3NpdG9yeScgaW5zdGFsbGF0aW9uLiAgWW91IGNhbiBzcGVjaWZ5IHRoaXMgdXJsIGluIHRoZSAnU2l0ZSBBZG1pbicgLS0mZ3Q7ICdHbG9iYWwgU2V0dGluZ3MnIHBhZ2UuPC9wPjxici8+CjxwPllvdSBjYW4gZmluZCB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIG1vZHVsZSB1bmRlciB0aGUgJ0V4dGVuc2lvbnMnIG1lbnUuICBXaGVuIHlvdSBzZWxlY3QgdGhpcyBtb2R1bGUsIHRoZSAnTW9kdWxlIFJlcG9zaXRvcnknIGluc3RhbGxhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcXVlcmllZCBmb3IgYSBsaXN0IG9mIGl0J3MgYXZhaWxhYmxlIHhtbCBtb2R1bGVzLiAgVGhpcyBsaXN0IHdpbGwgYmUgY3Jvc3MgcmVmZXJlbmNlZCB3aXRoIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBpbnN0YWxsZWQgbW9kdWxlcywgYW5kIGEgc3VtbWFyeSBwYWdlIGRpc3BsYXllZC4gIEZyb20gaGVyZSwgeW91IGNhbiB2aWV3IHRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiwgdGhlIGhlbHAsIGFuZCB0aGUgYWJvdXQgaW5mb3JtYXRpb24gZm9yIGEgbW9kdWxlIHdpdGhvdXQgcGh5c2ljYWxseSBpbnN0YWxsaW5nIGl0LiAgWW91IGNhbiBhbHNvIGNob29zZSB0byB1cGdyYWRlIG9yIGluc3RhbGwgbW9kdWxlcy48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgY2FsZ3V5MTAwMCA8YSBocmVmPSJtYWlsdG86Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSI+Jmx0O2NhbGd1eTEwMDBAaG90bWFpbC5jb20mZ3Q7PC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPjxoMz5EZXBlbmRlbmNpZXM8L2gzPjx1bD48bGk+bnVTT0FQID0mZ3Q7IDEuMDwvbGk+PC91bD48aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48L3VsPg==</help>
  <about>PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMDxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD48bGk+VmVyc2lvbiAxLjAuIDEwIEphbnVhcnkgMjAwNi4gSW5pdGlhbCBSZWxlYXNlLjwvbGk+PC91bD48YnIgLz4=</about>
  <description>A tool for retrieving and installing modules from remote servers.</description>
  <requires>
    <requiredname>nuSOAP</requiredname>
    <requiredversion>1.0</requiredversion>
  </requires>
  <file>
    <filename>/</filename>
    <isdir>1</isdir>
  </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[PD9waHAKJGxhbmdbJ3JlcG9zaXRvcnljb3VudCddID0gJ01vZHVsZXMgZm91bmQgaW4gdGhlIHJlcG9zaXRvcnknOwokbGFuZ1snaW5zdGNvdW50J10gPSAnTW9kdWxlcyBjdXJyZW50bHkgaW5zdGFsbGVkJzsKJGxhbmdbJ2F2YWlsYWJsZW1vZHVsZXMnXSA9ICdUaGUgY3VycnJlbnQgc3RhdHVzIG9mIG1vZHVsZXMgYXZhaWxhYmxlIGZyb20gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSc7CiRsYW5nWydoZWxwdHh0J10gPSAnSGVscCc7CiRsYW5nWydhYm91dHR4dCddID0gJ0Fib3V0JzsKJGxhbmdbJ3htbHRleHQnXSA9ICdYTUwgRmlsZSc7CiRsYW5nWyduYW1ldGV4dCddID0gJ01vZHVsZSBOYW1lJzsKJGxhbmdbJ3ZlcnRleHQnXSA9ICdWZXJzaW9uJzsKJGxhbmdbJ3NpemV0ZXh0J10gPSAnU2l6ZSc7CiRsYW5nWydzdGF0dXN0ZXh0J10gPSAnU3RhdHVzJzsKJGxhbmdbJ3VwdG9kYXRlJ10gPSAnVXAgdG8gZGF0ZSc7CiRsYW5nWydhdmFpbGFibGUnXSA9ICdBdmFpbGFibGUgZm9yIGluc3RhbGwnOwokbGFuZ1snbmV3ZXJ2ZXJzaW9uJ10gPSAnTmV3ZXIgdmVyc2lvbiBpbnN0YWxsZWQnOwokbGFuZ1sndXBncmFkZSddID0gJ1VwZ3JhZGUgQXZhaWxhYmxlJzsKJGxhbmdbJ2Vycm9yX25vc29hcGNvbm5lY3QnXSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBTT0FQIHNlcnZlcic7CiRsYW5nWydlcnJvcl9zb2FwZXJyb3InXSA9ICdTT0FQIFByb2JsZW0nOwokbGFuZ1snZXJyb3Jfbm9yZXBvc2l0b3J5dXJsJ10gPSAnVGhlIFVSTCBmb3IgdGhlIE1vZHVsZSBSZXBvc2l0b3J5IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQnOwokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnTW9kdWxlIE1hbmFnZXInOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdQb3N0IEluc3RhbGwgTWVzc2FnZS4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1Bvc3QgVW5pbnN0YWxsIE1lc3NhZ2UsIGUuZy4sICJDdXJzZXMhIEZvaWxlZCBBZ2FpbiEiJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IFlvdVwncmUgc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdBIGNsaWVudCBmb3IgdGhlIE1vZHVsZVJlcG9zaXRvcnksIHRoaXMgbW9kdWxlIGFsbG93cyBwcmV2aWV3aW5nLCBhbmQgaW5zdGFsbGluZyBtb2R1bGVzIGZyb20gcmVtb3RlIHNpdGVzIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGZ0cGluZywgb3IgdW56aXBwaW5nIGFyY2hpdmVzLiAgTW9kdWxlIFhNTCBmaWxlcyBhcmUgZG93bmxvYWRlZCB1c2luZyBTT0FQLCBpbnRlZ3JpdHkgdmVyaWZpZWQsIGFuZCB0aGVuIGV4cGFuZGVkIGF1dG9tYXRpY2FsbHkuJzsKCiRsYW5nWydlcnJvciddID0gJ0Vycm9yISc7CiRsYW5kWydhZG1pbl90aXRsZSddID0gJ01vZHVsZSBNYW5hZ2VyIEFkbWluIFBhbmVsJzsKJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICdBIHRvb2wgZm9yIHJldHJpZXZpbmcgYW5kIGluc3RhbGxpbmcgbW9kdWxlcyBmcm9tIHJlbW90ZSBzZXJ2ZXJzLic7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgRGVuaWVkLiBQbGVhc2UgY2hlY2sgeW91ciBwZXJtaXNzaW9ucy4nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdQb3N0IEluc3RhbGwgTWVzc2FnZSwgKGUuZy4sIEJlIHN1cmUgdG8gc2V0ICIiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEpJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD48bGk+VmVyc2lvbiAxLjAuIDEwIEphbnVhcnkgMjAwNi4gSW5pdGlhbCBSZWxlYXNlLjwvbGk+PC91bD4nOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5BIGNsaWVudCBmb3IgdGhlIE1vZHVsZVJlcG9zaXRvcnksIHRoaXMgbW9kdWxlIGFsbG93cyBwcmV2aWV3aW5nLCBhbmQgaW5zdGFsbGluZyBtb2R1bGVzIGZyb20gcmVtb3RlIHNpdGVzIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGZ0cGluZywgb3IgdW56aXBwaW5nIGFyY2hpdmVzLiAgTW9kdWxlIFhNTCBmaWxlcyBhcmUgZG93bmxvYWRlZCB1c2luZyBTT0FQLCBpbnRlZ3JpdHkgdmVyaWZpZWQsIGFuZCB0aGVuIGV4cGFuZGVkIGF1dG9tYXRpY2FsbHkuPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+SW4gb3JkZXIgdG8gdXNlIHRoaXMgbW9kdWxlLCB5b3Ugd2lsbCBuZWVkIHRoZSBcJ01vZGlmeSBNb2R1bGVzXCcgcGVybWlzc2lvbiwgYW5kIHlvdSB3aWxsIGFsc28gbmVlZCB0aGUgY29tcGxldGUsIGFuZCBmdWxsIFVSTCB0byBhIFwnTW9kdWxlIFJlcG9zaXRvcnlcJyBpbnN0YWxsYXRpb24uICBZb3UgY2FuIHNwZWNpZnkgdGhpcyB1cmwgaW4gdGhlIFwnU2l0ZSBBZG1pblwnIC0tJmd0OyBcJ0dsb2JhbCBTZXR0aW5nc1wnIHBhZ2UuPC9wPjxici8+CjxwPllvdSBjYW4gZmluZCB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIG1vZHVsZSB1bmRlciB0aGUgXCdFeHRlbnNpb25zXCcgbWVudS4gIFdoZW4geW91IHNlbGVjdCB0aGlzIG1vZHVsZSwgdGhlIFwnTW9kdWxlIFJlcG9zaXRvcnlcJyBpbnN0YWxsYXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHF1ZXJpZWQgZm9yIGEgbGlzdCBvZiBpdFwncyBhdmFpbGFibGUgeG1sIG1vZHVsZXMuICBUaGlzIGxpc3Qgd2lsbCBiZSBjcm9zcyByZWZlcmVuY2VkIHdpdGggdGhlIGxpc3Qgb2YgY3VycmVudGx5IGluc3RhbGxlZCBtb2R1bGVzLCBhbmQgYSBzdW1tYXJ5IHBhZ2UgZGlzcGxheWVkLiAgRnJvbSBoZXJlLCB5b3UgY2FuIHZpZXcgdGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uLCB0aGUgaGVscCwgYW5kIHRoZSBhYm91dCBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUgd2l0aG91dCBwaHlzaWNhbGx5IGluc3RhbGxpbmcgaXQuICBZb3UgY2FuIGFsc28gY2hvb3NlIHRvIHVwZ3JhZGUgb3IgaW5zdGFsbCBtb2R1bGVzLjwvcD4KPGgzPlN1cHBvcnQ8L2gzPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgo8aDM+Q29weXJpZ2h0IGFuZCBMaWNlbnNlPC9oMz4KPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA2LCBjYWxndXkxMDAwIDxhIGhyZWY9Im1haWx0bzpjYWxndXkxMDAwQGhvdG1haWwuY29tIj4mbHQ7Y2FsZ3V5MTAwMEBob3RtYWlsLmNvbSZndDs8L2E+LiBBbGwgUmlnaHRzIEFyZSBSZXNlcnZlZC48L3A+CjxwPlRoaXMgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwiPkdOVSBQdWJsaWMgTGljZW5zZTwvYT4uIFlvdSBtdXN0IGFncmVlIHRvIHRoaXMgbGljZW5zZSBiZWZvcmUgdXNpbmcgdGhlIG1vZHVsZS48L3A+JzsKPz4K]]></data>
  </file>
  <file>
    <filename>/ModuleManager.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IE1vZHVsZU1hbmFnZXIgLSBBIGNsaWVudCBmb3IgdGhlIE1vZHVsZVJlcG9zaXRvcnksIHRoaXMgbW9kdWxlIGFsbG93cyBwcmV2aWV3aW5nLCBhbmQgaW5zdGFsbGluZyBtb2R1bGVzIGZyb20gcmVtb3RlIHNpdGVzIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGZ0cGluZywgb3IgdW56aXBwaW5nIGFyY2hpdmVzLiAgTW9kdWxlIFhNTCBmaWxlcyBhcmUgZG93bmxvYWRlZCB1c2luZyBTT0FQLCBpbnRlZ3JpdHkgdmVyaWZpZWQsIGFuZCB0aGVuIGV4cGFuZGVkIGF1dG9tYXRpY2FsbHkuCiMgVmVyc2lvbjogMS4wLCBjYWxndXkxMDAwCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDYgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIyBUaGlzIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IE1vZHVsZU1ha2VyIG1vZHVsZSwgdmVyc2lvbiAwLjIKIyBDb3B5cmlnaHQgKGMpIDIwMDYgYnkgU2FtdWVsIEdvbGRzdGVpbiAoc2pnQGNtc21hZGVzaW1wbGUub3JnKSAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEZvciBIZWxwIGJ1aWxkaW5nIG1vZHVsZXM6CiMgLSBSZWFkIHRoZSBEb2N1bWVudGF0aW9uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlIGF0CiMgICBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnLwojIC0gQ2hlY2sgb3V0IHRoZSBTa2VsZXRvbiBNb2R1bGUgZm9yIGEgY29tbWVudGVkIGV4YW1wbGUKIyAtIExvb2sgYXQgb3RoZXIgbW9kdWxlcywgYW5kIGxlYXJuIGZyb20gdGhlIHNvdXJjZQojIC0gQ2hlY2sgb3V0IHRoZSBmb3J1bXMgYXQgaHR0cDovL2ZvcnVtcy5jbXNtYWRlc2ltcGxlLm9yZwojIC0gQ2hhdCB3aXRoIGRldmVsb3BlcnMgb24gdGhlICNjbXMgSVJDIGNoYW5uZWwKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZmluZSgnTUlOSU1VTV9SRVBPU0lUT1JZX1ZFUlNJT04nLCcxLjAnKTsKCmZ1bmN0aW9uIHVhc29ydF9jbXBfZGV0YWlscyggJGUxLCAkZTIgKQp7CiAgaWYoICRlMVsnbmFtZSddIDwgJGUyWyduYW1lJ10gKQogICAgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgZWxzZSBpZiggJGUxWyduYW1lJ10gPiAkZTJbJ25hbWUnXSApCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQogIHJldHVybiB2ZXJzaW9uX2NvbXBhcmUoICRlMVsndmVyc2lvbiddLCAkZTJbJ3ZlcnNpb24nXSApOwp9CgpjbGFzcyBNb2R1bGVNYW5hZ2VyIGV4dGVuZHMgQ01TTW9kdWxlCnsKCiAgZnVuY3Rpb24gR2V0TmFtZSgpCiAgewogICAgcmV0dXJuICdNb2R1bGVNYW5hZ2VyJzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEZyaWVuZGx5TmFtZSgpCiAgIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5nLCBwcmVmZXJhYmx5IGEgbG9jYWxpemVkIG5hbWUKICAgb2YgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgbmFtZSB0aGF0J3Mgc2hvd24gaW4gdGhlCiAgIEFkbWluIE1lbnVzIGFuZCBzZWN0aW9uIHBhZ2VzIChpZiB0aGUgbW9kdWxlIGhhcyBhbiBhZG1pbgogICBjb21wb25lbnQpLgoJICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KCgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmcsIHByZWZlcmFibHkgYSBudW1iZXIgb3IKICAgc29tZXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UgZm9yIGRlc2lnbmF0aW5nIGEgdmVyc2lvbi4KICAgVGhlIENNUyB3aWxsIHVzZSB0aGlzIHRvIGlkZW50aWZ5IHdoZXRoZXIgb3Igbm90CiAgIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGlzIGN1cnJlbnQsIGFuZAogICB0aGUgbW9kdWxlIHdpbGwgdXNlIGl0IHRvIGZpZ3VyZSBvdXQgaG93IHRvIHVwZ3JhZGUKICAgaXRzZWxmIGlmIHJlcXVlc3RlZC4JICAgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpCiAgewogICAgcmV0dXJuICcxLjAnOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0SGVscCgpCiAgIFRoaXMgcmV0dXJucyBIVE1MIGluZm9ybWF0aW9uIG9uIHRoZSBtb2R1bGUuCiAgIFR5cGljYWxseSwgeW91J2xsIHdhbnQgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8KICAgdXNlIHRoZSBtb2R1bGUuCgkgICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvcigpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwJzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvckVtYWlsKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBNb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSAiQWJvdXQiIGxpbmsuIEl0IGhlbHBzIHVzZXJzCiAgIG9mIHlvdXIgbW9kdWxlIGdldCBpbiB0b3VjaCB3aXRoIHlvdSB0byBzZW5kIGJ1ZyByZXBvcnRzLAogICBxdWVzdGlvbnMsIGNhc2VzIG9mIGJlZXIsIGFuZC9vciBsYXJnZSBzdW1zIG9mIG1vbmV5LgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkKICB7CiAgICByZXR1cm4gJ2NhbGd1eTEwMDBAaG90bWFpbC5jb20nOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBtb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSBBYm91dCBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBmaWd1cmUgb3V0IHdoYXQncyBjaGFuZ2VkIGJldHdlZW4gcmVsZWFzZXMuCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSXNQbHVnaW5Nb2R1bGUoKQogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBvciBmYWxzZSwgZGVwZW5kaW5nIHVwb24KICAgd2hldGhlciB1c2VycyBjYW4gaW5jbHVkZSB0aGUgbW9kdWxlIGluIGEgcGFnZSBvcgogICB0ZW1wbGF0ZSB1c2luZyBhIHNtYXJ0eSB0YWcgb2YgdGhlIGZvcm0KICAge2Ntc19tb2R1bGUgbW9kdWxlPSdNb2R1bGVNYW5hZ2VyJyBwYXJhbTE9dmFsIHBhcmFtMj12YWwuLi59CgkgICAKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBub3QgZ2V0IGluY2x1ZGVkIGluIHBhZ2VzIG9yCiAgIHRlbXBsYXRlcywgcmV0dXJuICJmYWxzZSIgaGVyZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzQWRtaW4oKQogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlLCBkZXBlbmRpbmcgb24KICAgd2hldGhlciB5b3VyIG1vZHVsZSBhZGRzIGFueXRoaW5nIHRvIHRoZSBBZG1pbiBhcmVhIG9mCiAgIHRoZSBzaXRlLiBGb3IgdGhlIHJlc3Qgb2YgdGhlc2UgY29tbWVudHMsIEknbGwgYmUgY2FsbGluZwogICB0aGUgYWRtaW4gcGFydCBvZiB5b3VyIG1vZHVsZSB0aGUgIkFkbWluIFBhbmVsIiBmb3IKICAgd2FudCBvZiBhIGJldHRlciB0ZXJtLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEhhc0FkbWluKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pblNlY3Rpb24oKQogICBJZiB5b3VyIG1vZHVsZSBoYXMgYW4gQWRtaW4gUGFuZWwsIHlvdSBjYW4gc3BlY2lmeQogICB3aGljaCBBZG1pbiBTZWN0aW9uIChvciB0b3AtbGV2ZWwgQWRtaW4gTWVudSkgaXQgc2hvd3MKICAgdXAgaW4uIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgdG8gc3BlY2lmeSB0aGF0CiAgIHNlY3Rpb24uIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlOgoKICAgbWFpbiAgICAgICAgLSB0aGUgTWFpbiBtZW51IHRhYi4KICAgY29udGVudCAgICAgLSB0aGUgQ29udGVudCBtZW51CiAgIGxheW91dCAgICAgIC0gdGhlIExheW91dCBtZW51CiAgIHVzZXJzZ3JvdXBzIC0gdGhlIFVzZXJzIGFuZCBHcm91cHMgbWVudQogICBleHRlbnNpb25zICAtIHRoZSBFeHRlbnNpb25zIG1lbnUgKHRoaXMgaXMgdGhlIGRlZmF1bHQpCiAgIHNpdGVhZG1pbiAgIC0gdGhlIFNpdGUgQWRtaW4gbWVudQogICB2aWV3c2l0ZSAgICAtIHRoZSBWaWV3IFNpdGUgbWVudSB0YWIKICAgbG9nb3V0ICAgICAgLSB0aGUgTG9nb3V0IG1lbnUgdGFiCgkgICAKICAgTm90ZSB0aGF0IGlmIHlvdSBwbGFjZSB5b3VyIG1vZHVsZSBpbiB0aGUgbWFpbiwKICAgdmlld3NpdGUsIG9yIGxvZ291dCBzZWN0aW9ucywgaXQgd2lsbCBzaG93IHVwIGluIHRoZQogICBtZW51cywgYnV0IHdpbGwgbm90IGJlIHZpc2libGUgaW4gYW55IHRvcC1sZXZlbAogICBzZWN0aW9uIHBhZ2VzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpCiAgewogICAgcmV0dXJuICdleHRlbnNpb25zJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBoYXZlIGFuIEFkbWluIFBhbmVsLCB5b3UKICAgY2FuIGhhdmUgaXQgcmV0dXJuIGEgZGVzY3JpcHRpb24gc3RyaW5nIHRoYXQgZ2V0cyBzaG93bgogICBpbiB0aGUgQWRtaW4gU2VjdGlvbiBwYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gY29udHJvbCB3aGV0aGVyIG9yIG5vdCBpdCdzIGRpc3BsYXllZCBieSB0aGUgYm9vbGVhbgogICB0aGF0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkCiAgIHRvIGhpZGUgbW9kdWxlcyBmcm9tIGFkbWlucyB3aG8gbGFjayBwZXJtaXNzaW9uIHRvIHVzZQogICB0aGVtLgoJICAgCiAgIFR5cGljYWxseSwgeW91J2xsIHVzZSBzb21lIHBlcm1pc3Npb24gdG8gc2V0IHRoaXMKICAgKGUuZy4sICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ1NvbWUgUGVybWlzc2lvbicpOyApCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgkKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2tBY2Nlc3MoKQogICBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gd2lsbCBjaGVjayBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiwKICAgYW5kIGRpc3BsYXkgYW4gZXJyb3IgcGFnZSBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgYWRlcXVhdGUgcGVybWlzc2lvbnMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gQ2hlY2tBY2Nlc3MoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCRwZXJtID0gJ01vZGlmeSBNb2R1bGVzJykKICB7CiAgICBpZiAoISAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCRwZXJtKSkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5RXJyb3JQYWdlKCkKICAgVGhpcyBpcyBhIHNpbXBsZSBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBlcnJvciBwYWdlcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZT0nJykKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9yJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZignbWVzc2FnZScsICRtZXNzYWdlKTsKCSAgCiAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZXJyb3IudHBsJyk7CiAgfQoJCgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICBZb3VyIG1vZHVsZSBtYXkgbmVlZCBhbm90aGVyIG1vZHVsZSB0byBhbHJlYWR5IGJlIGluc3RhbGxlZAogICBiZWZvcmUgeW91IGNhbiBpbnN0YWxsIGl0LgogICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYW5kCiAgIG1pbmltdW0gdmVyc2lvbiBudW1iZXJzIHRoYXQgdGhpcyBtb2R1bGUgcmVxdWlyZXMuCgkgICAKICAgSXQgc2hvdWxkIHJldHVybiBhbiBoYXNoLCBlZy4KICAgcmV0dXJuIGFycmF5KCdzb21lbW9kdWxlJz0+JzEuMCcsICdvdGhlcm1vZHVsZSc9PicxLjEnKTsKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSgnbnVTT0FQJz0+JzEuMCcpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTWluaW11bUNNU1ZlcnNpb24oKQogICBZb3VyIG1vZHVsZSBtYXkgcmVxdWlyZSBmdW5jdGlvbnMgb3Igb2JqZWN0cyBmcm9tCiAgIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBDTVMgTWFkZSBTaW1wbGUuCiAgIEV2ZXIgc2luY2UgdmVyc2lvbiAwLjExLCB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggbWluaW11bQogICBDTVMgTVMgdmVyc2lvbiBpcyByZXF1aXJlZCBmb3IgeW91ciBtb2R1bGUsIHdoaWNoIHdpbGwKICAgcHJldmVudCBpdCBmcm9tIGJlaW5nIGluc3RhbGxlZCBieSBhIHZlcnNpb24gb2YgQ01TIHRoYXQKICAgY2FuJ3QgcnVuIGl0LgoJICAgCiAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQogICBtaW5pbXVtIHZlcnNpb24gdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCiAgewogICAgcmV0dXJuICIwLjExLjIiOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGwoKQogICBXaGVuIHlvdXIgbW9kdWxlIGlzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGRvIHNvbWUKICAgc2V0dXAuIFR5cGljYWwgdGhpbmdzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHRoZSBjcmVhdGlvbgogICBhbmQgcHJlcG9wdWxhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsIGRhdGFiYXNlIHNlcXVlbmNlcywKICAgcGVybWlzc2lvbnMsIHByZWZlcmVuY2VzLCBldGMuCgkgICAJICAgCiAgIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgY3JlYXRpb24gb2YgZGF0YWJhc2UgdGFibGVzLAogICBjaGVjayBvdXQgdGhlIEFET0RCIERhdGEgRGljdGlvbmFyeSBwYWdlIGF0CiAgIGh0dHA6Ly9waHBsZW5zLmNvbS9sZW5zL2Fkb2RiL2RvY3MtZGF0YWRpY3QuaHRtCgkgICAKICAgVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgc3RyaW5nIGluIGNhc2Ugb2YgYW55IGVycm9yLAogICBhbmQgQ01TIHdpbGwgbm90IGNvbnNpZGVyIHRoZSBtb2R1bGUgaW5zdGFsbGVkLgogICBTdWNjZXNzZnVsIGluc3RhbGxzIHNob3VsZCByZXR1cm4gRkFMU0Ugb3Igbm90aGluZyBhdCBhbGwuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbCgpCiAgewogICAgLyoKICAgICAvLyBUeXBpY2FsIERhdGFiYXNlIEluaXRpYWxpemF0aW9uCiAgICAgJGRiID0gJiR0aGlzLT5jbXMtPmRiOwoJCQogICAgIC8vIG15c3FsLXNwZWNpZmljLCBidXQgaWdub3JlZCBieSBvdGhlciBkYXRhYmFzZQogICAgICR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CiAgICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJCQogICAgIC8vIHRhYmxlIHNjaGVtYSBkZXNjcmlwdGlvbgogICAgICRmbGRzID0gIgogICAgIGlkIEkgS0VZLAogICAgIGRlc2NyaXB0aW9uIEMoODApCiAgICAgIjsKCiAgICAgLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLgogICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9tb2R1bGVpbnN0YWxsZXIiLAogICAgICRmbGRzLCAkdGFib3B0YXJyYXkpOwogICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiAgICAgLy8gY3JlYXRlIGEgc2VxdWVuY2UKICAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX21vZHVsZWluc3RhbGxlcl9zZXEiKTsKICAgICovCgkJCiAgICAvLyBwZXJtaXNzaW9ucwoJCQoKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIEFmdGVyIGluc3RhbGxhdGlvbiwgdGhlcmUgbWF5IGJlIHRoaW5ncyB5b3Ugd2FudCB0bwogICBjb21tdW5pY2F0ZSB0byB5b3VyIGFkbWluLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYQogICBzdHJpbmcgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIEFmdGVyIHJlbW92aW5nIGEgbW9kdWxlLCB0aGVyZSBtYXkgYmUgdGhpbmdzIHlvdSB3YW50IHRvCiAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCiAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVXBncmFkZSgpCiAgIElmIHlvdXIgbW9kdWxlIHZlcnNpb24gbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSB2ZXJzaW9uCiAgIG51bWJlciBvZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSwgdGhlIENNUyBBZG1pbiB3aWxsIGdpdmUKICAgeW91IGEgY2hhbmNlIHRvIHVwZ3JhZGUgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgZnVuY3Rpb24KICAgdGhhdCBhY3R1YWxseSBoYW5kbGVzIHRoZSB1cGdyYWRlLgogICBJZGVhbGx5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgdXBncmFkZXMgaW5jcmVtZW50YWxseSwKICAgc28geW91IGNvdWxkIHVwZ3JhZGUgZnJvbSB2ZXJzaW9uIDAuMC4xIHRvIDEwLjUuNyB3aXRoCiAgIGEgc2luZ2xlIGNhbGwuIEZvciBhIGdyZWF0IGV4YW1wbGUgb2YgdGhpcywgc2VlIHRoZSBOZXdzCiAgIG1vZHVsZSBpbiB0aGUgc3RhbmRhcmQgQ01TIGluc3RhbGwuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVXBncmFkZSgkb2xkdmVyc2lvbiwgJG5ld3ZlcnNpb24pCiAgewogICAgJGN1cnJlbnRfdmVyc2lvbiA9ICRvbGR2ZXJzaW9uOwogICAgc3dpdGNoKCRjdXJyZW50X3ZlcnNpb24pCiAgICAgIHsKICAgICAgY2FzZSAiMS4wIjoKCWJyZWFrOwogICAgICBjYXNlICIxLjEiOgoJYnJlYWs7CiAgICAgIH0KCQkKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwogIH0KCgogIC8qKgogICAqIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQogICAqIFRoaXMgYWxsb3dzIHlvdSB0byBkaXNwbGF5IGEgbWVzc2FnZSBhbG9uZyB3aXRoIGEgWWVzL05vIGRpYWxvZyBib3guIElmIHRoZSB1c2VyIHJlc3BvbmRzCiAgICogaW4gdGhlIGFmZmlybWF0aXZlIHRvIHlvdXIgbWVzc2FnZSwgdGhlIHVuaW5zdGFsbCB3aWxsIHByb2NlZWQuIElmIHRoZXkgcmVzcG9uZCBpbiB0aGUKICAgKiBuZWdhdGl2ZSwgdGhlIHVuaW5zdGFsbCB3aWxsIGJlIGNhbmNlbGVkLiBUaHVzLCB5b3VyIG1lc3NhZ2Ugc2hvdWxkIGJlIG9mIHRoZSBmb3JtCiAgICogIkFsbCBtb2R1bGUgZGF0YSB3aWxsIGJlIGRlbGV0ZWQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBtb2R1bGU/IgogICAqCiAgICogSWYgeW91IGRvbid0IHdhbnQgdGhlIGRpYWxvZywgaGF2ZSB0aGlzIG1ldGhvZCByZXR1cm4gYSBGQUxTRSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUKICAgKiBtb2R1bGUgdG8gdW5pbnN0YWxsIGltbWVkaWF0ZWx5IGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgInVuaW5zdGFsbCIgbGluay4KICAgKi8KICBmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKICB9CgkKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGwoKQogICBTb21ldGltZXMsIGFuIGV4Y2VwdGlvbmFsbHkgdW5lbmxpZ2h0ZW5lZCBvciBpZ25vcmFudAogICBhZG1pbiB3aWxsIHdpc2ggdG8gdW5pbnN0YWxsIHlvdXIgbW9kdWxlLiBXaGlsZSBpdAogICB3b3VsZCBiZSBiZXN0IHRvIGxheSBpbnRvIHRoZXNlIGlkaW90cyB3aXRoIGEgY2x1ZXN0aWNrLAogICB3ZSB3aWxsIGRvIHRoZSBtYWduYW5pbW91cyB0aGluZyBhbmQgcmVtb3ZlIHRoZSBtb2R1bGUKICAgYW5kIGNsZWFuIHVwIHRoZSBkYXRhYmFzZSwgcGVybWlzc2lvbnMsIGFuZCBwcmVmZXJlbmNlcwogICB0aGF0IGFyZSBzcGVjaWZpYyB0byBpdC4KICAgVGhpcyBpcyB0aGUgbWV0aG9kIHdoZXJlIHdlIGRvIHRoaXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsKCkKICB7CiAgICAvKgogICAgIC8vIFR5cGljYWwgRGF0YWJhc2UgUmVtb3ZhbAogICAgICRkYiA9ICYkdGhpcy0+Y21zLT5kYjsKCQkKICAgICAvLyByZW1vdmUgdGhlIGRhdGFiYXNlIHRhYmxlCiAgICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CiAgICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfbW9kdWxlaW5zdGFsbGVyIiApOwogICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiAgICAgLy8gcmVtb3ZlIHRoZSBzZXF1ZW5jZQogICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9tb2R1bGVpbnN0YWxsZXJfc2VxIiApOwogICAgKi8KCQkKICAgIC8vIHJlbW92ZSB0aGUgcGVybWlzc2lvbnMKCQkKCQkKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGlmIHlvdXIgbW9kdWxlCiAgIGlzIGEgcGx1Zy1pbiB0eXBlIG1vZHVsZS4KCSAgIAogICBJbiBnZW5lcmFsLCB5b3UnbGwgd2FudCB0byBjYWxsIHZhcmlvdXMgZGlmZmVyZW50CiAgIG1ldGhvZHMsIGRlcGVuZGluZyB1cG9uIHRoZSByZXF1ZXN0ZWQgImFjdGlvbi4iCgkgICAKICAgVGhlcmUgYXJlIHR3byBidWlsdC1pbiBhY3Rpb25zOiAiZGVmYXVsdCIgd2hpY2ggZ2V0cwogICBjYWxsZWQgaWYgdGhlIG1vZHVsZSBpcyBhY2Nlc3NlZCBmcm9tIGEgcGFnZSBvciB0ZW1wbGF0ZSwKICAgYW5kICJkZWZhdWx0YWRtaW4iIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gdGhlIEFkbWluCiAgIHBhbmVsLgoJICAgCiAgIFRoZSBBY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhIGRpZmZlcmVudAogICBhY3Rpb24gZWl0aGVyIGluIHlvdXIgdGFnLCBlLmcuLAogICB7Y21zX21vZHVsZSBtb2R1bGU9J01vZHVsZU1hbmFnZXInIGFjdGlvbj0nc29tZXRoaW5nJ30KICAgb3IgYnkgcGFzc2luZyBpdCBpbiBhIGxpbmsgY3JlYXRlIGJ5IHRoZSBDcmVhdGVMaW5rCiAgIG1ldGhvZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQ9LTEpCiAgewogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CgogICAgICBjYXNlICdkZWZhdWx0YWRtaW4nOgoJewoJICAvLyBEZWZhdWx0IEFkbWluLVNpZGUgTWV0aG9kCgkgIGlmICgkdGhpcy0+Q2hlY2tBY2Nlc3MoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCdNb2RpZnkgTW9kdWxlcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQoKICAgICAgY2FzZSAnaW5zdGFsbG1vZHVsZSc6Cgl7CgkgIGlmICgkdGhpcy0+Q2hlY2tBY2Nlc3MoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCdNb2RpZnkgTW9kdWxlcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fRG9BZG1pbkluc3RhbGxNb2R1bGUoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApOwoJICAgIH0KCSAgYnJlYWs7Cgl9CgogICAgICBjYXNlICdtb2R1bGVoZWxwJzoKCXsKCSAgJHRoaXMtPl9EaXNwbGF5QWRtaW5Tb2FwTW9kdWxlSGVscCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICk7Cgl9CglicmVhazsKCiAgICAgIGNhc2UgJ21vZHVsZWFib3V0JzoKCXsKCSAgJHRoaXMtPl9EaXNwbGF5QWRtaW5Tb2FwTW9kdWxlQWJvdXQoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApOwoJfQoJYnJlYWs7CgoKICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQnVpbGRNb2R1bGVEYXRhKCAkeG1sZGV0YWlscywgJGluc3RhbGxkZXRhaWxzICk7CiAgIGJ1aWxkIGEgaGFzaCBvZiBpbmZvIGFib3V0IHRoZSBpbnN0YWxsZWQgbW9kdWxlcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQnVpbGRNb2R1bGVEYXRhKCAkeG1sZGV0YWlscywgJGluc3RhbGxkZXRhaWxzICkKICB7CiAgICAkcmVzdWx0cyA9IGFycmF5KCk7CiAgICBmb3JlYWNoKCAkeG1sZGV0YWlscyBhcyAkZGV0MSApCiAgICAgIHsKCSRmb3VuZCA9IDA7Cglmb3JlYWNoKCAkaW5zdGFsbGRldGFpbHMgYXMgJGRldDIgKQoJICB7CgkgICAgaWYoICRkZXQxWyduYW1lJ10gPT0gJGRldDJbJ25hbWUnXSApCgkgICAgICB7CgkJJGZvdW5kID0gMTsKCQkvLyBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgeG1sIGZpbGUgaXMgZ3JlYXRlciB0aGFuIHRoYXQgb2YgdGhlCgkJLy8gaW5zdGFsbGVkIG1vZHVsZSwgd2UgaGF2ZSBhbiB1cGdyYWRlCgkJJHJlcyA9IHZlcnNpb25fY29tcGFyZSggJGRldDFbJ3ZlcnNpb24nXSwgJGRldDJbJ3ZlcnNpb24nXSApOwoJCWlmKCAkcmVzID09IDEgKQoJCSAgewoJCSAgICAkZGV0MVsnc3RhdHVzJ10gPSAndXBncmFkZSc7CgkJICB9CgkJZWxzZSBpZiggJHJlcyA9PSAwICkKCQkgIHsKCQkgICAgJGRldDFbJ3N0YXR1cyddID0gJ3VwdG9kYXRlJzsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgICRkZXQxWydzdGF0dXMnXSA9ICduZXdlcnZlcnNpb24nOwoJCSAgfQoJCSRyZXN1bHRzW10gPSAkZGV0MTsKCSAgICAgIH0KCSAgfQoJaWYoICRmb3VuZCA9PSAwICkKCSAgewoJICAgIC8vIHdlIGRvbid0IGhhdmUgdGhpcyBtb2R1bGUgaW5zdGFsbGVkCgkgICAgJGRldDFbJ3N0YXR1cyddID0gJ25vdGluc3RhbGxlZCc7CgkgICAgJHJlc3VsdHNbXSA9ICRkZXQxOwoJICB9CiAgICAgIH0KCiAgICAvLyBub3cgd2UgaGF2ZSBldmVyeXRoaW5nCiAgICAvLyBsZXQncyB0cnkgc29ydGluZyBpdAogICAgdWFzb3J0KCAkcmVzdWx0cywgJ3Vhc29ydF9jbXBfZGV0YWlscycgKTsKICAgIHJldHVybiAkcmVzdWx0czsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUGFuZWwoKQogICBEZWZhdWx0IEFkbWluLVNpZGUgTWV0aG9kCiAgIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgYnkgZGVmYXVsdAogICB3aGVuIHRoZSBtb2R1bGUgaXMgY2FsbGVkIGZyb20gdGhlIGFkbWluLXNpZGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAmJHBhcmFtcywgJHJldHVybl9pZCkKICB7CiAgICAvLyBnZXQgdGhlIG1vZHVsZXMgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5CiAgICAkcmVzdWx0ID0gJHRoaXMtPl9HZXRSZXBvc2l0b3J5TW9kdWxlcygpOwogICAgaWYoICEgJHJlc3VsdFswXSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkcmVzdWx0WzFdICk7CglyZXR1cm47CiAgICAgIH0KICAgICRyZXBtb2R1bGVzID0gJHJlc3VsdFsxXTsKCiAgICAvLyBnZXQgdGhlIG1vZHVsZXMgdGhhdCBhcmUgYWxyZWFkeSBpbnN0YWxsZWQKICAgICRyZXN1bHQgPSAkdGhpcy0+X0dldEluc3RhbGxlZE1vZHVsZXMoKTsKICAgIGlmKCAhICRyZXN1bHRbMF0gKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJHJlc3VsdFsxXSApOwoJcmV0dXJuOwogICAgICB9CgogICAgJGluc3Rtb2R1bGVzID0gJHJlc3VsdFsxXTsKCiAgICAvLyBjcm9zcyByZWZlcmVuY2UgdGhlbQogICAgJGRhdGEgPSAkdGhpcy0+X0J1aWxkTW9kdWxlRGF0YSggJHJlcG1vZHVsZXMsICRpbnN0bW9kdWxlcyApOwoKICAgIC8vIGFuZCBkaXNwbGF5IG91ciBwYWdlCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgZm9yZWFjaCggJGRhdGEgYXMgJHJvdyApCiAgICAgIHsKCSRvbmVyb3cgPSBuZXcgc3RkQ2xhc3MoKTsKCQoJJG9uZXJvdy0+bmFtZSA9ICRyb3dbJ25hbWUnXTsKCSRvbmVyb3ctPnZlcnNpb24gPSAkcm93Wyd2ZXJzaW9uJ107Cglzd2l0Y2goICRyb3dbJ3N0YXR1cyddICkgCgkgIHsKCSAgY2FzZSAndXB0b2RhdGUnOgoJICAgICRvbmVyb3ctPnN0YXR1cyA9ICR0aGlzLT5MYW5nKCd1cHRvZGF0ZScpOwoJICAgIGJyZWFrOwoJICBjYXNlICduZXdlcnZlcnNpb24nOgoJICAgICRvbmVyb3ctPnN0YXR1cyA9ICR0aGlzLT5MYW5nKCduZXdlcnZlcnNpb24nKTsKCSAgICBicmVhazsKCSAgY2FzZSAnbm90aW5zdGFsbGVkJzoKCSAgICAkb25lcm93LT5zdGF0dXMgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnaW5zdGFsbG1vZHVsZScsICRyZXR1cm5faWQsCgkJCQkJCSAkdGhpcy0+TGFuZygnYXZhaWxhYmxlJyksIGFycmF5KCduYW1lJyA9PiAkcm93WyduYW1lJ10sCgkJCQkJCQkJCQkgJ3ZlcnNpb24nID0+ICRyb3dbJ3ZlcnNpb24nXSkpOwoJICAgICRvbmVyb3ctPmhlbHBsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ21vZHVsZWhlbHAnLCAkcmV0dXJuX2lkLAoJCQkJCQkgICAkdGhpcy0+TGFuZygnaGVscHR4dCcpLCBhcnJheSgnbmFtZScgPT4gJHJvd1snbmFtZSddLAoJCQkJCQkJCQkJICd2ZXJzaW9uJyA9PiAkcm93Wyd2ZXJzaW9uJ10pKTsKCSAgICAkb25lcm93LT5hYm91dGxpbmsgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAnbW9kdWxlYWJvdXQnLCAkcmV0dXJuX2lkLAoJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnYWJvdXR0eHQnKSwgYXJyYXkoJ25hbWUnID0+ICRyb3dbJ25hbWUnXSwKCQkJCQkJCQkJICAgICAgJ3ZlcnNpb24nID0+ICRyb3dbJ3ZlcnNpb24nXSkpOwoJICAgIGJyZWFrOwoJICBjYXNlICd1cGdyYWRlJzoKCSAgICAkb25lcm93LT5zdGF0dXMgPSAkdGhpcy0+Q3JlYXRlTGluayggJGlkLCAndXBncmFkZW1vZHVsZScsICRyZXR1cm5faWQsCgkJCQkJCSR0aGlzLT5MYW5nKCd1cGdyYWRlJyksIGFycmF5KCduYW1lJyA9PiAkcm93WyduYW1lJ10sCgkJCQkJCQkJCSAgICAgICd2ZXJzaW9uJyA9PiAkcm93Wyd2ZXJzaW9uJ10pKTsKCSAgICAkb25lcm93LT5oZWxwbGluayA9ICR0aGlzLT5DcmVhdGVMaW5rKCAkaWQsICdtb2R1bGVoZWxwJywgJHJldHVybl9pZCwKCQkJCQkJICAgJHRoaXMtPkxhbmcoJ2hlbHB0eHQnKSwgYXJyYXkoJ25hbWUnID0+ICRyb3dbJ25hbWUnXSwKCQkJCQkJCQkJCSAndmVyc2lvbicgPT4gJHJvd1sndmVyc2lvbiddKSk7CgkgICAgJG9uZXJvdy0+YWJvdXRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoICRpZCwgJ21vZHVsZWFib3V0JywgJHJldHVybl9pZCwKCQkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ2Fib3V0dHh0JyksIGFycmF5KCduYW1lJyA9PiAkcm93WyduYW1lJ10sCgkJCQkJCQkJCSAgICAgICd2ZXJzaW9uJyA9PiAkcm93Wyd2ZXJzaW9uJ10pKTsKCSAgICBicmVhazsKCSAgfQoJCQkJCQoJJG9uZXJvdy0+c2l6ZSA9ICRyb3dbJ3NpemUnXTsKCSRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoJaWYoIGlzc2V0KCAkcm93WydkZXNjcmlwdGlvbiddICkgKQoJICB7CgkgICAgJG9uZXJvdy0+ZGVzY3JpcHRpb249JHJvd1snZGVzY3JpcHRpb24nXTsKCSAgfQoJYXJyYXlfcHVzaCggJHJvd2FycmF5LCAkb25lcm93ICk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0gLy8gZm9yCgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXBvY291bnQnLCBjb3VudCgkcmVwbW9kdWxlcykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdyZXBvbXNnJywgJHRoaXMtPkxhbmcoJ3JlcG9zaXRvcnljb3VudCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5zdGNvdW50JywgY291bnQoJGluc3Rtb2R1bGVzKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2luc3Rtc2cnLCAkdGhpcy0+TGFuZygnaW5zdGNvdW50JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnRyb3RleHQnLCR0aGlzLT5MYW5nKCdhdmFpbGFibGVtb2R1bGVzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1ldGV4dCcsJHRoaXMtPkxhbmcoJ25hbWV0ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd2ZXJ0ZXh0JywkdGhpcy0+TGFuZygndmVydGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc2l6ZXRleHQnLCR0aGlzLT5MYW5nKCdzaXpldGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhdHVzdGV4dCcsJHRoaXMtPkxhbmcoJ3N0YXR1c3RleHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2l0ZW1zJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaXRlbWNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CiAgICBlY2hvICR0aGlzLT5wcm9jZXNzVGVtcGxhdGUoJ2FkbWlucGFuZWwudHBsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlBZG1pblNvYXBNb2R1bGVIZWxwKCkKICAgRGlzcGxheSB0aGUgaGVscCBmb3IgYW4gYSBtb2R1bGUgb24gdGhlIHJlcG9zaXRvcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluU29hcE1vZHVsZUhlbHAoJGlkLCAmJHBhcmFtcywgJHJldHVybl9pZCkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyduYW1lJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkbmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd2ZXJzaW9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkdmVyc2lvbiA9ICRwYXJhbXNbJ3ZlcnNpb24nXTsKCiAgICAkdXJsID0gZ2V0X3NpdGVfcHJlZmVyZW5jZSgneG1sbW9kdWxlcmVwb3NpdG9yeScpOwogICAgaWYoICR1cmwgPT0gJycgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVwb3NpdG9yeXVybCcpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR4bWxmaWxlID0gJG5hbWUuJy0nLiR2ZXJzaW9uLicueG1sJzsKICAgICRudV9zb2FwY2xpZW50ID0mIG5ldyBudV9zb2FwY2xpZW50KCR1cmwpOwogICAgaWYoICRlcnIgPSAkbnVfc29hcGNsaWVudC0+R2V0RXJyb3IoKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAnU09BUCBFcnJvcjogJy4kZXJyKTsKCXJldHVybjsKICAgICAgfQogICAgJGhlbHAgPSAkbnVfc29hcGNsaWVudC0+Y2FsbCgnTW9kdWxlUmVwb3NpdG9yeS5zb2FwX21vZHVsZWhlbHAnLGFycmF5KCduYW1lJyA9PiAkeG1sZmlsZSApKTsKICAgIGlmKCAkZXJyID0gJG51X3NvYXBjbGllbnQtPkdldEVycm9yKCkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJ1NPQVAgRXJyb3I6ICcuJGVycik7CgllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJG51X3NvYXBjbGllbnQtPnJlc3BvbnNlKTsKCXJldHVybjsKICAgICAgfQogICAgaWYoICRoZWxwWzBdID09IGZhbHNlICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICRoZWxwWzFdICk7CglyZXR1cm47CiAgICAgIH0KICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCR0aGlzLT5MYW5nKCdoZWxwdHh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtb2R1bGV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZXRleHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3ZlcnRleHQnLCR0aGlzLT5MYW5nKCd2ZXJ0ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd4bWx0ZXh0JywkdGhpcy0+TGFuZygneG1sdGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbW9kdWxlbmFtZScsJG5hbWUpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtb2R1bGV2ZXJzaW9uJywkdmVyc2lvbik7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3htbGZpbGUnLCR4bWxmaWxlKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udGVudCcsJGhlbHBbMV0pOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdyZW1vdGVjb250ZW50LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5QWRtaW5Tb2FwTW9kdWxlQWJvdXQoKQogICBEaXNwbGF5IHRoZSBoZWxwIGZvciBhbiBhIG1vZHVsZSBvbiB0aGUgcmVwb3NpdG9yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5Tb2FwTW9kdWxlQWJvdXQoJGlkLCAmJHBhcmFtcywgJHJldHVybl9pZCkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyduYW1lJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkbmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd2ZXJzaW9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkdmVyc2lvbiA9ICRwYXJhbXNbJ3ZlcnNpb24nXTsKCiAgICAkdXJsID0gZ2V0X3NpdGVfcHJlZmVyZW5jZSgneG1sbW9kdWxlcmVwb3NpdG9yeScpOwogICAgaWYoICR1cmwgPT0gJycgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVwb3NpdG9yeXVybCcpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR4bWxmaWxlID0gJG5hbWUuJy0nLiR2ZXJzaW9uLicueG1sJzsKICAgICRudV9zb2FwY2xpZW50ID0mIG5ldyBudV9zb2FwY2xpZW50KCR1cmwpOwogICAgaWYoICRlcnIgPSAkbnVfc29hcGNsaWVudC0+R2V0RXJyb3IoKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAnU09BUCBFcnJvcjogJy4kZXJyKTsKCXJldHVybjsKICAgICAgfQogICAgJGFib3V0ID0gJG51X3NvYXBjbGllbnQtPmNhbGwoJ01vZHVsZVJlcG9zaXRvcnkuc29hcF9tb2R1bGVhYm91dCcsYXJyYXkoJ25hbWUnID0+ICR4bWxmaWxlICkpOwogICAgaWYoICRlcnIgPSAkbnVfc29hcGNsaWVudC0+R2V0RXJyb3IoKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAnU09BUCBFcnJvcjogJy4kZXJyKTsKCWVjaG8gaHRtbHNwZWNpYWxjaGFycygkbnVfc29hcGNsaWVudC0+cmVzcG9uc2UpOwoJcmV0dXJuOwogICAgICB9CiAgICBpZiggJGFib3V0WzBdID09IGZhbHNlICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICRhYm91dFsxXSApOwoJcmV0dXJuOwogICAgICB9CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlJywkdGhpcy0+TGFuZygnYWJvdXR0eHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21vZHVsZXRleHQnLCR0aGlzLT5MYW5nKCduYW1ldGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndmVydGV4dCcsJHRoaXMtPkxhbmcoJ3ZlcnRleHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3htbHRleHQnLCR0aGlzLT5MYW5nKCd4bWx0ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtb2R1bGVuYW1lJywkbmFtZSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21vZHVsZXZlcnNpb24nLCR2ZXJzaW9uKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigneG1sZmlsZScsJHhtbGZpbGUpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb250ZW50JywkYWJvdXRbMV0pOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdyZW1vdGVjb250ZW50LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRG9BZG1pbkluc3RhbGxNb2R1bGUoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5faWQgKQogICBkbyBhIG1vZHVsZSBpbnN0YWxsYXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRG9BZG1pbkluc3RhbGxNb2R1bGUoJGlkLCAmJHBhcmFtcywgJHJldHVybl9pZCkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyduYW1lJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkbmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd2ZXJzaW9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkdmVyc2lvbiA9ICRwYXJhbXNbJ3ZlcnNpb24nXTsKCiAgICAkdXJsID0gZ2V0X3NpdGVfcHJlZmVyZW5jZSgneG1sbW9kdWxlcmVwb3NpdG9yeScpOwogICAgaWYoICR1cmwgPT0gJycgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vcmVwb3NpdG9yeXVybCcpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR4bWxmaWxlID0gJG5hbWUuJy0nLiR2ZXJzaW9uLicueG1sJzsKICAgICRudV9zb2FwY2xpZW50ID0mIG5ldyBudV9zb2FwY2xpZW50KCR1cmwpOwogICAgaWYoICRlcnIgPSAkbnVfc29hcGNsaWVudC0+R2V0RXJyb3IoKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAnU09BUCBFcnJvcjogJy4kZXJyKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgeG1sIGZpbGUgZnJvbSBzb2FwCiAgICAkeG1sID0gJG51X3NvYXBjbGllbnQtPmNhbGwoJ01vZHVsZVJlcG9zaXRvcnkuc29hcF9tb2R1bGV4bWwnLGFycmF5KCduYW1lJyA9PiAkeG1sZmlsZSApKTsKICAgIGlmKCAkZXJyID0gJG51X3NvYXBjbGllbnQtPkdldEVycm9yKCkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJ1NPQVAgRXJyb3I6ICcuJGVycik7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIG1kNXN1bSBmcm9tIHNvYXAKICAgICRzdnJtZDUgPSAkbnVfc29hcGNsaWVudC0+Y2FsbCgnTW9kdWxlUmVwb3NpdG9yeS5zb2FwX21vZHVsZW1kNXN1bScsYXJyYXkoJ25hbWUnID0+ICR4bWxmaWxlKSk7CiAgICBpZiggJGVyciA9ICRudV9zb2FwY2xpZW50LT5HZXRFcnJvcigpICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICdTT0FQIEVycm9yOiAnLiRlcnIpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gY2FsY3VsYXRlIG91ciBvd24gbWQ1c3VtCiAgICAvLyBhbmQgY29tcGFyZQogICAgJGNsaWVudG1kNSA9IG1kNSggJHhtbCApOwogICAgZWNobyAiREVCVUcgc2l6ZT0iLnN0cmxlbigkeG1sKS4iPGJyLz4iOwogICAgZWNobyAiREVCVUcgbWQ1IGNsaWVudD0kY2xpZW50bWQ1PGJyLz4iOwogICAgZWNobyAiREVCVUcgbWQ1IHN2cj0kc3ZybWQ1PGJyLz4iOwoKICAgIGlmKCAkY2xpZW50bWQ1ICE9ICRzdnJtZDUgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX2NoZWNrc3VtJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAKICAgIC8vIHdvb2hvbywgd2UncmUgcmVhZHkgdG8gcm9jayBhbmQgcm9sbCBub3cKICAgIC8vIGp1c3QgZ290dGEgZXhwYW5kIHRoZSBtb2R1bGUKICAgIGlmKCAhTW9kdWxlT3BlcmF0aW9uczo6RXhwYW5kWE1MUGFja2FnZSggJHhtbCApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgIE1vZHVsZU9wZXJhdGlvbnM6OkdldExhc3RFcnJvcigpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybl9pZCApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfR2V0SW5zdGFsbGVkTW9kdWxlcwogICBidWlsZCBhIGhhc2ggb2YgaW5mbyBhYm91dCB0aGUgaW5zdGFsbGVkIG1vZHVsZXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0dldEluc3RhbGxlZE1vZHVsZXMoKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgICRyZXN1bHRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRnQ21zLT5tb2R1bGVzIGFzICRrZXkgPT4gJHZhbHVlICkKICAgICAgewoJJG1vZGluc3RhbmNlID0gJHZhbHVlWydvYmplY3QnXTsKCSRkZXRhaWxzID0gYXJyYXkoKTsKCSRkZXRhaWxzWyduYW1lJ10gPSAkbW9kaW5zdGFuY2UtPkdldE5hbWUoKTsKCSRkZXRhaWxzWydkZXNjcmlwdGlvbiddID0gJG1vZGluc3RhbmNlLT5HZXREZXNjcmlwdGlvbigpOwoJJGRldGFpbHNbJ3ZlcnNpb24nXSA9ICRtb2RpbnN0YW5jZS0+R2V0VmVyc2lvbigpOwoJJHJlc3VsdHNbXSA9ICRkZXRhaWxzOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkodHJ1ZSwkcmVzdWx0cyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9HZXRSZXBvc2l0b3J5TW9kdWxlcwogICBHZXQgdGhlIHhtbCBtb2R1bGVzIGZyb20gdGhlIHJlcG9zaXRvcnksIGluIGFuIGFycmF5IG9mCiAgIGhhc2hlcywgZWFjaCBoYXNoIGhhcyBuYW1lIGFuZCB2ZXJzaW9uIGtleXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfR2V0UmVwb3NpdG9yeU1vZHVsZXMoKQogIHsKICAgICR1cmwgPSBnZXRfc2l0ZV9wcmVmZXJlbmNlKCd4bWxtb2R1bGVyZXBvc2l0b3J5Jyk7CiAgICBpZiggJHVybCA9PSAnJyApCiAgICAgIHsKCXJldHVybiBhcnJheShmYWxzZSwkdGhpcy0+TGFuZygnZXJyb3Jfbm9yZXBvc2l0b3J5dXJsJykpOwogICAgICB9CiAgICAkbnVfc29hcGNsaWVudCA9JiBuZXcgbnVfc29hcGNsaWVudCgkdXJsKTsKICAgIGlmKCAkZXJyID0gJG51X3NvYXBjbGllbnQtPkdldEVycm9yKCkgKQogICAgICB7CglyZXR1cm4gYXJyYXkoZmFsc2UsJHRoaXMtPkxhbmcoJ2Vycm9yX25vc29hcGNvbm5lY3QnKSk7CiAgICAgIH0KICAgICRyZXB2ZXJzaW9uID0gJG51X3NvYXBjbGllbnQtPmNhbGwoJ01vZHVsZVJlcG9zaXRvcnkuc29hcF92ZXJzaW9uJyk7CiAgICBpZiggJGVyciA9ICRudV9zb2FwY2xpZW50LT5HZXRFcnJvcigpICkKICAgICAgewoJcmV0dXJuIGFycmF5KGZhbHNlLCR0aGlzLT5MYW5nKCdlcnJvcl9zb2FwZXJyb3InKS4nICgnLiR1cmwuJyk6ICcuJGVycik7CiAgICAgIH0KICAgIGlmKCB2ZXJzaW9uX2NvbXBhcmUoICRyZXB2ZXJzaW9uLCBNSU5JTVVNX1JFUE9TSVRPUllfVkVSU0lPTiApIDwgMCApCiAgICAgIHsKCXJldHVybiBhcnJheShmYWxzZSwkdGhpcy0+TGFuZygnZXJyb3JfbWluaW11bXJlcG9zaXRvcnknKSk7CiAgICAgIH0KICAgIAogICAgJG1vZHVsZXMgPSAkbnVfc29hcGNsaWVudC0+Y2FsbCgnTW9kdWxlUmVwb3NpdG9yeS5zb2FwX2xpc3Rtb2R1bGVzJyk7CiAgICBpZiggJGVyciA9ICRudV9zb2FwY2xpZW50LT5HZXRFcnJvcigpICkKICAgICAgewoJcmV0dXJuIGFycmF5KGZhbHNlLCR0aGlzLT5MYW5nKCdlcnJvcl9zb2FwZXJyb3InKS4nICgnLiR1cmwuJyk6ICcuJGVycik7CiAgICAgIH0KICAgICRyZXN1bHRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2goICRtb2R1bGVzIGFzICRtb2R1bGUgKQogICAgICB7CgkkZGV0YWlscyA9ICRudV9zb2FwY2xpZW50LT5jYWxsKCdNb2R1bGVSZXBvc2l0b3J5LnNvYXBfbW9kdWxlZGV0YWlscycsYXJyYXkoJ25hbWUnID0+ICRtb2R1bGUgKSk7CglpZiggJGVyciA9ICRudV9zb2FwY2xpZW50LT5HZXRFcnJvcigpICkKCSAgewoJICAgIC8vIHNvYXAgcHJvYmxlbSB3aXRoIHRoaXMgbW9kdWxlCgkgICAgZWNobyAiREVCVUc6IHNvYXAgcHJvYmxlbSB3aXRoICRtb2R1bGU8YnIvPiI7CgkgICAgZWNobyAiREVCVUcgcmVzcG9uc2UgPSAiLmh0bWxzcGVjaWFsY2hhcnMoJG51X3NvYXBjbGllbnQtPnJlc3BvbnNlKS4iPGJyLz4iOwoJICAgIGNvbnRpbnVlOwoJICB9CglpZiggJGRldGFpbHNbMF0gPT0gZmFsc2UgKQoJICB7CgkgICAgLy8geG1sIHByb2JsZW0gd2l0aCB0aGlzIG1vZHVsZQoJICAgIGVjaG8gIkRFQlVHOiB4bWwgcHJvYmxlbSB3aXRoICRtb2R1bGU8YnIvPiI7CgkgICAgY29udGludWU7CgkgIH0KCSRyZXN1bHRzW10gPSAkZGV0YWlsc1sxXTsKICAgICAgfQoKICAgIHJldHVybiBhcnJheSh0cnVlLCRyZXN1bHRzKTsKICB9Cn0KCj8+Cg==]]></data>
  </file>
  <file>
    <filename>/templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>/templates/adminpanel.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRpdGVtY291bnQgPiAwfQo8cD57JGludHJvdGV4dH08L3A+CjxwPnskcmVwb2NvdW50fSZuYnNwO3skcmVwb21zZ308L3A+CjxwPnskaW5zdGNvdW50fSZuYnNwO3skaW5zdG1zZ308L3A+Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGggd2lkdGg9IjIwJSI+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyR2ZXJ0ZXh0fTwvdGg+CgkJCTx0aD57JHNpemV0ZXh0fTwvdGg+CgkJCTx0aD57JHN0YXR1c3RleHR9PC90aD4KCQkJPHRoPiZuYnNwOzwvdGg+CgkJCTx0aD4mbmJzcDs8L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPm5hbWV9PC90ZD4KCQkJPHRkPnskZW50cnktPnZlcnNpb259PC90ZD4KCQkJPHRkPnskZW50cnktPnNpemV9PC90ZD4KCQkJPHRkPnskZW50cnktPnN0YXR1c308L3RkPgoJCQk8dGQ+eyRlbnRyeS0+aGVscGxpbmt9PC90ZD4KCQkJPHRkPnskZW50cnktPmFib3V0bGlua308L3RkPgoJCTwvdHI+Cgl7aWYgJGVudHJ5LT5kZXNjcmlwdGlvbn0KCQk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+CiAgICAgICAgICAgICAgICAJPHRkPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgICAgICAJPHRkIGNvbHNwYW49IjUiPnskZW50cnktPmRlc2NyaXB0aW9ufTwvdGQ+CgkgICAgICAgIDwvdHI+Cgl7L2lmfQoJIAp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQo=]]></data>
  </file>
  <file>
    <filename>/templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4Ke2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9]]></data>
  </file>
  <file>
    <filename>/templates/remotecontent.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGJyLz4KPGNlbnRlcj48aDE+eyR0aXRsZX08L2gxPjwvY2VudGVyPgo8cD48Yj57JG1vZHVsZXRleHR9PC9iPjombmJzcDt7JG1vZHVsZW5hbWV9PC9wPgo8cD48Yj57JHZlcnRleHR9PC9iPjombmJzcDt7JG1vZHVsZXZlcnNpb259PC9wPgo8cD48Yj57JHhtbHRleHR9PC9iPjombmJzcDt7JHhtbGZpbGV9PC9wPgo8aHIvPgp7JGNvbnRlbnR9Cg==]]></data>
  </file>
</module>
