<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>Orm</name>
	<version>0.0.2</version>
  <mincmsversion>1.11.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5tb3JlIGluZm9ybWF0aW9ucyBvbiA6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tcyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tczwvYT48L3A+DQo8aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtJmVncmF2ZTt0cmUgdXRpbGlzJmVhY3V0ZTsgcG91ciBzcCZlYWN1dGU7Y2lmaWVyIGRhbnMgcXVlbGxlIGxhbmd1ZSBhZmZpY2hlciBsZSBtb2R1bGUgZGFucyBsYSBwYXJ0aWUgcHVibGlxdWUuIENlIHBhcmFtJmVncmF2ZTt0cmUgbiYjMDM5O2VzdCBwYXMgc3VwcG9ydCZlYWN1dGU7IG91IHV0aWxlIHBvdXIgdG91cyBsZXMgbW9kdWxlcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4wLjI8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjxiciAvPg==]]></about>
	<description><![CDATA[This module implements a small ORM layer for other modules]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLyoqCiAqIEEgU2ltcGxlIGR1bW15IGZpbGUgZm9yIGFuIGFkbWluIGludGVyZmFjZQogKiovClRyYWNlOjp3YXJuKCJpdCBzaG91bGQgd29yayA6KSIpOwoKPz4=]]></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[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdTaW1wbGUgT3JtJzsNCiRsYW5nWydwb3N0aW5zdGFsbCddID0gJyc7DQokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSB1bmluc3RhbGxlZCwgYnllICEiJzsNCiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnUmVhbGx5PyBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdW5pbnN0YWxsIHRoaXMgZmluZSBtb2R1bGU/JzsNCiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOw0KJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOw0KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHNtYWxsIE9STSBsYXllciBmb3Igb3RoZXIgbW9kdWxlcyc7DQokbGFuZ1snY2hhbmdlbG9nJ10gPSAnc2VlIGNoYW5nZWxvZyA6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tcyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tczwvYT4nOw0KJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4NCjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjwvcD4NCic7DQo/Pg0K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIHdpY2ggcHJvdmlkZSBhIG1pbmkgY2FjaGluZyBzeXN0ZW0gb2YgT3JtIHRvIGF2b2lkIG11bHRpcGxlcyBzcWwgcmVxdWVzdHMNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCg0KLyoqDQogKg0KICogIFN0YXRpYyBjbGFzc2UgdXNlZCB0byBwcm92aWRlIGEgdmVyeSBzaW1wbGUgY2FjaGluZyBzeXN0ZW0uIFlvdSBjYW4gcHVzaCB0aGUgcmVzdWx0IG9mIGEgcmVxdWVzdCBpbnRvIGl0IGFuZCBhc2tpbmcgbGF0ZXINCiAqCXRvIGNvbGxlY3QgdGhlIHJlc3VsdC4NCiAqDQogKiAgRXhhbXBsZSA6IA0KICogIDxjb2RlPg0KICogIAkvL0NhbGwgdG8gY21zbXMgdG8gZ2V0IHRoZSBkYXRhYmFzZSBjb25uZWN0b3INCiAqICAJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCiAqICAJDQogKiAgCS8vRGVmaW5lcyBhIG5ldyBDdXN0b21lciBlbnRpdHkNCiAqICAJJGVudGl0eSA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCdteU1vZHVsZScsICdjdXN0b21lcicpOw0KICogIAkNCiAqICAJLy9TZWxlY3QgYWxsIEN1c3RvbWVycw0KICogIAkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0ICogRlJPTSAnLiRlbnRpdHktPmdldERibmFtZSgpOw0KICogIAkNCiAqICAJLy9JZiB0aGUgY2FjaGluZyBzeXN0ZW0gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgOiB3ZSByZXR1cm4gdGhlIHJlc3VsdCBpbW1lZGlhdGVseQ0KICogIAlpZihDYWNoZTo6aXNDYWNoZSgkcXVlcnlTZWxlY3QpKQ0KICogIAl7DQogKiAgCQlyZXR1cm4gQ2FjaGU6OmdldENhY2hlKCRxdWVyeVNlbGVjdCk7DQogKiAgCX0NCiAqICAJDQogKiAgCS8vU28gd2UgbmVlZCB0byBleGVjdXRlIHRoZSBxdWVyeQ0KICogIAkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCk7DQogKiAgCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7ZGllKCJEYXRhYmFzZSBlcnJvciEiKTt9DQogKiAgCQ0KICogIAkkZW50aXR5cyA9IGFycmF5KCk7DQogKiAgCXdoaWxlICgkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkNCiAqICAJew0KICogIAkJJGVudGl0eXNbXSA9IENvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHksICRyb3cpOw0KICogIAl9DQogKiAgCQ0KICogIAkvL0Rvbid0IGZvcmdldCB0byBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGluZyBzeXN0ZW0gZm9yIHRoZSBuZXh0IGNhbGwNCiAqICAJQ2FjaGU6OnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOw0KIA0KICogIAlyZXR1cm4gJGVudGl0eXM7DQogKgk8L2NvZGU+DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KZmluYWwgY2xhc3MgQ2FjaGUgDQp7CQ0KCS8qKg0KCSAqIENvbnRhaW5zIGFsbCB0aGUgcmVzdWx0IGZvciB0aGUgcGFzdCByZXF1ZXRlcw0KCSAqKi8NCglwcml2YXRlIHN0YXRpYyAkY2FjaGU7DQoJCQ0KCS8qKg0KCSAqIFByaXZhdGUgY29uc3RydWN0b3INCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQ0KCQkJDQoJLyoqDQoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0DQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKiBAcGFyYW0gb2JqZWN0IHRoZSByZXN1bHQNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsLCAkdmFsdWUpDQoJewkJDQoJCWlmKCFpc3NldChzZWxmOjokY2FjaGUpKQ0KCQl7DQoJCQlzZWxmOjokY2FjaGUgPSBhcnJheSgpOw0KCQl9DQoJCQ0KCQlzZWxmOjokY2FjaGVbQ2FjaGU6Omhhc2goJHNxbCwkcGFyYW1zKV0gPSAkdmFsdWU7DQoJCQ0KCX0NCgkNCgkvKioNCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gb2JqZWN0IHRoZSByZXN1bHQNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKQ0KCXsNCgkJaWYoQ2FjaGU6OmlzQ2FjaGUoJHNxbCwgJHBhcmFtcykpDQoJCXsNCgkJCXJldHVybiBzZWxmOjokY2FjaGVbQ2FjaGU6Omhhc2goJHNxbCwkcGFyYW1zKV07DQoJCX0NCgkJDQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybiB0cnVlIGlmIGEgY2FjaGUgZXhpc3QgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMNCgkgKi8JDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKQ0KCXsNCgkJcmV0dXJuIGlzc2V0KHNlbGY6OiRjYWNoZSkgJiYgYXJyYXlfS0VZX2V4aXN0cyhDYWNoZTo6aGFzaCgkc3FsLCRwYXJhbXMpLHNlbGY6OiRjYWNoZSk7DQoJfQ0KDQoJLyoqDQoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcmluZywgdGhlIHN5c3RlbSBtYXkgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgc29tZSBkYXRhIGluIHRoZSBkYXRhYmFzZQ0KCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4NCgkgKi8JDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBjbGVhckNhY2hlKCkNCgl7DQoJCXNlbGY6OiRjYWNoZT1udWxsOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybiBhIHVuaXF1ZSBoYXNoIGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycw0KCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gc3RyaW5nIHRoZSBoYXNoDQoJICovCQ0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaGFzaCgkc3FsLCAkcGFyYW1zID0gbnVsbCkNCgl7DQoJCWlmKCRwYXJhbXMgPT0gbnVsbCkNCgkJe3JldHVybiBtZDUoJHNxbCk7fQ0KCQkNCgkJJHAgPSBwcmludF9yKCRwYXJhbXMsIHRydWUpOw0KDQoJCXJldHVybiBtZDUoJHNxbC4kcCk7DQoJfQ0KDQoJCQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.cast.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIHdpdGggYWxsIHRoZSBkaWZmZXJlbnQgdHlwZSBmb3IgdGhlIGZpZWxkIGludG8gZGF0YWJhc2UNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCg0KLyoqDQogKiBDbGFzcyBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgaW4gZW50aXR5IGJ1dCBhbHNvIGluIGRhdGFiYXNlDQogKiANCiAqICBDQVNUOjokU1RSSU5HIGEgc2ltcGxlIHN0cmluZw0KICogIENBU1Q6OiRJTlRFR0VSIGFuIGludGVnZXINCiAqICBDQVNUOjokREFURSBhIGZpZWxkIGRhdGUNCiAqICBDQVNUOjokVElNRSBhIGZpZWxkIHRpbWUNCiAqICBDQVNUOjokVFMgYSBmaWVsZCB0aW1lc3RhbXANCiAqICBDQVNUOjokQlVGRkVSIGEgZmllbGQgd2l0aCBubyBsaW1pdCBvZiBzaXplIChleGNlcHQgdGhlIG15c3FsIG5hdHVyYWwgbGltaXQpDQogKiAgQ0FTVDo6JE5VTUVSSUMgYSBmaWVsZCBmb3IgYSByZWFsIG51bWJlciAoZWcgOiB3aXRoIGNvbWEpDQogKiAgQ0FTVDo6JE5PTkUgYSBUcmFuc2lhbnQgZmllbGQgOiB3b24ndCBiZSBwZXJzaXN0IGludG8gZGF0YWJhc2UNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgQ0FTVA0Kew0KCXB1YmxpYyBzdGF0aWMgJFNUUklORyA9IDA7DQoJcHVibGljIHN0YXRpYyAkSU5URUdFUiA9IDE7DQoJcHVibGljIHN0YXRpYyAkREFURSA9IDI7DQoJcHVibGljIHN0YXRpYyAkQlVGRkVSID0gMzsNCglwdWJsaWMgc3RhdGljICROVU1FUklDID0gNDsNCglwdWJsaWMgc3RhdGljICRUSU1FID0gNTsNCglwdWJsaWMgc3RhdGljICRUUyA9IDY7DQoJcHVibGljIHN0YXRpYyAkTk9ORSA9IDk7DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.core.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIENvcmUNCiAqIA0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KIA0KIA0KLyoqDQogKiBNYWluIHBhcnQgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIENtc21hZGVzaW1wbGUgbmF0aXZlcyBmdW5jdGlvbiBhbmQgdGhlIG5lY2Vzc2l0eSBmb3IgdGhlIE9ybSBmdW5jdGlvbnMNCiAqICAgDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgQ29yZSANCnsgIA0KICAgIC8qKg0KICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yDQogICAgKiAgICAgDQogICAgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQ0KICAgICAgDQogICAgLyoqDQogICAgKiB0cmFuc2Zvcm1zIHRoZSBlbnRpdHkncyBzdHJ1Y3R1cmUgaW50byBhZG9kYiBpbmZvcm1hdGlvbnMgDQogICAgKiAgICAgICAgIA0KICAgICogQHBhcmFtIEVudGl0eSB0aGUgZW50aXR5DQogICAgKiBAcmV0dXJuIHRoZSBhZG9kYiBpbmZvcm1hdGlvbnMNCiAgICAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0RmllbGRzVG9IcWwoRW50aXR5ICYkZW50aXR5KQ0KCXsgICAgDQoJCSRocWwgPSAnJzsNCg0KCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHktPmdldEZpZWxkcygpOw0KDQoJCS8vRm9yIGVhY2ggRmllbGQgY29udGFpbmVkIGluIHRoZSBlbnRpdHkNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsNCgkJCS8vV2UgZG9uJ3QgY3JlYXRlIHRoZSBGaWVsZCB3aGljaCBhcmUgbGlua3MgZXh0ZXJuYWxzIG9uIGFzc29jaWF0aXZlIHRhYmxlcw0KCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7DQoJCQkJY29udGludWU7DQoJCQl9CQ0KCQkJDQoJCQkvL1dlIGRvbid0IGNyZWF0ZSB0aGUgdHJhbnNpZW50IEZpZWxkcyANCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IENBU1Q6OiROT05FKSB7DQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCWlmKCFlbXB0eSgkaHFsKSkgew0KCQkJCSRocWwgLj0gJyAsICc7DQoJCQl9DQoNCgkJCSRocWwgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsNCg0KCQkJc3dpdGNoKCRmaWVsZC0+Z2V0VHlwZSgpKSB7DQoJCQkJY2FzZSBDQVNUOjokU1RSSU5HIDogDQoJCQkJCSRocWwgLj0gJ0MnOyANCgkJCQkJaWYoJGZpZWxkLT5nZXRTaXplKCkgIT0gIiIgKSB7JGhxbC49ICIgKCIuJGZpZWxkLT5nZXRTaXplKCkuIikgIjt9IA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgQ0FTVDo6JElOVEVHRVIgOiANCgkJCQkJJGhxbCAuPSAnSSc7IA0KCQkJCQlpZigkZmllbGQtPmdldFNpemUoKSAhPSAiIiApIHskaHFsLj0gIiAoIi4kZmllbGQtPmdldFNpemUoKS4iKSAiO30gDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSBDQVNUOjokTlVNRVJJQyA6IA0KCQkJCQkkaHFsIC49ICdOJzsgDQoJCQkJCWlmKCRmaWVsZC0+Z2V0U2l6ZSgpICE9ICIiICkNCgkJCQkJeyRocWwuPSAiICgiLiRmaWVsZC0+Z2V0U2l6ZSgpLiIpICI7fSANCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIENBU1Q6OiRCVUZGRVIgOiAkaHFsIC49ICdYJzsgYnJlYWs7DQoNCgkJCQljYXNlIENBU1Q6OiREQVRFIDogJGhxbCAuPSAnRCc7IGJyZWFrOw0KDQoJCQkJY2FzZSBDQVNUOjokVElNRSA6ICRocWwgLj0gJ1QnOyBicmVhazsgICANCg0KCQkJCWNhc2UgQ0FTVDo6JFRTIDogJGhxbCAuPSAnSSAoMTApICc7IGJyZWFrOyAvL3dvcmthcm91bmQgZm9yIHRoZSByZWFsIHRpbWVzdGFtcCBtaXNzaW5nIGluIEFET0RCTElURQ0KCQkJfQ0KDQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKQ0KCQkJew0KCQkJCSRocWwgLj0gJyBLRVkgJzsNCgkJCX0NCgkJCQkNCgkJfQ0KDQoJCVRyYWNlOjppbmZvKCRocWwpOw0KDQoJCXJldHVybiAkaHFsOw0KCX0NCg0KICAgIC8qKg0KICAgICogQ3JlYXRlIGEgdGFibGUgaW50byBEYXRhYmFzZSBmcm9tIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gRW50aXR5DQogICAgKiAgV2lsbCBhbHNvIGNyZWF0ZSB0aGUgc2VxdWVuY2UgaWYgaXQncyBuZWVkZWQNCiAgICAqICANCiAgICAqICAgZXhhbXBsZSB3aXRoIGEgQ3VzdG9tZXIgZW50aXR5IDogDQogICAgKiA8Y29kZT4NCiAgICAqIA0KICAgICogY2xhc3MgQ3VzdG9tZXIgZXh0ZW5kcyBFbnRpdHkNCiAgICAqIHsNCiAgICAqICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgKiAgICB7DQogICAgKiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAqICAgICAgICANCiAgICAqICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnY3VzdG9tZXJfaWQnICANCgkqCQkJLCBDQVNUOjokSU5URUdFUg0KCSoJCQksIG51bGwNCgkqCQkJLCBudWxsDQoJKgkJCSwgS0VZOjokUEsgDQoJKgkJCSkpOw0KICAgICogDQogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ25hbWUnDQogICAgKiAgICAgICAgCSwgQ0FTVDo6JFNUUklORyANCiAgICAqICAgICAgICAJLCAzMg0KICAgICogICAgICAgIAkpKTsNCiAgICAqIA0KICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdsYXN0bmFtZScNCiAgICAqICAgICAgICAJLCBDQVNUOjokU1RSSU5HDQogICAgKiAgICAgICAgCSwgMzINCgkqCQkJLCB0cnVlICAvLyBJcyBudWxsYWJsZQ0KICAgICogICAgICAgIAkpKTsNCiAgICAqICAgIH0NCiAgICAqIH0NCiAgICAqIDwvY29kZT4NCiAgICAqIA0KICAgICogIFRoZSBiZXN0IHdheSB0byBjcmVhdGUgaXRzIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlIDogDQogICAgKiANCiAgICAqIDxjb2RlPg0KICAgICogICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAqICAgQ29yZTo6Y3JlYXRlVGFibGUoJGN1c3RvbWVyKTsNCiAgICAqIDwvY29kZT4NCiAgICAqIA0KICAgICogIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gdHJ5IHRvIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaW5pdFRhYmxlKCkgaWYgaXQncyBkZWZpbmUgaW50byB0aGUgZW50aXR5IGNsYXNzLg0KICAgICogDQoJKiBAcGFyYW0gT3JtIHRoZSBtb2R1bGUgd2hpY2ggZXh0ZW5kcyB0aGUgT3JtIG1vZHVsZQ0KICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKEVudGl0eSAmJGVudGl0eVBhcmFtKQ0KCXsNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJHRhYm9wdGFycmF5ID0gYXJyYXkoICdteXNxbCcgPT4gJ0VOR0lORSBNeUlTQU0gQ0hBUkFDVEVSIFNFVCB1dGY4IENPTExBVEUgdXRmOF9nZW5lcmFsX2NpJyk7DQoJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOw0KCQkkaHFsID0gQ29yZTo6Z2V0RmllbGRzVG9IcWwoJGVudGl0eVBhcmFtKTsNCgkJDQoJCS8vQ2FsbGluZyB0aGUgYWRvZGIgZnVuY3Rpb25hbGl0aWVzDQoJCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTCgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpLCANCgkJCQkJCQkJCQkJCSRocWwsDQoJCQkJCQkJCQkJCQkkdGFib3B0YXJyYXkpOw0KCQkJCQkJCQkJCQkJDQoJCSRyZXN1bHQgPSAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7DQoNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKQ0KCQl7DQoJCQlUcmFjZTo6ZXJyb3IoJGhxbC4nPGJyLz4nKTsNCgkJCVRyYWNlOjplcnJvcigiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGR1cmFudCBsYSBjcmVhdGlvbiBkZSBsYSB0YWJsZSBwb3VyIGwnZW50aXTDqSAiIC4gJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJGRiLT5FcnJvck1zZygpKTsNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRhdGFiYXNlIGVycm9yIGR1cmFudCBkdXJhbnQgbGEgY3JlYXRpb24gZGUgbGEgdGFibGUgcG91ciBsJ2VudGl0w6kgIiAuICRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLiRkYi0+RXJyb3JNc2coKSk7DQoJCX0NCgkJICAgDQoJCVRyYWNlOjpkZWJ1ZygiY3JlYXRlVGFibGUgOiAiLnByaW50X3IoJHNxbGFycmF5LCB0cnVlKS4nPGJyLz4nKTsNCg0KCQkvL0lmIG5lY2Vzc2FyeSwgaXQgd2lsbCBjcmVhdGUgYSBzZXF1ZW5jZSBvbiB0aGUgdGFibGUuDQoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpeyRkYi0+Q3JlYXRlU2VxdWVuY2UoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpO30NCg0KCQkvL1dlIGluaXRpYXRlIHRoZSB0YWJsZS4NCgkJJGVudGl0eVBhcmFtLT5pbml0VGFibGUoKTsNCgl9DQogICAgDQogICAgLyoqDQogICAgKiBEcm9wIHRoZSB0YWJsZSBmb3IgdGhlIEVudGl0eSBpbiBwYXJhbWV0ZXJzDQogICAgKiAgV2lsbCBhbHNvIGRyb3AgdGhlIHNlcXVlbmNlIGlmIGl0J3MgbmVlZGVkDQogICAgKiANCiAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wVGFibGUoRW50aXR5ICYkZW50aXR5UGFyYW0pDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoNCgkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7DQoNCgkJJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCgkZW50aXR5UGFyYW0tPmdldERibmFtZSgpKTsNCgkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOw0KDQoJCS8vSWYgbmVjZXNzYXJ5LCBpdCB3aWxsIGRlbGV0ZSBhIHNlcXVlbmNlIG9uIHRoZSB0YWJsZS4NCgkJaWYoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkgIT0gbnVsbCl7JGRiLT5Ecm9wU2VxdWVuY2UoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpO30NCgl9ICANCiAgDQogICAgLyoqDQogICAgKiBXaWxsIGVkaXQgdGhlIHRhYmxlIG9mIHRoZSBFbnRpdHkgaW4gcGFyYW1ldGVycyB3aXRoIHRoZSBTUUwgcXVlcnkgaW4gcGFyYW1ldGVycw0KICAgICogDQogICAgKiAgIGV4YW1wbGUgOiBpZiB5b3UgbmVlZCB0byBkbyANCiAgICAqIA0KICAgICogPGNvZGU+ICAgICAgICANCiAgICAqICAgQUxURVIgVEFCTEUgYCB0YWJsZSBvZiB0aGUgQ3VzdG9tZXIgZW50aXR5IGAgQUREIGBuZXdDb2x1bW5gIElOVCBOT1QgTlVMTCANCiAgICAqICAgQUxURVIgVEFCTEUgYCB0YWJsZSBvZiB0aGUgQ3VzdG9tZXIgZW50aXR5IGAgRFJPUCBgb2xkQ29sdW1uYCANCiAgICAqIDwvY29kZT4NCiAgICAqIA0KICAgICogIHRoZSBjb2RlIG11c3QgYmUgOg0KICAgICogDQogICAgKiA8Y29kZT4NCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICogICAgICAgQ29yZTo6YWx0ZXJUYWJsZSgkY3VzdG9tZXIsICJBREQgYG5ld0NvbHVtbmAgSU5UIE5PVCBOVUxMIik7DQogICAgKiAgICAgICBDb3JlOjphbHRlclRhYmxlKCRjdXN0b21lciwgIkRST1AgYG9sZENvbHVtbmAiKTsNCiAgICAqIDwvY29kZT4NCiAgICAqICAgDQogICAgKiANCiAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICogQHBhcmFtIHN0cmluZyB0aGUgU1FMIHF1ZXJ5DQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGFsdGVyVGFibGUoRW50aXR5ICYkZW50aXR5UGFyYW0sICRzcWwpDQoJew0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOw0KCQkJDQoJCSRxdWVyeUFsdGVyID0gIkFMVEVSIFRBQkxFICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4iICIuJHNxbDsgICAgDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5QWx0ZXIpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGwnYWx0ZXIgZGUgbGEgdGFibGUgJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKSEiKTt9DQoJfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEluc2VydCBkYXRhIGludG8gZGF0YWJhc2UuDQogICAgICogDQogICAgICogRXhhbXBsZSBmb3IgYSBuZXcgQ3VzdG9tZXIgOiBjdXN0b21lcl9pZCwgbmFtZSwgbGFzdE5hbWUgKG9wdGlvbmFsKSANCiAgICAgKiAgIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICAqICAgICAgIA0KICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCduYW1lJywnRHVyYW50Jyk7DQogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ2xhc3ROYW1lJz0+J0pvaG4nKTsNCiAgICAgKiANCiAgICAgKiAgICAgICBDb3JlOjppbnNlcnRFbnRpdHkoJGN1c3RvbWVyKTsNCiAgICAgKiA8L2NvZGU+DQoJICoNCgkgKiBZb3UgY291bGQgYWxzbyBjb2RlIGZvciB0aGUgbGFzdCBsaW5lIDogJGN1c3RvbWVyLT5zYXZlKCk7ICBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgDQogICAgICogDQogICAgICogSW1wb3J0YW50IDogeW91IG11c3Qgbm90IHNldCB0aGUgcHJpbWFyeUtleSB2YWx1ZS4gSXQgd2lsbCBiZSBjYWxjdWxhdGUgYnkgdGhlIHN5c3RlbSBpdC1zZWxmDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KCSAqDQogICAgICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpDQogICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpbnNlcnRFbnRpdHkoRW50aXR5ICYkZW50aXR5UGFyYW0pDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCgkJJGxpc3RlVmFsdWVzID0gJGVudGl0eVBhcmFtLT5nZXRWYWx1ZXMoKTsNCg0KCQkkcXVlcnlJbnNlcnQgPSAnSU5TRVJUIElOVE8gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgKCVzKSB2YWx1ZXMgKCVzKSc7DQoNCgkJJHN0cjEgPSAiIjsNCgkJJHN0cjIgPSAiIjsNCg0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJCSAgIA0KCQkvL0FsbCB0aGUgcmVxdWlyZWQgdmFsdWVzIG11c3QgYmUgcHJlc2VudA0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7DQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCWlmKCFlbXB0eSgkc3RyMSkpIHsNCgkJCQkkc3RyMSAuPSAnLCc7DQoJCQkJJHN0cjIgLj0gJywnOw0KCQkJfQ0KCQkJJHN0cjEgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsNCgkJCSRzdHIyIC49ICc/JzsNCgkJCQ0KCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgew0KCQkJCWlmKCFlbXB0eSgkbGlzdGVWYWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSkgew0KCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCdQcmltYXJ5IEtleSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgY2FuXCd0IGJlIHNldHRlZCBkdXJpbmcgaW5zZXJ0IG9wZXJhdGlvbiBmb3IgRW50aXR5Jy4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG5ld0lkID0gJGRiLT5HZW5JRCgkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSk7DQoJCQkJCSRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAkbmV3SWQ7DQoJCQkJCSRlbnRpdHlQYXJhbS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAkbmV3SWQpOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy9FbXB0eSBGaWVsZCB0aGF0IHNob3VsZG4ndCBiZSAhDQoJCQlpZighJGZpZWxkLT5pc051bGxhYmxlKCkgJiYgIWlzc2V0KCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7DQoJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBFbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgbnVsbCcpOw0KCQkJfQ0KCQkJDQoJCQkkdmFsID0gbnVsbDsNCgkJCWlmKGlzc2V0KCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKQ0KCQkJew0KCQkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHBhcmFtc1tdID0gbnVsbDsNCgkJCX0NCgkJfQ0KCQkgIAkJICANCgkJLy9FeGVjdXRpb24NCgkJJGRiLT5kZWJ1ZyA9IHRydWU7DQoNCgkJVHJhY2U6OmRlYnVnKCJpbnNlcnRFbnRpdHkgOiAiLnNwcmludGYoJHF1ZXJ5SW5zZXJ0LCAkc3RyMSwgJHN0cjIpKTsNCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZShzcHJpbnRmKCRxdWVyeUluc2VydCwgJHN0cjEsICRzdHIyKSwgJHBhcmFtcyk7DQoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSkgew0KCQkJVHJhY2U6OmVycm9yKHByaW50X3IoJHBhcmFtcywgdHJ1ZSkuJzxici8+Jyk7DQoJCQlUcmFjZTo6ZXJyb3Ioc3ByaW50ZigkcXVlcnlJbnNlcnQsICRzdHIxLCAkc3RyMikuJzxici8+Jyk7DQoJCQlUcmFjZTo6ZXJyb3IoIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsJ2luc2VydCEiLiRkYi0+RXJyb3JNc2coKSk7DQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEYXRhYmFzZSBlcnJvciBkdXJhbnQgbCdpbnNlcnQhIi4kZGItPkVycm9yTXNnKCkpOw0KCQl9DQoNCgkJaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKSB7ICANCgkJCUluZGV4aW5nOjpBZGRXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgQ29yZTo6ZmluZEJ5SWQoJGVudGl0eVBhcmFtLCRhcnJheUtFWVswXSkpOw0KCQl9DQoJCQ0KCQkvL2VtcHR5IGNhY2hlDQoJCUNhY2hlOjpjbGVhckNhY2hlKCk7DQoJCQ0KCQlyZXR1cm4gJGVudGl0eVBhcmFtOw0KDQoJfQ0KCQ0KICAgIC8qKg0KICAgICAqICBVcGRhdGUgZGF0YSBpbnRvIGRhdGFiYXNlLiBUaGUgdGhpcmQgcGFyYW1ldGVyIG11c3QgZm9sbG93IHRoaXMgc2NoZW1lDQogICAgICogDQogICAgICogRXhhbXBsZSBmb3IgYSBuZXcgQ3VzdG9tZXIgOiANCiAgICAgKiANCiAgICAgKiA8Y29kZT4NCiAgICAgKiAgICAgICAkbXlBcnJheSA9IGFycmF5KCk7DQogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjEsICdsYXN0TmFtZSc9Pm51bGwsICduYW1lJz0+J0R1cG9udCcpOyAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUsIGVyYXNlIGxhc3ROYW1lIHZhbHVlIGluIGRhdGFiYXNlDQogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjIsICduYW1lJz0+J0R1cmFudCcpOyAgICAgICAgICAgICAgICAgICAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUNCiAgICAgKiAgICAgICAkbXlBcnJheVtdID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MywgJ2xhc3ROYW1lJz0+J0pvaG4nLCAnbmFtZSc9PidEb2UnKTsgICAgIDwtLSB1cGRhdGUgTmFtZSB2YWx1ZSBhbmQgbGFzdE5hbWUgdmFsdWUNCiAgICAgKiANCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAgKiAgICAgICANCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBDb3JlOjpmaW5kQnlJZCgkY3VzdG9tZXIsIDEpOw0KICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCdsYXN0TmFtZSc9PidOZXdMYXN0TmFtZScpOw0KICAgICAqIA0KICAgICAqICAgICAgIENvcmU6OnVwZGF0ZUVudGl0eSgkY3VzdG9tZXIpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiAJIA0KICAgICAqIFlvdSBjb3VsZCBhbHNvIGNvZGUgZm9yIHRoZSBsYXN0IGxpbmUgOiAkY3VzdG9tZXItPnNhdmUoKTsgIGl0IHdpbGwgYXV0b21hdGljYWxseSANCgkgKg0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KCSAqDQoJICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkNCiAgICAgKi8JDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiB1cGRhdGVFbnRpdHkoRW50aXR5ICYkZW50aXR5UGFyYW0pDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCgkJJHZhbHVlcyA9ICRlbnRpdHlQYXJhbS0+Z2V0VmFsdWVzKCk7DQoNCgkJJHN0ciA9ICIiOw0KCQkkd2hlcmUgPSAnJzsNCgkJJHBhcmFtcyA9IGFycmF5KCk7DQoJCSRoYXNLZXkgPSBmYWxzZTsNCgkJICANCgkJLy9BbGwgdGhlIHJlcXVpcmVkIHZhbHVlcyBtdXN0IGJlIHByZXNlbnQNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsNCgkJDQoJCQkvL0lmIGl0J3Mgbm90IHNldA0KCQkJaWYoZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7DQoJCQkNCgkJCQkvL0lmIGl0J3MgYSBwcmltYXJ5S2V5IHdlIHRocm93IGEgZXhjZXB0aW9uDQoJCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgew0KCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgcHJpbWFyeUtleSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgaXMgbWlzc2luZyBmb3IgdGhlIGVudGl0eSA6ICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpOw0KCQkJCX0NCgkJCQkNCgkJCQkvL2FuIGVtcHR5IGFzc29jaWF0aXZlIGZpZWxkIDogbm8gcHJvYmxlbSwgd2UgY2FuIHBhc3MNCgkJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpDQoJCQkJew0KCQkJCQljb250aW51ZTsNCgkJCQl9DQoJCQkJDQoJCQkJLy9JZiBpdCdzIGEgbm8gbnVsbGFibGUgZmllbGQgd2UgdGhyb3cgYSBleGNlcHRpb24NCgkJCQlpZighJGZpZWxkLT5pc051bGxhYmxlKCkpIHsNCgkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBpcyBub3QgbnVsbGFibGUgZm9yIHRoZSBlbnRpdHkgOiAnLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCS8vSWYgaXQncyBhIHByaW1hcnlLZXkNCgkJCWlmKCRmaWVsZC0+aXNQcmltYXJ5S0VZKCkpIHsNCgkJCQkkd2hlcmUgPSAnIFdIRVJFICcuJGZpZWxkLT5nZXROYW1lKCkuJyA9ID8nOw0KCQkJCSRoYXNLZXkgPSB0cnVlOw0KCQkJCSRrZXlWYWx1ZSA9ICR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldOw0KCQkJfQ0KDQoJCQlpZighZW1wdHkoJHN0cikpIHsNCgkJCSAgJHN0ciAuPSAnLCc7DQoJCQl9DQoNCgkJCSRzdHIgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgPSA/ICc7DQoNCgkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldLCAkZmllbGQtPmdldFR5cGUoKSk7DQoNCgkJfQ0KDQoJCWlmKCRoYXNLZXkpIHsNCgkJCSRwYXJhbXNbXSA9ICRrZXlWYWx1ZTsNCgkJfQ0KDQoJCSRxdWVyeVVwZGF0ZSA9ICdVUERBVEUgJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgU0VUICcuJHN0ci4kd2hlcmU7DQoNCgkJLy9FeGVjdXRpb24NCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlVcGRhdGUsICRwYXJhbXMpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGwndXBkYXRlISIpO30NCgkJaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKSB7ICANCgkJCUluZGV4aW5nOjpVcGRhdGVXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgJGVudGl0eVBhcmFtKTsNCgkJfQ0KCQkNCgkJLy9lbXB0eSBjYWNoZQ0KCQlDYWNoZTo6Y2xlYXJDYWNoZSgpOw0KCQkNCgkJcmV0dXJuICRlbnRpdHlQYXJhbTsNCgl9DQogIA0KICAgIC8qKg0KICAgICogRGVsZXRlIGluZm9ybWF0aW9uIGludG8gZGF0YWJhc2UNCiAgICAqICAgDQogICAgKiBFeGFtcGxlIGZvciBhIHNpbmdsZSBkZWxldGlvbiA6IA0KICAgICogDQogICAgKiA8Y29kZT4NCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICogDQogICAgKiAgICAgICBDb3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsIGFycmF5KDEpOw0KICAgICogPC9jb2RlPg0KICAgICogDQogICAgKiAgRXhhbXBsZSBmb3IgbXVsdGlwbGUgZGVsZXRpb24gOiANCiAgICAqIA0KICAgICogPGNvZGU+DQogICAgKiAgICAgICAkbXlBcnJheSA9IGFycmF5KCk7DQogICAgKiAgICAgICAkbXlBcnJheVtdID0gMTsNCiAgICAqICAgICAgICRteUFycmF5W10gPSAyOw0KICAgICogICAgICAgJG15QXJyYXlbXSA9IDM7DQogICAgKiANCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICogDQogICAgKiAgICAgICBDb3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsICRteUFycmF5KTsNCiAgICAqIDwvY29kZT4NCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgICAgDQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSBpZHMgdG8gZGVsZXRlICgkY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZGVsZXRlQnlJZHMoRW50aXR5ICYkZW50aXR5UGFyYW0sICRpZHMpDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkgIGlmKCEkZmllbGQtPmlzUHJpbWFyeUtFWSgpKQ0KCQkgIHsgDQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgJHR5cGUgPSAkZmllbGQtPmdldFR5cGUoKTsNCgkJICAkbmFtZSA9ICRmaWVsZC0+Z2V0TmFtZSgpOw0KCQl9ICANCg0KCQkkd2hlcmUgPSAnJzsNCgkJZm9yZWFjaCgkaWRzIGFzICRzaWQpDQoJCXsNCgkJICBpZighZW1wdHkoJHdoZXJlKSkNCgkJICB7DQoJCQkkd2hlcmUgLj0gJyBPUiAnOw0KCQkgIH0NCgkJICANCgkJICAkd2hlcmUgLj0gJG5hbWUuJyA9ID8nOw0KCQkgICRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRzaWQsICR0eXBlKTsgIA0KCQl9DQoNCg0KCQkkcXVlcnlEZWxldGUgPSAnREVMRVRFIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJy4kd2hlcmU7DQoNCgkJLy9FeGVjdXRpb24NCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlEZWxldGUsICRwYXJhbXMpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHN1cHByZXNzaW9uISIpO30NCg0KCQlpZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpDQoJCXsgIA0KCQkgIC8vICRtb2RvcHMgPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCk7DQoJCSAgLy8gaWYobWV0aG9kX2V4aXN0cygkbW9kb3BzLCJHZXRTZWFyY2hNb2R1bGUiKSkNCgkJICAvLyB7DQoJCQkvLyBJbmRleGluZzo6c2V0U2VhcmNoKCRtb2RvcHMtPkdldFNlYXJjaE1vZHVsZSgpKTsNCgkJICAvLyB9IGVsc2UNCgkJICAvLyB7DQoJCQkvLyBkaWUoImtvIik7DQoJCSAgLy8gfQ0KCQkgIGZvcmVhY2goJGlkcyBhcyAkc2lkKQ0KCQkgIHsNCgkJCUluZGV4aW5nOjpEZWxldGVXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgJGVudGl0eVBhcmFtLCAkc2lkKTsNCgkJICB9DQoJCSAgDQoJCX0NCgkJDQoJCS8vZW1wdHkgY2FjaGUNCgkJQ2FjaGU6OmNsZWFyQ2FjaGUoKTsNCgl9DQogICANCiAgICAvKioNCiAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSBvZiB0aGUgZW50aXR5IGluIFBhcmFtZXRlcnMNCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAgIA0KCSogDQogICAgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGZyb20gdGhlIHRhYmxlICAgDQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNvdW50QWxsKEVudGl0eSAmJGVudGl0eVBhcmFtKQ0KCXsNCg0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOw0KDQoJCSRxdWVyeVNlbGVjdCA9ICdTZWxlY3QgY291bnQoKikgRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCk7DQoNCgkJVHJhY2U6OmRlYnVnKCJjb3VudEFsbCA6ICIuJHF1ZXJ5U2VsZWN0KTsNCgkJICANCgkJJGNvbXB0ZXVyPSAkZGItPmdldE9uZSgkcXVlcnlTZWxlY3QpOw0KCQlpZiAoJGNvbXB0ZXVyID09PSBmYWxzZSl7ZGllKCJEYXRhYmFzZSBlcnJvciBkdXJhbnQgbGEgcmVxdWV0ZSBjb3VudCgqKSEiKTt9DQoNCgkJcmV0dXJuICRjb21wdGV1cjsNCgl9DQogIA0KICAgIC8qKg0KICAgICogUmV0dXJucyBhbGwgdGhlIG9jY3VycmVuY2VzIGZyb20gdGhlIHRhYmxlIG9mIHRoZSBlbnRpdHkgaW4gUGFyYW1ldGVycw0KICAgICogDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIA0KCSoNCiAgICAqIEByZXR1cm4gYXJyYXk8RW50aXR5PiBsaXN0IG9mIEVudGl0aWVzIGZvdW5kDQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRBbGwoRW50aXR5ICYkZW50aXR5UGFyYW0pDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoNCgkJJHF1ZXJ5U2VsZWN0ID0gJ1NlbGVjdCAqIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpOw0KDQoJCS8vSWYgaXQncyBhbHJlYWR5IGluIHRoZSBjYWNoZSwgd2UgcmV0dXJuIHRoZSByZXN1bHQNCgkJaWYoQ2FjaGU6OmlzQ2FjaGUoJHF1ZXJ5U2VsZWN0KSkgew0KCQkgIHJldHVybiBDYWNoZTo6Z2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0KTsNCgkJfSANCgkJICANCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlTZWxlY3QpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIENvcmU6OmZpbmRBbGwoRW50aXR5ICYkZW50aXR5UGFyYW0pIik7fQ0KDQoJCSRlbnRpdGllcyA9IENvcmU6Ol9wcm9jZXNzQXJyYXlFbnRpdHkoJGVudGl0eVBhcmFtLCAkcmVzdWx0KTsNCgkJDQoJCS8vV2UgcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hlIGJlZm9yZSByZXR1cm4gaXQNCgkJQ2FjaGU6OnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0aWVzKTsNCg0KCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCRlbnRpdGllcyk7DQoJfQ0KCQ0KCS8qKg0KCSAqIElubmVyIGZ1bmN0aW9uIHRvIGZhY3Rvcml6ZSBzb21lIGNvZGUgZm9yIGVhY2ggImZpbmQqIiBmdW5jdGlvbnMNCgkgKiAgSXQgd2lsbCByZXRyaWV2ZSBhbGwgdGhlIGluZm9ybWF0aW9ucyBvbiB0aGUgQUsncyBGaWVsZA0KCSAqDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICANCgkgKiBAcGFyYW0gcmVzdWx0UXVlcnkgdGhlIHJldHVybmVkIHZhbHVlIG9mIHNxbCBleGVjdXRpb24NCgkgKg0KICAgICAqIEByZXR1cm4gYXJyYXk8RW50aXR5PiBsaXN0IG9mIEVudGl0aWVzIHBvcHVsYXRlIHdpdGggYWxsIHRoZSBpbmZvcm1hdGlvbnMgb24gQUsncyBGaWVsZA0KCSAqKi8NCglwcml2YXRlIGZ1bmN0aW9uIF9wcm9jZXNzQXJyYXlFbnRpdHkoRW50aXR5ICYkZW50aXR5UGFyYW0sICRyZXN1bHRRdWVyeSl7DQoJDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCQ0KCQkkZW50aXR5cyA9IGFycmF5KCk7DQoJCXdoaWxlICgkcm93ID0gJHJlc3VsdFF1ZXJ5LT5GZXRjaFJvdygpKSB7DQoJCSAgJGFuRW50aXR5ID0gQ29yZTo6cm93VG9FbnRpdHkoJGVudGl0eVBhcmFtLCAkcm93KTsNCgkJICAkZW50aXR5c1skYW5FbnRpdHktPmdldCgkYW5FbnRpdHktPmdldFBrKCktPmdldE5hbWUoKSldID0gJGFuRW50aXR5Ow0KCQl9DQoJCQkJDQoJCS8vVGVzdCB0aGUgcHJlc2VuY2Ugb2YgJEFLDQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsNCgkJICBpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsNCgkJCQ0KCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuDQoJCQlmb3JlYWNoKGFycmF5X2tleXMoJGVudGl0eXMpIGFzICRrZXkpew0KCQkJCSRlbnRpdHlzWyRrZXldLT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOw0KCQkJfQ0KCQkgIA0KCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7DQoJCQkkZW50aXR5QXNzb2MgPSBuZXcgJGVudGl0eUFzc29jTmFtZSgpOw0KCQkJDQoJCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnLiRlbnRpdHlBc3NvYy0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAnLiRmaWVsZEFzc29jaWF0ZU5hbWUuJyBpbiAoJy5pbXBsb2RlKCcsJyxhcnJheV9rZXlzKCRlbnRpdHlzKSkuJyknOw0KCQkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlBZGQpOw0KCQkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yIGR1cmluZyByZXF1ZXN0IHRvIGdldCBhc3NvY2lhdGl2ZSBlbnRpdHkgJGVudGl0eUFzc29jTmFtZSEiKTt9DQoJCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsNCgkJCQkkYXJyYXlJZEVudGl0aWVzRGVzdCA9ICRlbnRpdHlzWyRyb3dBc3NvY2lhdGVbJGZpZWxkQXNzb2NpYXRlTmFtZV1dLT5nZXQoJGZpZWxkLT5nZXROYW1lKCkpOw0KCQkJCSRhcnJheUlkRW50aXRpZXNEZXN0W10gPSAkcm93QXNzb2NpYXRlWyRlbnRpdHlBc3NvYy0+Z2V0UGsoKS0+Z2V0TmFtZSgpXTsNCgkJCQkkZW50aXR5c1skcm93QXNzb2NpYXRlWyRmaWVsZEFzc29jaWF0ZU5hbWVdXS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCRhcnJheUlkRW50aXRpZXNEZXN0KTsNCgkJCX0NCgkJICB9IA0KCQl9DQoJCQ0KCQlyZXR1cm4gJGVudGl0eXM7DQoJfQ0KICANCgkvKioNCgkqIFJldHVybiBhIEVudGl0eSBmcm9tIGl0cyBJZA0KCSogDQoJKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIA0KCSogQHBhcmFtIGludCB0aGUgSWQgdG8gZmluZA0KCSogQHJldHVybiBFbnRpdHkgdGhlIEVudGl0eSBmb3VuZCBvciBOVUxMDQoJKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUlkKEVudGl0eSAmJGVudGl0eVBhcmFtLCAkaWQpDQoJew0KCQkkbGlzdGUgPSBDb3JlOjpmaW5kQnlJZHMoJGVudGl0eVBhcmFtLCBhcnJheSgkaWQpKTsNCgkJDQoJCWlmKCFpc3NldCgkbGlzdGVbMF0pKXsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoJCQ0KCQlyZXR1cm4gJGxpc3RlWzBdOw0KCX0NCiAgDQoJLyoqDQoJKiBSZXR1cm4gRW50aXRpZXMgZnJvbSB0aGVpciBJZHMNCgkqIA0KCSogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICANCgkqIEBwYXJhbSBhcnJheSBsaXN0IG9mIHRoZSBJZHMgdG8gZmluZA0KCSoNCgkqIEByZXR1cm4gYXJyYXk8RW50aXR5PiBsaXN0IG9mIEVudGl0aWVzIGZvdW5kDQoJKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUlkcyhFbnRpdHkgJiRlbnRpdHlQYXJhbSwgJGlkcykNCgl7DQoJCWlmKGNvdW50KCRpZHMpID09IDApDQoJCSAgcmV0dXJuIGFycmF5KCk7DQoJCQkNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOw0KCQkkd2hlcmUgPSAiIjsNCgkJCQ0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkgew0KCQkgIGlmKCEkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7IA0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIA0KCQkgIGZvcmVhY2goJGlkcyBhcyAkaWQpIHsNCgkJCWlmKCFlbXB0eSgkd2hlcmUpKSB7DQoJCQkgICR3aGVyZSAuPSAnIE9SICc7DQoJCQl9DQoJCQkJICANCgkJCSR3aGVyZSAuPSAkZmllbGQtPmdldE5hbWUoKS4nID0gPyc7DQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkaWQsICRmaWVsZC0+Z2V0VHlwZSgpKTsNCgkJICB9DQoJCX0NCg0KCQkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0ICogRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAnLiR3aGVyZTsNCg0KCQkvL1NpIGTDqWrDoCBwcsOpc2VudCBlbiBjYWNoZSwgb24gbGUgcmV0b3VybmUNCgkJaWYoQ2FjaGU6OmlzQ2FjaGUoJHF1ZXJ5U2VsZWN0LCRwYXJhbXMpKSB7DQoJCSAgcmV0dXJuIENhY2hlOjpnZXRDYWNoZSgkcXVlcnlTZWxlY3QsJHBhcmFtcyk7DQoJCX0NCg0KCQkvL0V4ZWN1dGlvbg0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCwgJHBhcmFtcyk7DQoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7ZGllKCJEYXRhYmFzZSBlcnJvciBkdXJhbnQgbGEgcmVxdWV0ZSBwYXIgSWRzISIpO30NCg0KCQkkZW50aXRpZXMgPSBDb3JlOjpfcHJvY2Vzc0FycmF5RW50aXR5KCRlbnRpdHlQYXJhbSwgJHJlc3VsdCk7DQoJCQ0KCQkvL1dlIHB1c2ggdGhlIHJlc3VsdCBpbnRvIHRoZSBjYWNoZSBiZWZvcmUgcmV0dXJuIGl0DQoJCUNhY2hlOjpzZXRDYWNoZSgkcXVlcnlTZWxlY3QsIG51bGwsICRlbnRpdGllcyk7DQoNCgkJcmV0dXJuIGFycmF5X3ZhbHVlcygkZW50aXRpZXMpOw0KCX0NCiAgDQogICAgLyoqDQogICAgICogQWxsb3cgc2VhcmNoIGEgbGlzdCBvZiBFbnRpdHkgZnJvbSBhIGxpc3Qgb2YgQ3JpdGVyaWENCiAgICAgKiANCiAgICAgKiBFeGFtcGxlIDogZmluZCB0aGUgY3VzdG9tZXJzIHdpdGggbGFzdE5hbWUgJ1JvZ2VyJyAobm8gY2Fzc2Ugc2Vuc2l0aXZlKQ0KICAgICAqIA0KICAgICAqICA8Y29kZT4NCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAgKiANCiAgICAgKiAgICAgICAkZXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7DQogICAgICogICAgICAgJGV4YW1wbGUtPmFkZENyaXRlcmlhKCdsYXN0TmFtZScsIFR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgncm9nZXInKSwgdHJ1ZSk7DQogICAgICogDQogICAgICogICAgICAgQ29yZTo6ZmluZEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsNCiAgICAgKiA8L2NvZGU+DQogICAgICogDQogICAgICogIEV4YW1wbGUgOiBmaW5kIHRoZSBjdXN0b21lcnMgd2l0aCBJZCA+PSA5MA0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICAqIA0KICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IEV4YW1wbGUoKTsNCiAgICAgKiAgICAgICAkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJ2N1c3RvbWVyX2lkJywgVHlwZUNyaXRlcmlhOjokR1RFLCBhcnJheSg5MCkpOw0KICAgICAqIA0KICAgICAqICAgICAgIENvcmU6OmZpbmRCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7DQogICAgICogPC9jb2RlPg0KICAgICAqIA0KICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscw0KICAgICAqIA0KICAgICAqIE5PVEUgMiA6IHlvdSBjYW4gYWRkIGFzIG1hbnkgQ3JpdGVyaWFzIGFzIHlvdSB3YW50IGluIGFuIEV4YW1wbGUgT2JqZWN0DQogICAgICogDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQogICAgICogQHBhcmFtIEV4YW1wbGUgdGhlIE9iamVjdCBFeGFtcGxlIHdpdGggc29tZSBDcml0ZXJpYXMgaW5zaWRlDQogICAgICogDQogICAgICogQHNlZSBFeGFtcGxlDQogICAgICogQHNlZSBUeXBlQ3JpdGVyaWENCiAgICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUV4YW1wbGUoRW50aXR5ICYkZW50aXR5UGFyYW0sIEV4YW1wbGUgJGV4YW1wbGUpDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQkkY3JpdGVyaWFzID0gJGV4YW1wbGUtPmdldENyaXRlcmlhcygpOw0KCQkkc2VsZWN0ID0gInNlbGVjdCAqIGZyb20gIi4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpOw0KCQkkaHFsID0gIiI7DQoJCSRwYXJhbXMgPSBhcnJheSgpOw0KCQkNCgkJZm9yZWFjaCgkY3JpdGVyaWFzIGFzICRjcml0ZXJpYSkNCgkJew0KCQkgIGlmKCFlbXB0eSgkaHFsKSkNCgkJICB7DQoJCQkkaHFsIC49ICcgQU5EICc7DQoJCSAgfQ0KCQkgIA0KCQkgIGlmKGVtcHR5KCRocWwpKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyBXSEVSRSAnOw0KCQkgIH0NCg0KCQkgICRmaWx0ZXJUeXBlID0gICRsaXN0ZUZpZWxkWyRjcml0ZXJpYS0+ZmllbGRuYW1lXS0+Z2V0VHlwZSgpOw0KCQkgIA0KCQkJCS8vQ3JpdMOpcmVzIGF2ZWMgMSBzZXVsIHBhcmFtw6h0cmUNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRORVEgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQUZURVINCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTkxJS0UpDQoJCSAgeyAgDQoJCQkkdmFsID0gJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXTsNCgkJCQ0KCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTElLRSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROTElLRSkNCgkJCXsNCgkJCSAgJHZhbC49ICclJzsNCgkJCX0NCgkJCQ0KCQkJJHBhcmFtc1tdID0gQ29yZTo6RmllbGRUb0RCVmFsdWUoJHZhbCwgJGZpbHRlclR5cGUpOyANCgkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEuJyA/ICc7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgDQoJCQkJLy9TYW5zIHBhcmFtw6h0cmVzDQoJCSAgaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTlVMTCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROTlVMTCkNCgkJICB7ICANCgkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWE7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgDQoJCQkJLy9kZXV4IHBhcmFtw6h0cmVzDQoJCSAgaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQkVUV0VFTikNCgkJICB7ICANCgkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMF0sICRmaWx0ZXJUeXBlKTsgDQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzFdLCAkZmlsdGVyVHlwZSk7IA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYS4nID8gQU5EID8nOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIA0KCQkJCS8vIE4gcGFyYW3DqHRyZXMNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRJTiB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROSU4pDQoJCSAgew0KCQkJJGhxbCAuPSAnICggJzsNCgkJCSRzZWNvbmQgPSBmYWxzZTsgDQoJCQlmb3JlYWNoKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEgYXMgJHBhcmFtKQ0KCQkJew0KCQkJICBpZigkc2Vjb25kKQ0KCQkJICB7DQoJCQkJJGhxbCAuPSAnIE9SICc7DQoJCQkgIH0NCgkJCSAgDQoJCQkgICRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRwYXJhbSwgJGZpbHRlclR5cGUpOyANCgkJCSAgJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS5UeXBlQ3JpdGVyaWE6OiRFUS4nID8gJzsNCgkJCSAgDQoJCQkgICRzZWNvbmQgPSB0cnVlOw0KCQkJfQ0KCQkJJGhxbCAuPSAnICknOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIA0KCQkgIC8vVHJhaXRlbWVudCBzcMOpY2lmaXF1ZQ0KCQkgIGlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JEVNUFRZKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyAoICcuJGNyaXRlcmlhLT5maWVsZG5hbWUgLicgaXMgbnVsbCB8fCAnIC4gJGNyaXRlcmlhLT5maWVsZG5hbWUgLiAiPSAnJykiOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIGlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5FTVBUWSkNCgkJICB7DQoJCQkkaHFsIC49ICcgKCAnLiRjcml0ZXJpYS0+ZmllbGRuYW1lIC4nIGlzIG5vdCBudWxsICYmICcgLiAkY3JpdGVyaWEtPmZpZWxkbmFtZSAuICIhPSAnJykiOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkJCQkJIA0KCQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkxlIENyaXRlcmlhICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhIG4nZXN0IHBhcyBlbmNvcmUgcHJpcyBlbiBjaGFyZ2UiKTsNCgkJfQ0KCQkkcXVlcnlFeGFtcGxlID0gJHNlbGVjdC4kaHFsOw0KDQoJCVRyYWNlOjppbmZvKCJmaW5kQnlFeGFtcGxlIDogIi4kcXVlcnlFeGFtcGxlLiIgICAiLnByaW50X3IoJHBhcmFtcywgdHJ1ZSkpOw0KDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5RXhhbXBsZSwgJHBhcmFtcyk7DQoNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoJGRiLT5FcnJvck1zZygpLlRyYWNlOjplcnJvcigiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHJlcXVldGUgcGFyIEV4YW1wbGUhIikpO30NCg0KCQlUcmFjZTo6aW5mbygiZmluZEJ5RXhhbXBsZSA6ICIuJHJlc3VsdC0+UmVjb3JkQ291bnQoKS4iIHJlc3VsdGF0KHMpIik7DQoNCgkJJGVudGl0aWVzID0gQ29yZTo6X3Byb2Nlc3NBcnJheUVudGl0eSgkZW50aXR5UGFyYW0sICRyZXN1bHQpOw0KCQkNCgkJLy9XZSBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGUgYmVmb3JlIHJldHVybiBpdA0KCQlDYWNoZTo6c2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0LCBudWxsLCAkZW50aXRpZXMpOw0KDQoJCXJldHVybiBhcnJheV92YWx1ZXMoJGVudGl0aWVzKTsNCg0KCX0NCiAgICAvKioNCiAgICAgKiBBbGxvdyBkZWxldGUgYSBsaXN0IG9mIEVudGl0eSBmcm9tIGEgbGlzdCBvZiBDcml0ZXJpYQ0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkNCiAgICAgKiANCiAgICAgKiAgPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgRXhhbXBsZSgpOw0KICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBUeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOw0KICAgICAqIA0KICAgICAqICAgICAgIENvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsNCiAgICAgKiA8L2NvZGU+DQogICAgICogDQogICAgICogIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgRXhhbXBsZSgpOw0KICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBUeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7DQogICAgICogDQogICAgICogICAgICAgQ29yZTo6ZGVsZXRlQnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiBOT1RFIDogRVEgPT4gPGI+RVE8L2I+dWFscywgR1RFID0+IDxiPkc8L2I+cmVhdGVyIDxiPlQ8L2I+aGFuIG9yIDxiPkU8L2I+cXVhbHMNCiAgICAgKiANCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdA0KICAgICAqIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICAqIEBwYXJhbSBFeGFtcGxlIHRoZSBPYmplY3QgRXhhbXBsZSB3aXRoIHNvbWUgQ3JpdGVyaWFzIGluc2lkZQ0KICAgICAqIA0KICAgICAqIEBzZWUgRXhhbXBsZQ0KICAgICAqIEBzZWUgVHlwZUNyaXRlcmlhDQogICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkZWxldGVCeUV4YW1wbGUoRW50aXR5ICYkZW50aXR5UGFyYW0sIEV4YW1wbGUgJEV4YW1wbGUpDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQkkY3JpdGVyaWFzID0gJEV4YW1wbGUtPmdldENyaXRlcmlhcygpOw0KCQkkZGVsZXRlID0gImRlbGV0ZSBmcm9tICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKTsNCgkJJGhxbCA9ICIiOw0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJZm9yZWFjaCgkY3JpdGVyaWFzIGFzICRjcml0ZXJpYSkNCgkJew0KCQkgIGlmKCFlbXB0eSgkaHFsKSkNCgkJICB7DQoJCQkkaHFsIC49ICcgQU5EICc7DQoJCSAgfQ0KCQkgIA0KCQkgIGlmKGVtcHR5KCRocWwpKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyBXSEVSRSAnOw0KCQkgIH0NCg0KCQkgICRmaWx0ZXJUeXBlID0gJGxpc3RlRmllbGRbJGNyaXRlcmlhLT5maWVsZG5hbWVdLT5nZXRUeXBlKCk7DQoJCSAgDQoJCQkJLy8gMSBwYXJhbcOodHJlICANCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRORVEgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQUZURVINCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTkxJS0UpDQoJCSAgeyAgDQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzBdLCAkZmlsdGVyVHlwZSk7IA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYS4nID8gJzsNCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJICANCgkJCQkvLyAwIHBhcmFtw6h0cmUNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROVUxMIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5OVUxMKQ0KCQkgIHsgIA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYTsNCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJICANCgkJCQkvLyAyIHBhcmFtw6h0cmVzICANCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRVRXRUVOKQ0KCQkgIHsgIA0KCQkJJHBhcmFtc1tdID0gQ29yZTo6RmllbGRUb0RCVmFsdWUoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXSwgJGZpbHRlclR5cGUpOyANCgkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMV0sICRmaWx0ZXJUeXBlKTsgDQoJCQkkaHFsIC49ICRjcml0ZXJpYS0+ZmllbGRuYW1lLiRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhLicgPyBBTkQgPyc7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCQkJDQoJCQkJLy8gTiBwYXJhbcOodHJlcw0KCQkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JElOIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5JTikNCgkJCQl7DQoJCQkJCSRocWwgLj0gJyAoICc7DQoJCQkJCSRzZWNvbmQgPSBmYWxzZTsgDQoJCQkJCWZvcmVhY2goJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSBhcyAkcGFyYW0pDQoJCQkJCXsNCgkJCQkJCWlmKCRzZWNvbmQpDQoJCQkJCQl7DQoJCQkJCQkJJGhxbCAuPSAnIE9SICc7DQoJCQkJCQl9DQoJCQkJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkcGFyYW0sICRmaWx0ZXJUeXBlKTsgDQoJCQkJCQkkaHFsIC49ICRjcml0ZXJpYS0+ZmllbGRuYW1lLlR5cGVDcml0ZXJpYTo6JEVRLicgPyAnOw0KCQkJCQkJDQoJCQkJCQkkc2Vjb25kID0gdHJ1ZTsNCgkJCQkJfQ0KCQkJCQkkaHFsIC49ICcgKSc7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICANCgkJICANCgkJICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBDcml0ZXJpYSAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSBuJ2VzdCBwYXMgZW5jb3JlIHByaXMgZW4gY2hhcmdlIik7DQoJCX0NCgkJJHF1ZXJ5RXhhbXBsZSA9ICRkZWxldGUuJGhxbDsNCgkJCQkJCQkJCQkNCg0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeUV4YW1wbGUsICRwYXJhbXMpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHJlcXVldGUgcGFyIEV4YW1wbGUhIik7fQ0KCX0NCiAgICAgIA0KICAgIC8qKg0KICAgICAqIFRyYW5zZm9ybXMgYW4gYXJyYXkgb2YgdmFsdWUgaW50byBhIGVudGlyZSBFbnRpdHkuIFRoZSBhcnJheSBtdXN0IGZhbGxvdyB0aGlzIHNjaGVtZQ0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOg0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgICAgICRteUFycmF5MSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjEsICduYW1lJz0+J0R1cG9udCcpOyAgICAgICANCiAgICAgKiAgICAgICAkbXlBcnJheTIgPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4yLCAnbmFtZSc9PidEdXJhbmQnLCAnbGFzdE5hbWUnPT4nSm9lJyk7ICAgICAgIA0KICAgICAqICAgDQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGN1c3RvbWVyMSA9IENvcmU6OnJvd1RvRW50aXR5KCRjdXN0b21lciwgJG15QXJyYXkxKTsNCiAgICAgKiAgICAgICAkY3VzdG9tZXIyID0gQ29yZTo6cm93VG9FbnRpdHkoJGN1c3RvbWVyLCAkbXlBcnJheTIpOw0KICAgICAqIA0KICAgICAqICAgICAgIGVjaG8gJGN1c3RvbWVyMS0+Z2V0KCdsYXN0TmFtZScpOyAvL3JldHVybiBudWxsDQogICAgICogICAgICAgZWNobyAkY3VzdG9tZXIyLT5nZXQoJ2xhc3ROYW1lJyk7IC8vcmV0dXJuIEpvZQ0KICAgICAqIA0KICAgICAqIDwvY29kZT4NCiAgICAgKiAgICAgICAgIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICAqIEBwYXJhbSBhcnJheSB0aGUgbGlzdCB3aXRoIHRoZSBkYXRhDQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHJvd1RvRW50aXR5IChFbnRpdHkgJiRlbnRpdHlQYXJhbSwgJHJvdykNCgl7DQoNCgkJVHJhY2U6OmRlYnVnKCJyb3dUb0VudGl0eSA6ICIucHJpbnRfcigkcm93LHRydWUpLiI8YnIvPiIpOw0KCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7DQoNCgkJJG5ld0VudGl0eSA9IGNsb25lICRlbnRpdHlQYXJhbTsNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpDQoJCXsNCgkJICBpZighJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKQ0KCQkgIHsNCgkJCSRuZXdFbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSxDb3JlOjpkYlZhbHVlVG9GaWVsZCgkcm93WyRmaWVsZC0+Z2V0TmFtZSgpXSwgJGZpZWxkLT5nZXRUeXBlKCkpKTsNCgkJICB9IA0KCQl9DQoJCXJldHVybiAkbmV3RW50aXR5OyAgDQoJfQ0KICANCiAgICAvKioNCiAgICAgKiBUcmFuc2Zvcm0gYSBQSFAgdmFsdWUgaW50byBhIFNRTCB2YWx1ZQ0KICAgICAqIA0KICAgICAqIEBwYXJhbSBtaXhlZCB0aGUgUEhQIHZhbHVlDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBDQVNUIHZhbHVlDQogICAgICogDQogICAgICogQHNlZSBDQVNUDQogICAgICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBGaWVsZFRvREJWYWx1ZSgkZGF0YSwgJHR5cGUpDQoJew0KCQlpZigkZGF0YSA9PSBudWxsKXsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoJCQ0KCQlzd2l0Y2goJHR5cGUpDQoJCXsNCgkJICBjYXNlIENBU1Q6OiRTVFJJTkcgOiByZXR1cm4gJGRhdGE7DQoJCSAgDQoJCSAgY2FzZSBDQVNUOjokSU5URUdFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JEJVRkZFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiREQVRFIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCRGF0ZSgkZGF0YSkpOyAgICAgICANCgkJICANCgkJICBjYXNlIENBU1Q6OiRUSU1FIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCVGltZVN0YW1wKCRkYXRhKSk7ICAgICANCg0KCQkgIGNhc2UgQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOyAgDQoJCX0NCgl9DQogIA0KICAgIC8qKg0KICAgICAqIFRyYW5zZm9ybSBhIFNRTCB2YWx1ZSBpbnRvIGEgUEhQIHZhbHVlDQogICAgICogDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBTUUwgdmFsdWUgDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBDQVNUIHZhbHVlDQogICAgICogDQogICAgICogQHNlZSBDQVNUDQogICAgICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkYlZhbHVlVG9GaWVsZCgkZGF0YSwgJHR5cGUpDQoJew0KCQlzd2l0Y2goJHR5cGUpDQoJCXsNCgkJICBjYXNlIENBU1Q6OiRTVFJJTkcgOiByZXR1cm4gJGRhdGE7DQoJCSAgDQoJCSAgY2FzZSBDQVNUOjokSU5URUdFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JEJVRkZFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiREQVRFIDogcmV0dXJuIGNtc21zKCktPkdldERiKCktPlVuaXhEYXRlKCRkYXRhKTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiRUSU1FIDogcmV0dXJuICRkYXRhOy8vcmV0dXJuIGNtc21zKCktPkdldERiKCktPlVuaXhUaW1lU3RhbXAoJGRhdGEpOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOw0KDQoJCX0NCgl9DQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJuIHRoZSBlbnRpdGllcyAnQicgd2hpY2ggY291bGQgYmUgYXNzb2NpYXRlIHRvIGFuIEVudGl0eSAnQScgKGJ1dCBjdXJyZW50bHkgYXJlIG5vdCBhc3NvY2lhdGUpDQogICAgICogDQogICAgICogRXhhbXBsZSA6IFdoaWNoIFRhZyBjYW4gaSBhc3NvY2lhdGUgdG8gbXkgQmxvZyB0aGF0IGFyZSBub3QgYWxyZWFkeSBsaW5rZWQgPw0KICAgICAqIA0KICAgICAqIEZvciBtZW1vcnksIGFuIGNvcnJlY3QgQXNzb2NpYXRlS2V5IHN5c3RlbSBpbiBPcm0gaXMgMyBFbnRpdGllcyBsaWtlIHRoYXQgOiANCiAJICogIDEgYmxvZyBjYW4gYmUgbGlua2VkIHRvIDAvbiBUYWcNCiAJICogIDEgdGFnIGNhbiBiZW4gbGlua2VkIHRvIDAvbiBCbG9nIA0KCSAqICBTbyB3ZSd2ZSBnb3QgOiBCbG9nIChFbnRpdHkpIDwtPiBCbG9nMlRhZyAoRW50aXR5QXNzb2NpYXRpb24pIDwtPiBUYWcgKEVudGl0eSkgDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgY2xhc3MgQmxvZyBleHRlbmRzIEVudGl0eQ0KICAgICAqICAgIHsNCiAgICAgKiAgICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCdibG9nJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnYmxvZ19pZCcgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbCANCiAgICAgKiAJCQkJCQksIEtFWTo6JFBLDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgndGFncycgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nMlRhZy50YWdfaWQnIAk8LS0gbGluayB0byB0aGUgYXNzb2NpYXRlIEVudGl0eSA6ICdCbG9nMlRhZycgIHdpdGggaXRzIHByb3BlcnR5ICd0YWdfaWQnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgfQ0KICAgICAqICAgIH0NCiAgICAgKiANCiAgICAgKiAgICBjbGFzcyBUYWcgZXh0ZW5kcyBFbnRpdHkNCiAgICAgKiAgICB7DQogICAgICogICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCd0YWcnKTsNCiAgICAgKiAgICAgICAgICAgIA0KICAgICAqICAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwgDQogICAgICogCQkJCQkJLCBLRVk6OiRQSw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ2Jsb2dzJyANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCAnQmxvZzJUYWcuYmxvZ19pZCcgPC0tIGxpbmsgdG8gdGhlIGFzc29jaWF0ZSBFbnRpdHkgOiAnQmxvZzJUYWcnICB3aXRoIGl0cyBwcm9wZXJ0eSAnYmxvZ19pZCcNCgkgKgkJCQkJCSkpOw0KICAgICAqICAgICAgICB9DQogICAgICogICAgICAgIA0KICAgICAqDQogICAgICogICAgfQ0KICAgICAqIA0KICAgICAqICAgY2xhc3MgQmxvZzJUYWcgZXh0ZW5kcyBFbnRpdHlBc3NvY2lhdGlvbg0KICAgICAqICAgew0KICAgICAqICAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgICAqICAgICAgICB7DQogICAgICogICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCdteU1vZHVsZScsJ2Jsb2cydGFnJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdibG9nX2lkJw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRGSw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nLnRhZ3MnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEZLDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsICdUYWcuYXJ0aWNsZXMnIA0KCSAqCQkJCQkJKSk7DQogICAgICoNCiAgICAgKiAgICAgICAgfSAgICANCiAgICAgKiAgICB9DQogICAgICogPC9jb2RlPg0KCSAqDQoJICogQW5kIG5vdyB0aGUgY29kZSB0byBmaW5kIHRoZSBwb3RlbnRpYWxzIFRhZyBmb3IgbXkgQmxvZyA6IA0KCSAqDQoJICogPGNvZGU+DQoJICogICAkYmxvZyA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdibG9nJyk7DQoJICogICAkdGFncyA9IENvcmU6OmdldEVudGl0eXNBc3NvY2lhYmxlKCRibG9nLCd0YWdzJyk7DQoJICogPC9jb2RlPg0KICAgICAqIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSANCiAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBmaWVsZCdzIG5hbWUgb2YgdGhlIEVudGl0eSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc3RhcnQgdGhlIHJlc2VhcmNoDQoJICoNCiAgICAgKiBAcmV0dXJuIGFycmF5PEVudGl0eT4gYSBsaXN0IG9mIHRoZSBFbnRpdGllcyBsaW5rZWQgdG8gdGhlIGVudGl0eSBpbiB0aGUgcGFyYW1ldGVycyBieSB0aGUgZmllbGROYW1lIGluIHRoZSBQYXJhbWV0ZXJzDQogICAgICovDQovKglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldEVudGl0eXNBc3NvY2lhYmxlKEVudGl0eSAmJGVudGl0eVBhcmFtLCRmaWVsZG5hbWUpDQoJew0KCQkkZmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkQnlOYW1lKCRmaWVsZG5hbWUpOw0KCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSA9PSAnJykNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkxlIGNoYW1wcyAkZmllbGRuYW1lIG5lIHBvc3NlZGUgYXVjdW5lIGNsZSBldHJhbmdlcmUgYXNzb2NpZWUgcG91ciBsYSBjbGFzcyAiLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsNCgkJCQ0KCQkkY2xlID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7DQoNCgkJJGVudGl0eSA9IG5ldyAkY2xlWzBdKCk7DQoJCQkJCQkJCQkJICAgDQoNCgkJJGxpc3RGaWVsZCA9ICRlbnRpdHktPmdldEZpZWxkcygpOw0KCQlmb3JlYWNoKCRsaXN0RmllbGQgYXMgJGZpZWxkKQ0KCQl7DQoJCSAgaWYoJGZpZWxkLT5nZXRLRVlOYW1lKCkgPT0gJycpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBjaGFtcHMgJGZpZWxkbmFtZSBuZSBwb3NzZWRlIGF1Y3VuZSBjbGUgZXRyYW5nZXJlIGFzc29jaWVlIHBvdXIgbGEgY2xhc3MgIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCQkJDQoJCSAgJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkgIA0KCQkgIGlmKHN0cnRvbG93ZXIoJGNsZVswXSkgPT0gJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpIHsNCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJCQ0KCQkgICRlbnRpdHkgPSBuZXcgJGNsZVswXSgpOw0KCQkgIA0KCQkgICRsaXN0ZSA9IENvcmU6OmZpbmRBbGwoJGVudGl0eSk7DQoJCSAgDQoJCSAgcmV0dXJuICRsaXN0ZTsNCgkJfSANCgl9Ki8NCg0KICAgIC8qKg0KICAgICAqIFJldHVybiB0aGUgZW50aXRpZXMgJ0InIHdoaWNoIGFyZSBhbHJlYWR5IGFzc29jaWF0ZSB0byBhbiBFbnRpdHkgJ0EnIA0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOiBXaGljaCBUYWcgYXJlIGFscmVhZHkgYXNzb2NpYXRlIHRvIG15IEJsb2cgPw0KICAgICAqIA0KICAgICAqIEZvciBtZW1vcnksIGFuIGNvcnJlY3QgQXNzb2NpYXRlS2V5IHN5c3RlbSBpbiBPcm0gaXMgMyBFbnRpdGllcyBsaWtlIHRoYXQgOiANCiAJICogIDEgYmxvZyBjYW4gYmUgbGlua2VkIHRvIDAvbiBUYWcNCiAJICogIDEgdGFnIGNhbiBiZW4gbGlua2VkIHRvIDAvbiBCbG9nIA0KCSAqICBTbyB3ZSd2ZSBnb3QgOiBCbG9nIChFbnRpdHkpIDwtPiBCbG9nMlRhZyAoRW50aXR5QXNzb2NpYXRpb24pIDwtPiBUYWcgKEVudGl0eSkgDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgY2xhc3MgQmxvZyBleHRlbmRzIEVudGl0eQ0KICAgICAqICAgIHsNCiAgICAgKiAgICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCdibG9nJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnYmxvZ19pZCcgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbCANCiAgICAgKiAJCQkJCQksIEtFWTo6JFBLDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgndGFncycgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nMlRhZy50YWdfaWQnIAk8LS0gbGluayB0byB0aGUgYXNzb2NpYXRlIEVudGl0eSA6ICdCbG9nMlRhZycgIHdpdGggaXRzIHByb3BlcnR5ICd0YWdfaWQnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgfQ0KICAgICAqICAgIH0NCiAgICAgKiANCiAgICAgKiAgICBjbGFzcyBUYWcgZXh0ZW5kcyBFbnRpdHkNCiAgICAgKiAgICB7DQogICAgICogICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCd0YWcnKTsNCiAgICAgKiAgICAgICAgICAgIA0KICAgICAqICAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwgDQogICAgICogCQkJCQkJLCBLRVk6OiRQSw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ2Jsb2dzJyANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCAnQmxvZzJUYWcuYmxvZ19pZCcgPC0tIGxpbmsgdG8gdGhlIGFzc29jaWF0ZSBFbnRpdHkgOiAnQmxvZzJUYWcnICB3aXRoIGl0cyBwcm9wZXJ0eSAnYmxvZ19pZCcNCgkgKgkJCQkJCSkpOw0KICAgICAqICAgICAgICB9DQogICAgICogICAgICAgIA0KICAgICAqDQogICAgICogICAgfQ0KICAgICAqIA0KICAgICAqICAgY2xhc3MgQmxvZzJUYWcgZXh0ZW5kcyBFbnRpdHlBc3NvY2lhdGlvbg0KICAgICAqICAgew0KICAgICAqICAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgICAqICAgICAgICB7DQogICAgICogICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCdteU1vZHVsZScsJ2Jsb2cydGFnJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdibG9nX2lkJw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRGSw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nLnRhZ3MnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEZLDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsICdUYWcuYXJ0aWNsZXMnIA0KCSAqCQkJCQkJKSk7DQogICAgICoNCiAgICAgKiAgICAgICAgfSAgICANCiAgICAgKiAgICB9DQogICAgICogPC9jb2RlPg0KCSAqDQoJICogQW5kIG5vdyB0aGUgY29kZSB0byBmaW5kIHRoZSBUYWcgYWxyZWFkeSBsaW5rZWQgd2l0aCBteSBCbG9nICM0NTogDQoJICoNCgkgKiA8Y29kZT4NCgkgKiAgICRibG9nID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2Jsb2cnKTsNCgkgKiAgICR0YWdzID0gQ29yZTo6Z2V0RW50aXR5c0Fzc29jaWVlc0xpZWVzKCRibG9nLCd0YWdzJywgNDUpOw0KCSAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgDQogICAgICogQHBhcmFtIHN0cmluZyB0aGUgZmllbGQncyBuYW1lIG9mIHRoZSBFbnRpdHkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHN0YXJ0IHRoZSByZXNlYXJjaA0KCSAqIEBwYXJhbSBtaXhlZCBlbnRpdHlJZCB0aGUgaWQgb2YgdGhlIEJsb2cgdG8gc3RhcnQgdGhlIHJlc2VhcmNoDQoJICoNCiAgICAgKiBAcmV0dXJuIGFycmF5PEVudGl0eT4gYSBsaXN0IG9mIHRoZSBFbnRpdGllcyBsaW5rZWQgdG8gdGhlIGVudGl0eSBpbiB0aGUgcGFyYW1ldGVycyBieSB0aGUgZmllbGROYW1lIGluIHRoZSBQYXJhbWV0ZXJzDQogICAgICovDQoJLypwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldEVudGl0eXNBc3NvY2llZXNMaWVlcyhFbnRpdHkgJiRlbnRpdHlQYXJhbSwgJGZpZWxkbmFtZSwgJGVudGl0eUlkKQ0KCXsNCgkJVHJhY2U6OmRlYnVnKCJnZXRFbnRpdHlzQXNzb2NpZWVzTGllZXMgOiAiLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLiIgIi4kZmllbGRuYW1lLiIgIi4kZW50aXR5SWQpOw0KDQoJCSRmaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkbmFtZSk7DQoNCgkJaWYoJGZpZWxkLT5nZXRLRVlOYW1lKCkgPT0gJycpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBjaGFtcHMgJGZpZWxkbmFtZSBuZSBwb3NzZWRlIGF1Y3VuZSBjbGUgZXRyYW5nZXJlIGFzc29jaWVlIHBvdXIgbGEgY2xhc3MgIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCSAgDQoJCSRjbGUgPSBleHBsb2RlKCcuJywkZmllbGQtPmdldEtFWU5hbWUoKSwyKTsNCg0KCQkkZW50aXR5ID0gbmV3ICRjbGVbMF0oKTsNCgkJCQkJCQkJCQkJCQkJCQkgIA0KCQkkZXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7ICAgIA0KCQkkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJGNsZVsxXSxUeXBlQ3JpdGVyaWE6OiRFUSxhcnJheSgkZW50aXR5SWQpKTsNCgkJJGFzc29jcyA9IENvcmU6OmZpbmRCeUV4YW1wbGUoJGVudGl0eSwgJGV4YW1wbGUpOw0KDQoJCSRsaXN0RmllbGQgPSAkZW50aXR5LT5nZXRGaWVsZHMoKTsNCgkJZm9yZWFjaCgkbGlzdEZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkgIGlmKCRmaWVsZC0+Z2V0S0VZTmFtZSgpID09IG51bGwgfHwgJGZpZWxkLT5nZXRLRVlOYW1lKCkgPT0gJycpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBjaGFtcHMgJGZpZWxkbmFtZSBuZSBwb3NzZWRlIGF1Y3VuZSBjbGUgZXRyYW5nZXJlIGFzc29jaWVlIHBvdXIgbGEgY2xhc3MgIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCSAgDQoJCSAgJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkgIA0KCQkgIGlmKHN0cnRvbG93ZXIoJGNsZVswXSkgPT0gJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpDQoJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJDQoJCSAgJGlkcyA9IGFycmF5KCk7DQoJCSAgZm9yZWFjaCgkYXNzb2NzIGFzICRhc3NvYykNCgkJICB7DQoJCQkkaWRzW10gPSAkYXNzb2MtPmdldCgkZmllbGQtPmdldE5hbWUoKSk7DQoJCSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCSAgDQoJCSAgJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkJCQ0KCQkgICRlbnRpdHkgPSBuZXcgJGNsZVswXSgpOw0KCQkgIA0KCQkgICRsaXN0ZSA9IENvcmU6OmZpbmRCeUlkcygkZW50aXR5LCAkaWRzKTsNCgkJICANCgkJICBUcmFjZTo6ZGVidWcoImdldEVudGl0eXNBc3NvY2llZXNMaWVlcyA6ICIuInJlc3VsdGF0IDogIi5jb3VudCgkbGlzdGUpKTsNCgkJICANCgkJICByZXR1cm4gJGxpc3RlOw0KCQl9ICAgIA0KCX0qLw0KICANCiAgICAvKioNCiAgICAgKiBWZXJpZnkgaW4gYWxsIHR5cGUgb2YgZW50aXRpZXMgaWYgYW55b25lIHN0aWxsIGhhcyBhIGxpbmsgd2l0aCB0aGUgRW50aXR5IHBhc3NlZCBpbiBwYXJhbWV0ZXJzIChGb3JlaWduS0V5IGFuZCBBc3NvY2lhdGVLZXkpDQogICAgICogDQogICAgICogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgZGVsZXRlKiBmdW5jdGlvbnMgdG8gYXZvaWQgb3JwaGVsaW5zIGRhdGEgaW4gZGF0YWJhc2UNCiAgICAgKiANCgkgKiBAcGFyYW0gT3JtIHRoZSBtb2R1bGUgd2hpY2ggZXh0ZW5kcyB0aGUgT3JtIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQogICAgICogQHBhcmFtIG1peGVkIHRoZSBpZCBvZiB0aGUgRW50aXR5IHRvIHZlcmlmeQ0KCSAqDQoJICogQHJldHVybiBhIG1lc3NhZ2UgaWYgYSBsaW5rIGlzIHN0aWxsIHByZXNlbnQuIG5vdGhpbmcgaWYgdGhlIGludGVncml0eSBpcyBvaw0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gdmVyaWZJbnRlZ3JpdHkoRW50aXR5ICYkZW50aXR5LCAkc2lkKQ0KCXsNCgkJJGxpc3RlRW50aXR5cyA9IE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcygkZW50aXR5LT5nZXRNb2R1bGVOYW1lKCkpOw0KDQoJCWZvcmVhY2goJGxpc3RlRW50aXR5cyBhcyAka2V5PT4kYW5FbnRpdHkpIHsNCgkJICBpZigkYW5FbnRpdHkgaW5zdGFuY2VPZiBFbnRpdHlBc3NvY2lhdGlvbikNCgkJCWNvbnRpbnVlOw0KCQkJDQoJCSAgZm9yZWFjaCgkYW5FbnRpdHktPmdldEZpZWxkcygpIGFzICRmaWVsZCkgew0KCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7DQoJCQkgIGNvbnRpbnVlOw0KCQkJfQ0KCQkJDQoJCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSAhPSBudWxsKSB7DQoJCQkgICR2YWxzID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7DQoJCQkgIA0KCQkJICBpZihzdHJ0b2xvd2VyICgkdmFsc1swXSkgPT0gc3RydG9sb3dlciAoJGVudGl0eS0+Z2V0TmFtZSgpKSkgIHsNCgkJCQkkRXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7DQoJCQkJJEV4YW1wbGUtPmFkZENyaXRlcmlhKCRmaWVsZC0+Z2V0TmFtZSgpLCBUeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHNpZCkpOw0KCQkJCSRlbnRpdHlzID0gQ29yZTo6ZmluZEJ5RXhhbXBsZSgkYW5FbnRpdHksICRFeGFtcGxlKTsNCgkJCQlpZihjb3VudCgkZW50aXR5cykgPiAwKQ0KCQkJCXsNCgkJCQkgIHJldHVybiAiTGEgbGlnbmUgJmFncmF2ZTsgc3VwcHJpbWVyIGVzdCBlbmNvcmUgdXRpbGlzJmVhY3V0ZTtlIHBhciAmbGFxdW87ICIuJGFuRW50aXR5LT5nZXROYW1lKCkuIiAmcmFxdW87IjsNCgkJCQl9DQoJCQkgIH0NCgkJCX0NCgkJICB9DQoJCX0NCg0KCQlyZXR1cm47DQoNCgl9DQoNCiAgICAvKioNCiAgICAgKiBBbGxvdyByZWFsaXNlIGRlZXAgc2VhcmNoIG9uIGRpZmZlcmVudCB0eXBlIG9mIEVudGl0eSBsaW5rZWQgdG9nZXRoZXINCiAgICAgKiANCiAgICAgKiBFeGFtcGxlIDogDQogICAgICogICBBbiBPcmRlciBoYXMgYSBsaW5rIHRvIGEgQ3VzdG9tZXIgKE9yZGVyLmN1c3RvbWVyX2lkKQ0KICAgICAqICAgQSBDdXN0b21lciBoYXMgYSBsaW5rIHRvIGFuIEFkcmVzcyAoQ3VzdG9tZXIuYWRyZXNzZV9pZCkNCiAgICAgKiAgIEFuIEFkcmVzcyBoYXMgYSBsaW5rIHRvIGEgY2l0eSAoQWRyZXNzLmNpdHlfaWQpDQoJICogICBBIGNpdHkgaGFzIGEgWmlwQ29kZSAobWF5YmUgc2hhcmVkIGJ5IGRpZmZlcmVudHMgY2l0aWVzKQ0KICAgICAqIA0KICAgICAqICBJZiBpIHdhbnQgdGhlIE9yZGVycyBmb3IgQ3VzdG9tZXJzIGZyb20gdGhlIGNpdHkgd2l0aCB6aXBjb2RlIGVxdWFscyB0byAiMDEyMzQiIG9yICI0NTY3IiBJIGNvdWxkIHdyaXRlIHNvbWUgc2hpdHR5IGNvZGUgIQ0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAkY2l0aWVzID0gLy9GaW5kIG15IGNpdGllcyB3aXRoIFppcENvZGUgIjAxMjM0IiBvciAiNDU2NyINCiAgICAgKiAgZm9yZWFjaCgkY2l0aWVzIGFzICRjaXR5KQ0KICAgICAqICB7DQogICAgICogICAgICAgJGFkcmVzc2VzID0gLy9GaW5kIHRoZSBhZHJlc3MgZm9yIHRoZSBjaXR5ICRjaXR5DQogICAgICogICAgICAgZm9yZWFjaCgkYWRyZXNzZXMgYXMgJGFkcmVzcykNCiAgICAgKiAgICAgICB7DQogICAgICogICAgICAgICAgICRjdXN0b21lcnMgPSAvL0ZpbmQgdGhlIEN1c3RvbWVycyBmb3IgdGhlIGFkcmVzcyAkYWRyZXNzDQogICAgICogICAgICAgICAgIGZvcmVhY2goJGN1c3RvbWVycyBhcyAkY3VzdG9tZXIpDQogICAgICogICAgICAgICAgIHsNCiAgICAgKiAgICAgICAgICAgICAgICRjb21tYW5kZXMgPSAgLy9GaW5kIFRyYWl0ZW1lbnQgZGUgcmVjaGVyY2hlIGQndW5lIGNvbW1hbmRlIHBvc3PDqGRhbnQgbGUgbnVtZXJvY2xpZW50ID0gJGN1c3RvbWVyLT5nZXQoJ251bWVyb2NsaWVudCcpICAgDQogICAgICogICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgDQogICAgICogICAgICAgfSAgICAgICAgICAgICAgICAgIA0KICAgICAqICB9DQogICAgICogDQogICAgICogIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiAgSSBjb3VsZCBhbHNvIHdyaXRlIGEgYmV0dGVyIGNvZGUgOiANCiAgICAgKiANCiAgICAgKiA8Y29kZT4NCgkgKiAgICRvcmRlciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdvcmRlcicpOw0KICAgICAqICAgJG9yZGVycyA9IENvcmU6Om1ha2VEZWVwU2VhcmNoKG9yZGVyLCAnT3JkZXIuY3VzdG9tZXJfaWQuYWRyZXNzX2lkLmNpdHlfaWQuemlwY29kZScsIGFycmF5KCcwMTIzNCcsICc0NTY3JykpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gRW50aXR5IFRoZSBlbnRpdHkgaSB3YW50IHRvIGhhdmUgYXQgdGhlIGVuZA0KICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHBhdGggdG8gZmFsbG93LiBNdXN0IGJlIGVuZGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIEZpZWxkIHRvIG1ha2UgdGhlIGNvbXBhcmFpc29uDQogICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvZiB2YWx1ZSB0byBtYWtlIHRoZSBjb21wYXJhaXNvbg0KICAgICAqIA0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gbWFrZURlZXBTZWFyY2goRW50aXR5ICRwcmV2aW91c0VudGl0eSwgJGNsZSwgJHZhbHVlcykNCgl7ICAgIA0KCQlUUkFDRTo6aW5mbygiIyA6ICIuIlN0YXJ0IG1ha2VEZWVwU2VhcmNoKCkgIi4kcHJldmlvdXNFbnRpdHktPmdldE5hbWUoKS4iLT4iLiRjbGUpOw0KDQoJCWlmKCRwcmV2aW91c0VudGl0eSA9PSBudWxsKQ0KCQl7DQoJCSAgDQoJCSAgJG5ld0NsZSA9IGV4cGxvZGUoJy4nLCRjbGUsMik7DQoJCSAgJHByZXZpb3VzRW50aXR5ID0gJG5ld0NsZVswXTsNCgkJICAkY2xlID0gJG5ld0NsZVsxXTsNCgkJICAkcHJldmlvdXNFbnRpdHkgPSBuZXcgJHByZXZpb3VzRW50aXR5KCk7DQoJCX0NCg0KCQkkbmV3Q2xlID0gZXhwbG9kZSgnLicsJGNsZSwyKTsNCgkJJGZpZWxkbmFtZSA9ICRuZXdDbGVbMF07DQoNCgkJLy9UZXN0IGRlIHNvcnRpZSA6IG9uIGEgdW4gc2V1bCByw6lzdWx0YXQgZGFucyAkbmV3Q2xlIDogbGUgY2hhbXBzIGZpbmFsDQoJCWlmKGNvdW50KCRuZXdDbGUpID09IDEpDQoJCXsNCgkJICBUUkFDRTo6aW5mbygiIyA6ICIuIiBjb3VudChcJG5ld0NsZSkgPT0gMSAsIGRvbmMgc29ydGllICIpOw0KCQkgICRFeGFtcGxlID0gbmV3IEV4YW1wbGU7DQoJCSAgJEV4YW1wbGUtPmFkZENyaXRlcmlhKCRmaWVsZG5hbWUsIFR5cGVDcml0ZXJpYTo6JElOLCAkdmFsdWVzKTsNCgkJICAkZW50aXR5cyA9IENvcmU6OmZpbmRCeUV4YW1wbGUoJHByZXZpb3VzRW50aXR5LCAkRXhhbXBsZSk7DQoJCSAgVFJBQ0U6OmluZm8oIiMgOiAiLmNvdW50KCRlbnRpdHlzKS4iIFImZWFjdXRlO3N1bHRhdChzKSByZXRvdXJuJmVhY3V0ZTtzIik7DQoJCSAgcmV0dXJuICRlbnRpdHlzOw0KCQl9IGVsc2UNCgkJew0KCQkgIFRSQUNFOjppbmZvKCIjIDogIi4iIHBvdXJzdWl0ZSAiKTsNCgkJfQ0KDQoJCS8vUsOpY3Vww6lyYXRpb24gZGUgbGEgY2zDqSBkaXN0YW5jZSBwb3VyIHVuZSBGSw0KCQkkZmllbGQgPSAkcHJldmlvdXNFbnRpdHktPmdldEZpZWxkQnlOYW1lKCRmaWVsZG5hbWUpOw0KCQlpZigkZmllbGQtPmlzRm9yZWlnbktFWSgpIHx8ICRmaWVsZC0+aXNBc3NvY2lhdGVLZXkoKSkNCgkJew0KCQkgICRmb3JlaWduS0VZID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7DQoJCSAgJG5leHRFbnRpdHkgPSBuZXcgJGZvcmVpZ25LRVlbMF0oKTsNCgkJfSANCg0KCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS2V5KCkpDQoJCXsNCgkJICAkY2xlID0gZXhwbG9kZSgnLicsJG5ld0NsZVsxXSwyKTsNCgkJICAkY2xlID0gJGNsZVsxXTsNCgkJfSBlbHNlDQoJCXsNCgkJICAkY2xlID0gJG5ld0NsZVsxXTsNCgkJfSANCgkJDQoJCVRSQUNFOjppbmZvKCIjIDogIi4iIG1ha2UgbmV3IHJlY2hlcmNoZSA6ICIuJG5leHRFbnRpdHktPmdldE5hbWUoKSAuIiAsICIuICRjbGUpOw0KDQoJCSRlbnRpdHlzID0gQ29yZTo6bWFrZURlZXBTZWFyY2goJG5leHRFbnRpdHksICRjbGUsICR2YWx1ZXMpOw0KDQoJCWlmKGNvdW50KCRlbnRpdHlzKSA9PSAwKQ0KCQl7DQoJCSAgcmV0dXJuIGFycmF5KCk7DQoJCX0NCg0KCQlpZigkbmV4dEVudGl0eSBpbnN0YW5jZW9mIEVudGl0eUFzc29jaWF0aW9uKQ0KCQl7ICANCgkJICAkZmllbGRzID0gJG5leHRFbnRpdHktPmdldEZpZWxkcygpOw0KCQkgICRub21GaWVsZFN1aXZpdCA9IGV4cGxvZGUoJy4nLCRjbGUsMik7DQoJCSAgJG5vbUZpZWxkU3Vpdml0ID0gJG5vbUZpZWxkU3Vpdml0WzBdOw0KCQkgICRub21GaWVsZFJldG91ciA9ICJOL0EiOw0KCQkgIGZvcmVhY2goJGZpZWxkcyBhcyAkYWZpZWxkKQ0KCQkgIHsNCgkJCWlmKCRhZmllbGQtPmdldE5hbWUoKSA9PSAkbm9tRmllbGRTdWl2aXQpDQoJCQl7DQoJCQkgIGNvbnRpbnVlOw0KCQkJfQ0KCQkJJG5vbUZpZWxkUmV0b3VyID0gJGFmaWVsZDsNCgkJICB9DQoJCSAgDQoJCX0NCg0KCQkkaWRzID0gYXJyYXkoKTsNCgkJZm9yZWFjaCgkZW50aXR5cyBhcyAkYW5FbnRpdHkpDQoJCXsNCgkJICBUUkFDRTo6aW5mbygiPGJyLz5PbiBhIHRyb3V2JmVhY3V0ZTsgIDogIi4kYW5FbnRpdHktPmdldE5hbWUoKS4iIik7DQoJCSAgaWYoJGFuRW50aXR5IGluc3RhbmNlb2YgRW50aXR5QXNzb2NpYXRpb24pDQoJCSAgew0KCQkJJHZhbHVlID0gJGFuRW50aXR5LT5nZXQoJG5vbUZpZWxkUmV0b3VyLT5nZXROYW1lKCkpOw0KCQkJJGlkc1tdID0gJHZhbHVlOw0KCQkJVFJBQ0U6OmluZm8oIiB2YWxldXIgYXNzb2MgOiAiLiR2YWx1ZS4iIHBvdXIgbGUgY2hhbXBzICIuJG5vbUZpZWxkUmV0b3VyLT5nZXROYW1lKCkpOw0KCQkgIH0gZWxzZQ0KCQkgIHsNCgkJCSR2YWx1ZSA9ICRhbkVudGl0eS0+Z2V0KCRuZXh0RW50aXR5LT5nZXRQaygpLT5nZXROYW1lKCkpOw0KCQkJJGlkc1tdID0gJHZhbHVlOw0KCQkJVFJBQ0U6OmluZm8oIiB2YWxldXIgaWQgOiAiLiR2YWx1ZSk7DQoJCSAgfQ0KCQkgIA0KCQl9DQoNCg0KCQkkRXhhbXBsZSA9IG5ldyBFeGFtcGxlOw0KCQlpZigkbmV4dEVudGl0eSBpbnN0YW5jZW9mIEVudGl0eUFzc29jaWF0aW9uKQ0KCQl7DQoJCSAgJEV4YW1wbGUtPmFkZENyaXRlcmlhKCRwcmV2aW91c0VudGl0eS0+Z2V0UGsoKS0+Z2V0TmFtZSgpLCBUeXBlQ3JpdGVyaWE6OiRJTiwgJGlkcyk7DQoJCX0gZWxzZQ0KCQl7DQoJCSAgJEV4YW1wbGUtPmFkZENyaXRlcmlhKCRmaWVsZG5hbWUsIFR5cGVDcml0ZXJpYTo6JElOLCAkaWRzKTsNCgkJfQ0KCQkkZW50aXR5cyA9IENvcmU6OmZpbmRCeUV4YW1wbGUoJHByZXZpb3VzRW50aXR5LCAkRXhhbXBsZSk7DQoNCgkJcmV0dXJuICRlbnRpdHlzOw0KCX0NCiAgDQp9DQoNCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.criteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIENyaXRlcmlhIGNsYXNzCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCiAKIAoKLyoqCiAqIEJhY2tib25lIGZvciBDcml0ZXJpYSBpbnRvIHRoZSBPcm0gc3lzdGVtCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KZmluYWwgY2xhc3MgQ3JpdGVyaWEKewoJLyoqCgkgKiBOYW1lIG9mIHRoZSBmaWVsZCAKCSAqLwoJcHVibGljICRmaWVsZG5hbWU7CgkKCS8qKgoJICogVHlwZSBvZiBDcml0ZXJpYQoJICovCglwdWJsaWMgJHR5cGVDcml0ZXJpYTsKCQoJLyoqCgkgKiBQYXJhbWV0ZXJzIGZvciB0aGUgdHlwZSBvZiBDcml0ZXJpYQoJICovCglwdWJsaWMgJHBhcmFtc0NyaXRlcmlhOwoJCgkvKioKCSAqIEJvb2xlYW4gaWYgd2UgbXVzdCBpZ25vcmUgY2FzZQoJICovCglwdWJsaWMgJGlnbm9yZUNhc2U7CgkKICAgIC8qKgogICAgKiBQdWJsaWMgQ29uc3RydWN0b3IKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgTmFtZSBvZiB0aGUgZmllbGQgCiAgICAqIEBwYXJhbSBUeXBlQ3JpdGVyaWEgVHlwZSBvZiBDcml0ZXJpYQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBwYXJhbWV0ZXIgJHR5cGVDcml0ZXJpYQogICAgKiBAcGFyYW0gYm9vbGVhbiBbT3B0aW9uYWxdIGlmIHdlIG11c3QgaWdub3JlIHRoZSBjYXNlIChhemUgZXF1YWxzIEFaRSkgb3Igbm90LiBEZWZhdWx0IHZhbHVlIGlzICJmYWxzZSIKICAgICoKCSogQHJldHVybiBDcml0ZXJpYSBhIENyaXRlcmlhCgkqCgkqIEBzZWUgVHlwZUNyaXRlcmlhCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmaWVsZG5hbWUsICR0eXBlQ3JpdGVyaWEsICRwYXJhbXNDcml0ZXJpYSwgJGlnbm9yZUNhc2UgPSBmYWxzZSkKCXsKCQkkdGhpcy0+ZmllbGRuYW1lID0gJGZpZWxkbmFtZTsKCQkkdGhpcy0+dHlwZUNyaXRlcmlhID0gJHR5cGVDcml0ZXJpYTsKCQkkdGhpcy0+cGFyYW1zQ3JpdGVyaWEgPSAkcGFyYW1zQ3JpdGVyaWE7CgkJJHRoaXMtPmlnbm9yZUNhc2UgPSAkaWdub3JlQ2FzZTsKCX0KCQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.entity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIEVudGl0eQ0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCi8qKg0KICogQWJzdHJhY3QgQ2xhc3NlcyBkZXNjcmliaW5nIHRoZSBmcmFtZSBvZiBhbiBFbnRpdHkgaW50byBPcm0NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQphYnN0cmFjdCBjbGFzcyBFbnRpdHkgDQp7DQoJLyoqDQoJICogU3RyaW5nIDogTmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgY3VycmVudGx5IHVzZSB0aGlzIGVudGl0eQ0KCSAqICovDQoJcHJpdmF0ZSAkbW9kdWxlTmFtZTsNCgkNCgkvKioNCgkgKiBTdHJpbmcgOiB0aGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgZW50aXR5DQoJICogKi8NCglwcm90ZWN0ZWQgJG5hbWU7DQoNCgkvKioNCgkgKiBTdHJpbmcgOiB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gZGF0YWJhc2UNCgkgKiAqLw0KCXByaXZhdGUgJGRibmFtZTsNCgkNCgkvKioNCgkgKiBTdHJpbmcgOiBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBsaW5rZWQgdG8gdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gTWF5IGJlIE51bGwNCgkgKiAqLw0KCXByaXZhdGUgJHNlcW5hbWU7DQoJDQoJLyoqDQoJICogbGlzdCA6IGZpZWxkcyBtYWtpbmcgdXAgdGhlIGVudGl0eQ0KCSAqICovDQoJcHJpdmF0ZSAkZmllbGRzID0gYXJyYXkoKTsNCgkNCgkvKioNCgkgKiBsaXN0IDogdmFsdWVzIG9mIGVhY2ggZmllbGRzDQoJICogKi8NCglwcml2YXRlICR2YWx1ZXMgPSBhcnJheSgpOw0KCQ0KCS8qKg0KCSAqIFN0cmluZyA6IE5hbWUgb2YgdGhlIGZpZWxkIHdpY2ggd2lsbCBiZSB1c2VkIGFzIGEgcHJpbWFyeUtleQ0KCSAqICovDQoJcHJpdmF0ZSAkcGs7DQoJDQoJLyoqDQoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCBmb3IgdGhlIHNlcXVlbmNlIG5hbWUgaW50byB0aGUgZGF0YWJhc2UNCgkgKiAqLw0KCXB1YmxpYyBzdGF0aWMgJF9DT05TVF9TRVEgPSAnX3NlcSc7DQoJLyoqDQoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCB1c2VkIHRvIG5hbW1lZCB0aGUgdGFibGUgaW50byBkYXRhYmFzZSBmb3IgYSBtb2R1bGUNCgkgKiAqLw0KCXB1YmxpYyBzdGF0aWMgJF9DT05TVF9NT0QgPSAnbW9kdWxlJzsNCgkNCgkNCgkNCiAgICAvKioNCiAgICAgKiBjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgdG8gYXZvaWQgYSBkaXJlY3QgaW5zdGFuY2lhdGlvbiBsaWtlICJuZXcgRW50aXR5KCkiDQogICAgICogRWFjaCB0aW1lIGEgZW50aXR5IGlzIGNvbnN0cnVjdGVkLCB3ZSBwbGFjZSBhIGNvcHkgaW50byB0aGUgYXV0b2xvYWRlci4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2hvIGNhbGxpbmcgdGhpcyBtZXRob2QgKHNvIG5vdCAiT3JtIikNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gUHJlZml4IHRvIHVzZSBpbnRvIGRhdGFiYXNlIGZvciB0YWJsZS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gVGhlIG5hbWUgb2YgdGFibGUgZm9yIHRoaXMgZW50aXR5LiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGVudGl0eQ0KICAgICAqDQogICAgICogQHJldHVybiBFbnRpdHkgdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQ0KICAgICAqIA0KICAgICAqIEBzZWUgTXlBdXRvbG9hZA0KICAgICAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsICRwcmVmaXhlID0gbnVsbCwgJGRiTmFtZSA9IG51bGwpIHsNCgkJJHRoaXMtPm1vZHVsZU5hbWUgPSBzdHJ0b2xvd2VyKCRtb2R1bGVOYW1lKTsNCgkJJHRoaXMtPm5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsNCgkJDQoJCSR0aGlzLT5kYm5hbWUgPSAkdGhpcy0+bmFtZTsNCgkJaWYoIWVtcHR5KCRkYk5hbWUpKQ0KCQl7DQoJCQkkdGhpcy0+ZGJuYW1lID0gc3RydG9sb3dlcigkZGJOYW1lKTsNCgkJfQ0KCQkNCgkJaWYoZW1wdHkoJHByZWZpeGUpKQ0KCQl7DQoJCQkkcHJlZml4ZSA9ICR0aGlzLT5tb2R1bGVOYW1lOw0KCQl9IGVsc2Ugew0KCQkJJHByZWZpeGUgPSBzdHJ0b2xvd2VyKCRwcmVmaXhlKTsNCgkJfQ0KCQkNCgkJJHRoaXMtPmRibmFtZSA9IGNtc19kYl9wcmVmaXgoKS5FbnRpdHk6OiRfQ09OU1RfTU9ELidfJy4kcHJlZml4ZS4nXycuJHRoaXMtPmRibmFtZTsNCgkJDQoJCS8vIFdlIGFkZCBhbiBpbnN0YW5jZSBvZiBvdXItc2VyZiBpbnRvIHRoZSBhdXRvbG9hZA0KCQlteUF1dG9sb2FkOjphZGRJbnN0YW5jZSgkdGhpcy0+bW9kdWxlTmFtZSwkdGhpcyk7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogIENhbiBiZSBvdmVycmlkZS4gTGV0IHlvdSBzcGVjaWZ5IGhvdyB5b3VyIHRhYmxlIG11c3QgYmUgcG9wdWxhdGVkIA0KICAgICogYWZ0ZXIgeW91IGFza2VkIHRvIGNyZWF0ZSB0aGUgdGFibGUgb2YgeW91ciBFbnRpdHkNCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBpbml0VGFibGUoKXt9DQogICAgCQ0KICAgIC8qKg0KICAgICogQWRkIGEgbmV3IEZpZWxkIGludG8gdGhlIGxpc3Qgb2YgRmllbGRzDQogICAgKiANCiAgICAqIEBwYXJhbSBGaWVsZCB0aGUgb2JqZWN0IEZpZWxkIHRvIGFkZA0KCSogDQoJKiBAZXhjZXB0aW9uIElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHdlIHRyeSB0byB1c2UgbW9yZSB0aGFuIGEgc2luZ2xlIFByaW1hcnlLZXkgaW4gdGhlIGVudGl0eQ0KICAgICovDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZChGaWVsZCAkbmV3RmllbGQpIHsNCgkJJHRoaXMtPmZpZWxkc1skbmV3RmllbGQtPmdldE5hbWUoKV0gPSAkbmV3RmllbGQ7DQoNCgkJLy9BZGQgYSBzZXF1ZW5jZSBvbiB0aGUga2V5cw0KCQlpZigkbmV3RmllbGQtPmlzUHJpbWFyeUtFWSgpKQ0KCQl7DQoJCQlpZigkdGhpcy0+cGsgIT0gbnVsbCkNCgkJCQl0aHJvdyBuZXcgSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIk9ybSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktUHJpbWFyeS1LZXkgaW50byB0aGUgRW50aXR5ICIuJHRoaXMtPm5hbWUpOw0KCQkJCQ0KCQkJJHRoaXMtPnBrID0gJG5ld0ZpZWxkLT5nZXROYW1lKCk7DQoJCQkkdGhpcy0+c2VxbmFtZSA9ICR0aGlzLT5kYm5hbWUuRW50aXR5OjokX0NPTlNUX1NFUTsNCgkJfQ0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgUHJpbWFyeUtleSBGaWVsZA0KICAgICogDQogICAgKiBAcmV0dXJuIEZpZWxkIHRoZSBQcmltYXJ5S2V5IEZpZWxkDQogICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBQcmltYXJ5S2V5IEZpZWxkDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGsoKSB7DQoJCWlmKCR0aGlzLT5wayA9PSBudWxsKQ0KCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7DQoJCQ0KCQlyZXR1cm4gJHRoaXMtPmZpZWxkc1skdGhpcy0+cGtdOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBGaWVsZHMNCiAgICAqIA0KICAgICogQHJldHVybiBhcnJheTxGaWVsZD4gYW4gYXJyYXkgd2l0aCBhbGwgdGhlIEZpZWxkcw0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRzKCkgew0KCQlyZXR1cm4gJHRoaXMtPmZpZWxkczsNCgl9DQoJDQogICAgLyoqDQogICAgKiByZXR1cm4gYSBGaWVsZCBieSBuYW1lDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG5hbWUNCiAgICAqIEByZXR1cm4gRmllbGQgdGhlIEZpZWxkDQogICAgKiANCiAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIEZpZWxkIGV4aXN0IGZvciB0aGUgbmFtZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkQnlOYW1lKCRuYW1lKSB7DQoJCWlmKGlzc2V0KCR0aGlzLT5maWVsZHNbJG5hbWVdKSkNCgkJCXJldHVybiAkdGhpcy0+ZmllbGRzWyRuYW1lXTsNCgkJDQoJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmaWVsZCAkbmFtZSBkb2Vzbid0IGV4aXN0IGludG8gdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkpOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0cnVlIGlmIGEgRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQ0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBuYW1lDQogICAgKiBAcmV0dXJuIEJvb2xlYW4gaWYgZXhpc3RzDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gaXNGaWVsZEJ5TmFtZUV4aXN0cygkbmFtZSkgew0KCQlyZXR1cm4gaXNzZXQoJHRoaXMtPmZpZWxkc1skbmFtZV0pOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW50byB0aGUgZGF0YWJhc2UNCiAgICAqIA0KICAgICogQHJldHVybiBzdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlDQogICAgKiANCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXREYm5hbWUoKSB7DQoJCXJldHVybiAkdGhpcy0+ZGJuYW1lOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5DQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkNCiAgICAqIA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7DQoJCXJldHVybiAkdGhpcy0+bmFtZTsNCgl9DQoJDQoJLyoqDQoJICogIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUNCgkgKiAgDQoJICogIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZS4NCgkgKiovDQoJcHVibGljIGZ1bmN0aW9uIGdldE1vZHVsZU5hbWUoKSB7DQoJCXJldHVybiAkdGhpcy0+bW9kdWxlTmFtZTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIChpZiBleGlzdHMpDQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBvciBOVUxMDQogICAgKiANCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZXFuYW1lKCkgew0KCQlpZihlbXB0eSgkdGhpcy0+c2VxbmFtZSkpDQoJCQlyZXR1cm4gbnVsbDsNCgkJDQoJCXJldHVybiAkdGhpcy0+c2VxbmFtZTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBhIEZpZWxkIGJ5IHRoZSBuYW1lIA0KICAgICogCQ0KICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgRmllbGQNCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQNCiAgICAqIA0KICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldCgkZmllbGROYW1lKSB7DQoNCgkJLy8kZmllbGRuYW1lU2lkID0gZXhwbG9kZSgiX3NpZCIsICRmaWVsZE5hbWUpOw0KCQkvLyRmaWVsZG5hbWVTaWQgPSAkZmllbGRuYW1lU2lkWzBdOw0KCQkkZmllbGRuYW1lU2lkID0gJGZpZWxkTmFtZTsNCgkJaWYoIWFycmF5X0tFWV9leGlzdHMoJGZpZWxkTmFtZSwkdGhpcy0+ZmllbGRzKSAmJiAhYXJyYXlfS0VZX2V4aXN0cygkZmllbGRuYW1lU2lkLCR0aGlzLT5maWVsZHMpKSB7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmb25jdGlvbiBHZXQgOiBGaWVsZCAkZmllbGROYW1lIG5vdCBmb3VuZCBmb3IgZW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7DQoJCX0NCgkJDQoJCWlmKCFpc3NldCgkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdKSkgew0KCQkJcmV0dXJuIG51bGw7DQoJCX0NCgkJDQoJCXJldHVybiAkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdOw0KCX0NCgkNCiAgIC8qKg0KICAgICogU2V0IGEgdmFsdWUgdG8gYSBGaWVsZA0KICAgICogICAgIA0KICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgRmllbGQNCiAgICAqIEBwYXJhbSBtaXhlZCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBGaWVsZA0KICAgICogDQogICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBGaWVsZCBleGlzdHMgZm9yIHRoZSBuYW1lDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gc2V0KCRmaWVsZE5hbWUsJHZhbHVlKSB7DQoJCSRmaWVsZG5hbWVTaWQgPSBleHBsb2RlKCJfc2lkIiwgJGZpZWxkTmFtZSk7DQoJCSRmaWVsZG5hbWVTaWQgPSAkZmllbGRuYW1lU2lkWzBdOw0KCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZG5hbWVTaWQsJHRoaXMtPmZpZWxkcykpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZ1bmN0aW9uIFNldCA6IEZpZWxkICRmaWVsZE5hbWUgbm90IGZvdW5kIGludG8gdGhlIGVudGl0eSIuJHRoaXMtPmdldE5hbWUoKSk7DQoJCX0NCgkJDQoJCSR0aGlzLT52YWx1ZXNbJGZpZWxkTmFtZV0gPSAkdmFsdWU7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogUmV0dXJuIHRoZSB2YWx1ZXMgZm9yIGFsbCB0aGUgRmllbGRzIGludG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCANCiAgICAqICAqIGtleSA9IG5hbWUgb2YgdGhlIEZpZWxkLCBhbmQgDQogICAgKiAgKiB2YWx1ZSA9IGl0cyB2YWx1ZQ0KICAgICogDQogICAgKiBAcmV0dXJuIGFycmF5IGFuIGFzc29jaWF0aXZlIGFycmF5DQogICAgKiANCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZXMoKSB7DQoJCXJldHVybiAkdGhpcy0+dmFsdWVzOw0KCX0NCgkNCgkvKg0KCXB1YmxpYyBmdW5jdGlvbiBpbml0Rm9yZWlnbktFWSgkZmllbGROYW1lLCAkc2lkID0gbnVsbCkgewkJCQ0KCQkkZmllbGQgPSAkdGhpcy0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkTmFtZSk7DQoJCQ0KCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSA9PSAnJykNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmaWVsZCAkZmllbGROYW1lIGRvZXNuJ3Qgb3duIGFueSBmb3JlaWduIGtleSBhc3NvY2lhdGVkIik7DQoJCQkNCgkJJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkNCgkJJGVudGl0eSA9IG5ldyAkY2xlWzBdKCk7DQoJCQ0KCQlpZigkc2lkID09IG51bGwpDQoJCXsNCgkJCSRsaXN0ZSA9IENvcmU6OmZpbmRBbGwoJGVudGl0eSk7DQoJCX0gZWxzZQ0KCQl7DQoJCQkkbGlzdGUgPSBDb3JlOjpmaW5kQnlJZHMoJGVudGl0eSwgYXJyYXkoJHNpZCkpOw0KCQl9DQoJCQ0KCQlyZXR1cm4gYXJyYXkoJGVudGl0eSwkbGlzdGUpOw0KCQ0KCX0qLw0KCQ0KCS8qKg0KCSAqIFNob3J0Y3V0IHRvIHNhdmUgdGhlIGVudGl0eS4gaWYgdGhlIHByaW1hcnlLZXkgaXMgc2V0dGVkLCBpdCB3aWxsIGJlIGFuIHVwZGF0ZSBvcGVyYXRpb24sIGVsc2UgYW4gaW5zZXJ0Lg0KCSAqDQoJICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpIGlmIGl0J3MgYW4gaW5zZXJ0aW9uDQoJICoqLw0KCXB1YmxpYyBmdW5jdGlvbiBzYXZlKCl7DQoJCWlmKCR0aGlzLT5wayA9PSBudWxsKSB7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5b3UgY2FuJ3Qgc2F2ZSB0aGUgZW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKS4iIGJlY2F1c2UgaXQgZG9lc24ndCBoYXZlIGFueSBQcmltYXJ5LUtleSIpOw0KCQl9DQoJDQoJCWlmKCR0aGlzLT5nZXQoJHRoaXMtPnBrKSA9PSBudWxsKSB7DQoJCQlyZXR1cm4gQ29yZTo6aW5zZXJ0RW50aXR5KCR0aGlzKTsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiBDb3JlOjp1cGRhdGVFbnRpdHkoJHRoaXMpOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIFNob3J0Y3V0IHRvIGRlbGV0ZSB0aGUgZW50aXR5DQoJICoqLw0KCXB1YmxpYyBmdW5jdGlvbiBkZWxldGUoKXsNCgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgUHJpbWFyeS1LZXkiKTsNCgkJfQ0KCQkNCgkJaWYoJHRoaXMtPmdldCgkdGhpcy0+cGspID09IG51bGwpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0cyBQcmltYXJ5LUtleSBkb2Vzbid0IGhhdmUgYW55IHZhbHVlIik7DQoJCX0NCgkJDQoJCUNvcmU6OmRlbGV0ZUJ5SWRzKCR0aGlzLCBhcnJheSgkdGhpcy0+Z2V0KCR0aGlzLT5waykpKTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBMZXQgeW91IG1vZGlmeSBzb21lIGRhdGEganVzdCBiZWZvcmUgc2F2aW5nIHRoZSBkYXRhIGludG8gdGhlIGRhdGF0YWJsZS4NCiAgICAqIA0KICAgICogQHBhcmFtIGFycmF5IGFsbCB0aGUgdmFsdWVzIHRvIHByb2Nlc3MNCiAgICAqIEBwYXJhbSBhcnJheSBtb3JlIHBhcmFtZXRlcnMgaWYgeW91IG5lZWQsIGlmIHlvdSB3YW50DQogICAgKiANCiAgICAqIEByZXR1cm4gbWl4ZWQgdG8gZGVmaW5lDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlRm9yU2F2ZSgkcm93cywgJGFyZ3MgPSBudWxsKXsNCgkNCgkJcmV0dXJuICRyb3dzOw0KCX0NCgkNCgkvKioNCgkgKiBDYWxsIHRoZSBjb21wYXJlVG8gZnVuY3Rpb24gaW50byB5b3VyIEVudGl0eSB0byBzb3J0IHRoZSBFbnRpdGllcy4NCgkgKiBUbyBhY3RpdmF0ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIFRoZSBFbnRpdHkgbXVzdCBpbXBsZW1lbnQgSVNvcnRhYmxlIEludGVyZmFjZS4NCgkgKg0KCSAqIEV4YW1wbGUgb2YgZnVuY3Rpb24gY29tcGFyZVRvKCkgaW4gYSBDdXN0b21lciBFbnRpdHkNCgkgKiAgPGNvZGU+DQoJICogICAgICAgDQoJICoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wYXJlVG8oRW50aXR5ICRlbnRpdHkxLCBFbnRpdHkgJGVudGl0eTIpDQoJICoJew0KCSAqCQkkY29tcGFyZSA9IHN0cmNtcCgkZW50aXR5MS0+Z2V0KCduYW1lJyksICRlbnRpdHkyLT5nZXQoJ25hbWUnKSk7DQoJICogICAgICAJcmV0dXJuICRjb21wYXJlOw0KCSAqCX0NCgkgKiANCgkgKiAgPC9jb2RlPg0KCSAqDQoJICogQHBhcmFtIGFycmF5PEVudGl0eT4gdGhlIGxpc3Qgb2YgRW50aXR5IHRvIHNvcnQNCgkgKg0KCSAqIEByZXR1cm4gYXJyYXk8RW50aXR5PiB0aGUgbGlzdCBvZiBlbnRpdHkgZ3JhY2VmdWxseSBzb3J0ZWQNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnQoYXJyYXkgJGFycmF5KSB7DQoNCgkJdXNvcnQoJGFycmF5LCBhcnJheShnZXRfY2FsbGVkX2NsYXNzKCksICJjb21wYXJlVG8iKSk7DQoJDQoJCXJldHVybiAkYXJyYXk7DQoJfQ0KCQ0KCS8qKg0KCSAqIE1heSBiZSBvdmVycmlkZSBpbiB5b3VyIEVudGl0eSdzIGRlZmluaXRpb24gdG8gYWxsb3cgU2VhcmNoIG1vZHVsZSBpbmRleGluZyB5b3VyIGVudGl0aWVzJ3MgZGF0YQ0KCSAqIA0KCSAqIEV4YW1wbGUgb2YgZnVuY3Rpb24gaXNJbmRleGFibGUoKSBpbiBhIEN1c3RvbWVyIEVudGl0eQ0KCSAqICANCgkgKiAgPGNvZGU+DQoJICogICAgICAgDQoJICoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0luZGV4YWJsZSgpDQoJICoJew0KCSAqCQlyZXR1cm4gdGhpcy0+Z2V0Wydpc0FjdGl2YXRlZCddOw0KCSAqCX0NCgkgKiANCgkgKiAgPC9jb2RlPg0KCSAqKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCl7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQp9DQoNCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.entityassociation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgRW50aXR5QXNzb2NpYXRpb24gQ2xhc3Mgd2hpY2ggZXh0ZW5kcyBFbnRpdHkgY2xhc3MNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQovKioNCiAqIEFic3RyYWN0IENsYXNzIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBmb3IgYW4gQXNzb2NpYXRpdmUgRW50aXR5DQogKiAgICANCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQphYnN0cmFjdCBjbGFzcyBFbnRpdHlBc3NvY2lhdGlvbiBleHRlbmRzIEVudGl0eSANCnsNCglwcml2YXRlICRuYkZpZWxkID0gMDsNCg0KICAgIC8qKg0KICAgICAqIGNvbnN0cnVjdG9yIHByb3RlY3RlZCB0byBhdm9pZCBhIGRpcmVjdCBpbnN0YW5jaWF0aW9uIGxpa2UgIm5ldyBFbnRpdHlBc3NvY2lhdGlvbigpIg0KICAgICAqIEVhY2ggdGltZSBhIGVudGl0eSBpcyBjb25zdHJ1Y3RlZCwgd2UgcGxhY2UgYSBjb3B5IGludG8gdGhlIGF1dG9sb2FkZXIuDQogICAgICogDQogICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdobyBjYWxsaW5nIHRoaXMgbWV0aG9kIChzbyBub3QgIk9ybSIpDQogICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgZW50aXR5DQogICAgICogQHBhcmFtIHN0cmluZyBbb3B0aW9uYWxdIFByZWZpeCB0byB1c2UgaW50byBkYXRhYmFzZSBmb3IgdGFibGUuIElmIG5vdCBzZXR0ZWQsIGl0IHdpbGwgdXNlIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlDQogICAgICogQHBhcmFtIHN0cmluZyBbb3B0aW9uYWxdIFRoZSBuYW1lIG9mIHRhYmxlIGZvciB0aGlzIGVudGl0eS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBlbnRpdHkNCiAgICAgKg0KICAgICAqIEByZXR1cm4gRW50aXR5QXNzb2NpYXRpb24gdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQ0KICAgICAqIA0KICAgICAqIEBzZWUgTXlBdXRvbG9hZA0KICAgICAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsJHByZWZpeGUgPSBudWxsLCAkZGJOYW1lID0gbnVsbCkNCgl7DQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1vZHVsZU5hbWUsICRuYW1lLCAkcHJlZml4ZSwgJGRiTmFtZSk7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogQWRkIGEgbmV3IEZpZWxkDQogICAgKiANCiAgICAqIEN1cnJlbnRseSwgdGhlIE9ybSBTeXN0ZW0gZG9lbid0IGFsbG93IG1vcmUgdGhhbiB0d28gRmllbGQgZm9yIGFuIEVudGl0eUFzc29jaWF0aW9uDQogICAgKiANCiAgICAqIEBwYXJhbSBGaWVsZCB0aGUgRmllbGQgdG8gYWRkLg0KCSoNCgkqIEBleGNlcHRpb24gSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBlbnRpdHkNCgkqIEBleGNlcHRpb24gSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gYSBzaW5nbGUgUHJpbWFyeUtleSBpbiB0aGUgZW50aXR5DQogICAgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkKEZpZWxkICRuZXdGaWVsZCkNCgl7DQoJCSR0aGlzLT5uYkZpZWxkICsrOw0KCQkNCgkJaWYoJHRoaXMtPm5iRmllbGQgPiAyKQ0KCQkJdGhyb3cgbmV3IElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uICgiSXQncyBpbXBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBFbnRpdHlBc3NvY2lhdGlvbiAiLiAkdGhpcy0+Z2V0TmFtZSgpKTsNCgkJCQkNCgkJcGFyZW50OjphZGQoJG5ld0ZpZWxkKTsNCgl9DQoNCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.example.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgRXhhbXBsZSBDbGFzcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCiANCi8qKg0KICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpZmZlcmVudHMgQ3JpdGVyaWEgKENyaXRlcmlhcykgdG8gcHJvY2VzcyBhIHNlYXJjaCAiQnkgRXhhbXBsZSIgb24gYSBFbnRpdHkgaW4gRGF0YWJhc2UNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQpmaW5hbCBjbGFzcyBFeGFtcGxlIA0Kew0KCXByaXZhdGUgJENyaXRlcmlhcyA9IGFycmF5KCk7DQoJDQogICAgLyoqDQogICAgKiBQdWJsaWMgQ29uc3RydWN0b3INCiAgICAqIA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCgl7DQoJfQ0KCQ0KICAgIA0KICAgIC8qKg0KICAgICogQWRkIGEgbmV3IENyaXRlcmlhIG9uIHRoZSBleGlzdGluZyBsaXN0DQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgTmFtZSBvZiB0aGUgZmllbGQgDQogICAgKiBAcGFyYW0gVHlwZUNyaXRlcmlhIFR5cGUgb2YgQ3JpdGVyaWENCiAgICAqIEBwYXJhbSBhcnJheSBhbGwgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHBhcmFtZXRlciAkdHlwZUNyaXRlcmlhDQogICAgKiBAcGFyYW0gYm9vbGVhbiBbT3B0aW9ubmFsXSBpZiB3ZSBtdXN0IGlnbm9yZSB0aGUgY2FzZSAoYXplIGVxdWFscyBBWkUpIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZSBpcyAiZmFsc2UiDQogICAgKiANCiAgICAqIEBzZWUgVHlwZUNyaXRlcmlhDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gYWRkQ3JpdGVyaWEoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSA9IGZhbHNlKQ0KCXsNCgkJaWYoIWlzX2FycmF5KCRwYXJhbXNDcml0ZXJpYSkpDQoJCXsNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oInRoZSBwYXJhbWV0ZXIgXCRwYXJhbXNDcml0ZXJpYSBmb3IgdGhlIENyaXRlcmlhIG9mIHRoZSBGaWVsZCBbIi4kZmllbGRuYW1lLiJdIG11c3QgYmUgYW4gYXJyYXkiKTsNCgkJfQ0KCQkNCgkJJHRoaXMtPkNyaXRlcmlhc1tdID0gbmV3IENyaXRlcmlhKCRmaWVsZG5hbWUsICR0eXBlQ3JpdGVyaWEsICRwYXJhbXNDcml0ZXJpYSwgJGlnbm9yZUNhc2UpOw0KCX0NCg0KICAgIC8qKg0KICAgICogUmV0dXJuIGFsbCB0aGUgQ3JpdGVyaWFzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBFeGFtcGxlIE9iamVjdA0KICAgICogDQogICAgKiBAcmV0dXJuIGFycmF5PENyaXRlcmlhPiB0aGUgbGlzdCBvZiBDcml0ZXJpYXMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IEV4YW1wbGUgT2JqZWN0DQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q3JpdGVyaWFzKCl7DQoJCXJldHVybiAkdGhpcy0+Q3JpdGVyaWFzOw0KCX0NCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.field.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIEZpZWxkDQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KIA0KLyoqDQogKiAgIFJlcHJlc2VudCBhIEVudGl0eSdzIGZpZWxkIHdpdGggYWxsIGl0cyBwcm9wZXJ0aWVzDQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KY2xhc3MgRmllbGQgDQp7DQoJLyoqDQoJICogVGhlICh1bmlxdWUpIG5hbWUgb2YgdGhlIGZpZWxkDQoJICovDQoJcHJpdmF0ZSAkbmFtZTsNCgkNCgkvKioNCgkgKiBUaGUgQ0FTVCB2YWx1ZSBvZiB0aGUgZmllbGQNCgkgKi8NCglwcml2YXRlICR0eXBlOw0KCQ0KCS8qKg0KCSAqIFRoZSBtYXggc2l6ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsIGlmICR0eXBlIGlzIERhdGUsIFRpbWUsIEJ1ZmZlciwgTm9uZSAuLi4NCgkgKi8NCglwcml2YXRlICRzaXplOw0KCQ0KCS8qKg0KCSAqIEJvb2xlYW4gOiB0cnVlIGlmIHRoZSB2YWx1ZSBtYXkgYmUgTlVMTA0KCSAqLw0KCXByaXZhdGUgJG51bGxhYmxlOw0KCQ0KCS8qKg0KCSAqIHRoZSBLRVkgdmFsdWUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbA0KCSAqLw0KCXByaXZhdGUgJEtFWTsNCgkNCgkvKioNCgkgKiB0aGUgbmFtZSBvZiB0aGUga2V5LiBPbmx5IHVzZWQgZm9yIEZvcmVpZ25LZXkgYW5kIEFzc29jaWF0ZUtleQ0KCSAqLw0KCXByaXZhdGUgJEtFWU5hbWU7DQoJDQogICAgLyoqDQogICAgKiBwdWJsaWMgY29uc3RydWN0b3INCiAgICAqIAkNCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlICh1bmlxdWUpIG5hbWUgb2YgdGhlIGZpZWxkDQogICAgKiBAcGFyYW0gQ0FTVCBUaGUgQ0FTVCB2YWx1ZSBvZiB0aGUgZmllbGQgZXhhbXBsZSA6IENBU1Q6OiRJTlRFR0VSDQogICAgKiBAcGFyYW0gaW50IFRoZSBtYXggc2l6ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsIGlmICR0eXBlIGlzIERhdGUsIFRpbWUsIEJ1ZmZlciwgTm9uZSAuLi4NCiAgICAqIEBwYXJhbSB0cnVlIGlmIHRoZSB2YWx1ZSBtYXkgYmUgTlVMTC4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQ0KICAgICogQHBhcmFtIEtFWSB0aGUgS0VZIHZhbHVlIG9mIHRoZSBmaWVsZC4gTWF5IGJlIG51bGwgZXhhbXBsZTogS0VZOjokUEsgZm9yIGEgcHJpbWFyeSBrZXkNCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGtleS4gT25seSB1c2VkIGZvciBGb3JlaWduS2V5IGFuZCBBc3NvY2lhdGVLZXkgZXhhbXBsZSA6ICJDdXN0b21lci5jdXN0b21lcl9pZCIgaW4gdGhlIGZpZWxkICJjdXN0b21lciIgb2YgYW4gZW50aXR5ICJPcmRlciIuDQogICAgKiANCiAgICAqIEByZXR1cm4gRmllbGQgdGhlIEZpZWxkIE9iamVjdA0KICAgICogDQogICAgKiANCiAgICAqIEBzZWUgQ0FTVA0KICAgICogQHNlZSBLRVkNCgkqIEBzZWUgRW50aXR5DQogICAgKiANCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmllbGRuYW1lLCAkY2FzdCwgJHNpemUgPSBudWxsLCAkbnVsbGFibGUgPSBmYWxzZSwgJEtFWSA9IG51bGwsICRLRVlOYW1lPW51bGwpIHsNCgkNCgkJaWYoZW1wdHkoJEtFWSkgJiYgIWVtcHR5KCRLRVlOYW1lKSkgew0KCQkJdGhyb3cgbmV3IElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCdJbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBrZXlOYW1lIHBhcmFtZXRlciBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlmIHRoZSBrZXkgaXMgbm90ICRGSyBvciAkQUsnKTsNCgkJfQ0KCQlpZigkS0VZID09IEtFWTo6JFBLICYmICFlbXB0eSgkS0VZTmFtZSkpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbignSW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEga2V5TmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBpZiB0aGUga2V5IGlzIG5vdCAkRksgb3IgJEFLJyk7DQoJCX0NCgkJaWYoKCRLRVkgPT0gS0VZOjokRksgfHwgJEtFWSA9PSBLRVk6OiRBSykgJiYgZW1wdHkoJEtFWU5hbWUpKSB7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24oJyRGSyBrZXkgb3IgJEFLIGtleSBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG5lZWQgYSBrZXlOYW1lJyk7DQoJCX0NCgkJDQoJCWlmKCgkY2FzdCA9PSBDQVNUOjokREFURSB8fCAkY2FzdCA9PSBDQVNUOjokQlVGRkVSIHx8ICRjYXN0ID09IENBU1Q6OiRUSU1FKSAmJiAhZW1wdHkoJHNpemUpKSB7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24oJ1RoZSBDQVNUOjpEQVRFIG9yIHRoZSBDQVNUOjpCVUZGRVIgb3IgdGhlIENBU1Q6OlRJTUUgb2YgZmllbGQgJy4kZmllbGRuYW1lLicgbXVzdCBub3QgaGF2ZSBzaXplIHZhbHVlJyk7DQoJCX0NCgkJDQoNCgkJaWYoJG51bGxhYmxlID09IG51bGwpIHsNCgkJCSRudWxsYWJsZSA9IGZhbHNlOw0KCQl9DQoJCQkNCgkJJHRoaXMtPm5hbWUgCT0gJGZpZWxkbmFtZTsNCgkJJHRoaXMtPnR5cGUgCT0gJGNhc3Q7DQoJCSR0aGlzLT5zaXplIAk9ICRzaXplOw0KCQkkdGhpcy0+bnVsbGFibGUgPSAkbnVsbGFibGU7DQoJCSR0aGlzLT5LRVkgCQk9ICRLRVk7DQoJCSR0aGlzLT5LRVlOYW1lIAk9ICRLRVlOYW1lOw0KCX0NCgkNCg0KICAgIC8qKg0KICAgICogZ2V0dGVyIGZvciBuYW1lDQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSAodW5pcXVlKSBuYW1lIG9mIEZpZWxkDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpDQoJe3JldHVybiAkdGhpcy0+bmFtZTt9DQoNCiAgICAvKioNCiAgICAqIGdldHRlciBmb3IgdHlwZQ0KICAgICogDQogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgQ0FTVCB2YWx1ZSBvZiBGaWVsZA0KICAgICogDQogICAgKiBAc2VlIENBU1QNCiAgICAqIA0KICAgICovCQ0KCXB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCkNCgl7cmV0dXJuICR0aGlzLT50eXBlO30NCgkNCiAgIC8qKg0KICAgICogZ2V0dGVyIGZvciBzaXplDQogICAgKiANCiAgICAqIEByZXR1cm4gaW50IHRoZSBzaXplIG9mIEZpZWxkDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2l6ZSgpDQoJe3JldHVybiAkdGhpcy0+c2l6ZTt9DQoNCiAgIC8qKg0KICAgICogcmV0dXJuIHRydWUgaWYgRmllbGQgaGFzIGEgJFBLDQogICAgKiANCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRQSw0KICAgICovCQ0KCXB1YmxpYyBmdW5jdGlvbiBpc1ByaW1hcnlLRVkoKQ0KCXtyZXR1cm4gJHRoaXMtPktFWSA9PSBLRVk6OiRQSzt9DQoNCiAgIC8qKg0KICAgICogcmV0dXJuIHRydWUgaWYgRmllbGQgaGFzIGEgJEZLDQogICAgKiANCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRGSw0KICAgICovICAgIAkNCglwdWJsaWMgZnVuY3Rpb24gaXNGb3JlaWduS0VZKCkNCgl7cmV0dXJuICR0aGlzLT5LRVkgPT0gS0VZOjokRks7fQ0KDQogICAvKioNCiAgICAqIHJldHVybiB0cnVlIGlmIEZpZWxkIGhhcyBhICRBSw0KICAgICogDQogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkQUsNCiAgICAqLyAgICAJDQoJcHVibGljIGZ1bmN0aW9uIGlzQXNzb2NpYXRlS0VZKCkNCgl7cmV0dXJuICR0aGlzLT5LRVkgPT0gS0VZOjokQUs7fQ0KCQ0KICAgIC8qKg0KICAgICogZ2V0dGVyIGZvciBrZXlOYW1lDQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBrZXlOYW1lIG9mIEZpZWxkDQogICAgKiANCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBnZXRLRVlOYW1lKCkNCgl7cmV0dXJuICR0aGlzLT5LRVlOYW1lO30NCgkNCiAgICAvKioNCiAgICAqIGdldHRlciBmb3IgbnVsbGFibGUgDQogICAgKiANCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBpcyBvcHRpb25hbCBpbiBkYXRhYmFzZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGlzTnVsbGFibGUoKQ0KCXtyZXR1cm4gJHRoaXMtPm51bGxhYmxlO30NCgkNCn0NCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.illegalargumentexception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiAvKioNCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQoNCi8qKg0KICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIHBhcmFtZXRlcnMgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCiAgICANCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1zZz1OVUxMLCAkY29kZT0wKQ0KICAgIHtwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTt9DQp9DQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.illegalconfigurationexception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiAvKioNCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQoNCi8qKg0KICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBFbnRpdGllcyBpc24ndCBjb3JyZWN0DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KKi8NCmNsYXNzIElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uICB7DQogICAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkNCiAgICB7cGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnLCAkY29kZSk7fQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.indexing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgYWxsIHRoZSBDbXNNYWRlU2ltcGxlJ3MgaW5kZXhpbmcgc3lzdGVtDQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KDQovKioNCiAqICAgQWxsb3cgYSBxdWljayBhbmQgc2ltcGxlIGluZGV4aW5nIHN5c3RlbSB3aXRoIG1vZHVsZXMgbGlrZSBTZWFyY2gNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogKiAgIFRoZSBtb3N0IG9mIHRoZSB3b3JrIHdhcyBtYWRlIGZyb20gRHVrZXRvd24ncyB3b3JrIC0gdGhhbmsgdG8gaGltDQogKiAgIGh0dHA6Ly9mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZy92aWV3dG9waWMucGhwP3A9MjYxNTA4I3AyNjE1MDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogKiAgICANCiAqIA0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLyAgIA0KZmluYWwgY2xhc3MgSW5kZXhpbmcNCnsJDQoJDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KCX0NCgkNCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldFNlYXJjaCgpDQoJew0KCQkkbW9kb3BzID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpOw0KCQlyZXR1cm4gJG1vZG9wcy0+R2V0U2VhcmNoTW9kdWxlKCk7DQoJfQ0KDQoJLyoqDQogICAgKiB2aWRlIGwnaW5kZXhhZ2UgDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgbGUgbm9tIGR1IG1vZHVsZS4NCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gRGVsZXRlQWxsV29yZHMoRW50aXR5ICRlbnRpdHkpDQoJewkNCgkJJHNlYXJjaG1vZHVsZSA9IEluZGV4aW5nOjpnZXRTZWFyY2goKTsNCgkJJHNlYXJjaG1vZHVsZS0+RGVsZXRlV29yZHMoJGVudGl0eS0+Z2V0TW9kdWxlTmFtZSgpLCBudWxsLCAkZW50aXR5LT5nZXROYW1lKCkpOw0KCX0NCg0KICAgLyoqDQogICAgKiB2aWRlIGwnaW5kZXhhZ2UgZCd1biDpbGVtZW50IGVuIHBhcnRpY3VsaWVyDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgbGUgbm9tIGR1IG1vZHVsZS4NCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gRGVsZXRlV29yZHMoRW50aXR5ICRlbnRpdHksICRzaWQgPSBudWxsKQ0KCXsJDQoJCWlmKCRzaWQgPT0gbnVsbCkNCgkJCSRzaWQgPSAkZW50aXR5LT5nZXQoJGVudGl0eS0+Z2V0UGsoKS0+Z2V0TmFtZSgpKTsNCgkJDQoJCSRzZWFyY2htb2R1bGUgPSBJbmRleGluZzo6Z2V0U2VhcmNoKCk7DQoJCSRzZWFyY2htb2R1bGUtPkRlbGV0ZVdvcmRzKCRlbnRpdHktPmdldE1vZHVsZU5hbWUoKSwgJHNpZCwgJGVudGl0eS0+Z2V0TmFtZSgpKTsNCgl9DQoJDQoJDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBBZGRXb3JkcygkZW50aXR5KQ0KICAgIHsNCgkJJHNlYXJjaG1vZHVsZSA9IEluZGV4aW5nOjpnZXRTZWFyY2goKTsNCgkJJGZpZWxkcyA9ICRlbnRpdHktPmdldEZpZWxkcygpOw0KCQkNCgkJJGNvbnRlbnQgPSAnJzsNCgkJZm9yZWFjaCgkZmllbGRzIGFzICRmaWVsZCkNCgkJew0KCQkJJGNvbnRlbnQuPSAnICcuJGVudGl0eS0+Z2V0KCRmaWVsZC0+Z2V0TmFtZSgpKTsNCgkJfQ0KCQkNCgkJJHNpZCA9ICRlbnRpdHktPmdldCgkZW50aXR5LT5nZXRQaygpLT5nZXROYW1lKCkpOw0KCQkNCgkJLy9lY2hvICRzaWQuJyAnLiRlbnRpdHktPmdldE5hbWUoKS4nICcuJGNvbnRlbnQuJzxici8+JzsNCgkJJHNlYXJjaG1vZHVsZS0+QWRkV29yZHMoJGVudGl0eS0+Z2V0TW9kdWxlTmFtZSgpLCAkc2lkLCRlbnRpdHktPmdldE5hbWUoKSwkY29udGVudCk7DQogICAgfQ0KCQ0KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gVXBkYXRlV29yZHMoJGVudGl0eSkgew0KCQlJbmRleGluZzo6RGVsZXRlV29yZHMoJGVudGl0eSk7DQoJCUluZGV4aW5nOjpBZGRXb3JkcygkZW50aXR5KTsNCgl9DQoNCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFNlYXJjaFJlaW5kZXgoJG1vZHVsZU5hbWUpIHsNCgkJJGVudGl0eXMgPSBNeUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMoJG1vZHVsZU5hbWUpOw0KCQlmb3JlYWNoICgkZW50aXR5cyBhcyAkZW50aXR5KSB7DQoJCQ0KCQkJaWYoJGVudGl0eS0+aXNJbmRleGFibGUoKSkgew0KCQkJDQoJCQkJSW5kZXhpbmc6OkRlbGV0ZUFsbFdvcmRzKCRlbnRpdHkpOw0KCQkJCQ0KCQkJCSRsaXN0ZSA9IGFycmF5KCk7DQoJCQkJaWYoISRlbnRpdHktPmlzRmllbGRCeU5hbWVFeGlzdHMoRmllbGRfQWN0aXZlOjokbmFtZSkpIHsNCgkJCQkJJGxpc3RlID0gQ29yZTo6c2VsZWN0QWxsKCRlbnRpdHkpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCSRleGFtcGxlID0gbmV3IEV4YW1wbGUoKTsNCgkJCQkJJGV4YW1wbGUtPmFkZENyaXRlcmlhKEZpZWxkX0FjdGl2ZTo6JG5hbWUsIFR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgxKSk7DQoJCQkJCSRsaXN0ZSA9IENvcmU6OnNlbGVjdEJ5RXhhbXBsZSgkZW50aXR5LCAkZXhhbXBsZSk7DQoJCQkJfQ0KCQkJCQ0KCQkJCWZvcmVhY2goJGxpc3RlIGFzICRzaW5nbGVFbnRpdHkpIHsNCgkJCQkJSW5kZXhpbmc6OkFkZFdvcmRzKCRzaW5nbGVFbnRpdHkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCS8qKg0KCSAqIENhbGxlZCBieSBtb2R1bGUgU2VhcmNoIHRvIGRpc3BsYXkgYSByZXN1bHQNCgkgKi8NCglmdW5jdGlvbiBTZWFyY2hSZXN1bHQoJiRtb2R1bGUsICRpZCwgJHJldHVybmlkLCAkZW50aXR5SWQsICRhdHRyID0gJycpDQogICAgewkNCgkJJHJlc3VsdCA9IGFycmF5KCk7DQoJCQ0KCQkvKiRtbGUgPSBNbGVGb3JNbW1mczo6Z2V0Um9vdFVybCgpOw0KCQlpZigkbWxlID09IG51bGwpDQoJCXsNCgkJCSRtbGU9J2ZyJzsNCgkJfSovDQoJCQ0KCQkNCgkJJGVudGl0eXMgPSBteUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMoJG1vZHVsZS0+Z2V0TmFtZSgpKTsNCgkJZm9yZWFjaCAoJGVudGl0eXMgYXMgJGVudGl0eSkNCgkJew0KCQkJaWYoJGVudGl0eS0+aXNJbmRleGFibGUoKSkNCgkJCXsJCQ0KDQoJCQkJaWYgKCRhdHRyID09ICRlbnRpdHktPmdldE5hbWUoKSkNCgkJCQl7DQoJCQkJCSRteUVudGl0eSA9IENvcmU6OnNlbGVjdEJ5SWQoJGVudGl0eSwgJGVudGl0eUlkKTsNCgkJCQkJDQoJCQkJCS8vJGN1cnJlbnRMYW5nSVNPID0gKCRtbGUgPT0gJ2ZyJz8nZnJfRlInOidlbl9VUycpOyAvL1RPRE8gOiBzZSBk6W1lcmRlciBwb3VyIHLpY3Vw6XJlciBsYSBsYW5ndWUgbGnpZSBhdSAkcmV0dXJuSWQ7DQoJCQkJCQ0KCQkJCQkkcHJldHR5VXJsID0gJyc7DQoJCQkJCSRsaW5rID0gJG1vZHVsZS0+Q3JlYXRlTGluaygkaWQsICdmaWNoZScsICRyZXR1cm5pZCwgDQoJCQkJCQkJCQknJywgDQoJCQkJCQkJCQlhcnJheSgiZWNsYXNzIj0+JG15RW50aXR5LT5nZXROYW1lKCksICJlY2xhc3NJZCI9PiRlbnRpdHlJZCksJycsdHJ1ZSxudWxsLG51bGwsbnVsbCwkcHJldHR5VXJsKTsNCgkJCQkgCQkJCSAgICANCgkJCQkJJHJlc3VsdFswXSA9ICRteUVudGl0eS0+Z2V0TmFtZSgpOw0KCQkJCQkkcmVzdWx0WzFdID0gaHRtbF9lbnRpdHlfZGVjb2RlKCRteUVudGl0eS0+Z2V0TmFtZSgpLicgIycuJGVudGl0eUlkLCBFTlRfUVVPVEVTLCAnVVRGLTgnKTsNCgkJCQkJJHJlc3VsdFsxXSA9IGh0bWxfZW50aXR5X2RlY29kZSgkcmVzdWx0WzFdLCBFTlRfUVVPVEVTLCAnVVRGLTgnKTsNCgkJCQkJDQoJCQkJCQ0KCQkJCQkkcmVzdWx0WzJdID0gJGxpbms7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCQ0KCQlyZXR1cm4gJHJlc3VsdDsNCiAgICB9DQoNCgkNCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.isortable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGludGVyZmFjZSBJU29ydGFibGUgd2hpY2ggYWxsb3cgdG8gc29ydCByZXN1bHRzIGZvciBhbiBlbnRpdHkNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQovKioNCiAqIEludGVyZmFjZSB3aWNoIGFsbG93IHRvIHNvcnQgcmVzdWx0cyBmb3IgYW4gZW50aXR5DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KaW50ZXJmYWNlIElTb3J0YWJsZQ0Kew0KCQ0KICAgIC8qKg0KICAgICogRnVuY3Rpb24gd2hpY2ggY29tcGFyZSB0d28gZW50aXRpZXMgaW4gcGFyYW1ldGVycw0KICAgICogDQogICAgKiANCiAgICAqIEBwYXJhbSBFbnRpdHkgdGhlIGZpcnN0IGVudGl0eSB3aXRoIGFsbCB2YWx1ZXMgc2V0dGVkDQogICAgKiBAcGFyYW0gRW50aXR5IHRoZSBzZWNvbmQgZW50aXR5IHdpdGggYWxsIHZhbHVlcyBzZXR0ZWQNCgkqDQogICAgKiBAcmV0dXJuIEludGVnZXIgOiAwIGlmIGVxdWFscywgMSBpZiB0aGUgZmlyc3QgZW50aXR5IGlzIHN1cGVyaW9yLCBlbHNlIC0xDQogICAgKiANCiAgICAqIEBzZWUgRW50aXR5DQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhFbnRpdHkgJGVudGl0eTEsIEVudGl0eSAkZW50aXR5Mik7DQp9DQoNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.key.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIGZvciB0aGUgZGlmZmVyZW50IGRhdGFiYXNlIGtleQ0KICogDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCi8qKg0KICogQ2xhc3MgZGVmaW5lcyB0aGUgZGlmZmVyZW50cyBrZXlzIHVzZWQgaW4gdGhlIE9ybSBzeXN0ZW0NCiAqIA0KICogIEtFWTo6JFBLIGRlZmluZXMgYSBwcmltYXJ5IGtleQ0KICogIEtFWTo6JEZLIGRlZmluZXMgYSBmb3JlaWduIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgMCwxLT5uIA0KICogIEtFWTo6JEFLIGRlZmluZXMgYW4gYXNzb2NpYXRlIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgdGhhdCBuZWVkaW5nIGEgdGhpcmQgdGFibGUNCiAqIA0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KKi8NCmNsYXNzIEtFWQ0Kew0KCXB1YmxpYyBzdGF0aWMgJFBLID0gMHg5OTAxOyAvLyBQcmltYXJ5IEtFWQ0KCXB1YmxpYyBzdGF0aWMgJEZLID0gMHg5OTAyOyAvLyBGb3JlaWduIEtFWSBhIGxpbmsgYmV0d2VlbiAyIGVudGl0aWVzIDAsMS0+bg0KCXB1YmxpYyBzdGF0aWMgJEFLID0gMHg5OTAzOyAvLyBBc3NvY2lhdGUgS0VZIGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgbi0+biB0aGF0IG5lZWRpbmcgYSB0aGlyZCB0YWJsZQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.myautoload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGF1dG9sb2FkIHN5c3RlbSB0aGF0IHdpbGwgbWVtb3JpemUgYWxsIHRoZSBlbnRpdGllcyB1c2VkIGJ5IGFsbCB0aGUgbW9kdWxlcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCiAvKioNCiAqIFN0YXRpYyBDbGFzcyBtYW5hZ2luZyBlbnRpdGllcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbg0KICoJVGhlIG1haW4gdXNlIGlzIHRvIG5vdCByZWRlY2xhcmF0ZSBYIGluc3RhbmNlcyBvZiBzYW1lIGNsYXNzZXMgaWYgaXQncyBub3QgbmVjZXNzYXJ5Lg0KICogQWxsIG1vZHVsZXMgaGF2ZSB0aGVpciBvd24gbmFtZXNwYWNlIHRvIGF2b2lkIHNoYXJpbmcgZW50aXRpZXMgYmV0d2VlbiB0d28gbW9kdWxlcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCmZpbmFsIGNsYXNzIE15QXV0b2xvYWQNCnsNCglwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2VzOw0KCQ0KCS8qKg0KCSAqIFByaXZhdGUgY29uc3RydWN0b3INCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXt9CQ0KCQ0KCS8qKg0KCSAqIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgZW50aXRpZXMgdGhlbXNlbGYgZHVyaW5nIHRoZWlyIF9jb25zdHJ1Y3QoKSBmdW5jdGlvbg0KCSAqIGl0IHdpbGwgc3RvY2sgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAoaWYgbm90IGFscmVhZHkgZXhpc3RpbmcpIGluIGhpcyBtZW1vcnkNCiAgICAgKiANCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlDQoJICogQHBhcmFtIHN0cmluZyBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQoJICovDQoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBhZGRJbnN0YW5jZSgkbmFtZXNwYWNlLCBFbnRpdHkgJGluc3RhbmNlKQ0KCXsJDQoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOw0KCQkkbmFtZSA9ICRpbnN0YW5jZS0+Z2V0TmFtZSgpOw0KCQkkbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOw0KCQkJCQ0KCQlpZihpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRuYW1lXSkpDQoJCXsNCgkJCVRyYWNlOjpkZWJ1ZygiSW5zdGFuY2UgIi4kbmFtZS4iIGFscmVhZHkgaW4gbWVtb3J5LiIpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCVRyYWNlOjpkZWJ1ZygiQWRkaW5nIHRoZSBpbnN0YW5jZSAiLiRuYW1lLiIgaW50byB0aGUgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7DQoJCXNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV1bJG5hbWVdID0gJGluc3RhbmNlOw0KCX0NCgkNCgkvKioNCgkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZW50aXR5IGZyb20gdGhlIG1lbW9yeS4gRWFjaCBpbnN0YW5jZSBpcyBhIGNsb25lIHRvIGF2b2lkIHVzaW5nDQoJICogdGhlIHNhbWUgb2JqZWN0IA0KICAgICAqIA0KCSAqIEBwYXJhbSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUNCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCgkgKg0KCSAqIEByZXR1cm4gRW50aXR5IGFuIGluc3RhbmNlIG9mIGVudGl0eQ0KCSAqLw0KCXB1YmxpYyBmaW5hbCBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSkNCgl7DQoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOw0KCQkkaW5zdGFuY2VOYW1lID0gc3RydG9sb3dlcigkaW5zdGFuY2VOYW1lKTsNCgkJbXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSk7DQoJCQ0KCQlUcmFjZTo6ZGVidWcoIkFza2luZyBhbiBpbnN0YW5jZSBvZiAiLiRpbnN0YW5jZU5hbWUuICIgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOw0KCQlpZihteUF1dG9sb2FkOjpoYXNJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKSkNCgkJew0KCQkJVHJhY2U6OmRlYnVnKCJJbnN0YW5jZSAiLiRpbnN0YW5jZU5hbWUuIiByZXR1cm5lZC4iKTsNCgkJCXJldHVybiBjbG9uZSBzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRpbnN0YW5jZU5hbWVdOw0KCQl9DQoJCQ0KCQlUcmFjZTo6ZXJyb3IoIk5vIGluc3RhbmNlICRpbnN0YW5jZU5hbWUgZm91bmQgaW4gbWVtb3J5IGZvciBuYW1lc3BhY2UgIi4kbmFtZXNwYWNlKTsNCgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5zdGFuY2UgJGluc3RhbmNlTmFtZSBmb3VuZCBpbiBtZW1vcnkgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOw0KCX0NCgkNCgkvKioNCgkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzIGluIHRoZSBtZW1vcnkgZm9yIHRoZSBzYW1lIG5hbWVzcGFjZQ0KICAgICAqIA0KCSAqIEBwYXJhbSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUNCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCgkgKg0KCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzDQoJICovDQoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBoYXNJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKXsNCgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7DQoJCSRpbnN0YW5jZU5hbWUgPSBzdHJ0b2xvd2VyKCRpbnN0YW5jZU5hbWUpOw0KCQkNCgkJbXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSk7DQoJCQ0KCQlyZXR1cm4gaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskaW5zdGFuY2VOYW1lXSk7DQoJfQ0KCQ0KCS8qKg0KCSAqIFJldHVybiBhbGwgdGhlIGluc3RhbmNlcyBvZiBhbGwgdGhlIGVudGl0aWVzIGZyb20gYSBzaW5nbGUgbmFtZXNwYWNlDQogICAgICogDQoJICogQHBhcmFtIG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQ0KCSAqIEBwYXJhbSBzdHJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KCSAqDQoJICogQHJldHVybiBhcnJheTxFbnRpdHk+IGFuIGFycmF5IG9mIGFsbCB0aGUgZW50aXRpZXMNCgkgKi8NCglwdWJsaWMgZmluYWwgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluc3RhbmNlcygkbmFtZXNwYWNlKQ0KCXsNCgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7DQoJCW15QXV0b2xvYWQ6OmlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpOw0KCQkNCgkJcmV0dXJuIHNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV07DQoJfQ0KCQ0KCS8qKg0KCSAqIFJldG91cm5lIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyBrbm93biBpbiBtZW1vcnkNCiAgICAgKiANCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlDQoJICoNCgkgKiBAcmV0dXJuIEJvb2xlYW4gaWYgdGhlIG5hbWVzcGFjZSBleGlzdHMNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKQ0KCXsNCgkJaWYoIWlzc2V0KHNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV0pKQ0KCQl7DQoJCQlUcmFjZTo6ZXJyb3IoIlRoZSBuYW1lc3BhY2UgJyRuYW1lc3BhY2UnIGRvZXNuJ3QgZXhpc3RlIGludG8gdGhlIE9ybSBTeXN0ZW0iKTsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBuYW1lc3BhY2UgJyRuYW1lc3BhY2UnIGRvZXNuJ3QgZXhpc3RlIGludG8gdGhlIE9ybSBTeXN0ZW0iKTsNCgkJfQ0KCX0NCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.trace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgYWxsIHRoZSBkZWJ1ZyBzeXN0ZW0uDQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KDQovKioNCiAqICBBbGxvdyBkaXNwbGF5IHN0YWNrdHJhY2UgYW5kIG90aGVyIGluZm9ybWF0aW9ucyBpbiBhIGNvbnNvbGUgb3Igb24gdGhlIHBhZ2UNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICogIGV4YW1wbGUNCiAqICA8Y29kZT4NCiAqICAgICAgICAgIFRyYWNlOjpkZWJ1ZygnaSBhbSBoZXJlICEnKTsNCiAqICAgICAgICAgIFRyYWNlOjppbmZvKCdwcm9jZXNzIGZpbmlzaGVkJyk7DQogKiAgICAgICAgICBUcmFjZTo6d2FybignQmUgY2FyZnVsbCA6IHRvbyBtdWNoIHJlc3VsdHMgd2lsbCBiZSBkaXNwbGF5ZWQnKTsNCiAqICAgICAgICAgIFRyYWNlOjplcnJvcignb3VwcyBob3VzdG9uLCB3ZSBoYXZlIGdvdCBhIHByb2JsZW0uLi4gOiggJyk7DQogKiAgPC9jb2RlPg0KICogDQogKiB0aGUgcHJvcGVydHkgJGxldmVsIG9mIHRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VzIHRvIGRpc3BsYXlpbmcNCiAqICBTbyBhIGxldmVsIG9mICJXQVJOIiB3aWxsIG9ubHkgZGlzcGxheSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcw0KICogIEJ5IGRlZmF1bHQgdGhlIGxldmVsIGlzIHNldHRlZCB0byBXQVJODQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLyAgIA0KIA0KZmluYWwgY2xhc3MgVHJhY2UNCnsNCglwdWJsaWMgc3RhdGljICRERUJVRyA9IDA7DQoJcHVibGljIHN0YXRpYyAkSU5GTyA9IDE7DQoJcHVibGljIHN0YXRpYyAkV0FSTiA9IDI7DQoJcHVibGljIHN0YXRpYyAkRVJST1IgPSAzOw0KCQ0KCS8vQ2hhbmdlIHRoaXMgdmFsdWUgZnJvbSAwIHRvIDMgdG8gY2hhbmdlIHRoZSBsZXZlbCBvZiBtZXNzYWdlIGRpc3BsYXllZA0KCXB1YmxpYyBzdGF0aWMgJGxldmVsID0gMjsNCgkNCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7DQoJfQ0KDQoJLyoqDQogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIERFQlVHIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBkZWJ1ZygkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokREVCVUcsICdkZWJ1ZycsICRtc2cpOw0KCX0NCg0KICAgIC8qKg0KICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBJTkZPIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBpbmZvKCRtc2cpDQoJewkNCgkJc2VsZjo6aW5uZXJXcml0ZXIoVHJhY2U6OiRJTkZPLCAnaW5mbycsICRtc2cpOw0KCX0gDQoNCiAgICAvKioNCiAgICAqIERpc3BsYXkgYSBtZXNzYWdlIHdpdGggV0FSTiBsZXZlbA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gd2FybigkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokV0FSTiwgJ3dhcm4nLCAkbXNnKTsNCgl9IA0KDQogICAgLyoqDQogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIEVSUk9SIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBlcnJvcigkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokRVJST1IsICdlcnJvcicsICRtc2cpOw0KCX0NCgkNCgkvKioNCgkgKiBEbyBhbGwgdGhlIHN1ZmYgYmVoaW5kDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBsZXZlbCBvZiBtZXNzYWdlLg0KCSAqIEBwYXJhbSBzdHJpbmcgdGhlIGNzcyBjbGFzcyB0byBkaXNwbGF5IHRoZSAiaW5saW5lIiBtZXNzYWdlDQoJICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaW5uZXJXcml0ZXIoJGxldmVsLCAkY3NzQ2xhc3MsICRtc2cpew0KCQlpZihzZWxmOjokbGV2ZWwgPiAkbGV2ZWwpIHtyZXR1cm47fQ0KCQkNCgkJLy9JbiB3aW5kb3dzDQoJCWVjaG8gIjxkaXYgY2xhc3M9JyRjc3NDbGFzcycgPiRtc2c8L2Rpdj4iOw0KCQkNCgkJLy9JbiBwaHAgbG9nDQoJCWVycm9yX2xvZygkbXNnKTsNCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.typecriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBUeXBlQ3JpdGVyaWEgY2xhc3MKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAoKLyoqCiAqIEVudW0gZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgVHlwZUNyaXRlcmlhCiAqIAogKiAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBUeXBlQ3JpdGVyaWEKewogICAgLyoqCiAgICAqIElzIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRFUSA9ICcgPSAnOwogICAgCiAgICAvKioKICAgICogSXMgZGlmZmVyZW50IE9mCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5FUSA9ICcgIT0gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIHN0cmljdGx5IGdyZWF0ZXIgIHRoYW4KICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkR1QgPSAnID4gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGdyZWF0ZXIgIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRHVEUgPSAnID49ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBzdHJpY3RseSBsZXNzZXIgdGhhbgogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVCA9ICcgPCAnOwogICAgCiAgICAvKioKICAgICogaXMgbGVzc2VyIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVEUgPSAnIDw9ICc7CgkKCS8qKgogICAgKiBpcyBOVUxMIG9yIGlzIEVtcHR5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVNUFRZID0gJ2lzIGVtcHR5KCknOwoJCiAgICAvKioKICAgICogaXMgTm90IE5VTEwgYW5kIGlzIE5vdCBFbXB0eQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRORU1QVFkgPSAnaXMgbm90IGVtcHR5KCknOwogICAgCiAgICAvKioKICAgICogaXMgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROVUxMID0gJyBpcyBudWxsICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBOb3QgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROTlVMTCA9ICcgaXMgbm90IG51bGwnOwogICAgCiAgICAvKioKICAgICogaXMgYmVmb3JlIChhIERhdGUpCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEJFRk9SRSA9ICcgYmVmb3JlICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBhZnRlciAoYSBEYXRlKQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRBRlRFUiA9ICcgYWZ0ZXIgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGJldHdlZW4gKGEgRGF0ZSkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkQkVUV0VFTiA9ICcgYWZ0ZXIgJzsKICAgICAKICAgIC8qKgogICAgKiBpcyBjb250YWluZWQgaW50byB0aGUgYXJyYXkKICAgICogCiAgICAqIC8hXCBuZWVkIGF0IGxhc3QgMiB2YWx1ZXMgaW4gdGhlIGFycmF5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJElOID0gJ2luICglYSknOwogICAgCiAgICAvKioKICAgICogaXMgbm90IGNvbnRhaW5lZCBpbnRvIHRoZSBhcnJheQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogLyFcIG5lZWQgYXQgbGFzdCAyIHZhbHVlcyBpbiB0aGUgYXJyYXkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTklOID0gJ25vdCBpbiAoJWEpJzsKICAgIAogICAgLyoqCiAgICAqIGNvbnRhaW5zIHRoZSBzdHJpbmcKICAgICogCiAgICAqIC8hXCBkb24ndCBmb3JnZXQgdG8gYWRkIHRoZSB3aWxkY2FyZCAnJScKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTElLRSA9ICcgbGlrZSAnOwogICAgCiAgICAvKioKICAgICogZG9lc24ndCBjb250YWluIHRoZSBzdHJpbmcKICAgICogCiAgICAqIC8hXCBkb24ndCBmb3JnZXQgdG8gYWRkIHRoZSB3aWxkY2FyZCAnJScKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTkxJS0UgPSAnIG5vdCBsaWtlICc7Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KJHRoaXMtPkF1ZGl0KCAwLCANCgkgICAgICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksIA0KCSAgICAgICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSApOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nDQokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nDQokdGhpcy0+QXVkaXQoIDAsICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICAkdGhpcy0+TGFuZygndXBncmFkZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7DQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/Orm.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCgkvKioNCgkqIENsYXNzZSBvZiBjbXNtYWRlc2ltcGxlJ3MgQVBJLiBVc2VkIHRvIG1ha2UgYSBsaW5rIGJldHdlZW4gdGhlIEFQSSBvZiBDbXNNYWRlU2ltcGxlIGFuZCBvdGhlciBtb2R1bGVzJw0KCSoNCgkqIEBzaW5jZSAwLjAuMQ0KCSogQGF1dGhvciBCZXNzDQoJKiBAcGFja2FnZSBPcm0NCgkqKi8NCg0KCS8vVW5pcXVlIGltcG9ydCwgdG8gdXNlIHRoZSBUcmFjZSBpbnRvIHRoaXMgY2xhc3NlDQoJaW5jbHVkZV9vbmNlKGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksImxpYiIsImNsYXNzLnRyYWNlLnBocCIpKTsNCg0KCS8vVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGFjdGl2YXRlIHRoZSBkZWJ1ZyBtb2RlDQoJI1RyYWNlOjokbGV2ZWwgPSBUcmFjZTo6JERFQlVHOw0KCS8vT3RoZXIgdmFsdWUgOiAkREVCVUd8JElORk98JFdBUk58JEVSUk9SDQoNCgkvKioNCgkqIFRoZSBDbGFzcyBPcm0gZGVmaW5lIHRoZSBtb2R1bGUgT3JtIGFuZCBhbGxvdyBoYXZpbmcgYWxsIHRoZSBvcm0gZnVuY3Rpb25uYWxpdGllcyBpbnRvIGFub3RoZXIgbW9kdWxlDQoJKg0KCSogQHNpbmNlIDAuMC4xDQoJKiBAYXV0aG9yIEJlc3MNCgkqIEBwYWNrYWdlIGNtc21zDQoJKi8NCmNsYXNzIE9ybSBleHRlbmRzIENNU01vZHVsZSB7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCgkJcGFyZW50OjpfX2NvbnN0cnVjdCgpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldE5hbWUoKSB7DQoJCXJldHVybiAnT3JtJzsNCgl9DQoNCglmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsNCgkJcmV0dXJuICcwLjAuMic7DQoJfQ0KICANCglmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQ0KIAl7DQogICAgCXJldHVybiBhcnJheSgpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEhlbHAoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdLZXZpbiBEYW5lemlzIChha2EgQmVzcyknOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgew0KCQlyZXR1cm4gJ2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7DQoJfQ0KDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS4xMS4wIjsNCgl9DQoNCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZ1bmN0aW9uIEhhc0FkbWluKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7DQoJCXJldHVybiAnZXh0ZW5zaW9ucyc7DQoJfQ0KDQoJZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7DQoJfQ0KDQoJZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgew0KCX0NCg0KCWZ1bmN0aW9uIEFsbG93U21hcnR5Q2FjaGluZygpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZ1bmN0aW9uIExhenlMb2FkRnJvbnRlbmQoKSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCglmdW5jdGlvbiBMYXp5TG9hZEFkbWluKCkgew0KCSAgcmV0dXJuIGZhbHNlOw0KCX0NCgkNCglmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgeyAgDQoJfQ0KDQoJZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7DQoJfQ0KDQoJZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOw0KCX0NCg0KCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOw0KCX0gIA0KCQ0KCWZ1bmN0aW9uIERpc3BsYXlFcnJvclBhZ2UoJG1zZykgew0KCQllY2hvICI8aDM+Ii4kbXNnLiI8L2gzPiI7DQoJfSANCgkJIA0KCXByaXZhdGUgZnVuY3Rpb24gR2V0TXlNb2R1bGVQYXRoKCkgew0KCQkvKiRjb25maWcgPSBjbXNtcygpLT5nZXRDb25maWcoKTsNCgkJaWYoc3RycG9zKHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpLCAkY29uZmlnWydyb290X3BhdGgnXSkgIT09IEZBTFNFKQ0KCQl7Ki8JcmV0dXJuIHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpOy8qfQ0KCQllbHNlDQoJCXsJcmV0dXJuIGNtc19qb2luX3BhdGgoJGNvbmZpZ1sncm9vdF9wYXRoJ10sICdtb2R1bGVzJywgJHRoaXMtPmdldE5hbWUoKSk7fSovDQoJfQ0KDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fYXV0b2xvYWQoKSB7CQ0KCQlzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJHRoaXMsICdhdXRvbG9hZF9jbGFzc2VzJykpOw0KCQkvL3NwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2F1dG9sb2FkX2NsYXNzZXNfYWRkb24nKSk7DQoJCQ0KCQkvL09uIGxpc3RlIGxlcyBjbGFzc2VzIGTpY2xhcullcyBkYW5zIGxlIHLpcGVydG9pcmUgZHUgbW9kdWxlIGVuZmFudA0KCQkkcmVwZXJ0b2lyZSA9IGNtc19qb2luX3BhdGgoJHRoaXMtPkdldE15TW9kdWxlUGF0aCgpLCdsaWInKTsNCgkJJGRpciA9IG9wZW5kaXIoJHJlcGVydG9pcmUpOyANCgkJJGxpc3RlWydlbnRpdGllcyddID0gYXJyYXkoKTsNCgkJJGxpc3RlWydhc3NvY2lhdGUnXSA9IGFycmF5KCk7DQoJCS8vJGxpc3RlWycnXSA9IGFycmF5KCk7DQoJCQ0KCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJGRpcikpIHsNCgkJCWlmKHN0cmlwb3MoJGZpbGUsICdjbGFzcy5lbnRpdHkuJykgIT09IEZBTFNFKXsNCgkJCQkkbmFtZSA9IHN1YnN0cigkZmlsZSAsIDEzICxzdHJsZW4oJGZpbGUpIC0gNCAtIDEzKTsNCgkJCQkkbGlzdGVbJ2VudGl0aWVzJ11bXSA9IGFycmF5KCdmaWxlJz0+JGZpbGUsICduYW1lJz0+JG5hbWUpOw0KCQkJfSBlbHNlaWYoc3RyaXBvcygkZmlsZSwgJ2NsYXNzLmFzc29jLicpICE9PSBGQUxTRSkgew0KCQkJCSRuYW1lID0gc3Vic3RyKCRmaWxlICwgMTIgLHN0cmxlbigkZmlsZSkgLSA0IC0gMTIpOw0KCQkJCSRsaXN0ZVsnYXNzb2NpYXRlJ11bXSA9IGFycmF5KCdmaWxlJz0+JGZpbGUsICduYW1lJz0+JG5hbWUpOw0KCQkJfSBlbHNlIHsNCgkJCX0NCgkJfQ0KCQljbG9zZWRpcigkZGlyKTsNCgkJDQoJCWZvcmVhY2goJGxpc3RlWydlbnRpdGllcyddIGFzICRlbGVtZW50KQ0KCQl7DQoJCQkkZW50aXR5RmlsZSA9IGNtc19qb2luX3BhdGgoJHJlcGVydG9pcmUsJGVsZW1lbnRbJ2ZpbGUnXSk7DQoJCQlUcmFjZTo6ZGVidWcoImltcG9ydCBlbnRpdGUgIi4kZW50aXR5RmlsZS4iIGRhbnMgbGUgbW9kdWxlICIuJHRoaXMtPmdldE5hbWUoKS4iPGJyLz4iKTsNCgkJCXJlcXVpcmVfb25jZSgkZW50aXR5RmlsZSk7DQoJCQlldmFsKCckZW50aXR5ID0gbmV3ICcuJGVsZW1lbnRbJ25hbWUnXS4nKCk7Jyk7DQoJCX0NCgkJZm9yZWFjaCgkbGlzdGVbJ2Fzc29jaWF0ZSddIGFzICRlbGVtZW50KQ0KCQl7DQoJCQkkZW50aXR5RmlsZSA9IGNtc19qb2luX3BhdGgoJHJlcGVydG9pcmUsJGVsZW1lbnRbJ2ZpbGUnXSk7DQoJCQlUcmFjZTo6ZGVidWcoImltcG9ydCBhc3NvY2lhdGUgZW50aXRlICIuJGVudGl0eUZpbGUuIiBkYW5zIGxlIG1vZHVsZSAiLiR0aGlzLT5nZXROYW1lKCkuIjxici8+Iik7DQoJCQlyZXF1aXJlX29uY2UoJGVudGl0eUZpbGUpOw0KCQkJZXZhbCgnJGVudGl0eSA9IG5ldyAnLiRlbGVtZW50WyduYW1lJ10uJygpOycpOw0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZF9jbGFzc2VzKCRjbGFzc25hbWUpew0KCQlUcmFjZTo6ZGVidWcoIiZuYnNwOyZuYnNwOyZuYnNwOyBOZWVkICRjbGFzc25hbWU8YnIvPiIpOw0KCQkkT3JtID0gbmV3IE9ybSgpOw0KCQkkcGF0aCA9ICRPcm0tPkdldE15TW9kdWxlUGF0aCgpOw0KCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJsaWIiLCJjbGFzcy4iLnN0cnRvbG93ZXIoJGNsYXNzbmFtZSkuIi5waHAiKTsNCg0KDQoJCVRyYWNlOjpkZWJ1ZygiaW1wb3J0IGNsYXNzIGR1IGZyYW1ld29yayB2aWEgIi4kdGhpcy0+Z2V0TmFtZSgpLiI6ICRmbjxici8+Iik7DQoNCgkJaWYoZmlsZV9leGlzdHMoJGZuKSl7DQoJCQlyZXF1aXJlX29uY2UoJGZuKTsNCgkJCVRyYWNlOjpkZWJ1ZygiaW1wb3J0ICRmbiBvazxici8+Iik7DQoJCX0gZWxzZSB7DQoJCQlUcmFjZTo6ZGVidWcoImZpY2hpZXIgJGZuIGludHJvdXZhYmxlLCBvbiBwYXNzZTxici8+Iik7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2hvcnRjdXQgdG8gY2FsbCBhbGwgdGhlIGluc3RhbmNlcyBmb3IgYSBzaW5nbGUgbW9kdWxlDQoJICoNCgkgKiBAcmV0dXJuIExpc3Q8RW50aXR5PiB0aGUgZW50aXRpZXMgZm9yIHRoZSBjdXJyZW50IHBhcmVudCdzIG5hbWVzcGFjZQ0KCSAqKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsSW5zdGFuY2VzKCl7DQoJCXJldHVybiBNeUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMocGFyZW50OjpHZXROYW1lKCkpOw0KCX0NCgkvKg0KCXB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZF9jbGFzc2VzX2FkZG9uKCRjbGFzc25hbWUpew0KCQlUcmFjZTo6ZGVidWcoIiZuYnNwOyZuYnNwOyZuYnNwOyRjbGFzc25hbWU8YnIvPiIpOw0KCQkNCgkJJHBhdGggPSAkdGhpcy0+R2V0TXlNb2R1bGVQYXRoKCk7DQoJCQ0KCQkkZm4gPSBudWxsOw0KCSAgIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkhUTUxfRklFTEQiKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmllbGRodG1sLnBocCIpOw0KCSAgIH0gZWxzZSBpZihzdHJpcG9zKCRjbGFzc25hbWUsICJTRUFSQ0hfRklFTEQiKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuc2VhcmNoZmllbGQucGhwIik7DQoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJRUxEXyIpICE9PSBGQUxTRSkNCgkgICB7DQoJCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJjbGFzcyIsImNsYXNzLmFkZC5maWVsZHNzeXN0ZW0ucGhwIik7DQoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJTFRSRV8iKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmlsdHJlLnBocCIpOw0KCSAgIH0NCgkgICANCgkgICBpZigkZm4gIT0gbnVsbCkNCgkgICB7DQoJCQlUcmFjZTo6ZGVidWcoICJpbXBvcnQgZCd1biBhZGRvbiBkdSBwcm9qZXQgIi4kdGhpcy0+Z2V0TmFtZSgpLiI6ICRmbjxici8+Iik7DQoJICAgDQoJCQlpZihmaWxlX2V4aXN0cygkZm4pKXsNCgkJCQlyZXF1aXJlX29uY2UoJGZuKTsNCgkJCX0NCgkJfQ0KCX0qLw0KCS8qDQoJZnVuY3Rpb24gU2VhcmNoUmVpbmRleCgmJG1vZHVsZSA9IG51bGwpIHsNCgkJLy9PbiDpdml0ZSBkZSBzJ2F1dG8taW5kZXhlci4NCgkJaWYoJHRoaXMtPmdldE5hbWUoKSA9PSAnTW1tZnMnKQ0KCQkJcmV0dXJuOwkJDQoJCQkNCgkJLy8gSW5kZXhpbmc6OnNldFNlYXJjaCgkbW9kdWxlKTsNCgkJSW5kZXhpbmc6OlNlYXJjaFJlaW5kZXgoJHRoaXMtPmdldE5hbWUoKSk7DQoJfSovDQoNCgkvKioNCgkgKiBBcHBlbOllIHBhciBTZWFyY2ggcG91ciBhZmZpY2hlciB1biBy6XN1bHRhdA0KCSAqLy8qDQoJZnVuY3Rpb24gU2VhcmNoUmVzdWx0KCRyZXR1cm5pZCwgJGVudGl0eUlkLCAkYXR0ciA9ICcnKSB7CQ0KCQkvL09uIG5lIHJldG91cm5lIHJpZW4gZGUgTW1tZnMgZGUgdG91dGUgbWFuaehyZQ0KCQlpZigkdGhpcy0+Z2V0TmFtZSgpID09ICdNbW1mcycpDQoJCQlyZXR1cm47CQ0KCQkNCgkJcmV0dXJuIEluZGV4aW5nOjpTZWFyY2hSZXN1bHQoJHRoaXMsICRpZCwgJHJldHVybmlkLCAkZW50aXR5SWQsICRhdHRyKTsNCgl9Ki8NCg0KfSANCj8+DQo=]]></data>
	</file>
</module>
