<?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.3.3</version>
  <mincmsversion>1.11.12</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjwvcD4KPGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbcOodHJlIHV0aWxpc8OpIHBvdXIgc3DDqWNpZmllciBkYW5zIHF1ZWxsZSBsYW5ndWUgYWZmaWNoZXIgbGUgbW9kdWxlIGRhbnMgbGEgcGFydGllIHB1YmxpcXVlLiBDZSBwYXJhbcOodHJlIG4nZXN0IHBhcyBzdXBwb3J0w6kgb3UgdXRpbGUgcG91ciB0b3VzIGxlcyBtb2R1bGVzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4zLjM8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+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.admin_save.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKGlzc2V0KCRwYXJhbXNbJ2RlbGV0ZUxvZyddKSl7CglpZihmaWxlX2V4aXN0cyhPcm1UcmFjZTo6Z2V0TG9nRmlsZSgpKSl7CgkJdW5saW5rKE9ybVRyYWNlOjpnZXRMb2dGaWxlKCkpOwoJfQoJT3JtVHJhY2U6OmluZm8oIlJlaW5pdGlhdGUgdGhlIGxvZyBmaWxlIik7Cn0gZWxzZWlmIChpc3NldCgkcGFyYW1zWydkZWxldGVDYWNoZSddKSl7CgoJJGNhY2hlID0gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCk7CgkkY2FjaGUtPmNsZWFyQ2FjaGUoKTsKCU9ybVRyYWNlOjppbmZvKCJSZWluaXRpYXRlIHRoZSBjYWNoZSBjb250ZW50Iik7Cn0gZWxzZSBpZiAoaXNzZXQoJHBhcmFtc1snbGV2ZWwnXSkpewoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xvZ2xldmVsJywgJHBhcmFtc1snbGV2ZWwnXSk7Cn0gZWxzZSBpZiAgKCBpc3NldCgkcGFyYW1zWydjYWNoZSddKSApewoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NhY2hlVHlwZScsICRwYXJhbXNbJ2NhY2hlJ10pOwoJCgkvL1dlIHJlbG9hZCB0aGUgY2FjaGUgYW55d2F5CgkkY2FjaGUgPSBPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKTsKCSRjYWNoZS0+Y2xlYXJDYWNoZSgpOwoJCglPcm1UcmFjZTo6aW5mbygiSW5pdGlhdGUgdGhlIGNhY2hlIGNvbnRlbnQiKTsKfQoKJHRoaXMtPnJlZGlyZWN0KCRpZCwnZGVmYXVsdGFkbWluJyk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLy9DT05TVEFOVEVTCiRpdGVtc0xvZyA9IGFycmF5KCJERUJVRyI9Pk9ybVRyYWNlOjokREVCVUcsICJJTkZPICYgU1FMIj0+T3JtVHJhY2U6OiRTUUwsICJJTkZPIj0+T3JtVHJhY2U6OiRJTkZPLCJXQVJOIj0+T3JtVHJhY2U6OiRXQVJOLCJFUlJPUiI9Pk9ybVRyYWNlOjokRVJST1IpOwokaXRlbXNDYWNoZSA9IGFycmF5KCJOT05FIj0+T3JtQ2FjaGU6OiROT05FLCAiU0NSSVBUIj0+T3JtQ2FjaGU6OiRTQ1JJUFQpOwoKJGN1cnJlbnRMZXZlbExvZyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsIE9ybVRyYWNlOjokSU5GTyk7CiRjdXJyZW50VHlwZUNhY2hlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NhY2hlVHlwZScsIE9ybUNhY2hlOjokTk9ORSk7CgovL0luaXRpYXRlIHRoZSBmaWxlIG9mIGxvZwppZighZmlsZV9leGlzdHMoT3JtVHJhY2U6OmdldExvZ0ZpbGUoKSkpewoJT3JtVHJhY2U6OmluZm8oIkluaXRpYXRlIHRoZSBsb2cgZmlsZSIpOzsKfQoKJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOwokc21hcnR5LT5hc3NpZ24oImlkIiwkaWQpOwokc21hcnR5LT5hc3NpZ24oImZvcm1zdGFydGNhY2hlIiwkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ2FkbWluX3NhdmUnKSk7CiRzbWFydHktPmFzc2lnbigiZm9ybXN0YXJ0dHJhY2UiLCR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoJGlkLCAnYWRtaW5fc2F2ZScpKTsKJHNtYXJ0eS0+YXNzaWduKCJzdWJtaXQiLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywgJ1NhdmUgUHJlZnMnKSk7CiRzbWFydHktPmFzc2lnbigiZGVsZXRlTG9nIiwkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlbGV0ZUxvZycsICdDbGVhbiBMb2dzJykpOwokc21hcnR5LT5hc3NpZ24oImRlbGV0ZUNhY2hlIiwkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlbGV0ZUNhY2hlJywgJ0NsZWFuIENhY2hlJykpOwokc21hcnR5LT5hc3NpZ24oInNlbGVjdExvZyIsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICgkaWQsICdsZXZlbCcsICRpdGVtc0xvZywgLTEsICRjdXJyZW50TGV2ZWxMb2cpKTsKJHNtYXJ0eS0+YXNzaWduKCJzZWxlY3RDYWNoZSIsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duICgkaWQsICdjYWNoZScsICRpdGVtc0NhY2hlLCAtMSwgJGN1cnJlbnRUeXBlQ2FjaGUpKTsKCiRzbWFydHktPmFzc2lnbigidXJsTG9nIiwgT3JtVHJhY2U6OmdldExvZ1VybCgpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnYWRtaW4udHBsJyk7CgoKPz4=]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/js/difflib.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKgpUaGlzIGlzIHBhcnQgb2YganNkaWZmbGliIHYxLjAuIDxodHRwOi8vc25vd3RpZGUuY29tL2pzZGlmZmxpYj4KCkNvcHlyaWdodCAoYykgMjAwNywgU25vd3RpZGUgSW5mb3JtYXRpY3MgU3lzdGVtcywgSW5jLgpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCgkJbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgkqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKCQl0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCgkJYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgkqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFNub3d0aWRlIEluZm9ybWF0aWNzIFN5c3RlbXMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKCQljb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCgkJc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQpFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQKU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEClRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgpBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSApEQU1BR0UuCioqKi8KLyogQXV0aG9yOiBDaGFzIEVtZXJpY2sgPGNlbWVyaWNrQHNub3d0aWRlLmNvbT4gKi8KdmFyIF9fd2hpdGVzcGFjZSA9IHsiICI6dHJ1ZSwgIlx0Ijp0cnVlLCAiXG4iOnRydWUsICJcZiI6dHJ1ZSwgIlxyIjp0cnVlfTsKCnZhciBkaWZmbGliID0gewoJZGVmYXVsdEp1bmtGdW5jdGlvbjogZnVuY3Rpb24gKGMpIHsKCQlyZXR1cm4gX193aGl0ZXNwYWNlLmhhc093blByb3BlcnR5KGMpOwoJfSwKCQoJc3RyaXBMaW5lYnJlYWtzOiBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBzdHIucmVwbGFjZSgvXltcblxyXSp8W1xuXHJdKiQvZywgIiIpOyB9LAoJCglzdHJpbmdBc0xpbmVzOiBmdW5jdGlvbiAoc3RyKSB7CgkJdmFyIGxmcG9zID0gc3RyLmluZGV4T2YoIlxuIik7CgkJdmFyIGNycG9zID0gc3RyLmluZGV4T2YoIlxyIik7CgkJdmFyIGxpbmVicmVhayA9ICgobGZwb3MgPiAtMSAmJiBjcnBvcyA+IC0xKSB8fCBjcnBvcyA8IDApID8gIlxuIiA6ICJcciI7CgkJCgkJdmFyIGxpbmVzID0gc3RyLnNwbGl0KGxpbmVicmVhayk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewoJCQlsaW5lc1tpXSA9IGRpZmZsaWIuc3RyaXBMaW5lYnJlYWtzKGxpbmVzW2ldKTsKCQl9CgkJCgkJcmV0dXJuIGxpbmVzOwoJfSwKCQoJLy8gaXRlcmF0aW9uLWJhc2VkIHJlZHVjZSBpbXBsZW1lbnRhdGlvbgoJX19yZWR1Y2U6IGZ1bmN0aW9uIChmdW5jLCBsaXN0LCBpbml0aWFsKSB7CgkJaWYgKGluaXRpYWwgIT0gbnVsbCkgewoJCQl2YXIgdmFsdWUgPSBpbml0aWFsOwoJCQl2YXIgaWR4ID0gMDsKCQl9IGVsc2UgaWYgKGxpc3QpIHsKCQkJdmFyIHZhbHVlID0gbGlzdFswXTsKCQkJdmFyIGlkeCA9IDE7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCWZvciAoOyBpZHggPCBsaXN0Lmxlbmd0aDsgaWR4KyspIHsKCQkJdmFsdWUgPSBmdW5jKHZhbHVlLCBsaXN0W2lkeF0pOwoJCX0KCQkKCQlyZXR1cm4gdmFsdWU7Cgl9LAoJCgkvLyBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBzb3J0aW5nIGxpc3RzIG9mIG51bWVyaWMgdHVwbGVzCglfX250dXBsZWNvbXA6IGZ1bmN0aW9uIChhLCBiKSB7CgkJdmFyIG1sZW4gPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbWxlbjsgaSsrKSB7CgkJCWlmIChhW2ldIDwgYltpXSkgcmV0dXJuIC0xOwoJCQlpZiAoYVtpXSA+IGJbaV0pIHJldHVybiAxOwoJCX0KCQkKCQlyZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggPyAwIDogKGEubGVuZ3RoIDwgYi5sZW5ndGggPyAtMSA6IDEpOwoJfSwKCQoJX19jYWxjdWxhdGVfcmF0aW86IGZ1bmN0aW9uIChtYXRjaGVzLCBsZW5ndGgpIHsKCQlyZXR1cm4gbGVuZ3RoID8gMi4wICogbWF0Y2hlcyAvIGxlbmd0aCA6IDEuMDsKCX0sCgkKCS8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIGtleSBwYXNzZWQgdG8gdGhlIHJldHVybmVkIGZ1bmN0aW9uCgkvLyBpcyBpbiB0aGUgZGljdCAoanMgb2JqZWN0KSBwcm92aWRlZCB0byB0aGlzIGZ1bmN0aW9uOyByZXBsYWNlcyBiZWluZyBhYmxlIHRvCgkvLyBjYXJyeSBhcm91bmQgZGljdC5oYXNfa2V5IGluIHB5dGhvbi4uLgoJX19pc2luZGljdDogZnVuY3Rpb24gKGRpY3QpIHsKCQlyZXR1cm4gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZGljdC5oYXNPd25Qcm9wZXJ0eShrZXkpOyB9OwoJfSwKCQoJLy8gcmVwbGFjZW1lbnQgZm9yIHB5dGhvbidzIGRpY3QuZ2V0IGZ1bmN0aW9uIC0tIG5lZWQgZWFzeSBkZWZhdWx0IHZhbHVlcwoJX19kaWN0Z2V0OiBmdW5jdGlvbiAoZGljdCwga2V5LCBkZWZhdWx0VmFsdWUpIHsKCQlyZXR1cm4gZGljdC5oYXNPd25Qcm9wZXJ0eShrZXkpID8gZGljdFtrZXldIDogZGVmYXVsdFZhbHVlOwoJfSwJCgkKCVNlcXVlbmNlTWF0Y2hlcjogZnVuY3Rpb24gKGEsIGIsIGlzanVuaykgewoJCXRoaXMuc2V0X3NlcXMgPSBmdW5jdGlvbiAoYSwgYikgewoJCQl0aGlzLnNldF9zZXExKGEpOwoJCQl0aGlzLnNldF9zZXEyKGIpOwoJCX0KCQkKCQl0aGlzLnNldF9zZXExID0gZnVuY3Rpb24gKGEpIHsKCQkJaWYgKGEgPT0gdGhpcy5hKSByZXR1cm47CgkJCXRoaXMuYSA9IGE7CgkJCXRoaXMubWF0Y2hpbmdfYmxvY2tzID0gdGhpcy5vcGNvZGVzID0gbnVsbDsKCQl9CgkJCgkJdGhpcy5zZXRfc2VxMiA9IGZ1bmN0aW9uIChiKSB7CgkJCWlmIChiID09IHRoaXMuYikgcmV0dXJuOwoJCQl0aGlzLmIgPSBiOwoJCQl0aGlzLm1hdGNoaW5nX2Jsb2NrcyA9IHRoaXMub3Bjb2RlcyA9IHRoaXMuZnVsbGJjb3VudCA9IG51bGw7CgkJCXRoaXMuX19jaGFpbl9iKCk7CgkJfQoJCQoJCXRoaXMuX19jaGFpbl9iID0gZnVuY3Rpb24gKCkgewoJCQl2YXIgYiA9IHRoaXMuYjsKCQkJdmFyIG4gPSBiLmxlbmd0aDsKCQkJdmFyIGIyaiA9IHRoaXMuYjJqID0ge307CgkJCXZhciBwb3B1bGFyZGljdCA9IHt9OwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKCQkJCXZhciBlbHQgPSBiW2ldOwoJCQkJaWYgKGIyai5oYXNPd25Qcm9wZXJ0eShlbHQpKSB7CgkJCQkJdmFyIGluZGljZXMgPSBiMmpbZWx0XTsKCQkJCQlpZiAobiA+PSAyMDAgJiYgaW5kaWNlcy5sZW5ndGggKiAxMDAgPiBuKSB7CgkJCQkJCXBvcHVsYXJkaWN0W2VsdF0gPSAxOwoJCQkJCQlkZWxldGUgYjJqW2VsdF07CgkJCQkJfSBlbHNlIHsKCQkJCQkJaW5kaWNlcy5wdXNoKGkpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJYjJqW2VsdF0gPSBbaV07CgkJCQl9CgkJCX0KCQoJCQlmb3IgKHZhciBlbHQgaW4gcG9wdWxhcmRpY3QpIHsKCQkJCWlmIChwb3B1bGFyZGljdC5oYXNPd25Qcm9wZXJ0eShlbHQpKSB7CgkJCQkJZGVsZXRlIGIyaltlbHRdOwoJCQkJfQoJCQl9CgkJCQoJCQl2YXIgaXNqdW5rID0gdGhpcy5pc2p1bms7CgkJCXZhciBqdW5rZGljdCA9IHt9OwoJCQlpZiAoaXNqdW5rKSB7CgkJCQlmb3IgKHZhciBlbHQgaW4gcG9wdWxhcmRpY3QpIHsKCQkJCQlpZiAocG9wdWxhcmRpY3QuaGFzT3duUHJvcGVydHkoZWx0KSAmJiBpc2p1bmsoZWx0KSkgewoJCQkJCQlqdW5rZGljdFtlbHRdID0gMTsKCQkJCQkJZGVsZXRlIHBvcHVsYXJkaWN0W2VsdF07CgkJCQkJfQoJCQkJfQoJCQkJZm9yICh2YXIgZWx0IGluIGIyaikgewoJCQkJCWlmIChiMmouaGFzT3duUHJvcGVydHkoZWx0KSAmJiBpc2p1bmsoZWx0KSkgewoJCQkJCQlqdW5rZGljdFtlbHRdID0gMTsKCQkJCQkJZGVsZXRlIGIyaltlbHRdOwoJCQkJCX0KCQkJCX0KCQkJfQoJCgkJCXRoaXMuaXNianVuayA9IGRpZmZsaWIuX19pc2luZGljdChqdW5rZGljdCk7CgkJCXRoaXMuaXNicG9wdWxhciA9IGRpZmZsaWIuX19pc2luZGljdChwb3B1bGFyZGljdCk7CgkJfQoJCQoJCXRoaXMuZmluZF9sb25nZXN0X21hdGNoID0gZnVuY3Rpb24gKGFsbywgYWhpLCBibG8sIGJoaSkgewoJCQl2YXIgYSA9IHRoaXMuYTsKCQkJdmFyIGIgPSB0aGlzLmI7CgkJCXZhciBiMmogPSB0aGlzLmIyajsKCQkJdmFyIGlzYmp1bmsgPSB0aGlzLmlzYmp1bms7CgkJCXZhciBiZXN0aSA9IGFsbzsKCQkJdmFyIGJlc3RqID0gYmxvOwoJCQl2YXIgYmVzdHNpemUgPSAwOwoJCQl2YXIgaiA9IG51bGw7CgkJCXZhciBrOwoJCgkJCXZhciBqMmxlbiA9IHt9OwoJCQl2YXIgbm90aGluZyA9IFtdOwoJCQlmb3IgKHZhciBpID0gYWxvOyBpIDwgYWhpOyBpKyspIHsKCQkJCXZhciBuZXdqMmxlbiA9IHt9OwoJCQkJdmFyIGpkaWN0ID0gZGlmZmxpYi5fX2RpY3RnZXQoYjJqLCBhW2ldLCBub3RoaW5nKTsKCQkJCWZvciAodmFyIGprZXkgaW4gamRpY3QpIHsKCQkJCQlpZiAoamRpY3QuaGFzT3duUHJvcGVydHkoamtleSkpIHsKCQkJCQkJaiA9IGpkaWN0W2prZXldOwoJCQkJCQlpZiAoaiA8IGJsbykgY29udGludWU7CgkJCQkJCWlmIChqID49IGJoaSkgYnJlYWs7CgkJCQkJCW5ld2oybGVuW2pdID0gayA9IGRpZmZsaWIuX19kaWN0Z2V0KGoybGVuLCBqIC0gMSwgMCkgKyAxOwoJCQkJCQlpZiAoayA+IGJlc3RzaXplKSB7CgkJCQkJCQliZXN0aSA9IGkgLSBrICsgMTsKCQkJCQkJCWJlc3RqID0gaiAtIGsgKyAxOwoJCQkJCQkJYmVzdHNpemUgPSBrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJajJsZW4gPSBuZXdqMmxlbjsKCQkJfQoJCgkJCXdoaWxlIChiZXN0aSA+IGFsbyAmJiBiZXN0aiA+IGJsbyAmJiAhaXNianVuayhiW2Jlc3RqIC0gMV0pICYmIGFbYmVzdGkgLSAxXSA9PSBiW2Jlc3RqIC0gMV0pIHsKCQkJCWJlc3RpLS07CgkJCQliZXN0ai0tOwoJCQkJYmVzdHNpemUrKzsKCQkJfQoJCQkJCgkJCXdoaWxlIChiZXN0aSArIGJlc3RzaXplIDwgYWhpICYmIGJlc3RqICsgYmVzdHNpemUgPCBiaGkgJiYKCQkJCQkhaXNianVuayhiW2Jlc3RqICsgYmVzdHNpemVdKSAmJgoJCQkJCWFbYmVzdGkgKyBiZXN0c2l6ZV0gPT0gYltiZXN0aiArIGJlc3RzaXplXSkgewoJCQkJYmVzdHNpemUrKzsKCQkJfQoJCgkJCXdoaWxlIChiZXN0aSA+IGFsbyAmJiBiZXN0aiA+IGJsbyAmJiBpc2JqdW5rKGJbYmVzdGogLSAxXSkgJiYgYVtiZXN0aSAtIDFdID09IGJbYmVzdGogLSAxXSkgewoJCQkJYmVzdGktLTsKCQkJCWJlc3RqLS07CgkJCQliZXN0c2l6ZSsrOwoJCQl9CgkJCQoJCQl3aGlsZSAoYmVzdGkgKyBiZXN0c2l6ZSA8IGFoaSAmJiBiZXN0aiArIGJlc3RzaXplIDwgYmhpICYmIGlzYmp1bmsoYltiZXN0aiArIGJlc3RzaXplXSkgJiYKCQkJCQlhW2Jlc3RpICsgYmVzdHNpemVdID09IGJbYmVzdGogKyBiZXN0c2l6ZV0pIHsKCQkJCWJlc3RzaXplKys7CgkJCX0KCQoJCQlyZXR1cm4gW2Jlc3RpLCBiZXN0aiwgYmVzdHNpemVdOwoJCX0KCQkKCQl0aGlzLmdldF9tYXRjaGluZ19ibG9ja3MgPSBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLm1hdGNoaW5nX2Jsb2NrcyAhPSBudWxsKSByZXR1cm4gdGhpcy5tYXRjaGluZ19ibG9ja3M7CgkJCXZhciBsYSA9IHRoaXMuYS5sZW5ndGg7CgkJCXZhciBsYiA9IHRoaXMuYi5sZW5ndGg7CgkKCQkJdmFyIHF1ZXVlID0gW1swLCBsYSwgMCwgbGJdXTsKCQkJdmFyIG1hdGNoaW5nX2Jsb2NrcyA9IFtdOwoJCQl2YXIgYWxvLCBhaGksIGJsbywgYmhpLCBxaSwgaSwgaiwgaywgeDsKCQkJd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewoJCQkJcWkgPSBxdWV1ZS5wb3AoKTsKCQkJCWFsbyA9IHFpWzBdOwoJCQkJYWhpID0gcWlbMV07CgkJCQlibG8gPSBxaVsyXTsKCQkJCWJoaSA9IHFpWzNdOwoJCQkJeCA9IHRoaXMuZmluZF9sb25nZXN0X21hdGNoKGFsbywgYWhpLCBibG8sIGJoaSk7CgkJCQlpID0geFswXTsKCQkJCWogPSB4WzFdOwoJCQkJayA9IHhbMl07CgkKCQkJCWlmIChrKSB7CgkJCQkJbWF0Y2hpbmdfYmxvY2tzLnB1c2goeCk7CgkJCQkJaWYgKGFsbyA8IGkgJiYgYmxvIDwgaikKCQkJCQkJcXVldWUucHVzaChbYWxvLCBpLCBibG8sIGpdKTsKCQkJCQlpZiAoaStrIDwgYWhpICYmIGorayA8IGJoaSkKCQkJCQkJcXVldWUucHVzaChbaSArIGssIGFoaSwgaiArIGssIGJoaV0pOwoJCQkJfQoJCQl9CgkJCQoJCQltYXRjaGluZ19ibG9ja3Muc29ydChkaWZmbGliLl9fbnR1cGxlY29tcCk7CgkKCQkJdmFyIGkxID0gMCwgajEgPSAwLCBrMSA9IDAsIGJsb2NrID0gMDsKCQkJdmFyIGkyLCBqMiwgazI7CgkJCXZhciBub25fYWRqYWNlbnQgPSBbXTsKCQkJZm9yICh2YXIgaWR4IGluIG1hdGNoaW5nX2Jsb2NrcykgewoJCQkJaWYgKG1hdGNoaW5nX2Jsb2Nrcy5oYXNPd25Qcm9wZXJ0eShpZHgpKSB7CgkJCQkJYmxvY2sgPSBtYXRjaGluZ19ibG9ja3NbaWR4XTsKCQkJCQlpMiA9IGJsb2NrWzBdOwoJCQkJCWoyID0gYmxvY2tbMV07CgkJCQkJazIgPSBibG9ja1syXTsKCQkJCQlpZiAoaTEgKyBrMSA9PSBpMiAmJiBqMSArIGsxID09IGoyKSB7CgkJCQkJCWsxICs9IGsyOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmIChrMSkgbm9uX2FkamFjZW50LnB1c2goW2kxLCBqMSwgazFdKTsKCQkJCQkJaTEgPSBpMjsKCQkJCQkJajEgPSBqMjsKCQkJCQkJazEgPSBrMjsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJCgkJCWlmIChrMSkgbm9uX2FkamFjZW50LnB1c2goW2kxLCBqMSwgazFdKTsKCQoJCQlub25fYWRqYWNlbnQucHVzaChbbGEsIGxiLCAwXSk7CgkJCXRoaXMubWF0Y2hpbmdfYmxvY2tzID0gbm9uX2FkamFjZW50OwoJCQlyZXR1cm4gdGhpcy5tYXRjaGluZ19ibG9ja3M7CgkJfQoJCQoJCXRoaXMuZ2V0X29wY29kZXMgPSBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLm9wY29kZXMgIT0gbnVsbCkgcmV0dXJuIHRoaXMub3Bjb2RlczsKCQkJdmFyIGkgPSAwOwoJCQl2YXIgaiA9IDA7CgkJCXZhciBhbnN3ZXIgPSBbXTsKCQkJdGhpcy5vcGNvZGVzID0gYW5zd2VyOwoJCQl2YXIgYmxvY2ssIGFpLCBiaiwgc2l6ZSwgdGFnOwoJCQl2YXIgYmxvY2tzID0gdGhpcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCk7CgkJCWZvciAodmFyIGlkeCBpbiBibG9ja3MpIHsKCQkJCWlmIChibG9ja3MuaGFzT3duUHJvcGVydHkoaWR4KSkgewoJCQkJCWJsb2NrID0gYmxvY2tzW2lkeF07CgkJCQkJYWkgPSBibG9ja1swXTsKCQkJCQliaiA9IGJsb2NrWzFdOwoJCQkJCXNpemUgPSBibG9ja1syXTsKCQkJCQl0YWcgPSAnJzsKCQkJCQlpZiAoaSA8IGFpICYmIGogPCBiaikgewoJCQkJCQl0YWcgPSAncmVwbGFjZSc7CgkJCQkJfSBlbHNlIGlmIChpIDwgYWkpIHsKCQkJCQkJdGFnID0gJ2RlbGV0ZSc7CgkJCQkJfSBlbHNlIGlmIChqIDwgYmopIHsKCQkJCQkJdGFnID0gJ2luc2VydCc7CgkJCQkJfQoJCQkJCWlmICh0YWcpIGFuc3dlci5wdXNoKFt0YWcsIGksIGFpLCBqLCBial0pOwoJCQkJCWkgPSBhaSArIHNpemU7CgkJCQkJaiA9IGJqICsgc2l6ZTsKCQkJCQkKCQkJCQlpZiAoc2l6ZSkgYW5zd2VyLnB1c2goWydlcXVhbCcsIGFpLCBpLCBiaiwgal0pOwoJCQkJfQoJCQl9CgkJCQoJCQlyZXR1cm4gYW5zd2VyOwoJCX0KCQkKCQkvLyB0aGlzIGlzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluIHRoZSBweXRob24gbGliLCB3aGljaCBvZiBjb3Vyc2UgaXMgbm90IHN1cHBvcnRlZCBpbiBqYXZhc2NyaXB0CgkJLy8gdGhlIHJlaW1wbGVtZW50YXRpb24gYnVpbGRzIHVwIHRoZSBncm91cGVkIG9wY29kZXMgaW50byBhIGxpc3QgaW4gdGhlaXIgZW50aXJldHkgYW5kIHJldHVybnMgdGhhdC4KCQl0aGlzLmdldF9ncm91cGVkX29wY29kZXMgPSBmdW5jdGlvbiAobikgewoJCQlpZiAoIW4pIG4gPSAzOwoJCQl2YXIgY29kZXMgPSB0aGlzLmdldF9vcGNvZGVzKCk7CgkJCWlmICghY29kZXMpIGNvZGVzID0gW1siZXF1YWwiLCAwLCAxLCAwLCAxXV07CgkJCXZhciBjb2RlLCB0YWcsIGkxLCBpMiwgajEsIGoyOwoJCQlpZiAoY29kZXNbMF1bMF0gPT0gJ2VxdWFsJykgewoJCQkJY29kZSA9IGNvZGVzWzBdOwoJCQkJdGFnID0gY29kZVswXTsKCQkJCWkxID0gY29kZVsxXTsKCQkJCWkyID0gY29kZVsyXTsKCQkJCWoxID0gY29kZVszXTsKCQkJCWoyID0gY29kZVs0XTsKCQkJCWNvZGVzWzBdID0gW3RhZywgTWF0aC5tYXgoaTEsIGkyIC0gbiksIGkyLCBNYXRoLm1heChqMSwgajIgLSBuKSwgajJdOwoJCQl9CgkJCWlmIChjb2Rlc1tjb2Rlcy5sZW5ndGggLSAxXVswXSA9PSAnZXF1YWwnKSB7CgkJCQljb2RlID0gY29kZXNbY29kZXMubGVuZ3RoIC0gMV07CgkJCQl0YWcgPSBjb2RlWzBdOwoJCQkJaTEgPSBjb2RlWzFdOwoJCQkJaTIgPSBjb2RlWzJdOwoJCQkJajEgPSBjb2RlWzNdOwoJCQkJajIgPSBjb2RlWzRdOwoJCQkJY29kZXNbY29kZXMubGVuZ3RoIC0gMV0gPSBbdGFnLCBpMSwgTWF0aC5taW4oaTIsIGkxICsgbiksIGoxLCBNYXRoLm1pbihqMiwgajEgKyBuKV07CgkJCX0KCQoJCQl2YXIgbm4gPSBuICsgbjsKCQkJdmFyIGdyb3VwID0gW107CgkJCXZhciBncm91cHMgPSBbXTsKCQkJZm9yICh2YXIgaWR4IGluIGNvZGVzKSB7CgkJCQlpZiAoY29kZXMuaGFzT3duUHJvcGVydHkoaWR4KSkgewoJCQkJCWNvZGUgPSBjb2Rlc1tpZHhdOwoJCQkJCXRhZyA9IGNvZGVbMF07CgkJCQkJaTEgPSBjb2RlWzFdOwoJCQkJCWkyID0gY29kZVsyXTsKCQkJCQlqMSA9IGNvZGVbM107CgkJCQkJajIgPSBjb2RlWzRdOwoJCQkJCWlmICh0YWcgPT0gJ2VxdWFsJyAmJiBpMiAtIGkxID4gbm4pIHsKCQkJCQkJZ3JvdXAucHVzaChbdGFnLCBpMSwgTWF0aC5taW4oaTIsIGkxICsgbiksIGoxLCBNYXRoLm1pbihqMiwgajEgKyBuKV0pOwoJCQkJCQlncm91cHMucHVzaChncm91cCk7CgkJCQkJCWdyb3VwID0gW107CgkJCQkJCWkxID0gTWF0aC5tYXgoaTEsIGkyLW4pOwoJCQkJCQlqMSA9IE1hdGgubWF4KGoxLCBqMi1uKTsKCQkJCQl9CgkJCQkJCgkJCQkJZ3JvdXAucHVzaChbdGFnLCBpMSwgaTIsIGoxLCBqMl0pOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoZ3JvdXAgJiYgIShncm91cC5sZW5ndGggPT0gMSAmJiBncm91cFswXVswXSA9PSAnZXF1YWwnKSkgZ3JvdXBzLnB1c2goZ3JvdXApCgkJCQoJCQlyZXR1cm4gZ3JvdXBzOwoJCX0KCQkKCQl0aGlzLnJhdGlvID0gZnVuY3Rpb24gKCkgewoJCQltYXRjaGVzID0gZGlmZmxpYi5fX3JlZHVjZSgKCQkJCQkJCWZ1bmN0aW9uIChzdW0sIHRyaXBsZSkgeyByZXR1cm4gc3VtICsgdHJpcGxlW3RyaXBsZS5sZW5ndGggLSAxXTsgfSwKCQkJCQkJCXRoaXMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpLCAwKTsKCQkJcmV0dXJuIGRpZmZsaWIuX19jYWxjdWxhdGVfcmF0aW8obWF0Y2hlcywgdGhpcy5hLmxlbmd0aCArIHRoaXMuYi5sZW5ndGgpOwoJCX0KCQkKCQl0aGlzLnF1aWNrX3JhdGlvID0gZnVuY3Rpb24gKCkgewoJCQl2YXIgZnVsbGJjb3VudCwgZWx0OwoJCQlpZiAodGhpcy5mdWxsYmNvdW50ID09IG51bGwpIHsKCQkJCXRoaXMuZnVsbGJjb3VudCA9IGZ1bGxiY291bnQgPSB7fTsKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iLmxlbmd0aDsgaSsrKSB7CgkJCQkJZWx0ID0gdGhpcy5iW2ldOwoJCQkJCWZ1bGxiY291bnRbZWx0XSA9IGRpZmZsaWIuX19kaWN0Z2V0KGZ1bGxiY291bnQsIGVsdCwgMCkgKyAxOwoJCQkJfQoJCQl9CgkJCWZ1bGxiY291bnQgPSB0aGlzLmZ1bGxiY291bnQ7CgkKCQkJdmFyIGF2YWlsID0ge307CgkJCXZhciBhdmFpbGhhcyA9IGRpZmZsaWIuX19pc2luZGljdChhdmFpbCk7CgkJCXZhciBtYXRjaGVzID0gbnVtYiA9IDA7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hLmxlbmd0aDsgaSsrKSB7CgkJCQllbHQgPSB0aGlzLmFbaV07CgkJCQlpZiAoYXZhaWxoYXMoZWx0KSkgewoJCQkJCW51bWIgPSBhdmFpbFtlbHRdOwoJCQkJfSBlbHNlIHsKCQkJCQludW1iID0gZGlmZmxpYi5fX2RpY3RnZXQoZnVsbGJjb3VudCwgZWx0LCAwKTsKCQkJCX0KCQkJCWF2YWlsW2VsdF0gPSBudW1iIC0gMTsKCQkJCWlmIChudW1iID4gMCkgbWF0Y2hlcysrOwoJCQl9CgkJCQoJCQlyZXR1cm4gZGlmZmxpYi5fX2NhbGN1bGF0ZV9yYXRpbyhtYXRjaGVzLCB0aGlzLmEubGVuZ3RoICsgdGhpcy5iLmxlbmd0aCk7CgkJfQoJCQoJCXRoaXMucmVhbF9xdWlja19yYXRpbyA9IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGxhID0gdGhpcy5hLmxlbmd0aDsKCQkJdmFyIGxiID0gdGhpcy5iLmxlbmd0aDsKCQkJcmV0dXJuIF9jYWxjdWxhdGVfcmF0aW8oTWF0aC5taW4obGEsIGxiKSwgbGEgKyBsYik7CgkJfQoJCQoJCXRoaXMuaXNqdW5rID0gaXNqdW5rID8gaXNqdW5rIDogZGlmZmxpYi5kZWZhdWx0SnVua0Z1bmN0aW9uOwoJCXRoaXMuYSA9IHRoaXMuYiA9IG51bGw7CgkJdGhpcy5zZXRfc2VxcyhhLCBiKTsKCX0KfTsKCg==]]></data>
	</file>
	<file>
	  <filename>/js/diffview.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKVGhpcyBpcyBwYXJ0IG9mIGpzZGlmZmxpYiB2MS4wLiA8aHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliPgoKQ29weXJpZ2h0IDIwMDcgLSAyMDExIENoYXMgRW1lcmljayA8Y2VtZXJpY2tAc25vd3RpZGUuY29tPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQpwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0CiAgICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ2hhcyBFbWVyaWNrIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRApXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBDaGFzIEVtZXJpY2sgT1IKQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCkFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGUKYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQKb3IgaW1wbGllZCwgb2YgQ2hhcyBFbWVyaWNrLgoqLwp0YWJsZS5kaWZmIHsKCWJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKCWJvcmRlcjoxcHggc29saWQgZGFya2dyYXk7Cgl3aGl0ZS1zcGFjZTpwcmUtd3JhcAp9CnRhYmxlLmRpZmYgdGJvZHkgeyAKCWZvbnQtZmFtaWx5OkNvdXJpZXIsIG1vbm9zcGFjZQp9CnRhYmxlLmRpZmYgdGJvZHkgdGggewoJZm9udC1mYW1pbHk6dmVyZGFuYSxhcmlhbCwnQml0c3RyZWFtIFZlcmEgU2FucycsaGVsdmV0aWNhLHNhbnMtc2VyaWY7CgliYWNrZ3JvdW5kOiNFRUQ7Cglmb250LXNpemU6MTFweDsKCWZvbnQtd2VpZ2h0Om5vcm1hbDsKCWJvcmRlcjoxcHggc29saWQgI0JCQzsKCWNvbG9yOiM4ODY7CglwYWRkaW5nOi4zZW0gLjVlbSAuMWVtIDJlbTsKCXRleHQtYWxpZ246cmlnaHQ7Cgl2ZXJ0aWNhbC1hbGlnbjp0b3AKfQp0YWJsZS5kaWZmIHRoZWFkIHsKCWJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCQkM7CgliYWNrZ3JvdW5kOiNFRkVGRUY7Cglmb250LWZhbWlseTpWZXJkYW5hCn0KdGFibGUuZGlmZiB0aGVhZCB0aC50ZXh0dGl0bGUgewoJdGV4dC1hbGlnbjpsZWZ0Cn0KdGFibGUuZGlmZiB0Ym9keSB0ZCB7CglwYWRkaW5nOjBweCAuNGVtOwoJcGFkZGluZy10b3A6LjRlbTsKCXZlcnRpY2FsLWFsaWduOnRvcDsKfQp0YWJsZS5kaWZmIC5lbXB0eSB7CgliYWNrZ3JvdW5kLWNvbG9yOiNEREQ7Cn0KdGFibGUuZGlmZiAucmVwbGFjZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiNGRDgKfQp0YWJsZS5kaWZmIC5kZWxldGUgewoJYmFja2dyb3VuZC1jb2xvcjojRTk5Owp9CnRhYmxlLmRpZmYgLnNraXAgewoJYmFja2dyb3VuZC1jb2xvcjojRUZFRkVGOwoJYm9yZGVyOjFweCBzb2xpZCAjQUFBOwoJYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjQkJDOwp9CnRhYmxlLmRpZmYgLmluc2VydCB7CgliYWNrZ3JvdW5kLWNvbG9yOiM5RTkKfQp0YWJsZS5kaWZmIHRoLmF1dGhvciB7Cgl0ZXh0LWFsaWduOnJpZ2h0OwoJYm9yZGVyLXRvcDoxcHggc29saWQgI0JCQzsKCWJhY2tncm91bmQ6I0VGRUZFRgp9]]></data>
	</file>
	<file>
	  <filename>/js/diffview.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKVGhpcyBpcyBwYXJ0IG9mIGpzZGlmZmxpYiB2MS4wLiA8aHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliPgoKQ29weXJpZ2h0IDIwMDcgLSAyMDExIENoYXMgRW1lcmljayA8Y2VtZXJpY2tAc25vd3RpZGUuY29tPi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQpwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCiAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0CiAgICAgIG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ2hhcyBFbWVyaWNrIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRApXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBDaGFzIEVtZXJpY2sgT1IKQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCkFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCkFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGUKYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwgcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQKb3IgaW1wbGllZCwgb2YgQ2hhcyBFbWVyaWNrLgoqLwpkaWZmdmlldyA9IHsKCS8qKgoJICogQnVpbGRzIGFuZCByZXR1cm5zIGEgdmlzdWFsIGRpZmYgdmlldy4gIFRoZSBzaW5nbGUgcGFyYW1ldGVyLCBgcGFyYW1zJywgc2hvdWxkIGNvbnRhaW4KCSAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgoJICoKCSAqIC0gYmFzZVRleHRMaW5lczogdGhlIGFycmF5IG9mIHN0cmluZ3MgdGhhdCB3YXMgdXNlZCBhcyB0aGUgYmFzZSB0ZXh0IGlucHV0IHRvIFNlcXVlbmNlTWF0Y2hlcgoJICogLSBuZXdUZXh0TGluZXM6IHRoZSBhcnJheSBvZiBzdHJpbmdzIHRoYXQgd2FzIHVzZWQgYXMgdGhlIG5ldyB0ZXh0IGlucHV0IHRvIFNlcXVlbmNlTWF0Y2hlcgoJICogLSBvcGNvZGVzOiB0aGUgYXJyYXkgb2YgYXJyYXlzIHJldHVybmVkIGJ5IFNlcXVlbmNlTWF0Y2hlci5nZXRfb3Bjb2RlcygpCgkgKiAtIGJhc2VUZXh0TmFtZTogdGhlIHRpdGxlIHRvIGJlIGRpc3BsYXllZCBhYm92ZSB0aGUgYmFzZSB0ZXh0IGxpc3RpbmcgaW4gdGhlIGRpZmYgdmlldzsgZGVmYXVsdHMKCSAqCSAgIHRvICJCYXNlIFRleHQiCgkgKiAtIG5ld1RleHROYW1lOiB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGFib3ZlIHRoZSBuZXcgdGV4dCBsaXN0aW5nIGluIHRoZSBkaWZmIHZpZXc7IGRlZmF1bHRzCgkgKgkgICB0byAiTmV3IFRleHQiCgkgKiAtIGNvbnRleHRTaXplOiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIGNvbnRleHQgdG8gc2hvdyBhcm91bmQgZGlmZmVyZW5jZXM7IGJ5IGRlZmF1bHQsIGFsbCBsaW5lcwoJICoJICAgYXJlIHNob3duCgkgKiAtIHZpZXdUeXBlOiBpZiAwLCBhIHNpZGUtYnktc2lkZSBkaWZmIHZpZXcgaXMgZ2VuZXJhdGVkIChkZWZhdWx0KTsgaWYgMSwgYW4gaW5saW5lIGRpZmYgdmlldyBpcwoJICoJICAgZ2VuZXJhdGVkCgkgKi8KCWJ1aWxkVmlldzogZnVuY3Rpb24gKHBhcmFtcykgewoJCXZhciBiYXNlVGV4dExpbmVzID0gcGFyYW1zLmJhc2VUZXh0TGluZXM7CgkJdmFyIG5ld1RleHRMaW5lcyA9IHBhcmFtcy5uZXdUZXh0TGluZXM7CgkJdmFyIG9wY29kZXMgPSBwYXJhbXMub3Bjb2RlczsKCQl2YXIgYmFzZVRleHROYW1lID0gcGFyYW1zLmJhc2VUZXh0TmFtZSA/IHBhcmFtcy5iYXNlVGV4dE5hbWUgOiAiQmFzZSBUZXh0IjsKCQl2YXIgbmV3VGV4dE5hbWUgPSBwYXJhbXMubmV3VGV4dE5hbWUgPyBwYXJhbXMubmV3VGV4dE5hbWUgOiAiTmV3IFRleHQiOwoJCXZhciBjb250ZXh0U2l6ZSA9IHBhcmFtcy5jb250ZXh0U2l6ZTsKCQl2YXIgaW5saW5lID0gKHBhcmFtcy52aWV3VHlwZSA9PSAwIHx8IHBhcmFtcy52aWV3VHlwZSA9PSAxKSA/IHBhcmFtcy52aWV3VHlwZSA6IDA7CgoJCWlmIChiYXNlVGV4dExpbmVzID09IG51bGwpCgkJCXRocm93ICJDYW5ub3QgYnVpbGQgZGlmZiB2aWV3OyBiYXNlVGV4dExpbmVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJaWYgKG5ld1RleHRMaW5lcyA9PSBudWxsKQoJCQl0aHJvdyAiQ2Fubm90IGJ1aWxkIGRpZmYgdmlldzsgbmV3VGV4dExpbmVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJaWYgKCFvcGNvZGVzKQoJCQl0aHJvdyAiQ2Fubm8gYnVpbGQgZGlmZiB2aWV3OyBvcGNvZGVzIGlzIG5vdCBkZWZpbmVkLiI7CgkJCgkJZnVuY3Rpb24gY2VsdCAobmFtZSwgY2xhenopIHsKCQkJdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwoJCQllLmNsYXNzTmFtZSA9IGNsYXp6OwoJCQlyZXR1cm4gZTsKCQl9CgkJCgkJZnVuY3Rpb24gdGVsdCAobmFtZSwgdGV4dCkgewoJCQl2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7CgkJCWUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpOwoJCQlyZXR1cm4gZTsKCQl9CgkJCgkJZnVuY3Rpb24gY3RlbHQgKG5hbWUsIGNsYXp6LCB0ZXh0KSB7CgkJCXZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKCQkJZS5jbGFzc05hbWUgPSBjbGF6ejsKCQkJZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CgkJCXJldHVybiBlOwoJCX0KCQoJCXZhciB0ZGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoZWFkIik7CgkJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwoJCXRkYXRhLmFwcGVuZENoaWxkKG5vZGUpOwoJCWlmIChpbmxpbmUpIHsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGgiLCAidGV4dHRpdGxlIiwgYmFzZVRleHROYW1lICsgIiB2cy4gIiArIG5ld1RleHROYW1lKSk7CgkJfSBlbHNlIHsKCQkJbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGgiLCAidGV4dHRpdGxlIiwgYmFzZVRleHROYW1lKSk7CgkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKSk7CgkJCW5vZGUuYXBwZW5kQ2hpbGQoY3RlbHQoInRoIiwgInRleHR0aXRsZSIsIG5ld1RleHROYW1lKSk7CgkJfQoJCXRkYXRhID0gW3RkYXRhXTsKCQkKCQl2YXIgcm93cyA9IFtdOwoJCXZhciBub2RlMjsKCQkKCQkvKioKCQkgKiBBZGRzIHR3byBjZWxscyB0byB0aGUgZ2l2ZW4gcm93OyBpZiB0aGUgZ2l2ZW4gcm93IGNvcnJlc3BvbmRzIHRvIGEgcmVhbAoJCSAqIGxpbmUgbnVtYmVyIChiYXNlZCBvbiB0aGUgbGluZSBpbmRleCB0aWR4IGFuZCB0aGUgZW5kcG9pbnQgb2YgdGhlIAoJCSAqIHJhbmdlIGluIHF1ZXN0aW9uIHRlbmQpLCB0aGVuIHRoZSBjZWxscyB3aWxsIGNvbnRhaW4gdGhlIGxpbmUgbnVtYmVyCgkJICogYW5kIHRoZSBsaW5lIG9mIHRleHQgZnJvbSB0ZXh0TGluZXMgYXQgcG9zaXRpb24gdGlkeCAod2l0aCB0aGUgY2xhc3Mgb2YKCQkgKiB0aGUgc2Vjb25kIGNlbGwgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2UgcmVwcmVzZW50ZWQpLCBhbmQgdGlkeCArIDEgd2lsbAoJCSAqIGJlIHJldHVybmVkLgkgT3RoZXJ3aXNlLCB0aWR4IGlzIHJldHVybmVkLCBhbmQgdHdvIGVtcHR5IGNlbGxzIGFyZSBhZGRlZAoJCSAqIHRvIHRoZSBnaXZlbiByb3cuCgkJICovCgkJZnVuY3Rpb24gYWRkQ2VsbHMgKHJvdywgdGlkeCwgdGVuZCwgdGV4dExpbmVzLCBjaGFuZ2UpIHsKCQkJaWYgKHRpZHggPCB0ZW5kKSB7CgkJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCAodGlkeCArIDEpLnRvU3RyaW5nKCkpKTsKCQkJCXJvdy5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCBjaGFuZ2UsIHRleHRMaW5lc1t0aWR4XS5yZXBsYWNlKC9cdC9nLCAiXHUwMGEwXHUwMGEwXHUwMGEwXHUwMGEwIikpKTsKCQkJCXJldHVybiB0aWR4ICsgMTsKCQkJfSBlbHNlIHsKCQkJCXJvdy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpKTsKCQkJCXJvdy5hcHBlbmRDaGlsZChjZWx0KCJ0ZCIsICJlbXB0eSIpKTsKCQkJCXJldHVybiB0aWR4OwoJCQl9CgkJfQoJCQoJCWZ1bmN0aW9uIGFkZENlbGxzSW5saW5lIChyb3csIHRpZHgsIHRpZHgyLCB0ZXh0TGluZXMsIGNoYW5nZSkgewoJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCB0aWR4ID09IG51bGwgPyAiIiA6ICh0aWR4ICsgMSkudG9TdHJpbmcoKSkpOwoJCQlyb3cuYXBwZW5kQ2hpbGQodGVsdCgidGgiLCB0aWR4MiA9PSBudWxsID8gIiIgOiAodGlkeDIgKyAxKS50b1N0cmluZygpKSk7CgkJCXJvdy5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCBjaGFuZ2UsIHRleHRMaW5lc1t0aWR4ICE9IG51bGwgPyB0aWR4IDogdGlkeDJdLnJlcGxhY2UoL1x0L2csICJcdTAwYTBcdTAwYTBcdTAwYTBcdTAwYTAiKSkpOwoJCX0KCQkKCQlmb3IgKHZhciBpZHggPSAwOyBpZHggPCBvcGNvZGVzLmxlbmd0aDsgaWR4KyspIHsKCQkJY29kZSA9IG9wY29kZXNbaWR4XTsKCQkJY2hhbmdlID0gY29kZVswXTsKCQkJdmFyIGIgPSBjb2RlWzFdOwoJCQl2YXIgYmUgPSBjb2RlWzJdOwoJCQl2YXIgbiA9IGNvZGVbM107CgkJCXZhciBuZSA9IGNvZGVbNF07CgkJCXZhciByb3djbnQgPSBNYXRoLm1heChiZSAtIGIsIG5lIC0gbik7CgkJCXZhciB0b3Byb3dzID0gW107CgkJCXZhciBib3Ryb3dzID0gW107CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgcm93Y250OyBpKyspIHsKCQkJCS8vIGp1bXAgYWhlYWQgaWYgd2UndmUgYWxyZWR5IHByb3ZpZGVkIGxlYWRpbmcgY29udGV4dCBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCByYW5nZQoJCQkJaWYgKGNvbnRleHRTaXplICYmIG9wY29kZXMubGVuZ3RoID4gMSAmJiAoKGlkeCA+IDAgJiYgaSA9PSBjb250ZXh0U2l6ZSkgfHwgKGlkeCA9PSAwICYmIGkgPT0gMCkpICYmIGNoYW5nZT09ImVxdWFsIikgewoJCQkJCXZhciBqdW1wID0gcm93Y250IC0gKChpZHggPT0gMCA/IDEgOiAyKSAqIGNvbnRleHRTaXplKTsKCQkJCQlpZiAoanVtcCA+IDEpIHsKCQkJCQkJdG9wcm93cy5wdXNoKG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpKTsKCQkJCQkJCgkJCQkJCWIgKz0ganVtcDsKCQkJCQkJbiArPSBqdW1wOwoJCQkJCQlpICs9IGp1bXAgLSAxOwoJCQkJCQlub2RlLmFwcGVuZENoaWxkKHRlbHQoInRoIiwgIi4uLiIpKTsKCQkJCQkJaWYgKCFpbmxpbmUpIG5vZGUuYXBwZW5kQ2hpbGQoY3RlbHQoInRkIiwgInNraXAiLCAiIikpOwoJCQkJCQlub2RlLmFwcGVuZENoaWxkKHRlbHQoInRoIiwgIi4uLiIpKTsKCQkJCQkJbm9kZS5hcHBlbmRDaGlsZChjdGVsdCgidGQiLCAic2tpcCIsICIiKSk7CgkJCQkJCQoJCQkJCQkvLyBza2lwIGxhc3QgbGluZXMgaWYgdGhleSdyZSBhbGwgZXF1YWwKCQkJCQkJaWYgKGlkeCArIDEgPT0gb3Bjb2Rlcy5sZW5ndGgpIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCXRvcHJvd3MucHVzaChub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSk7CgkJCQlpZiAoaW5saW5lKSB7CgkJCQkJaWYgKGNoYW5nZSA9PSAiaW5zZXJ0IikgewoJCQkJCQlhZGRDZWxsc0lubGluZShub2RlLCBudWxsLCBuKyssIG5ld1RleHRMaW5lcywgY2hhbmdlKTsKCQkJCQl9IGVsc2UgaWYgKGNoYW5nZSA9PSAicmVwbGFjZSIpIHsKCQkJCQkJYm90cm93cy5wdXNoKG5vZGUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSk7CgkJCQkJCWlmIChiIDwgYmUpIGFkZENlbGxzSW5saW5lKG5vZGUsIGIrKywgbnVsbCwgYmFzZVRleHRMaW5lcywgImRlbGV0ZSIpOwoJCQkJCQlpZiAobiA8IG5lKSBhZGRDZWxsc0lubGluZShub2RlMiwgbnVsbCwgbisrLCBuZXdUZXh0TGluZXMsICJpbnNlcnQiKTsKCQkJCQl9IGVsc2UgaWYgKGNoYW5nZSA9PSAiZGVsZXRlIikgewoJCQkJCQlhZGRDZWxsc0lubGluZShub2RlLCBiKyssIG51bGwsIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gZXF1YWwKCQkJCQkJYWRkQ2VsbHNJbmxpbmUobm9kZSwgYisrLCBuKyssIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQliID0gYWRkQ2VsbHMobm9kZSwgYiwgYmUsIGJhc2VUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQkJbiA9IGFkZENlbGxzKG5vZGUsIG4sIG5lLCBuZXdUZXh0TGluZXMsIGNoYW5nZSk7CgkJCQl9CgkJCX0KCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdG9wcm93cy5sZW5ndGg7IGkrKykgcm93cy5wdXNoKHRvcHJvd3NbaV0pOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGJvdHJvd3MubGVuZ3RoOyBpKyspIHJvd3MucHVzaChib3Ryb3dzW2ldKTsKCQl9CgkJCgkJcm93cy5wdXNoKG5vZGUgPSBjdGVsdCgidGgiLCAiYXV0aG9yIiwgImRpZmYgdmlldyBnZW5lcmF0ZWQgYnkgIikpOwoJCW5vZGUuc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgaW5saW5lID8gMyA6IDQpOwoJCW5vZGUuYXBwZW5kQ2hpbGQobm9kZTIgPSB0ZWx0KCJhIiwgImpzZGlmZmxpYiIpKTsKCQlub2RlMi5zZXRBdHRyaWJ1dGUoImhyZWYiLCAiaHR0cDovL2dpdGh1Yi5jb20vY2VtZXJpY2svanNkaWZmbGliIik7CgkJCgkJdGRhdGEucHVzaChub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk7CgkJZm9yICh2YXIgaWR4IGluIHJvd3MpIHJvd3MuaGFzT3duUHJvcGVydHkoaWR4KSAmJiBub2RlLmFwcGVuZENoaWxkKHJvd3NbaWR4XSk7CgkJCgkJbm9kZSA9IGNlbHQoInRhYmxlIiwgImRpZmYiICsgKGlubGluZSA/ICIgaW5saW5lZGlmZiIgOiAiIikpOwoJCWZvciAodmFyIGlkeCBpbiB0ZGF0YSkgdGRhdGEuaGFzT3duUHJvcGVydHkoaWR4KSAmJiBub2RlLmFwcGVuZENoaWxkKHRkYXRhW2lkeF0pOwoJCXJldHVybiBub2RlOwoJfQp9OwoK]]></data>
	</file>
	<file>
	  <filename>/js/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1NpbXBsZSBPcm0nOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICcnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSB1bmluc3RhbGxlZCwgYnllICEiJzsKJGxhbmdbJ3JlYWxseV91bmluc3RhbGwnXSA9ICdSZWFsbHk/IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmaW5lIG1vZHVsZT8nOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICdNb2R1bGUgVW5pbnN0YWxsZWQuJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgc21hbGwgT1JNIGxheWVyIGZvciBvdGhlciBtb2R1bGVzJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJ3NlZSBjaGFuZ2Vsb2cgOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXM8L2E+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+bW9yZSBpbmZvcm1hdGlvbnMgb24gOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMiIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXM8L2E+PC9wPgonOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.MyAutoload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBhdXRvbG9hZCBzeXN0ZW0gdGhhdCB3aWxsIG1lbW9yaXplIGFsbCB0aGUgZW50aXRpZXMgdXNlZCBieSBhbGwgdGhlIG1vZHVsZXMKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIC8qKgogKiBTdGF0aWMgQ2xhc3MgbWFuYWdpbmcgZW50aXRpZXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24KICoJVGhlIG1haW4gdXNlIGlzIHRvIG5vdCByZWRlY2xhcmF0ZSBYIGluc3RhbmNlcyBvZiBzYW1lIGNsYXNzZXMgaWYgaXQncyBub3QgbmVjZXNzYXJ5LgogKiBBbGwgbW9kdWxlcyBoYXZlIHRoZWlyIG93biBuYW1lc3BhY2UgdG8gYXZvaWQgc2hhcmluZyBlbnRpdGllcyBiZXR3ZWVuIHR3byBtb2R1bGVzCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KZmluYWwgY2xhc3MgTXlBdXRvbG9hZAp7CgkvKioKCSAqIExpc3Qgb2YgYWxsIGluc3RhbmNlcwoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlczsKCQoJLyoqCgkgKiBQcml2YXRlIGNvbnN0cnVjdG9yCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpe30JCgkKCS8qKgoJICogRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBlbnRpdGllcyB0aGVtLXNlbGYgZHVyaW5nIHRoZWlyIF9jb25zdHJ1Y3QoKSBmdW5jdGlvbgoJICogaXQgd2lsbCBzdG9jayBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5IChpZiBub3QgYWxyZWFkeSBleGlzdGluZykgaW4gaGlzIG1lbW9yeQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqIEBwYXJhbSBPcm1FbnRpdHkgJGluc3RhbmNlIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBhZGRJbnN0YW5jZSgkbmFtZXNwYWNlLCBPcm1FbnRpdHkgJGluc3RhbmNlKQoJewkKCQkkbmFtZXNwYWNlID0gc3RydG9sb3dlcigkbmFtZXNwYWNlKTsKCQkkbmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlLT5nZXROYW1lKCkpOwoJCQkJCgkJaWYoIU15QXV0b2xvYWQ6OmlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpKXsKCQkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXSA9IGFycmF5KCk7CgkJfQoJCQkJCgkJaWYoaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0pKSB7CgkJCU9ybVRyYWNlOjpkZWJ1ZygiSW5zdGFuY2UgIi4kbmFtZS4iIGFscmVhZHkgaW4gbWVtb3J5LiIpOwoJCQlyZXR1cm47CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQWRkaW5nIHRoZSBpbnN0YW5jZSAiLiRuYW1lLiIgaW50byB0aGUgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskbmFtZV0gPSAkaW5zdGFuY2U7Cgl9CgkKCS8qKgoJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIGVudGl0eSBmcm9tIHRoZSBtZW1vcnkuIEVhY2ggaW5zdGFuY2UgaXMgYSBjbG9uZSB0byBhdm9pZCB1c2luZwoJICogdGhlIHNhbWUgb2JqZWN0IAogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqIEBwYXJhbSBzdHJpbmcgJGluc3RhbmNlTmFtZSBuYW1lIG9mIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKCSAqCgkgKiBAcmV0dXJuIE9ybUVudGl0eSBhbiBpbnN0YW5jZSBvZiBlbnRpdHkKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCSRpbnN0YW5jZU5hbWUgPSBzdHJ0b2xvd2VyKCRpbnN0YW5jZU5hbWUpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjplcnJvcigiVGhlIG5hbWVzcGFjZSAnJG5hbWVzcGFjZScgZG9lc24ndCBleGlzdGUgaW50byB0aGUgT3JtIFN5c3RlbSIpOwoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0ZSBpbnRvIHRoZSBPcm0gU3lzdGVtIik7CgkJfQoJCQoJCU9ybVRyYWNlOjpkZWJ1ZygiQXNraW5nIGFuIGluc3RhbmNlIG9mICIuJGluc3RhbmNlTmFtZS4gIiBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJaWYoTXlBdXRvbG9hZDo6aGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSkpCgkJewoJCQlPcm1UcmFjZTo6ZGVidWcoIkluc3RhbmNlICIuJGluc3RhbmNlTmFtZS4iIHJldHVybmVkLiIpOwoJCQlyZXR1cm4gY2xvbmUgc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskaW5zdGFuY2VOYW1lXTsKCQl9CgkJCgkJT3JtVHJhY2U6OmVycm9yKCJObyBpbnN0YW5jZSAkaW5zdGFuY2VOYW1lIGZvdW5kIGluIG1lbW9yeSBmb3IgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7CgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5zdGFuY2UgJGluc3RhbmNlTmFtZSBmb3VuZCBpbiBtZW1vcnkgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOwoJfQoJCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0YW5jZSBleGlzdHMgaW4gdGhlIG1lbW9yeSBmb3IgdGhlIHNhbWUgbmFtZXNwYWNlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQoJICogQHBhcmFtIHN0cmluZyAkaW5zdGFuY2VOYW1lIG5hbWUgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQoJICoKCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgZnVuY3Rpb24gaGFzSW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSl7CgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7CgkJJGluc3RhbmNlTmFtZSA9IHN0cnRvbG93ZXIoJGluc3RhbmNlTmFtZSk7CgkJCgkJaWYoTXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSkpewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXJldHVybiBpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRpbnN0YW5jZU5hbWVdKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gYWxsIHRoZSBpbnN0YW5jZXMgb2YgYWxsIHRoZSBlbnRpdGllcyBmcm9tIGEgc2luZ2xlIG5hbWVzcGFjZQogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUKCSAqCgkgKiBAcmV0dXJuIGFycmF5PE9ybUVudGl0eT4gYW4gYXJyYXkgb2YgYWxsIHRoZSBlbnRpdGllcwoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluc3RhbmNlcygkbmFtZXNwYWNlKQoJewoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOwoJCWlmKCFNeUF1dG9sb2FkOjppc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKSl7CgkJCU9ybVRyYWNlOjp3YXJuKCJUaGUgbmFtZXNwYWNlICckbmFtZXNwYWNlJyBkb2Vzbid0IGV4aXN0IGludG8gdGhlIE9ybSBTeXN0ZW0sIHlvdSBtYXkgaGF2ZSBmb3Jnb3QgdG8gd3JpdGUgc29tZSBlbnRpdGllcyA/Iik7CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlyZXR1cm4gc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXTsKCX0KCQoJLyoqCgkgKiBSZXRvdXJuZSB0cnVlIGlmIHRoZSBuYW1lc3BhY2UgaXMga25vd24gaW4gbWVtb3J5CiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQoJICoKCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgbmFtZXNwYWNlIGV4aXN0cwoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpIHsKCQlyZXR1cm4gaXNzZXQoc2VsZjo6JGluc3RhbmNlc1tzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpXSk7Cgl9Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCBwcm92aWRlIGFuIGdsb2JhbCBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgY2FjaGluZyBzeXN0ZW1zCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICoqLwoKCi8qKgogKgogKiAgU3RhdGljIGNsYXNzZXMgdXNlZCB0byBwcm92aWRlIGxpc3Qgb2Ygc2lnbmF0dXJlIGZvciBhbGwgdGhlIGNhY2hpbmcgc3lzdGVtcwogKgogKiAgRXhhbXBsZSA6IAogKiAgPGNvZGU+CiAqICAJLy9DYWxsIHRvIGNtc21zIHRvIGdldCB0aGUgZGF0YWJhc2UgY29ubmVjdG9yCiAqICAJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKICogICAgICAkY2FjaGVJbnN0YW5jZSA9IE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpOwogKiAgCQogKiAgCS8vRGVmaW5lcyBhIG5ldyBDdXN0b21lciBlbnRpdHkKICogIAkkZW50aXR5ID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJ215TW9kdWxlJywgJ2N1c3RvbWVyJyk7CiAqICAJCiAqICAJLy9TZWxlY3QgYWxsIEN1c3RvbWVycwogKiAgCSRxdWVyeVNlbGVjdCA9ICdTZWxlY3QgKiBGUk9NICcuJGVudGl0eS0+Z2V0RGJuYW1lKCk7CiAqICAJCiAqICAJLy9JZiB0aGUgY2FjaGluZyBzeXN0ZW0gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgOiB3ZSByZXR1cm4gdGhlIHJlc3VsdCBpbW1lZGlhdGVseQogKiAgCWlmKCRjYWNoZUluc3RhbmNlLT5pc0NhY2hlKCRxdWVyeVNlbGVjdCkpIHsKICogIAkJcmV0dXJuICRjYWNoZUluc3RhbmNlLT5nZXRDYWNoZSgkcXVlcnlTZWxlY3QpOwogKiAgCX0KICogIAkKICogIAkvL1NvIHdlIG5lZWQgdG8gZXhlY3V0ZSB0aGUgcXVlcnkKICogIAkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCk7CiAqICAJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yISIpO30KICogIAkKICogIAkkZW50aXR5cyA9IGFycmF5KCk7CiAqICAJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CiAqICAJCSRlbnRpdHlzW10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSgkZW50aXR5LCAkcm93KTsKICogIAl9CiAqICAJCiAqICAJLy9Eb24ndCBmb3JnZXQgdG8gcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hpbmcgc3lzdGVtIGZvciB0aGUgbmV4dCBjYWxsCiAqICAJJGNhY2hlSW5zdGFuY2UtPnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOwogCiAqICAJcmV0dXJuICRlbnRpdHlzOwogKgk8L2NvZGU+CiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KYWJzdHJhY3QgY2xhc3MgT3JtQ2FjaGUgewkKCgkvKioKCSAqIFdvbid0IHVzZSBhbnkgY2FjaGUgc3lzdGVtCgkgKiovCglwdWJsaWMgc3RhdGljICROT05FID0gMDsKCgkvKioKCSAqIFdpbGwgdXNlIGEgY2FjaGUgZHVyaW5nIHRoZSB0aW1lIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlIHNjcmlwdAoJICoqLwoJcHVibGljIHN0YXRpYyAkU0NSSVBUID0gMTsKCQkKCS8qKgoJICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgoJICovCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIGEgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNhY2hlLgoJICoKCSAqIEBwYXJhbSBtaXhlZCAkdHlwZUNhY2hlIG5vdCByZXF1aXJlZCA6IHRoZSB0eXBlIG9mIGNhY2hlLiBCeSBkZWZhdWx0IGl0IHdpbGwgdGFrZSB0aGUgdHlwZSBvZiBjYWNoZSBkZWZpbmVkIGFzIGRlZmF1bHQgaW50byBDbXNNYWRlU2ltcGxlCgkgKgoJICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBDYWNoZS4KCSAqKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoJHR5cGVDYWNoZSA9IG51bGwpewoJCQoJCWlmKCR0eXBlQ2FjaGUgPT0gbnVsbCl7CgkJCSRvcm0gPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCktPmdldF9tb2R1bGVfaW5zdGFuY2UoJ09ybScpOwoJCQkkdHlwZUNhY2hlID0gJG9ybS0+R2V0UHJlZmVyZW5jZSgnY2FjaGVUeXBlJywgT3JtQ2FjaGU6OiROT05FKTsKCQl9CgkJCgkJc3dpdGNoKCR0eXBlQ2FjaGUpewoJCQljYXNlIE9ybUNhY2hlOjokTk9ORToKCQkJCXJldHVybiBPcm1DYWNoZU5vbmU6OmdldE15T3duSW5zdGFuY2UoKTsKCQkJCWJyZWFrOwoJCQljYXNlIE9ybUNhY2hlOjokU0NSSVBUOgoJCQkJcmV0dXJuIE9ybUNhY2hlU2NyaXB0OjpnZXRNeU93bkluc3RhbmNlKCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCU9ybVRyYWNlOjplcnJvcigiVHlwZSBvZiBDYWNoZSAjeyR0eXBlQ2FjaGV9IGlzIG5vdCBhIHZhbGlkIFR5cGUgb2YgQ2FjaGUiKTsKCQkJCWV4aXQgLTE7CgkJfQoJfQoJCQkKCS8qKgoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0CiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gc2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwsICR2YWx1ZSk7CgkKCS8qKgoJICogUXVlcnlpbmcgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycwogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIG1peGVkW10gJHBhcmFtcyBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBtaXhlZCB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBnZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCk7CgoJLyoqCgkgKiBSZXR1cm4gdHJ1ZSBpZiBhIGNhY2hlIGV4aXN0IGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycwogICAgICogCgkgKiBAcGFyYW0gc3RyaW5nICRzcWwgdGhlIHNxbCBxdWVyeQoJICogQHBhcmFtIG1peGVkW10gJHBhcmFtcyBhcnJheSB0aGUgcGFyYW1ldGVycyBpbnRvIGEgYXJyYXkuIE1heSBiZSBudWxsCgkgKgoJICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGNhY2hlIGV4aXN0cwoJICovCQoJcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIGlzQ2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwpOwoKCS8qKgoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcnlpbmcsIHRoZSBzeXN0ZW0gbWF5IGluc2VydC9kZWxldGUvdXBkYXRlIHNvbWUgZGF0YSBpbiB0aGUgZGF0YWJhc2UKCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4KCSAqLwkKCXB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBjbGVhckNhY2hlKCk7CgoJLyoqCgkgKiBSZXR1cm4gYSB1bmlxdWUgaGFzaCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgaGFzaAoJICovCQoJcHVibGljIGZ1bmN0aW9uIGhhc2goJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQlpZigkcGFyYW1zID09IG51bGwpewoJCQkkcGFyYW1zID0gIiI7CgkJfQoJCQoJCSRwID0gc2VyaWFsaXplKCRwYXJhbXMpOwoKCQlyZXR1cm4gbWQ1KCRzcWwuJHApOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheNone.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYW4gZHVtbXkgY2FjaGluZyBzeXN0ZW0KICoKICogQHNpbmNlIDAuMi4wCiAqIEBhdXRob3IgQmVzcwogKiovCgoKLyoqCiAqCiAqICBTdGF0aWMgY2xhc3NlIHVzZWQgdG8gcHJvdmlkZSBhIHplcm8tY2FjaGluZyBzeXN0ZW0uIAogKiAgIEl0J3MgYSBzaW1wbGUgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpZ25hdHVyZSBvZiBjYWNoaW5nCiAqICAgd2ljaCB3aWxsIGFsd2F5cyBzYXkgdGhhdCB0aGVyZSBpcyBubyBjYWNoZSBhdmFpbGFibGUsIGZvcmNpbmcgCiAqICAgcHJvY2Vzc2luZyBvZiBldmVyeSBxdWVyaWVzCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KY2xhc3MgT3JtQ2FjaGVOb25lIGV4dGVuZHMgT3JtQ2FjaGV7CQoJCgkvKioKCSAqIEB2YXIgT3JtQ2FjaGVTY3JpcHQgJGluc3RhbmNlIFRoZSBjdXJyZW50IGluc3RhbmNlCgkgKiovCglwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2U7CgkJCgkvKioKCSAqIFByaXZhdGUgY29uc3RydWN0b3IKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkge30KCQoJLyoqCgkgKiBXaWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgY2FjaGUgY2xhc3MKCSAqCgkgKiBAcmV0dXJuIE9ybUNhY2hlTm9uZSB0aGUgY2FjaGUgY2xhc3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNeU93bkluc3RhbmNlKCl7CgkJaWYoc2VsZjo6JGluc3RhbmNlID09IG51bGwpewoJCQlzZWxmOjokaW5zdGFuY2UgPSBuZXcgT3JtQ2FjaGVOb25lKCk7CgkJfQoJCXJldHVybiBzZWxmOjokaW5zdGFuY2U7Cgl9CgkJCQoJLyoqCgkgKglTZXQgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0LCBpdHMgcGFyYW1ldGVycyBhbmQgb2YgY291cnNlIHRoZSByZXN1bHQKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICogQHBhcmFtIG1peGVkICR2YWx1ZSB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCwgJHZhbHVlKSB7CQkKCQkvL05vIHByb2Nlc3NpbmcJCQoJfQoJCgkvKioKCSAqIFF1ZXJ5aW5nIHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gbWl4ZWQgdGhlIHJlc3VsdAoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FjaGUoJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIGEgY2FjaGUgZXhpc3QgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgY2FjaGUgZXhpc3RzCgkgKi8JCglwdWJsaWMgZnVuY3Rpb24gaXNDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIEVtcHR5IHRoZSBjYWNoZS4gVmVyeSBpbXBvcnRhbnQgaWYgYmV0d2VlbiAyIHF1ZXJ5aW5nLCB0aGUgc3lzdGVtIG1heSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBzb21lIGRhdGEgaW4gdGhlIGRhdGFiYXNlCgkgKiAgSW4gdGhlIE9ybSBzeXN0ZW0sIHdlIGFsd2F5cyBkcm9wIHRoZSBjYWNoZSBpbiB0aGUgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgZnVuY3Rpb24uCgkgKi8JCQoJcHVibGljIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKXsKCQkvL05vIHByb2Nlc3NpbmcJCgl9CgoJLyoqCgkgKiBSZXR1cm4gYSB1bmlxdWUgaGFzaCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgaGFzaAoJICovCQoJcHVibGljIGZ1bmN0aW9uIGhhc2goJHNxbCwgJHBhcmFtcyA9IG51bGwpIHsKCQkvL05vIHByb2Nlc3NpbmcJCgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCacheScript.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aWNoIHByb3ZpZGUgYSBtaW5pIGNhY2hpbmcgc3lzdGVtIG9mIE9ybSB0byBhdm9pZCBtdWx0aXBsZXMgc3FsIHJlcXVlc3RzCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEJlc3MKICoqLwoKLyoqCiAqCiAqICBTdGF0aWMgY2xhc3NlIHVzZWQgdG8gcHJvdmlkZSBhIHZlcnkgc2ltcGxlIGNhY2hpbmcgc3lzdGVtLiBZb3UgY2FuIHB1c2ggdGhlIHJlc3VsdCBvZiBhIHJlcXVlc3QgaW50byBpdCBhbmQgYXNraW5nIGxhdGVyCiAqCXRvIGNvbGxlY3QgdGhlIHJlc3VsdC4KICoKICogIEV4YW1wbGUgOiAKICogIDxjb2RlPgogKiAgCS8vQ2FsbCB0byBjbXNtcyB0byBnZXQgdGhlIGRhdGFiYXNlIGNvbm5lY3RvcgogKiAgCSRkYiA9IGNtc21zKCktPkdldERiKCk7CiAqICAJCiAqICAJLy9EZWZpbmVzIGEgbmV3IEN1c3RvbWVyIGVudGl0eQogKiAgCSRlbnRpdHkgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgnbXlNb2R1bGUnLCAnY3VzdG9tZXInKTsKICogIAkKICogIAkvL1NlbGVjdCBhbGwgQ3VzdG9tZXJzCiAqICAJJHF1ZXJ5U2VsZWN0ID0gJ1NlbGVjdCAqIEZST00gJy4kZW50aXR5LT5nZXREYm5hbWUoKTsKICogIAkKICogIAkvL0lmIHRoZSBjYWNoaW5nIHN5c3RlbSBhbHJlYWR5IGtub3cgdGhlIGFuc3dlciA6IHdlIHJldHVybiB0aGUgcmVzdWx0IGltbWVkaWF0ZWx5CiAqICAJaWYoT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmlzQ2FjaGUoJHF1ZXJ5U2VsZWN0KSkgewogKiAgCQlyZXR1cm4gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmdldENhY2hlKCRxdWVyeVNlbGVjdCk7CiAqICAJfQogKiAgCQogKiAgCS8vU28gd2UgbmVlZCB0byBleGVjdXRlIHRoZSBxdWVyeQogKiAgCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5U2VsZWN0KTsKICogIAlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IhIik7fQogKiAgCQogKiAgCSRlbnRpdHlzID0gYXJyYXkoKTsKICogIAl3aGlsZSAoJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKICogIAkJJGVudGl0eXNbXSA9IE9ybUNvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHksICRyb3cpOwogKiAgCX0KICogIAkKICogIAkvL0Rvbid0IGZvcmdldCB0byBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGluZyBzeXN0ZW0gZm9yIHRoZSBuZXh0IGNhbGwKICogIAlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+c2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0LCBudWxsLCAkZW50aXR5cyk7CiAKICogIAlyZXR1cm4gJGVudGl0eXM7CiAqCTwvY29kZT4KICoKICogIFRoZSBjYWNoZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgY2FsbCBvZiB0aGUgcGhwIHNjcmlwdCAKICogIEFuZCB3aWxsIGJlIHVuYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsLgogKgogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUNhY2hlU2NyaXB0IGV4dGVuZHMgT3JtQ2FjaGUgewkKCQoJLyoqCgkgKiBAdmFyIE9ybUNhY2hlU2NyaXB0ICRpbnN0YW5jZSBUaGUgY3VycmVudCBpbnN0YW5jZQoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlOwoKCS8qKgoJICogQHZhciBtaXhlZFtdICRjYWNoZSBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZGF0YSBjYWNoZWQgCgkgKiovCglwcml2YXRlIHN0YXRpYyAkY2FjaGU7CgkJCgkvKioKCSAqIFByaXZhdGUgY29uc3RydWN0b3IKCSAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCXNlbGY6OiRjYWNoZSA9IGFycmF5KCk7Cgl9CgkKCS8qKgoJICogV2lsbCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNhY2hlIGNsYXNzCgkgKgoJICogQHJldHVybiBPcm1DYWNoZVNjcmlwdCB0aGUgY2FjaGUgY2xhc3MKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRNeU93bkluc3RhbmNlKCl7CgkJaWYoc2VsZjo6JGluc3RhbmNlID09IG51bGwpewoJCQlzZWxmOjokaW5zdGFuY2UgPSBuZXcgT3JtQ2FjaGVTY3JpcHQoKTsKCQl9CgkJcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKCX0KCQoJLyoqCgkgKglTZXQgdGhlIGNhY2hlIGZvciBhIHNxbCByZXF1ZXN0LCBpdHMgcGFyYW1ldGVycyBhbmQgb2YgY291cnNlIHRoZSByZXN1bHQKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICogQHBhcmFtIG1peGVkICR2YWx1ZSB0aGUgcmVzdWx0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkc3FsLCAkcGFyYW1zID0gbnVsbCwgJHZhbHVlKSB7CQkKCQlzZWxmOjokY2FjaGVbc2VsZjo6aGFzaCgkc3FsLCRwYXJhbXMpXSA9ICR2YWx1ZTsKCQkKCX0KCQoJLyoqCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgKiAKCSAqIEBwYXJhbSBzdHJpbmcgJHNxbCB0aGUgc3FsIHF1ZXJ5CgkgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwKCSAqCgkgKiBAcmV0dXJuIG1peGVkIHRoZSByZXN1bHQKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJaWYoc2VsZjo6aXNDYWNoZSgkc3FsLCAkcGFyYW1zKSkgewoJCQlyZXR1cm4gc2VsZjo6JGNhY2hlW3NlbGY6Omhhc2goJHNxbCwkcGFyYW1zKV07CgkJfQoJCQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgYSBjYWNoZSBleGlzdCBmb3IgYSBzcWwgcmVxdWVzdCBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAqIAoJICogQHBhcmFtIHN0cmluZyAkc3FsIHRoZSBzcWwgcXVlcnkKCSAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXMgYXJyYXkgdGhlIHBhcmFtZXRlcnMgaW50byBhIGFycmF5LiBNYXkgYmUgbnVsbAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMKCSAqLwkKCXB1YmxpYyBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKSB7CgkJcmV0dXJuIGFycmF5X0tFWV9leGlzdHMoc2VsZjo6aGFzaCgkc3FsLCRwYXJhbXMpLHNlbGY6OiRjYWNoZSk7Cgl9CgoJLyoqCgkgKiBFbXB0eSB0aGUgY2FjaGUuIFZlcnkgaW1wb3J0YW50IGlmIGJldHdlZW4gMiBxdWVyeWluZywgdGhlIHN5c3RlbSBtYXkgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgc29tZSBkYXRhIGluIHRoZSBkYXRhYmFzZQoJICogIEluIHRoZSBPcm0gc3lzdGVtLCB3ZSBhbHdheXMgZHJvcCB0aGUgY2FjaGUgaW4gdGhlIGluc2VydC9kZWxldGUvdXBkYXRlIGZ1bmN0aW9uLgoJICovCQoJcHVibGljIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7CgkJc2VsZjo6JGNhY2hlID0gYXJyYXkoKTsKCX0KCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCAST.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aXRoIGFsbCB0aGUgZGlmZmVyZW50IHR5cGUgZm9yIHRoZSBmaWVsZCBpbnRvIGRhdGFiYXNlCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwoKCi8qKgogKiBDbGFzcyBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgaW4gZW50aXR5IGJ1dCBhbHNvIGluIGRhdGFiYXNlCiAqIAogKiAgT3JtQ0FTVDo6JFNUUklORyBhIHNpbXBsZSBzdHJpbmcKICogIE9ybUNBU1Q6OiRCVUZGRVIgYSBmaWVsZCB3aXRoIG5vIGxpbWl0IG9mIHNpemUgKGV4Y2VwdCB0aGUgbXlzcWwgbmF0dXJhbCBsaW1pdCkKICoKICogIE9ybUNBU1Q6OiRJTlRFR0VSIGFuIGludGVnZXIKICogIE9ybUNBU1Q6OiROVU1FUklDIGEgZmllbGQgZm9yIGEgcmVhbCBudW1iZXIgKGVnIDogd2l0aCBjb21hKQogKiAgT3JtQ0FTVDo6JERPVUJMRSBhIGZpZWxkIGZvciBiaWcgbnVtYmVyCiAqIAogKiAgT3JtQ0FTVDo6JERBVEUgYSBmaWVsZCBkYXRlCiAqICBPcm1DQVNUOjokVElNRSBhIGZpZWxkIHRpbWUKICogIE9ybUNBU1Q6OiRUUyBhIGZpZWxkIHRpbWVzdGFtcAogKiAgT3JtQ0FTVDo6JERBVEVUSU1FIGEgZmllbGQgZGF0ZVRpbWUKICogIE9ybUNBU1Q6OiRVVUlEIGEgZmllbGQgVVVJRAogKgogKiAgT3JtQ0FTVDo6JE5PTkUgYSBUcmFuc2lhbnQgZmllbGQgOiB3b24ndCBiZSBwZXJzaXN0IGludG8gZGF0YWJhc2UKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtQ0FTVAp7CgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBTdHJpbmcgKHgpCgkgKiovCglwdWJsaWMgc3RhdGljICRTVFJJTkcgPSAiU1RSSU5HIjsKCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBCVUZGRVIKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJEJVRkZFUiA9ICJCVUZGRVIiOwoJCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBJTlRFR0VSICh4KQoJICoqLwoJcHVibGljIHN0YXRpYyAkSU5URUdFUiA9ICJJTlRFR0VSIjsKCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBOVU1CRVIgKHgpCgkgKiovCglwdWJsaWMgc3RhdGljICROVU1FUklDID0gIk5VTUVSSUMiOwoKCS8qKgoJICogKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIFNRTCB0eXBlIERPVUJMRSAoeCkKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJERPVUJMRSA9ICJET1VCTEUiOwoJCgkvKioKCSAqICogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBEQVRFCgkgKiovCglwdWJsaWMgc3RhdGljICREQVRFID0gIkRBVEUiOwoKCS8qKgoJICogKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIFNRTCB0eXBlIFRJTUUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJFRJTUUgPSAiVElNRSI7CgoJLyoqCgkgKiogU3RvcmVkIGluIGRhdGFiYXNlIHVuZGVyIHRoZSBTUUwgdHlwZSBJTlRFR0VSICg/KQoJICoqLwoJcHVibGljIHN0YXRpYyAkVFMgPSAiVFMiOwoKCS8qKgoJICoqIFN0b3JlZCBpbiBkYXRhYmFzZSB1bmRlciB0aGUgU1FMIHR5cGUgREFURVRJTUUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgJERBVEVUSU1FID0gIkRBVEVUSU1FIjsKCQoJLyoqCgkgKiBTdG9yZWQgaW4gZGF0YWJhc2UgdW5kZXIgdGhlIHR5cGUgU1FMIFN0cmluZyAoMzIpCgkgKiovCglwdWJsaWMgc3RhdGljICRVVUlEID0gIlVVSUQiOwoJCgkvKioKCSAqIFdpbGwgaW5oZXJpdCBmcm9tIGl0J3MgcGFyZW50cwoJICoqLwoJcHVibGljIHN0YXRpYyAkSU5IRVJJVCA9ICJJTkhFUklUIjsKCgkvKioKCSAqIFdvbid0IGJlIHN0b3JlZCBpbiBkYXRhYmFzZQoJICoqLwoJcHVibGljIHN0YXRpYyAkTk9ORSA9ICJOT05FIjsKfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCastFormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtQ2FzdEZvcm1hdEV4Y2VwdGlvbgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAoKLyoqCiAqIENsYXNzIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gZm9ybWF0IG9mIEZpZWxkIGlzIG5vdCB2YWxpZAogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1DYXN0Rm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAogICAgLyoqCiAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvcgogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgW29wdGlvbmFsXSB0aGUgZXJyb3IgbWVzc2FnZSAKICAgICogQHBhcmFtIGludCAkY29kZSBbb3B0aW9uYWxdIHRoZSBlcnJvciBjb2RlCiAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkgewogICAgCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogICAgfQp9CgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1Db3JlCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAogCi8qKgogKiBNYWluIHBhcnQgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIENtc21hZGVzaW1wbGUgbmF0aXZlcyBmdW5jdGlvbiBhbmQgdGhlIG5lY2Vzc2l0eSBmb3IgdGhlIE9ybSBmdW5jdGlvbnMKICogICAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtQ29yZSB7ICAKICAgIC8qKgogICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICogICAgIAogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9CiAgICAgIAogICAgLyoqCiAgICAqIHRyYW5zZm9ybXMgdGhlIGVudGl0eSdzIHN0cnVjdHVyZSBpbnRvIGFkb2RiIGluZm9ybWF0aW9ucyAKICAgICogICAgICAgICAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gdGhlIGVudGl0eQogICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWRvZGIgaW5mb3JtYXRpb25zCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBfZ2V0RmllbGRzVG9IcWwoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgeyAgICAKCQkkaHFsID0gJyc7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCgkJLy9Gb3IgZWFjaCBGaWVsZCBjb250YWluZWQgaW4gdGhlIGVudGl0eQoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKSB7CgkJCS8vV2UgZG9uJ3QgY3JlYXRlIHRoZSBGaWVsZCB3aGljaCBhcmUgbGlua3MgZXh0ZXJuYWxzIG9uIGFzc29jaWF0aXZlIHRhYmxlcwoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CQoJCQkKCQkJLy9XZSBkb24ndCBjcmVhdGUgdGhlIHRyYW5zaWVudCBGaWVsZHMgCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiROT05FKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoIWVtcHR5KCRocWwpKSB7CgkJCQkkaHFsIC49ICcgLCAnOwoJCQl9CgkJCSRocWwgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsKCgoKCQkJJGNhc3RUeXBlID0gJGZpZWxkLT5nZXRUeXBlKCk7CgkJCSRzaXplID0gJGZpZWxkLT5nZXRTaXplKCk7CgkJCS8qaWYoT3JtQ0FTVDo6JElOSEVSSVQgPT0gJGNhc3RUeXBlKSB7CgkJCQkvL011c3QgdGFrZSB0aGUgZGlzdGFudCB0eXBlCgkJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S2V5TmFtZSgpKTsKCQkJCSRjYXN0VHlwZSA9IChuZXcgJGVudGl0eUFzc29jTmFtZSgpKS0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkQXNzb2NpYXRlTmFtZSktPmdldFR5cGUoKTsKCQkJCSRzaXplID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0U2l6ZSgpOwoJCQl9Ki8KCgkJCSRzaXplSW50ZWdlciA9ICFlbXB0eSgkc2l6ZSkgPyAkc2l6ZSA6ICIiOwoJCQkkc2l6ZSA9ICRzaXplICE9ICIiID8gIiAoIi4kc2l6ZS4iKSAiIDogIiI7CgkJCXN3aXRjaCgkY2FzdFR5cGUpIHsKCQkJCWNhc2UgT3JtQ0FTVDo6JFNUUklORyA6ICRocWwgLj0gJ0MnLiRzaXplOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiRJTlRFR0VSIDogCgkJCQkJCWlmKCRzaXplSW50ZWdlciA9PT0gJycpIHsKCQkJCQkJCSRocWwgLj0gJ0k0Jy4kc2l6ZTsgCQkJCQkJICAKCQkJCQkJfSBlbHNlIGlmKCAkc2l6ZUludGVnZXIgPCAzICl7CgkJCQkJCQkkaHFsIC49ICdJMScuJHNpemU7IAoJCQkJCQl9IGVsc2UgaWYoICRzaXplSW50ZWdlciA8IDUgKXsKCQkJCQkJCSRocWwgLj0gJ0kyJy4kc2l6ZTsgCgkJCQkJCX0gZWxzZSBpZiggJHNpemVJbnRlZ2VyIDwgMTApewoJCQkJCQkJJGhxbCAuPSAnSTQnLiRzaXplOyAKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRocWwgLj0gJ0k4Jy4kc2l6ZTsgCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJY2FzZSBPcm1DQVNUOjokTlVNRVJJQyA6ICRocWwgLj0gJ04nLiRzaXplOyBicmVhazsKCgkJCQljYXNlIE9ybUNBU1Q6OiRET1VCTEUgOiAkaHFsIC49ICdGJy4kc2l6ZTsgYnJlYWs7CgoJCQkJY2FzZSBPcm1DQVNUOjokQlVGRkVSIDogJGhxbCAuPSAnWCc7IGJyZWFrOwoKCQkJCWNhc2UgT3JtQ0FTVDo6JERBVEUgOiAkaHFsIC49ICdEJzsgYnJlYWs7CgoJCQkJY2FzZSBPcm1DQVNUOjokVElNRSA6ICRocWwgLj0gJ1QnOyBicmVhazsgICAKCgkJCQljYXNlIE9ybUNBU1Q6OiRVVUlEIDogJGhxbCAuPSAnQyAoMzYpICc7IGJyZWFrOyAgIAoKCQkJCWNhc2UgT3JtQ0FTVDo6JFRTIDogJGhxbCAuPSAnSSAoMTApICc7IGJyZWFrOyAvL3dvcmthcm91bmQgZm9yIHRoZSByZWFsIHRpbWVzdGFtcCBtaXNzaW5nIGluIEFET0RCTElURQoKCQkJCWNhc2UgT3JtQ0FTVDo6JERBVEVUSU1FIDogJGhxbCAuPSBDTVNfQURPREJfRFQ7IGJyZWFrOyAgIAoKCQkJCWRlZmF1bHQgOiB0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCdDQVNUIFRZUEUgJy4kY2FzdFR5cGUuJyBmb3IgdGhlIGZpZWxkICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJy0+Jy4kZmllbGQtPmdldE5hbWUoKS4nIGlzIG5vdCBhIHZhbGlkIE9ybUNBU1Qgb3B0aW9uJyk7CgkJCX0KCgkJCS8vTWFuYWdlIGRlIG51bGxhYmxlIHZhbHVlCgkJCWlmKCAhJGZpZWxkLT5pc051bGxhYmxlKCkgKXsKCQkJCSRocWwgLj0gJyBOT1ROVUxMICc7CgkJCX0KCQkJCgkJCS8vTWFuYWdlIHRoZSBkZWZhdWx0IHZhbHVlCgkJCWlmKCRmaWVsZC0+Z2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCl7CgkJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokU1RSSU5HIHx8ICRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiRCVUZGRVIpIHsKCQkJCQkkaHFsIC49ICIgIERFRkFVTFQgJyIuc3RyX3JlcGxhY2UoIiciLCAiJyciLCRmaWVsZC0+Z2V0RGVmYXVsdFZhbHVlKCkpLiInICI7CgkJCQl9IGVsc2UgewoJCQkJCSRocWwgLj0gIiAgREVGQVVMVCAiLiRmaWVsZC0+Z2V0RGVmYXVsdFZhbHVlKCkuIiAiOwoJCQkJfQoJCQkJCgkJCX0KCgkJCWlmKCRmaWVsZC0+aXNQcmltYXJ5S0VZKCkpIHsKCQkJCWlmKCRlbnRpdHlQYXJhbS0+aXNBdXRvaW5jcmVtZW50KCkpIHsKCQkJCQkkaHFsIC49ICcgS0VZIEFVVE8nOwoJCQkJfSBlbHNlIHsKCQkJCQkkaHFsIC49ICcgS0VZICc7CgkJCQl9CgkJCX0KCQkJCQoJCX0KCQoJCU9ybVRyYWNlOjppbmZvKCRocWwpOwoKCQlyZXR1cm4gJGhxbDsKCX0KCQogICAgLyoqCiAgICAqIENyZWF0ZSBhIHRhYmxlIGludG8gRGF0YWJhc2UgZnJvbSB0aGUgc3RydWN0dXJlIG9mIGFuIE9ybUVudGl0eQogICAgKiAgV2lsbCBhbHNvIGNyZWF0ZSB0aGUgc2VxdWVuY2UgaWYgaXQncyBuZWVkZWQKICAgICogIAogICAgKiAgIGV4YW1wbGUgd2l0aCBhIEN1c3RvbWVyIGVudGl0eSA6IAogICAgKiA8Y29kZT4KICAgICogCiAgICAqIGNsYXNzIEN1c3RvbWVyIGV4dGVuZHMgT3JtRW50aXR5CiAgICAqIHsKICAgICogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgICogICAgewogICAgKiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICogICAgICAgIAogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgT3JtRmllbGQoJ2N1c3RvbWVyX2lkJyAgCgkqCQkJLCBPcm1DQVNUOjokSU5URUdFUgoJKgkJCSwgbnVsbAoJKgkJCSwgbnVsbAoJKgkJCSwgT3JtS0VZOjokUEsgCgkqCQkJKSk7CiAgICAqIAogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgT3JtRmllbGQoJ25hbWUnCiAgICAqICAgICAgICAJLCBPcm1DQVNUOjokU1RSSU5HIAogICAgKiAgICAgICAgCSwgMzIKICAgICogICAgICAgIAkpKTsKICAgICogCiAgICAqICAgICAgICAkdGhpcy0+YWRkKG5ldyBPcm1GaWVsZCgnbGFzdG5hbWUnCiAgICAqICAgICAgICAJLCBPcm1DQVNUOjokU1RSSU5HCiAgICAqICAgICAgICAJLCAzMgoJKgkJCSwgdHJ1ZSAgLy8gSXMgbnVsbGFibGUKICAgICogICAgICAgIAkpKTsKICAgICogICAgfQogICAgKiB9CiAgICAqIDwvY29kZT4KICAgICogCiAgICAqICBUaGUgYmVzdCB3YXkgdG8gY3JlYXRlIGl0cyB0YWJsZSBpbnRvIHRoZSBkYXRhYmFzZSA6IAogICAgKiAKICAgICogPGNvZGU+CiAgICAqICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqICAgT3JtQ29yZTo6Y3JlYXRlVGFibGUoJGN1c3RvbWVyKTsKICAgICogPC9jb2RlPgogICAgKiAKICAgICogIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gdHJ5IHRvIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaW5pdFRhYmxlKCkgaWYgaXQncyBkZWZpbmUgaW50byB0aGUgZW50aXR5IGNsYXNzLgogICAgKiAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY3JlYXRlVGFibGUoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgewoJCgkJJGhxbCA9IE9ybUNvcmU6Ol9nZXRGaWVsZHNUb0hxbCgkZW50aXR5UGFyYW0pOwoKCQkkcmVzdWx0ID0gT3JtRGI6OmNyZWF0ZVRhYmxlKCRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCksICRocWwpOwoJCQkJCgkJLy9JZiBuZWNlc3NhcnksIGl0IHdpbGwgY3JlYXRlIGEgc2VxdWVuY2Ugb24gdGhlIHRhYmxlLgoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpewoJCQlPcm1EYjo6Y3JlYXRlU2VxdWVuY2UoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpOwoJCX0KCQkKCQkvL1dlIG1hbmFnZSB0aGUgKCJ1bmlxdWUiKSBpbmRleGVzCgkJJGluZGV4ZXMgPSAkZW50aXR5UGFyYW0tPmdldEluZGV4ZXMoKTsKCgkJLy9Gb3IgZWFjaCBGaWVsZCBjb250YWluZWQgaW4gdGhlIGVudGl0eQoJCWZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KSB7CgkJCSRyZXN1bHQgPSBPcm1EYjo6Y3JlYXRlSW5kZXgoJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKSwgJGluZGV4WydmaWVsZHMnXSwgJGluZGV4Wyd1bmlxdWUnXSk7CgkJfQoKCQkvL1dlIGluaXRpYXRlIHRoZSB0YWJsZS4KCQkkZW50aXR5UGFyYW0tPmluaXRUYWJsZSgpOwoJfQogICAgCiAgICAvKioKICAgICogRHJvcCB0aGUgdGFibGUgZm9yIHRoZSBPcm1FbnRpdHkgaW4gcGFyYW1ldGVycwogICAgKiAgV2lsbCBhbHNvIGRyb3AgdGhlIHNlcXVlbmNlIGlmIGl0J3MgbmVlZGVkCiAgICAqIAogICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wVGFibGUoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgewoKCQlPcm1EYjo6ZHJvcFRhYmxlKCRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkpOwoKCQkvL0lmIG5lY2Vzc2FyeSwgaXQgd2lsbCBkZWxldGUgYSBzZXF1ZW5jZSBvbiB0aGUgdGFibGUuCgkJaWYoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkgIT0gbnVsbCl7CgkJCU9ybURiOjpkcm9wU2VxdWVuY2UoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpOwoJCX0KCX0gIAogIAogICAgLyoqCiAgICAqIFdpbGwgZWRpdCB0aGUgdGFibGUgb2YgdGhlIE9ybUVudGl0eSBpbiBwYXJhbWV0ZXJzIHdpdGggdGhlIFNRTCBxdWVyeSBpbiBwYXJhbWV0ZXJzCiAgICAqIAogICAgKiAgIGV4YW1wbGUgOiBpZiB5b3UgbmVlZCB0byBkbyAKICAgICogCiAgICAqIDxjb2RlPiAgICAgICAgCiAgICAqICAgQUxURVIgVEFCTEUgYCB0YWJsZSBvZiB0aGUgQ3VzdG9tZXIgZW50aXR5IGAgQUREIGBuZXdDb2x1bW5gIElOVCBOT1QgTlVMTCAKICAgICogICBBTFRFUiBUQUJMRSBgIHRhYmxlIG9mIHRoZSBDdXN0b21lciBlbnRpdHkgYCBEUk9QIGBvbGRDb2x1bW5gIAogICAgKiA8L2NvZGU+CiAgICAqIAogICAgKiAgdGhlIGNvZGUgbXVzdCBiZSA6CiAgICAqIAogICAgKiA8Y29kZT4KICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqICAgICAgIE9ybUNvcmU6OmFsdGVyVGFibGUoJGN1c3RvbWVyLCAiQUREIGBuZXdDb2x1bW5gIElOVCBOT1QgTlVMTCIpOwogICAgKiAgICAgICBPcm1Db3JlOjphbHRlclRhYmxlKCRjdXN0b21lciwgIkRST1AgYG9sZENvbHVtbmAiKTsKICAgICogPC9jb2RlPgogICAgKiAgIAogICAgKiAKICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgKiBAcGFyYW0gc3RyaW5nICRzcWwgdGhlIFNRTCBxdWVyeQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gYWx0ZXJUYWJsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkc3FsKSB7CQoJCSRxdWVyeUFsdGVyID0gIkFMVEVSIFRBQkxFICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4iICIuJHNxbDsgICAgCgkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWx0ZXIsCgkJCQkJCQkJCW51bGwsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6YWx0ZXJUYWJsZShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0sIHskc3FsfSkiKTsKCX0KICAgIAogICAgLyoqCiAgICAgKiBJbnNlcnQgZGF0YSBpbnRvIGRhdGFiYXNlLgogICAgICogCiAgICAgKiBFeGFtcGxlIGZvciBhIG5ldyBDdXN0b21lciA6IGN1c3RvbWVyX2lkLCBuYW1lLCBsYXN0TmFtZSAob3B0aW9uYWwpIAogICAgICogICAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAgICAgICAKICAgICAqICAgICAgICRjdXN0b21lci0+c2V0KCduYW1lJywnRHVyYW50Jyk7CiAgICAgKiAgICAgICAkY3VzdG9tZXItPnNldCgnbGFzdE5hbWUnPT4nSm9obicpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjppbnNlcnRFbnRpdHkoJGN1c3RvbWVyKTsKICAgICAqIDwvY29kZT4KCSAqCgkgKiBZb3UgY291bGQgYWxzbyBjb2RlIGZvciB0aGUgbGFzdCBsaW5lIDogJGN1c3RvbWVyLT5zYXZlKCk7ICBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgCiAgICAgKiAKICAgICAqIEltcG9ydGFudCA6IHlvdSBtdXN0IG5vdCBzZXQgdGhlIHByaW1hcnlLZXkgdmFsdWUuIEl0IHdpbGwgYmUgY2FsY3VsYXRlIGJ5IHRoZSBzeXN0ZW0gaXQtc2VsZgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkKICAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpbnNlcnRFbnRpdHkoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgkJJHZhbHVlcyA9ICRlbnRpdHlQYXJhbS0+Z2V0VmFsdWVzKCk7CgkJJGluZGV4ZXMgPSAkZW50aXR5UGFyYW0tPmdldEluZGV4ZXMoKTsKCQkkZW50aXR5bmFtZSA9ICRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpOwoKCQkkcXVlcnlJbnNlcnQgPSAnSU5TRVJUIElOVE8gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgKCVzKSB2YWx1ZXMgKCVzKSc7CgoJCSRzdHJfcGFyYW1zMSA9IGFycmF5KCk7CgkJJHN0cl9wYXJhbXMyID0gYXJyYXkoKTsKCgkJJHBhcmFtcyA9IGFycmF5KCk7CgkJCSAgIAoJCS8vQWxsIHRoZSByZXF1aXJlZCB2YWx1ZXMgbXVzdCBiZSBwcmVzZW50CgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsKCQkJCgkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkgewoJCQkJY29udGludWU7CgkJCX0KCQkJCQkJCgkJCS8vV2UgZG9uJ3QgaW5zZXJ0IHRoZSB0cmFuc2llbnQgRmllbGRzIAoJCQlpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokTk9ORSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCSRmaWVsZG5hbWUgPSAkZmllbGQtPmdldE5hbWUoKTsKCgkJCS8vRml4IGJ1ZyA4NiBQSFAgQ2F0Y2hhYmxlIGZhdGFsIGVycm9yOiBPYmplY3Qgb2YgY2xhc3MgY29udmVydGVkIHRvIHN0cmluZyAtIGZvcmVpZ24ga2V5IGFzc2lnbmVkIG9iamVjdCBvbiB1cGRhdGUKCQkJaWYoaXNzZXQoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pICAmJiAKCQkJCWlzX29iamVjdCgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkpewoJCQkJJGZvYmplY3QgPSAkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXTsKCQkJCWxpc3QoJGZlbnRpdHluYW1lLCAkZmZpZWxkbmFtZSkgPSBleHBsb2RlKCcuJywgJGZpZWxkLT5nZXRLZXlOYW1lKCkpOwoJCQkJaWYoJGZvYmplY3QgaW5zdGFuY2VPZiAkZmVudGl0eW5hbWUpIHsKCQkJCQkkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSA9ICRmb2JqZWN0LT5nZXQoJGZmaWVsZG5hbWUpOwoJCQkJfQoJCQl9CgkJCQoJCQkkc3RyX3BhcmFtczFbXSA9ICcgJy4kZmllbGRuYW1lLicgJzsKCQkJJHN0cl9wYXJhbXMyW10gPSAnPyc7CgkJCQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKSB7CgkJCQlpZighZW1wdHkoJHZhbHVlc1skZmllbGRuYW1lXSkpIHsKCQkJCQlpZigkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKXsKCQkJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbignUHJpbWFyeSBLZXkgJy4kZmllbGRuYW1lLicgY2FuXCd0IGJlIHNldHRlZCBkdXJpbmcgaW5zZXJ0IG9wZXJhdGlvbiBmb3IgT3JtRW50aXR5Jy4kZW50aXR5bmFtZSk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmKCEkZW50aXR5UGFyYW0tPmlzQXV0b2luY3JlbWVudCgpKXsKCQkJCQkkbmV3SWQgPSBPcm1EYjo6Z2VuSUQoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpOwoJCQkJCSR2YWx1ZXNbJGZpZWxkbmFtZV0gPSAkbmV3SWQ7CgkJCQkJJGVudGl0eVBhcmFtLT5zZXQoJGZpZWxkbmFtZSwgJG5ld0lkKTsKCQkJCX0gZWxzZXsKCQkJCQkkdmFsdWVzWyRmaWVsZG5hbWVdID0gMDsKCQkJCQkkZW50aXR5UGFyYW0tPnNldCgkZmllbGRuYW1lLCAwKTsKCQkJCX0KCQkJfQoJCQkKCQkJJGlzRW1wdHkgPSB0cnVlOwoJCQlpZihpc3NldCgkdmFsdWVzWyRmaWVsZG5hbWVdKSl7CgkJCQkkaXNFbXB0eSA9IE9ybVV0aWxzOjppc0FuRW1wdHlGaWVsZCgkZmllbGQsICR2YWx1ZXNbJGZpZWxkbmFtZV0pOwoJCQl9CgkJCQoKCQkJLy9FbXB0eSBGaWVsZCB0aGF0IHNob3VsZG4ndCBiZSAhCgkJCWlmKCEkZmllbGQtPmlzUHJpbWFyeUtFWSgpICYmICEkZmllbGQtPmlzTnVsbGFibGUoKSAmJiAkaXNFbXB0eSkgewoJCQkJLy9FeGNlcHRpb24gOiBpZiB0aGUgZmllbGQgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgd2Ugc2V0IGl0IG1hbnVhbGx5CgkJCQlpZighaXNfbnVsbCgkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpKSl7CgkJCQkJJHZhbHVlc1skZmllbGRuYW1lXSA9ICRmaWVsZC0+Z2V0RGVmYXVsdFZhbHVlKCk7CgkJCQl9IGVsc2UgewoJCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ3RoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eW5hbWUuJyBjYW5cJ3QgYmUgbnVsbCcpOwoJCQkJfQoJCQl9CgoJCQkvL0VtcHR5IEZpZWxkIHdpdGggZGVmYXVsdCBWYWx1ZQoJCQlpZighJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSAmJiAkZmllbGQtPmlzTnVsbGFibGUoKSAmJiAkaXNFbXB0eSAmJiAhaXNfbnVsbCgkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpKSkgewoJCQkJJHZhbHVlc1skZmllbGRuYW1lXSA9ICRmaWVsZC0+Z2V0RGVmYXVsdFZhbHVlKCk7CgkJCX0KCgoJCQkvLyBDb250cm9sIHRoZSBGb3JtYXQgaWYgbm90IGVtcHR5CgkJCWlmKCEkaXNFbXB0eSAmJiAhT3JtVXRpbHM6OmlzQVZhbGlkRm9ybWF0KCRmaWVsZCwgJHZhbHVlc1skZmllbGRuYW1lXSkpewoJCQkJdGhyb3cgbmV3IE9ybUNhc3RGb3JtYXRFeGNlcHRpb24oJ3RoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBvZiBPcm1FbnRpdHkgICcuJGVudGl0eW5hbWUuJyBkb2VzblwndCByZXNwZWN0IHRoZSBmb3JtYXQgcmVxdWlyZWQnKTsKCQkJfQoJCQkKCQkJCgkJCSR2YWwgPSBudWxsOwoJCQlpZihpc3NldCgkdmFsdWVzWyRmaWVsZG5hbWVdKSkKCQkJewoJCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCR2YWx1ZXNbJGZpZWxkbmFtZV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSRwYXJhbXNbXSA9IG51bGw7CgkJCX0KCQl9CgkJCgkJLy9jb250cm9sIHVuaXF1ZW5lc3Mgb24gdW5pcXVlIEZpZWxkCgkJZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpewoJCQlpZighJGluZGV4Wyd1bmlxdWUnXSl7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJJHF1ZXJ5ID0gJ1NFTEVDVCBDT1VOVCgqKSBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFIDEgJzsKCQkJJGFycmF5RmluZCA9IGFycmF5KCk7CgkJCSRtc2dFcnJvciA9ICd7JzsKCQkJJGlzRmlyc3QgPSB0cnVlOwoJCQlmb3JlYWNoKCRpbmRleFsnZmllbGRzJ10gYXMgJGVsdCl7CgkJCQlpZighJGlzRmlyc3QpewoJCQkJCSRtc2dFcnJvciAuPScsJzsKCQkJCX0KCQkJCWlmKGVtcHR5KCR2YWx1ZXNbJGVsdF0pKXsKCQkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRlbHQgLiAnIElTIE5VTEwgJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHF1ZXJ5IC49ICcgQU5EICcgLiAkZWx0IC4gJyA9ID8gJzsKCQkJCQkkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRlbHRdOwoJCQkJfQoJCQkJJG1zZ0Vycm9yIC49ICIgeyRlbHR9ID0geyR2YWx1ZXNbJGVsdF19ICI7CgkJCX0KICAgICAgICAgICAgZm9yZWFjaCgkZW50aXR5UGFyYW0tPmdldFBrKCkgYXMgJHBrbmFtZSA9PiAkcGspewogICAgICAgICAgICAgICAgJHF1ZXJ5IC49ICcgQU5EICcgLiAkcGtuYW1lIC4gJyAhPSA/ICc7CiAgICAgICAgICAgICAgICAkYXJyYXlGaW5kW10gPSAkdmFsdWVzWyRwa25hbWVdOwogICAgICAgICAgICB9CgkJCSRtc2dFcnJvciAuPSAnfSc7CgkJCQoJCQkvL0V4ZWN1dGlvbgoJCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnksCgkJCQkJCQkJCSRhcnJheUZpbmQsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgdW5pY2l0eSBjb250cm9sIGluIE9ybUNvcmU6Omluc2VydEVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5bmFtZX0pIik7CgkJCgkJCWlmKCRyZXN1bHQgIT0gMCl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbiBFbnRpdHkgeyRlbnRpdHluYW1lfSB3aXRoIHRoZSBzYW1lIGZpZWxkcyAoeyRtc2dFcnJvcn0pIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIik7CgkJCX0KCQl9CgkJCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoc3ByaW50ZigkcXVlcnlJbnNlcnQsIGltcGxvZGUoJywnICwgJHN0cl9wYXJhbXMxKSwgaW1wbG9kZSgnLCcgLCAkc3RyX3BhcmFtczIpKSwKCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjppbnNlcnRFbnRpdHkoT3JtRW50aXR5ICZ7JGVudGl0eW5hbWV9KSIpOwoJCQoKCS8qCWlmKCRlbnRpdHlQYXJhbS0+aXNJbmRleGFibGUoKSkgeyAgCgkJCU9ybUluZGV4aW5nOjpBZGRXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgT3JtQ29yZTo6ZmluZEJ5SWQoJGVudGl0eVBhcmFtLCRhcnJheUtFWVswXSkpOwoJCX0qLwoJCQoJCS8vZW1wdHkgY2FjaGUKCQlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+Y2xlYXJDYWNoZSgpOwoJCQogICAgICAgIGlmKCRlbnRpdHlQYXJhbS0+aXNBdXRvaW5jcmVtZW50KCkpewogICAgICAgICAgICAvL0dldCB0aGUgbGFzdCBJZCBpbnNlcnRlZCAgKG9ubHkgZm9yIGVudGl0eSB3aXRoIG9ubHkgMSBpbnRlZ2VyIEZpZWxkIGFzIEtleSkKICAgICAgICAgICAgLy8gQHNlZSBhbHNvIDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzIzODgvbXlzcWwtc2VsZWN0LWxhc3QtaW5zZXJ0LWlkLWZvci1jb21wb3VuZC1rZXktaXMtaXQtcG9zc2libGUKICAgICAgICAgICAgJG5iUGtJbnRlZ2VyID0gMDsKICAgICAgICAgICAgJG5hbWVPZlBrID0gJyc7CiAgICAgICAgICAgIGZvcmVhY2goJGVudGl0eVBhcmFtLT5nZXRQaygpIGFzICRwayl7CiAgICAgICAgICAgICAgICBpZigkcGstPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokSU5URUdFUil7CiAgICAgICAgICAgICAgICAgICAgJG5iUGtJbnRlZ2VyKys7CiAgICAgICAgICAgICAgICAgICAgJG5hbWVPZlBrID0gJHBrLT5nZXROYW1lKCk7CgkJICAgICAgICAgICAgfQogICAgICAgICAgICAJfQogICAgICAgICAgICBpZigkbmJQa0ludGVnZXIgPT0gMSAmJiAkbmFtZU9mUGsgIT0gJycgJiYgZW1wdHkoJHZhbHVlc1skbmFtZU9mUGtdKSl7CiAgICAgICAgICAgICAgICAkbmV3SWQgPSBPcm1EYjo6Z2V0T25lKCJTRUxFQ1QgTEFTVF9JTlNFUlRfSUQoKSIpOwogICAgICAgICAgICAgICAgJGVudGl0eVBhcmFtLT5zZXQoJG5hbWVPZlBrLCAkbmV3SWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAoJCXJldHVybiAkZW50aXR5UGFyYW07CgoJfQoJCiAgICAvKioKICAgICAqICBVcGRhdGUgZGF0YSBpbnRvIGRhdGFiYXNlLiBUaGUgdGhpcmQgcGFyYW1ldGVyIG11c3QgZm9sbG93IHRoaXMgc2NoZW1lCiAgICAgKiAKICAgICAqIEV4YW1wbGUgZm9yIGEgbmV3IEN1c3RvbWVyIDogCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJG15QXJyYXkgPSBhcnJheSgpOwogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjEsICdsYXN0TmFtZSc9Pm51bGwsICduYW1lJz0+J0R1cG9udCcpOyAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUsIGVyYXNlIGxhc3ROYW1lIHZhbHVlIGluIGRhdGFiYXNlCiAgICAgKiAgICAgICAkbXlBcnJheVtdID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MiwgJ25hbWUnPT4nRHVyYW50Jyk7ICAgICAgICAgICAgICAgICAgICAgIDwtLSB1cGRhdGUgTmFtZSB2YWx1ZQogICAgICogICAgICAgJG15QXJyYXlbXSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjMsICdsYXN0TmFtZSc9PidKb2huJywgJ25hbWUnPT4nRG9lJyk7ICAgICA8LS0gdXBkYXRlIE5hbWUgdmFsdWUgYW5kIGxhc3ROYW1lIHZhbHVlCiAgICAgKiAKICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgICogICAgICAgCiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBPcm1Db3JlOjpmaW5kQnlJZCgkY3VzdG9tZXIsIDEpOwogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ2xhc3ROYW1lJz0+J05ld0xhc3ROYW1lJyk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnVwZGF0ZUVudGl0eSgkY3VzdG9tZXIpOwogICAgICogPC9jb2RlPgogICAgICogCSAKICAgICAqIFlvdSBjb3VsZCBhbHNvIGNvZGUgZm9yIHRoZSBsYXN0IGxpbmUgOiAkY3VzdG9tZXItPnNhdmUoKTsgIGl0IHdpbGwgYXV0b21hdGljYWxseSAKCSAqCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CgkgKgoJICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGVudGl0eSBzYXZlZCB3aXRoIGl0cyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpCiAgICAgKi8JCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHVwZGF0ZUVudGl0eShPcm1FbnRpdHkgJGVudGl0eVBhcmFtKSB7CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCQkkdmFsdWVzID0gJGVudGl0eVBhcmFtLT5nZXRWYWx1ZXMoKTsKCQkkaW5kZXhlcyA9ICRlbnRpdHlQYXJhbS0+Z2V0SW5kZXhlcygpOwoJCSRlbnRpdHluYW1lID0gJGVudGl0eVBhcmFtLT5nZXROYW1lKCk7CgoJCSRzdHJfcGFyYW1zMSA9IGFycmF5KCk7CgkJJHdoZXJlID0gJyc7CgkJJHBhcmFtcyA9IGFycmF5KCk7CgkJJGhhc0tleSA9IGZhbHNlOwoJCSAgCgkJLy9BbGwgdGhlIHJlcXVpcmVkIHZhbHVlcyBtdXN0IGJlIHByZXNlbnQKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkgewoJCQkKCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQkJCQkKCQkJLy9XZSBkb24ndCBpbnNlcnQgdGhlIHRyYW5zaWVudCBGaWVsZHMgCgkJCWlmKCRmaWVsZC0+Z2V0VHlwZSgpID09IE9ybUNBU1Q6OiROT05FKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJJGZpZWxkbmFtZSA9ICRmaWVsZC0+Z2V0TmFtZSgpOwoKCQkJLy9GaXggYnVnIDg2IFBIUCBDYXRjaGFibGUgZmF0YWwgZXJyb3I6IE9iamVjdCBvZiBjbGFzcyBjb252ZXJ0ZWQgdG8gc3RyaW5nIC0gZm9yZWlnbiBrZXkgYXNzaWduZWQgb2JqZWN0IG9uIHVwZGF0ZQoJCQlpZihpc3NldCgkdmFsdWVzWyRmaWVsZC0+Z2V0TmFtZSgpXSkgICYmIAoJCQkJaXNfb2JqZWN0KCR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSl7CgkJCQkkZm9iamVjdCA9ICR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldOwoJCQkJbGlzdCgkZmVudGl0eW5hbWUsICRmZmllbGRuYW1lKSA9IGV4cGxvZGUoJy4nLCAkZmllbGQtPmdldEtleU5hbWUoKSk7CgkJCQlpZigkZm9iamVjdCBpbnN0YW5jZU9mICRmZW50aXR5bmFtZSkgewoJCQkJCSR2YWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldID0gJGZvYmplY3QtPmdldCgkZmZpZWxkbmFtZSk7CgkJCQl9CgkJCX0KCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgewoJCQkJaWYoIWVtcHR5KCR2YWx1ZXNbJGZpZWxkbmFtZV0pKSB7CgkJCQkJLy8gTm9ybWFsIGNhc2UgaW4gYW4gdXBkYXRlIG1vZGUKCQkJCQkkd2hlcmUgPSAnIFdIRVJFICcuJGZpZWxkbmFtZS4nID0gPyc7CgkJCQkJJGhhc0tleSA9IHRydWU7CgkJCQkJJGtleVZhbHVlID0gJHZhbHVlc1skZmllbGRuYW1lXTsKCgkJCQl9IGVsc2UgaWYoISRlbnRpdHlQYXJhbS0+aXNBdXRvaW5jcmVtZW50KCkpewoJCQkJCSRuZXdJZCA9IE9ybURiOjpnZW5JRCgkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSk7CgkJCQkJJHZhbHVlc1skZmllbGRuYW1lXSA9ICRuZXdJZDsKCQkJCQkkZW50aXR5UGFyYW0tPnNldCgkZmllbGRuYW1lLCAkbmV3SWQpOwoKCQkJCQkvL1RPRE8gOiBlcnJvciBvciAiaW5zZXJ0Ii1saWtlIHByb2Nlc3MgPwoJCQkJCS8vdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIHByaW1hcnlLZXkgJy4kZmllbGRuYW1lLicgaXMgbWlzc2luZyBmb3IgdGhlIGVudGl0eSA6ICcuJGVudGl0eW5hbWUpOwoKCQkJCX0gZWxzZXsKCQkJCQkkdmFsdWVzWyRmaWVsZG5hbWVdID0gMDsKCQkJCQkkZW50aXR5UGFyYW0tPnNldCgkZmllbGRuYW1lLCAwKTsKCQkJCX0KCQkJfQoKCQkJJGlzRW1wdHkgPSBPcm1VdGlsczo6aXNBbkVtcHR5RmllbGQoJGZpZWxkLCAkdmFsdWVzWyRmaWVsZG5hbWVdKTsKCgkJCS8vRW1wdHkgRmllbGQgdGhhdCBzaG91bGRuJ3QgYmUgIQoJCQlpZighJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSAmJiAhJGZpZWxkLT5pc051bGxhYmxlKCkgJiYgJGlzRW1wdHkpIHsKCQkJCS8vRXhjZXB0aW9uIDogaWYgdGhlIGZpZWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIHdlIHNldCBpdCBtYW51YWxseQoJCQkJaWYoIWlzX251bGwoJGZpZWxkLT5nZXREZWZhdWx0VmFsdWUoKSkpewoJCQkJCSR2YWx1ZXNbJGZpZWxkbmFtZV0gPSAkZmllbGQtPmdldERlZmF1bHRWYWx1ZSgpOwoJCQkJfSBlbHNlIHsKCQkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgZmllbGQgJy4kZmllbGRuYW1lLicgb2YgT3JtRW50aXR5ICAnLiRlbnRpdHluYW1lLicgY2FuXCd0IGJlIG51bGwnKTsKCQkJCX0KCQkJfQoKCQkJLy8gQ29udHJvbCB0aGUgRm9ybWF0IGlmIG5vdCBlbXB0eQoJCQlpZighJGlzRW1wdHkgJiYgIU9ybVV0aWxzOjppc0FWYWxpZEZvcm1hdCgkZmllbGQsICR2YWx1ZXNbJGZpZWxkbmFtZV0pKXsKCQkJCXRocm93IG5ldyBPcm1DYXN0Rm9ybWF0RXhjZXB0aW9uKCd0aGUgZmllbGQgJy4kZmllbGRuYW1lLicgb2YgT3JtRW50aXR5ICAnLiRlbnRpdHluYW1lLicgZG9lc25cJ3QgcmVzcGVjdCB0aGUgZm9ybWF0IHJlcXVpcmVkJyk7CgkJCX0KCgkJCSRzdHJfcGFyYW1zMVtdID0gJyAnLiRmaWVsZG5hbWUuJyA9ID8gJzsKCgkJCSRwYXJhbXNbXSA9IE9ybUNvcmU6Ol9maWVsZFRvREJWYWx1ZSgkdmFsdWVzWyRmaWVsZG5hbWVdLCAkZmllbGQtPmdldFR5cGUoKSk7CgoJCX0KCQkKCQkvL2NvbnRyb2wgdW5pcXVlbmVzcyBvbiB1bmlxdWUgRmllbGQKCQlmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCl7CgkJCWlmKCEkaW5kZXhbJ3VuaXF1ZSddKXsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCQoJCQkkcXVlcnkgPSAnU0VMRUNUIENPVU5UKCopIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgMSAnOwoJCQkkYXJyYXlGaW5kID0gYXJyYXkoKTsKCQkJJG1zZ0Vycm9yID0gJ3snOwoJCQkkaXNGaXJzdCA9IHRydWU7CgkJCWZvcmVhY2goJGluZGV4WydmaWVsZHMnXSBhcyAkZWx0KXsKCQkJCWlmKCEkaXNGaXJzdCl7CgkJCQkJJG1zZ0Vycm9yIC49JywnOwoJCQkJfQoJCQkJaWYoZW1wdHkoJHZhbHVlc1skZWx0XSkpewoJCQkJCSRxdWVyeSAuPSAnIEFORCAnIC4gJGVsdCAuICcgSVMgTlVMTCAnOwoJCQkJfSBlbHNlIHsKCQkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRlbHQgLiAnID0gPyAnOwoJCQkJCSRhcnJheUZpbmRbXSA9ICR2YWx1ZXNbJGVsdF07CgkJCQl9CgkJCQkkbXNnRXJyb3IgLj0gIiB7JGVsdH0gPSB7JHZhbHVlc1skZWx0XX0gIjsKCQkJfQoJCQlmb3JlYWNoKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwayl7CgkJCQkkcXVlcnkgLj0gJyBBTkQgJyAuICRwa25hbWUgLiAnICE9ID8gJzsKCQkJCSRhcnJheUZpbmRbXSA9ICR2YWx1ZXNbJHBrbmFtZV07CQkJCgkJCX0KCgkJCSRtc2dFcnJvciAuPSAnfSc7CgkJCQoJCQkvL0V4ZWN1dGlvbgoJCQkkcmVzdWx0ID0gT3JtRGI6OmdldE9uZSgkcXVlcnksCgkJCQkJCQkJCSRhcnJheUZpbmQsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgdW5pY2l0eSBjb250cm9sIGluIE9ybUNvcmU6OnVwZGF0ZUVudGl0eShPcm1FbnRpdHkgJnskZW50aXR5bmFtZX0pIik7CgkJCgkJCWlmKCRyZXN1bHQgIT0gMCl7CgkJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbiBFbnRpdHkgeyRlbnRpdHluYW1lfSB3aXRoIHRoZSBzYW1lIGZpZWxkcyAoeyRtc2dFcnJvcn0pIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlIik7CgkJCX0KCQl9CgoJCWlmKCRoYXNLZXkpIHsKCQkJJHBhcmFtc1tdID0gJGtleVZhbHVlOwoJCX0KCgkJJHF1ZXJ5VXBkYXRlID0gJ1VQREFURSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBTRVQgJy5pbXBsb2RlKCcsJywgJHN0cl9wYXJhbXMxKS4kd2hlcmU7CgkKCQkvL0V4ZWN1dGlvbgoJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlVcGRhdGUsCgkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6dXBkYXRlRW50aXR5KE9ybUVudGl0eSAmeyRlbnRpdHluYW1lfSkiKTsKCQkKCQkvKmlmKCRlbnRpdHlQYXJhbS0+aXNJbmRleGFibGUoKSkgeyAgCgkJCU9ybUluZGV4aW5nOjpVcGRhdGVXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgJGVudGl0eVBhcmFtKTsKCQl9Ki8KCQkKCQkvL2VtcHR5IGNhY2hlCgkJT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmNsZWFyQ2FjaGUoKTsKCQkKCQlyZXR1cm4gJGVudGl0eVBhcmFtOwoJfQogIAogICAgLyoqCiAgICAqIERlbGV0ZSBpbmZvcm1hdGlvbiBpbnRvIGRhdGFiYXNlCiAgICAqICAgCiAgICAqIEV4YW1wbGUgZm9yIGEgc2luZ2xlIGRlbGV0aW9uIDogCiAgICAqIAogICAgKiA8Y29kZT4KICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAqIAogICAgKiAgICAgICBPcm1Db3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsIGFycmF5KDEpOwogICAgKiA8L2NvZGU+CiAgICAqIAogICAgKiAgRXhhbXBsZSBmb3IgbXVsdGlwbGUgZGVsZXRpb24gOiAKICAgICogCiAgICAqIDxjb2RlPgogICAgKiAgICAgICAkbXlBcnJheSA9IGFycmF5KCk7CiAgICAqICAgICAgICRteUFycmF5W10gPSAxOwogICAgKiAgICAgICAkbXlBcnJheVtdID0gMjsKICAgICogICAgICAgJG15QXJyYXlbXSA9IDM7CiAgICAqIAogICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICogCiAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5SWRzKCRjdXN0b21lciwgJG15QXJyYXkpOwogICAgKiA8L2NvZGU+CiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgICAgCiAgICAqIEBwYXJhbSBtaXhlZFtdICRpZHMgYXJyYXkgYWxsIHRoZSBpZHMgdG8gZGVsZXRlICgkY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGRlbGV0ZUJ5SWRzKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sICRpZHMpIHsKCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOwoKCQkvL0ZJWCBNRSA6IGl0IG1heSBub3Qgd29yayB3aXRoIGNvbXBvc2l0ZSBQSwoJCWZvcmVhY2goJGxpc3RlRmllbGQgYXMgJGZpZWxkKSB7CgkJICBpZighJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgeyAKCQkJY29udGludWU7CgkJICB9CgkJICAkZmllbGR0eXBlID0gJGZpZWxkLT5nZXRUeXBlKCk7CgkJICAkZmllbGRuYW1lID0gJGZpZWxkLT5nZXROYW1lKCk7CgkJfSAgCgoJCSR3aGVyZSA9ICcnOwoJCWZvcmVhY2goJGlkcyBhcyAkc2lkKQoJCXsKCQkgIGlmKCFlbXB0eSgkd2hlcmUpKQoJCSAgewoJCQkkd2hlcmUgLj0gJyBPUiAnOwoJCSAgfQoJCSAgCgkJICAkd2hlcmUgLj0gJGZpZWxkbmFtZS4nID0gPyc7CgkJICAkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHNpZCwgJGZpZWxkdHlwZSk7ICAKCQl9CgoKCQkkcXVlcnlEZWxldGUgPSAnREVMRVRFIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJy4kd2hlcmU7CgoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeURlbGV0ZSwKCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjpkZWxldGVFbnRpdHkoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9KSIpOwoJCQkJCQkJCQkKCQkKCgkJLy9pZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpCgkJLy97ICAKCQkgIC8vICRtb2RvcHMgPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCk7CgkJICAvLyBpZihtZXRob2RfZXhpc3RzKCRtb2RvcHMsIkdldFNlYXJjaE1vZHVsZSIpKQoJCSAgLy8gewoJCQkvLyBPcm1JbmRleGluZzo6c2V0U2VhcmNoKCRtb2RvcHMtPkdldFNlYXJjaE1vZHVsZSgpKTsKCQkgIC8vIH0KCQkgIC8vZm9yZWFjaCgkaWRzIGFzICRzaWQpCgkJICAvL3sKCQkJLy9Pcm1JbmRleGluZzo6RGVsZXRlV29yZHMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCksICRlbnRpdHlQYXJhbSwgJHNpZCk7CgkJICAvL30KCQkgIAoJCS8vfQoJCQoJCS8vZW1wdHkgY2FjaGUKCQlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+Y2xlYXJDYWNoZSgpOwoJfQogICAKICAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgZnJvbSB0aGUgdGFibGUgb2YgdGhlIGVudGl0eSBpbiBQYXJhbWV0ZXJzCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAgIAoJKiAKICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSAgIAogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gY291bnRBbGwoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSkgewoKCQkkcXVlcnlTZWxlY3QgPSAnU0VMRUNUIGNvdW50KCopIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpOwoJCQoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpnZXRPbmUoJHF1ZXJ5U2VsZWN0LAoJCQkJCQkJCQludWxsLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmNvdW50QWxsKE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSkiKTsKCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0KICAKICAgIC8qKgogICAgKiBSZXR1cm5zIGFsbCB0aGUgb2NjdXJyZW5jZXMgZnJvbSB0aGUgdGFibGUgb2YgdGhlIGVudGl0eSBpbiBQYXJhbWV0ZXJzCiAgICAqIAogICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAKICAgICogQHBhcmFtIE9ybU9yZGVyQnkgJG9yZGVyQnkgdGhlIG9yZGVyIGlmIG5lY2Vzc2FyeQogICAgKiBAcGFyYW0gT3JtTGltaXQgJGxpbWl0IHRoZSBsaW1pdCBpZiBuZWNlc3NhcnkKCSoKICAgICogQHJldHVybiBPcm1FbnRpdHlbXSBsaXN0IG9mIEVudGl0aWVzIGZvdW5kCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQWxsKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sIE9ybU9yZGVyQnkgJG9yZGVyQnk9bnVsbCwgT3JtTGltaXQgJGxpbWl0ID0gbnVsbCkgewoJCXJldHVybiBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRlbnRpdHlQYXJhbSwgbmV3IE9ybUV4YW1wbGUoKSwgJG9yZGVyQnksICRsaW1pdCk7Cgl9CgkKCS8qKgoJICogSW5uZXIgZnVuY3Rpb24gdG8gZmFjdG9yaXplIHNvbWUgY29kZSBmb3IgZWFjaCAiZmluZCoiIGZ1bmN0aW9ucwoJICogIEl0IHdpbGwgcmV0cmlldmUgYWxsIHRoZSBpbmZvcm1hdGlvbnMgb24gdGhlIEFLJ3MgRmllbGQKCSAqCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAKCSAqIEBwYXJhbSBPcm1FbnRpdHlbXSAkZW50aXR5cyB0aGUgbGlzdCBvZiBvYmplY3QgRW50aXR5IHRvIHBvcHVsYXRlCgkgKgogICAgICogQHJldHVybiBPcm1FbnRpdHlbXSBsaXN0IG9mIEVudGl0aWVzIHBvcHVsYXRlIHdpdGggYWxsIHRoZSBpbmZvcm1hdGlvbnMgb24gQUsncyBGaWVsZAoJICoqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwb3B1bGF0ZUZpZWxkcyhPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBhcnJheSAkZW50aXR5cykgewoJCQoJCWlmKGVtcHR5KCRlbnRpdHlzKSl7CgkJCXJldHVybiAkZW50aXR5czsKCQl9CgoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsKCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkgewoKCQkJLy9UZXN0IHRoZSBwcmVzZW5jZSBvZiAkQUsKCQkgIAlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsKCQkJCSRlbnRpdHlzID0gT3JtQ29yZTo6cG9wdWxhdGVBS0ZpZWxkKCRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRmaWVsZCk7CgkJICAJfSAKCQkgIAkKCQkgIAkvL1Rlc3QgdGhlIHByZXNlbmNlIG9mICRGSwoJCSAgCWlmKCRmaWVsZC0+aXNGb3JlaWduS0VZKCkgJiYgc3RycG9zKCRmaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpIHsKCQkgIAkJCgkJICAJCWxpc3QoJGVudGl0eUFzc29jTmFtZSwgJGZpZWxkQXNzb2NpYXRlTmFtZSkgPSBleHBsb2RlKCIuIiwgJGZpZWxkLT5nZXRLRVlOYW1lKCkpOwoJCQkJJGVudGl0eUFzc29jID0gbmV3ICRlbnRpdHlBc3NvY05hbWUoKTsKCQkgIAkJCgkJICAJCS8vQXZvaWQgRksgcG9pbnRpbmcgb24gY29tcG9zaXRlIHByaW1hcnkga2V5CgkJICAJCWlmKGNvdW50KCRlbnRpdHlBc3NvYy0+Z2V0UGsoKSkgPT0gMSl7CgkJICAJCQkkZW50aXR5cyA9IE9ybUNvcmU6OnBvcHVsYXRlRktGaWVsZCgkZW50aXR5UGFyYW0sICRlbnRpdHlzLCAkZmllbGQpOwoJCSAgCQl9CgkJICAJfQoJCX0KCgkJJGFsaWFzID0gJGVudGl0eVBhcmFtLT5nZXRBbGlhcygpOwoJCWZvcmVhY2ggKCRhbGlhcyBhcyAkYW5BbGlhcyA9PiAkYWxpYXNDb21wb25lbnQpIHsKCQkJJGVudGl0eXMgPSBPcm1Db3JlOjpwb3B1bGF0ZUFsaWFzRmllbGQoJGVudGl0eVBhcmFtLCAkZW50aXR5cywgJGFuQWxpYXMpOwoJCX0KCQkKCQlyZXR1cm4gJGVudGl0eXM7Cgl9CgoJLyoqCgkgKiBXaWxsIGZvdW5kIGFsbCB0aGUgZW50aXR5cyBhdmFpbGFibGUgZm9yIHRoZSBBbGlhcyBwYXJhbWV0ZXIgJGVudGl0eVBhcmFtLgoJICogICBBbGxvdyAkbXllbnRpdHktPmdldCgnbXlfYWxpYXMnKTsKCSAqIAoJICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICAKCSAqIEBwYXJhbSBPcm1FbnRpdHlbXSAkZW50aXR5cyBhcnJheSBsaXN0IG9mIE9iamVjdCBPcm1FbnRpdHkKCSAqIEBwYXJhbSBzdHJpbmcgJGFuQWxpYXMgdGhlIGFsaWFzIHRvIHBvcHVsYXRlCgkgKiAKCSAqIEByZXR1cm4gT3JtRW50aXR5W10gbGlzdCBvZiBPYmplY3Qgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBhbGlhcyBwb3B1bGF0ZWQgYnkgdGhlIG90aGVyIE9ybUVudGl0eSBmb3VuZGVkCgkgKiAKCSAqIEBzaW5jZSAwLjMuMAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwb3B1bGF0ZUFsaWFzRmllbGQoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJGVudGl0eXMsICRhbkFsaWFzKSB7CgoJCSRhbGlhcyA9ICRlbnRpdHlQYXJhbS0+Z2V0QWxpYXMoKTsKCQlpZighaXNzZXQoJGFsaWFzWyRhbkFsaWFzXSkpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmdW5jdGlvbiBwb3B1bGF0ZUFsaWFzRmllbGQoXCRlbnRpdHlQYXJhbSwgXCRlbnRpdHlzLCBcJGFuQWxpYXMpIG9ubHkgYWNjZXB0IGFsaWFzIG5hbWUgaW4gdGhpcmQgcGFyYW1ldGVyIik7CgkJfQoKCQkkYWxpYXNDb21wb25lbnQgPSAkYWxpYXNbJGFuQWxpYXNdOyAKCQlmb3JlYWNoICgkYWxpYXNDb21wb25lbnQgYXMgJGNvbXBvbmVudCkgewoJCQkkZmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkQnlOYW1lKCRjb21wb25lbnQpOwoJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S0VZTmFtZSgpKTsKCQkJJGVudGl0eUFzc29jID0gbmV3ICRlbnRpdHlBc3NvY05hbWUoKTsKCgkJCS8vSW5pdGlhdGUgdGhlIGZpZWxkIGFzc29jaWF0ZSB3aXRoIGFuIGVtcHR5IGFycmF5LgoJCQkkZW50aXR5c0tleXMgPSBhcnJheSgpOwoJCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQkJJGVudGl0eS0+c2V0KCRhbkFsaWFzLCBudWxsKTsKCQkJfQoKCQkJJHNxbGZpZWxkdmFsdWVbXSA9ICRmaWVsZC0+Z2V0TmFtZSgpOwoJCQkkYXNzb2NGaWVsZHNOYW1lW10gPSAkZmllbGRBc3NvY2lhdGVOYW1lOwoJCQkkc3FsZmllbGRuYW1lW10gPSAiIHskZmllbGRBc3NvY2lhdGVOYW1lfSA9ID8gIjsKCgkJfQoKCQkvLyAoIGZpZWxkMSA9ID8gYW5kIGZpZWxkMiA9ID8gKSAKCQkkc3FsZmllbGRzbmFtZSA9ICcgKCAnIC4gaW1wbG9kZSgiIEFORCAiLCAkc3FsZmllbGRuYW1lKSAuICcgKSAnIDsKCQkkc3FsZmllbGRzbmFtZU9SID0gJyBPUiAnIC4gJHNxbGZpZWxkc25hbWU7CgoJCSRzcWxmaWVsZHMgPSAiIDEgIjsKCQlpZighZW1wdHkoJGVudGl0eXMpKXsKCQkJJHNxbGZpZWxkcyA9ICRzcWxmaWVsZHNuYW1lIC4gc3RyX3JlcGVhdCgkc3FsZmllbGRzbmFtZU9SLCBjb3VudCgkZW50aXR5cyktMSk7CQoJCX0gCgoJCSRxdWVyeUFkZCA9ICdTRUxFQ1QgKiBGUk9NICcgLiAkZW50aXR5QXNzb2MtPmdldERibmFtZSgpIC4gJyBXSEVSRSAnIC4gJHNxbGZpZWxkczsKCQkkcXVlcnlQYXJhbXMgPSBhcnJheSgpOwoJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCgoJCQlmb3JlYWNoICgkYXNzb2NGaWVsZHNOYW1lIGFzICRmaWVsZG5hbWUpIHsKCgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGRuYW1lKTsKCQkJfQoJCQkKCQl9CgkJCQkJCgkJLy8gT3JkZXIgQnkgCgkJaWYoJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpICE9IG51bGwpIHsKCQkJJHF1ZXJ5QWRkIC49ICRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKS0+Z2V0T3JkZXJCeSgpOwoJCX0KCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCgkJd2hpbGUgKCRyb3dBc3NvY2lhdGUgPSAkcmVzdWx0LT5GZXRjaFJvdygpKSB7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkYWxyZWFkeVByZXNlbnQgPSBudWxsOwoJCQkJJGlzbWF0Y2ggPSB0cnVlOwoJCQkJZm9yICggJGkgPSAwIDsgJGkgPCAkY291bnRGaWVsZHM7ICRpKyspewoKCQkJCQlpZigkZW50aXR5LT5nZXQoJHNxbGZpZWxkdmFsdWVbJGldKSAhPT0gJHJvd0Fzc29jaWF0ZVskYXNzb2NGaWVsZHNOYW1lWyRpXV0pewoJCQkJCQkkaXNtYXRjaCA9IGZhbHNlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlpZigkaXNtYXRjaCl7CgkJCQkJLy8gQXQgdGhpcyBwb2ludCB3ZSBmb3VuZCBhIHJlc3VsdCBmb3IgdGhlIGN1cnJlbnQgZW50aXR5LgoJCQkJCS8vIFdlIG11c3QgYWRkIHRoaXMgcmVzdWx0IGludG8gdGhlICRmaWVsZCAKCgkJCQkJJG5ld09iamVjdCA9IE9ybUNvcmU6OnJvd1RvRW50aXR5IChuZXcgJGVudGl0eUFzc29jTmFtZSgpLCAkcm93QXNzb2NpYXRlKTsKCQkJCQkkZW50aXR5LT5zZXQoJGFuQWxpYXMsICRuZXdPYmplY3QpOwoKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRlbnRpdHlzOwoJfQoKCS8qKgoJICogV2lsbCBmb3VuZCBhbGwgdGhlIGVudGl0eXMgYXZhaWxhYmxlIGZvciB0aGUgZmllbGQgQUsgb2YgcGFyYW1ldGVyICRlbnRpdHlQYXJhbS4KCSAqIAogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkgKiBAcGFyYW0gT3JtRW50aXR5W10gJGVudGl0eXMgYXJyYXkgbGlzdCBvZiBPYmplY3QgT3JtRW50aXR5CgkgKiBAcGFyYW0gT3JtRmllbGQgJGZpZWxkIHRoZSBBSyBmaWVsZCB0byBwb3B1bGF0ZQoJICogCgkgKiBAcmV0dXJuIE9ybUVudGl0eVtdIGxpc3Qgb2YgT2JqZWN0IE9ybUVudGl0eSB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkIEFLIHBvcHVsYXRlZCBieSB0aGUgb3RoZXIgT3JtRW50aXR5IGZvdW5kZWQKCSAqIAoJICogQHNpbmNlIDAuMy4wCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHBvcHVsYXRlQUtGaWVsZChPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkZW50aXR5cywgT3JtRmllbGQgJGZpZWxkKXsKCgkJaWYoISRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZ1bmN0aW9uIHBvcHVsYXRlQUtGaWVsZChcJGVudGl0eVBhcmFtLCBcJGVudGl0eXMsIFwkZmllbGQpIG9ubHkgYWNjZXB0IGZpZWxkcyBvZiB0eXBlIEFzc29jaWF0ZUtleSIpOwoJCX0KCQkkZW50aXR5bmFtZSA9ICRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpOwoJCSRmaWVsZEFzc29jaWF0ZU5hbWUgPSBudWxsOwoJCWlmKHN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJbGlzdCgkZW50aXR5QXNzb2NOYW1lLCAkZmllbGRBc3NvY2lhdGVOYW1lKSA9IGV4cGxvZGUoIi4iLCAkZmllbGQtPmdldEtFWU5hbWUoKSk7CgkJCSRlbnRpdHlBc3NvYyA9IG5ldyAkZW50aXR5QXNzb2NOYW1lKCk7CgkJCQoKCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGVudGl0eUFzc29jLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0S0VZTmFtZSgpKTsKCQkJCQkKCQkJLy9UaGUgcGF0aCBtdXN0IHJldHVybiB0byB0aGUgY3VycmVudCBlbnRpdHkKCQkJaWYoc3RyY2FzZWNtcCgkZW50aXR5Q3VycmVudE5hbWUsJGVudGl0eW5hbWUpICE9IDApewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJJdCBzZWVtcyB5b3UgaGF2ZSBhIHdyb25nIHBhdGggYmV0d2VlbiB7JGVudGl0eW5hbWV9LnskZmllbGQtPmdldE5hbWUoKX0gYW5kIHskZW50aXR5QXNzb2NOYW1lfS57JGZpZWxkQXNzb2NpYXRlTmFtZX0iKTsKCQkJfQoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkkc3FsZmllbGR2YWx1ZVtdID0gJGZpZWxkQ3VycmVudE5hbWU7CgkJCSRhc3NvY0ZpZWxkc05hbWVbXSA9ICRmaWVsZEFzc29jaWF0ZU5hbWU7CgkJCSRzcWxmaWVsZG5hbWVbXSA9ICIgeyRmaWVsZEFzc29jaWF0ZU5hbWV9ID0gPyAiOwoKCQkJCgoJCS8vIFdlIGhhdmUgYW4gQUsgd2l0aCAyL21vcmUgRksgKGFsc28gd2UgYXJlIGFuIGVudGl0eSB3aXRoIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSkJCgkJfSBlbHNlIHsKCQkJJGVudGl0eUFzc29jTmFtZSA9ICRmaWVsZC0+Z2V0S0VZTmFtZSgpOwoJCQkkZW50aXR5QXNzb2MgPSBuZXcgJGVudGl0eUFzc29jTmFtZSgpOwoKCQkJLy9Jbml0aWF0ZSB0aGUgZmllbGQgYXNzb2NpYXRlIHdpdGggYW4gZW1wdHkgYXJyYXkuCgkJCSRlbnRpdHlzS2V5cyA9IGFycmF5KCk7CgkJCWZvcmVhY2goJGVudGl0eXMgYXMgJGVudGl0eSl7CgkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksIGFycmF5KCkpOwoJCQl9CgoJCQkvL1RPRE8gOiByZW1lbWJlcmluZyB0aGlzIHBhcnQgaW4gbWVtb3J5IHRvIGF2b2lkIHRyaXBsZSByZXNlYWNoCgkJCSRzcWxmaWVsZG5hbWUgPSBhcnJheSgpOwoJCQkkc3FsZmllbGR2YWx1ZSA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRlbnRpdHlBc3NvYy0+Z2V0RmllbGRzKCkgYXMgJGFzc29jRmllbGQpIHsKCgkJCQkvLyBXZSBkb24ndCB3YW50IGFub3RoZXIgd2VpcmQgRksgb24gYW4gZW50aXJlIGVudGl0eQoJCQkJaWYoJGFzc29jRmllbGQtPmlzRm9yZWlnbktleSgpICYmIHN0cnBvcygkYXNzb2NGaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQkJCQoJCQkJCWxpc3QoJGVudGl0eUN1cnJlbnROYW1lLCAkZmllbGRDdXJyZW50TmFtZSkgPSBleHBsb2RlKCIuIiwgJGFzc29jRmllbGQtPmdldEtFWU5hbWUoKSk7CgoJCQkJCS8vIElmIHRoaXMgRksgcG9pbnQgYmFjayBvbiB1cwoJCQkJCWlmKHN0cmNhc2VjbXAoJGVudGl0eUN1cnJlbnROYW1lLCRlbnRpdHluYW1lKSA9PT0gMCl7CgkJCQkJCSRzcWxmaWVsZHZhbHVlW10gPSAkZmllbGRDdXJyZW50TmFtZTsKCQkJCQkJJGFzc29jRmllbGRzTmFtZVtdID0gJGFzc29jRmllbGQtPmdldE5hbWUoKTsKCQkJCQkJJHNxbGZpZWxkbmFtZVtdID0gIiB7JGFzc29jRmllbGQtPmdldE5hbWUoKX0gPSA/ICI7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gKCBmaWVsZDEgPSA/IGFuZCBmaWVsZDIgPSA/ICkgCgkJJHNxbGZpZWxkc25hbWUgPSAnICggJyAuIGltcGxvZGUoIiBBTkQgIiwgJHNxbGZpZWxkbmFtZSkgLiAnICkgJyA7CgkJJHNxbGZpZWxkc25hbWVPUiA9ICcgT1IgJyAuICRzcWxmaWVsZHNuYW1lOwoKCQkkc3FsZmllbGRzID0gIiAxICI7CgkJaWYoIWVtcHR5KCRlbnRpdHlzKSl7CgkJCSRzcWxmaWVsZHMgPSAkc3FsZmllbGRzbmFtZSAuIHN0cl9yZXBlYXQoJHNxbGZpZWxkc25hbWVPUiwgY291bnQoJGVudGl0eXMpLTEpOwkKCQl9IAoKCQkkcXVlcnlBZGQgPSAnU0VMRUNUICogRlJPTSAnIC4gJGVudGl0eUFzc29jLT5nZXREYm5hbWUoKSAuICcgV0hFUkUgJyAuICRzcWxmaWVsZHM7CgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQlmb3JlYWNoICgkc3FsZmllbGR2YWx1ZSBhcyAkZmllbGRuYW1lKSB7CgkJCQkkcXVlcnlQYXJhbXNbXSA9ICRlbnRpdHktPmdldCgkZmllbGRuYW1lKTsKCQkJfQoJCQkKCQl9CgkJCQkJCgkJLy8gT3JkZXIgQnkgCgkJaWYoJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpICE9IG51bGwpIHsKCQkJJHF1ZXJ5QWRkIC49ICRlbnRpdHlBc3NvYy0+Z2V0RGVmYXVsdE9yZGVyQnkoKS0+Z2V0T3JkZXJCeSgpOwoJCX0KCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCSRxdWVyeVBhcmFtcywKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkc3FsZmllbGR2YWx1ZVskaV0pICE9PSAkcm93QXNzb2NpYXRlWyRhc3NvY0ZpZWxkc05hbWVbJGldXSl7CgkJCQkJCSRpc21hdGNoID0gZmFsc2U7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCRpc21hdGNoKXsKCQkJCQkvLyBBdCB0aGlzIHBvaW50IHdlIGZvdW5kIGEgcmVzdWx0IGZvciB0aGUgY3VycmVudCBlbnRpdHkuCgkJCQkJLy8gV2UgbXVzdCBhZGQgdGhpcyByZXN1bHQgaW50byB0aGUgJGZpZWxkIAoJCQkJCSRhbHJlYWR5UHJlc2VudCA9ICRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSk7CgkJCQkJJGFscmVhZHlQcmVzZW50W10gPSBPcm1Db3JlOjpyb3dUb0VudGl0eSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSwgJHJvd0Fzc29jaWF0ZSk7CgoJCQkJCSRlbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSwgJGFscmVhZHlQcmVzZW50KTsKCgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRlbnRpdHlzOwoJfQoKCgkvKioKCSAqIFdpbGwgZm91bmQgYWxsIHRoZSBlbnRpdHlzIGF2YWlsYWJsZSBmb3IgdGhlIGZpZWxkIEZLIG9mIHBhcmFtZXRlciAkZW50aXR5UGFyYW0uCgkgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIAoJICogQHBhcmFtIE9ybUVudGl0eVtdICRlbnRpdHlzIGFycmF5IGxpc3Qgb2YgT2JqZWN0IE9ybUVudGl0eQoJICogQHBhcmFtIE9ybUZpZWxkICRmaWVsZCB0aGUgRksgZmllbGQgdG8gcG9wdWxhdGUKCSAqIAoJICogQHJldHVybiBPcm1FbnRpdHlbXSBsaXN0IG9mIE9iamVjdCBPcm1FbnRpdHkgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZCBGSyBwb3B1bGF0ZWQgYnkgdGhlIG90aGVyIE9ybUVudGl0eSBmb3VuZGVkCgkgKiAKCSAqIEBzaW5jZSAwLjMuMAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwb3B1bGF0ZUZLRmllbGQoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJGVudGl0eXMsIE9ybUZpZWxkICRmaWVsZCl7CgoJCWlmKCEkZmllbGQtPmlzRm9yZWlnbktFWSgpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gcG9wdWxhdGVGS0ZpZWxkKFwkZW50aXR5UGFyYW0sIFwkZW50aXR5cywgXCRmaWVsZCkgb25seSBhY2NlcHQgZmllbGRzIG9mIHR5cGUgRm9yZWlnbktleSIpOwoJCX0KCgkJaWYoIXN0cnBvcygkZmllbGQtPmdldEtFWU5hbWUoKSwiLiIpKXsKCQkJcmV0dXJuICRlbnRpdHlzOwoJCX0KCgkJaWYoc3RycG9zKCRmaWVsZC0+Z2V0S0VZTmFtZSgpLCIuIikpewoJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRmaWVsZC0+Z2V0S0VZTmFtZSgpKTsKCQkJJGVudGl0eUFzc29jID0gbmV3ICRlbnRpdHlBc3NvY05hbWUoKTsKCQkJJHNxbGZpZWxkdmFsdWUgPSBhcnJheSgpOwoKCQkJJHNxbGZpZWxkdmFsdWVbXSA9ICRmaWVsZC0+Z2V0TmFtZSgpOwoJCQkkYXNzb2NGaWVsZHNOYW1lW10gPSAkZmllbGRBc3NvY2lhdGVOYW1lOwoJCQkkc3FsZmllbGRuYW1lW10gPSAiIHskZmllbGRBc3NvY2lhdGVOYW1lfSA9ID8gIjsKCgkJfQoKCQkvLyAoIGZpZWxkMSA9ID8gYW5kIGZpZWxkMiA9ID8gKSAKCQkkc3FsZmllbGRzbmFtZSA9ICcgKCAnIC4gaW1wbG9kZSgiIEFORCAiLCAkc3FsZmllbGRuYW1lKSAuICcgKSAnIDsKCQkkc3FsZmllbGRzbmFtZU9SID0gJyBPUiAnIC4gJHNxbGZpZWxkc25hbWU7CgkJCgkJJHF1ZXJ5UGFyYW1zID0gYXJyYXkoKTsKCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRlbnRpdHkpewoJCQkJLy9XZSBldmljdCBzYW1lIHZhbHVlcyB0byBhdm9pZCBidWcgIzg4CgkJCQkkcXVlcnlQYXJhbXNbJGVudGl0eS0+Z2V0KCRmaWVsZC0+Z2V0TmFtZSgpKV0gPSAkZW50aXR5LT5nZXQoJGZpZWxkLT5nZXROYW1lKCkpOwoJCQkKCQl9CgoJCS8vV2UgcmVwZWF0IFNRTCBmb3IgZWFjaCBESUZGRVJFTlQgdmFsdWUgZm9yIHRoZSBGSyB0byBhdm9pZCBidWcgIzg4CgkJJHNxbGZpZWxkcyA9ICIgMSAiOwoJCWlmKCFlbXB0eSgkZW50aXR5cykpewoJCQkkc3FsZmllbGRzID0gJHNxbGZpZWxkc25hbWUgLiBzdHJfcmVwZWF0KCRzcWxmaWVsZHNuYW1lT1IsIGNvdW50KCRxdWVyeVBhcmFtcyktMSk7CQoJCX0gCgoJCSRxdWVyeUFkZCA9ICdTRUxFQ1QgKiBGUk9NICcgLiAkZW50aXR5QXNzb2MtPmdldERibmFtZSgpIC4gJyBXSEVSRSAnIC4gJHNxbGZpZWxkczsKCQkJCQkKCQkvLyBPcmRlciBCeSAKCQlpZigkZW50aXR5QXNzb2MtPmdldERlZmF1bHRPcmRlckJ5KCkgIT0gbnVsbCkgewoJCQkkcXVlcnlBZGQgLj0gJGVudGl0eUFzc29jLT5nZXREZWZhdWx0T3JkZXJCeSgpLT5nZXRPcmRlckJ5KCk7CgkJfQoKCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJHF1ZXJ5QWRkLAoJCQkJCQkJCWFycmF5X2tleXMoJHF1ZXJ5UGFyYW1zKSwKCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIHJlcXVlc3QgdG8gZ2V0IGFzc29jaWF0aXZlIGVudGl0eSAkZW50aXR5QXNzb2NOYW1lIik7CgkJCgkJJGNvdW50RmllbGRzID0gY291bnQoJHNxbGZpZWxkdmFsdWUpOwoKCQl3aGlsZSAoJHJvd0Fzc29jaWF0ZSA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJZm9yZWFjaCgkZW50aXR5cyBhcyAkZW50aXR5KXsKCQkJCSRhbHJlYWR5UHJlc2VudCA9IG51bGw7CgkJCQkkaXNtYXRjaCA9IHRydWU7CgkJCQlmb3IgKCAkaSA9IDAgOyAkaSA8ICRjb3VudEZpZWxkczsgJGkrKyl7CgoJCQkJCWlmKCRlbnRpdHktPmdldCgkZmllbGQtPmdldE5hbWUoKSkgIT09ICRyb3dBc3NvY2lhdGVbJGFzc29jRmllbGRzTmFtZVskaV1dKXsKCQkJCQkJJGlzbWF0Y2ggPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYoJGlzbWF0Y2gpewoJCQkJCS8vIEF0IHRoaXMgcG9pbnQgd2UgZm91bmQgYSByZXN1bHQgZm9yIHRoZSBjdXJyZW50IGVudGl0eS4KCQkJCQkvLyBXZSBtdXN0IGFkZCB0aGlzIHJlc3VsdCBpbnRvIHRoZSAkZmllbGQgCgkJCQkJCgkJCQkJJG5ld09iamVjdCA9IE9ybUNvcmU6OnJvd1RvRW50aXR5IChuZXcgJGVudGl0eUFzc29jTmFtZSgpLCAkcm93QXNzb2NpYXRlKTsKCQkJCQkkZW50aXR5LT5zZXQoJGZpZWxkLT5nZXROYW1lKCksICRuZXdPYmplY3QpOwoKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuICRlbnRpdHlzOwoJfQogIAoJLyoqCgkqIFJldHVybiBhIE9ybUVudGl0eSBmcm9tIGl0cyBJZAoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZCAkaWQgdGhlIElkIHRvIGZpbmQKCSoKCSogQHJldHVybiBPcm1FbnRpdHkgdGhlIE9ybUVudGl0eSBmb3VuZCBvciBOVUxMCgkqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQnlJZChPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkaWQpIHsKCQkkbGlzdGUgPSBPcm1Db3JlOjpmaW5kQnlJZHMoJGVudGl0eVBhcmFtLCBhcnJheSgkaWQpKTsKCQkKCQlpZighaXNzZXQoJGxpc3RlWzBdKSl7CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlyZXR1cm4gJGxpc3RlWzBdOwoJfQogIAoJLyoqCgkqIFJldHVybiBFbnRpdGllcyBmcm9tIHRoZWlyIElkcwoJKiAKCSogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZFtdICRpZHMgYXJyYXkgbGlzdCBvZiB0aGUgSWRzIHRvIGZpbmQKCSogQHBhcmFtIE9ybU9yZGVyQnkgJG9yZGVyQnkgdGhlIG9yZGVyYnkgb2JqZWN0IGlmIG5lY2Vzc2FyeQoJKgoJKiBAcmV0dXJuIE9ybUVudGl0eVtdIGxpc3Qgb2YgRW50aXRpZXMgZm91bmQKCSovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGZpbmRCeUlkcyhPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCAkaWRzLCBPcm1PcmRlckJ5ICRvcmRlckJ5PW51bGwpIHsKCQlpZihjb3VudCgkaWRzKSA9PSAwKQoJCQlyZXR1cm4gYXJyYXkoKTsKCgkJaWYoJGVudGl0eVBhcmFtLT5oYXNDb21wb3NpdGVLZXkoKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlZCBmdW5jdGlvbiBmaW5kQnlJZC9maW5kQnlJZHMgb24gRW50aXR5IHdpdGggYSBjb21wb3VuZCBrZXkuIFlvdSBzaG91bGQgdHJ5IGZpbmRCeUV4YW1wbGUgZnVuY3Rpb25zJyk7CgkJfQoJCQoJCWZvcmVhY2ggKCRlbnRpdHlQYXJhbS0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwaykgewoJCQkkZXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CgkJCSRleGFtcGxlLT5hZGRDcml0ZXJpYSgkcGtuYW1lLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgJGlkcyk7CgkJCXJldHVybiBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRlbnRpdHlQYXJhbSwgJGV4YW1wbGUsICRvcmRlckJ5KTsKCQl9CgoKCX0KICAKICAgIC8qKgogICAgICogQWxsb3cgc2VhcmNoIGEgbGlzdCBvZiBPcm1FbnRpdHkgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGZpbmQgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpmaW5kQnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IGZpbmQgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBPcm1PcmRlckJ5ICRvcmRlckJ5IHRoZSBvcmRlciBpZiBuZWNlc3NhcnkKICAgICAqIEBwYXJhbSBPcm1MaW1pdCAkbGltaXQgdGhlIGxpbWl0IGlmIG5lY2Vzc2FyeQogICAgICogQHBhcmFtIHN0cmluZyAkY29uZGl0aW9uIGxldCB1c2VyIGRlZmluZSBpZiB0aGUgbXVsdGlwbGUgY29uZGl0aW9ucyBtdXN0IG9mIHR5cGUgQU5EIG9yIE9SCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkbGF6eW1vZGUgc2V0IHRvIFRSVUUgdG8gYXZvaWQgbG9hZGluZyBjaGlsZCBvYmplY3QuIERlZmF1bHQgOiBGQUxTRQogICAgICogCiAgICAgKiBAc2VlIE9ybUV4YW1wbGUKICAgICAqIEBzZWUgT3JtVHlwZUNyaXRlcmlhCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCBPcm1PcmRlckJ5ICRvcmRlckJ5ID0gbnVsbCwgT3JtTGltaXQgJGxpbWl0ID0gbnVsbCwgJGNvbmRpdGlvbiA9ICdBTkQnLCAkbGF6eW1vZGUgPSBmYWxzZSkgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7CgkJJHNlbGVjdCA9ICJTRUxFQ1QgKiBGUk9NICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFICc7CgkJCgkJbGlzdCgkaHFsLCAkcGFyYW1zKSA9IE9ybUNvcmU6Ol9nZXRIcWxFeGFtcGxlKCRsaXN0ZUZpZWxkLCAkY3JpdGVyaWFzLCAkY29uZGl0aW9uKTsKCgkJLy8gT3JkZXIgQnkKCQlpZigkb3JkZXJCeSAhPSBudWxsKSB7CgkJCQkkaHFsIC49ICRvcmRlckJ5LT5nZXRPcmRlckJ5KCk7CgkJfQoJCWVsc2UgaWYoJGVudGl0eVBhcmFtLT5nZXREZWZhdWx0T3JkZXJCeSgpICE9IG51bGwpIHsKCQkJCSRocWwgLj0gJGVudGl0eVBhcmFtLT5nZXREZWZhdWx0T3JkZXJCeSgpLT5nZXRPcmRlckJ5KCk7CgkJfSAgICAgICAgICAgICAgICAKCQkKCQlpZigkbGltaXQgIT0gbnVsbCkgewoJCQkJJGhxbCAuPSAkbGltaXQtPmdldExpbWl0KCk7CgkJfQoKCQkkcXVlcnlFeGFtcGxlID0gJHNlbGVjdC4kaHFsOwoJCQoJCS8vSWYgaXQncyBhbHJlYWR5IGluIHRoZSBjYWNoZSwgd2UgcmV0dXJuIHRoZSByZXN1bHQKCQlpZihPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+aXNDYWNoZSgkcXVlcnlFeGFtcGxlLCAkcGFyYW1zKSkgewoKCQkJCSRlbnRpdGllcyA9IE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5nZXRDYWNoZSgkcXVlcnlFeGFtcGxlLCRwYXJhbXMpOwoKCQl9IGVsc2UgewoJCQkJLy9FeGVjdXRpb24KCQkJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlFeGFtcGxlLAoJCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6ZmluZEJ5RXhhbXBsZShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0sIE9ybUV4YW1wbGUgXCRleGFtcGxlKSIpOwoKCQkJCU9ybVRyYWNlOjpkZWJ1ZygiZmluZEJ5RXhhbXBsZSA6ICIuJHJlc3VsdC0+UmVjb3JkQ291bnQoKS4iIHJlc3VsdGF0KHMpIik7CgoJCQkJJGVudGl0aWVzID0gYXJyYXkoKTsKCQkJCXdoaWxlICgkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewoJCQkJICAkZW50aXRpZXNbXSA9IE9ybUNvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHlQYXJhbSwgJHJvdyk7CgkJCQl9CgoJCQkJaWYoISRsYXp5bW9kZSl7CgkJCQkJJGVudGl0aWVzID0gT3JtQ29yZTo6cG9wdWxhdGVGaWVsZHMoJGVudGl0eVBhcmFtLCAkZW50aXRpZXMpOwoJCQkJfQoJCQkJCgkJCQkvL1dlIHB1c2ggdGhlIHJlc3VsdCBpbnRvIHRoZSBjYWNoZSBiZWZvcmUgcmV0dXJuIGl0CgkJCQlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+c2V0Q2FjaGUoJHF1ZXJ5RXhhbXBsZSwgbnVsbCwgJGVudGl0aWVzKTsKCQl9CgkJcmV0dXJuIGFycmF5X3ZhbHVlcygkZW50aXRpZXMpOwoKCX0KCgkvKioKICAgICAqIEFsbG93IGNvdW50aW5nIGEgbGlzdCBvZiBPcm1FbnRpdHkgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGNvdW50aW5nIHRoZSBjdXN0b21lcnMgd2l0aCBsYXN0TmFtZSAnUm9nZXInIChubyBjYXNzZSBzZW5zaXRpdmUpCiAgICAgKiAKICAgICAqICA8Y29kZT4KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgICogCiAgICAgKiAgICAgICAkZXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CiAgICAgKiAgICAgICAkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJ2xhc3ROYW1lJywgT3JtVHlwZUNyaXRlcmlhOjokRVEsIGFycmF5KCdyb2dlcicpLCB0cnVlKTsKICAgICAqIAogICAgICogICAgICAgT3JtQ29yZTo6c2VsZWN0Q291bnRCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqICBFeGFtcGxlIDogY291bnRpbmcgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnNlbGVjdENvdW50QnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiBOT1RFIDogRVEgPT4gPGI+RVE8L2I+dWFscywgR1RFID0+IDxiPkc8L2I+cmVhdGVyIDxiPlQ8L2I+aGFuIG9yIDxiPkU8L2I+cXVhbHMKICAgICAqIAogICAgICogTk9URSAyIDogeW91IGNhbiBhZGQgYXMgbWFueSBDcml0ZXJpYXMgYXMgeW91IHdhbnQgaW4gYW4gRXhhbXBsZSBPYmplY3QKICAgICAqIAogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIE9ybUV4YW1wbGUgJGV4YW1wbGUgdGhlIE9iamVjdCBPcm1FeGFtcGxlIHdpdGggc29tZSBDcml0ZXJpYXMgaW5zaWRlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNlbGVjdENvdW50QnlFeGFtcGxlKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sIE9ybUV4YW1wbGUgJGV4YW1wbGUsICRjb25kaXRpb24gPSAnQU5EJykgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7CgkJJHNlbGVjdCA9ICJTRUxFQ1QgY291bnQoKikgYXMgdmFsIEZST00gIi4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJzsKCQkKCQlsaXN0KCRocWwsICRwYXJhbXMpID0gT3JtQ29yZTo6X2dldEhxbEV4YW1wbGUoJGxpc3RlRmllbGQsICRjcml0ZXJpYXMsICRjb25kaXRpb24pOwoKCQkkcXVlcnlFeGFtcGxlID0gJHNlbGVjdC4kaHFsOwoJCQoJCS8vSWYgaXQncyBhbHJlYWR5IGluIHRoZSBjYWNoZSwgd2UgcmV0dXJuIHRoZSByZXN1bHQKCQlpZihPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+aXNDYWNoZSgkcXVlcnlFeGFtcGxlLCAkcGFyYW1zKSkgewoKCQkJCSRjb3VudGVyID0gT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmdldENhY2hlKCRxdWVyeUV4YW1wbGUsJHBhcmFtcyk7CgoJCX0gZWxzZSB7CgkJCQkvL0V4ZWN1dGlvbgoJCQkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUV4YW1wbGUsCgkJCQkJCQkJCQkkcGFyYW1zLAoJCQkJCQkJCQkJIkRhdGFiYXNlIGVycm9yIGR1cmluZyBPcm1Db3JlOjpjb3VudEJ5RXhhbXBsZShPcm1FbnRpdHkgJnskZW50aXR5UGFyYW0tPmdldE5hbWUoKX0sIE9ybUV4YW1wbGUgXCRleGFtcGxlKSIpOwoKCQkJCU9ybVRyYWNlOjpkZWJ1ZygiY291bnRCeUV4YW1wbGUgOiAiLiRyZXN1bHQtPlJlY29yZENvdW50KCkuIiByZXN1bHRhdChzKSIpOwoKCQkJCSRjb3VudGVyID0gYXJyYXkoKTsKCQkJCXdoaWxlICgkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkgewoJCQkJICAkY291bnRlciA9ICRyb3dbJ3ZhbCddOwoJCQkJfQoKCQkJCS8vV2UgcHVzaCB0aGUgcmVzdWx0IGludG8gdGhlIGNhY2hlIGJlZm9yZSByZXR1cm4gaXQKCQkJCU9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5zZXRDYWNoZSgkcXVlcnlFeGFtcGxlLCBudWxsLCAkY291bnRlcik7CgkJfQoJCXJldHVybiAkY291bnRlcjsKCgl9CgoJLyoqCiAgICAgKiBSZXR1cm4gbWF4IHZhbHVlIG9mIGEgZmllbGQgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IG1heCBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpzZWxlY3RNYXhCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSwgJ2FnZScpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IG1heCBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnNlbGVjdE1heEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlLCAnYWdlJyk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkbmFtZSB0aGUgZmllbGQgdG8gYXBwbHkgdGhlICJNYXgiIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNlbGVjdE1heEJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCAkZmllbGROYW1lLCAkY29uZGl0aW9uID0gJ0FORCcpIHsKCQkKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJGxpc3RlRmllbGQpKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBmaWVsZG5hbWUgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgZm9yIGVudGl0eSB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9Iik7CgkJfQoKCQkkc29tZXRoaW5nID0gIk1BWCh7JGZpZWxkTmFtZX0pIjsKCgkJcmV0dXJuIE9ybUNvcmU6Ol9zZWxlY3RTb21ldGhpbmdCeUV4YW1wbGUoJGVudGl0eVBhcmFtLCAkZXhhbXBsZSwgJHNvbWV0aGluZywgJGNvbmRpdGlvbik7Cgl9CgoJLyoqCiAgICAgKiBSZXR1cm4gbWluIHZhbHVlIG9mIGEgZmllbGQgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IG1pbiBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpzZWxlY3RNYXhCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSwgJ2FnZScpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IG1pbiBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnNlbGVjdE1heEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlLCAnYWdlJyk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkbmFtZSB0aGUgZmllbGQgdG8gYXBwbHkgdGhlICJNYXgiIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNlbGVjdE1pbkJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCAkZmllbGROYW1lLCAkY29uZGl0aW9uID0gJ0FORCcpIHsKCQkKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJGxpc3RlRmllbGQpKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBmaWVsZG5hbWUgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgZm9yIGVudGl0eSB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9Iik7CgkJfQoKCQkkc29tZXRoaW5nID0gIk1JTih7JGZpZWxkTmFtZX0pIjsKCgkJcmV0dXJuIE9ybUNvcmU6Ol9zZWxlY3RTb21ldGhpbmdCeUV4YW1wbGUoJGVudGl0eVBhcmFtLCAkZXhhbXBsZSwgJHNvbWV0aGluZywgJGNvbmRpdGlvbik7Cgl9CgoJLyoqCiAgICAgKiBSZXR1cm4gYXZnIHZhbHVlIG9mIGEgZmllbGQgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGF2ZyBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpzZWxlY3RNYXhCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSwgJ2FnZScpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IGF2ZyBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnNlbGVjdE1heEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlLCAnYWdlJyk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkbmFtZSB0aGUgZmllbGQgdG8gYXBwbHkgdGhlICJNYXgiIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNlbGVjdEF2Z0J5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCAkZmllbGROYW1lLCAkY29uZGl0aW9uID0gJ0FORCcpIHsKCQkKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJGxpc3RlRmllbGQpKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBmaWVsZG5hbWUgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgZm9yIGVudGl0eSB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9Iik7CgkJfQoKCQkkc29tZXRoaW5nID0gIkFWRyh7JGZpZWxkTmFtZX0pIjsKCgkJcmV0dXJuIE9ybUNvcmU6Ol9zZWxlY3RTb21ldGhpbmdCeUV4YW1wbGUoJGVudGl0eVBhcmFtLCAkZXhhbXBsZSwgJHNvbWV0aGluZywgJGNvbmRpdGlvbik7Cgl9CgoJLyoqCiAgICAgKiBSZXR1cm4gc3VtIHZhbHVlIG9mIGEgZmllbGQgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IHN1bSBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkKICAgICAqIAogICAgICogIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOwogICAgICogCiAgICAgKiAgICAgICBPcm1Db3JlOjpzZWxlY3RNYXhCeUV4YW1wbGUoJGN1c3RvbWVyLCAkZXhhbXBsZSwgJ2FnZScpOwogICAgICogPC9jb2RlPgogICAgICogCiAgICAgKiAgRXhhbXBsZSA6IHN1bSBhZ2Ugb2YgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OnNlbGVjdE1heEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlLCAnYWdlJyk7CiAgICAgKiA8L2NvZGU+CiAgICAgKiAKICAgICAqIE5PVEUgOiBFUSA9PiA8Yj5FUTwvYj51YWxzLCBHVEUgPT4gPGI+RzwvYj5yZWF0ZXIgPGI+VDwvYj5oYW4gb3IgPGI+RTwvYj5xdWFscwogICAgICogCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdAogICAgICogCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gT3JtRXhhbXBsZSAkZXhhbXBsZSB0aGUgT2JqZWN0IE9ybUV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkbmFtZSB0aGUgZmllbGQgdG8gYXBwbHkgdGhlICJNYXgiIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNlbGVjdFN1bUJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCAkZmllbGROYW1lLCAkY29uZGl0aW9uID0gJ0FORCcpIHsKCQkKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJGxpc3RlRmllbGQpKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBmaWVsZG5hbWUgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgZm9yIGVudGl0eSB7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9Iik7CgkJfQoKCQkkc29tZXRoaW5nID0gIlNVTSh7JGZpZWxkTmFtZX0pIjsKCgkJcmV0dXJuIE9ybUNvcmU6Ol9zZWxlY3RTb21ldGhpbmdCeUV4YW1wbGUoJGVudGl0eVBhcmFtLCAkZXhhbXBsZSwgJHNvbWV0aGluZywgJGNvbmRpdGlvbik7Cgl9CgoKCgkvKioKCSAqIElubmVyIGZ1bmN0aW9uIHRvIGZhY3Rvcml6ZSBzb21lIFNlbGVjdFhYQnlFeGFtcGxlIDogTWF4L01pbi9BVkcvLi4uCgkgKgogICAgICogQHBhcmFtIE9ybUVudGl0eSAkZW50aXR5UGFyYW0gYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQogICAgICogQHBhcmFtIE9ybUV4YW1wbGUgJGV4YW1wbGUgdGhlIE9iamVjdCBPcm1FeGFtcGxlIHdpdGggc29tZSBDcml0ZXJpYXMgaW5zaWRlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzb21ldGhpbmcgdGhlIFNRTCBwYXJ0IG9mIHRoZSBxdWVyeSA6IG1heCh4eHgpIG1pbih4eHgpIC4uLgogICAgICogQHBhcmFtIHN0cmluZyAkY29uZGl0aW9uIGxldCB1c2VyIGRlZmluZSBpZiB0aGUgbXVsdGlwbGUgY29uZGl0aW9ucyBtdXN0IG9mIHR5cGUgQU5EIG9yIE9SCgkgKgoJICoKCSAqCgkgKiovCglwcml2YXRlIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBfc2VsZWN0U29tZXRoaW5nQnlFeGFtcGxlKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sIE9ybUV4YW1wbGUgJGV4YW1wbGUsICRzb21ldGhpbmcsICRjb25kaXRpb24gPSAnQU5EJykgewoKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7CgkJJHNlbGVjdCA9ICJTRUxFQ1QgeyRzb21ldGhpbmd9IGFzIHZhbCBGUk9NICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKS4nIFdIRVJFICc7CgkJCgkJbGlzdCgkaHFsLCAkcGFyYW1zKSA9IE9ybUNvcmU6Ol9nZXRIcWxFeGFtcGxlKCRsaXN0ZUZpZWxkLCAkY3JpdGVyaWFzLCAkY29uZGl0aW9uKTsKCgkJJHF1ZXJ5RXhhbXBsZSA9ICRzZWxlY3QuJGhxbDsKCQkKCQkvL0lmIGl0J3MgYWxyZWFkeSBpbiB0aGUgY2FjaGUsIHdlIHJldHVybiB0aGUgcmVzdWx0CgkJaWYoT3JtQ2FjaGU6OmdldEluc3RhbmNlKCktPmlzQ2FjaGUoJHF1ZXJ5RXhhbXBsZSwgJHBhcmFtcykpIHsKCgkJCQkkY291bnRlciA9IE9ybUNhY2hlOjpnZXRJbnN0YW5jZSgpLT5nZXRDYWNoZSgkcXVlcnlFeGFtcGxlLCRwYXJhbXMpOwoKCQl9IGVsc2UgewoJCQkJLy9FeGVjdXRpb24KCQkJCSRyZXN1bHQgPSBPcm1EYjo6ZXhlY3V0ZSgkcXVlcnlFeGFtcGxlLAoJCQkJCQkJCQkJJHBhcmFtcywKCQkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6c2VsZWN0Q291bnRCeUV4YW1wbGUoT3JtRW50aXR5ICZ7JGVudGl0eVBhcmFtLT5nZXROYW1lKCl9LCBPcm1FeGFtcGxlIFwkZXhhbXBsZSkiKTsKCgkJCQlPcm1UcmFjZTo6ZGVidWcoInNlbGVjdENvdW50QnlFeGFtcGxlIDogIi4kcmVzdWx0LT5SZWNvcmRDb3VudCgpLiIgcmVzdWx0YXQocykiKTsKCgkJCQkkY291bnRlciA9IGFycmF5KCk7CgkJCQl3aGlsZSAoJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCkpIHsKCQkJCSAgJGNvdW50ZXIgPSAkcm93Wyd2YWwnXTsKCQkJCX0KCgkJCQkvL1dlIHB1c2ggdGhlIHJlc3VsdCBpbnRvIHRoZSBjYWNoZSBiZWZvcmUgcmV0dXJuIGl0CgkJCQlPcm1DYWNoZTo6Z2V0SW5zdGFuY2UoKS0+c2V0Q2FjaGUoJHF1ZXJ5RXhhbXBsZSwgbnVsbCwgJGNvdW50ZXIpOwoJCX0KCQlyZXR1cm4gJGNvdW50ZXI7CgoJfQogICAKCS8qKgogICAgICogQWxsb3cgZGVsZXRlIGEgbGlzdCBvZiBPcm1FbnRpdHkgZnJvbSBhIGxpc3Qgb2YgT3JtQ3JpdGVyaWEKICAgICAqIAogICAgICogRXhhbXBsZSA6IGRlbGV0ZSB0aGUgY3VzdG9tZXJzIHdpdGggbGFzdE5hbWUgJ1JvZ2VyJyAobm8gY2Fzc2Ugc2Vuc2l0aXZlKQogICAgICogCiAgICAgKiAgPGNvZGU+CiAgICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsKICAgICAqIAogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgT3JtRXhhbXBsZSgpOwogICAgICogICAgICAgJGV4YW1wbGUtPmFkZENyaXRlcmlhKCdsYXN0TmFtZScsIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgncm9nZXInKSwgdHJ1ZSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsKICAgICAqIDwvY29kZT4KICAgICAqIAogICAgICogIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwCiAgICAgKiAKICAgICAqIDxjb2RlPgogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7CiAgICAgKiAKICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBPcm1UeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7CiAgICAgKiAKICAgICAqICAgICAgIE9ybUNvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsKICAgICAqIDwvY29kZT4KICAgICAqIAogICAgICogTk9URSA6IEVRID0+IDxiPkVRPC9iPnVhbHMsIEdURSA9PiA8Yj5HPC9iPnJlYXRlciA8Yj5UPC9iPmhhbiBvciA8Yj5FPC9iPnF1YWxzCiAgICAgKiAKICAgICAqIE5PVEUgMiA6IHlvdSBjYW4gYWRkIGFzIG1hbnkgQ3JpdGVyaWFzIGFzIHlvdSB3YW50IGluIGFuIE9ybUV4YW1wbGUgT2JqZWN0CiAgICAgKiAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBPcm1FeGFtcGxlICRleGFtcGxlIHRoZSBPYmplY3QgT3JtRXhhbXBsZSB3aXRoIHNvbWUgQ3JpdGVyaWFzIGluc2lkZQogICAgICogQHBhcmFtICRjb25kaXRpb24gbGV0IHVzZXIgZGVmaW5lIGlmIHRoZSBtdWx0aXBsZSBjb25kaXRpb25zIG11c3Qgb2YgdHlwZSBBTkQgb3IgT1IKICAgICAqIAogICAgICogQHNlZSBPcm1FeGFtcGxlCiAgICAgKiBAc2VlIE9ybVR5cGVDcml0ZXJpYQogICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGRlbGV0ZUJ5RXhhbXBsZShPcm1FbnRpdHkgJGVudGl0eVBhcmFtLCBPcm1FeGFtcGxlICRleGFtcGxlLCAkY29uZGl0aW9uID0gJ0FORCcpIHsKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7CgkJJGRlbGV0ZSA9ICJkZWxldGUgZnJvbSAiLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAnOwoJCQoJCWxpc3QoJGhxbCwgJHBhcmFtcykgPSBPcm1Db3JlOjpfZ2V0SHFsRXhhbXBsZSgkbGlzdGVGaWVsZCwgJGNyaXRlcmlhcywgJGNvbmRpdGlvbik7CgkJCgkJJHF1ZXJ5RXhhbXBsZSA9ICRkZWxldGUuJGhxbDsKCQkJCQkJCQkJCQoJCS8vRXhlY3V0aW9uCgkJJHJlc3VsdCA9IE9ybURiOjpleGVjdXRlKCRxdWVyeUV4YW1wbGUsCgkJCQkJCQkJCSRwYXJhbXMsCgkJCQkJCQkJCSJEYXRhYmFzZSBlcnJvciBkdXJpbmcgT3JtQ29yZTo6ZGVsZXRlQnlFeGFtcGxlKE9ybUVudGl0eSAmeyRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpfSwgLCBPcm1FeGFtcGxlIFwkZXhhbXBsZSkiKTsKCQkgIH0KCQkgIAoJLyoqCgkgKiBJbm5lciBmdW5jdGlvbiB0byBmYWN0b3JpemUgdGhlIGN1c3RydWN0aW9uIG9mIHRoZSBIUUwgZm9yIHRoZSAqYnlFeGFtcGxlIGZ1bmN0aW9ucwoJICogQHBhcmFtIE9ybUZpZWxkW10gJGxpc3RlRmllbGQgdGhlIGxpc3Qgb2YgRmllbGRzCgkgKiBAcGFyYW0gT3JtVHlwZUNyaXRlcmlhW10gJGNyaXRlcmlhcyB0aGUgbGlzdCBvZiBDcml0ZXJpYQogICAgICogQHBhcmFtIHN0cmluZyAkY29uZGl0aW9uIGxldCB1c2VyIGRlZmluZSBpZiB0aGUgbXVsdGlwbGUgY29uZGl0aW9ucyBtdXN0IG9mIHR5cGUgQU5EIG9yIE9SCgkgKgoJICogQHJldHVybiBtaXhlZFtdIGFuIGFycmF5IHVuZGVyIHRoZSBmb3JtYXQgYXJyYXkoJGhxbCwgbWl4ZWRbXSAkcGFyYW1zKQoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX2dldEhxbEV4YW1wbGUoJGxpc3RlRmllbGQsICRjcml0ZXJpYXMsICRjb25kaXRpb24pewoJCQoJCWlmKCAkY29uZGl0aW9uID09ICdBTkQnICl7CgkJCSRocWwgPSAiIDEgIjsKCQl9IGVsc2UgewoJCQkkaHFsID0gIiAwICI7CgkJICB9CgoJCSRwYXJhbXMgPSBhcnJheSgpOwoKCQlmb3JlYWNoKCRjcml0ZXJpYXMgYXMgJGNyaXRlcmlhKSB7CgoJCQlpZigkbGlzdGVGaWVsZFskY3JpdGVyaWEtPmZpZWxkbmFtZV0gPT0gbnVsbCkgewoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmllbGQgJyIuJGNyaXRlcmlhLT5maWVsZG5hbWUuIicgbm90IGRlZmluZWQgaW4gZW50aXR5ICciLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpLiInIHdoaWxlIHlvdSdyZSBzZWFyY2hpbmcgb24gaXQiKTsKCQkJfQoJCSAgJGZpbHRlclR5cGUgPSAkbGlzdGVGaWVsZFskY3JpdGVyaWEtPmZpZWxkbmFtZV0tPmdldFR5cGUoKTsKCQkgIAoJCQkvLzEgcGFyYW1ldGVyCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRORVEgCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEdUIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JEdURSAKCQkJfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTFQgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTFRFIAoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBPcm1UeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokQUZURVIKCQkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTkxJS0UpIHsKCQkJCSR2YWwgPSAkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzBdOwoJCQkJCgkJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHZhbCwgJGZpbHRlclR5cGUpOwoJCQkJJGhxbCAuPSAiIHskY29uZGl0aW9ufSAiLiRjcml0ZXJpYS0+ZmllbGRuYW1lLiRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhLicgPyAnOwoJCQljb250aW51ZTsKCQkgIH0KCQkgIAoJCQkvLzAgcGFyYW1ldGVyCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5VTEwgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTk5VTEwpIHsKCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gIi4kY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYTsKCQkJY29udGludWU7CgkJICB9CgkJICAKCQkJLy8yIHBhcmFtZXRlcnMKCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokQkVUV0VFTikgewoJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXSwgJGZpbHRlclR5cGUpOyAKCQkJJHBhcmFtc1tdID0gT3JtQ29yZTo6X2ZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMV0sICRmaWx0ZXJUeXBlKTsgCgkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICIuJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEuJyA/IEFORCA/JzsKCQkJY29udGludWU7CgkJICB9CgkJCQkKCQkJLy8gTiBwYXJhbWV0ZXJzCgkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JElOIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5JTikgewoJCQkJaWYoaXNfYXJyYXkoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgJiYgY291bnQoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgPiAwKSB7CgoJCQkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICI7CgkJCQkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJyAnLnNwcmludGYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEsIGltcGxvZGUoJywnLCBhcnJheV9maWxsKDAsIGNvdW50KCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEpLCAnPycpKSkuJyAnOwoJCQkJCQlmb3JlYWNoKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEgYXMgJHBhcmFtKSB7CgkJCQkJCQkkcGFyYW1zW10gPSBPcm1Db3JlOjpfZmllbGRUb0RCVmFsdWUoJHBhcmFtLCAkZmlsdGVyVHlwZSk7IAoJCQkJCQl9CgkJCQl9IGVsc2UgaWYoaXNfYXJyYXkoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgJiYgY291bnQoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSkgPT0gMCkgewoJCQkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JElOKXsKCQkJCQkJJGhxbCAuPSAieyRjb25kaXRpb259IGZhbHNlICI7IC8vIG5vIHZhbHVlIHBhc3NlZCwgc28gbm8gcmVzdWx0IHRvIGJlIHJldHVybmVkCgkJCQkJfSBlbHNlIGlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IE9ybVR5cGVDcml0ZXJpYTo6JE5JTil7CgkJCQkJCSRocWwgLj0gInskY29uZGl0aW9ufSB0cnVlICI7IC8vIG5vIHZhbHVlIHBhc3NlZCwgc28gbm8gcmVzdWx0IHRvIGJlIHJldHVybmVkCgkJCQkJfQoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCQkJCQkJCgkJCS8vT3RoZXIgY2FzZXMKCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokRU1QVFkpIHsKCQkJCSRocWwgLj0gIiB7JGNvbmRpdGlvbn0gKCAiLiRjcml0ZXJpYS0+ZmllbGRuYW1lIC4nIGlzIG51bGwgfHwgJyAuICRjcml0ZXJpYS0+ZmllbGRuYW1lIC4gIj0gJycpIjsKCQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gT3JtVHlwZUNyaXRlcmlhOjokTkVNUFRZKSB7CgkJCQkkaHFsIC49ICIgeyRjb25kaXRpb259ICggIi4kY3JpdGVyaWEtPmZpZWxkbmFtZSAuJyBpcyBub3QgbnVsbCAmJiAnIC4gJGNyaXRlcmlhLT5maWVsZG5hbWUgLiAiIT0gJycpIjsKCQkJCQljb250aW51ZTsKCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAKCQkgIAoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgT3JtQ3JpdGVyaWEgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgaXMgbm90IG1hbmFnZSIpOwoJCX0KCQkJCQkJCQkJCQoJCXJldHVybiBhcnJheSgkaHFsLCAkcGFyYW1zKTsKCX0KICAgICAgCiAgICAvKioKICAgICAqIFRyYW5zZm9ybXMgYW4gYXJyYXkgb2YgdmFsdWUgaW50byBhIGVudGlyZSBPcm1FbnRpdHkuIFRoZSBhcnJheSBtdXN0IGZhbGxvdyB0aGlzIHNjaGVtZQogICAgICogCiAgICAgKiBFeGFtcGxlIDoKICAgICAqIAogICAgICogPGNvZGU+CiAgICAgKiAgICAgICAkbXlBcnJheTEgPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4xLCAnbmFtZSc9PidEdXBvbnQnKTsgICAgICAgCiAgICAgKiAgICAgICAkbXlBcnJheTIgPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4yLCAnbmFtZSc9PidEdXJhbmQnLCAnbGFzdE5hbWUnPT4nSm9lJyk7ICAgICAgIAogICAgICogICAKICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOwogICAgICogCiAgICAgKiAgICAgICAkY3VzdG9tZXIxID0gT3JtQ29yZTo6cm93VG9FbnRpdHkoJGN1c3RvbWVyLCAkbXlBcnJheTEpOwogICAgICogICAgICAgJGN1c3RvbWVyMiA9IE9ybUNvcmU6OnJvd1RvRW50aXR5KCRjdXN0b21lciwgJG15QXJyYXkyKTsKICAgICAqIAogICAgICogICAgICAgZWNobyAkY3VzdG9tZXIxLT5nZXQoJ2xhc3ROYW1lJyk7IC8vcmV0dXJuIG51bGwKICAgICAqICAgICAgIGVjaG8gJGN1c3RvbWVyMi0+Z2V0KCdsYXN0TmFtZScpOyAvL3JldHVybiBKb2UKICAgICAqIAogICAgICogPC9jb2RlPgogICAgICogICAgICAgICAKICAgICAqIEBwYXJhbSBPcm1FbnRpdHkgJGVudGl0eVBhcmFtIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBtaXhlZFtdICRyb3cgdGhlIGxpc3Qgd2l0aCB0aGUgZGF0YQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gcm93VG9FbnRpdHkgKE9ybUVudGl0eSAkZW50aXR5UGFyYW0sICRyb3cpIHsKCgkJT3JtVHJhY2U6OmRlYnVnKCJyb3dUb0VudGl0eSA6ICIucHJpbnRfcigkcm93LHRydWUpKTsKCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7CgoJCSRuZXdFbnRpdHkgPSBjbG9uZSAkZW50aXR5UGFyYW07CgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpCgkJewoJCSAgaWYoISRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkKCQkgIHsKCQkJJG5ld0VudGl0eS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLE9ybUNvcmU6Ol9kYlZhbHVlVG9GaWVsZCgkcm93WyRmaWVsZC0+Z2V0TmFtZSgpXSwgJGZpZWxkLT5nZXRUeXBlKCkpKTsKCQkgIH0gCgkJfQoJCXJldHVybiAkbmV3RW50aXR5OyAgCgl9CiAgCiAgICAvKioKICAgICAqIFRyYW5zZm9ybSBhIFBIUCB2YWx1ZSBpbnRvIGEgU1FMIHZhbHVlCiAgICAgKiAKICAgICAqIEBwYXJhbSBtaXhlZCAkZGF0YSB0aGUgUEhQIHZhbHVlCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHR5cGUgdGhlIENBU1QgdmFsdWUKICAgICAqIAogICAgICogQHNlZSBPcm1DQVNUCiAgICAgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIF9maWVsZFRvREJWYWx1ZSgkZGF0YSwgJHR5cGUpIHsKCQlpZihpc19udWxsKCRkYXRhKSl7CgkJCXJldHVybiBudWxsOwoJCX0KCQkKCQlzd2l0Y2goJHR5cGUpIHsKCQkgIGNhc2UgT3JtQ0FTVDo6JFNUUklORyA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JERPVUJMRSA6IHJldHVybiAkZGF0YTsKCQkgIGNhc2UgT3JtQ0FTVDo6JElOVEVHRVIgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokQlVGRkVSIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokVVVJRCA6IHJldHVybiAkZGF0YTsKCQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokREFURSA6IHJldHVybiBzdHJfcmVwbGFjZSgiJyIsICIiLCBjbXNtcygpLT5HZXREYigpLT5EQkRhdGUoJGRhdGEpKTsgICAgICAgCgkJICBjYXNlIE9ybUNBU1Q6OiRUSU1FIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCVGltZVN0YW1wKCRkYXRhKSk7ICAgCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiREQVRFVElNRSA6IHJldHVybiBkYXRlKCJZLW0tZCBIOmk6cyIsJGRhdGEpOyAKCQkgIGNhc2UgT3JtQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOwoJCX0KCX0KICAKICAgIC8qKgogICAgICogVHJhbnNmb3JtIGEgU1FMIHZhbHVlIGludG8gYSBQSFAgdmFsdWUKICAgICAqIAogICAgICogQHBhcmFtIG1peGVkICRkYXRhIHRoZSBTUUwgdmFsdWUgCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHR5cGUgdGhlIENBU1QgdmFsdWUKICAgICAqIAogICAgICogQHNlZSBPcm1DQVNUCiAgICAgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIF9kYlZhbHVlVG9GaWVsZCgkZGF0YSwgJHR5cGUpIHsKCQlzd2l0Y2goJHR5cGUpIHsKCQkgIGNhc2UgT3JtQ0FTVDo6JFNUUklORyA6IHJldHVybiAkZGF0YTsJCSAgCgkJICBjYXNlIE9ybUNBU1Q6OiRET1VCTEUgOiByZXR1cm4gJGRhdGE7CgkJICBjYXNlIE9ybUNBU1Q6OiRJTlRFR0VSIDogcmV0dXJuICRkYXRhOwkJICAKCQkgIGNhc2UgT3JtQ0FTVDo6JE5VTUVSSUMgOiByZXR1cm4gJGRhdGE7CQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokQlVGRkVSIDogcmV0dXJuICRkYXRhOwkJICAJCQoJCSAgY2FzZSBPcm1DQVNUOjokVVVJRCA6IHJldHVybiAkZGF0YTsKCQkgIAoJCSAgY2FzZSBPcm1DQVNUOjokREFURSA6IHJldHVybiBjbXNtcygpLT5HZXREYigpLT5Vbml4RGF0ZSgkZGF0YSk7CgkJICBjYXNlIE9ybUNBU1Q6OiRUSU1FIDogcmV0dXJuICRkYXRhOwoJCSAgY2FzZSBPcm1DQVNUOjokREFURVRJTUUgOiByZXR1cm4gc3RydG90aW1lKCRkYXRhKTsgIAoJCSAgY2FzZSBPcm1DQVNUOjokVFMgOiByZXR1cm4gJGRhdGE7CgoJCX0KCX0KICAKICAgIC8qKgogICAgICogVmVyaWZ5IGluIGFsbCB0eXBlIG9mIGVudGl0aWVzIGlmIGFueW9uZSBzdGlsbCBoYXMgYSBsaW5rIHdpdGggdGhlIE9ybUVudGl0eSBwYXNzZWQgaW4gcGFyYW1ldGVycyAoRm9yZWlnbktFeSBhbmQgQXNzb2NpYXRlS2V5KQogICAgICogCiAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBkZWxldGUqIGZ1bmN0aW9ucyB0byBhdm9pZCBvcnBoYW5zIGRhdGEgaW4gZGF0YWJhc2UKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHlQYXJhbSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gbWl4ZWQgJHNpZCB0aGUgaWQgb2YgdGhlIE9ybUVudGl0eSB0byB2ZXJpZnkKCSAqCgkgKiBAcmV0dXJuIGEgbWVzc2FnZSBpZiBhIGxpbmsgaXMgc3RpbGwgcHJlc2VudC4gbm90aGluZyBpZiB0aGUgaW50ZWdyaXR5IGlzIG9rCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gdmVyaWZJbnRlZ3JpdHkoT3JtRW50aXR5ICRlbnRpdHlQYXJhbSwgJHNpZCkgewoJCSRsaXN0ZUVudGl0eXMgPSBNeUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCkpOwoKCQlmb3JlYWNoKCRsaXN0ZUVudGl0eXMgYXMgJGtleT0+JGFuRW50aXR5KSB7CgkJICBpZigkYW5FbnRpdHkgaW5zdGFuY2VPZiBPcm1FbnRpdHlBc3NvY2lhdGlvbikKCQkJY29udGludWU7CgkJCQoJCSAgZm9yZWFjaCgkYW5FbnRpdHktPmdldEZpZWxkcygpIGFzICRmaWVsZCkgewoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsKCQkJICBjb250aW51ZTsKCQkJfQoKCQkJCgkJCWlmKGlzX2FycmF5KCRmaWVsZC0+Z2V0S0VZTmFtZSgpKSl7CgoJCQl9CgkJCWlmKCRmaWVsZC0+Z2V0S0VZTmFtZSgpICE9IG51bGwpIHsKCQkJICAkdmFscyA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOwoJCQkgIAoJCQkgIGlmKHN0cnRvbG93ZXIgKCR2YWxzWzBdKSA9PSBzdHJ0b2xvd2VyICgkZW50aXR5UGFyYW0tPmdldE5hbWUoKSkpICB7CgkJCQkkT3JtRXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CgkJCQkkT3JtRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJGZpZWxkLT5nZXROYW1lKCksIE9ybVR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgkc2lkKSk7CgkJCQkkZW50aXR5cyA9IE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJGFuRW50aXR5LCAkT3JtRXhhbXBsZSk7CgkJCQlpZihjb3VudCgkZW50aXR5cykgPiAwKQoJCQkJewoJCQkJICByZXR1cm4gIkxhIGxpZ25lICZhZ3JhdmU7IHN1cHByaW1lciBlc3QgZW5jb3JlIHV0aWxpcyZlYWN1dGU7ZSBwYXIgJmxhcXVvOyAiLiRhbkVudGl0eS0+Z2V0TmFtZSgpLiIgJnJhcXVvOyI7CgkJCQl9CgkJCSAgfQoJCQl9CgkJICB9CgkJfQoKCQlyZXR1cm47CgoJfQogIAoJLyoqCgkgKiBXaWxsIHJldHVybiBhIFVVSUQgOiBhIHVuaXF1ZSBpZGVudGlmaWVyCgkgKiBAc2luY2UgMC4wLjIKCSAqLwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKXsKCgkJLy9FeGVjdXRpb24KCQkkcmVzdWx0ID0gT3JtRGI6OmV4ZWN1dGUoJ1NFTEVDVCBVVUlEKCkgQVMgdXVpZDsnLAoJCQkJCQkJCQludWxsLAoJCQkJCQkJCQkiRGF0YWJhc2UgZXJyb3IgZHVyaW5nIE9ybUNvcmU6OmdlbmVyYXRlVVVJRCgpIik7CgoJCSRyb3c9JHJlc3VsdC0+RmV0Y2hSb3coKTsKCgkJcmV0dXJuICRyb3dbJ3V1aWQnXTsKCX0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUNyaXRlcmlhIGNsYXNzCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAogCgovKioKICogQmFja2JvbmUgZm9yIE9ybUNyaXRlcmlhIGludG8gdGhlIE9ybSBzeXN0ZW0KICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBPcm1Dcml0ZXJpYQp7CgkvKioKCSAqIE5hbWUgb2YgdGhlIGZpZWxkIAoJICovCglwdWJsaWMgJGZpZWxkbmFtZTsKCQoJLyoqCgkgKiBUeXBlIG9mIENyaXRlcmlhCgkgKi8KCXB1YmxpYyAkdHlwZUNyaXRlcmlhOwoJCgkvKioKCSAqIFBhcmFtZXRlcnMgZm9yIHRoZSB0eXBlIG9mIENyaXRlcmlhCgkgKi8KCXB1YmxpYyAkcGFyYW1zQ3JpdGVyaWE7CgkKCS8qKgoJICogQm9vbGVhbiBpZiB3ZSBtdXN0IGlnbm9yZSBjYXNlCgkgKi8KCXB1YmxpYyAkaWdub3JlQ2FzZTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIAogICAgKiBAcGFyYW0gT3JtVHlwZUNyaXRlcmlhICR0eXBlQ3JpdGVyaWEgVHlwZSBvZiBDcml0ZXJpYQogICAgKiBAcGFyYW0gbWl4ZWRbXSAkcGFyYW1zQ3JpdGVyaWEgYXJyYXkgd2l0aCBhbGwgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHBhcmFtZXRlciAkdHlwZUNyaXRlcmlhCiAgICAqIEBwYXJhbSBib29sZWFuICRpZ25vcmVDYXNlIFtPcHRpb25hbF0gaWYgd2UgbXVzdCBpZ25vcmUgdGhlIGNhc2UgKGF6ZSBlcXVhbHMgQVpFKSBvciBub3QuIERlZmF1bHQgdmFsdWUgaXMgImZhbHNlIgogICAgKgoJKiBAcmV0dXJuIE9ybUNyaXRlcmlhIGEgQ3JpdGVyaWEKCSoKCSogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSA9IGZhbHNlKQoJewoJCSR0aGlzLT5maWVsZG5hbWUgPSAkZmllbGRuYW1lOwoJCSR0aGlzLT50eXBlQ3JpdGVyaWEgPSAkdHlwZUNyaXRlcmlhOwoJCSR0aGlzLT5wYXJhbXNDcml0ZXJpYSA9ICRwYXJhbXNDcml0ZXJpYTsKCQkkdGhpcy0+aWdub3JlQ2FzZSA9ICRpZ25vcmVDYXNlOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmDb.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1EYgogKiAKICogQHNpbmNlIDAuMS4yCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIAovKioKICogSW50ZXJmYWNlIGJldHdlZW4gdGhlIGZ1bmN0aW9ucyBvZiB0aGUgT3JtIGZyYW1ld29yayBhbmQgQWRvZGIKICogICAKICogQHNpbmNlIDAuMS4yCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtRGIgeyAgCgoJLyoqCgkgKiBDb250YWlucyB0aGUgYWRvZGIgZW5naW5lCgkgKi8KCXByaXZhdGUgc3RhdGljICRkYjsKCgkvKioKCSAqIENvbnRhaW5zIHRoZSBhZG9kYiBkaWN0aW9ubmFyeQoJICovCglwcml2YXRlIHN0YXRpYyAkZGljdDsKCQoJLyoqCgkgKiBDb250YWlucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZGF0YWJhc2UgYW5kIHRhYmxlIGNyZWF0aW9uIGZvciBjbXNtcwoJICovCglwcml2YXRlIHN0YXRpYyAkdGFib3B0YXJyYXkgPSBhcnJheSggJ215c3FsJyA9PiAnRU5HSU5FIE15SVNBTSBDSEFSQUNURVIgU0VUIHV0ZjggQ09MTEFURSB1dGY4X2dlbmVyYWxfY2knKTsKCgkvKioKCSAqIENvbnRhaW5zIHdvcmRzIGZvciB0aGUgVU5JUVVFIGtleQoJICovCglwcml2YXRlIHN0YXRpYyAkaWR4b3B0YXJyYXlVbmlxdWUgPSBhcnJheSgnVU5JUVVFJyk7CgoJLyoqCgkgKiBDb250YWlucyB0aGUgbGFzdCBTUUwgcXVlcmllcwoJICoqLwoJcHJpdmF0ZSBzdGF0aWMgJGJ1ZmZlclF1ZXJpZXMgPSBhcnJheSgpOwoKCS8qKgoJICogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KCSAqKi8KCXByaXZhdGUgc3RhdGljICRidWZmZXJMZW5ndGggPSA1OwoKICAgIC8qKgogICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IgICAgCiAgICAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkge30KCQoJLyoqCgkgKiBBbGxvdyBpbml0aWFsaXppbmcgdGhlIE9ybURiIGZpZWxkcwoJICovCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGluaXQoKXsKCQlpZihPcm1EYjo6JGRiICE9IG51bGwpewoJCQlyZXR1cm47CgkJfQoJCU9ybURiOjokZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCU9ybURiOjokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCBPcm1EYjo6JGRiICk7Cgl9CiAgICAgIAogICAgLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgImV4ZWN1dGUiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IHRoZSBzcWwgUXVlcnkKICAgICogQHBhcmFtIG1peGVkW10gJHBhcmFtZXRlcnMgYXJyYXkgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBvciBudWxsCiAgICAqIEBwYXJhbSBzdHJpbmcgJGVycm9yTXNnIHRoZSBtZXNzYWdlIG9mIGVycm9yIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGV4ZWN1dGUoJHF1ZXJ5LCAkcGFyYW1ldGVycyA9IG51bGwsICRlcnJvck1zZyA9ICJEYXRhYmFzZSBlcnJvciIpIHsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCU9ybVRyYWNlOjpzcWwoJHF1ZXJ5KTsKCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJT3JtVHJhY2U6OnNxbCgiID4gUGFyYW1ldGVycyA6ICIucHJpbnRfcigkcGFyYW1ldGVycywgdHJ1ZSkpOwoJCX0KCQkkcmVzdWx0ID0gT3JtRGI6OiRkYi0+RXhlY3V0ZSgkcXVlcnksICRwYXJhbWV0ZXJzKTsKCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJT3JtRGI6OnB1c2hRdWVyaWVzKCk7CgoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSB8fCBPcm1EYjo6JGRiLT5FcnJvck1zZygpKSB7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBRdWVyeSB3YXMgOiAiLiRxdWVyeSk7CgkJCWlmKCRwYXJhbWV0ZXJzICE9IG51bGwpewoJCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgUGFyYW1ldGVycyB3YXMgOiAiLnByaW50X3IoJHBhcmFtZXRlcnMsIHRydWUpKTsKCQkJfQoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQkKCQoJIC8qKgogICAgKiB3aWxsIGV4ZWN1dGUgdGhlIEFkb2RiICJHZXRPbmUiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IHRoZSBzcWwgUXVlcnkKICAgICogQHBhcmFtIG1peGVkW10gJHBhcmFtZXRlcnMgYXJyYXkgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyBvciBudWxsCiAgICAqIEBwYXJhbSBzdHJpbmcgJGVycm9yTXNnIHRoZSBtZXNzYWdlIG9mIGVycm9yIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldE9uZSgkcXVlcnksICRwYXJhbWV0ZXJzID0gbnVsbCwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJT3JtVHJhY2U6OnNxbCgkcXVlcnkpOwoJCWlmKCRwYXJhbWV0ZXJzICE9IG51bGwpewoJCQlPcm1UcmFjZTo6c3FsKCIgPiBQYXJhbWV0ZXJzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJfQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRiLT5HZXRPbmUoJHF1ZXJ5LCAkcGFyYW1ldGVycyk7CgkJLy9QdXNoIFF1ZXJ5IGluIGJ1ZmZlcgoJCU9ybURiOjpwdXNoUXVlcmllcygpOwoKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UgfHwgT3JtRGI6OiRkYi0+RXJyb3JNc2coKSkgewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgUXVlcnkgd2FzIDogIi4kcXVlcnkpOwoJCQlpZigkcGFyYW1ldGVycyAhPSBudWxsKXsKCQkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIFBhcmFtZXRlcnMgd2FzIDogIi5wcmludF9yKCRwYXJhbWV0ZXJzLCB0cnVlKSk7CgkJCX0KCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiR2VuSUQiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcW5hbWUgdGhlIHRhYmxlIHVzZWQgZm9yIHNlcXVlbmNlIAogICAgKiBAcGFyYW0gc3RyaW5nICRlcnJvck1zZyB0aGUgbWVzc2FnZSBvZiBlcnJvciB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCiAgICAqCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZW5JRCgkc2VxbmFtZSwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OnNxbCgiZ2VuIElkKHskc2VxbmFtZX0pIik7CgkJJHJlc3VsdCA9IE9ybURiOjokZGItPkdlbklEKCRzZXFuYW1lKTsKCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJT3JtRGI6OnB1c2hRdWVyaWVzKCk7CgoJCWlmICgkcmVzdWx0ID09PSBmYWxzZSB8fCBPcm1EYjo6JGRiLT5FcnJvck1zZygpKSB7CgkJCU9ybVRyYWNlOjplcnJvcigkZXJyb3JNc2cpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IE15c3FsIHNhaWQgOiAiLk9ybURiOjokZGItPkVycm9yTXNnKCkpOwoJCQlPcm1UcmFjZTo6ZXJyb3IoIiA+IFRoZSBHZW5JZCB3YXMgbWFkZSBvbiA6ICIuJHNlcW5hbWUpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0JCgkKCSAvKioKICAgICogd2lsbCBleGVjdXRlIHRoZSBBZG9kYiAiQ3JlYXRlVGFibGVTUUwiIGZ1bmN0aW9uIGFuZCBhZGQgbG9ncyBvZiBldmVyeXRoaW5nCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCiAgICAqIEBwYXJhbSBzdHJpbmcgJGhxbCB0aGUgaHFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWVsZHMKICAgICoKICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRvZGIgcmVzdWx0CgkqCgkqIEBleGNlcHRpb24gT3JtU3FsRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSBmYWlsZWQKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKCR0YWJsZU5hbWUsICRocWwsICRlcnJvck1zZyA9ICJEYXRhYmFzZSBlcnJvciIpIHsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpzcWwoImNyZWF0ZVRhYmxlKHskdGFibGVOYW1lfSwgXCJ7JGhxbH1cIikiKTsKCQkKCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJT3JtRGI6OnB1c2hRdWVyaWVzKCk7CgkJJHNxbGFycmF5ID0gT3JtRGI6OiRkaWN0LT5DcmVhdGVUYWJsZVNRTCgkdGFibGVOYW1lLCAKCQkJCQkJCQkJCQkJJGhxbCwKCQkJCQkJCQkJCQkJT3JtRGI6OiR0YWJvcHRhcnJheSk7CgkJCQkJCQkJCQkJCQoJCSRyZXN1bHQgPSBPcm1EYjo6JGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJCS8vUHVzaCBRdWVyeSBpbiBidWZmZXIKCQlPcm1EYjo6cHVzaFF1ZXJpZXMoKTsKCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlIHx8IE9ybURiOjokZGItPkVycm9yTXNnKCkpIHsKCQkJT3JtVHJhY2U6OmVycm9yKCRlcnJvck1zZyk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gTXlzcWwgc2FpZCA6ICIuT3JtRGI6OiRkYi0+RXJyb3JNc2coKSk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIENyZWF0ZVRhYmxlIHdhcyBtYWRlIG9uIDogeyR0YWJsZU5hbWV9IHdpdGggeyRocWx9IHBhcmFtZXRlcnMiKTsKCgkJCXRocm93IG5ldyBPcm1TcWxFeGNlcHRpb24oJGVycm9yTXNnKTsKCQl9CgkJCgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkRyb3BUYWJsZVNRTCIgZnVuY3Rpb24gYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkdGFibGVOYW1lIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKCSogCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wVGFibGUoJHRhYmxlTmFtZSwgJGVycm9yTXNnID0gIkRhdGFiYXNlIGVycm9yIikgewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OnNxbCgiZHJvcFRhYmxlKHskdGFibGVOYW1lfSkiKTsKCQkKCQkkc3FsYXJyYXkgPSBPcm1EYjo6JGRpY3QtPkRyb3BUYWJsZVNRTCgkdGFibGVOYW1lKTsKCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJT3JtRGI6OnB1c2hRdWVyaWVzKCk7CgoJCSRyZXN1bHQgPSBPcm1EYjo6JGRpY3QtPmV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoJCS8vUHVzaCBRdWVyeSBpbiBidWZmZXIKCQlPcm1EYjo6cHVzaFF1ZXJpZXMoKTsKCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlIHx8IE9ybURiOjokZGItPkVycm9yTXNnKCkpIHsKCQkJT3JtVHJhY2U6OmVycm9yKCRlcnJvck1zZyk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gTXlzcWwgc2FpZCA6ICIuT3JtRGI6OiRkYi0+RXJyb3JNc2coKSk7CgkJCU9ybVRyYWNlOjplcnJvcigiID4gVGhlIERyb3BUYWJsZSB3YXMgbWFkZSBvbiA6IHskdGFibGVOYW1lfSIpOwoKCQkJdGhyb3cgbmV3IE9ybVNxbEV4Y2VwdGlvbigkZXJyb3JNc2cpOwoJCX0KCQkKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCQoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkNyZWF0ZVNlcXVlbmNlIiBmdW5jdGlvbiBhbmQgYWRkIGxvZ3Mgb2YgZXZlcnl0aGluZwogICAgKiAgICAgICAgIAogICAgKiBAcGFyYW0gc3RyaW5nICRzZXFOYW1lIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlKCRzZXFOYW1lKXsKCQkvL0JlIHN1cmUgd2UgaW5pdGlhdGUgdGhlIGRiIGNvbm5lY3RvcjsKCQlPcm1EYjo6aW5pdCgpOwoJCQoJCU9ybVRyYWNlOjpzcWwoImNyZWF0ZVNlcXVlbmNlKHskc2VxTmFtZX0pIik7CgkJCgkJT3JtRGI6OiRkYi0+Q3JlYXRlU2VxdWVuY2UoJHNlcU5hbWUpOwoJCS8vUHVzaCBRdWVyeSBpbiBidWZmZXIKCQlPcm1EYjo6cHVzaFF1ZXJpZXMoKTsKCX0KCQoJLyoqCiAgICAqIHdpbGwgZXhlY3V0ZSB0aGUgQWRvZGIgIkRyb3BTZXF1ZW5jZSIgZnVuY3Rpb24gYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkc2VxTmFtZSB0aGUgdGFibGUgdXNlZCBmb3Igc2VxdWVuY2UgCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkcm9wU2VxdWVuY2UoJHNlcU5hbWUpewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OnNxbCgiZHJvcFNlcXVlbmNlKHskc2VxTmFtZX0pIik7CgkJCgkJT3JtRGI6OiRkYi0+RHJvcFNlcXVlbmNlKCRzZXFOYW1lKTsKCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJT3JtRGI6OnB1c2hRdWVyaWVzKCk7CgkJCgl9CgkKCS8qKgogICAgKiB3aWxsIGV4ZWN1dGUgdGhlIEFkb2RiICJDcmVhdGVJbmRleFNRTCIgZnVuY3Rpb24gd2l0aCBvciB3aXRob3V0IFVOSVFVRSBwYXJhbWV0ZXIgYW5kIGFkZCBsb2dzIG9mIGV2ZXJ5dGhpbmcKICAgICogICAgICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkdGFibGVOYW1lIHRoZSB0YWJsZSB1c2VkIGZvciBzZXF1ZW5jZSAKICAgICogQHBhcmFtIG1peGVkICRsaXN0RmllbGRzIHRoZSBsaXN0IG9mIHRoZSBGaWVsZE5hbWUgKGFycmF5KSBvciBhIHNpbmdsZSBmaWVsZE5hbWUgKFN0cmluZykKICAgICogQHBhcmFtIGJvb2xlYW4gJGlzVW5pcXVlIHRydWUgaWYgdGhlIGluZGV4IG11c3QgYmUgVU5JUVVFCiAgICAqCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGFkb2RiIHJlc3VsdAoJKgoJKiBAZXhjZXB0aW9uIE9ybVNxbEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZmFpbGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBjcmVhdGVJbmRleCgkdGFibGVOYW1lLCAkbGlzdEZpZWxkcywgJGlzVW5pcXVlID0gZmFsc2UsICRlcnJvck1zZyA9ICJEYXRhYmFzZSBlcnJvciIpewoJCS8vQmUgc3VyZSB3ZSBpbml0aWF0ZSB0aGUgZGIgY29ubmVjdG9yOwoJCU9ybURiOjppbml0KCk7CgkJCgkJT3JtVHJhY2U6OnNxbCgiY3JlYXRlSW5kZXgoeyR0YWJsZU5hbWV9LCB7Ii5pbXBsb2RlKCcsJywkbGlzdEZpZWxkcykuIn0sIHskaXNVbmlxdWV9KSIpOwoJCQkJCgkJLy9DYXNlIDogdW5pcXVlIGluZGV4IG9uIG1hbnkgZmllbGRzCgkJaWYoaXNfYXJyYXkoJGxpc3RGaWVsZHMpKSB7CgkJCSRpZHhmbGRzID0gaW1wbG9kZSgnLCcsICRsaXN0RmllbGRzKTsKCQkJJG1kNSA9ICdhJy5tZDUoc2VyaWFsaXplKCRsaXN0RmllbGRzKSk7CgkJfSBlbHNlIHsKCQkJJGlkeGZsZHMgPSAkbGlzdEZpZWxkczsKCQkJJG1kNSA9ICdhJy5tZDUoJGxpc3RGaWVsZHMpOwoJCX0KCQlpZigkaXNVbmlxdWUpewoJCQkkc3FsYXJyYXkgPSBPcm1EYjo6JGRpY3QtPkNyZWF0ZUluZGV4U1FMKCRtZDUsICR0YWJsZU5hbWUsICRpZHhmbGRzLCBPcm1EYjo6JGlkeG9wdGFycmF5VW5pcXVlKTsKCQkJLy9QdXNoIFF1ZXJ5IGluIGJ1ZmZlcgoJCQlPcm1EYjo6cHVzaFF1ZXJpZXMoKTsKCQl9IGVsc2UgewoJCQkvL1B1c2ggUXVlcnkgaW4gYnVmZmVyCgkJCU9ybURiOjpwdXNoUXVlcmllcygpOwoJCQkkc3FsYXJyYXkgPSBPcm1EYjo6JGRpY3QtPkNyZWF0ZUluZGV4U1FMKCRtZDUsICR0YWJsZU5hbWUsICRpZHhmbGRzKTsKCQl9CgkJCgkJJHJlc3VsdCA9IE9ybURiOjokZGljdC0+ZXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgkJLy9QdXNoIFF1ZXJ5IGluIGJ1ZmZlcgoJCU9ybURiOjpwdXNoUXVlcmllcygpOwoKCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UgfHwgT3JtRGI6OiRkYi0+RXJyb3JNc2coKSkgewoJCQlPcm1UcmFjZTo6ZXJyb3IoJGVycm9yTXNnKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBNeXNxbCBzYWlkIDogIi5Pcm1EYjo6JGRiLT5FcnJvck1zZygpKTsKCQkJT3JtVHJhY2U6OmVycm9yKCIgPiBUaGUgY3JlYXRlSW5kZXggd2FzIG1hZGUgb24gOiB7JHRhYmxlTmFtZX0gd2l0aCB0aGUgZmllbGRzIDogeyIuaW1wbG9kZSgnLCcsJGxpc3RGaWVsZHMpLiJ9Iik7CgoJCQl0aHJvdyBuZXcgT3JtU3FsRXhjZXB0aW9uKCRlcnJvck1zZyk7CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwoJfQoKCS8qKgogICAgKiBXaWxsIHJldHVybiB0aGUgbGFzdCBTUUwgUXVlcmllcyBleGVjdXRlZAogICAgKgogICAgKiBAcmV0dXJuIHN0cmluZ1tdIHRoZSBsYXN0IFNRTCBRdWVyaWVzIGV4ZWN1dGVkCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRCdWZmZXJRdWVyaWVzKCl7CgkJcmV0dXJuIE9ybURiOjokYnVmZmVyUXVlcmllczsKCX0KCgkvKioKICAgICogd2lsbCByZXNpemUgdGhlIGJ1ZmZlciBmb3IgdGhlIFNRTCBRdWVyaWVzCiAgICAqICAgICAgICAgCiAgICAqIEBwYXJhbSBpbnQgJG5ld0xlbmd0aCB0aGUgbmV3IHNpemUKICAgICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNldEJ1ZmZlckxlbmd0aCgkbmV3TGVuZ3RoKXsKCQlPcm1EYjo6JGJ1ZmZlckxlbmd0aCA9ICRuZXdMZW5ndGg7CgkJT3JtRGI6OnJlc2l6ZUJ1ZmZlcigpOwoJfQoKCS8qKgogICAgKiB3aWxsIHB1c2ggdGhlIGxhc3QgcXVlcnkgaW4gdGhlIGJ1ZmZlcgogICAgKi8JCglwcml2YXRlIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBwdXNoUXVlcmllcygpewoJCWlmKE9ybURiOjokYnVmZmVyTGVuZ3RoID09IDApewoJCQlyZXR1cm47CgkJfQoJCU9ybURiOjokYnVmZmVyUXVlcmllc1tdID0gT3JtRGI6OiRkYi0+c3FsOwoJCU9ybURiOjpyZXNpemVCdWZmZXIoKTsKCgkJT3JtVHJhY2U6OnNxbCgiW01ZU1FMXSAiLk9ybURiOjokZGItPnNxbCk7Cgl9CgoJLyoqCiAgICAqIGlubmVyIGZ1bmN0aW9uIHRvIHJlc2l6ZSB0aGUgYnVmZmVyCiAgICAqLwkKCXByaXZhdGUgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHJlc2l6ZUJ1ZmZlcigpewoJCWlmKE9ybURiOjokYnVmZmVyTGVuZ3RoID09IDApewoJCQlPcm1EYjo6JGJ1ZmZlclF1ZXJpZXMgPSBhcnJheSgpOwoJCX0KCQkkY3VycmVudENvdW50ID0gY291bnQoT3JtRGI6OiRidWZmZXJRdWVyaWVzKTsKCQlpZigkY3VycmVudENvdW50ID4gT3JtRGI6OiRidWZmZXJMZW5ndGgpIHsKCQkJT3JtRGI6OiRidWZmZXJRdWVyaWVzID0gYXJyYXlfc2xpY2UgKE9ybURiOjokYnVmZmVyUXVlcmllcywgLSBPcm1EYjo6JGJ1ZmZlckxlbmd0aCk7CgkJfQoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1FbnRpdHkKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKLyoqCiAqIEFic3RyYWN0IENsYXNzZXMgZGVzY3JpYmluZyB0aGUgZnJhbWUgb2YgYW4gT3JtRW50aXR5IGludG8gT3JtCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KYWJzdHJhY3QgY2xhc3MgT3JtRW50aXR5CnsKCS8qKgoJICogU3RyaW5nIDogTmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgY3VycmVudGx5IHVzZSB0aGlzIGVudGl0eQoJICogKi8KCXByaXZhdGUgJG1vZHVsZU5hbWU7CgkKCS8qKgoJICogU3RyaW5nIDogdGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGVudGl0eQoJICogKi8KCXByb3RlY3RlZCAkbmFtZTsKCgkvKioKCSAqIFN0cmluZyA6IHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiBkYXRhYmFzZQoJICogKi8KCXByaXZhdGUgJGRibmFtZTsKCQoJLyoqCgkgKiBTdHJpbmcgOiBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBsaW5rZWQgdG8gdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gTWF5IGJlIE51bGwKCSAqICovCglwcml2YXRlICRzZXFuYW1lOwoJCgkvKioKCSAqIGxpc3QgOiBmaWVsZHMgbWFraW5nIHVwIHRoZSBlbnRpdHkKCSAqICovCglwcml2YXRlICRmaWVsZHMgPSBhcnJheSgpOwoJCgkvKioKCSAqIGxpc3QgOiB2YWx1ZXMgb2YgZWFjaCBmaWVsZHMKCSAqICovCglwcml2YXRlICR2YWx1ZXMgPSBhcnJheSgpOwoJCgkvKioKCSAqIEFycmF5IDogTmFtZXMgb2YgdGhlIGZpZWxkcyB3aWNoIHdpbGwgYmUgdXNlZCBhcyBhIChjb21wb3VuZCkgUHJpbWFyeSBLZXkKCSAqICovCglwcml2YXRlICRwayA9IGFycmF5KCk7CgkKCS8qKgoJICogQm9vbGVhbiA6IGlmIHRydWUgdGhlIGZyYW1ld29yayB3aWxsIHRyeSB0byB1c2UgdGhlIGlubmVyIGF1dG9pbmNyZW1lbnQgb2YgTXlzcWwgaW5zdGVhZCBnZW5lcmF0ZSBhIG5ldyB0YWJsZSB4eHhfc2VxIGxpa2UgdXN1YWwKCSAqLwoJcHJpdmF0ZSAkYXV0b2luY3JlbWVudCA9IGZhbHNlOwoJCgkvKioKCSAqIEFycmF5LCBjb250YWlucyBhbGwgdGhlIGluZGV4ZXMgb2YgdGhlIEVudGl0eS4KCSAqKi8JIAoJcHJpdmF0ZSAkaW5kZXhlcyA9IGFycmF5KCk7CgkKCS8qKgoJICogT3JtT3JkZXJCeSA6IGlmIHRydWUgdGhlIGZyYW1ld29yayB3aWxsIHRyeSB0byB1c2UgdGhlIGlubmVyIGF1dG9pbmNyZW1lbnQgb2YgTXlzcWwgaW5zdGVhZCBnZW5lcmF0ZSBhIG5ldyB0YWJsZSB4eHhfc2VxIGxpa2UgdXN1YWwKCSAqLwoJcHJpdmF0ZSAkZGVmYXVsdE9yZGVyQnk7CgoJLyoqCgkgKiBBcnJheSwgY29udGFpbnMgdGhlIGFsaWFzIGZvciBnZXQqIGFuZCBzZXQqIGZ1bmN0aW9uCgkgKi8gCglwcml2YXRlICRhbGlhcyA9IGFycmF5KCk7CgkKCS8qKgoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCBmb3IgdGhlIHNlcXVlbmNlIG5hbWUgaW50byB0aGUgZGF0YWJhc2UKCSAqICovCglwdWJsaWMgc3RhdGljICRfQ09OU1RfU0VRID0gJ19zZXEnOwoJLyoqCgkgKiBTdHJpbmcgOiBjb25zdGFudCwgc3VmZml4IHVzZWQgdG8gbmFtZWQgdGhlIHRhYmxlIGludG8gZGF0YWJhc2UgZm9yIGEgbW9kdWxlCgkgKiAqLwoJcHVibGljIHN0YXRpYyAkX0NPTlNUX01PRCA9ICdtb2R1bGUnOwoJCgkKICAgIC8qKgogICAgICogY29uc3RydWN0b3IgcHJvdGVjdGVkIHRvIGF2b2lkIGEgZGlyZWN0IGluc3RhbnRpYXRpb24gbGlrZSAibmV3IE9ybUVudGl0eSgpIgogICAgICogRWFjaCB0aW1lIGEgZW50aXR5IGlzIGNvbnN0cnVjdGVkLCB3ZSBwbGFjZSBhIGNvcHkgaW50byB0aGUgYXV0b2xvYWRlci4KICAgICAqIAogICAgICogQHBhcmFtIHN0cmluZyAkbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdobyBjYWxsaW5nIHRoaXMgbWV0aG9kIChzbyBub3QgIk9ybSIpCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHByZWZpeGUgW29wdGlvbmFsXSBQcmVmaXggdG8gdXNlIGludG8gZGF0YWJhc2UgZm9yIHRhYmxlLiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQogICAgICogQHBhcmFtIHN0cmluZyAkZGJOYW1lIFtvcHRpb25hbF0gVGhlIG5hbWUgb2YgdGFibGUgZm9yIHRoaXMgZW50aXR5LiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGVudGl0eQogICAgICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBlbnRpdHkgYXMgYSBuZXcgaW5zdGFuY2UKICAgICAqIAogICAgICogQHNlZSBNeUF1dG9sb2FkCiAgICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsICRwcmVmaXhlID0gbnVsbCwgJGRiTmFtZSA9IG51bGwpIHsKCQkkdGhpcy0+bW9kdWxlTmFtZSA9IHN0cnRvbG93ZXIoJG1vZHVsZU5hbWUpOwoJCSR0aGlzLT5uYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgkJCgkJaWYoTXlBdXRvbG9hZDo6aGFzSW5zdGFuY2UoJHRoaXMtPm1vZHVsZU5hbWUsJHRoaXMtPm5hbWUpKXsKCQkJCSRpbnN0YW5jZSA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5tb2R1bGVOYW1lLCR0aGlzLT5uYW1lKTsKCQkJCXJldHVybiAgY2xvbmUgJGluc3RhbmNlOwogICAgICAgIH0gCgkJCgkJJHRoaXMtPmRibmFtZSA9ICR0aGlzLT5uYW1lOwoJCWlmKCFlbXB0eSgkZGJOYW1lKSkgewoJCQkkdGhpcy0+ZGJuYW1lID0gc3RydG9sb3dlcigkZGJOYW1lKTsKCQl9CgkJCgkJaWYoZW1wdHkoJHByZWZpeGUpKSB7CgkJCSRwcmVmaXhlID0gJHRoaXMtPm1vZHVsZU5hbWU7CgkJfSBlbHNlIHsKCQkJJHByZWZpeGUgPSBzdHJ0b2xvd2VyKCRwcmVmaXhlKTsKCQl9CgkJCgkJJHRoaXMtPmRibmFtZSA9IGNtc19kYl9wcmVmaXgoKS5Pcm1FbnRpdHk6OiRfQ09OU1RfTU9ELidfJy4kcHJlZml4ZS4nXycuJHRoaXMtPmRibmFtZTsKCQkKCQkvLyBXZSBhZGQgYW4gaW5zdGFuY2Ugb2Ygb3VyLXNlcmYgaW50byB0aGUgYXV0b2xvYWQKCQlNeUF1dG9sb2FkOjphZGRJbnN0YW5jZSgkdGhpcy0+bW9kdWxlTmFtZSwkdGhpcyk7Cgl9CgkKICAgIC8qKgogICAgKiAgQ2FuIGJlIG92ZXJyaWRlLiBMZXQgeW91IHNwZWNpZnkgaG93IHlvdXIgdGFibGUgbXVzdCBiZSBwb3B1bGF0ZWQgCiAgICAqIGFmdGVyIHlvdSBhc2tlZCB0byBjcmVhdGUgdGhlIHRhYmxlIG9mIHlvdXIgRW50aXR5CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGluaXRUYWJsZSgpe30KICAgIAkKICAgIC8qKgogICAgKiBBZGQgYSBuZXcgRmllbGQgaW50byB0aGUgbGlzdCBvZiBGaWVsZHMKICAgICogCiAgICAqIEBwYXJhbSBPcm1GaWVsZCAkbmV3RmllbGQgdGhlIG9iamVjdCBGaWVsZCB0byBhZGQKICAgICoKICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSogCgkqIEBleGNlcHRpb24gT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gYSBzaW5nbGUgUHJpbWFyeUtleSBpbiB0aGUgZW50aXR5CiAgICAqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZChPcm1GaWVsZCAkbmV3RmllbGQpIHsKCQkKCQkkdGhpcy0+ZmllbGRzWyRuZXdGaWVsZC0+Z2V0TmFtZSgpXSA9ICRuZXdGaWVsZDsKCgkJLy9BZGQgYSBzZXF1ZW5jZSBvbiB0aGUga2V5cwoJCWlmKCRuZXdGaWVsZC0+aXNQcmltYXJ5S0VZKCkpIHsKCQkJCQoJCQkkdGhpcy0+cGtbXSA9ICRuZXdGaWVsZC0+Z2V0TmFtZSgpOwoJCQlpZighJHRoaXMtPmlzQXV0b2luY3JlbWVudCgpIC8vIG5vIHNlcXVlbmNlIGlmIGF1dG9pbmNyZW1lbnQgdXNlZAoJCQkJJiYgJG5ld0ZpZWxkLT5nZXRUeXBlKCkgPT0gT3JtQ0FTVDo6JElOVEVHRVIgLy8gbm8gc2VxdWVuY2UgZm9yIG90aGVyIHR5cGUgdGhhbiBJTlRFR0VSCgkJCQkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXFuYW1lID0gJHRoaXMtPmRibmFtZS5Pcm1FbnRpdHk6OiRfQ09OU1RfU0VROwogICAgICAgICAgICB9CgkJfQoKCQkvL0lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgUEssIHdlIHdvbid0IHVzZSB0aGUgU2VxdWVuY2UKCQlpZihjb3VudCgkdGhpcy0+cGspID4gMSl7CgkJCSR0aGlzLT5zZXFuYW1lID0gbnVsbDsKCQl9CgoKCgkJcmV0dXJuICR0aGlzOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIFByaW1hcnlLZXkgRmllbGQKICAgICogCiAgICAqIEByZXR1cm4gT3JtRmllbGRbXSB0aGUgbGlzdCBvZiBQcmltYXJ5S2V5IEZpZWxkCiAgICAqCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIFByaW1hcnlLZXkgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UGsoKSB7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGVudGl0eSB7JHRoaXMtPmdldE5hbWUoKX0gZG9lc24ndCBoYXZlIGFueSBQcmltYXJ5LUtleSIpOwoJCX0KCQkKICAgICAgICAkbGlzdF9wayA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCgkdGhpcy0+cGsgYXMgJHBrKXsKICAgICAgICAgICAgJGxpc3RfcGtbJHBrXSA9ICR0aGlzLT5maWVsZHNbJHBrXTsKICAgICAgICB9CgkJcmV0dXJuICRsaXN0X3BrOwoJfQoKCS8qKgoJICogUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBQcmltYXJ5S2V5IAoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIFByaW1hcnlLZXkgCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zaXRlS2V5KCl7CgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gY291bnQoJHRoaXMtPnBrKSA+IDEgOwoJfQoKCS8qKgoJICogUmV0dXJuIGEgc2VjdXJpemVzIGFncmVnYXRlIGZvciBzaW5nbGUgb3IgY29tcG9zaXRlIFByaW1hcnlLZXkgdG8gbWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIDIgZW50aXR5IG9mIHRoZSBzYW1lIHR5cGUKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyB0aGUgIlByaW1hcnkgVW5pcXVlIElEZW50aWZpZXIiCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0UFVJRCgpewoJCSR2YWxzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+Z2V0UGsoKSBhcyAkcGtuYW1lID0+ICRwaykgewoJCQkkdmFsc1tdID0gJHRoaXMtPmdldCgkcGtuYW1lKTsKCQl9CgkJcmV0dXJuIE9ybVV0aWxzOjpnZW5lcmF0ZVBVSUQoJHZhbHMpOwoJCQoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIEZpZWxkcwogICAgKiAKICAgICogQHJldHVybiBGaWVsZFtdIGFuIGFycmF5IHdpdGggYWxsIHRoZSBGaWVsZHMKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkcygpIHsKCQlyZXR1cm4gJHRoaXMtPmZpZWxkczsKCX0KCQogICAgLyoqCiAgICAqIHJldHVybiBhIEZpZWxkIGJ5IG5hbWUKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJGZpZWxkTmFtZSB0aGUgZmllbGQgbmFtZQogICAgKiBAcmV0dXJuIE9ybUZpZWxkIHRoZSBGaWVsZAogICAgKiAKICAgICogQGV4Y2VwdGlvbiBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3QgZm9yIHRoZSBuYW1lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpIHsKCQkKCQlpZihlbXB0eSgkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGdW5jdGlvbiBnZXRGaWVsZEJ5TmFtZShcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQlyZXR1cm4gJHRoaXMtPmZpZWxkc1skZmllbGROYW1lXTsKCQkKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0cnVlIGlmIGEgRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSB0aGUgbmFtZQogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBleGlzdHMKICAgICovCglwdWJsaWMgZnVuY3Rpb24gaXNGaWVsZEJ5TmFtZUV4aXN0cygkbmFtZSkgewoJCXJldHVybiBpc3NldCgkdGhpcy0+ZmllbGRzWyRuYW1lXSk7Cgl9CgkKICAgIC8qKgogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlCiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW50byB0aGUgZGF0YWJhc2UKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldERibmFtZSgpIHsKCQlyZXR1cm4gJHRoaXMtPmRibmFtZTsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgewoJCXJldHVybiAkdGhpcy0+bmFtZTsKCX0KCQoJLyoqCgkgKiAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZQoJICogIAoJICogIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZS4KCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRNb2R1bGVOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+bW9kdWxlTmFtZTsKCX0KCQogICAgLyoqCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgKGlmIGV4aXN0cykKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBvciBOVUxMCiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTZXFuYW1lKCkgewoJCWlmKGVtcHR5KCR0aGlzLT5zZXFuYW1lKSkKCQkJcmV0dXJuIG51bGw7CgkJCgkJcmV0dXJuICR0aGlzLT5zZXFuYW1lOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYSBGaWVsZCBieSB0aGUgbmFtZSAKICAgICogCQogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIEZpZWxkCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQKICAgICogCiAgICAqIEBleGNlcHRpb24gT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIEZpZWxkIGV4aXN0cyBmb3IgdGhlIG5hbWUKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0KCRmaWVsZE5hbWUpIHsKCQkKCQlpZihlbXB0eSgkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmdW5jdGlvbiBnZXQoXCRmaWVsZE5hbWUpIGRvZXNuJ3QgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIgKGVudGl0eSA6IHskdGhpcy0+Z2V0TmFtZSgpfSkiKTsKCQl9CgkKCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmFsaWFzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZ1bmN0aW9uIGdldChcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT52YWx1ZXMpKXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCQoJCXJldHVybiAkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdOwoJfQoJCiAgIC8qKgogICAgKiBTZXQgYSB2YWx1ZSB0byBhIEZpZWxkCiAgICAqICAgICAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBGaWVsZAogICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIEZpZWxkCiAgICAqIAogICAgKiBAZXhjZXB0aW9uIE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBGaWVsZCBleGlzdHMgZm9yIHRoZSBuYW1lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHNldCgkZmllbGROYW1lLCR2YWx1ZSkgewoJCQoJCWlmKGVtcHR5KCRmaWVsZE5hbWUpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZ1bmN0aW9uIHNldChcJGZpZWxkTmFtZSkgZG9lc24ndCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlciAoZW50aXR5IDogeyR0aGlzLT5nZXROYW1lKCl9KSIpOwoJCX0KCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmFsaWFzKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZ1bmN0aW9uIHNldChcJGZpZWxkTmFtZSkgOiBUaGUgZmllbGQgeyRmaWVsZE5hbWV9IGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5IHskdGhpcy0+Z2V0TmFtZSgpfSIpOwoJCX0KCQkKCQkkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdID0gJHZhbHVlOwoJfQoJCiAgICAvKioKICAgICogUmV0dXJuIHRoZSB2YWx1ZXMgZm9yIGFsbCB0aGUgRmllbGRzIGludG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkgd2l0aCAKICAgICogICoga2V5ID0gbmFtZSBvZiB0aGUgRmllbGQsIGFuZCAKICAgICogICogdmFsdWUgPSBpdHMgdmFsdWUKICAgICogCiAgICAqIEByZXR1cm4gYXJyYXkgYW4gYXNzb2NpYXRpdmUgYXJyYXkKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpIHsKCQlyZXR1cm4gJHRoaXMtPnZhbHVlczsKCX0KCQkKCS8qKgoJICogU2hvcnRjdXQgdG8gc2F2ZSB0aGUgZW50aXR5LiBpZiB0aGUgcHJpbWFyeUtleSBpcyBzZXR0ZWQsIGl0IHdpbGwgYmUgYW4gdXBkYXRlIG9wZXJhdGlvbiwgZWxzZSBhbiBpbnNlcnQuCgkgKgoJICogQHJldHVybiB0aGUgZW50aXR5IHNhdmVkIHdpdGggaXRzIG5ldyBuZXcgSWQgKGN1c3RvbWVyX2lkIGluIG15IGV4YW1wbGUpIGlmIGl0J3MgYW4gaW5zZXJ0aW9uCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgpewoJCWlmKCR0aGlzLT5wayA9PSBudWxsKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBzYXZlIHRoZSBlbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpLiIgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7CgkJfQogICAgICAgIAogICAgICAgICRhc1BrRmlsbGVkID0gdHJ1ZTsKICAgICAgICAkdmFsdWVzID0gJHRoaXMtPmdldFZhbHVlcygpOwoJICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgIGlmKCFpc3NldCgkdmFsdWVzWyRwa10pIHx8ICR2YWx1ZXNbJHBrXSA9PT0gIiIpewogICAgICAgICAgICAgICAgJGFzUGtGaWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCgkJaWYoISRhc1BrRmlsbGVkKSB7CgkJCXJldHVybiBPcm1Db3JlOjppbnNlcnRFbnRpdHkoJHRoaXMpOwoJCX0gZWxzZSB7CgkJCS8vVHJ5IHRvIGZpbmQgaWYgaXQncyBhbiB1cGRhdGUgb3IgaW5zZXJ0IHdpdGggYWxyZWFkeSBhbiBJZAogICAgICAgICAgICAkb3JtRXhhbXBsZSA9IG5ldyBPcm1FeGFtcGxlKCk7CiAgICAgICAgICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgICAgICAkb3JtRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJHBrLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHRoaXMtPmdldCgkcGspKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxhenltb2RlID0gdHJ1ZTsKICAgICAgICAgICAgJGVudGl0eSA9IE9ybUNvcmU6OmZpbmRCeUV4YW1wbGUoJHRoaXMsICRvcm1FeGFtcGxlLCBudWxsLCBudWxsLCAnQU5EJywgJGxhenltb2RlKTsKCQkJaWYoZW1wdHkoJGVudGl0eSkpIHsKCQkJCXJldHVybiBPcm1Db3JlOjppbnNlcnRFbnRpdHkoJHRoaXMpOwoJCQl9CgkJCQoJCQlyZXR1cm4gT3JtQ29yZTo6dXBkYXRlRW50aXR5KCR0aGlzKTsKCQl9Cgl9CgkKCS8qKgoJICogU2hvcnRjdXQgdG8gZGVsZXRlIHRoZSBlbnRpdHkKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBkZWxldGUoKXsKCQlpZigkdGhpcy0+cGsgPT0gbnVsbCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ5b3UgY2FuJ3QgZGVsZXRlIHRoZSBlbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpLiIgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7CgkJfQoJCQogICAgICAgICRhc1BrRmlsbGVkID0gdHJ1ZTsKCSAgICBmb3JlYWNoKCR0aGlzLT5wayBhcyAkcGspewogICAgICAgICAgICBpZigkdGhpcy0+Z2V0KCRwaykgPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAkYXNQa0ZpbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCgkJaWYoISRhc1BrRmlsbGVkKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGF0IGxhc3Qgb25lIG9mIGl0cyBQcmltYXJ5LUtleSBkb2Vzbid0IGhhdmUgYW55IHZhbHVlIik7CgkJfQoJCQogICAgICAgICRvcm1FeGFtcGxlID0gbmV3IE9ybUV4YW1wbGUoKTsKICAgICAgICBmb3JlYWNoKCR0aGlzLT5wayBhcyAkcGspewogICAgICAgICAgICAkb3JtRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJHBrLCBPcm1UeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHRoaXMtPmdldCgkcGspKSk7CiAgICAgICAgfQogICAgICAgICRlbnRpdHkgPSBPcm1Db3JlOjpkZWxldGVCeUV4YW1wbGUoJHRoaXMsICRvcm1FeGFtcGxlKTsKCX0KCQogICAgLyoqCiAgICAqIENhbiBiZSBvdmVycmlkZGVuIExldCB5b3UgbW9kaWZ5IHNvbWUgZGF0YSBqdXN0IGJlZm9yZSBzYXZpbmcgdGhlIGRhdGEgaW50byB0aGUgZGF0YXRhYmxlLgogICAgKiAKICAgICogQHBhcmFtIG1peGVkW10gJHJvd3MgYWxsIHRoZSB2YWx1ZXMgdG8gcHJvY2VzcwogICAgKiBAcGFyYW0gbWl4ZWRbXSAkYXJncyBbb3B0aW9uYWxdIG1vcmUgcGFyYW1ldGVycyBpZiB5b3UgbmVlZCwgaWYgeW91IHdhbnQKICAgICogCiAgICAqIEByZXR1cm4gbWl4ZWQgdG8gZGVmaW5lCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZUZvclNhdmUoJHJvd3MsICRhcmdzID0gbnVsbCl7CgkKCQlyZXR1cm4gJHJvd3M7Cgl9CgkKCS8qKgoJICogQ2FsbCB0aGUgY29tcGFyZVRvIGZ1bmN0aW9uIGludG8geW91ciBFbnRpdHkgdG8gc29ydCB0aGUgRW50aXRpZXMuCgkgKiBUbyBhY3RpdmF0ZSB0aGlzIGZ1bmN0aW9uYWxpdHksIFRoZSBFbnRpdHkgbXVzdCBpbXBsZW1lbnQgSVNvcnRhYmxlIEludGVyZmFjZS4KCSAqCgkgKiBFeGFtcGxlIG9mIGZ1bmN0aW9uIGNvbXBhcmVUbygpIGluIGEgQ3VzdG9tZXIgRW50aXR5CgkgKiAgPGNvZGU+CgkgKiAgICAgICAKCSAqCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGFyZVRvKE9ybUVudGl0eSAkZW50aXR5MSwgT3JtRW50aXR5ICRlbnRpdHkyKQoJICoJewoJICoJCSRjb21wYXJlID0gc3RyY21wKCRlbnRpdHkxLT5nZXQoJ25hbWUnKSwgJGVudGl0eTItPmdldCgnbmFtZScpKTsKCSAqICAgICAgCXJldHVybiAkY29tcGFyZTsKCSAqCX0KCSAqIAoJICogIDwvY29kZT4KCSAqCgkgKiBAcGFyYW0gT3JtRW50aXR5W10gJGFycmF5IHRoZSBsaXN0IG9mIEVudGl0eSB0byBzb3J0CgkgKgoJICogQHJldHVybiBPcm1FbnRpdHlbXSB0aGUgbGlzdCBvZiBFbnRpdHkgZ3JhY2VmdWxseSBzb3J0ZWQKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzb3J0KGFycmF5ICRhcnJheSkgewoKCQl1c29ydCgkYXJyYXksIGFycmF5KGdldF9jYWxsZWRfY2xhc3MoKSwgImNvbXBhcmVUbyIpKTsKCQoJCXJldHVybiAkYXJyYXk7Cgl9CgkKCS8qKgoJICogTWF5IGJlIG92ZXJyaWRlIGluIHlvdXIgRW50aXR5J3MgZGVmaW5pdGlvbiB0byBhbGxvdyBTZWFyY2ggbW9kdWxlIGluZGV4aW5nIHlvdXIgZW50aXRpZXMncyBkYXRhCgkgKiAKCSAqIEV4YW1wbGUgb2YgZnVuY3Rpb24gaXNJbmRleGFibGUoKSBpbiBhIEN1c3RvbWVyIEVudGl0eQoJICogIAoJICogIDxjb2RlPgoJICogICAgICAgCgkgKglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCkKCSAqCXsKCSAqCQlyZXR1cm4gdGhpcy0+Z2V0Wydpc0FjdGl2YXRlZCddOwoJICoJfQoJICogCgkgKiAgPC9jb2RlPgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZSBieSBkZWZhdWx0CgkgKiovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCl7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgogICAgKiBnZXR0ZXIgZm9yIGF1dG9pbmNyZW1lbnQKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9mIHRoZSBGaWVsZCBpcyBhdXRvaW5jcmVtZW50CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIElzQXV0b2luY3JlbWVudCgpIHsKCQlyZXR1cm4gJHRoaXMtPmF1dG9pbmNyZW1lbnQ7Cgl9CgkKCS8qKgoJICogVGhpcyBmdW5jdGlvbiB3aWxsIGxldCB5b3UgZGVmaW5lIHNvbWUgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgeW91ciBFbnRpdHkKCSAqICAgID0+IHRoZSBmaWVsZCBtdXN0IGJlIGF1dG8taW5jcmVtZW50YWwKICAgICAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eSB0aGUgY3VycmVudCBpbnN0YW5jZQogICAgICoKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnYXJuaXNoQXV0b2luY3JlbWVudCgpewoJCQogICAgICAgICRhc1BrSW50ZWdlciA9IGZhbHNlOwoJICAgIGZvcmVhY2goJHRoaXMtPnBrIGFzICRwayl7CiAgICAgICAgICAgICRmaWVsZCA9ICR0aGlzLT5nZXRGaWVsZEJ5TmFtZSgkcGspOwogICAgICAgICAgICBpZigkZmllbGQtPmdldFR5cGUoKSA9PSBPcm1DQVNUOjokSU5URUdFUil7CiAgICAgICAgICAgICAgICAkYXNQa0ludGVnZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCgkJaWYoISRhc1BrSW50ZWdlcil7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBkb24ndCBoYXZlIGFueSBJTlRFR0VSIFBLIGFuZCBzbyBjYW4ndCBiZSBkZWZpbmVkIGF1dG9pbmNyZW1lbnQiKTsKCQl9CiAgICAgICAgCgkJJHRoaXMtPmF1dG9pbmNyZW1lbnQgPSB0cnVlOwoJCQoJCS8vUmVtb3ZlIGFueSBzZXEgdGhhdCBjb3VsZCBiZSBhZGQgYmVmb3JlCiAgICAgICAgJHRoaXMtPnNlcW5hbWUgPSBudWxsOwoKICAgICAgICByZXR1cm4gJHRoaXM7Cgl9CgkKCS8qKgoJICogUmV0dXJuIAoJICogQHJldHVybiBzdHJpbmdbXSA6IHRoZSBsaXN0IG9mIGNvdXBsZSBvZiB1bmlxdWUgaW5kZXgKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRJbmRleGVzKCkgewoJCXJldHVybiAkdGhpcy0+aW5kZXhlczsKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGZpZWxkIGhhdmUgb25lIG9yIG1hbnkgKFVuaXF1ZT8pIEluZGV4ZSBvbiBvbmUgb3IgbWFueSBjb2x1bW5zLgoJICoKCSAqICBleGFtcGxlIDogCgkgKiAgPGNvZGU+CgkgKiAgICAgbXlFbnRpdHktPmFkZEluZGV4ZXMoJ2ZpZWxkMScsdHJ1ZSk7CgkgKiAgICAgbXlFbnRpdHktPmFkZEluZGV4ZXMoYXJyYXkoJ2ZpZWxkMicsICdmaWVsZDMnKSk7CgkgKiAgPGNvZGU+CgkgKiAgd2lsbCBjcmVhdGUgMSB1bmlxdWUgaW5kZXggb24gZmllbGQxIGFuZCAxIGluZGV4IG9uIGZpZWxkMixmaWVsZDMKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJGZpZWxkTmFtZXMgT25lIChzdHJpbmcpIG9yIG1hbnkgKGFycmF5KSBuYW1lIG9mIGZpZWxkIHRvIGJlIGluZGV4aW5nCgkgKiBAcGFyYW0gYm9vbGVhbiAkaXNVbmlxdWUgW29wdGlvbmFsXSBpZiB0aGUgaW5kZXggbXVzdCBiZSBVTklRVUUgKGRlZmF1bHQgPSBmYWxzZSkgCgkgKgogICAgICogQHJldHVybiBPcm1FbnRpdHkgdGhlIGN1cnJlbnQgaW5zdGFuY2UKCSAqCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gYWRkSW5kZXhlcygkZmllbGROYW1lcywgJGlzVW5pcXVlID0gZmFsc2UpewoJCQoJCWlmKCFpc19hcnJheSgkZmllbGROYW1lcykpewoJCQkkZmllbGROYW1lcyA9IGFycmF5KCRmaWVsZE5hbWVzKTsKCQl9CgkJCgkJLy9UZXN0IHRoZSBleGlzdGVuY2Ugb2YgZWFjaCBtZW1iZXIKCQlmb3JlYWNoKCRmaWVsZE5hbWVzIGFzICRmaWVsZE5hbWUpewoJCQlpZighJHRoaXMtPmlzRmllbGRCeU5hbWVFeGlzdHMoJGZpZWxkTmFtZSkpewoJCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRkSW5kZXhlcyhcJGZpZWxkTmFtZXMsIFwkaXNVbmlxdWU9ZmFsc2UpIDogeyRmaWVsZE5hbWV9IGlzIG5vdCBhIGV4aXN0aW5nIEZpZWxkIG9mIHRoZSBFbnRpdHkgeyR0aGlzLT5nZXROYW1lKCl9Iik7CgkJCX0KCQl9CgkKCQkkdGhpcy0+aW5kZXhlc1tdID0gYXJyYXkoJ2ZpZWxkcycgPT4gJGZpZWxkTmFtZXMsICd1bmlxdWUnID0+ICRpc1VuaXF1ZSk7CgoJCXJldHVybiAkdGhpczsKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIC4uLgoJICoKCSAqICBleCA6IG15RW50aXR5LT5nYXJuaXNoRGVmYXVsdFZhbHVlKCdmaWVsZDEnLCAnc29tZSB0ZXh0JykKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRmaWVsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIEZpZWxkCgkgKiBAcGFyYW0gbWl4ZWQgJGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KCSAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eSB0aGUgY3VycmVudCBpbnN0YW5jZQoJICoKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnYXJuaXNoRGVmYXVsdFZhbHVlKCRmaWVsZE5hbWUsICRkZWZhdWx0VmFsdWUpewoJCWlmKCEkdGhpcy0+aXNGaWVsZEJ5TmFtZUV4aXN0cygkZmllbGROYW1lKSl7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdhcm5pc2hEZWZhdWx0KCkgb25seSBhY2NlcHQgdmFsaWQgRmllbGQgYnV0ICIuJGZpZWxkTmFtZS4iIGlzIG5vdCBhIGV4aXN0aW5nIEZpZWxkIGluIHRoZSBFbnRpdHkgIi4kdGhpcy0+Z2V0TmFtZSgpKTsKCQl9CgkJCgkJJHRoaXMtPmdldEZpZWxkQnlOYW1lKCRmaWVsZE5hbWUpLT5zZXREZWZhdWx0VmFsdWUoJGRlZmF1bHRWYWx1ZSk7CgoJCXJldHVybiAkdGhpczsKCQkKCX0KCQoJLyoqCgkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbGV0IHlvdSBkZWZpbmUgc29tZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB5b3VyIEVudGl0eQoJICogICAgPT4gdGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcyAuLi4KCSAqCgkgKiAgZXggOiBteUVudGl0eS0+Z2FybmlzaERlZmF1bHRPcmRlckJ5KG5ldyBPcm1PcmRlckJ5KCktPmFkZEFzYygnZmllbGQxJyktPmFkZERlc2MoJ2ZpZWxkMicpKQoJICoKCSAqIEBwYXJhbSBPcm1vcmRlckJ5ICRkZWZhdWx0T3JkZXJCeSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyLgoJICoKICAgICAqIEByZXR1cm4gT3JtRW50aXR5IHRoZSBjdXJyZW50IGluc3RhbmNlCgkgKgoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdhcm5pc2hEZWZhdWx0T3JkZXJCeShPcm1PcmRlckJ5ICRkZWZhdWx0T3JkZXJCeSl7CgkJZm9yZWFjaCgkZGVmYXVsdE9yZGVyQnkgYXMgJGZpZWxkTmFtZSA9PiAkdmFsdWUpIHsKCQkJaWYoISR0aGlzLT5pc0ZpZWxkQnlOYW1lRXhpc3RzKCRmaWVsZE5hbWUpKXsKCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdhcm5pc2hEZWZhdWx0T3JkZXJCeSgpIG9ubHkgYWNjZXB0IHZhbGlkIEZpZWxkIGJ1dCAiLiRmaWVsZE5hbWUuIiBpcyBub3QgYSBleGlzdGluZyBGaWVsZCBpbiB0aGUgRW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7CgkJCX0KCQl9CgkJJHRoaXMtPmRlZmF1bHRPcmRlckJ5ID0gJGRlZmF1bHRPcmRlckJ5OwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgkKCS8qKgoJICogUmV0dXJuIHRoZSBkZWZhdWx0IG9yZGVyQnkgb2JqZWN0IGZvciB0aGUgZW50aXR5CgkgKiBAcmV0dXJuIE9ybU9yZGVyQnkgOiBkZWZhdWx0IE9ybU9yZGVyQnkKCSAqKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0T3JkZXJCeSgpIHsKCQlyZXR1cm4gJHRoaXMtPmRlZmF1bHRPcmRlckJ5OwoJfQoKCS8qKgoJICogQWRkIGEgYWxpYXMsIHZlcnkgdXNlZnVsIGZvciBlbnRpdHkgd2l0aCAyKyBGSyBwb2ludGluZyBvbiB0aGUgc2FtZSBlbnRpdHkgd2l0aCBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGFsaWFzTmFtZSB0aGUgbmFtZSBvZiB0aGUgYWxpYXMKCSAqIEBwYXJhbSBzdHJpbmdbXSAkcG9pbnRlcnMgdGhlIGxpc3RlIG9mIGZpZWxkbmFtZSBmb3IgdGhlIHNob3J0Y3V0CgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRBbGlhcygkYWxpYXNOYW1lLCBhcnJheSAkcG9pbnRlcnMpewoJCSR0aGlzLT5hbGlhc1skYWxpYXNOYW1lXSA9ICRwb2ludGVyczsKCX0KCgkvKioKCSAqIGdldHRlciBmb3IgZmllbGQgYWxpYXMKCSAqCgkgKiBAcmV0dXJuIHN0cmluZ1tdIAoJICoqLwoJcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzKCl7CgkJcmV0dXJuICR0aGlzLT5hbGlhczsKCX0KCQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmEntityAssociation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUVudGl0eUFzc29jaWF0aW9uIENsYXNzIHdoaWNoIGV4dGVuZHMgT3JtRW50aXR5IGNsYXNzCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCi8qKgogKiBBYnN0cmFjdCBDbGFzcyB3aGljaCBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgZm9yIGFuIEFzc29jaWF0aXZlIEVudGl0eQogKiAgICAKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwphYnN0cmFjdCBjbGFzcyBPcm1FbnRpdHlBc3NvY2lhdGlvbiBleHRlbmRzIE9ybUVudGl0eSAKewogICAgLyoqCiAgICAgKiBJbm5lciBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIGZpZWxkcwogICAgICoqLwoJcHJpdmF0ZSAkbmJGaWVsZCA9IDA7CgogICAgLyoqCiAgICAgKiBjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgdG8gYXZvaWQgYSBkaXJlY3QgaW5zdGFudGlhdGlvbiBsaWtlICJuZXcgT3JtRW50aXR5QXNzb2NpYXRpb24oKSIKICAgICAqIEVhY2ggdGltZSBhIGVudGl0eSBpcyBjb25zdHJ1Y3RlZCwgd2UgcGxhY2UgYSBjb3B5IGludG8gdGhlIGF1dG9sb2FkZXIuCiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aG8gY2FsbGluZyB0aGlzIG1ldGhvZCAoc28gbm90ICJPcm0iKQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5CiAgICAgKiBAcGFyYW0gc3RyaW5nICRwcmVmaXhlIFtvcHRpb25hbF0gUHJlZml4IHRvIHVzZSBpbnRvIGRhdGFiYXNlIGZvciB0YWJsZS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRiTmFtZSBbb3B0aW9uYWxdIFRoZSBuYW1lIG9mIHRhYmxlIGZvciB0aGlzIGVudGl0eS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBlbnRpdHkKICAgICAqCiAgICAgKiBAcmV0dXJuIE9ybUVudGl0eUFzc29jaWF0aW9uIHRoZSBlbnRpdHkgYXMgYSBuZXcgaW5zdGFuY2UKICAgICAqIAogICAgICogQHNlZSBNeUF1dG9sb2FkCiAgICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsJHByZWZpeGUgPSBudWxsLCAkZGJOYW1lID0gbnVsbCkKCXsKCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRtb2R1bGVOYW1lLCAkbmFtZSwgJHByZWZpeGUsICRkYk5hbWUpOwoJfQoJCiAgICAvKioKICAgICogQWRkIGEgbmV3IEZpZWxkCiAgICAqIAogICAgKiBDdXJyZW50bHksIHRoZSBPcm0gU3lzdGVtIGRvZW4ndCBhbGxvdyBtb3JlIHRoYW4gdHdvIEZpZWxkIGZvciBhbiBFbnRpdHlBc3NvY2lhdGlvbgogICAgKiAKICAgICogQHBhcmFtIE9ybUZpZWxkICRuZXdGaWVsZCB0aGUgRmllbGQgdG8gYWRkLgoJKgoJKiBAZXhjZXB0aW9uIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIHdlIHRyeSB0byB1c2UgbW9yZSB0aGFuIHR3byBGaWVsZHMgaW4gdGhlIGVudGl0eQogICAgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBhZGQoT3JtRmllbGQgJG5ld0ZpZWxkKQoJewoJCSR0aGlzLT5uYkZpZWxkICsrOwoJCQoJCWlmKCR0aGlzLT5uYkZpZWxkID4gMikKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uICgiSXQncyBpbXBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBFbnRpdHlBc3NvY2lhdGlvbiAiLiAkdGhpcy0+Z2V0TmFtZSgpKTsKCQkJCQoJCXBhcmVudDo6YWRkKCRuZXdGaWVsZCk7Cgl9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmExample.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIE9ybUV4YW1wbGUgQ2xhc3MKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiovCiAKIAovKioKICogUmVwcmVzZW50cyBhIGdyb3VwIG9mIGRpZmZlcmVudCBPcm1Dcml0ZXJpYSAoQ3JpdGVyaWFzKSB0byBwcm9jZXNzIGEgc2VhcmNoICJCeSBFeGFtcGxlIiBvbiBhIE9ybUVudGl0eSBpbiBEYXRhYmFzZQogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUV4YW1wbGUgewoKICAgIC8qKgogICAgKiBUaGUgaW5uZXIgbGlzdCBvZiBDcml0ZXJpYXMKICAgICoqLwoJcHJpdmF0ZSAkY3JpdGVyaWFzID0gYXJyYXkoKTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCQogICAgCiAgICAvKioKICAgICogQWRkIGEgbmV3IENyaXRlcmlhIG9uIHRoZSBleGlzdGluZyBsaXN0CiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgCiAgICAqIEBwYXJhbSBzdHJpbmcgJHR5cGVDcml0ZXJpYSBUeXBlIG9mIENyaXRlcmlhCiAgICAqIEBwYXJhbSBtaXhlZFtdICRwYXJhbXNDcml0ZXJpYSBhbGwgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIHBhcmFtZXRlciAkdHlwZUNyaXRlcmlhCiAgICAqIEBwYXJhbSBib29sZWFuICRpZ25vcmVDYXNlIFtPcHRpb25hbF0gaWYgd2UgbXVzdCBpZ25vcmUgdGhlIGNhc2UgKGF6ZSBlcXVhbHMgQVpFKSBvciBub3QuIERlZmF1bHQgdmFsdWUgaXMgImZhbHNlIgogICAgKiAKICAgICogQHNlZSBPcm1UeXBlQ3JpdGVyaWEKICAgICovCglwdWJsaWMgZnVuY3Rpb24gYWRkQ3JpdGVyaWEoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSA9IGZhbHNlKSB7CgkJaWYoIWlzX2FycmF5KCRwYXJhbXNDcml0ZXJpYSkpIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigidGhlIHBhcmFtZXRlciBcJHBhcmFtc0NyaXRlcmlhIGZvciB0aGUgQ3JpdGVyaWEgb2YgdGhlIEZpZWxkIFsiLiRmaWVsZG5hbWUuIl0gbXVzdCBiZSBhbiBhcnJheSIpOwoJCX0KCQkKCQkkdGhpcy0+Y3JpdGVyaWFzW10gPSBuZXcgT3JtQ3JpdGVyaWEoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJpYSwgJHBhcmFtc0NyaXRlcmlhLCAkaWdub3JlQ2FzZSk7Cgl9CgogICAgLyoqCiAgICAqIFJldHVybiBhbGwgdGhlIENyaXRlcmlhcyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgRXhhbXBsZSBPYmplY3QKICAgICogCiAgICAqIEByZXR1cm4gQ3JpdGVyaWFbXSB0aGUgbGlzdCBvZiBDcml0ZXJpYXMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IEV4YW1wbGUgT2JqZWN0CiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldENyaXRlcmlhcygpewoJCXJldHVybiAkdGhpcy0+Y3JpdGVyaWFzOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmField.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBPcm1GaWVsZAogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KIAovKioKICogICBSZXByZXNlbnQgYSBPcm1FbnRpdHkncyBmaWVsZCB3aXRoIGFsbCBpdHMgcHJvcGVydGllcwogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybUZpZWxkIAp7CgkvKioKCSAqIFRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZAoJICovCglwcml2YXRlICRuYW1lOwoJCgkvKioKCSAqIFRoZSBPcm1DQVNUIHZhbHVlIG9mIHRoZSBmaWVsZAoJICovCglwcml2YXRlICR0eXBlOwoJCgkvKioKCSAqIFRoZSBtYXggc2l6ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsIGlmICR0eXBlIGlzIERhdGUsIFRpbWUsIEJ1ZmZlciwgTm9uZSAuLi4KCSAqLwoJcHJpdmF0ZSAkc2l6ZTsKCQoJLyoqCgkgKiBCb29sZWFuIDogdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwKCSAqLwoJcHJpdmF0ZSAkbnVsbGFibGU7CgkKCS8qKgoJICogdGhlIE9ybUtFWSB2YWx1ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsCgkgKi8KCXByaXZhdGUgJEtFWTsKCQoJLyoqCgkgKiB0aGUgbmFtZSBvZiB0aGUga2V5LiBPbmx5IHVzZWQgZm9yIEZvcmVpZ25LZXkgYW5kIEFzc29jaWF0ZUtleQoJICovCglwcml2YXRlICRLRVlOYW1lOwoJCgkvKioKCSAqIFRoZSBkZWZhdWx0IHZhbHVlLiBOb3QgdXNlZCBieSBkZWZhdWx0LgoJICoqLwoJcHJpdmF0ZSAkZGVmYXVsdFZhbHVlOwoJCiAgICAvKioKICAgICogcHVibGljIGNvbnN0cnVjdG9yCiAgICAqIAkKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIHRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZAogICAgKiBAcGFyYW0gT3JtQ0FTVCAkY2FzdCBUaGUgT3JtQ0FTVCB2YWx1ZSBvZiB0aGUgZmllbGQgZXhhbXBsZSA6IE9ybU9ybUNBU1Q6OiRJTlRFR0VSCiAgICAqIEBwYXJhbSBpbnQgJHNpemUgVGhlIG1heCBzaXplIG9mIHRoZSBmaWVsZC4gTWF5IGJlIG51bGwgaWYgJHR5cGUgaXMgRGF0ZSwgVGltZSwgQnVmZmVyLCBOb25lIC4uLgogICAgKiBAcGFyYW0gYm9vbGVhbiAkbnVsbGFibGUgdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UKICAgICogQHBhcmFtIE9ybUtFWSAkS0VZIHRoZSBLRVkgdmFsdWUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBleGFtcGxlOiBPcm1LRVk6OiRQSyBmb3IgYSBwcmltYXJ5IGtleQogICAgKiBAcGFyYW0gc3RyaW5nICRLRVlOYW1lIHRoZSBuYW1lIG9mIHRoZSBrZXkuIE9ubHkgdXNlZCBmb3IgRm9yZWlnbktleSBhbmQgQXNzb2NpYXRlS2V5IGV4YW1wbGUgOiAiQ3VzdG9tZXIuY3VzdG9tZXJfaWQiIGluIHRoZSBmaWVsZCAiY3VzdG9tZXIiIG9mIGFuIGVudGl0eSAiT3JkZXIiLgogICAgKiAKICAgICogQHJldHVybiBPcm1GaWVsZCB0aGUgRmllbGQgT2JqZWN0CiAgICAqIAogICAgKiAKICAgICogQHNlZSBPcm1DQVNUCiAgICAqIEBzZWUgT3JtS0VZCgkqIEBzZWUgT3JtRW50aXR5CiAgICAqIAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmllbGRuYW1lLCAkY2FzdCwgJHNpemUgPSBudWxsLCAkbnVsbGFibGUgPSBmYWxzZSwgJEtFWSA9IG51bGwsICRLRVlOYW1lPW51bGwpIHsKCQkKCQkkZXJyb3JzID0gYXJyYXkoKTsKCgkJaWYoZW1wdHkoJEtFWSkgJiYgIWVtcHR5KCRLRVlOYW1lKSkgewoJCQkkZXJyb3JzW10gPSAnSW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEga2V5TmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBpZiB0aGUga2V5IGlzIG5vdCAkRksgb3IgJEFLJzsKCQl9CgkJaWYoJEtFWSA9PSBPcm1LRVk6OiRQSyAmJiAhZW1wdHkoJEtFWU5hbWUpKSB7CgkJCSRlcnJvcnNbXSA9ICdJbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBrZXlOYW1lIHBhcmFtZXRlciBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlmIHRoZSBrZXkgaXMgbm90ICRGSyBvciAkQUsnOwoJCX0KCQlpZigoJEtFWSA9PSBPcm1LRVk6OiRGSyB8fCAkS0VZID09IE9ybUtFWTo6JEFLKSAmJiBlbXB0eSgkS0VZTmFtZSkpIHsKCQkJJGVycm9yc1tdID0gJyRGSyBrZXkgb3IgJEFLIGtleSBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG5lZWQgYSBrZXlOYW1lJzsKCQl9CgoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCkgJiYgISgkS0VZID09IE9ybUtFWTo6JEZLIHx8ICRLRVkgPT0gT3JtS0VZOjokQUspKSB7CgkJCSRlcnJvcnNbXSA9ICckSU5IRVJJVCBjYXN0IGlzIG9ubHkgbWFkZSBmb3IgYSAkRksga2V5IG9yIGEgJEFLIGtleSAoZmllbGQgJy4kZmllbGRuYW1lLicpJzsKCQl9CgkJCgkJaWYoKCRjYXN0ID09IE9ybUNBU1Q6OiREQVRFIHx8ICRjYXN0ID09IE9ybUNBU1Q6OiRCVUZGRVIgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFRJTUUKCQkJCXx8ICRjYXN0ID09IE9ybUNBU1Q6OiREQVRFVElNRSB8fCAkY2FzdCA9PSBPcm1DQVNUOjokVFMgfHwgJGNhc3QgPT0gT3JtQ0FTVDo6JFVVSUQgCgkJCQl8fCAkY2FzdCA9PSBPcm1DQVNUOjokSU5IRVJJVCB8fCAkY2FzdCA9PSBPcm1DQVNUOjokTk9ORSkgJiYgIWVtcHR5KCRzaXplKSkgewoJCQkkZXJyb3JzW10gPSAnVGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG11c3Qgbm90IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoJCWlmKCgkY2FzdCA9PSBPcm1DQVNUOjokU1RSSU5HKSAmJiBlbXB0eSgkc2l6ZSkpIHsKCQkJJGVycm9yc1tdID0gJ1RoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBtdXN0IGhhdmUgc2l6ZSB2YWx1ZSBiZWNhdXNlIG9mIGl0cyBvd24gT3JtQ0FTVCc7CgkJfQoKCQlpZigoJGNhc3QgPT0gT3JtQ0FTVDo6JFNUUklORykgJiYgJHNpemUgPiAyNTUpIHsKCQkJJGVycm9yc1tdID0gJ1RoZSBzaXplIG9mIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlzIGNhcHBlZCB0byAyNTUuIFBsZWFzZSBjb25zaWRlciB1c2luZyBDQVNUOjokQlVGRkVSIGluc3RlYWQnOwoJCX0KCQlpZigoJGNhc3QgPT0gT3JtQ0FTVDo6JElOVEVHRVIpICYmICRzaXplID4gMTkpIHsKCQkJJGVycm9yc1tdID0gJ1RoZSBzaXplIG9mIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlzIGNhcHBlZCB0byAxOS4gUGxlYXNlIGNvbnNpZGVyIHVzaW5nIENBU1Q6OiRTVFJJTkcgb3IgQ0FTVDo6JEJVRkZFUiBpbnN0ZWFkJzsKCQl9CgkJCgkJaWYoIWVtcHR5KCRlcnJvcnMpKXsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCRlcnJvcnMpOwoJCX0KCgkJaWYoJG51bGxhYmxlID09IG51bGwpIHsKCQkJJG51bGxhYmxlID0gZmFsc2U7CgkJfQoKCQkvL1RPRE8gOiBmaXggZnV0dXIgSU5IRVJJVCBmb25jdGlvbgoJCS8qCgkJaWYoT3JtQ0FTVDo6JElOSEVSSVQgPT0gJGNhc3QpIHsKCQkJLy9NdXN0IHRha2UgdGhlIGRpc3RhbnQgdHlwZQoJCQlsaXN0KCRlbnRpdHlBc3NvY05hbWUsICRmaWVsZEFzc29jaWF0ZU5hbWUpID0gZXhwbG9kZSgiLiIsICRLRVlOYW1lKTsKCQkJJGNhc3QgPSAobmV3ICRlbnRpdHlBc3NvY05hbWUoKSktPmdldEZpZWxkQnlOYW1lKCRmaWVsZEFzc29jaWF0ZU5hbWUpLT5nZXRUeXBlKCk7CgkJCSRzaXplID0gKG5ldyAkZW50aXR5QXNzb2NOYW1lKCkpLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRBc3NvY2lhdGVOYW1lKS0+Z2V0U2l6ZSgpOwoJCX0qLwoJCQkKCQkkdGhpcy0+bmFtZSAJPSAkZmllbGRuYW1lOwoJCSR0aGlzLT50eXBlIAk9ICRjYXN0OwoJCSR0aGlzLT5zaXplIAk9ICRzaXplOwoJCSR0aGlzLT5udWxsYWJsZSA9ICRudWxsYWJsZTsKCQkkdGhpcy0+S0VZIAkJPSAkS0VZOwoJCSR0aGlzLT5LRVlOYW1lIAk9ICRLRVlOYW1lOwoJfQoJCgogICAgLyoqCiAgICAqIGdldHRlciBmb3IgbmFtZQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlICh1bmlxdWUpIG5hbWUgb2YgRmllbGQKICAgICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCgl7cmV0dXJuICR0aGlzLT5uYW1lO30KCiAgICAvKioKICAgICogZ2V0dGVyIGZvciB0eXBlCiAgICAqIAogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgQ0FTVCB2YWx1ZSBvZiBGaWVsZAogICAgKiAKICAgICogQHNlZSBPcm1DQVNUCiAgICAqIAogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpCgl7cmV0dXJuICR0aGlzLT50eXBlO30KCQogICAvKioKICAgICogZ2V0dGVyIGZvciBzaXplCiAgICAqIAogICAgKiBAcmV0dXJuIGludCB0aGUgc2l6ZSBvZiBGaWVsZAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRTaXplKCkKCXtyZXR1cm4gJHRoaXMtPnNpemU7fQoKICAgLyoqCiAgICAqIHJldHVybiB0cnVlIGlmIEZpZWxkIGhhcyBhICRQSwogICAgKiAKICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgRmllbGQgaGFzIGEgJFBLCiAgICAqLwkKCXB1YmxpYyBmdW5jdGlvbiBpc1ByaW1hcnlLRVkoKQoJe3JldHVybiAkdGhpcy0+S0VZID09IE9ybUtFWTo6JFBLO30KCiAgIC8qKgogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkRksKICAgICogCiAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIEZpZWxkIGhhcyBhICRGSwogICAgKi8gICAgCQoJcHVibGljIGZ1bmN0aW9uIGlzRm9yZWlnbktFWSgpCgl7cmV0dXJuICR0aGlzLT5LRVkgPT0gT3JtS0VZOjokRks7fQoKICAgLyoqCiAgICAqIHJldHVybiB0cnVlIGlmIEZpZWxkIGhhcyBhICRBSwogICAgKiAKICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgRmllbGQgaGFzIGEgJEFLCiAgICAqLyAgICAJCglwdWJsaWMgZnVuY3Rpb24gaXNBc3NvY2lhdGVLRVkoKQoJe3JldHVybiAkdGhpcy0+S0VZID09IE9ybUtFWTo6JEFLO30KCQogICAgLyoqCiAgICAqIGdldHRlciBmb3Iga2V5TmFtZQogICAgKiAKICAgICogQHJldHVybiBzdHJpbmcgdGhlIGtleU5hbWUgb2YgRmllbGQKICAgICogCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGdldEtFWU5hbWUoKQoJe3JldHVybiAkdGhpcy0+S0VZTmFtZTt9CgkKICAgIC8qKgogICAgKiBnZXR0ZXIgZm9yIG51bGxhYmxlIAogICAgKiAKICAgICogQHJldHVybiB0cnVlIGlmIEZpZWxkIGlzIG9wdGlvbmFsIGluIGRhdGFiYXNlCiAgICAqLwoJcHVibGljIGZ1bmN0aW9uIGlzTnVsbGFibGUoKQoJe3JldHVybiAkdGhpcy0+bnVsbGFibGU7fQoJCiAgICAvKioKICAgICogZ2V0dGVyIGZvciBkZWZhdWx0VmFsdWUKICAgICogCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRmllbGQKICAgICogCiAgICAqLwkKCXB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoKQoJe3JldHVybiAkdGhpcy0+ZGVmYXVsdFZhbHVlO30KCQogICAvKioKICAgICogc2V0dGVyIGZvciBkZWZhdWx0VmFsdWUKICAgICogCiAgICAqIEBwYXJhbSBtaXhlZCAkZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEZpZWxkCiAgICAqIAogICAgKi8JCglwdWJsaWMgZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKCRkZWZhdWx0VmFsdWUpewoJCWlmKCR0aGlzLT50eXBlID09IE9ybUNBU1Q6OiRCVUZGRVIpewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgRmllbGQgIi4kdGhpcy0+bmFtZS4iIG9mIHR5cGUgQlVGRkVSIGNhbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlICIpOwoJCX0KCQkkdGhpcy0+ZGVmYXVsdFZhbHVlID0gJGRlZmF1bHRWYWx1ZTsKCX0KCQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalArgumentException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIHBhcmFtZXRlcnMgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAogICAgLyoqCiAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvcgogICAgKgogICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgW29wdGlvbmFsXSB0aGUgZXJyb3IgbWVzc2FnZSAKICAgICogQHBhcmFtIGludCAkY29kZSBbb3B0aW9uYWxdIHRoZSBlcnJvciBjb2RlCiAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkgewogICAgCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogICAgfQp9CgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmIllegalConfigurationException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBFbnRpdGllcyBpc24ndCBjb3JyZWN0CiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uICB7CiAgICAKICAgIC8qKgogICAgKiB0aGUgaW5uZXIgZXJyb3IgbWVzc2FnZXMKICAgICoqLwoJcHJpdmF0ZSAkbWVzc2FnZXMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgKiBQdWJsaWMgY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIFtvcHRpb25hbF0gdGhlIGVycm9yIG1lc3NhZ2UgCiAgICAqIEBwYXJhbSBpbnQgJGNvZGUgW29wdGlvbmFsXSB0aGUgZXJyb3IgY29kZQogICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbXNnPU5VTEwsICRjb2RlPTApCiAgICB7CiAgICAJaWYoaXNfYXJyYXkoJG1zZykgJiYgY291bnQoJG1zZykgPiAxICl7CiAgICAJCXBhcmVudDo6X19jb25zdHJ1Y3QoIk11bHRpcGxlIE9ybUlsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGRldGVjdGVkIiwgJGNvZGUpOwogICAgCQkkdGhpcy0+bWVzc2FnZXMgPSAkbXNnOwoKICAgIAl9IGVsc2VpZiggaXNfYXJyYXkoJG1zZykgKXsKICAgIAkJcGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnWzBdLCAkY29kZSk7CiAgICAJCSR0aGlzLT5tZXNzYWdlcyA9ICRtc2c7CQoJCX0gZWxzZSB7CiAgICAJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1zZywgJGNvZGUpOwogICAgCQkkdGhpcy0+bWVzc2FnZXNbXSA9ICRtc2c7CQogICAgCX0KICAgIAkKICAgIH0KCiAgICAvKioKICAgICogV2lsbCByZXR1cm4gdGhlIG1lc3NhZ2VzCiAgICAqCiAgICAqIEByZXR1cm4gc3RyaW5nW10gdGhlIG1lc3NhZ2VzCiAgICAqKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlcygpewogICAgCXJldHVybiAkdGhpcy0+bWVzc2FnZXM7CiAgICB9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmKEY.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBmb3IgdGhlIGRpZmZlcmVudCBkYXRhYmFzZSBrZXkKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwoKLyoqCiAqIENsYXNzIGRlZmluZXMgdGhlIGRpZmZlcmVudHMga2V5cyB1c2VkIGluIHRoZSBPcm0gc3lzdGVtCiAqIAogKiAgT3JtS0VZOjokUEsgZGVmaW5lcyBhIHByaW1hcnkga2V5CiAqICBPcm1LRVk6OiRGSyBkZWZpbmVzIGEgZm9yZWlnbiBrZXkgOiBhIGxpbmsgYmV0d2VlbiAyIGVudGl0aWVzIDAsMS0+biAKICogIE9ybUtFWTo6JEFLIGRlZmluZXMgYW4gYXNzb2NpYXRlIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgdGhhdCBuZWVkaW5nIGEgdGhpcmQgdGFibGUKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiovCmNsYXNzIE9ybUtFWSB7CgoJLyoqCgkqIFByaW1hcnkgS0VZCgkqKi8KCXB1YmxpYyBzdGF0aWMgJFBLID0gMHg5OTAxOyAKCgkvKioKCSogRm9yZWlnbiBLRVkgYSBsaW5rIGJldHdlZW4gMiBlbnRpdGllcyAwLDEtPm4KCSoqLwoJcHVibGljIHN0YXRpYyAkRksgPSAweDk5MDI7IAoKCS8qKgoJKiBBc3NvY2lhdGUgS0VZIGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgbi0+biB0aGF0IG5lZWRpbmcgYSB0aGlyZCB0YWJsZQoJKiovCglwdWJsaWMgc3RhdGljICRBSyA9IDB4OTkwMzsgCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmLimit.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIExJTUlUCiAqCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEhlcmlxdWV0CiAqKi8KCgovKioKICogQ29udGFpbnMgdGhlIGNsYXNzIHdoaWNoIHdpbGwgbWFuYWdlIHRoZSBTcWwgTElNSVQKICogCiAqIEBzaW5jZSAwLjIuMAogKiBAYXV0aG9yIEhlcmlxdWV0CiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1MaW1pdCB7CQoKCS8qKgoJKiBpbnRlcm5hbCBvZmZzZXQKCSoqLwoJcHJpdmF0ZSAkb2Zmc2V0ID0gMDsKCgkvKioKCSogaW50ZXJuYWwgY291bnRlciBmb3Igcm93CgkqKi8KCXByaXZhdGUgJHJvd19jb3VudCA9IDA7CgoJLyoqCgkqIHB1YmxpYyBjb25zdHJ1Y3QKCSoKCSogQHBhcmFtICRvZmZzZXQgW29wdGlvbmFsXSB0aGUgb2Zmc2V0LiBEZWZhdWx0ID0gMAoJKiBAcGFyYW0gJHJvd19jb3VudCBbb3B0aW9uYWxdIHRoZSBjb3VudGVyIG9mIHJvdy4gRGVmYXVsdCA9IDAKCSoqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9mZnNldD0wLCAkcm93X2NvdW50PTApIHsKCQlpZigkb2Zmc2V0IDwgMCkgewoJCQl0aHJvdyBuZXcgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9mZnNldCB2YWx1ZTogeyRvZmZzZXR9LiBNdXN0IGJlID49IDAiKTsKCQl9CgkJCgkJaWYoJHJvd19jb3VudCA8PSAwKSB7CgkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcm93X2NvdW50IHZhbHVlOiB7JHJvd19jb3VudH0uIE11c3QgYmUgPiAwIik7CgkJfQoKCQkkdGhpcy0+b2Zmc2V0ID0gJG9mZnNldDsKCQkkdGhpcy0+cm93X2NvdW50ID0gJHJvd19jb3VudDsKCX0KCQogICAvKioKICAgICogcmV0dXJuIHRoZSBMSU1JVCBjbGF1c2UKICAgICogCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBMSU1JVCBjbGF1c2UgdW5kZXIgc3FsIGxhbmd1YWdlCiAgICAqLyAgICAgIAoJZnVuY3Rpb24gZ2V0TGltaXQoKQl7CgkJaWYoJHRoaXMtPm9mZnNldCA9PSAwICYmICR0aGlzLT5yb3dfY291bnQgPT0gMCkgeyAvLyBubyBsaW1pdCBzZXQKCQkJcmV0dXJuICcnOwoJCX0KCQkKCQkkbGltaXQgPSAnIExJTUlUICcuJHRoaXMtPm9mZnNldC4nICwgJy4kdGhpcy0+cm93X2NvdW50OwoJCQoJCXJldHVybiAkbGltaXQ7Cgl9CgkKICAgLyoqCiAgICAqIFNldCBvZmZzZXQKICAgICogCiAgICAqIEBwYXJhbSAkb2Zmc2V0IHRoZSBvZmZzZXQgb2Ygcm93IHRvIHNldAogICAgKi8KCWZ1bmN0aW9uIHNldE9mZnNldCgkb2Zmc2V0KSB7CgkJaWYoJG9mZnNldCA8IDApIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvZmZzZXQgdmFsdWU6IHskb2Zmc2V0fS4gTXVzdCBiZSA+PSAwIik7CgkJfQoKCQkkdGhpcy0+b2Zmc2V0ID0gJG9mZnNldDsKCX0KCQogICAvKioKICAgICogU2V0IHJvd19jb3VudAogICAgKiAKICAgICogQHBhcmFtICRyb3dfY291bnQgdGhlIGNvdW50ZXIgb2Ygcm93IHRvIHNldAogICAgKi8KCWZ1bmN0aW9uIHNldFJvd0NvdW50KCRyb3dfY291bnQpIHsKCQlpZigkcm93X2NvdW50IDw9IDApIHsKCQkJdGhyb3cgbmV3IE9ybUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByb3dfY291bnQgdmFsdWU6IHskcm93X2NvdW50fS4gTXVzdCBiZSA+IDAiKTsKCQl9CgoJCSR0aGlzLT5yb3dfY291bnQgPSAkcm93X2NvdW50OwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmOrderBy.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIHNvcnRpbmcgb2YgdGhlIEVudGl0eQogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiovCgoKLyoqCiAqIENvbnRhaW5zIHRoZSBjbGFzcyB3aGljaCB3aWxsIG1hbmFnZSB0aGUgU3FsIHNvcnRpbmcgb2YgdGhlIEVudGl0eQogKiAKICogIE9ybUNBU1Q6OiRERVNDIAogKgogKiBAc2luY2UgMC4yLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtT3JkZXJCeSB7CgoJLyoqCgkqIHRoZSBpbm5lciBsaXN0IG9mIG9yZGVycwoJKiovCglwcml2YXRlICRvcmRlcnMgPSBhcnJheSgpOwoKCS8qKgoJKiB0aGUgaW5uZXIgU1FMIHdvcmQgZm9yIEFTQyBzb3J0aW5nCgkqKi8KCXB1YmxpYyBzdGF0aWMgJEFTQyA9ICdBU0MnOwoKCS8qKgoJKiB0aGUgaW5uZXIgU1FMIHdvcmQgZm9yIERFU0Mgc29ydGluZwoJKiovCglwdWJsaWMgc3RhdGljICRERVNDID0gJ0RFU0MnOwoJCgkvKioKICAgICogcHVibGljIGNvbnN0cnVjdG9yCiAgICAqIAkKICAgICogQHBhcmFtIG1peGVkW10gJG9yZGVycyBhbiBoYXNoIHdpdGggb3JkZXIgYnkgZGVmaW5pdGlvbnMKCSovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb3JkZXJzPWFycmF5KCkpIHsKCQlmb3JlYWNoKCRvcmRlcnMgYXMgJGZpZWxkbmFtZSA9PiAkb3JkZXIpIHsKCgkJCWlmKCRvcmRlciA9PSBPcm1PcmRlckJ5OjokQVNDKSB7CgkJCQkkdGhpcy0+YWRkQXNjKCRmaWVsZG5hbWUpOwoJCQl9IGVsc2UgaWYoJG9yZGVyID09IE9ybU9yZGVyQnk6OiRERVNDKSB7CgkJCQkkdGhpcy0+YWRkRGVzYygkZmllbGRuYW1lKTsJCQkKCQkJfSBlbHNlIHsKCQkJCXRocm93IG5ldyBPcm1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb3JkZXIgZm9yIE9SREVSIEJZOiB7JG9yZGVyfS4iKTsKCQkJfQoJCX0KCX0KCQogICAvKioKICAgICogcmV0dXJuIHRoZSBTUUwgT1JERVIgQlkgY2xhdXNlCiAgICAqIAogICAgKiBAcmV0dXJuIE9SREVSIEJZIGNsYXVzZQogICAgKi8gICAgICAKCWZ1bmN0aW9uIGdldE9yZGVyQnkoKQl7CgkJJG9yZGVyYnkgPSAnIE9SREVSIEJZICc7CgkJCgkJaWYoY291bnQoJHRoaXMtPm9yZGVycykgPT0gMCkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCQoJCSRpPTE7CgkJZm9yZWFjaCgkdGhpcy0+b3JkZXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCQoJCQkkb3JkZXJieSAuPSAoJGkrKz4xPycsJzonJykuJyAnLiRrZXkuJyAnLiR2YWx1ZTsKCQl9CgkJCgkJcmV0dXJuICRvcmRlcmJ5OwoJfQoJCiAgIC8qKgogICAgKiBBZGQgYSBuZXcgZmllbGRuYW1lIGluIG9yZGVyIGJ5OiBERVNDCiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRmaWVsZG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGFkZGluZwogICAgKi8KCWZ1bmN0aW9uIGFkZEFzYygkZmllbGRuYW1lKSB7CgkJJHRoaXMtPm9yZGVycyA9IGFycmF5X21lcmdlKCR0aGlzLT5vcmRlcnMsIGFycmF5KCRmaWVsZG5hbWUgPT4gJycpKTsgLy8gQVNDIG5vdCBtYW5kYXRvcnkKCX0KCQogICAvKioKICAgICogQWRkIGEgbmV3IGZpZWxkbmFtZSBpbiBvcmRlciBieTogREVTQwogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyAkZmllbGRuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBhZGRpbmcKICAgICovCglmdW5jdGlvbiBhZGREZXNjKCRmaWVsZG5hbWUpIHsKCQkkdGhpcy0+b3JkZXJzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm9yZGVycywgYXJyYXkoJGZpZWxkbmFtZSA9PiBPcm1PcmRlckJ5OjokREVTQykpOwoJfQp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmSqlException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIC8qKgogKiBDb250YWlucyB0aGUgY2xhc3MgT3JtSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAqCiAqIEBzaW5jZSAwLjMuMAogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogQ2xhc3MgZXh0ZW5kcyBFeGNlcHRpb24sIHVzZWQgd2hlbiB0aGUgcGFyYW1ldGVycyBpcyBub3QgdGhlIG9uZSBleHBlY3RlZAogKgogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQoqLwpjbGFzcyBPcm1TcWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICAgCiAKICAgIC8qKgogICAgKiBQdWJsaWMgY29uc3RydWN0b3IKICAgICoKICAgICogQHBhcmFtIHN0cmluZyAkbXNnIFtvcHRpb25hbF0gdGhlIGVycm9yIG1lc3NhZ2UgCiAgICAqIEBwYXJhbSBpbnQgJGNvZGUgW29wdGlvbmFsXSB0aGUgZXJyb3IgY29kZQogICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbXNnPU5VTEwsICRjb2RlPTApIHsKICAgIAlwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTsKICAgIH0KfQoKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTrace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIGFsbCB0aGUgZGVidWcgc3lzdGVtLgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqKi8KCi8qKgogKiAgQWxsb3cgZGlzcGxheSBzdGFja3RyYWNlIGFuZCBvdGhlciBpbmZvcm1hdGlvbnMgaW4gYSBjb25zb2xlIG9yIG9uIHRoZSBwYWdlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKiAgZXhhbXBsZQogKiAgPGNvZGU+CiAqICAgICAgICAgIE9ybVRyYWNlOjpkZWJ1ZygnaSBhbSBoZXJlICEnKTsKICogICAgICAgICAgT3JtVHJhY2U6OmluZm8oJ3Byb2Nlc3MgZmluaXNoZWQnKTsKICogICAgICAgICAgT3JtVHJhY2U6Ondhcm4oJ0JlIGNhcmZ1bGwgOiB0b28gbXVjaCByZXN1bHRzIHdpbGwgYmUgZGlzcGxheWVkJyk7CiAqICAgICAgICAgIE9ybVRyYWNlOjplcnJvcignb3VwcyBob3VzdG9uLCB3ZSBoYXZlIGdvdCBhIHByb2JsZW0uLi4gOiggJyk7CiAqICA8L2NvZGU+CiAqIAogKiB0aGUgcHJvcGVydHkgJGxldmVsIG9mIHRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VzIHRvIGRpc3BsYXlpbmcKICogIFNvIGEgbGV2ZWwgb2YgIldBUk4iIHdpbGwgb25seSBkaXNwbGF5IHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCiAqICBCeSBkZWZhdWx0IHRoZSBsZXZlbCBpcyBzZXR0ZWQgdG8gV0FSTgogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovICAgCiAKZmluYWwgY2xhc3MgT3JtVHJhY2UgewoKCS8qKgoJKiBERUJVRyAmIFNRTCAmIElORk8gJiBXQVJOICYgRVJST1IgbGV2ZWwKCSoqLwoJcHVibGljIHN0YXRpYyAkREVCVUcgPSAwOwoKCS8qKgoJKiBTUUwgJiBJTkZPICYgV0FSTiAmIEVSUk9SIGxldmVsCgkqKi8KCXB1YmxpYyBzdGF0aWMgJFNRTCA9IDE7CgoJLyoqCgkqIElORk8gJiBXQVJOICYgRVJST1IgbGV2ZWwKCSoqLwoJcHVibGljIHN0YXRpYyAkSU5GTyA9IDI7CgoJLyoqCgkqIFdBUk4gJiBFUlJPUiBsZXZlbAoJKiovCglwdWJsaWMgc3RhdGljICRXQVJOID0gMzsKCgkvKioKCSogRVJST1IgbGV2ZWwKCSoqLwoJcHVibGljIHN0YXRpYyAkRVJST1IgPSA0OwoKCS8qKgoJKiBpbm5lciBwYXRoIHRvIHRoZSBsb2cgZmlsZQoJKiovCglwcm90ZWN0ZWQgc3RhdGljICRsb2dGaWxlOwoKCS8qKgoJKiBpbm5lciB1cmwgdG8gdGhlIGxvZyBmaWxlIAoJKiovCglwcm90ZWN0ZWQgc3RhdGljICRsb2dVcmw7CgkKCS8qKgoJKiBwcm90ZWN0ZWQgY29uc3RydWN0b3IKCSoqLwoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJfQoKCS8qKgogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIERFQlVHIGxldmVsCiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gZGVidWcoJG1zZykgewkKCQlzZWxmOjppbm5lcldyaXRlcihPcm1UcmFjZTo6JERFQlVHLCAnZGVidWcnLCAkbXNnKTsKCX0KCgkvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBTUUwgbGV2ZWwKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBzcWwoJG1zZykgewkKCQlzZWxmOjppbm5lcldyaXRlcihPcm1UcmFjZTo6JFNRTCwgJ3NxbCcsICRtc2cpOwoJfQoKICAgIC8qKgogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIElORk8gbGV2ZWwKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBpbmZvKCRtc2cpIHsJCgkJc2VsZjo6aW5uZXJXcml0ZXIoT3JtVHJhY2U6OiRJTkZPLCAnaW5mbycsICRtc2cpOwoJfSAKCiAgICAvKioKICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBXQVJOIGxldmVsCiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nICRtc2cgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gd2FybigkbXNnKSB7CQoJCXNlbGY6OmlubmVyV3JpdGVyKE9ybVRyYWNlOjokV0FSTiwgJ3dhcm4nLCAkbXNnKTsKCX0gCgogICAgLyoqCiAgICAqIERpc3BsYXkgYSBtZXNzYWdlIHdpdGggRVJST1IgbGV2ZWwKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBlcnJvcigkbXNnKSB7CQoJCXNlbGY6OmlubmVyV3JpdGVyKE9ybVRyYWNlOjokRVJST1IsICdlcnJvcicsICRtc2cpOwoJfQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBsb2cgZmlsZQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIHRoZSBwYXRoIG9mIHRoZSBsb2cgZmlsZQoJICoqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRMb2dGaWxlKCl7CgkJaWYoc2VsZjo6JGxvZ0ZpbGUgPT0gbnVsbCl7CgkJCSRjb25maWcgPSBjbXNtcygpLT5HZXRDb25maWcoKTsKCQkJc2VsZjo6JGxvZ0ZpbGUgPSAkY29uZmlnWydyb290X3BhdGgnXS4nL3RtcC9jYWNoZS9vcm0ubG9nJzsKCQl9CgkJcmV0dXJuIHNlbGY6OiRsb2dGaWxlOwoJfQoJCgkvKioKCSAqIFdpbGwgcmV0dXJuIHRoZSB1cmwgb2YgdGhlIGxvZyBmaWxlCgkgKgoJICogQHJldHVybiBzdHJpbmcgdGhlIHVybCBvZiB0aGUgbG9nIGZpbGUKCSAqKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0TG9nVXJsKCl7CgkJaWYoc2VsZjo6JGxvZ1VybCA9PSBudWxsKXsKCQkJJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwoJCQlzZWxmOjokbG9nVXJsID0gJGNvbmZpZ1sncm9vdF91cmwnXS4nL3RtcC9jYWNoZS9vcm0ubG9nJzsKCQl9CgkJcmV0dXJuIHNlbGY6OiRsb2dVcmw7Cgl9CgkKCS8qKgoJICogRG8gYWxsIHRoZSBzdWZmIGJlaGluZAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGxldmVsIHRoZSBsZXZlbCBvZiBtZXNzYWdlLgoJICogQHBhcmFtIHN0cmluZyAkY3NzQ2xhc3MgdGhlIGNzcyBjbGFzcyB0byBkaXNwbGF5IHRoZSAiaW5saW5lIiBtZXNzYWdlCgkgKiBAcGFyYW0gc3RyaW5nICRtc2cgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQoJICovCglwcml2YXRlIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpbm5lcldyaXRlcigkbGV2ZWwsICRjc3NDbGFzcywgJG1zZyl7CgkJJG9ybSA9IGNtc21zKCktPkdldE1vZHVsZU9wZXJhdGlvbnMoKS0+Z2V0X21vZHVsZV9pbnN0YW5jZSgnT3JtJyk7CgoJCWlmKCRvcm0gIT0gbnVsbCAmJiAkb3JtLT5HZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsIE9ybVRyYWNlOjokSU5GTykgPiAkbGV2ZWwpIHtyZXR1cm47fQoJCQoJCQoJCSRjb250ZW50ID0gZGF0ZSgnWS1tLWQgSDppOnMnLCB0aW1lKCkpLiIgLSBbJGNzc0NsYXNzXSAtICRtc2cgXG4iOwoJCQkJCgkJLy9pbiBmaWxlIGxvZwoJCWlmKEZBTFNFID09PSBmaWxlX3B1dF9jb250ZW50cyhzZWxmOjpnZXRMb2dGaWxlKCkgLCRjb250ZW50LCBGSUxFX0FQUEVORCApKXsKCQkJZWNobyAiPGgzPk9ybSBjYW4ndCB3cml0ZSBpbnRvIHRoZSBsb2cgZmlsZSA6ICIuc2VsZjo6Z2V0TG9nRmlsZSgpLiI8L2gzPiI7CgkJfQoKCQkvL0luIHBocCBsb2cKCQllcnJvcl9sb2coJG1zZyk7Cgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmTypeCriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBPcm1UeXBlQ3JpdGVyaWEgY2xhc3MKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICoqLwogCgovKioKICogRW51bSBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBPcm1UeXBlQ3JpdGVyaWEKICogCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCmNsYXNzIE9ybVR5cGVDcml0ZXJpYSB7CiAgICAvKioKICAgICogSXMgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVRID0gJyA9ICc7CiAgICAKICAgIC8qKgogICAgKiBJcyBkaWZmZXJlbnQgT2YKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTkVRID0gJyAhPSAnOwogICAgCiAgICAvKioKICAgICogaXMgc3RyaWN0bHkgZ3JlYXRlciAgdGhhbgogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRHVCA9ICcgPiAnOwogICAgCiAgICAvKioKICAgICogaXMgZ3JlYXRlciAgb3IgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEdURSA9ICcgPj0gJzsKICAgIAogICAgLyoqCiAgICAqIGlzIHN0cmljdGx5IGxlc3NlciB0aGFuCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExUID0gJyA8ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBsZXNzZXIgb3IgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExURSA9ICcgPD0gJzsKCQoJLyoqCiAgICAqIGlzIE5VTEwgb3IgaXMgRW1wdHkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkRU1QVFkgPSAnaXMgZW1wdHkoKSc7CgkKICAgIC8qKgogICAgKiBpcyBOb3QgTlVMTCBhbmQgaXMgTm90IEVtcHR5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5FTVBUWSA9ICdpcyBub3QgZW1wdHkoKSc7CiAgICAKICAgIC8qKgogICAgKiBpcyBOVUxMCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5VTEwgPSAnIGlzIG51bGwgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIE5vdCBOVUxMCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5OVUxMID0gJyBpcyBub3QgbnVsbCc7CiAgICAKICAgIC8qKgogICAgKiBpcyBiZWZvcmUgKGEgRGF0ZSkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkQkVGT1JFID0gJyBiZWZvcmUgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGFmdGVyIChhIERhdGUpCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEFGVEVSID0gJyBhZnRlciAnOwogICAgCiAgICAvKioKICAgICogaXMgYmV0d2VlbiAoYSBEYXRlKQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRCRVRXRUVOID0gJyBiZXR3ZWVuICc7CiAgICAgCiAgICAvKioKICAgICogaXMgY29udGFpbmVkIGludG8gdGhlIGFycmF5CiAgICAqIAogICAgKiAvIVwgbmVlZCBhdCBsYXN0IDIgdmFsdWVzIGluIHRoZSBhcnJheQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRJTiA9ICdpbiAoJXMpJzsKICAgIAogICAgLyoqCiAgICAqIGlzIG5vdCBjb250YWluZWQgaW50byB0aGUgYXJyYXkKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAqIC8hXCBuZWVkIGF0IGxhc3QgMiB2YWx1ZXMgaW4gdGhlIGFycmF5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5JTiA9ICdub3QgaW4gKCVzKSc7CiAgICAKICAgIC8qKgogICAgKiBjb250YWlucyB0aGUgc3RyaW5nCiAgICAqIAogICAgKiAvIVwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgd2lsZGNhcmQgJyUnCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJExJS0UgPSAnIGxpa2UgJzsKICAgIAogICAgLyoqCiAgICAqIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RyaW5nCiAgICAqIAogICAgKiAvIVwgZG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgd2lsZGNhcmQgJyUnCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJE5MSUtFID0gJyBub3QgbGlrZSAnOwp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.OrmUtils.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHV0aWxpdGllcwogKgogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBIZXJpcXVldAogKiovCgoKLyoqCiAqIENsYXNzIGNvbnRhaW5zIHNvbWUgdXRpbGl0aWVzCiAqIAogKiBAc2luY2UgMC4zLjAKICogQGF1dGhvciBIZXJpcXVldAogKiBAcGFja2FnZSBPcm0KKi8KY2xhc3MgT3JtVXRpbHMgewoJCgkvKioKCSogQXNzaWducyBhbGwgYXJyYXkgdmFsdWVzIHRvIHRoZSBlbnRpdHksIAoJKiBlc3BlY2lhbGx5IGZvciBoZWxwaW5nIHRoZSBkZXZlbG9wcGVyIHRvIGFzc2lnbiBhbGwgZm9ybSB2YXJpYWJsZXMgdG8gdGhlIGVudGl0eSwgCgkqIG9yIHRvIGxvYWQgYW4gZW50aXR5IHdpdGggYSBPcm1EYjo6ZXhlY3V0ZSBjdXN0b20gcXVlcnkKCSogQmUgY2FyZWZ1bGwgd2l0aCB0aGlzIGZ1bmN0aW9uCgkqIAoJKiBAcGFyYW0gT3JtRW50aXR5ICRlbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgCgkqIEBwYXJhbSBtaXhlZFtdICRkYXRhIGFycmF5IGhhc2h0YWJsZQoJKi8gCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5VG9FbnRpdHkoT3JtRW50aXR5ICRlbnRpdHksICRkYXRhKSB7CgkJZm9yZWFjaCgkZW50aXR5LT5nZXRGaWVsZHMoKSBhcyAkZmllbGQpIHsKCQkJaWYoaXNzZXQoJGRhdGFbJGZpZWxkLT5nZXROYW1lKCldKSkgewoJCQkJJGVudGl0eS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAkZGF0YVskZmllbGQtPmdldE5hbWUoKV0pOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogV2lsbCByZXR1cm4gYSBhcnJheSB3aXRoIHZhbHVlcyBmcm9tIGEgbGlzdCBvZiBPcm1FbnRpdHkKCSAqIGNoZWNraW5nIGFsc28gZWFjaCBjaGlsZCBub2RlIHBlcmZvcm1pbmcgdGhlIHByb2Nlc3NpbmcgcmVjdXJzaXZseQoJICoKCSAqIEBwYXJhbSBPcm1FbnRpdHlbXSBlbnRpdGllcyBhIGxpc3Qgb2YgT3JtRW50aXR5CgkgKiBAcmV0dXJuIG1peGVkW10gJHJlc3VsdCB0aGUgYXJyYXkgd2l0aCBiYXNpYyB2YWx1ZXMKCSAqCgkgKiovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVudGl0aWVzVG9BYnNvbHV0ZUFycmF5KCRlbnRpdGllcyl7CgkJaWYoaXNfb2JqZWN0KCRlbnRpdGllcykgJiYgaXNfc3ViY2xhc3Nfb2YoJGVudGl0aWVzLCAnT3JtRW50aXR5JykpewoJCQlyZXR1cm4gT3JtVXRpbHM6OmVudGl0aXlUb0Fic29sdXRlQXJyYXkoJGVudGl0aWVzKTsKCQl9IGVsc2UgaWYgKCFpc19hcnJheSgkZW50aXRpZXMpKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZ1bmN0aW9uIE9ybVV0aWxzOjplbnRpdGllc1RvQWJzb2x1dGVBcnJheSgkZW50aXRpZXMpIHdhaXQgYSBBcnJheSBvZiBPcm1FbnRpdHkgYXMgcGFyYW1ldGVyIiwgMSk7CgkJfQoJCSRyZXN1bHQgPSBhcnJheSgpOwoJCWZvcmVhY2ggKCRlbnRpdGllcyBhcyAkZW50aXR5KSB7CgkJCSRyZXN1bHRbXSA9IE9ybVV0aWxzOjplbnRpdGl5VG9BYnNvbHV0ZUFycmF5KCRlbnRpdHkpOwoJCX0KCQlyZXR1cm4gJHJlc3VsdDsKCX0KCgkvKioKCSAqIFdpbGwgcmV0dXJuIGEgYXJyYXkgd2l0aCB2YWx1ZXMgZnJvbSBhbiBPcm1FbnRpdHkKCSAqIGNoZWNraW5nIGFsc28gZWFjaCBjaGlsZCBub2RlIHBlcmZvcm1pbmcgdGhlIHByb2Nlc3NpbmcgcmVjdXJzaXZseQoJICoKCSAqIEBwYXJhbSBPcm1FbnRpdHkgZW50aXR5IGFuIE9ybUVudGl0eQoJICogQHJldHVybiBtaXhlZFtdICRyZXN1bHQgdGhlIGFycmF5IHdpdGggYmFzaWMgdmFsdWVzCgkgKgoJICoqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbnRpdGl5VG9BYnNvbHV0ZUFycmF5KCRlbnRpdHkpewoJCWlmKGlzX2FycmF5KCRlbnRpdHkpKXsKCQkJcmV0dXJuIE9ybVV0aWxzOjplbnRpdGllc1RvQWJzb2x1dGVBcnJheSgkZW50aXR5KTsKCQl9IGVsc2UgaWYgKCFpc19vYmplY3QoJGVudGl0eSkgfHwgIWlzX3N1YmNsYXNzX29mKCRlbnRpdHksICdPcm1FbnRpdHknKSApIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIGZ1bmN0aW9uIE9ybVV0aWxzOjplbnRpdGl5VG9BYnNvbHV0ZUFycmF5KCRlbnRpdHkpIHdhaXQgYSBPcm1FbnRpdHkgYXMgcGFyYW1ldGVyIiwgMSk7CgkJfQoKCQkkcmVzdWx0ID0gJGVudGl0eS0+Z2V0VmFsdWVzKCk7CgkJZm9yZWFjaCgkcmVzdWx0IGFzICRrZXkgPT4gJHZhbHVlKSB7CgkJCWlmKGlzX29iamVjdCgkdmFsdWUpICYmIGlzX3N1YmNsYXNzX29mKCR2YWx1ZSwgJ09ybUVudGl0eScpKXsKCQkJCSRyZXN1bHRbJGtleV0gPSBPcm1VdGlsczo6ZW50aXRpeVRvQWJzb2x1dGVBcnJheSgkdmFsdWUpOwoJCQl9IGVsc2UgaWYgKGlzX2FycmF5KCR2YWx1ZSkpewoJCQkJJHJlc3VsdFska2V5XSA9IE9ybVV0aWxzOjplbnRpdGllc1RvQWJzb2x1dGVBcnJheSgkdmFsdWUpOwoJCQl9IGVsc2UgewoJCQkJLy9Ob3RoaW5nCgkJCX0KCQl9CgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoKCS8qKgoJICogUmV0dXJuIGEgdW5pcXVlIGVuY29kaW5nIGZvciB0aGUgbGlzdCBvZiBrZXkuCgkgKiBGb3Igbm93IHNpbXBseSBhbiBKc29uIEVuY29kaW5nCgkgKgoJICogQHBhcmFtIG1peGVkW10gJHByaW1hcnlLZXlzVmFsdWUgbGlzdCBvZiB0aGUgdmFsdWVzIG9mIGVhY2ggcHJpbWFyeWtleQoJICoKCSAqIEByZXR1cm4gc3RyaW5nIHNlY3VyaXplZCBoYXNoIGZvciB0aGUgZW50aXR5IChqc29uKQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlUFVJRChhcnJheSAkcHJpbWFyeUtleXNWYWx1ZSl7CgkJCgkJJHB1aWQgPSBqc29uX2VuY29kZSgkcHJpbWFyeUtleXNWYWx1ZSk7CgoJCXJldHVybiAkcHVpZDsKCX0KCgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0FuRW1wdHlGaWVsZChPcm1GaWVsZCAkZmllbGQsICR2YWx1ZSl7CgkJaWYoJHZhbHVlID09PSBOVUxMKXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmKHRyaW0oJHZhbHVlKSA9PT0gIiIpIHsKCQkJJHR5cGUgPSAkZmllbGQtPmdldFR5cGUoKTsKCgkJCWlmKCR0eXBlID09PSBPcm1DQVNUOjokU1RSSU5HIHx8ICR0eXBlID09PSBPcm1DQVNUOjokQlVGRkVSKSB7CgkJCQlyZXR1cm4gZmFsc2U7CQoJCQl9CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQVZhbGlkRm9ybWF0KE9ybUZpZWxkICRmaWVsZCwgJHZhbHVlKSB7CgkJJHR5cGUgPSAkZmllbGQtPmdldFR5cGUoKTsKCQkKCQlpZigkdHlwZSA9PT0gT3JtQ0FTVDo6JElOVEVHRVIpIHsKCgkJCS8vUGF0dGVybgoJCQkkcGF0dGVybiA9ICcjXlwtP1xkKyQjJzsKCQkJaWYgKCAhcHJlZ19tYXRjaCgkcGF0dGVybiwgJHZhbHVlKSl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCS8vU2l6ZSBtaW4gLyBtYXgKCQkJaWYgKCAkdmFsdWUgPCAtOTIyMzM3MjAzNjg1NDc3NTgwNyB8fCAgJHZhbHVlID4gOTIyMzM3MjAzNjg1NDc3NTgwNyl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCWlmKCR0eXBlID09PSBPcm1DQVNUOjokVVVJRCkgewoKCQkJLy9QYXR0ZXJuCgkJCSRwYXR0ZXJuID0gIi9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2kiOwoJCQlpZiAoICFwcmVnX21hdGNoKCRwYXR0ZXJuLCAkdmFsdWUpKXsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQl9CgoJCXJldHVybiB0cnVlOwoJfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwppZiggIWNsYXNzX2V4aXN0cygiT3JtVHJhY2UiKSkgewoJcmVxdWlyZV9vbmNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLicvbW9kdWxlcy9Pcm0vbGliL2NsYXNzLk9ybVRyYWNlLnBocCcpOwp9CmlmKCAhY2xhc3NfZXhpc3RzKCJPcm1DYWNoZSIpKSB7CglyZXF1aXJlX29uY2UoJGNvbmZpZ1sncm9vdF9wYXRoJ10uJy9tb2R1bGVzL09ybS9saWIvY2xhc3MuT3JtQ2FjaGUucGhwJyk7Cn0KCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsb2dsZXZlbCcsIE9ybVRyYWNlOjokSU5GTyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdjYWNoZVR5cGUnLCBPcm1DYWNoZTo6JE5PTkUpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlQ2FjaGUnLCB0cnVlKTsKCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2VfT3JtJywgJ01hbmFnZSBPcm0nKTsKCiR0aGlzLT5BdWRpdCggMCwgCgkgICAgICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksIAoJICAgICAgJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcsICR0aGlzLT5HZXRWZXJzaW9uKCkpICk7Cj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01hbmFnZV9Pcm0nKTsKCi8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKCmlmKCB2ZXJzaW9uX2NvbXBhcmUoJG9sZHZlcnNpb24sICcwLjIuMicpIDwgMCApIHsKCSR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdNYW5hZ2VfT3JtJywgJ01hbmFnZSBPcm0nKTsKfQoKc3dpdGNoKCRvbGR2ZXJzaW9uKXsKCWNhc2UgJzAuMi4yJzoKCQkkdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlQ2FjaGUnLCB0cnVlKTsKCWNhc2UgJzAuMy4wJzoKCWNhc2UgJzAuMy4xJzoKCWNhc2UgJzAuMy4yJzoKCWNhc2UgJzAuMy4zJzoKfQoKCgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKJHRoaXMtPkF1ZGl0KCAwLCAgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAgJHRoaXMtPkxhbmcoJ3VwZ3JhZGVkJywgJHRoaXMtPkdldFZlcnNpb24oKSkpOwoKCj8+]]></data>
	</file>
	<file>
	  <filename>/Orm.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiogQ2xhc3Mgb2YgY21zbWFkZXNpbXBsZSdzIEFQSS4gVXNlZCB0byBtYWtlIGEgbGluayBiZXR3ZWVuIHRoZSBBUEkgb2YgQ21zTWFkZVNpbXBsZSBhbmQgb3RoZXIgbW9kdWxlcycKKgoqIEBzaW5jZSAwLjAuMQoqIEBhdXRob3IgQmVzcwoqIEBwYWNrYWdlIE9ybQoqKi8KCgkvKioKCSogVGhlIENsYXNzIE9ybSBkZWZpbmUgdGhlIG1vZHVsZSBPcm0gYW5kIGFsbG93IGhhdmluZyBhbGwgdGhlIG9ybSBmdW5jdGlvbmFsaXRpZXMgaW50byBhbm90aGVyIG1vZHVsZQoJKgoJKiBAc2luY2UgMC4wLjEKCSogQGF1dGhvciBCZXNzCgkqIEBwYWNrYWdlIGNtc21zCgkqLwpjbGFzcyBPcm0gZXh0ZW5kcyBDTVNNb2R1bGUgewoKCXByaXZhdGUgc3RhdGljICRpc0luaXRpYXRlZCA9IGZhbHNlOwoKCWZ1bmN0aW9uIF9fY29uc3RydWN0KCl7CgogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywnYXV0b2xvYWQnKSk7CgoJCS8vUmVxdWlyZWQgdG8gcHJlc2VydmUgdGhlIHtNb2R1bGV9IG9uIEZyb250LU9mZmljZQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCgkJLy9Mb2FkIEVudGl0eSBpbiBtZW1vcnkKCQlpZighc2VsZjo6JGlzSW5pdGlhdGVkICYmICR0aGlzLT5HZXROYW1lKCkgIT09IHNlbGY6OkdldE5hbWUoKSkgewoJCQlzZWxmOjpzY2FuKCk7CgkJCSRpc0luaXRpYXRlZCA9IHRydWU7CgkJfQoKCX0KCgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ09ybSc7Cgl9CgoJZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7Cgl9CgoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gJzAuMy4zJzsKCX0KICAKCWZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpCiAJewogICAgCXJldHVybiBhcnJheSgpOwoJfQoKCWZ1bmN0aW9uIEdldEhlbHAoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkgewoJCXJldHVybiAnS2V2aW4gRGFuZXppcyAoYWthIEJlc3MpJzsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsKCQlyZXR1cm4gJ2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUnOwoJfQoKCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAiMS4xMS4xMiI7Cgl9CgoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKCQlyZXR1cm4gJ2V4dGVuc2lvbnMnOwoJfQoKCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKCQlyZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlX09ybScpOwoJfQoKCWZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpIHsKCX0KCglmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7Cgl9CgoJZnVuY3Rpb24gQWxsb3dTbWFydHlDYWNoaW5nKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBMYXp5TG9hZEZyb250ZW5kKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBMYXp5TG9hZEFkbWluKCkgewoJICByZXR1cm4gZmFsc2U7Cgl9CgkKCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7Cgl9CgoJZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7Cgl9CgoJZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKCX0gIAoJCglmdW5jdGlvbiBEaXNwbGF5RXJyb3JQYWdlKCRtc2cpIHsKCQllY2hvICI8aDM+Ii4kbXNnLiI8L2gzPiI7Cgl9IAoJCSAKCXByaXZhdGUgZnVuY3Rpb24gR2V0TXlNb2R1bGVQYXRoKCkgewoJCXJldHVybiBwYXJlbnQ6OkdldE1vZHVsZVBhdGgoKTsJCQoJfQoJCgkvKioKCSAqIFNob3J0Y3V0IHRvIGNhbGwgYWxsIHRoZSBpbnN0YW5jZXMgZm9yIGEgc2luZ2xlIG1vZHVsZQoJICoKCSAqIEByZXR1cm4gTGlzdDxPcm1FbnRpdHk+IHRoZSBlbnRpdGllcyBmb3IgdGhlIGN1cnJlbnQgcGFyZW50J3MgbmFtZXNwYWNlCgkgKiovCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsSW5zdGFuY2VzKCl7CgkJcmV0dXJuIE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcyhwYXJlbnQ6OkdldE5hbWUoKSk7Cgl9CgkKCQoJLyoqCgkgKiBXaWxsIGZvdW5kIGV2ZXJ5IEVudGl0eSBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlIGFuZCByZXR1cm4gdGhlIGxpc3RlIG9mIHRoZWlyIG5hbWUKCSAqCgkgKiBAcmV0dXJuIEFycmF5PFN0cmluZz4gYSBsaXN0IG9mIG5hbWUgb2YgZW50aXRpZXMgZm91bmRlZAoJICoKCSAqKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBzY2FuKCl7CgoJCS8vV2UncmUgbGlzdGluZyB0aGUgY2xhc3MgZGVjbGFyZWQgaW50byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjaGlsZCBtb2R1bGUKCQkkZGlyID0gY21zX2pvaW5fcGF0aChwYXJlbnQ6OkdldE1vZHVsZVBhdGgoKSwnbGliJyk7CgkJJGxpc3RlID0gYXJyYXkoJ2VudGl0aWVzJyA9PiBhcnJheSgpLCAnYXNzb2NpYXRlJyA9PiBhcnJheSgpKTsKCgkJJGZpbGVzID0gJHRoaXMtPmdldEZpbGVzSW5EaXIoJGRpciwgIiNeY2xhc3NcLmVudGl0eVwuKC4pKiQjIik7CgkJZm9yZWFjaCAoJGZpbGVzIGFzICRwYXRoID0+ICRmaWxlbmFtZSkgewoJCSAgICAkY2xhc3NuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSAsIDEzICxzdHJsZW4oJGZpbGVuYW1lKSAtIDQgLSAxMyk7CgkJICAgICRsaXN0ZVsnZW50aXRpZXMnXVtdID0gYXJyYXkoJ2ZpbGVuYW1lJz0+JGZpbGVuYW1lLCAnYmFzZW5hbWUnPT4kcGF0aCwgJ2NsYXNzbmFtZSc9PiRjbGFzc25hbWUpOwoJCX0KCQkkZmlsZXMgPSAkdGhpcy0+Z2V0RmlsZXNJbkRpcigkZGlyLCAiI15jbGFzc1wuYXNzb2NcLiguKSokIyIpOwoJCWZvcmVhY2ggKCRmaWxlcyBhcyAkcGF0aCA9PiAkZmlsZW5hbWUpIHsKCQkgICAgJGNsYXNzbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUgLCAxMiAsc3RybGVuKCRmaWxlbmFtZSkgLSA0IC0gMTIpOwoJCSAgICAkbGlzdGVbJ2Fzc29jaWF0ZSddW10gPSBhcnJheSgnZmlsZW5hbWUnPT4kZmlsZW5hbWUsICdiYXNlbmFtZSc9PiRwYXRoLCAnY2xhc3NuYW1lJz0+JGNsYXNzbmFtZSk7CgkJfQoKCQkkZXJyb3JzID0gYXJyYXkoKTsKCQkKCQlmb3JlYWNoKCRsaXN0ZVsnZW50aXRpZXMnXSBhcyAkZWxlbWVudCkgewoJCQkkY2xhc3NOYW1lID0gJGVsZW1lbnRbJ2NsYXNzbmFtZSddOwoJCQkkZmlsZW5hbWUgPSAkZWxlbWVudFsnZmlsZW5hbWUnXTsKCQkJJGJhc2VuYW1lID0gJGVsZW1lbnRbJ2Jhc2VuYW1lJ107CgkJCWlmKCFjbGFzc19leGlzdHMoJGNsYXNzTmFtZSkpewoJCQkJT3JtVHJhY2U6OmRlYnVnKCJpbXBvcnRpbmcgRW50aXR5ICIuJGNsYXNzTmFtZS4iIGludG8gdGhlIG1vZHVsZSAiLiR0aGlzLT5nZXROYW1lKCkpOwoJCQkJcmVxdWlyZV9vbmNlKCRiYXNlbmFtZSk7CQoJCQl9CgoJCQl0cnl7CgkJCQkkZW50aXR5ID0gbmV3ICRjbGFzc05hbWUoKTsKCQkJfSBjYXRjaChPcm1JbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAkb2NlKXsKCQkJCSRlcnJvcnNbJGNsYXNzTmFtZV0gPSAkb2NlOwoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJCWZvcmVhY2goJGxpc3RlWydhc3NvY2lhdGUnXSBhcyAkZWxlbWVudCkgewoJCQkkY2xhc3NOYW1lID0gJGVsZW1lbnRbJ2NsYXNzbmFtZSddOwoJCQkkZmlsZW5hbWUgPSAkZWxlbWVudFsnZmlsZW5hbWUnXTsKCQkJJGJhc2VuYW1lID0gJGVsZW1lbnRbJ2Jhc2VuYW1lJ107CgkJCWlmKCFjbGFzc19leGlzdHMoJGNsYXNzTmFtZSkpewoJCQkJT3JtVHJhY2U6OmRlYnVnKCJpbXBvcnRpbmcgQXNzb2NpYXRlIEVudGl0eSAiLiRjbGFzc05hbWUuIiBpbnRvIHRoZSBtb2R1bGUgIi4kdGhpcy0+Z2V0TmFtZSgpKTsKCQkJCXJlcXVpcmVfb25jZSgkYmFzZW5hbWUpOwkKCQkJfQoKCQkJdHJ5ewoJCQkJJGVudGl0eSA9IG5ldyAkY2xhc3NOYW1lKCk7CgkJCX0gY2F0Y2goT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gJG9jZSl7CgkJCQkkZXJyb3JzWyRjbGFzc05hbWVdID0gJG9jZTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvL1Byb2Nlc3MgYWxsIHRoZSBlcnJvcnMKCQlpZighZW1wdHkoJGVycm9ycykpewoJCQllY2hvICc8aDMgc3R5bGU9ImNvbG9yOiNGMDAiPlNvbWUgT3JtSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaGF2ZSBiZWVuIHRocm93bjwvaDM+JzsKCQkJCgkJCWZvcmVhY2ggKCRlcnJvcnMgYXMgJGNsYXNzTmFtZSA9PiAkZXJyb3IpIHsKCQkJCWVjaG8gJzxoND5FbnRpdHkgJy4kY2xhc3NOYW1lLicgPC9oND48b2w+JzsKCQkJCWZvcmVhY2ggKCRlcnJvci0+Z2V0TWVzc2FnZXMoKSBhcyAkbWVzc2FnZSkgewoJCQkJCWVjaG8gJzxsaT4nLiRtZXNzYWdlLic8L2xpPic7CgkJCQl9CgkJCQllY2hvICc8L29sPic7CgkJCX0KCQkJCgkJCWV4aXQ7CgkJfQoKCQlyZXR1cm4gJGxpc3RlOwoJfQoKCS8qKgogICAgICogQW4gZXh0ZW5kZWQgYXV0b2xvYWQgbWV0aG9kLgogICAgICogU2VhcmNoIGZvciBjbGFzc2VzIGEgPG1vZHVsZT4vbGliL2NsYXNzLmNsYXNzbmFtZS5waHAgZmlsZS4KICAgICAqIG9yIGZvciBpbnRlcmZhY2VzIGluIGEgPG1vZHVsZT4vbGliL2ludGVyZmFjZS5jbGFzc25hbWUucGhwIGZpbGUuCiAgICAgKiBvciBhcyBhIGxhc3QgZGl0Y2ggZWZmb3J0LCBmb3Igc2ltcGxlIGNsYXNzZXMgaW4gdGhlIDxtb2R1bGU+L2xpYi9leHRyYWNsYXNzZXMucGhwIGZpbGUuCiAgICAgKiBUaGlzIG1ldGhvZCBhbHNvIHN1cHBvcnRzIG5hbWVzcGFjZXMsICBpbmNsdWRpbmcgPG1vZHVsZT4gYW5kIDxtb2R1bGU+L3N1YjEvc3ViMiB3aGljaCBzaG91bGQgZXhpc3QgaW4gZmlsZXMgYXMgZGVzY3JpYmVkIGFib3ZlLgogICAgICogaW4gc3ViZGlyZWN0b3JpZXMgYmVsb3cgdGhlIDxtb2R1bGU+L2xpYiBkaXJlY3RvcnkuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzc25hbWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGF1dG9sb2FkKCRjbGFzc25hbWUpCiAgICB7CiAgICAgICAgaWYoICFpc19vYmplY3QoJHRoaXMpICkgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvLyBjaGVjayBmb3IgY2xhc3Nlcy4KICAgICAgICAkcGF0aCA9ICR0aGlzLT5HZXRNb2R1bGVQYXRoKCkuJy9saWInOwogICAgICAgIGlmKCBzdHJwb3MoJGNsYXNzbmFtZSwnXFwnKSAhPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICR0X3BhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCcvJywkY2xhc3NuYW1lKTsKICAgICAgICAgICAgaWYoIHN0YXJ0c3dpdGgoICR0X3BhdGgsICR0aGlzLT5HZXROYW1lKCkuJy8nICkgKSB7CiAgICAgICAgICAgICAgICAkY2xhc3NuYW1lID0gYmFzZW5hbWUoJHRfcGF0aCk7CiAgICAgICAgICAgICAgICAkdF9wYXRoID0gZGlybmFtZSgkdF9wYXRoKTsKICAgICAgICAgICAgICAgICR0X3BhdGggPSBzdWJzdHIoJHRfcGF0aCxzdHJsZW4oJHRoaXMtPkdldE5hbWUoKSkrMSk7CiAgICAgICAgICAgICAgICAkcGF0aCA9ICR0aGlzLT5HZXRNb2R1bGVQYXRoKCkuJy9saWIvJy4kdF9wYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZm4gPSAkcGF0aC4iL2NsYXNzLnskY2xhc3NuYW1lfS5waHAiOwogICAgICAgIGlmKCBmaWxlX2V4aXN0cygkZm4pICkgewogICAgICAgICAgICByZXF1aXJlX29uY2UoJGZuKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBmb3IgaW50ZXJmYWNlcwogICAgICAgICRmbiA9ICRwYXRoLiIvaW50ZXJmYWNlLnskY2xhc3NuYW1lfS5waHAiOwogICAgICAgIGlmKCBmaWxlX2V4aXN0cygkZm4pICkgewogICAgICAgICAgICByZXF1aXJlX29uY2UoJGZuKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBmb3IgYSBtYXN0ZXIgZmlsZQogICAgICAgICRmbiA9ICR0aGlzLT5HZXRNb2R1bGVQYXRoKCkuIi9saWIvZXh0cmFjbGFzc2VzLnBocCI7CiAgICAgICAgaWYoIGZpbGVfZXhpc3RzKCRmbikgKSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSgkZm4pOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CgogICAgICAgIC8vIGNoZWNrIGZvciBpbnRlcmZhY2VzCiAgICAgICAgJGZuID0gJHBhdGguIi9jbGFzcy5lbnRpdHkueyRjbGFzc25hbWV9LnBocCI7CiAgICAgICAgaWYoIGZpbGVfZXhpc3RzKCRmbikgKSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSgkZm4pOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCgkvKioKICAgICAqIFdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSB3aWNoIG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICoKICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgdGhlIGRpcmVjdG9yeQogICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4KICAgICAqCiAgICAgKiBAcmV0dXJuIE1peGVkW10gbGlzdCBvZiBmaWxlcwogICAgICoqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGaWxlc0luRGlyKCRkaXJlY3RvcnksICRwYXR0ZXJuLCAkcmVjdXJzaXZlID0gVFJVRSl7CiAgICAgICAgJGZpbGVzID0gYXJyYXkoKTsKICAgICAgICBpZighaXNfZGlyKCRkaXJlY3RvcnkpKXsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICgkaGFuZGxlID0gb3BlbmRpcigkZGlyZWN0b3J5KSkgewogICAgICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZW50cnkgPSByZWFkZGlyKCRoYW5kbGUpKSkgewogICAgICAgICAgICAJaWYoJGVudHJ5ID09ICIuIiB8fCAkZW50cnkgPT0gIi4uIil7CiAgICAgICAgICAgIAkJY29udGludWU7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICBpZiAoIWlzX2RpcigkZGlyZWN0b3J5LicvJy4kZW50cnkpICYmIHByZWdfbWF0Y2goICRwYXR0ZXJuICwgJGVudHJ5KSkgewogICAgICAgICAgICAgICAgICAgJGZpbGVzWyRkaXJlY3RvcnkuJy8nLiRlbnRyeV0gPSAkZW50cnk7CiAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZigkcmVjdXJzaXZlICYmIGlzX2RpcigkZGlyZWN0b3J5LicvJy4kZW50cnkpICkgewogICAgICAgICAgICAgICAgCSRmaWxlcyA9IGFycmF5X21lcmdlKCRmaWxlcywgCiAgICAgICAgICAgICAgICAJIAkJc2VsZjo6Z2V0RmlsZXNJbkRpcigkZGlyZWN0b3J5LicvJy4kZW50cnksICRwYXR0ZXJuLCAkcmVjdXJzaXZlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2VkaXIoJGhhbmRsZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZmlsZXM7CiAgICB9CgkKCS8qCglmdW5jdGlvbiBTZWFyY2hSZWluZGV4KCYkbW9kdWxlID0gbnVsbCkgewoJCS8vT24gw6l2aXRlIGRlIHMnYXV0by1pbmRleGVyLgoJCWlmKCR0aGlzLT5nZXROYW1lKCkgPT0gJ01tbWZzJykKCQkJcmV0dXJuOwkJCgkJCQoJCS8vIE9ybUluZGV4aW5nOjpzZXRTZWFyY2goJG1vZHVsZSk7CgkJT3JtSW5kZXhpbmc6OlNlYXJjaFJlaW5kZXgoJHRoaXMtPmdldE5hbWUoKSk7Cgl9Ki8KCgkvKioKCSAqIEFwcGVsw6llIHBhciBTZWFyY2ggcG91ciBhZmZpY2hlciB1biByw6lzdWx0YXQKCSAqLy8qCglmdW5jdGlvbiBTZWFyY2hSZXN1bHQoJHJldHVybmlkLCAkZW50aXR5SWQsICRhdHRyID0gJycpIHsJCgkJLy9PbiBuZSByZXRvdXJuZSByaWVuIGRlIE1tbWZzIGRlIHRvdXRlIG1hbmnDqHJlCgkJaWYoJHRoaXMtPmdldE5hbWUoKSA9PSAnTW1tZnMnKQoJCQlyZXR1cm47CQoJCQoJCXJldHVybiBPcm1JbmRleGluZzo6U2VhcmNoUmVzdWx0KCR0aGlzLCAkaWQsICRyZXR1cm5pZCwgJGVudGl0eUlkLCAkYXR0cik7Cgl9Ki8KCn0gCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0eWxlPgoJbGFiZWwuaGVscHsKCQkKCX0KCQoJZGl2LmxlZnR7CgkgICAgZmxvYXQ6IGxlZnQ7CgkJdGV4dC1hbGlnbjogY2VudGVyOwoJCXdpZHRoOiA1MHB4OwoJfQoJCglkaXYucmlnaHR7CgkJYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQ0NDQ0NDOwoJCWZsb2F0OiBsZWZ0OwoJCXBhZGRpbmctbGVmdDogNXB4OwoJfQoJLm9ybWJ1dHRvbiB7CgkJY2xlYXI6IGJvdGg7CgkJdGV4dC1hbGlnbjogbGVmdAoJfQoJYS5vcm1idXR0b257CgkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCXBvc2l0aW9uOiByZWxhdGl2ZTsKCQltYXJnaW46IDEwcHggMDsKCQlsaW5lLWhlaWdodDogMjZweDsKCQljb2xvcjogIzIzMjMyMzsKCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgkJcGFkZGluZzogMXB4IDhweCAycHggMjBweDsKCX0KCWEub3JtYnV0dG9uIC51aS1pY29uIHsKCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJbGVmdDogMDsKCQl0b3A6IDZweDsKCX0KCWEub3JtYnV0dG9uOmhvdmVyIHsKCQljb2xvcjogI2ZmZgoJfQo8L3N0eWxlPgoKCnskZm9ybXN0YXJ0Y2FjaGV9CgoJPGgzPlNlbGVjdCB0aGUgdHlwZSBPZiBDYWNoZTwvaDM+Cgk8ZGl2IGNsYXNzPSdsZWZ0Jz48aW1nIHNyYz0nZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBSUVVbEVRVlJZaGIyWGEzQ1UxUm5ISCt0dHBxMGpWa3huMmk4ZGU5TnFsYW10dERpQ2VFSHJXR3NkMitrNDZyUlRuWGFjcWd4YW9MVWlsWnNobWtDV0JCSWcyU1FrSVJBQzB0d0RKTm5OYm5henQrejkrdTRtdTdtUUc3RFpFSEwvOVVNV2hxQWtnak45WnY2Znpqdm4rYi9ubk4vem5DTXlOMjVJeThsYm1ybS9lRXVXdXN5UnBUNFl6UzQ4eEpkUmx2cGdORXRkNXNqY1g3d2xMU2R2cVlqY0lOY1FONnJ5U2xLeml3NVJWRkZEWmFNQnZkMVBtMXNoMGhjbmZQcmN2SXIweFdseksranRmaW9iRFJSVjFKQmRlQWhWWGttcWlOeTRVUEtiTXZPS2p4Y2NxY0xrRHVQdDdNTWQ2Y1VWN3NHcGRPTlV1bkdFdXViVnhlOWM0Ujdja1Y2OG5YMjBCNklVSEtraU02LzR1SWpjTkorQjI3SUx5N0I0T2pCN09qQzV3N1M1bEs4a2t6dU0yUlBCNHVrZ3U3QU1FYmx0UGdOM3FmSkxVTG9IMFpqZGFNeHV0QllQV3F1WGxtdVUxdXBGYS9GY21rZnBIa1NWWDRLSTNEV2ZnUlJWWGdubnB5QVk2NmZKNktST2E2RmVaNlZCWjZWQmIrUEVBbXJRMjJqUVdhblhXYW5UV21neU9nbkcramsvQlRrSERpTWlLZk1ieUMraDBXQmpjR1NNa1FrWUdCNGpFTzNER1lpaHQzblJtRnp6U20vejRnekVDRVQ3R0JpZW5lUDB1UkVhRGJhTEs3Q0FBWFVwMWFkYXFXelVvekU1Y0FhalJQdlAwWHNtUVdKaW11SHhhWWJIcG9tUFRjM1I4TmpzV0dKOG10NHpDYUw5WjNHR29tak5UcW9iVzZscE5LQlNseTVzWUZkK0NiVk5CbW8xUnVxMVprN3FyVFFhSEdoTmJ2UldQMjJPRUZaUEJ3NS9ESTl5R20rNEgyZWdHNXUzRTdOTG9kVVdvTVhzb2NubzVGU3JqWVlXQzNXYU51cWEyMURsZndrRHFyeGk2cHFOMUduYk9LR3owR2hvbjExYXF4ZWpQWWpGSGFiZEY4VVY3TVliN3NNWDZjY2Q2c0h1ajJIMVJHaHpoTkRiZkdqTUhocU5UazYydGxPbnRWQ3JNYk1qcjJ4QkE0czNwdTJvUFZCUlRYMkxpWk42SzAxRyt3SUdCdVlhY0liUjJ4V2FiUkZPbWtQVUd3TlU2endVVjdXeVptdjJVUkZaUEorQlJSK2w3YXdxS3ErazhFZ1Z0YzFHTkNZbkxSWVBoblkvSnFlQ3pSUEI3by9oRHZYZ2kvVGo3eGpFby9UaUNIUmg4M1hTNXVyRXBLMURVUzBqcUZwT1VMV1MwSzRuVUxLZVJNbCttdUR1Wndua1BFOXczNHNFODE1Q1JHNlpZeUFqdDVDdWdUZ2xSMnZZdWErWVBZV0hLVHZld0dmMU9ob05kalFtTnpadko5N3dhUUtkZ3dTalovQkYrbkNGZXREYkFwd3krVEFleTJLbzVVT1k5RExSazhsRWIzWlNLaWFIU2hrZlBJWXY1M2tPcmx1K1hxNG9USXZUYzlWb1RVNzY0NlBFK3M1aWNRZW8xN1J4K0w4bktEaGNTY0doU29yS3F5bXBxS1hrV0QwSGp6VlFYRkZIVVhrTkJZZHJVQjg1aVNiM1RVWUMreGp2elNmZXRwSzQ2U25pcGllSlc1NWhaa0loV3ZFQ3hveG5RaUp5ajRoOGZjNGh6TWhWVTlOa29McXBsUmFMQzQvU1JmZlFNUDN4VWM1UHdjamtyQklUTXlRbXBwT2FZV1JpaHBFcEdBR0NCYTh3ZWZZVUk3NTNpTnVlSTI3N0xYSHJjNHoxN0NmaGZ4LzNybWRZODd0N1gwdWVoNi9OTVpDZXE2YTIyVWl0eGtoRGl6bDVFQjIwbU4yMDJ2eVluQ0dzbms0Yy9pNDhTdDlsR0VZeHV6dlJ1ZnJ3cTM0T28yYUcyMy9Ec1AwbGhoMi9KK0Y2aFltaE1qckxmMDNENWhXblJPUnVFYm4xY3hobTVLaG51YjBPREMyK0xremFFNFNMbm1keXFJS0U4dzhrWEMrVGNMM01oY2dHRXU2LzRsS3Q0dHQzM3J4VVJHNlhMN2duTEg1L1MxcnRnYU0xMU91dUZjTXVMUDVlckZWN09GMy9PdVBkYVl5NFgyWEU4eWZPZS8vQ1dNZGFsTkxuMlAvV1F6dEY1THR5bGJhODZOOWJQNjA2VUY1MVZReXRWOEhRSHVqR0V1akRXcnFXcythMWpIWDhpL1ArMXpudmY0UFI0QnRFajcrQWJmdWp0S2V2d0o2eEFrZkdZemd5SDhlVjlSVHUzVTlmd25GUld0WmV1Z2FIS1RsYWUxVU1uY0h1ejJPb25NYmtHOEMrNTBWR1F4dTVvS3htTlBUM3BONWtjaUNmcWFGOHBzK29tVDZyaG5naDArZUtDQlk5aTI3NzhwUEpMWkhGMjdOeTBacm54N0R3U2d5UDFGRlVYa2YrVVEzT2orOW51djlESm1Qdk1oRjlqL0hPTll5RjMrYUM4aFlYbExjWkM3L05lTWRxeGlLcjhlMWZSZFdHaDV0RjVNR0w5U0FsTlN2MytqQ2NuRVhRc2ZWdWxQeGxoUElmSlpEL0dONjlLNWdlcm1hc2F4c1hPdjdCZUd3OTQ5RjFlUGM5UmVVSEQydEU1R2N5ZTBtNVNVUWtaZnV1M092RDBCZkQ3SWxpY1BlaWMvYlNhTzlEVTFsRXFPaHhtT2xockhNZEU5MGJHUEc5aDJ2M1NyYTllczlXRVZtU3JBV1hMcXNwcWFxYzY4Wnd0aHVHYWJVck5MZkhhTnY5RWtQR05jeWNPOGhVMzM4WURheWpmY2N5UG43dFIxdEU1RjRSdWVOS0dsSlNkK1ZRMDJ5NDFBMFhObkJGTjNRb3ROb1Z0QVl6MWsxM014T3ZZR2J3RXk2RTFtUE9lSlRVVjcrL1dVUituTnp6T1ZWUVJPU3U5emR0YTk2NVYwMU5zNEhtTmdjYWt4T2QxZnVGR1BvN0JnaDBYdFlOdlIyWVhCRmFYVEVNNVp2eDdQa1ZqSlV5SHZrQWEvb3YyZmpoK3Via24zOWhja2tPUFBEbW12VUh0KzNjemM2OUJSUWMrb3pLRXpycXRTYmFmVEZjb1c2OGtYNUMwU0VpUGNOMDlDWlF1czdnNnhqQXJmVFNIdWlsU3UvSG12RUlROGJWVFBTazRVaGZ3ajlYLzdra2VkcnZ1RnB5U2U3SG5TSnluNGdzWC9Ia3FyZis5czY3cFI5czJ4N1orSEY2LzVhTVhXeE9WN0U1UFpOTjZabHMrdlF5cGF2NEtHTTNHM2Jra2ZISnh2SDI3VDhoV3YwSytyUmY5RDl4M3pmL0tDTDNpOGkzcmxZQkw0OGJSZVFiTW50MStwNkkvRlJFbG9ySWNoRlpLU0pQTEtCVkZXdC9VRy83WkFtNnJROE1pc2dqeVhsdWt5L3hOTHM4YmhDUm01Tm03cEJaWEZJVzBxMjN5Zyt0bnk3QmtQcGdRa1NXaWNoM1pMYk1YdE1EOWF2RTdUSzdhZzhsazkvOC8wcDhNVzRSa1VWSlhWUHkvd0VzYmhCSWZLWXY5Z0FBQUFCSlJVNUVya0pnZ2c9PScgLz48L2Rpdj4KCTxkaXYgY2xhc3M9J3JpZ2h0Jz4KCQl7JHNlbGVjdENhY2hlfXskZGVsZXRlQ2FjaGV9PGxhYmVsIGZvcj0neyRpZH1jYWNoZScgY2xhc3M9J2hlbHAnIC8+TGVhcm4gbW9yZSBhYm91dCB0aGVzZSBvcHRpb25zIG9uIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tcy93aWtpL01lY2hhbmlzbS1BZHZhbmNlZCcgdGFyZ2V0PSdfYmxhbmsnPnRoZSB3aWtpPC9hPi48L2xhYmVsPgoJPGJyLz4KCXskc3VibWl0fQoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSdjbGVhcic+PC9kaXY+CjwvZGl2PgoKPC9mb3JtPgp7JGZvcm1zdGFydHRyYWNlfQoKPGRpdiBjbGFzcz0nbGluZSc+Cgk8aDM+U2VsZWN0IHRoZSBsZXZlbCBvZiBtZXNzYWdlIGludG8gdGhlIGNvbnNvbGU8L2gzPgoJPGRpdiBjbGFzcz0nbGVmdCc+PGltZyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUg0RWxFUVZSWWhiV1h5VzhiNXhuR0JlVFVTdzl0RDEzY0JnaUNKSUt6M0pNQUFaSUFRUkRrSDhpNTZLRm9Ea0VEdXhhQ0pvY0FDWkRXc0pFaWhvM0FzbVRacGhhS3RDMWJvcFpZSWpWYUtISGZSRW1rUkk3SUlZZmJrSndaY29iTHJ3ZGJnaHpiTVZPZ0gvQWN2dFB6Kzc3bmZkOXZwcS92NGZYTW0yKysrYWQzMzMzM3VmK0hYbi85OVdmNyt2cWU2WHZTNnUvdi85MkZDeGRHUFI1UDVJR2lEM1MwOTNxOVVaL1BGL0g1ZkpGQUlCQU5Cb1BSWURBWUNZVkNrVkFvRkEyRlF0RndPQndKaDhPUDdDOWR1alQrMm11di9lR0pBSysrK3VxSkd6ZHVDSWxFZ3VOS0pwUHM3ZTJSU3FWSXA5T0lva2dta3lHYnpTSkpFcmxjam53K1R6NmZSNVpsQ29YQ1kyVzFXbGY3Ky91ZmZUckE3aTZKM1YwU2lRUjdlM3ZzNys4LzF2alE4TkMwV0N4U0twVW9sVXFVeStVZnE5czdRQ0pCMG5LZC9lc2pwQzUvanhpSklINTdqc3pJTUpsdnZrWVUwOXlldWswb0ZNVHI5VEE3TjBza0VpRVE4T1AxZWhCRkVZL1hnOWZuWlZsWXBscXRVcTFXdTVPVGs3MEJKSk5KOXU5TWtiNHpoVGd5UkNZWUpITjlCR25wSHJrYkl5UVN1OHpOeitGMExoR05SbkU2bC9ENy9RZ3JBajYvajJReXljYUdtM1gzT3V2cmF5aUtncXFxMk8zMnB3TllMQmJoOE1vUERnNGV1dTVDb1hCMHZaVktoV3ExU3ExV28xNnZvNm9xbXFhaGFScTZycVByT28xRzR5SGR2SG56NlFCalkyUENjZk5jTG9jc3kwZjVWaW9WRkVWNXhQalFzTmxzWWhqRzQ5VHRHZURnNElETS9DelMvQ3k1Mjdjb2lpS3lkWXppdklQU3hCaVZTb1cxOVZWeStSeXBkSXB3T0VSZXpwUEw1OGhLV2VyMSt2M2lUZTNqOVhtbzErdVlwdGtid1BqNHVKRE5acEh1VHBHN2ZSTjVZb3h5TWtuaDJqQ1ZwVVZLZzk5emtEbmc3dlFkbkM0bk96czdMQzdldysvMzRWcDJzdTVlSjVYYXg3M2habTF0RmEvUFE3UFpvTjF1Yyt2V3JkNEFjcmtjc2loU3ltWXBKM1pSSkltYWxFV1ZaVFJaUHNxNlZxdWhLQXJsY2hsZDE2blg2K2k2am1FWU5Kc05tczBHeFdLUlZxdEZwOVBwSFVDVzVhTzhxOVVxOVhvZFRkTWV5dGcwVFZxdEZxMVdpM2E3VGJ2ZHB0UHAvSlM2UFFGTVRFd0l4V0tSb3M5SE9SaEFXVjFCcTFhcHJRcG8wU2pxMmdxR1liQ3pzMzEwNmtKQlJsVlZHbzBHdXE1am1nYXlmTDlyWXJFb2pVYURkcnZkTzBDNVhLWTRmWWZ5TFRzVm14Vk5US01NWDZIdW1FYTUrQjJGUW9HNStWbFcxMWFKUmlNNEhETUVnZ0ZjTGllQ3NNeisvaDZibmszVzNldTRYRTRVcFlKcG1yMjFvZFZxRlNxVkN0VjBpdnFCaUxvZHAxRXEwZGpmdzVCbERER05ydXRJa2tTaFVLQlNxU0JKRXBWS2hYdytSNmxVb2xxdElrbFpNcGtNb2lpaXFpcTZydmNPY0ppN3J1dVBaSDQ4NjNhN1RhdlZ3alJORE1NNGlrRFROT3IxK3BFZXpJeHVUNVBRWnJNSnRWb05OWk5CejBrMFV2dVloa0V6bmNJc0ZUSEZOSjFPaDJLeGVHUjZPQkVQdTBKUkZDUkpRcElrUkZGRWx1WGVIeU9ielNhb3FrcDF6a0Z0K2c3MW1UdVlwUksxYThOb00zZXBmdmN0aXFJdzQ1Z2hFUEFUaTBXWm01OGxFUEN6c3JxQ3krVWt2aDFuV1hEaGRDMHhQakZHUEI0bm44LzM5aHpiYkRaQjB6UzBXQlE5SGtOekxXRklXUm9iNnhqSkJBMnZoNHBTSWJZVlkyc3JSaUt4aThmcllYczdqdGZuSlJ3T3M3MjlqY2V6aWR1OXpyS3d6TmJXRnFJb01qWTIxaHZBNFRCNVhPNkhtVGViVFZSVnBWcXRVaTZYS1JRS1NKTEV3Y0VCcVZTS1pETEp6czRPOFhpY2VEek85dloyMTJLeDlBYlFhRFF3VkJWVDB6RHI5ZnNGcDJtMEdnMk1hcFZtczRtaUtFZm0rWHllVENaRE9wMG1rVWdRaThYd2VyMnNyYTJ4dExTRUlBaXNycTUycjE2OTJodEFzOWxFZFM2aTNWdEFkVXpUS3BkUXgwZFJIWGRSaGk2aktBcjNGbjhnRm92aThYcVltWmxtYzNNVHA5T0p3ekhEd3NJQ282TVdob2VIK1BmWmZ6RStQbzdkYnVmU3BVdFBCN0RiN1lKaEdHZ2JiblQzT3VyTVhWcjVQTnIwRkxyZlM5VnVKWlBOTUw5dy80TWtHQXd3Tyt0Z2NXbVJTZHNrWStPalhMOStqZlBuei9IVjExL3grUmYvNVB6NTh3d05EWFcrL1BMTHVaZGZmdm1QUFFHWWhrSExOR2tiQnAxV2k1WmhZRGFiTkZTVmVyMU91VnhHbG1YRUE1RkVJa0U0SE1ibGNtRzMyN0ZZTEl5UGoyT3oyWmlmbis4dUxDeDBMMXk0RUhycnJiZitjdUxFaVYvMEJQQzQ0ak1NQTEzWHFkVnFSOW1Mb3NqT3pnNGJHeHRNVDA4ek9EakkydG9hcG1sU0xwZTdQcCt2Yy9ueTVkQWJiN3p4NStlZmYvNlhUelEvRG1DYUpvMmRiWnE3T3pUOVh0cTZqdTVlUjQ5R3FBb3VGRVhCNy9lUlRxZUpSQ01JS3dJTEN3dFlMQmJPblR2SDV1WW1wVktKUUNEUXZYcjE2dFk3Nzd6ejE1TW5ULzdxSjgxL0RLRCtzSURtbUVhYnVVdXJYS0k2TWtSdDFrSHBQK2RKcDFOTVRrNHc0NWhoWlVYZzJ2VVJScTZOOE0yL3Z1R0xMejdISC9BVENBUzZvNk9qZTIrLy9mYmZYbnJwcFY4LzFmekhBSVlzWXhZTEdJbGRXdVV5emRRK0RTbExMYkZMb1NDVFNPd1MyNG9SQ0FaWVdscGthbXFLaXhjdmN2YnMyYTdiN2U1T1RFeWtQdmpnZzlNOW5meHhBTWRyb04xdVB6UjhGRVdoVUNpUXlXUklKcE1FQWdIbTV1WVlIaDd1WHJseXBUc3hNYkgzL3Z2di8vMkZGMTc0VGMvbVR3RG9kanFkN3JFaTdHcWExajFXaE4xME90M2QydHBDRUFUc2RudDNjSEJ3NzhNUFAvekh5Wk1uZi91enpQdjY3ditjZnZUUlI5OE5EQXhZUC92c3MwYzBNREJnSFJnWXNKNDVjOFo2NXN3WjYrblRwNjJuVHAyeWZ2cnBwOVpQUHZuRSt2SEhIMXZmZSsrOVV5KysrT0x2ZjdiNWcvVk1mMy8vczYrODhzcHovNnQrVnVaOWZYMy9CWFB5cFJ2U0RZNDZBQUFBQUVsRlRrU3VRbUNDJyAvPjwvZGl2PgoJPGRpdiBjbGFzcz0ncmlnaHQnPgoJCXskc2VsZWN0TG9nfXskZGVsZXRlTG9nfTxsYWJlbCBmb3I9J3skaWR9bGV2ZWwnIGNsYXNzPSdoZWxwJyAvPkxlYXJuIG1vcmUgYWJvdXQgdGhlc2Ugb3B0aW9ucyBvbiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vYmVzc3Rpb2xsZS9vcm0tbXMvd2lraS9sb2ctbWFuYWdlbWVudCcgdGFyZ2V0PSdfYmxhbmsnPnRoZSB3aWtpPC9hPi48L2xhYmVsPgoJPGJyLz4KCXskc3VibWl0fQoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSdjbGVhcic+PC9kaXY+CjwvZGl2PgoKPC9mb3JtPgoKPGhyLz57Kgo8dWw+PGxpPjxiPkRFQlVHIDo8L2I+IEV2ZXJ5dGhpbmcgd2lsbCBiZSB3cm90ZS4gRVZFUllUSElORyAhPC9saT4KPGxpPjxiPklORk8gOjwvYj4gdGhlIGRlZmF1bHQgdmFsdWUuIEdyZWF0IGZvciBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuPC9saT4KPGxpPjxiPldBUk4gOjwvYj4gd2lsbCBiZSBkaXNwbGF5ZWQgOiB0aGUgZXJyb3JzIGFuZCB0aGUgd2FybmluZ3MuPC9saT4KPGxpPjxiPkVSUk9SIDo8L2I+ICB3aWxsIGJlIGRpc3BsYXllZCA6IHRoZSBlcnJvcnMuPC9saT48L3VsPgo8dWw+PGxpPjxiPk5PTkUgOjwvYj4gd2Ugd29uJ3QgdXNlIGNhY2hpbmcgc3lzdGVtIDogR3JlYXQgZHVyaW5nIHlvdXIgZGV2ZWxvcG1lbnQ8L2xpPgo8bGk+PGI+Q0FMTCA6PC9iPiB0aGUgZnJhbWV3b3JrIHdpbGwgdHJ5IHRvIHJlbWVtYmVyIHRoZSBsYXN0IHJlc2VhcmNoIGJ1dCBvbmx5IGZvciB0aGUgY3VycmVudCBjYWxsIG9mIFBIUC48L2xpPjwvdWw+Kn0KCjxwcmUgaWQ9J291dHB1dCc+PC9wcmU+CntsaXRlcmFsfQo8c2NyaXB0PgoKZnVuY3Rpb24gZG9VcGRhdGUoKSB7CiQuYWpheCh7dHlwZTogIkdFVCIsIHVybCA6ICJ7L2xpdGVyYWx9eyR1cmxMb2d9e2xpdGVyYWx9IiwgY2FjaGU6ZmFsc2UsCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gNCkgewogICAgICAgICAgICAgICAgLy8gRGF0YSBhcmUgYXNzdW1lZCB0byBiZSBpbiBIVE1MIGZvcm1hdAogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHNvbWV0aGluZyBsaWtlIDxwLz4gaW4gY2FzZSBvZiBubyB1cGRhdGVzCiAgICAgICAgICAgICAgICAkKCIjb3V0cHV0IikudGV4dChkYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldFRpbWVvdXQoImRvVXBkYXRlKCkiLCAyMDAwKTsKICAgICAgICAgICB9fSk7CiAgCn0KCnNldFRpbWVvdXQoImRvVXBkYXRlKCkiLCAyMDAwKTsKPC9zY3JpcHQ+ey9saXRlcmFsfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
</module>
