<?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>ListIt2Amazon</name>
	<version>1.0</version>
  <mincmsversion>1.11</mincmsversion>
	<help><![CDATA[PGgzPlVzYWdlPC9oMz4gICAgICAKICAgIDxwPlRvIGRpc3BsYXkgeW91ciBmaWxlbmFtZSBzaW1wbHkgYWRkOjxiciAvPjxiciAvPjxzdHJvbmc+eyRpdGVtLT5hbGlhc308L3N0cm9uZz48YnIgLz48YnIgLz5vcjxiciAvPjxiciAvPjxzdHJvbmc+eyRpdGVtLT5maWVsZGRlZnMuYWxpYXMtPkdldFZhbHVlKCl9PC9zdHJvbmc+PGJyIC8+PGJyIC8+PC9wPgoJPHA+VG8gYWRkIGEgbGluayB0byB5b3VyIGZpbGUgYWRkOjxiciAvPjxiciAvPjxzdHJvbmc+eyRpdGVtLT5maWVsZGRlZnMuYWxpYXMtPkdldFVSTFZhbHVlKCl9PC9zdHJvbmc+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBPbGl2ZXIgU2VkZG9uICZsdDtvbGl2ZXJAdGhyZWVmb2xkLmNvLnVrJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMDxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjxoMz5WZXJzaW9uIDEuMDwvaDM+Cjx1bD4KICAgIDxsaT5Jbml0aWFsIHJlbGVhc2UuPC9saT4KPC91bD48YnIgLz4=]]></about>
	<description><![CDATA[ListItExtended Amazon S3 module]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/changelog.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPlZlcnNpb24gMS4wPC9oMz4KPHVsPgogICAgPGxpPkluaXRpYWwgcmVsZWFzZS48L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBNb2R1bGUKJGxhbmdbJ21vZHVsZV9mcmllbmRseW5hbWUnXSA9ICdMaXN0SXRFeHRlbmRlZCBBbWF6b24nOwokbGFuZ1snbW9kdWxlX2Rlc2NyaXB0aW9uJ10gPSAnTGlzdEl0RXh0ZW5kZWQgQW1hem9uIFMzIG1vZHVsZSc7CgojIEdsb2JhbAokbGFuZ1snc2VsZWN0X29uZSddID0gJ1BsZWFzZSBzZWxlY3Qgb25lJzsKJGxhbmdbJ2RpciddID0gJ0RpcmVjdG9yeSc7CiRsYW5nWydhbGxvd2VkJ10gPSAnQWxsb3dlZCc7CiRsYW5nWydleGNsdWRlX3ByZWZpeCddID0gJ0V4Y2x1ZGUgcHJlZml4JzsKJGxhbmdbJ3NpemUnXSA9ICdTaXplJzsKJGxhbmdbJ21heF9sZW5ndGgnXSA9ICdNYXggTGVuZ3RoJzsKJGxhbmdbJ3JlcXVpcmVkX2ZpZWxkX2VtcHR5J10gPSAnUmVxdWlyZWQgZmllbGQgaXMgZW1wdHknOwokbGFuZ1snc2V0dGluZ3NfZXJyb3InXSA9ICdZb3VyIGFjY291bnQgaW5mbyBpcyBub3QgY29tcGxldGUuIFBsZWFzZSBjb3JyZWN0IGl0Lic7CiRsYW5nWydjb25uZWN0X2Vycm9yJ10gPSAnV2UgaGF2ZSBub3QgYmVlbiBhcmUgdG8gY29ubmVjdCB1c2luZyB5b3VyIGRldGFpbHMuIFBsZWFzZSBtYWtlIHN1cmUgdGhleSBhcmUgY29ycmVjdC4nOwokbGFuZ1snZXJyb3JfZmFpbGVkX3RvX3VwbG9hZCddID0gJ1lvdXIgdXBsb2FkIGZhaWxlZCc7CgokbGFuZ1snZmllbGRkZWZfc2l6ZV9oZWxwJ10gPSAnU3BlY2lmeSBzaXplIG9mIGlucHV0IGZpZWxkLiBGb3IgZXhhbXBsZTogMjAnOwokbGFuZ1snZmllbGRkZWZfbWF4X2xlbmd0aF9oZWxwJ10gPSAnU3BlY2lmeSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmllbGQuIEZvciBleGFtcGxlOiAyNTUnOwoKIyBBbWF6b25TMwokbGFuZ1snZmllbGRkZWZfQW1hem9uUzMnXSA9ICdBbWF6b24gUzMgVXBsb2FkIEZpbGUnOwokbGFuZ1snZmllbGRkZWZfQW1hem9uUzNfYWNjZXNza2V5J10gPSAnQWNjZXNzIEtleSc7CiRsYW5nWydmaWVsZGRlZl9BbWF6b25TM19hY2Nlc3NzZWNyZXQnXSA9ICdBY2Nlc3MgU2VjcmV0JzsKJGxhbmdbJ2ZpZWxkZGVmX0FtYXpvblMzX2RpciddID0gJ0RpcmVjdG9yeSBwYXRoJzsKJGxhbmdbJ2ZpZWxkZGVmX0FtYXpvblMzX2J1Y2tldCddID0gJ0J1Y2tldCBuYW1lJzsKCiRsYW5nWydmaWVsZGRlZl9HQkZQX2FsbG93X2hlbHAnXSA9ICdTcGVjaWZ5IGEgY29tbWEgc2VwcmF0ZWQgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdGhhdCBhcmUgYWxsb3dlZC4gRm9yIGV4YW1wbGU6IHBkZixnaWYsanBlZyxqcGcgKGtlZXAgbG93ZXJjYXNlKSc7CiRsYW5nWydmaWVsZGRlZl9HQkZQX2Rpcl9oZWxwJ10gPSAnRGlyZWN0b3J5IHBhdGggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvICRjb25maWdbXCd1cGxvYWRzX3VybFwnXSAuIE5vIHNsYXNoIGF0IHRoZSBlbmQuJzsKJGxhbmdbJ2ZpZWxkZGVmX0dCRlBfZXhjbHVkZV9wcmVmaXhfaGVscCddID0gJ1NwZWNpZnkgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZml4ZXMgdG8gZXhjbHVkZSBmaWxlcyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBzZXQgcHJlZml4LiBGb3IgZXhhbXBsZTogdGh1bWJfLCBmb29fJzsKJGxhbmdbJ2ZpZWxkZGVmX0dCRlBfZmlsZWJyb3dzZXJfaGVscCddID0gJ0J5IGRlZmF1bHQgYSBkcm9wZG93biB3aWxsIGJlIHVzZWQuIEVuYWJsZSBmaWxlYnJvd3NlciBpZiB1c2VyIG1heSBicm93c2UgdGhlIGZpbGVzLic7CiRsYW5nWydmaWVsZGRlZl9HQkZQX21lZGlhX3R5cGVfaGVscCddID0gJ0FsbG93cyB5b3UgdG8gc3BlY2lmeSBpbWFnZXMgYXMgbWVkaWEgdHlwZSB0byBiZSBkaXNwbGF5ZWQuIEJ5IGRlZmF1bHQgYWxsIGZpbGVzIHdpbGwgYmUgc2hvd24uJzsKJGxhbmdbJ2ZpZWxkZGVmX0dCRlBfZGVsZXRlX2hlbHAnXSA9ICdJZiBlbmFibGVkIHlvdSBjYW4gZ3JhbnQgZGVsZXRpbmcgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZm9yIHRoaXMgZmllbGQgZXZlbiB0byB1c2VycyB3aXRob3V0IGFwcm9wcmlhdGUgcGVybWlzc2lvbi4nOwokbGFuZ1snZmllbGRkZWZfR0JGUF9jcmVhdGVfZGlyc19oZWxwJ10gPSAnSWYgZW5hYmxlZCB5b3UgY2FuIGdyYW50IGNyZWF0aW9uIG9mIGRpcmVjdG9yaWVzIGZvciB0aGlzIGZpZWxkIGV2ZW4gdG8gdXNlcnMgd2l0aG91dCBhcHJvcHJpYXRlIHBlcm1pc3Npb24uJzsKJGxhbmdbJ2ZpZWxkZGVmX0dCRlBfc2hvd19zdWJkaXJzX2hlbHAnXSA9ICdJZiBlbmFibGVkIHVzZXIgbWF5IGJyb3dzZSBzdWJkaXJlY3Rvcmllcy4nOwoKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+VXNhZ2U8L2gzPiAgICAgIAogICAgPHA+VG8gZGlzcGxheSB5b3VyIGZpbGVuYW1lIHNpbXBseSBhZGQ6PGJyIC8+PGJyIC8+PHN0cm9uZz57JGl0ZW0tPmFsaWFzfTwvc3Ryb25nPjxiciAvPjxiciAvPm9yPGJyIC8+PGJyIC8+PHN0cm9uZz57JGl0ZW0tPmZpZWxkZGVmcy5hbGlhcy0+R2V0VmFsdWUoKX08L3N0cm9uZz48YnIgLz48YnIgLz48L3A+Cgk8cD5UbyBhZGQgYSBsaW5rIHRvIHlvdXIgZmlsZSBhZGQ6PGJyIC8+PGJyIC8+PHN0cm9uZz57JGl0ZW0tPmZpZWxkZGVmcy5hbGlhcy0+R2V0VVJMVmFsdWUoKX08L3N0cm9uZz4nOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.S3.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiogJElkJAoqCiogQ29weXJpZ2h0IChjKSAyMDEzLCBEb25vdmFuIFNjaMO2bmtuZWNodC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioKKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKgoqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoqCiogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCiogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQoqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCiogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgoqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCiogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQoqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCioKKiBBbWF6b24gUzMgaXMgYSB0cmFkZW1hcmsgb2YgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKi8KCi8qKgoqIEFtYXpvbiBTMyBQSFAgY2xhc3MKKgoqIEBsaW5rIGh0dHA6Ly91bmRlc2lnbmVkLm9yZy56YS8yMDA3LzEwLzIyL2FtYXpvbi1zMy1waHAtY2xhc3MKKiBAdmVyc2lvbiAwLjUuMC1kZXYKKi8KY2xhc3MgUzMKewoJLy8gQUNMIGZsYWdzCgljb25zdCBBQ0xfUFJJVkFURSA9ICdwcml2YXRlJzsKCWNvbnN0IEFDTF9QVUJMSUNfUkVBRCA9ICdwdWJsaWMtcmVhZCc7Cgljb25zdCBBQ0xfUFVCTElDX1JFQURfV1JJVEUgPSAncHVibGljLXJlYWQtd3JpdGUnOwoJY29uc3QgQUNMX0FVVEhFTlRJQ0FURURfUkVBRCA9ICdhdXRoZW50aWNhdGVkLXJlYWQnOwoKCWNvbnN0IFNUT1JBR0VfQ0xBU1NfU1RBTkRBUkQgPSAnU1RBTkRBUkQnOwoJY29uc3QgU1RPUkFHRV9DTEFTU19SUlMgPSAnUkVEVUNFRF9SRURVTkRBTkNZJzsKCgljb25zdCBTU0VfTk9ORSA9ICcnOwoJY29uc3QgU1NFX0FFUzI1NiA9ICdBRVMyNTYnOwoKCS8qKgoJICogVGhlIEFXUyBBY2Nlc3Mga2V5CgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHN0YXRpYwoJICovCglwcml2YXRlIHN0YXRpYyAkX19hY2Nlc3NLZXkgPSBudWxsOwoJCgkvKioKCSAqIEFXUyBTZWNyZXQgS2V5CgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHN0YXRpYwoJICovCglwcml2YXRlIHN0YXRpYyAkX19zZWNyZXRLZXkgPSBudWxsOwoJCgkvKioKCSAqIFNTTCBDbGllbnQga2V5CgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHN0YXRpYwoJICovCglwcml2YXRlIHN0YXRpYyAkX19zc2xLZXkgPSBudWxsOwoJCgkvKioKCSAqIEFXUyBVUkkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjZXNzIHB1YmxpYwoJICogQHN0YXRpYwoJICovCglwdWJsaWMgc3RhdGljICRlbmRwb2ludCA9ICdzMy5hbWF6b25hd3MuY29tJzsKCQoJLyoqCgkgKiBQcm94eSBpbmZvcm1hdGlvbgoJICoKCSAqIEB2YXIgbnVsbHxhcnJheQoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJcHVibGljIHN0YXRpYyAkcHJveHkgPSBudWxsOwoJCgkvKioKCSAqIENvbm5lY3QgdXNpbmcgU1NMPwoJICoKCSAqIEB2YXIgYm9vbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJcHVibGljIHN0YXRpYyAkdXNlU1NMID0gZmFsc2U7CgkKCS8qKgoJICogVXNlIFNTTCB2YWxpZGF0aW9uPwoJICoKCSAqIEB2YXIgYm9vbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJcHVibGljIHN0YXRpYyAkdXNlU1NMVmFsaWRhdGlvbiA9IHRydWU7CgkKCS8qKgoJICogVXNlIFBIUCBleGNlcHRpb25zPwoJICoKCSAqIEB2YXIgYm9vbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJcHVibGljIHN0YXRpYyAkdXNlRXhjZXB0aW9ucyA9IGZhbHNlOwoKCS8vIFNTTCBDVVJMIFNTTCBvcHRpb25zIC0gb25seSBuZWVkZWQgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgcHJvYmxlbXMgd2l0aCB5b3VyIE9wZW5TU0wgY29uZmlndXJhdGlvbgoJCgkvKioKCSAqIFNTTCBjbGllbnQga2V5CgkgKgoJICogQHZhciBib29sCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHN0YXRpYwoJICovCglwdWJsaWMgc3RhdGljICRzc2xLZXkgPSBudWxsOwoJCgkvKioKCSAqIFNTTCBjbGllbnQgY2VydGZpZmljYXRlCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2VzcyBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJcHVibGljIHN0YXRpYyAkc3NsQ2VydCA9IG51bGw7CgkKCS8qKgoJICogU1NMIENBIGNlcnQgKG9ubHkgcmVxdWlyZWQgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB5b3VyIHN5c3RlbSBDQSBjZXJ0KQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHN0YXRpYwoJICovCglwdWJsaWMgc3RhdGljICRzc2xDQUNlcnQgPSBudWxsOwoJCgkvKioKCSAqIEFXUyBLZXkgUGFpciBJRAoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzdGF0aWMKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgJF9fc2lnbmluZ0tleVBhaXJJZCA9IG51bGw7CgkKCS8qKgoJICogS2V5IHJlc291cmNlLCBmcmVlU2lnbmluZ0tleSgpIG11c3QgYmUgY2FsbGVkIHRvIGNsZWFyIGl0IGZyb20gbWVtb3J5CgkgKgoJICogQHZhciBib29sCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzdGF0aWMgCgkgKi8KCXByaXZhdGUgc3RhdGljICRfX3NpZ25pbmdLZXlSZXNvdXJjZSA9IGZhbHNlOwoKCgkvKioKCSogQ29uc3RydWN0b3IgLSBpZiB5b3UncmUgbm90IHVzaW5nIHRoZSBjbGFzcyBzdGF0aWNhbGx5CgkqCgkqIEBwYXJhbSBzdHJpbmcgJGFjY2Vzc0tleSBBY2Nlc3Mga2V5CgkqIEBwYXJhbSBzdHJpbmcgJHNlY3JldEtleSBTZWNyZXQga2V5CgkqIEBwYXJhbSBib29sZWFuICR1c2VTU0wgRW5hYmxlIFNTTAoJKiBAcGFyYW0gc3RyaW5nICRlbmRwb2ludCBBbWF6b24gVVJJCgkqIEByZXR1cm4gdm9pZAoJKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYWNjZXNzS2V5ID0gbnVsbCwgJHNlY3JldEtleSA9IG51bGwsICR1c2VTU0wgPSBmYWxzZSwgJGVuZHBvaW50ID0gJ3MzLmFtYXpvbmF3cy5jb20nKQoJewoJCWlmICgkYWNjZXNzS2V5ICE9PSBudWxsICYmICRzZWNyZXRLZXkgIT09IG51bGwpCgkJCXNlbGY6OnNldEF1dGgoJGFjY2Vzc0tleSwgJHNlY3JldEtleSk7CgkJc2VsZjo6JHVzZVNTTCA9ICR1c2VTU0w7CgkJc2VsZjo6JGVuZHBvaW50ID0gJGVuZHBvaW50OwoJfQoKCgkvKioKCSogU2V0IHRoZSBzZXJ2aWNlIGVuZHBvaW50CgkqCgkqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdG5hbWUKCSogQHJldHVybiB2b2lkCgkqLwoJcHVibGljIGZ1bmN0aW9uIHNldEVuZHBvaW50KCRob3N0KQoJewoJCXNlbGY6OiRlbmRwb2ludCA9ICRob3N0OwoJfQoKCS8qKgoJKiBTZXQgQVdTIGFjY2VzcyBrZXkgYW5kIHNlY3JldCBrZXkKCSoKCSogQHBhcmFtIHN0cmluZyAkYWNjZXNzS2V5IEFjY2VzcyBrZXkKCSogQHBhcmFtIHN0cmluZyAkc2VjcmV0S2V5IFNlY3JldCBrZXkKCSogQHJldHVybiB2b2lkCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRBdXRoKCRhY2Nlc3NLZXksICRzZWNyZXRLZXkpCgl7CgkJc2VsZjo6JF9fYWNjZXNzS2V5ID0gJGFjY2Vzc0tleTsKCQlzZWxmOjokX19zZWNyZXRLZXkgPSAkc2VjcmV0S2V5OwoJfQoKCgkvKioKCSogQ2hlY2sgaWYgQVdTIGtleXMgaGF2ZSBiZWVuIHNldAoJKgoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0F1dGgoKSB7CgkJcmV0dXJuIChzZWxmOjokX19hY2Nlc3NLZXkgIT09IG51bGwgJiYgc2VsZjo6JF9fc2VjcmV0S2V5ICE9PSBudWxsKTsKCX0KCgoJLyoqCgkqIFNldCBTU0wgb24gb3Igb2ZmCgkqCgkqIEBwYXJhbSBib29sZWFuICRlbmFibGVkIFNTTCBlbmFibGVkCgkqIEBwYXJhbSBib29sZWFuICR2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgdmFsaWRhdGlvbgoJKiBAcmV0dXJuIHZvaWQKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFNTTCgkZW5hYmxlZCwgJHZhbGlkYXRlID0gdHJ1ZSkKCXsKCQlzZWxmOjokdXNlU1NMID0gJGVuYWJsZWQ7CgkJc2VsZjo6JHVzZVNTTFZhbGlkYXRpb24gPSAkdmFsaWRhdGU7Cgl9CgoKCS8qKgoJKiBTZXQgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZXMgKGV4cGVyaW1lbnRhbCkKCSoKCSogQHBhcmFtIHN0cmluZyAkc3NsQ2VydCBTU0wgY2xpZW50IGNlcnRpZmljYXRlCgkqIEBwYXJhbSBzdHJpbmcgJHNzbEtleSBTU0wgY2xpZW50IGtleQoJKiBAcGFyYW0gc3RyaW5nICRzc2xDQUNlcnQgU1NMIENBIGNlcnQgKG9ubHkgcmVxdWlyZWQgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB5b3VyIHN5c3RlbSBDQSBjZXJ0KQoJKiBAcmV0dXJuIHZvaWQKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFNTTEF1dGgoJHNzbENlcnQgPSBudWxsLCAkc3NsS2V5ID0gbnVsbCwgJHNzbENBQ2VydCA9IG51bGwpCgl7CgkJc2VsZjo6JHNzbENlcnQgPSAkc3NsQ2VydDsKCQlzZWxmOjokc3NsS2V5ID0gJHNzbEtleTsKCQlzZWxmOjokc3NsQ0FDZXJ0ID0gJHNzbENBQ2VydDsKCX0KCgoJLyoqCgkqIFNldCBwcm94eSBpbmZvcm1hdGlvbgoJKgoJKiBAcGFyYW0gc3RyaW5nICRob3N0IFByb3h5IGhvc3RuYW1lIGFuZCBwb3J0IChsb2NhbGhvc3Q6MTIzNCkKCSogQHBhcmFtIHN0cmluZyAkdXNlciBQcm94eSB1c2VybmFtZQoJKiBAcGFyYW0gc3RyaW5nICRwYXNzIFByb3h5IHBhc3N3b3JkCgkqIEBwYXJhbSBjb25zdGFudCAkdHlwZSBDVVJMIHByb3h5IHR5cGUKCSogQHJldHVybiB2b2lkCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRQcm94eSgkaG9zdCwgJHVzZXIgPSBudWxsLCAkcGFzcyA9IG51bGwsICR0eXBlID0gQ1VSTFBST1hZX1NPQ0tTNSkKCXsKCQlzZWxmOjokcHJveHkgPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICd0eXBlJyA9PiAkdHlwZSwgJ3VzZXInID0+ICR1c2VyLCAncGFzcycgPT4gJHBhc3MpOwoJfQoKCgkvKioKCSogU2V0IHRoZSBlcnJvciBtb2RlIHRvIGV4Y2VwdGlvbnMKCSoKCSogQHBhcmFtIGJvb2xlYW4gJGVuYWJsZWQgRW5hYmxlIGV4Y2VwdGlvbnMKCSogQHJldHVybiB2b2lkCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRFeGNlcHRpb25zKCRlbmFibGVkID0gdHJ1ZSkKCXsKCQlzZWxmOjokdXNlRXhjZXB0aW9ucyA9ICRlbmFibGVkOwoJfQoKCgkvKioKCSogU2V0IHNpZ25pbmcga2V5CgkqCgkqIEBwYXJhbSBzdHJpbmcgJGtleVBhaXJJZCBBV1MgS2V5IFBhaXIgSUQKCSogQHBhcmFtIHN0cmluZyAkc2lnbmluZ0tleSBQcml2YXRlIEtleQoJKiBAcGFyYW0gYm9vbGVhbiAkaXNGaWxlIExvYWQgcHJpdmF0ZSBrZXkgZnJvbSBmaWxlLCBzZXQgdG8gZmFsc2UgdG8gbG9hZCBzdHJpbmcKCSogQHJldHVybiBib29sZWFuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRTaWduaW5nS2V5KCRrZXlQYWlySWQsICRzaWduaW5nS2V5LCAkaXNGaWxlID0gdHJ1ZSkKCXsKCQlzZWxmOjokX19zaWduaW5nS2V5UGFpcklkID0gJGtleVBhaXJJZDsKCQlpZiAoKHNlbGY6OiRfX3NpZ25pbmdLZXlSZXNvdXJjZSA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZSgkaXNGaWxlID8KCQlmaWxlX2dldF9jb250ZW50cygkc2lnbmluZ0tleSkgOiAkc2lnbmluZ0tleSkpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7CgkJc2VsZjo6X190cmlnZ2VyRXJyb3IoJ1MzOjpzZXRTaWduaW5nS2V5KCk6IFVuYWJsZSB0byBvcGVuIGxvYWQgcHJpdmF0ZSBrZXk6ICcuJHNpZ25pbmdLZXksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCgkvKioKCSogRnJlZSBzaWduaW5nIGtleSBmcm9tIG1lbW9yeSwgTVVTVCBiZSBjYWxsZWQgaWYgeW91IGFyZSB1c2luZyBzZXRTaWduaW5nS2V5KCkKCSoKCSogQHJldHVybiB2b2lkCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcmVlU2lnbmluZ0tleSgpCgl7CgkJaWYgKHNlbGY6OiRfX3NpZ25pbmdLZXlSZXNvdXJjZSAhPT0gZmFsc2UpCgkJCW9wZW5zc2xfZnJlZV9rZXkoc2VsZjo6JF9fc2lnbmluZ0tleVJlc291cmNlKTsKCX0KCgoJLyoqCgkqIEludGVybmFsIGVycm9yIGhhbmRsZXIKCSoKCSogQGludGVybmFsIEludGVybmFsIGVycm9yIGhhbmRsZXIKCSogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSBFcnJvciBtZXNzYWdlCgkqIEBwYXJhbSBzdHJpbmcgJGZpbGUgRmlsZW5hbWUKCSogQHBhcmFtIGludGVnZXIgJGxpbmUgTGluZSBudW1iZXIKCSogQHBhcmFtIGludGVnZXIgJGNvZGUgRXJyb3IgY29kZQoJKiBAcmV0dXJuIHZvaWQKCSovCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfX3RyaWdnZXJFcnJvcigkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29kZSA9IDApCgl7CgkJaWYgKHNlbGY6OiR1c2VFeGNlcHRpb25zKQoJCQl0aHJvdyBuZXcgUzNFeGNlcHRpb24oJG1lc3NhZ2UsICRmaWxlLCAkbGluZSwgJGNvZGUpOwoJCWVsc2UKCQkJdHJpZ2dlcl9lcnJvcigkbWVzc2FnZSwgRV9VU0VSX1dBUk5JTkcpOwoJfQoKCgkvKioKCSogR2V0IGEgbGlzdCBvZiBidWNrZXRzCgkqCgkqIEBwYXJhbSBib29sZWFuICRkZXRhaWxlZCBSZXR1cm5zIGRldGFpbGVkIGJ1Y2tldCBsaXN0IHdoZW4gdHJ1ZQoJKiBAcmV0dXJuIGFycmF5IHwgZmFsc2UKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpc3RCdWNrZXRzKCRkZXRhaWxlZCA9IGZhbHNlKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnR0VUJywgJycsICcnLCBzZWxmOjokZW5kcG9pbnQpOwoJCSRyZXN0ID0gJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpsaXN0QnVja2V0cygpOiBbJXNdICVzIiwgJHJlc3QtPmVycm9yWydjb2RlJ10sCgkJCSRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkcmVzdWx0cyA9IGFycmF5KCk7CgkJaWYgKCFpc3NldCgkcmVzdC0+Ym9keS0+QnVja2V0cykpIHJldHVybiAkcmVzdWx0czsKCgkJaWYgKCRkZXRhaWxlZCkKCQl7CgkJCWlmIChpc3NldCgkcmVzdC0+Ym9keS0+T3duZXIsICRyZXN0LT5ib2R5LT5Pd25lci0+SUQsICRyZXN0LT5ib2R5LT5Pd25lci0+RGlzcGxheU5hbWUpKQoJCQkkcmVzdWx0c1snb3duZXInXSA9IGFycmF5KAoJCQkJJ2lkJyA9PiAoc3RyaW5nKSRyZXN0LT5ib2R5LT5Pd25lci0+SUQsICduYW1lJyA9PiAoc3RyaW5nKSRyZXN0LT5ib2R5LT5Pd25lci0+SUQKCQkJKTsKCQkJJHJlc3VsdHNbJ2J1Y2tldHMnXSA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRyZXN0LT5ib2R5LT5CdWNrZXRzLT5CdWNrZXQgYXMgJGIpCgkJCQkkcmVzdWx0c1snYnVja2V0cyddW10gPSBhcnJheSgKCQkJCQknbmFtZScgPT4gKHN0cmluZykkYi0+TmFtZSwgJ3RpbWUnID0+IHN0cnRvdGltZSgoc3RyaW5nKSRiLT5DcmVhdGlvbkRhdGUpCgkJCQkpOwoJCX0gZWxzZQoJCQlmb3JlYWNoICgkcmVzdC0+Ym9keS0+QnVja2V0cy0+QnVja2V0IGFzICRiKSAkcmVzdWx0c1tdID0gKHN0cmluZykkYi0+TmFtZTsKCgkJcmV0dXJuICRyZXN1bHRzOwoJfQoKCgkvKioKCSogR2V0IGNvbnRlbnRzIGZvciBhIGJ1Y2tldAoJKgoJKiBJZiBtYXhLZXlzIGlzIG51bGwgdGhpcyBtZXRob2Qgd2lsbCBsb29wIHRocm91Z2ggdHJ1bmNhdGVkIHJlc3VsdCBzZXRzCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICRwcmVmaXggUHJlZml4CgkqIEBwYXJhbSBzdHJpbmcgJG1hcmtlciBNYXJrZXIgKGxhc3QgZmlsZSBsaXN0ZWQpCgkqIEBwYXJhbSBzdHJpbmcgJG1heEtleXMgTWF4IGtleXMgKG1heGltdW0gbnVtYmVyIG9mIGtleXMgdG8gcmV0dXJuKQoJKiBAcGFyYW0gc3RyaW5nICRkZWxpbWl0ZXIgRGVsaW1pdGVyCgkqIEBwYXJhbSBib29sZWFuICRyZXR1cm5Db21tb25QcmVmaXhlcyBTZXQgdG8gdHJ1ZSB0byByZXR1cm4gQ29tbW9uUHJlZml4ZXMKCSogQHJldHVybiBhcnJheSB8IGZhbHNlCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRCdWNrZXQoJGJ1Y2tldCwgJHByZWZpeCA9IG51bGwsICRtYXJrZXIgPSBudWxsLCAkbWF4S2V5cyA9IG51bGwsICRkZWxpbWl0ZXIgPSBudWxsLCAkcmV0dXJuQ29tbW9uUHJlZml4ZXMgPSBmYWxzZSkKCXsKCQkkcmVzdCA9IG5ldyBTM1JlcXVlc3QoJ0dFVCcsICRidWNrZXQsICcnLCBzZWxmOjokZW5kcG9pbnQpOwoJCWlmICgkbWF4S2V5cyA9PSAwKSAkbWF4S2V5cyA9IG51bGw7CgkJaWYgKCRwcmVmaXggIT09IG51bGwgJiYgJHByZWZpeCAhPT0gJycpICRyZXN0LT5zZXRQYXJhbWV0ZXIoJ3ByZWZpeCcsICRwcmVmaXgpOwoJCWlmICgkbWFya2VyICE9PSBudWxsICYmICRtYXJrZXIgIT09ICcnKSAkcmVzdC0+c2V0UGFyYW1ldGVyKCdtYXJrZXInLCAkbWFya2VyKTsKCQlpZiAoJG1heEtleXMgIT09IG51bGwgJiYgJG1heEtleXMgIT09ICcnKSAkcmVzdC0+c2V0UGFyYW1ldGVyKCdtYXgta2V5cycsICRtYXhLZXlzKTsKCQlpZiAoJGRlbGltaXRlciAhPT0gbnVsbCAmJiAkZGVsaW1pdGVyICE9PSAnJykgJHJlc3QtPnNldFBhcmFtZXRlcignZGVsaW1pdGVyJywgJGRlbGltaXRlcik7CgkJJHJlc3BvbnNlID0gJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJaWYgKCRyZXNwb25zZS0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXNwb25zZS0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzcG9uc2UtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXNwb25zZS0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXNwb25zZS0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OmdldEJ1Y2tldCgpOiBbJXNdICVzIiwKCQkJJHJlc3BvbnNlLT5lcnJvclsnY29kZSddLCAkcmVzcG9uc2UtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkcmVzdWx0cyA9IGFycmF5KCk7CgoJCSRuZXh0TWFya2VyID0gbnVsbDsKCQlpZiAoaXNzZXQoJHJlc3BvbnNlLT5ib2R5LCAkcmVzcG9uc2UtPmJvZHktPkNvbnRlbnRzKSkKCQlmb3JlYWNoICgkcmVzcG9uc2UtPmJvZHktPkNvbnRlbnRzIGFzICRjKQoJCXsKCQkJJHJlc3VsdHNbKHN0cmluZykkYy0+S2V5XSA9IGFycmF5KAoJCQkJJ25hbWUnID0+IChzdHJpbmcpJGMtPktleSwKCQkJCSd0aW1lJyA9PiBzdHJ0b3RpbWUoKHN0cmluZykkYy0+TGFzdE1vZGlmaWVkKSwKCQkJCSdzaXplJyA9PiAoaW50KSRjLT5TaXplLAoJCQkJJ2hhc2gnID0+IHN1YnN0cigoc3RyaW5nKSRjLT5FVGFnLCAxLCAtMSkKCQkJKTsKCQkJJG5leHRNYXJrZXIgPSAoc3RyaW5nKSRjLT5LZXk7CgkJfQoKCQlpZiAoJHJldHVybkNvbW1vblByZWZpeGVzICYmIGlzc2V0KCRyZXNwb25zZS0+Ym9keSwgJHJlc3BvbnNlLT5ib2R5LT5Db21tb25QcmVmaXhlcykpCgkJCWZvcmVhY2ggKCRyZXNwb25zZS0+Ym9keS0+Q29tbW9uUHJlZml4ZXMgYXMgJGMpCgkJCQkkcmVzdWx0c1soc3RyaW5nKSRjLT5QcmVmaXhdID0gYXJyYXkoJ3ByZWZpeCcgPT4gKHN0cmluZykkYy0+UHJlZml4KTsKCgkJaWYgKGlzc2V0KCRyZXNwb25zZS0+Ym9keSwgJHJlc3BvbnNlLT5ib2R5LT5Jc1RydW5jYXRlZCkgJiYKCQkoc3RyaW5nKSRyZXNwb25zZS0+Ym9keS0+SXNUcnVuY2F0ZWQgPT0gJ2ZhbHNlJykgcmV0dXJuICRyZXN1bHRzOwoKCQlpZiAoaXNzZXQoJHJlc3BvbnNlLT5ib2R5LCAkcmVzcG9uc2UtPmJvZHktPk5leHRNYXJrZXIpKQoJCQkkbmV4dE1hcmtlciA9IChzdHJpbmcpJHJlc3BvbnNlLT5ib2R5LT5OZXh0TWFya2VyOwoKCQkvLyBMb29wIHRocm91Z2ggdHJ1bmNhdGVkIHJlc3VsdHMgaWYgbWF4S2V5cyBpc24ndCBzcGVjaWZpZWQKCQlpZiAoJG1heEtleXMgPT0gbnVsbCAmJiAkbmV4dE1hcmtlciAhPT0gbnVsbCAmJiAoc3RyaW5nKSRyZXNwb25zZS0+Ym9keS0+SXNUcnVuY2F0ZWQgPT0gJ3RydWUnKQoJCWRvCgkJewoJCQkkcmVzdCA9IG5ldyBTM1JlcXVlc3QoJ0dFVCcsICRidWNrZXQsICcnLCBzZWxmOjokZW5kcG9pbnQpOwoJCQlpZiAoJHByZWZpeCAhPT0gbnVsbCAmJiAkcHJlZml4ICE9PSAnJykgJHJlc3QtPnNldFBhcmFtZXRlcigncHJlZml4JywgJHByZWZpeCk7CgkJCSRyZXN0LT5zZXRQYXJhbWV0ZXIoJ21hcmtlcicsICRuZXh0TWFya2VyKTsKCQkJaWYgKCRkZWxpbWl0ZXIgIT09IG51bGwgJiYgJGRlbGltaXRlciAhPT0gJycpICRyZXN0LT5zZXRQYXJhbWV0ZXIoJ2RlbGltaXRlcicsICRkZWxpbWl0ZXIpOwoKCQkJaWYgKCgkcmVzcG9uc2UgPSAkcmVzdC0+Z2V0UmVzcG9uc2UoKSkgPT0gZmFsc2UgfHwgJHJlc3BvbnNlLT5jb2RlICE9PSAyMDApIGJyZWFrOwoKCQkJaWYgKGlzc2V0KCRyZXNwb25zZS0+Ym9keSwgJHJlc3BvbnNlLT5ib2R5LT5Db250ZW50cykpCgkJCWZvcmVhY2ggKCRyZXNwb25zZS0+Ym9keS0+Q29udGVudHMgYXMgJGMpCgkJCXsKCQkJCSRyZXN1bHRzWyhzdHJpbmcpJGMtPktleV0gPSBhcnJheSgKCQkJCQknbmFtZScgPT4gKHN0cmluZykkYy0+S2V5LAoJCQkJCSd0aW1lJyA9PiBzdHJ0b3RpbWUoKHN0cmluZykkYy0+TGFzdE1vZGlmaWVkKSwKCQkJCQknc2l6ZScgPT4gKGludCkkYy0+U2l6ZSwKCQkJCQknaGFzaCcgPT4gc3Vic3RyKChzdHJpbmcpJGMtPkVUYWcsIDEsIC0xKQoJCQkJKTsKCQkJCSRuZXh0TWFya2VyID0gKHN0cmluZykkYy0+S2V5OwoJCQl9CgoJCQlpZiAoJHJldHVybkNvbW1vblByZWZpeGVzICYmIGlzc2V0KCRyZXNwb25zZS0+Ym9keSwgJHJlc3BvbnNlLT5ib2R5LT5Db21tb25QcmVmaXhlcykpCgkJCQlmb3JlYWNoICgkcmVzcG9uc2UtPmJvZHktPkNvbW1vblByZWZpeGVzIGFzICRjKQoJCQkJCSRyZXN1bHRzWyhzdHJpbmcpJGMtPlByZWZpeF0gPSBhcnJheSgncHJlZml4JyA9PiAoc3RyaW5nKSRjLT5QcmVmaXgpOwoKCQkJaWYgKGlzc2V0KCRyZXNwb25zZS0+Ym9keSwgJHJlc3BvbnNlLT5ib2R5LT5OZXh0TWFya2VyKSkKCQkJCSRuZXh0TWFya2VyID0gKHN0cmluZykkcmVzcG9uc2UtPmJvZHktPk5leHRNYXJrZXI7CgoJCX0gd2hpbGUgKCRyZXNwb25zZSAhPT0gZmFsc2UgJiYgKHN0cmluZykkcmVzcG9uc2UtPmJvZHktPklzVHJ1bmNhdGVkID09ICd0cnVlJyk7CgoJCXJldHVybiAkcmVzdWx0czsKCX0KCgoJLyoqCgkqIFB1dCBhIGJ1Y2tldAoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIGNvbnN0YW50ICRhY2wgQUNMIGZsYWcKCSogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gU2V0IGFzICJFVSIgdG8gY3JlYXRlIGJ1Y2tldHMgaG9zdGVkIGluIEV1cm9wZQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHB1dEJ1Y2tldCgkYnVja2V0LCAkYWNsID0gc2VsZjo6QUNMX1BSSVZBVEUsICRsb2NhdGlvbiA9IGZhbHNlKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUFVUJywgJGJ1Y2tldCwgJycsIHNlbGY6OiRlbmRwb2ludCk7CgkJJHJlc3QtPnNldEFtekhlYWRlcigneC1hbXotYWNsJywgJGFjbCk7CgoJCWlmICgkbG9jYXRpb24gIT09IGZhbHNlKQoJCXsKCQkJJGRvbSA9IG5ldyBET01Eb2N1bWVudDsKCQkJJGNyZWF0ZUJ1Y2tldENvbmZpZ3VyYXRpb24gPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdDcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uJyk7CgkJCSRsb2NhdGlvbkNvbnN0cmFpbnQgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdMb2NhdGlvbkNvbnN0cmFpbnQnLCAkbG9jYXRpb24pOwoJCQkkY3JlYXRlQnVja2V0Q29uZmlndXJhdGlvbi0+YXBwZW5kQ2hpbGQoJGxvY2F0aW9uQ29uc3RyYWludCk7CgkJCSRkb20tPmFwcGVuZENoaWxkKCRjcmVhdGVCdWNrZXRDb25maWd1cmF0aW9uKTsKCQkJJHJlc3QtPmRhdGEgPSAkZG9tLT5zYXZlWE1MKCk7CgkJCSRyZXN0LT5zaXplID0gc3RybGVuKCRyZXN0LT5kYXRhKTsKCQkJJHJlc3QtPnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3htbCcpOwoJCX0KCQkkcmVzdCA9ICRyZXN0LT5nZXRSZXNwb25zZSgpOwoKCQlpZiAoJHJlc3QtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gJHJlc3QtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OnB1dEJ1Y2tldCh7JGJ1Y2tldH0sIHskYWNsfSwgeyRsb2NhdGlvbn0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkqIERlbGV0ZSBhbiBlbXB0eSBidWNrZXQKCSoKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IEJ1Y2tldCBuYW1lCgkqIEByZXR1cm4gYm9vbGVhbgoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVsZXRlQnVja2V0KCRidWNrZXQpCgl7CgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdERUxFVEUnLCAkYnVja2V0LCAnJywgc2VsZjo6JGVuZHBvaW50KTsKCQkkcmVzdCA9ICRyZXN0LT5nZXRSZXNwb25zZSgpOwoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDQpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6ZGVsZXRlQnVja2V0KHskYnVja2V0fSk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSogQ3JlYXRlIGlucHV0IGluZm8gYXJyYXkgZm9yIHB1dE9iamVjdCgpCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGZpbGUgSW5wdXQgZmlsZQoJKiBAcGFyYW0gbWl4ZWQgJG1kNXN1bSBVc2UgTUQ1IGhhc2ggKHN1cHBseSBhIHN0cmluZyBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24pCgkqIEByZXR1cm4gYXJyYXkgfCBmYWxzZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5wdXRGaWxlKCRmaWxlLCAkbWQ1c3VtID0gdHJ1ZSkKCXsKCQlpZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSB8fCAhaXNfZmlsZSgkZmlsZSkgfHwgIWlzX3JlYWRhYmxlKCRmaWxlKSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKCdTMzo6aW5wdXRGaWxlKCk6IFVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGU6ICcuJGZpbGUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIGFycmF5KCdmaWxlJyA9PiAkZmlsZSwgJ3NpemUnID0+IGZpbGVzaXplKCRmaWxlKSwgJ21kNXN1bScgPT4gJG1kNXN1bSAhPT0gZmFsc2UgPwoJCShpc19zdHJpbmcoJG1kNXN1bSkgPyAkbWQ1c3VtIDogYmFzZTY0X2VuY29kZShtZDVfZmlsZSgkZmlsZSwgdHJ1ZSkpKSA6ICcnKTsKCX0KCgoJLyoqCgkqIENyZWF0ZSBpbnB1dCBhcnJheSBpbmZvIGZvciBwdXRPYmplY3QoKSB3aXRoIGEgcmVzb3VyY2UKCSoKCSogQHBhcmFtIHN0cmluZyAkcmVzb3VyY2UgSW5wdXQgcmVzb3VyY2UgdG8gcmVhZCBmcm9tCgkqIEBwYXJhbSBpbnRlZ2VyICRidWZmZXJTaXplIElucHV0IGJ5dGUgc2l6ZQoJKiBAcGFyYW0gc3RyaW5nICRtZDVzdW0gTUQ1IGhhc2ggdG8gc2VuZCAob3B0aW9uYWwpCgkqIEByZXR1cm4gYXJyYXkgfCBmYWxzZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5wdXRSZXNvdXJjZSgmJHJlc291cmNlLCAkYnVmZmVyU2l6ZSA9IGZhbHNlLCAkbWQ1c3VtID0gJycpCgl7CgkJaWYgKCFpc19yZXNvdXJjZSgkcmVzb3VyY2UpIHx8IChpbnQpJGJ1ZmZlclNpemUgPCAwKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3IoJ1MzOjppbnB1dFJlc291cmNlKCk6IEludmFsaWQgcmVzb3VyY2Ugb3IgYnVmZmVyIHNpemUnLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBUcnkgdG8gZmlndXJlIG91dCB0aGUgYnl0ZXNpemUKCQlpZiAoJGJ1ZmZlclNpemUgPT09IGZhbHNlKQoJCXsKCQkJaWYgKGZzZWVrKCRyZXNvdXJjZSwgMCwgU0VFS19FTkQpIDwgMCB8fCAoJGJ1ZmZlclNpemUgPSBmdGVsbCgkcmVzb3VyY2UpKSA9PT0gZmFsc2UpCgkJCXsKCQkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKCdTMzo6aW5wdXRSZXNvdXJjZSgpOiBVbmFibGUgdG8gb2J0YWluIHJlc291cmNlIHNpemUnLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWZzZWVrKCRyZXNvdXJjZSwgMCk7CgkJfQoKCQkkaW5wdXQgPSBhcnJheSgnc2l6ZScgPT4gJGJ1ZmZlclNpemUsICdtZDVzdW0nID0+ICRtZDVzdW0pOwoJCSRpbnB1dFsnZnAnXSA9JiAkcmVzb3VyY2U7CgkJcmV0dXJuICRpbnB1dDsKCX0KCgoJLyoqCgkqIFB1dCBhbiBvYmplY3QKCSoKCSogQHBhcmFtIG1peGVkICRpbnB1dCBJbnB1dCBkYXRhCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcGFyYW0gY29uc3RhbnQgJGFjbCBBQ0wgY29uc3RhbnQKCSogQHBhcmFtIGFycmF5ICRtZXRhSGVhZGVycyBBcnJheSBvZiB4LWFtei1tZXRhLSogaGVhZGVycwoJKiBAcGFyYW0gYXJyYXkgJHJlcXVlc3RIZWFkZXJzIEFycmF5IG9mIHJlcXVlc3QgaGVhZGVycyBvciBjb250ZW50IHR5cGUgYXMgYSBzdHJpbmcKCSogQHBhcmFtIGNvbnN0YW50ICRzdG9yYWdlQ2xhc3MgU3RvcmFnZSBjbGFzcyBjb25zdGFudAoJKiBAcGFyYW0gY29uc3RhbnQgJHNlcnZlclNpZGVFbmNyeXB0aW9uIFNlcnZlci1zaWRlIGVuY3J5cHRpb24KCSogQHJldHVybiBib29sZWFuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwdXRPYmplY3QoJGlucHV0LCAkYnVja2V0LCAkdXJpLCAkYWNsID0gc2VsZjo6QUNMX1BSSVZBVEUsICRtZXRhSGVhZGVycyA9IGFycmF5KCksICRyZXF1ZXN0SGVhZGVycyA9IGFycmF5KCksICRzdG9yYWdlQ2xhc3MgPSBzZWxmOjpTVE9SQUdFX0NMQVNTX1NUQU5EQVJELCAkc2VydmVyU2lkZUVuY3J5cHRpb24gPSBzZWxmOjpTU0VfTk9ORSkKCXsKCQlpZiAoJGlucHV0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUFVUJywgJGJ1Y2tldCwgJHVyaSwgc2VsZjo6JGVuZHBvaW50KTsKCgkJaWYgKCFpc19hcnJheSgkaW5wdXQpKSAkaW5wdXQgPSBhcnJheSgKCQkJJ2RhdGEnID0+ICRpbnB1dCwgJ3NpemUnID0+IHN0cmxlbigkaW5wdXQpLAoJCQknbWQ1c3VtJyA9PiBiYXNlNjRfZW5jb2RlKG1kNSgkaW5wdXQsIHRydWUpKQoJCSk7CgoJCS8vIERhdGEKCQlpZiAoaXNzZXQoJGlucHV0WydmcCddKSkKCQkJJHJlc3QtPmZwID0mICRpbnB1dFsnZnAnXTsKCQllbHNlaWYgKGlzc2V0KCRpbnB1dFsnZmlsZSddKSkKCQkJJHJlc3QtPmZwID0gQGZvcGVuKCRpbnB1dFsnZmlsZSddLCAncmInKTsKCQllbHNlaWYgKGlzc2V0KCRpbnB1dFsnZGF0YSddKSkKCQkJJHJlc3QtPmRhdGEgPSAkaW5wdXRbJ2RhdGEnXTsKCgkJLy8gQ29udGVudC1MZW5ndGggKHJlcXVpcmVkKQoJCWlmIChpc3NldCgkaW5wdXRbJ3NpemUnXSkgJiYgJGlucHV0WydzaXplJ10gPj0gMCkKCQkJJHJlc3QtPnNpemUgPSAkaW5wdXRbJ3NpemUnXTsKCQllbHNlIHsKCQkJaWYgKGlzc2V0KCRpbnB1dFsnZmlsZSddKSkKCQkJCSRyZXN0LT5zaXplID0gZmlsZXNpemUoJGlucHV0WydmaWxlJ10pOwoJCQllbHNlaWYgKGlzc2V0KCRpbnB1dFsnZGF0YSddKSkKCQkJCSRyZXN0LT5zaXplID0gc3RybGVuKCRpbnB1dFsnZGF0YSddKTsKCQl9CgoJCS8vIEN1c3RvbSByZXF1ZXN0IGhlYWRlcnMgKENvbnRlbnQtVHlwZSwgQ29udGVudC1EaXNwb3NpdGlvbiwgQ29udGVudC1FbmNvZGluZykKCQlpZiAoaXNfYXJyYXkoJHJlcXVlc3RIZWFkZXJzKSkKCQkJZm9yZWFjaCAoJHJlcXVlc3RIZWFkZXJzIGFzICRoID0+ICR2KSAkcmVzdC0+c2V0SGVhZGVyKCRoLCAkdik7CgkJZWxzZWlmIChpc19zdHJpbmcoJHJlcXVlc3RIZWFkZXJzKSkgLy8gU3VwcG9ydCBmb3IgbGVnYWN5IGNvbnRlbnRUeXBlIHBhcmFtZXRlcgoJCQkkaW5wdXRbJ3R5cGUnXSA9ICRyZXF1ZXN0SGVhZGVyczsKCgkJLy8gQ29udGVudC1UeXBlCgkJaWYgKCFpc3NldCgkaW5wdXRbJ3R5cGUnXSkpCgkJewoJCQlpZiAoaXNzZXQoJHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXSkpCgkJCQkkaW5wdXRbJ3R5cGUnXSA9JiAkcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOwoJCQllbHNlaWYgKGlzc2V0KCRpbnB1dFsnZmlsZSddKSkKCQkJCSRpbnB1dFsndHlwZSddID0gc2VsZjo6X19nZXRNaW1lVHlwZSgkaW5wdXRbJ2ZpbGUnXSk7CgkJCWVsc2UKCQkJCSRpbnB1dFsndHlwZSddID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CgkJfQoKCQlpZiAoJHN0b3JhZ2VDbGFzcyAhPT0gc2VsZjo6U1RPUkFHRV9DTEFTU19TVEFOREFSRCkgLy8gU3RvcmFnZSBjbGFzcwoJCQkkcmVzdC0+c2V0QW16SGVhZGVyKCd4LWFtei1zdG9yYWdlLWNsYXNzJywgJHN0b3JhZ2VDbGFzcyk7CgoJCWlmICgkc2VydmVyU2lkZUVuY3J5cHRpb24gIT09IHNlbGY6OlNTRV9OT05FKSAvLyBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uCgkJCSRyZXN0LT5zZXRBbXpIZWFkZXIoJ3gtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24nLCAkc2VydmVyU2lkZUVuY3J5cHRpb24pOwoKCQkvLyBXZSBuZWVkIHRvIHBvc3Qgd2l0aCBDb250ZW50LUxlbmd0aCBhbmQgQ29udGVudC1UeXBlLCBNRDUgaXMgb3B0aW9uYWwKCQlpZiAoJHJlc3QtPnNpemUgPj0gMCAmJiAoJHJlc3QtPmZwICE9PSBmYWxzZSB8fCAkcmVzdC0+ZGF0YSAhPT0gZmFsc2UpKQoJCXsKCQkJJHJlc3QtPnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJGlucHV0Wyd0eXBlJ10pOwoJCQlpZiAoaXNzZXQoJGlucHV0WydtZDVzdW0nXSkpICRyZXN0LT5zZXRIZWFkZXIoJ0NvbnRlbnQtTUQ1JywgJGlucHV0WydtZDVzdW0nXSk7CgoJCQkkcmVzdC0+c2V0QW16SGVhZGVyKCd4LWFtei1hY2wnLCAkYWNsKTsKCQkJZm9yZWFjaCAoJG1ldGFIZWFkZXJzIGFzICRoID0+ICR2KSAkcmVzdC0+c2V0QW16SGVhZGVyKCd4LWFtei1tZXRhLScuJGgsICR2KTsKCQkJJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJfSBlbHNlCgkJCSRyZXN0LT5yZXNwb25zZS0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gMCwgJ21lc3NhZ2UnID0+ICdNaXNzaW5nIGlucHV0IHBhcmFtZXRlcnMnKTsKCgkJaWYgKCRyZXN0LT5yZXNwb25zZS0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5yZXNwb25zZS0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+cmVzcG9uc2UtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5yZXNwb25zZS0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5yZXNwb25zZS0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OnB1dE9iamVjdCgpOiBbJXNdICVzIiwKCQkJJHJlc3QtPnJlc3BvbnNlLT5lcnJvclsnY29kZSddLCAkcmVzdC0+cmVzcG9uc2UtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSogUHV0IGFuIG9iamVjdCBmcm9tIGEgZmlsZSAobGVnYWN5IGZ1bmN0aW9uKQoJKgoJKiBAcGFyYW0gc3RyaW5nICRmaWxlIElucHV0IGZpbGUgcGF0aAoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIHN0cmluZyAkdXJpIE9iamVjdCBVUkkKCSogQHBhcmFtIGNvbnN0YW50ICRhY2wgQUNMIGNvbnN0YW50CgkqIEBwYXJhbSBhcnJheSAkbWV0YUhlYWRlcnMgQXJyYXkgb2YgeC1hbXotbWV0YS0qIGhlYWRlcnMKCSogQHBhcmFtIHN0cmluZyAkY29udGVudFR5cGUgQ29udGVudCB0eXBlCgkqIEByZXR1cm4gYm9vbGVhbgoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHV0T2JqZWN0RmlsZSgkZmlsZSwgJGJ1Y2tldCwgJHVyaSwgJGFjbCA9IHNlbGY6OkFDTF9QUklWQVRFLCAkbWV0YUhlYWRlcnMgPSBhcnJheSgpLCAkY29udGVudFR5cGUgPSBudWxsKQoJewoJCXJldHVybiBzZWxmOjpwdXRPYmplY3Qoc2VsZjo6aW5wdXRGaWxlKCRmaWxlKSwgJGJ1Y2tldCwgJHVyaSwgJGFjbCwgJG1ldGFIZWFkZXJzLCAkY29udGVudFR5cGUpOwoJfQoKCgkvKioKCSogUHV0IGFuIG9iamVjdCBmcm9tIGEgc3RyaW5nIChsZWdhY3kgZnVuY3Rpb24pCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBJbnB1dCBkYXRhCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcGFyYW0gY29uc3RhbnQgJGFjbCBBQ0wgY29uc3RhbnQKCSogQHBhcmFtIGFycmF5ICRtZXRhSGVhZGVycyBBcnJheSBvZiB4LWFtei1tZXRhLSogaGVhZGVycwoJKiBAcGFyYW0gc3RyaW5nICRjb250ZW50VHlwZSBDb250ZW50IHR5cGUKCSogQHJldHVybiBib29sZWFuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwdXRPYmplY3RTdHJpbmcoJHN0cmluZywgJGJ1Y2tldCwgJHVyaSwgJGFjbCA9IHNlbGY6OkFDTF9QUklWQVRFLCAkbWV0YUhlYWRlcnMgPSBhcnJheSgpLCAkY29udGVudFR5cGUgPSAndGV4dC9wbGFpbicpCgl7CgkJcmV0dXJuIHNlbGY6OnB1dE9iamVjdCgkc3RyaW5nLCAkYnVja2V0LCAkdXJpLCAkYWNsLCAkbWV0YUhlYWRlcnMsICRjb250ZW50VHlwZSk7Cgl9CgoKCS8qKgoJKiBHZXQgYW4gb2JqZWN0CgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcGFyYW0gbWl4ZWQgJHNhdmVUbyBGaWxlbmFtZSBvciByZXNvdXJjZSB0byB3cml0ZSB0bwoJKiBAcmV0dXJuIG1peGVkCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPYmplY3QoJGJ1Y2tldCwgJHVyaSwgJHNhdmVUbyA9IGZhbHNlKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnR0VUJywgJGJ1Y2tldCwgJHVyaSwgc2VsZjo6JGVuZHBvaW50KTsKCQlpZiAoJHNhdmVUbyAhPT0gZmFsc2UpCgkJewoJCQlpZiAoaXNfcmVzb3VyY2UoJHNhdmVUbykpCgkJCQkkcmVzdC0+ZnAgPSYgJHNhdmVUbzsKCQkJZWxzZQoJCQkJaWYgKCgkcmVzdC0+ZnAgPSBAZm9wZW4oJHNhdmVUbywgJ3diJykpICE9PSBmYWxzZSkKCQkJCQkkcmVzdC0+ZmlsZSA9IHJlYWxwYXRoKCRzYXZlVG8pOwoJCQkJZWxzZQoJCQkJCSRyZXN0LT5yZXNwb25zZS0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gMCwgJ21lc3NhZ2UnID0+ICdVbmFibGUgdG8gb3BlbiBzYXZlIGZpbGUgZm9yIHdyaXRpbmc6ICcuJHNhdmVUbyk7CgkJfQoJCWlmICgkcmVzdC0+cmVzcG9uc2UtPmVycm9yID09PSBmYWxzZSkgJHJlc3QtPmdldFJlc3BvbnNlKCk7CgoJCWlmICgkcmVzdC0+cmVzcG9uc2UtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+cmVzcG9uc2UtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPnJlc3BvbnNlLT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+cmVzcG9uc2UtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+cmVzcG9uc2UtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpnZXRPYmplY3QoeyRidWNrZXR9LCB7JHVyaX0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPnJlc3BvbnNlLT5lcnJvclsnY29kZSddLCAkcmVzdC0+cmVzcG9uc2UtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiAkcmVzdC0+cmVzcG9uc2U7Cgl9CgoKCS8qKgoJKiBHZXQgb2JqZWN0IGluZm9ybWF0aW9uCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcGFyYW0gYm9vbGVhbiAkcmV0dXJuSW5mbyBSZXR1cm4gcmVzcG9uc2UgaW5mb3JtYXRpb24KCSogQHJldHVybiBtaXhlZCB8IGZhbHNlCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPYmplY3RJbmZvKCRidWNrZXQsICR1cmksICRyZXR1cm5JbmZvID0gdHJ1ZSkKCXsKCQkkcmVzdCA9IG5ldyBTM1JlcXVlc3QoJ0hFQUQnLCAkYnVja2V0LCAkdXJpLCBzZWxmOjokZW5kcG9pbnQpOwoJCSRyZXN0ID0gJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgKCRyZXN0LT5jb2RlICE9PSAyMDAgJiYgJHJlc3QtPmNvZGUgIT09IDQwNCkpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6Z2V0T2JqZWN0SW5mbyh7JGJ1Y2tldH0sIHskdXJpfSk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiAkcmVzdC0+Y29kZSA9PSAyMDAgPyAkcmV0dXJuSW5mbyA/ICRyZXN0LT5oZWFkZXJzIDogdHJ1ZSA6IGZhbHNlOwoJfQoKCgkvKioKCSogQ29weSBhbiBvYmplY3QKCSoKCSogQHBhcmFtIHN0cmluZyAkc3JjQnVja2V0IFNvdXJjZSBidWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICRzcmNVcmkgU291cmNlIG9iamVjdCBVUkkKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IERlc3RpbmF0aW9uIGJ1Y2tldCBuYW1lCgkqIEBwYXJhbSBzdHJpbmcgJHVyaSBEZXN0aW5hdGlvbiBvYmplY3QgVVJJCgkqIEBwYXJhbSBjb25zdGFudCAkYWNsIEFDTCBjb25zdGFudAoJKiBAcGFyYW0gYXJyYXkgJG1ldGFIZWFkZXJzIE9wdGlvbmFsIGFycmF5IG9mIHgtYW16LW1ldGEtKiBoZWFkZXJzCgkqIEBwYXJhbSBhcnJheSAkcmVxdWVzdEhlYWRlcnMgT3B0aW9uYWwgYXJyYXkgb2YgcmVxdWVzdCBoZWFkZXJzIChjb250ZW50IHR5cGUsIGRpc3Bvc2l0aW9uLCBldGMuKQoJKiBAcGFyYW0gY29uc3RhbnQgJHN0b3JhZ2VDbGFzcyBTdG9yYWdlIGNsYXNzIGNvbnN0YW50CgkqIEByZXR1cm4gbWl4ZWQgfCBmYWxzZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29weU9iamVjdCgkc3JjQnVja2V0LCAkc3JjVXJpLCAkYnVja2V0LCAkdXJpLCAkYWNsID0gc2VsZjo6QUNMX1BSSVZBVEUsICRtZXRhSGVhZGVycyA9IGFycmF5KCksICRyZXF1ZXN0SGVhZGVycyA9IGFycmF5KCksICRzdG9yYWdlQ2xhc3MgPSBzZWxmOjpTVE9SQUdFX0NMQVNTX1NUQU5EQVJEKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUFVUJywgJGJ1Y2tldCwgJHVyaSwgc2VsZjo6JGVuZHBvaW50KTsKCQkkcmVzdC0+c2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIDApOwoJCWZvcmVhY2ggKCRyZXF1ZXN0SGVhZGVycyBhcyAkaCA9PiAkdikgJHJlc3QtPnNldEhlYWRlcigkaCwgJHYpOwoJCWZvcmVhY2ggKCRtZXRhSGVhZGVycyBhcyAkaCA9PiAkdikgJHJlc3QtPnNldEFtekhlYWRlcigneC1hbXotbWV0YS0nLiRoLCAkdik7CgkJaWYgKCRzdG9yYWdlQ2xhc3MgIT09IHNlbGY6OlNUT1JBR0VfQ0xBU1NfU1RBTkRBUkQpIC8vIFN0b3JhZ2UgY2xhc3MKCQkJJHJlc3QtPnNldEFtekhlYWRlcigneC1hbXotc3RvcmFnZS1jbGFzcycsICRzdG9yYWdlQ2xhc3MpOwoJCSRyZXN0LT5zZXRBbXpIZWFkZXIoJ3gtYW16LWFjbCcsICRhY2wpOwoJCSRyZXN0LT5zZXRBbXpIZWFkZXIoJ3gtYW16LWNvcHktc291cmNlJywgc3ByaW50ZignLyVzLyVzJywgJHNyY0J1Y2tldCwgcmF3dXJsZW5jb2RlKCRzcmNVcmkpKSk7CgkJaWYgKHNpemVvZigkcmVxdWVzdEhlYWRlcnMpID4gMCB8fCBzaXplb2YoJG1ldGFIZWFkZXJzKSA+IDApCgkJCSRyZXN0LT5zZXRBbXpIZWFkZXIoJ3gtYW16LW1ldGFkYXRhLWRpcmVjdGl2ZScsICdSRVBMQUNFJyk7CgoJCSRyZXN0ID0gJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpjb3B5T2JqZWN0KHskc3JjQnVja2V0fSwgeyRzcmNVcml9LCB7JGJ1Y2tldH0sIHskdXJpfSk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiBpc3NldCgkcmVzdC0+Ym9keS0+TGFzdE1vZGlmaWVkLCAkcmVzdC0+Ym9keS0+RVRhZykgPyBhcnJheSgKCQkJJ3RpbWUnID0+IHN0cnRvdGltZSgoc3RyaW5nKSRyZXN0LT5ib2R5LT5MYXN0TW9kaWZpZWQpLAoJCQknaGFzaCcgPT4gc3Vic3RyKChzdHJpbmcpJHJlc3QtPmJvZHktPkVUYWcsIDEsIC0xKQoJCSkgOiBmYWxzZTsKCX0KCgoJLyoqCgkqIFNldCB1cCBhIGJ1Y2tldCByZWRpcmVjdGlvbgoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gVGFyZ2V0IGhvc3QgbmFtZQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEJ1Y2tldFJlZGlyZWN0KCRidWNrZXQgPSBOVUxMLCAkbG9jYXRpb24gPSBOVUxMKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUFVUJywgJGJ1Y2tldCwgJycsIHNlbGY6OiRlbmRwb2ludCk7CgoJCWlmKCBlbXB0eSgkYnVja2V0KSB8fCBlbXB0eSgkbG9jYXRpb24pICkgewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcigiUzM6OnNldEJ1Y2tldFJlZGlyZWN0KHskYnVja2V0fSwgeyRsb2NhdGlvbn0pOiBFbXB0eSBwYXJhbWV0ZXIuIiwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGRvbSA9IG5ldyBET01Eb2N1bWVudDsKCQkkd2Vic2l0ZUNvbmZpZ3VyYXRpb24gPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdXZWJzaXRlQ29uZmlndXJhdGlvbicpOwoJCSRyZWRpcmVjdEFsbFJlcXVlc3RzVG8gPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdSZWRpcmVjdEFsbFJlcXVlc3RzVG8nKTsKCQkkaG9zdE5hbWUgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdIb3N0TmFtZScsICRsb2NhdGlvbik7CgkJJHJlZGlyZWN0QWxsUmVxdWVzdHNUby0+YXBwZW5kQ2hpbGQoJGhvc3ROYW1lKTsKCQkkd2Vic2l0ZUNvbmZpZ3VyYXRpb24tPmFwcGVuZENoaWxkKCRyZWRpcmVjdEFsbFJlcXVlc3RzVG8pOwoJCSRkb20tPmFwcGVuZENoaWxkKCR3ZWJzaXRlQ29uZmlndXJhdGlvbik7CgkJJHJlc3QtPnNldFBhcmFtZXRlcignd2Vic2l0ZScsIG51bGwpOwoJCSRyZXN0LT5kYXRhID0gJGRvbS0+c2F2ZVhNTCgpOwoJCSRyZXN0LT5zaXplID0gc3RybGVuKCRyZXN0LT5kYXRhKTsKCQkkcmVzdC0+c2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veG1sJyk7CgkJJHJlc3QgPSAkcmVzdC0+Z2V0UmVzcG9uc2UoKTsKCgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpzZXRCdWNrZXRSZWRpcmVjdCh7JGJ1Y2tldH0sIHskbG9jYXRpb259KTogWyVzXSAlcyIsCgkJCSRyZXN0LT5lcnJvclsnY29kZSddLCAkcmVzdC0+ZXJyb3JbJ21lc3NhZ2UnXSksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgoKCS8qKgoJKiBTZXQgbG9nZ2luZyBmb3IgYSBidWNrZXQKCSoKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IEJ1Y2tldCBuYW1lCgkqIEBwYXJhbSBzdHJpbmcgJHRhcmdldEJ1Y2tldCBUYXJnZXQgYnVja2V0ICh3aGVyZSBsb2dzIGFyZSBzdG9yZWQpCgkqIEBwYXJhbSBzdHJpbmcgJHRhcmdldFByZWZpeCBMb2cgcHJlZml4IChlLGc7IGRvbWFpbi5jb20tKQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEJ1Y2tldExvZ2dpbmcoJGJ1Y2tldCwgJHRhcmdldEJ1Y2tldCwgJHRhcmdldFByZWZpeCA9IG51bGwpCgl7CgkJLy8gVGhlIFMzIGxvZyBkZWxpdmVyeSBncm91cCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlIHRhcmdldCBidWNrZXQncyBBQ1AKCQlpZiAoJHRhcmdldEJ1Y2tldCAhPT0gbnVsbCAmJiAoJGFjcCA9IHNlbGY6OmdldEFjY2Vzc0NvbnRyb2xQb2xpY3koJHRhcmdldEJ1Y2tldCwgJycpKSAhPT0gZmFsc2UpCgkJewoJCQkvLyBPbmx5IGFkZCBwZXJtaXNzaW9ucyB0byB0aGUgdGFyZ2V0IGJ1Y2tldCB3aGVuIHRoZXkgZG8gbm90IGV4aXN0CgkJCSRhY2xXcml0ZVNldCA9IGZhbHNlOwoJCQkkYWNsUmVhZFNldCA9IGZhbHNlOwoJCQlmb3JlYWNoICgkYWNwWydhY2wnXSBhcyAkYWNsKQoJCQlpZiAoJGFjbFsndHlwZSddID09ICdHcm91cCcgJiYgJGFjbFsndXJpJ10gPT0gJ2h0dHA6Ly9hY3MuYW1hem9uYXdzLmNvbS9ncm91cHMvczMvTG9nRGVsaXZlcnknKQoJCQl7CgkJCQlpZiAoJGFjbFsncGVybWlzc2lvbiddID09ICdXUklURScpICRhY2xXcml0ZVNldCA9IHRydWU7CgkJCQllbHNlaWYgKCRhY2xbJ3Blcm1pc3Npb24nXSA9PSAnUkVBRF9BQ1AnKSAkYWNsUmVhZFNldCA9IHRydWU7CgkJCX0KCQkJaWYgKCEkYWNsV3JpdGVTZXQpICRhY3BbJ2FjbCddW10gPSBhcnJheSgKCQkJCSd0eXBlJyA9PiAnR3JvdXAnLCAndXJpJyA9PiAnaHR0cDovL2Fjcy5hbWF6b25hd3MuY29tL2dyb3Vwcy9zMy9Mb2dEZWxpdmVyeScsICdwZXJtaXNzaW9uJyA9PiAnV1JJVEUnCgkJCSk7CgkJCWlmICghJGFjbFJlYWRTZXQpICRhY3BbJ2FjbCddW10gPSBhcnJheSgKCQkJCSd0eXBlJyA9PiAnR3JvdXAnLCAndXJpJyA9PiAnaHR0cDovL2Fjcy5hbWF6b25hd3MuY29tL2dyb3Vwcy9zMy9Mb2dEZWxpdmVyeScsICdwZXJtaXNzaW9uJyA9PiAnUkVBRF9BQ1AnCgkJCSk7CgkJCWlmICghJGFjbFJlYWRTZXQgfHwgISRhY2xXcml0ZVNldCkgc2VsZjo6c2V0QWNjZXNzQ29udHJvbFBvbGljeSgkdGFyZ2V0QnVja2V0LCAnJywgJGFjcCk7CgkJfQoKCQkkZG9tID0gbmV3IERPTURvY3VtZW50OwoJCSRidWNrZXRMb2dnaW5nU3RhdHVzID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnQnVja2V0TG9nZ2luZ1N0YXR1cycpOwoJCSRidWNrZXRMb2dnaW5nU3RhdHVzLT5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly9zMy5hbWF6b25hd3MuY29tL2RvYy8yMDA2LTAzLTAxLycpOwoJCWlmICgkdGFyZ2V0QnVja2V0ICE9PSBudWxsKQoJCXsKCQkJaWYgKCR0YXJnZXRQcmVmaXggPT0gbnVsbCkgJHRhcmdldFByZWZpeCA9ICRidWNrZXQgLiAnLSc7CgkJCSRsb2dnaW5nRW5hYmxlZCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ0xvZ2dpbmdFbmFibGVkJyk7CgkJCSRsb2dnaW5nRW5hYmxlZC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnVGFyZ2V0QnVja2V0JywgJHRhcmdldEJ1Y2tldCkpOwoJCQkkbG9nZ2luZ0VuYWJsZWQtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ1RhcmdldFByZWZpeCcsICR0YXJnZXRQcmVmaXgpKTsKCQkJLy8gVE9ETzogQWRkIFRhcmdldEdyYW50cz8KCQkJJGJ1Y2tldExvZ2dpbmdTdGF0dXMtPmFwcGVuZENoaWxkKCRsb2dnaW5nRW5hYmxlZCk7CgkJfQoJCSRkb20tPmFwcGVuZENoaWxkKCRidWNrZXRMb2dnaW5nU3RhdHVzKTsKCgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdQVVQnLCAkYnVja2V0LCAnJywgc2VsZjo6JGVuZHBvaW50KTsKCQkkcmVzdC0+c2V0UGFyYW1ldGVyKCdsb2dnaW5nJywgbnVsbCk7CgkJJHJlc3QtPmRhdGEgPSAkZG9tLT5zYXZlWE1MKCk7CgkJJHJlc3QtPnNpemUgPSBzdHJsZW4oJHJlc3QtPmRhdGEpOwoJCSRyZXN0LT5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94bWwnKTsKCQkkcmVzdCA9ICRyZXN0LT5nZXRSZXNwb25zZSgpOwoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDApCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6c2V0QnVja2V0TG9nZ2luZyh7JGJ1Y2tldH0sIHskdGFyZ2V0QnVja2V0fSk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSogR2V0IGxvZ2dpbmcgc3RhdHVzIGZvciBhIGJ1Y2tldAoJKgoJKiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQuCgkqIE5vdGU6IFRvIGVuYWJsZSBsb2dnaW5nLCB5b3UgYWxzbyBuZWVkIHRvIGdyYW50IHdyaXRlIGFjY2VzcyB0byB0aGUgbG9nIGdyb3VwCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcmV0dXJuIGFycmF5IHwgZmFsc2UKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEJ1Y2tldExvZ2dpbmcoJGJ1Y2tldCkKCXsKCQkkcmVzdCA9IG5ldyBTM1JlcXVlc3QoJ0dFVCcsICRidWNrZXQsICcnLCBzZWxmOjokZW5kcG9pbnQpOwoJCSRyZXN0LT5zZXRQYXJhbWV0ZXIoJ2xvZ2dpbmcnLCBudWxsKTsKCQkkcmVzdCA9ICRyZXN0LT5nZXRSZXNwb25zZSgpOwoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDApCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6Z2V0QnVja2V0TG9nZ2luZyh7JGJ1Y2tldH0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoIWlzc2V0KCRyZXN0LT5ib2R5LT5Mb2dnaW5nRW5hYmxlZCkpIHJldHVybiBmYWxzZTsgLy8gTm8gbG9nZ2luZwoJCXJldHVybiBhcnJheSgKCQkJJ3RhcmdldEJ1Y2tldCcgPT4gKHN0cmluZykkcmVzdC0+Ym9keS0+TG9nZ2luZ0VuYWJsZWQtPlRhcmdldEJ1Y2tldCwKCQkJJ3RhcmdldFByZWZpeCcgPT4gKHN0cmluZykkcmVzdC0+Ym9keS0+TG9nZ2luZ0VuYWJsZWQtPlRhcmdldFByZWZpeCwKCQkpOwoJfQoKCgkvKioKCSogRGlzYWJsZSBidWNrZXQgbG9nZ2luZwoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHJldHVybiBib29sZWFuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhYmxlQnVja2V0TG9nZ2luZygkYnVja2V0KQoJewoJCXJldHVybiBzZWxmOjpzZXRCdWNrZXRMb2dnaW5nKCRidWNrZXQsIG51bGwpOwoJfQoKCgkvKioKCSogR2V0IGEgYnVja2V0J3MgbG9jYXRpb24KCSoKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IEJ1Y2tldCBuYW1lCgkqIEByZXR1cm4gc3RyaW5nIHwgZmFsc2UKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEJ1Y2tldExvY2F0aW9uKCRidWNrZXQpCgl7CgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdHRVQnLCAkYnVja2V0LCAnJywgc2VsZjo6JGVuZHBvaW50KTsKCQkkcmVzdC0+c2V0UGFyYW1ldGVyKCdsb2NhdGlvbicsIG51bGwpOwoJCSRyZXN0ID0gJHJlc3QtPmdldFJlc3BvbnNlKCk7CgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpnZXRCdWNrZXRMb2NhdGlvbih7JGJ1Y2tldH0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gKGlzc2V0KCRyZXN0LT5ib2R5WzBdKSAmJiAoc3RyaW5nKSRyZXN0LT5ib2R5WzBdICE9PSAnJykgPyAoc3RyaW5nKSRyZXN0LT5ib2R5WzBdIDogJ1VTJzsKCX0KCgoJLyoqCgkqIFNldCBvYmplY3Qgb3IgYnVja2V0IEFjY2VzcyBDb250cm9sIFBvbGljeQoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIHN0cmluZyAkdXJpIE9iamVjdCBVUkkKCSogQHBhcmFtIGFycmF5ICRhY3AgQWNjZXNzIENvbnRyb2wgUG9saWN5IERhdGEgKHNhbWUgYXMgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSBnZXRBY2Nlc3NDb250cm9sUG9saWN5KQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEFjY2Vzc0NvbnRyb2xQb2xpY3koJGJ1Y2tldCwgJHVyaSA9ICcnLCAkYWNwID0gYXJyYXkoKSkKCXsKCQkkZG9tID0gbmV3IERPTURvY3VtZW50OwoJCSRkb20tPmZvcm1hdE91dHB1dCA9IHRydWU7CgkJJGFjY2Vzc0NvbnRyb2xQb2xpY3kgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdBY2Nlc3NDb250cm9sUG9saWN5Jyk7CgkJJGFjY2Vzc0NvbnRyb2xMaXN0ID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnQWNjZXNzQ29udHJvbExpc3QnKTsKCgkJLy8gSXQgc2VlbXMgdGhlIG93bmVyIGhhcyB0byBiZSBwYXNzZWQgYWxvbmcgdG9vCgkJJG93bmVyID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnT3duZXInKTsKCQkkb3duZXItPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ0lEJywgJGFjcFsnb3duZXInXVsnaWQnXSkpOwoJCSRvd25lci0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnRGlzcGxheU5hbWUnLCAkYWNwWydvd25lciddWyduYW1lJ10pKTsKCQkkYWNjZXNzQ29udHJvbFBvbGljeS0+YXBwZW5kQ2hpbGQoJG93bmVyKTsKCgkJZm9yZWFjaCAoJGFjcFsnYWNsJ10gYXMgJGcpCgkJewoJCQkkZ3JhbnQgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdHcmFudCcpOwoJCQkkZ3JhbnRlZSA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ0dyYW50ZWUnKTsKCQkJJGdyYW50ZWUtPnNldEF0dHJpYnV0ZSgneG1sbnM6eHNpJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyk7CgkJCWlmIChpc3NldCgkZ1snaWQnXSkpCgkJCXsgLy8gQ2Fub25pY2FsVXNlciAoRGlzcGxheU5hbWUgaXMgb21pdHRlZCkKCQkJCSRncmFudGVlLT5zZXRBdHRyaWJ1dGUoJ3hzaTp0eXBlJywgJ0Nhbm9uaWNhbFVzZXInKTsKCQkJCSRncmFudGVlLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCdJRCcsICRnWydpZCddKSk7CgkJCX0KCQkJZWxzZWlmIChpc3NldCgkZ1snZW1haWwnXSkpCgkJCXsgLy8gQW1hem9uQ3VzdG9tZXJCeUVtYWlsCgkJCQkkZ3JhbnRlZS0+c2V0QXR0cmlidXRlKCd4c2k6dHlwZScsICdBbWF6b25DdXN0b21lckJ5RW1haWwnKTsKCQkJCSRncmFudGVlLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCdFbWFpbEFkZHJlc3MnLCAkZ1snZW1haWwnXSkpOwoJCQl9CgkJCWVsc2VpZiAoJGdbJ3R5cGUnXSA9PSAnR3JvdXAnKQoJCQl7IC8vIEdyb3VwCgkJCQkkZ3JhbnRlZS0+c2V0QXR0cmlidXRlKCd4c2k6dHlwZScsICdHcm91cCcpOwoJCQkJJGdyYW50ZWUtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ1VSSScsICRnWyd1cmknXSkpOwoJCQl9CgkJCSRncmFudC0+YXBwZW5kQ2hpbGQoJGdyYW50ZWUpOwoJCQkkZ3JhbnQtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ1Blcm1pc3Npb24nLCAkZ1sncGVybWlzc2lvbiddKSk7CgkJCSRhY2Nlc3NDb250cm9sTGlzdC0+YXBwZW5kQ2hpbGQoJGdyYW50KTsKCQl9CgoJCSRhY2Nlc3NDb250cm9sUG9saWN5LT5hcHBlbmRDaGlsZCgkYWNjZXNzQ29udHJvbExpc3QpOwoJCSRkb20tPmFwcGVuZENoaWxkKCRhY2Nlc3NDb250cm9sUG9saWN5KTsKCgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdQVVQnLCAkYnVja2V0LCAkdXJpLCBzZWxmOjokZW5kcG9pbnQpOwoJCSRyZXN0LT5zZXRQYXJhbWV0ZXIoJ2FjbCcsIG51bGwpOwoJCSRyZXN0LT5kYXRhID0gJGRvbS0+c2F2ZVhNTCgpOwoJCSRyZXN0LT5zaXplID0gc3RybGVuKCRyZXN0LT5kYXRhKTsKCQkkcmVzdC0+c2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veG1sJyk7CgkJJHJlc3QgPSAkcmVzdC0+Z2V0UmVzcG9uc2UoKTsKCQlpZiAoJHJlc3QtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gJHJlc3QtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OnNldEFjY2Vzc0NvbnRyb2xQb2xpY3koeyRidWNrZXR9LCB7JHVyaX0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkqIEdldCBvYmplY3Qgb3IgYnVja2V0IEFjY2VzcyBDb250cm9sIFBvbGljeQoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIHN0cmluZyAkdXJpIE9iamVjdCBVUkkKCSogQHJldHVybiBtaXhlZCB8IGZhbHNlCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBY2Nlc3NDb250cm9sUG9saWN5KCRidWNrZXQsICR1cmkgPSAnJykKCXsKCQkkcmVzdCA9IG5ldyBTM1JlcXVlc3QoJ0dFVCcsICRidWNrZXQsICR1cmksIHNlbGY6OiRlbmRwb2ludCk7CgkJJHJlc3QtPnNldFBhcmFtZXRlcignYWNsJywgbnVsbCk7CgkJJHJlc3QgPSAkcmVzdC0+Z2V0UmVzcG9uc2UoKTsKCQlpZiAoJHJlc3QtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gJHJlc3QtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OmdldEFjY2Vzc0NvbnRyb2xQb2xpY3koeyRidWNrZXR9LCB7JHVyaX0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJGFjcCA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRyZXN0LT5ib2R5LT5Pd25lciwgJHJlc3QtPmJvZHktPk93bmVyLT5JRCwgJHJlc3QtPmJvZHktPk93bmVyLT5EaXNwbGF5TmFtZSkpCgkJCSRhY3BbJ293bmVyJ10gPSBhcnJheSgKCQkJCSdpZCcgPT4gKHN0cmluZykkcmVzdC0+Ym9keS0+T3duZXItPklELCAnbmFtZScgPT4gKHN0cmluZykkcmVzdC0+Ym9keS0+T3duZXItPkRpc3BsYXlOYW1lCgkJCSk7CgoJCWlmIChpc3NldCgkcmVzdC0+Ym9keS0+QWNjZXNzQ29udHJvbExpc3QpKQoJCXsKCQkJJGFjcFsnYWNsJ10gPSBhcnJheSgpOwoJCQlmb3JlYWNoICgkcmVzdC0+Ym9keS0+QWNjZXNzQ29udHJvbExpc3QtPkdyYW50IGFzICRncmFudCkKCQkJewoJCQkJZm9yZWFjaCAoJGdyYW50LT5HcmFudGVlIGFzICRncmFudGVlKQoJCQkJewoJCQkJCWlmIChpc3NldCgkZ3JhbnRlZS0+SUQsICRncmFudGVlLT5EaXNwbGF5TmFtZSkpIC8vIENhbm9uaWNhbFVzZXIKCQkJCQkJJGFjcFsnYWNsJ11bXSA9IGFycmF5KAoJCQkJCQkJJ3R5cGUnID0+ICdDYW5vbmljYWxVc2VyJywKCQkJCQkJCSdpZCcgPT4gKHN0cmluZykkZ3JhbnRlZS0+SUQsCgkJCQkJCQknbmFtZScgPT4gKHN0cmluZykkZ3JhbnRlZS0+RGlzcGxheU5hbWUsCgkJCQkJCQkncGVybWlzc2lvbicgPT4gKHN0cmluZykkZ3JhbnQtPlBlcm1pc3Npb24KCQkJCQkJKTsKCQkJCQllbHNlaWYgKGlzc2V0KCRncmFudGVlLT5FbWFpbEFkZHJlc3MpKSAvLyBBbWF6b25DdXN0b21lckJ5RW1haWwKCQkJCQkJJGFjcFsnYWNsJ11bXSA9IGFycmF5KAoJCQkJCQkJJ3R5cGUnID0+ICdBbWF6b25DdXN0b21lckJ5RW1haWwnLAoJCQkJCQkJJ2VtYWlsJyA9PiAoc3RyaW5nKSRncmFudGVlLT5FbWFpbEFkZHJlc3MsCgkJCQkJCQkncGVybWlzc2lvbicgPT4gKHN0cmluZykkZ3JhbnQtPlBlcm1pc3Npb24KCQkJCQkJKTsKCQkJCQllbHNlaWYgKGlzc2V0KCRncmFudGVlLT5VUkkpKSAvLyBHcm91cAoJCQkJCQkkYWNwWydhY2wnXVtdID0gYXJyYXkoCgkJCQkJCQkndHlwZScgPT4gJ0dyb3VwJywKCQkJCQkJCSd1cmknID0+IChzdHJpbmcpJGdyYW50ZWUtPlVSSSwKCQkJCQkJCSdwZXJtaXNzaW9uJyA9PiAoc3RyaW5nKSRncmFudC0+UGVybWlzc2lvbgoJCQkJCQkpOwoJCQkJCWVsc2UgY29udGludWU7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuICRhY3A7Cgl9CgoKCS8qKgoJKiBEZWxldGUgYW4gb2JqZWN0CgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlbGV0ZU9iamVjdCgkYnVja2V0LCAkdXJpKQoJewoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnREVMRVRFJywgJGJ1Y2tldCwgJHVyaSwgc2VsZjo6JGVuZHBvaW50KTsKCQkkcmVzdCA9ICRyZXN0LT5nZXRSZXNwb25zZSgpOwoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDQpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6ZGVsZXRlT2JqZWN0KCk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSogR2V0IGEgcXVlcnkgc3RyaW5nIGF1dGhlbnRpY2F0ZWQgVVJMCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGJ1Y2tldCBCdWNrZXQgbmFtZQoJKiBAcGFyYW0gc3RyaW5nICR1cmkgT2JqZWN0IFVSSQoJKiBAcGFyYW0gaW50ZWdlciAkbGlmZXRpbWUgTGlmZXRpbWUgaW4gc2Vjb25kcwoJKiBAcGFyYW0gYm9vbGVhbiAkaG9zdEJ1Y2tldCBVc2UgdGhlIGJ1Y2tldCBuYW1lIGFzIHRoZSBob3N0bmFtZQoJKiBAcGFyYW0gYm9vbGVhbiAkaHR0cHMgVXNlIEhUVFBTICgkaG9zdEJ1Y2tldCBzaG91bGQgYmUgZmFsc2UgZm9yIFNTTCB2ZXJpZmljYXRpb24pCgkqIEByZXR1cm4gc3RyaW5nCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGVkVVJMKCRidWNrZXQsICR1cmksICRsaWZldGltZSwgJGhvc3RCdWNrZXQgPSBmYWxzZSwgJGh0dHBzID0gZmFsc2UpCgl7CgkJJGV4cGlyZXMgPSB0aW1lKCkgKyAkbGlmZXRpbWU7CgkJJHVyaSA9IHN0cl9yZXBsYWNlKGFycmF5KCclMkYnLCAnJTJCJyksIGFycmF5KCcvJywgJysnKSwgcmF3dXJsZW5jb2RlKCR1cmkpKTsKCQlyZXR1cm4gc3ByaW50ZigoJGh0dHBzID8gJ2h0dHBzJyA6ICdodHRwJykuJzovLyVzLyVzP0FXU0FjY2Vzc0tleUlkPSVzJkV4cGlyZXM9JXUmU2lnbmF0dXJlPSVzJywKCQkvLyAkaG9zdEJ1Y2tldCA/ICRidWNrZXQgOiAkYnVja2V0LicuczMuYW1hem9uYXdzLmNvbScsICR1cmksIHNlbGY6OiRfX2FjY2Vzc0tleSwgJGV4cGlyZXMsCgkJJGhvc3RCdWNrZXQgPyAkYnVja2V0IDogc2VsZjo6JGVuZHBvaW50LicvJy4kYnVja2V0LCAkdXJpLCBzZWxmOjokX19hY2Nlc3NLZXksICRleHBpcmVzLAoJCXVybGVuY29kZShzZWxmOjpfX2dldEhhc2goIkdFVFxuXG5cbnskZXhwaXJlc31cbi97JGJ1Y2tldH0veyR1cml9IikpKTsKCX0KCgoJLyoqCgkqIEdldCBhIENsb3VkRnJvbnQgc2lnbmVkIHBvbGljeSBVUkwKCSoKCSogQHBhcmFtIGFycmF5ICRwb2xpY3kgUG9saWN5CgkqIEByZXR1cm4gc3RyaW5nCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTaWduZWRQb2xpY3lVUkwoJHBvbGljeSkKCXsKCQkkZGF0YSA9IGpzb25fZW5jb2RlKCRwb2xpY3kpOwoJCSRzaWduYXR1cmUgPSAnJzsKCQlpZiAoIW9wZW5zc2xfc2lnbigkZGF0YSwgJHNpZ25hdHVyZSwgc2VsZjo6JF9fc2lnbmluZ0tleVJlc291cmNlKSkgcmV0dXJuIGZhbHNlOwoKCQkkZW5jb2RlZCA9IHN0cl9yZXBsYWNlKGFycmF5KCcrJywgJz0nKSwgYXJyYXkoJy0nLCAnXycsICd+JyksIGJhc2U2NF9lbmNvZGUoJGRhdGEpKTsKCQkkc2lnbmF0dXJlID0gc3RyX3JlcGxhY2UoYXJyYXkoJysnLCAnPScpLCBhcnJheSgnLScsICdfJywgJ34nKSwgYmFzZTY0X2VuY29kZSgkc2lnbmF0dXJlKSk7CgoJCSR1cmwgPSAkcG9saWN5WydTdGF0ZW1lbnQnXVswXVsnUmVzb3VyY2UnXSAuICc/JzsKCQlmb3JlYWNoIChhcnJheSgnUG9saWN5JyA9PiAkZW5jb2RlZCwgJ1NpZ25hdHVyZScgPT4gJHNpZ25hdHVyZSwgJ0tleS1QYWlyLUlkJyA9PiBzZWxmOjokX19zaWduaW5nS2V5UGFpcklkKSBhcyAkayA9PiAkdikKCQkJJHVybCAuPSAkay4nPScuc3RyX3JlcGxhY2UoJyUyRicsICcvJywgcmF3dXJsZW5jb2RlKCR2KSkuJyYnOwoJCXJldHVybiBzdWJzdHIoJHVybCwgMCwgLTEpOwoJfQoKCgkvKioKCSogR2V0IGEgQ2xvdWRGcm9udCBjYW5uZWQgcG9saWN5IFVSTAoJKgoJKiBAcGFyYW0gc3RyaW5nICR1cmwgVVJMIHRvIHNpZ24KCSogQHBhcmFtIGludGVnZXIgJGxpZmV0aW1lIFVSTCBsaWZldGltZQoJKiBAcmV0dXJuIHN0cmluZwoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U2lnbmVkQ2FubmVkVVJMKCR1cmwsICRsaWZldGltZSkKCXsKCQlyZXR1cm4gc2VsZjo6Z2V0U2lnbmVkUG9saWN5VVJMKGFycmF5KAoJCQknU3RhdGVtZW50JyA9PiBhcnJheSgKCQkJCWFycmF5KCdSZXNvdXJjZScgPT4gJHVybCwgJ0NvbmRpdGlvbicgPT4gYXJyYXkoCgkJCQkJJ0RhdGVMZXNzVGhhbicgPT4gYXJyYXkoJ0FXUzpFcG9jaFRpbWUnID0+IHRpbWUoKSArICRsaWZldGltZSkKCQkJCSkpCgkJCSkKCQkpKTsKCX0KCgoJLyoqCgkqIEdldCB1cGxvYWQgUE9TVCBwYXJhbWV0ZXJzIGZvciBmb3JtIHVwbG9hZHMKCSoKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IEJ1Y2tldCBuYW1lCgkqIEBwYXJhbSBzdHJpbmcgJHVyaVByZWZpeCBPYmplY3QgVVJJIHByZWZpeAoJKiBAcGFyYW0gY29uc3RhbnQgJGFjbCBBQ0wgY29uc3RhbnQKCSogQHBhcmFtIGludGVnZXIgJGxpZmV0aW1lIExpZmV0aW1lIGluIHNlY29uZHMKCSogQHBhcmFtIGludGVnZXIgJG1heEZpbGVTaXplIE1heGltdW0gZmlsZXNpemUgaW4gYnl0ZXMgKGRlZmF1bHQgNU1CKQoJKiBAcGFyYW0gc3RyaW5nICRzdWNjZXNzUmVkaXJlY3QgUmVkaXJlY3QgVVJMIG9yIDIwMCAvIDIwMSBzdGF0dXMgY29kZQoJKiBAcGFyYW0gYXJyYXkgJGFtekhlYWRlcnMgQXJyYXkgb2YgeC1hbXotbWV0YS0qIGhlYWRlcnMKCSogQHBhcmFtIGFycmF5ICRoZWFkZXJzIEFycmF5IG9mIHJlcXVlc3QgaGVhZGVycyBvciBjb250ZW50IHR5cGUgYXMgYSBzdHJpbmcKCSogQHBhcmFtIGJvb2xlYW4gJGZsYXNoVmFycyBJbmNsdWRlcyBhZGRpdGlvbmFsICJGaWxlbmFtZSIgdmFyaWFibGUgcG9zdGVkIGJ5IEZsYXNoCgkqIEByZXR1cm4gb2JqZWN0CgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRIdHRwVXBsb2FkUG9zdFBhcmFtcygkYnVja2V0LCAkdXJpUHJlZml4ID0gJycsICRhY2wgPSBzZWxmOjpBQ0xfUFJJVkFURSwgJGxpZmV0aW1lID0gMzYwMCwKCSRtYXhGaWxlU2l6ZSA9IDUyNDI4ODAsICRzdWNjZXNzUmVkaXJlY3QgPSAiMjAxIiwgJGFtekhlYWRlcnMgPSBhcnJheSgpLCAkaGVhZGVycyA9IGFycmF5KCksICRmbGFzaFZhcnMgPSBmYWxzZSkKCXsKCQkvLyBDcmVhdGUgcG9saWN5IG9iamVjdAoJCSRwb2xpY3kgPSBuZXcgc3RkQ2xhc3M7CgkJJHBvbGljeS0+ZXhwaXJhdGlvbiA9IGdtZGF0ZSgnWS1tLWRcVEg6aTpzXFonLCAodGltZSgpICsgJGxpZmV0aW1lKSk7CgkJJHBvbGljeS0+Y29uZGl0aW9ucyA9IGFycmF5KCk7CgkJJG9iaiA9IG5ldyBzdGRDbGFzczsgJG9iai0+YnVja2V0ID0gJGJ1Y2tldDsgYXJyYXlfcHVzaCgkcG9saWN5LT5jb25kaXRpb25zLCAkb2JqKTsKCQkkb2JqID0gbmV3IHN0ZENsYXNzOyAkb2JqLT5hY2wgPSAkYWNsOyBhcnJheV9wdXNoKCRwb2xpY3ktPmNvbmRpdGlvbnMsICRvYmopOwoKCQkkb2JqID0gbmV3IHN0ZENsYXNzOyAvLyAyMDAgZm9yIG5vbi1yZWRpcmVjdCB1cGxvYWRzCgkJaWYgKGlzX251bWVyaWMoJHN1Y2Nlc3NSZWRpcmVjdCkgJiYgaW5fYXJyYXkoKGludCkkc3VjY2Vzc1JlZGlyZWN0LCBhcnJheSgyMDAsIDIwMSkpKQoJCQkkb2JqLT5zdWNjZXNzX2FjdGlvbl9zdGF0dXMgPSAoc3RyaW5nKSRzdWNjZXNzUmVkaXJlY3Q7CgkJZWxzZSAvLyBVUkwKCQkJJG9iai0+c3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QgPSAkc3VjY2Vzc1JlZGlyZWN0OwoJCWFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgJG9iaik7CgoJCWlmICgkYWNsICE9PSBzZWxmOjpBQ0xfUFVCTElDX1JFQUQpCgkJCWFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgYXJyYXkoJ2VxJywgJyRhY2wnLCAkYWNsKSk7CgoJCWFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgYXJyYXkoJ3N0YXJ0cy13aXRoJywgJyRrZXknLCAkdXJpUHJlZml4KSk7CgkJaWYgKCRmbGFzaFZhcnMpIGFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgYXJyYXkoJ3N0YXJ0cy13aXRoJywgJyRGaWxlbmFtZScsICcnKSk7CgkJZm9yZWFjaCAoYXJyYXlfa2V5cygkaGVhZGVycykgYXMgJGhlYWRlcktleSkKCQkJYXJyYXlfcHVzaCgkcG9saWN5LT5jb25kaXRpb25zLCBhcnJheSgnc3RhcnRzLXdpdGgnLCAnJCcuJGhlYWRlcktleSwgJycpKTsKCQlmb3JlYWNoICgkYW16SGVhZGVycyBhcyAkaGVhZGVyS2V5ID0+ICRoZWFkZXJWYWwpCgkJewoJCQkkb2JqID0gbmV3IHN0ZENsYXNzOwoJCQkkb2JqLT57JGhlYWRlcktleX0gPSAoc3RyaW5nKSRoZWFkZXJWYWw7CgkJCWFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgJG9iaik7CgkJfQoJCWFycmF5X3B1c2goJHBvbGljeS0+Y29uZGl0aW9ucywgYXJyYXkoJ2NvbnRlbnQtbGVuZ3RoLXJhbmdlJywgMCwgJG1heEZpbGVTaXplKSk7CgkJJHBvbGljeSA9IGJhc2U2NF9lbmNvZGUoc3RyX3JlcGxhY2UoJ1wvJywgJy8nLCBqc29uX2VuY29kZSgkcG9saWN5KSkpOwoKCQkvLyBDcmVhdGUgcGFyYW1ldGVycwoJCSRwYXJhbXMgPSBuZXcgc3RkQ2xhc3M7CgkJJHBhcmFtcy0+QVdTQWNjZXNzS2V5SWQgPSBzZWxmOjokX19hY2Nlc3NLZXk7CgkJJHBhcmFtcy0+a2V5ID0gJHVyaVByZWZpeC4nJHtmaWxlbmFtZX0nOwoJCSRwYXJhbXMtPmFjbCA9ICRhY2w7CgkJJHBhcmFtcy0+cG9saWN5ID0gJHBvbGljeTsgdW5zZXQoJHBvbGljeSk7CgkJJHBhcmFtcy0+c2lnbmF0dXJlID0gc2VsZjo6X19nZXRIYXNoKCRwYXJhbXMtPnBvbGljeSk7CgkJaWYgKGlzX251bWVyaWMoJHN1Y2Nlc3NSZWRpcmVjdCkgJiYgaW5fYXJyYXkoKGludCkkc3VjY2Vzc1JlZGlyZWN0LCBhcnJheSgyMDAsIDIwMSkpKQoJCQkkcGFyYW1zLT5zdWNjZXNzX2FjdGlvbl9zdGF0dXMgPSAoc3RyaW5nKSRzdWNjZXNzUmVkaXJlY3Q7CgkJZWxzZQoJCQkkcGFyYW1zLT5zdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCA9ICRzdWNjZXNzUmVkaXJlY3Q7CgkJZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcktleSA9PiAkaGVhZGVyVmFsKSAkcGFyYW1zLT57JGhlYWRlcktleX0gPSAoc3RyaW5nKSRoZWFkZXJWYWw7CgkJZm9yZWFjaCAoJGFtekhlYWRlcnMgYXMgJGhlYWRlcktleSA9PiAkaGVhZGVyVmFsKSAkcGFyYW1zLT57JGhlYWRlcktleX0gPSAoc3RyaW5nKSRoZWFkZXJWYWw7CgkJcmV0dXJuICRwYXJhbXM7Cgl9CgoKCS8qKgoJKiBDcmVhdGUgYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbgoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIGJvb2xlYW4gJGVuYWJsZWQgRW5hYmxlZCAodHJ1ZS9mYWxzZSkKCSogQHBhcmFtIGFycmF5ICRjbmFtZXMgQXJyYXkgY29udGFpbmluZyBDTkFNRSBhbGlhc2VzCgkqIEBwYXJhbSBzdHJpbmcgJGNvbW1lbnQgVXNlIHRoZSBidWNrZXQgbmFtZSBhcyB0aGUgaG9zdG5hbWUKCSogQHBhcmFtIHN0cmluZyAkZGVmYXVsdFJvb3RPYmplY3QgRGVmYXVsdCByb290IG9iamVjdAoJKiBAcGFyYW0gc3RyaW5nICRvcmlnaW5BY2Nlc3NJZGVudGl0eSBPcmlnaW4gYWNjZXNzIGlkZW50aXR5CgkqIEBwYXJhbSBhcnJheSAkdHJ1c3RlZFNpZ25lcnMgQXJyYXkgb2YgdHJ1c3RlZCBzaWduZXJzCgkqIEByZXR1cm4gYXJyYXkgfCBmYWxzZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRGlzdHJpYnV0aW9uKCRidWNrZXQsICRlbmFibGVkID0gdHJ1ZSwgJGNuYW1lcyA9IGFycmF5KCksICRjb21tZW50ID0gbnVsbCwgJGRlZmF1bHRSb290T2JqZWN0ID0gbnVsbCwgJG9yaWdpbkFjY2Vzc0lkZW50aXR5ID0gbnVsbCwgJHRydXN0ZWRTaWduZXJzID0gYXJyYXkoKSkKCXsKCQlpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpjcmVhdGVEaXN0cmlidXRpb24oeyRidWNrZXR9LCAiLihpbnQpJGVuYWJsZWQuIiwgW10sICckY29tbWVudCcpOiAlcyIsCgkJCSJDbG91ZEZyb250IGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgU1NMIiksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHVzZVNTTCA9IHNlbGY6OiR1c2VTU0w7CgoJCXNlbGY6OiR1c2VTU0wgPSB0cnVlOyAvLyBDbG91ZEZyb250IHJlcXVpcmVzIFNTTAoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUE9TVCcsICcnLCAnMjAxMC0xMS0wMS9kaXN0cmlidXRpb24nLCAnY2xvdWRmcm9udC5hbWF6b25hd3MuY29tJyk7CgkJJHJlc3QtPmRhdGEgPSBzZWxmOjpfX2dldENsb3VkRnJvbnREaXN0cmlidXRpb25Db25maWdYTUwoCgkJCSRidWNrZXQuJy5zMy5hbWF6b25hd3MuY29tJywKCQkJJGVuYWJsZWQsCgkJCShzdHJpbmcpJGNvbW1lbnQsCgkJCShzdHJpbmcpbWljcm90aW1lKHRydWUpLAoJCQkkY25hbWVzLAoJCQkkZGVmYXVsdFJvb3RPYmplY3QsCgkJCSRvcmlnaW5BY2Nlc3NJZGVudGl0eSwKCQkJJHRydXN0ZWRTaWduZXJzCgkJKTsKCgkJJHJlc3QtPnNpemUgPSBzdHJsZW4oJHJlc3QtPmRhdGEpOwoJCSRyZXN0LT5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94bWwnKTsKCQkkcmVzdCA9IHNlbGY6Ol9fZ2V0Q2xvdWRGcm9udFJlc3BvbnNlKCRyZXN0KTsKCgkJc2VsZjo6JHVzZVNTTCA9ICR1c2VTU0w7CgoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDEpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6Y3JlYXRlRGlzdHJpYnV0aW9uKHskYnVja2V0fSwgIi4oaW50KSRlbmFibGVkLiIsIFtdLCAnJGNvbW1lbnQnKTogWyVzXSAlcyIsCgkJCSRyZXN0LT5lcnJvclsnY29kZSddLCAkcmVzdC0+ZXJyb3JbJ21lc3NhZ2UnXSksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2VpZiAoJHJlc3QtPmJvZHkgaW5zdGFuY2VvZiBTaW1wbGVYTUxFbGVtZW50KQoJCQlyZXR1cm4gc2VsZjo6X19wYXJzZUNsb3VkRnJvbnREaXN0cmlidXRpb25Db25maWcoJHJlc3QtPmJvZHkpOwoJCXJldHVybiBmYWxzZTsKCX0KCgoJLyoqCgkqIEdldCBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBpbmZvCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGRpc3RyaWJ1dGlvbklkIERpc3RyaWJ1dGlvbiBJRCBmcm9tIGxpc3REaXN0cmlidXRpb25zKCkKCSogQHJldHVybiBhcnJheSB8IGZhbHNlCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREaXN0cmlidXRpb24oJGRpc3RyaWJ1dGlvbklkKQoJewoJCWlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OmdldERpc3RyaWJ1dGlvbigkZGlzdHJpYnV0aW9uSWQpOiAlcyIsCgkJCSJDbG91ZEZyb250IGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgU1NMIiksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJJHVzZVNTTCA9IHNlbGY6OiR1c2VTU0w7CgoJCXNlbGY6OiR1c2VTU0wgPSB0cnVlOyAvLyBDbG91ZEZyb250IHJlcXVpcmVzIFNTTAoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnR0VUJywgJycsICcyMDEwLTExLTAxL2Rpc3RyaWJ1dGlvbi8nLiRkaXN0cmlidXRpb25JZCwgJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpOwoJCSRyZXN0ID0gc2VsZjo6X19nZXRDbG91ZEZyb250UmVzcG9uc2UoJHJlc3QpOwoKCQlzZWxmOjokdXNlU1NMID0gJHVzZVNTTDsKCgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpnZXREaXN0cmlidXRpb24oJGRpc3RyaWJ1dGlvbklkKTogWyVzXSAlcyIsCgkJCSRyZXN0LT5lcnJvclsnY29kZSddLCAkcmVzdC0+ZXJyb3JbJ21lc3NhZ2UnXSksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZWlmICgkcmVzdC0+Ym9keSBpbnN0YW5jZW9mIFNpbXBsZVhNTEVsZW1lbnQpCgkJewoJCQkkZGlzdCA9IHNlbGY6Ol9fcGFyc2VDbG91ZEZyb250RGlzdHJpYnV0aW9uQ29uZmlnKCRyZXN0LT5ib2R5KTsKCQkJJGRpc3RbJ2hhc2gnXSA9ICRyZXN0LT5oZWFkZXJzWydoYXNoJ107CgkJCSRkaXN0WydpZCddID0gJGRpc3RyaWJ1dGlvbklkOwoJCQlyZXR1cm4gJGRpc3Q7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgoJLyoqCgkqIFVwZGF0ZSBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uCgkqCgkqIEBwYXJhbSBhcnJheSAkZGlzdCBEaXN0cmlidXRpb24gYXJyYXkgaW5mbyBpZGVudGljYWwgdG8gb3V0cHV0IG9mIGdldERpc3RyaWJ1dGlvbigpCgkqIEByZXR1cm4gYXJyYXkgfCBmYWxzZQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlRGlzdHJpYnV0aW9uKCRkaXN0KQoJewoJCWlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OnVwZGF0ZURpc3RyaWJ1dGlvbih7JGRpc3RbJ2lkJ119KTogJXMiLAoJCQkiQ2xvdWRGcm9udCBmdW5jdGlvbmFsaXR5IHJlcXVpcmVzIFNTTCIpLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkdXNlU1NMID0gc2VsZjo6JHVzZVNTTDsKCgkJc2VsZjo6JHVzZVNTTCA9IHRydWU7IC8vIENsb3VkRnJvbnQgcmVxdWlyZXMgU1NMCgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdQVVQnLCAnJywgJzIwMTAtMTEtMDEvZGlzdHJpYnV0aW9uLycuJGRpc3RbJ2lkJ10uJy9jb25maWcnLCAnY2xvdWRmcm9udC5hbWF6b25hd3MuY29tJyk7CgkJJHJlc3QtPmRhdGEgPSBzZWxmOjpfX2dldENsb3VkRnJvbnREaXN0cmlidXRpb25Db25maWdYTUwoCgkJCSRkaXN0WydvcmlnaW4nXSwKCQkJJGRpc3RbJ2VuYWJsZWQnXSwKCQkJJGRpc3RbJ2NvbW1lbnQnXSwKCQkJJGRpc3RbJ2NhbGxlclJlZmVyZW5jZSddLAoJCQkkZGlzdFsnY25hbWVzJ10sCgkJCSRkaXN0WydkZWZhdWx0Um9vdE9iamVjdCddLAoJCQkkZGlzdFsnb3JpZ2luQWNjZXNzSWRlbnRpdHknXSwKCQkJJGRpc3RbJ3RydXN0ZWRTaWduZXJzJ10KCQkpOwoKCQkkcmVzdC0+c2l6ZSA9IHN0cmxlbigkcmVzdC0+ZGF0YSk7CgkJJHJlc3QtPnNldEhlYWRlcignSWYtTWF0Y2gnLCAkZGlzdFsnaGFzaCddKTsKCQkkcmVzdCA9IHNlbGY6Ol9fZ2V0Q2xvdWRGcm9udFJlc3BvbnNlKCRyZXN0KTsKCgkJc2VsZjo6JHVzZVNTTCA9ICR1c2VTU0w7CgoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDApCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6dXBkYXRlRGlzdHJpYnV0aW9uKHskZGlzdFsnaWQnXX0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCSRkaXN0ID0gc2VsZjo6X19wYXJzZUNsb3VkRnJvbnREaXN0cmlidXRpb25Db25maWcoJHJlc3QtPmJvZHkpOwoJCQkkZGlzdFsnaGFzaCddID0gJHJlc3QtPmhlYWRlcnNbJ2hhc2gnXTsKCQkJcmV0dXJuICRkaXN0OwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCS8qKgoJKiBEZWxldGUgYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbgoJKgoJKiBAcGFyYW0gYXJyYXkgJGRpc3QgRGlzdHJpYnV0aW9uIGFycmF5IGluZm8gaWRlbnRpY2FsIHRvIG91dHB1dCBvZiBnZXREaXN0cmlidXRpb24oKQoJKiBAcmV0dXJuIGJvb2xlYW4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlbGV0ZURpc3RyaWJ1dGlvbigkZGlzdCkKCXsKCQlpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpkZWxldGVEaXN0cmlidXRpb24oeyRkaXN0WydpZCddfSk6ICVzIiwKCQkJIkNsb3VkRnJvbnQgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyBTU0wiKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHVzZVNTTCA9IHNlbGY6OiR1c2VTU0w7CgoJCXNlbGY6OiR1c2VTU0wgPSB0cnVlOyAvLyBDbG91ZEZyb250IHJlcXVpcmVzIFNTTAoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnREVMRVRFJywgJycsICcyMDA4LTA2LTMwL2Rpc3RyaWJ1dGlvbi8nLiRkaXN0WydpZCddLCAnY2xvdWRmcm9udC5hbWF6b25hd3MuY29tJyk7CgkJJHJlc3QtPnNldEhlYWRlcignSWYtTWF0Y2gnLCAkZGlzdFsnaGFzaCddKTsKCQkkcmVzdCA9IHNlbGY6Ol9fZ2V0Q2xvdWRGcm9udFJlc3BvbnNlKCRyZXN0KTsKCgkJc2VsZjo6JHVzZVNTTCA9ICR1c2VTU0w7CgoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDQpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6ZGVsZXRlRGlzdHJpYnV0aW9uKHskZGlzdFsnaWQnXX0pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkqIEdldCBhIGxpc3Qgb2YgQ2xvdWRGcm9udCBkaXN0cmlidXRpb25zCgkqCgkqIEByZXR1cm4gYXJyYXkKCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpc3REaXN0cmlidXRpb25zKCkKCXsKCQlpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkKCQl7CgkJCXNlbGY6Ol9fdHJpZ2dlckVycm9yKHNwcmludGYoIlMzOjpsaXN0RGlzdHJpYnV0aW9ucygpOiBbJXNdICVzIiwKCQkJIkNsb3VkRnJvbnQgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyBTU0wiKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHVzZVNTTCA9IHNlbGY6OiR1c2VTU0w7CgkJc2VsZjo6JHVzZVNTTCA9IHRydWU7IC8vIENsb3VkRnJvbnQgcmVxdWlyZXMgU1NMCgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdHRVQnLCAnJywgJzIwMTAtMTEtMDEvZGlzdHJpYnV0aW9uJywgJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpOwoJCSRyZXN0ID0gc2VsZjo6X19nZXRDbG91ZEZyb250UmVzcG9uc2UoJHJlc3QpOwoJCXNlbGY6OiR1c2VTU0wgPSAkdXNlU1NMOwoKCQlpZiAoJHJlc3QtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gJHJlc3QtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6Omxpc3REaXN0cmlidXRpb25zKCk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWVsc2VpZiAoJHJlc3QtPmJvZHkgaW5zdGFuY2VvZiBTaW1wbGVYTUxFbGVtZW50ICYmIGlzc2V0KCRyZXN0LT5ib2R5LT5EaXN0cmlidXRpb25TdW1tYXJ5KSkKCQl7CgkJCSRsaXN0ID0gYXJyYXkoKTsKCQkJaWYgKGlzc2V0KCRyZXN0LT5ib2R5LT5NYXJrZXIsICRyZXN0LT5ib2R5LT5NYXhJdGVtcywgJHJlc3QtPmJvZHktPklzVHJ1bmNhdGVkKSkKCQkJewoJCQkJLy8kaW5mb1snbWFya2VyJ10gPSAoc3RyaW5nKSRyZXN0LT5ib2R5LT5NYXJrZXI7CgkJCQkvLyRpbmZvWydtYXhJdGVtcyddID0gKGludCkkcmVzdC0+Ym9keS0+TWF4SXRlbXM7CgkJCQkvLyRpbmZvWydpc1RydW5jYXRlZCddID0gKHN0cmluZykkcmVzdC0+Ym9keS0+SXNUcnVuY2F0ZWQgPT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlOwoJCQl9CgkJCWZvcmVhY2ggKCRyZXN0LT5ib2R5LT5EaXN0cmlidXRpb25TdW1tYXJ5IGFzICRzdW1tYXJ5KQoJCQkJJGxpc3RbKHN0cmluZykkc3VtbWFyeS0+SWRdID0gc2VsZjo6X19wYXJzZUNsb3VkRnJvbnREaXN0cmlidXRpb25Db25maWcoJHN1bW1hcnkpOwoKCQkJcmV0dXJuICRsaXN0OwoJCX0KCQlyZXR1cm4gYXJyYXkoKTsKCX0KCgkvKioKCSogTGlzdCBDbG91ZEZyb250IE9yaWdpbiBBY2Nlc3MgSWRlbnRpdGllcwoJKgoJKiBAcmV0dXJuIGFycmF5CgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaXN0T3JpZ2luQWNjZXNzSWRlbnRpdGllcygpCgl7CgkJaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6bGlzdE9yaWdpbkFjY2Vzc0lkZW50aXRpZXMoKTogWyVzXSAlcyIsCgkJCSJDbG91ZEZyb250IGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgU1NMIiksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXNlbGY6OiR1c2VTU0wgPSB0cnVlOyAvLyBDbG91ZEZyb250IHJlcXVpcmVzIFNTTAoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnR0VUJywgJycsICcyMDEwLTExLTAxL29yaWdpbi1hY2Nlc3MtaWRlbnRpdHkvY2xvdWRmcm9udCcsICdjbG91ZGZyb250LmFtYXpvbmF3cy5jb20nKTsKCQkkcmVzdCA9IHNlbGY6Ol9fZ2V0Q2xvdWRGcm9udFJlc3BvbnNlKCRyZXN0KTsKCQkkdXNlU1NMID0gc2VsZjo6JHVzZVNTTDsKCgkJaWYgKCRyZXN0LT5lcnJvciA9PT0gZmFsc2UgJiYgJHJlc3QtPmNvZGUgIT09IDIwMCkKCQkJJHJlc3QtPmVycm9yID0gYXJyYXkoJ2NvZGUnID0+ICRyZXN0LT5jb2RlLCAnbWVzc2FnZScgPT4gJ1VuZXhwZWN0ZWQgSFRUUCBzdGF0dXMnKTsKCQlpZiAoJHJlc3QtPmVycm9yICE9PSBmYWxzZSkKCQl7CgkJCXRyaWdnZXJfZXJyb3Ioc3ByaW50ZigiUzM6Omxpc3RPcmlnaW5BY2Nlc3NJZGVudGl0aWVzKCk6IFslc10gJXMiLAoJCQkkcmVzdC0+ZXJyb3JbJ2NvZGUnXSwgJHJlc3QtPmVycm9yWydtZXNzYWdlJ10pLCBFX1VTRVJfV0FSTklORyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmIChpc3NldCgkcmVzdC0+Ym9keS0+Q2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5U3VtbWFyeSkpCgkJewoJCQkkaWRlbnRpdGllcyA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRyZXN0LT5ib2R5LT5DbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTdW1tYXJ5IGFzICRpZGVudGl0eSkKCQkJCWlmIChpc3NldCgkaWRlbnRpdHktPlMzQ2Fub25pY2FsVXNlcklkKSkKCQkJCQkkaWRlbnRpdGllc1soc3RyaW5nKSRpZGVudGl0eS0+SWRdID0gYXJyYXkoJ2lkJyA9PiAoc3RyaW5nKSRpZGVudGl0eS0+SWQsICdzM0Nhbm9uaWNhbFVzZXJJZCcgPT4gKHN0cmluZykkaWRlbnRpdHktPlMzQ2Fub25pY2FsVXNlcklkKTsKCQkJcmV0dXJuICRpZGVudGl0aWVzOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCS8qKgoJKiBJbnZhbGlkYXRlIG9iamVjdHMgaW4gYSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbgoJKgoJKiBUaGFua3MgdG8gTWFydGluIExpbmRrdmlzdCBmb3IgUzM6OmludmFsaWRhdGVEaXN0cmlidXRpb24oKQoJKgoJKiBAcGFyYW0gc3RyaW5nICRkaXN0cmlidXRpb25JZCBEaXN0cmlidXRpb24gSUQgZnJvbSBsaXN0RGlzdHJpYnV0aW9ucygpCgkqIEBwYXJhbSBhcnJheSAkcGF0aHMgQXJyYXkgb2Ygb2JqZWN0IHBhdGhzIHRvIGludmFsaWRhdGUKCSogQHJldHVybiBib29sZWFuCgkqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbnZhbGlkYXRlRGlzdHJpYnV0aW9uKCRkaXN0cmlidXRpb25JZCwgJHBhdGhzKQoJewoJCWlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKQoJCXsKCQkJc2VsZjo6X190cmlnZ2VyRXJyb3Ioc3ByaW50ZigiUzM6OmludmFsaWRhdGVEaXN0cmlidXRpb24oKTogWyVzXSAlcyIsCgkJCSJDbG91ZEZyb250IGZ1bmN0aW9uYWxpdHkgcmVxdWlyZXMgU1NMIiksIF9fRklMRV9fLCBfX0xJTkVfXyk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSR1c2VTU0wgPSBzZWxmOjokdXNlU1NMOwoJCXNlbGY6OiR1c2VTU0wgPSB0cnVlOyAvLyBDbG91ZEZyb250IHJlcXVpcmVzIFNTTAoJCSRyZXN0ID0gbmV3IFMzUmVxdWVzdCgnUE9TVCcsICcnLCAnMjAxMC0wOC0wMS9kaXN0cmlidXRpb24vJy4kZGlzdHJpYnV0aW9uSWQuJy9pbnZhbGlkYXRpb24nLCAnY2xvdWRmcm9udC5hbWF6b25hd3MuY29tJyk7CgkJJHJlc3QtPmRhdGEgPSBzZWxmOjpfX2dldENsb3VkRnJvbnRJbnZhbGlkYXRpb25CYXRjaFhNTCgkcGF0aHMsIChzdHJpbmcpbWljcm90aW1lKHRydWUpKTsKCQkkcmVzdC0+c2l6ZSA9IHN0cmxlbigkcmVzdC0+ZGF0YSk7CgkJJHJlc3QgPSBzZWxmOjpfX2dldENsb3VkRnJvbnRSZXNwb25zZSgkcmVzdCk7CgkJc2VsZjo6JHVzZVNTTCA9ICR1c2VTU0w7CgoJCWlmICgkcmVzdC0+ZXJyb3IgPT09IGZhbHNlICYmICRyZXN0LT5jb2RlICE9PSAyMDEpCgkJCSRyZXN0LT5lcnJvciA9IGFycmF5KCdjb2RlJyA9PiAkcmVzdC0+Y29kZSwgJ21lc3NhZ2UnID0+ICdVbmV4cGVjdGVkIEhUVFAgc3RhdHVzJyk7CgkJaWYgKCRyZXN0LT5lcnJvciAhPT0gZmFsc2UpCgkJewoJCQl0cmlnZ2VyX2Vycm9yKHNwcmludGYoIlMzOjppbnZhbGlkYXRlKCd7JGRpc3RyaWJ1dGlvbklkfScseyRwYXRoc30pOiBbJXNdICVzIiwKCQkJJHJlc3QtPmVycm9yWydjb2RlJ10sICRyZXN0LT5lcnJvclsnbWVzc2FnZSddKSwgRV9VU0VSX1dBUk5JTkcpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSogR2V0IGEgSW52YWxpZGF0aW9uQmF0Y2ggRE9NRG9jdW1lbnQKCSoKCSogQGludGVybmFsIFVzZWQgdG8gY3JlYXRlIFhNTCBpbiBpbnZhbGlkYXRlRGlzdHJpYnV0aW9uKCkKCSogQHBhcmFtIGFycmF5ICRwYXRocyBQYXRocyB0byBvYmplY3RzIHRvIGludmFsaWRhdGVEaXN0cmlidXRpb24KCSogQHBhcmFtIGludCAkY2FsbGVyUmVmZXJlbmNlCgkqIEByZXR1cm4gc3RyaW5nCgkqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX19nZXRDbG91ZEZyb250SW52YWxpZGF0aW9uQmF0Y2hYTUwoJHBhdGhzLCAkY2FsbGVyUmVmZXJlbmNlID0gJzAnKQoJewoJCSRkb20gPSBuZXcgRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwoJCSRkb20tPmZvcm1hdE91dHB1dCA9IHRydWU7CgkJJGludmFsaWRhdGlvbkJhdGNoID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnSW52YWxpZGF0aW9uQmF0Y2gnKTsKCQlmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpCgkJCSRpbnZhbGlkYXRpb25CYXRjaC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnUGF0aCcsICRwYXRoKSk7CgoJCSRpbnZhbGlkYXRpb25CYXRjaC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnQ2FsbGVyUmVmZXJlbmNlJywgJGNhbGxlclJlZmVyZW5jZSkpOwoJCSRkb20tPmFwcGVuZENoaWxkKCRpbnZhbGlkYXRpb25CYXRjaCk7CgkJcmV0dXJuICRkb20tPnNhdmVYTUwoKTsKCX0KCgoJLyoqCgkqIExpc3QgeW91ciBpbnZhbGlkYXRpb24gYmF0Y2hlcyBmb3IgaW52YWxpZGF0ZURpc3RyaWJ1dGlvbigpIGluIGEgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24KCSoKCSogaHR0cDovL2RvY3MuYW1hem9ud2Vic2VydmljZXMuY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9MaXN0SW52YWxpZGF0aW9uLmh0bWwKCSogcmV0dXJuZWQgYXJyYXkgbG9va3MgbGlrZSB0aGlzOgoJKglBcnJheQoJKgkoCgkqCQlbSTMxVFdCMENOOVY2WERdID0+IEluUHJvZ3Jlc3MKCSoJCVtJVDNURkUzMU0wSUhaXSA9PiBDb21wbGV0ZWQKCSoJCVtJMTJISzdNUE8xVVFEQV0gPT4gQ29tcGxldGVkCgkqCQlbSTFJQTdSNkpLVEMzTDJdID0+IENvbXBsZXRlZAoJKgkpCgkqCgkqIEBwYXJhbSBzdHJpbmcgJGRpc3RyaWJ1dGlvbklkIERpc3RyaWJ1dGlvbiBJRCBmcm9tIGxpc3REaXN0cmlidXRpb25zKCkKCSogQHJldHVybiBhcnJheQoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGlzdHJpYnV0aW9uSW52YWxpZGF0aW9uTGlzdCgkZGlzdHJpYnV0aW9uSWQpCgl7CgkJaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpCgkJewoJCQlzZWxmOjpfX3RyaWdnZXJFcnJvcihzcHJpbnRmKCJTMzo6Z2V0RGlzdHJpYnV0aW9uSW52YWxpZGF0aW9uTGlzdCgpOiBbJXNdICVzIiwKCQkJIkNsb3VkRnJvbnQgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyBTU0wiKSwgX19GSUxFX18sIF9fTElORV9fKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJHVzZVNTTCA9IHNlbGY6OiR1c2VTU0w7CgkJc2VsZjo6JHVzZVNTTCA9IHRydWU7IC8vIENsb3VkRnJvbnQgcmVxdWlyZXMgU1NMCgkJJHJlc3QgPSBuZXcgUzNSZXF1ZXN0KCdHRVQnLCAnJywgJzIwMTAtMTEtMDEvZGlzdHJpYnV0aW9uLycuJGRpc3RyaWJ1dGlvbklkLicvaW52YWxpZGF0aW9uJywgJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpOwoJCSRyZXN0ID0gc2VsZjo6X19nZXRDbG91ZEZyb250UmVzcG9uc2UoJHJlc3QpOwoJCXNlbGY6OiR1c2VTU0wgPSAkdXNlU1NMOwoKCQlpZiAoJHJlc3QtPmVycm9yID09PSBmYWxzZSAmJiAkcmVzdC0+Y29kZSAhPT0gMjAwKQoJCQkkcmVzdC0+ZXJyb3IgPSBhcnJheSgnY29kZScgPT4gJHJlc3QtPmNvZGUsICdtZXNzYWdlJyA9PiAnVW5leHBlY3RlZCBIVFRQIHN0YXR1cycpOwoJCWlmICgkcmVzdC0+ZXJyb3IgIT09IGZhbHNlKQoJCXsKCQkJdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCJTMzo6Z2V0RGlzdHJpYnV0aW9uSW52YWxpZGF0aW9uTGlzdCgneyRkaXN0cmlidXRpb25JZH0nKTogWyVzXSIsCgkJCSRyZXN0LT5lcnJvclsnY29kZSddLCAkcmVzdC0+ZXJyb3JbJ21lc3NhZ2UnXSksIEVfVVNFUl9XQVJOSU5HKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQllbHNlaWYgKCRyZXN0LT5ib2R5IGluc3RhbmNlb2YgU2ltcGxlWE1MRWxlbWVudCAmJiBpc3NldCgkcmVzdC0+Ym9keS0+SW52YWxpZGF0aW9uU3VtbWFyeSkpCgkJewoJCQkkbGlzdCA9IGFycmF5KCk7CgkJCWZvcmVhY2ggKCRyZXN0LT5ib2R5LT5JbnZhbGlkYXRpb25TdW1tYXJ5IGFzICRzdW1tYXJ5KQoJCQkJJGxpc3RbKHN0cmluZykkc3VtbWFyeS0+SWRdID0gKHN0cmluZykkc3VtbWFyeS0+U3RhdHVzOwoKCQkJcmV0dXJuICRsaXN0OwoJCX0KCQlyZXR1cm4gYXJyYXkoKTsKCX0KCgoJLyoqCgkqIEdldCBhIERpc3RyaWJ1dGlvbkNvbmZpZyBET01Eb2N1bWVudAoJKgoJKiBodHRwOi8vZG9jcy5hbWF6b253ZWJzZXJ2aWNlcy5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvQVBJUmVmZXJlbmNlL2luZGV4Lmh0bWw/UHV0Q29uZmlnLmh0bWwKCSoKCSogQGludGVybmFsIFVzZWQgdG8gY3JlYXRlIFhNTCBpbiBjcmVhdGVEaXN0cmlidXRpb24oKSBhbmQgdXBkYXRlRGlzdHJpYnV0aW9uKCkKCSogQHBhcmFtIHN0cmluZyAkYnVja2V0IFMzIE9yaWdpbiBidWNrZXQKCSogQHBhcmFtIGJvb2xlYW4gJGVuYWJsZWQgRW5hYmxlZCAodHJ1ZS9mYWxzZSkKCSogQHBhcmFtIHN0cmluZyAkY29tbWVudCBDb21tZW50IHRvIGFwcGVuZAoJKiBAcGFyYW0gc3RyaW5nICRjYWxsZXJSZWZlcmVuY2UgQ2FsbGVyIHJlZmVyZW5jZQoJKiBAcGFyYW0gYXJyYXkgJGNuYW1lcyBBcnJheSBvZiBDTkFNRSBhbGlhc2VzCgkqIEBwYXJhbSBzdHJpbmcgJGRlZmF1bHRSb290T2JqZWN0IERlZmF1bHQgcm9vdCBvYmplY3QKCSogQHBhcmFtIHN0cmluZyAkb3JpZ2luQWNjZXNzSWRlbnRpdHkgT3JpZ2luIGFjY2VzcyBpZGVudGl0eQoJKiBAcGFyYW0gYXJyYXkgJHRydXN0ZWRTaWduZXJzIEFycmF5IG9mIHRydXN0ZWQgc2lnbmVycwoJKiBAcmV0dXJuIHN0cmluZwoJKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9fZ2V0Q2xvdWRGcm9udERpc3RyaWJ1dGlvbkNvbmZpZ1hNTCgkYnVja2V0LCAkZW5hYmxlZCwgJGNvbW1lbnQsICRjYWxsZXJSZWZlcmVuY2UgPSAnMCcsICRjbmFtZXMgPSBhcnJheSgpLCAkZGVmYXVsdFJvb3RPYmplY3QgPSBudWxsLCAkb3JpZ2luQWNjZXNzSWRlbnRpdHkgPSBudWxsLCAkdHJ1c3RlZFNpZ25lcnMgPSBhcnJheSgpKQoJewoJCSRkb20gPSBuZXcgRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwoJCSRkb20tPmZvcm1hdE91dHB1dCA9IHRydWU7CgkJJGRpc3RyaWJ1dGlvbkNvbmZpZyA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ0Rpc3RyaWJ1dGlvbkNvbmZpZycpOwoJCSRkaXN0cmlidXRpb25Db25maWctPnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbS9kb2MvMjAxMC0xMS0wMS8nKTsKCgkJJG9yaWdpbiA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ1MzT3JpZ2luJyk7CgkJJG9yaWdpbi0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnRE5TTmFtZScsICRidWNrZXQpKTsKCQlpZiAoJG9yaWdpbkFjY2Vzc0lkZW50aXR5ICE9PSBudWxsKSAkb3JpZ2luLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCdPcmlnaW5BY2Nlc3NJZGVudGl0eScsICRvcmlnaW5BY2Nlc3NJZGVudGl0eSkpOwoJCSRkaXN0cmlidXRpb25Db25maWctPmFwcGVuZENoaWxkKCRvcmlnaW4pOwoKCQlpZiAoJGRlZmF1bHRSb290T2JqZWN0ICE9PSBudWxsKSAkZGlzdHJpYnV0aW9uQ29uZmlnLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCdEZWZhdWx0Um9vdE9iamVjdCcsICRkZWZhdWx0Um9vdE9iamVjdCkpOwoKCQkkZGlzdHJpYnV0aW9uQ29uZmlnLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCdDYWxsZXJSZWZlcmVuY2UnLCAkY2FsbGVyUmVmZXJlbmNlKSk7CgkJZm9yZWFjaCAoJGNuYW1lcyBhcyAkY25hbWUpCgkJCSRkaXN0cmlidXRpb25Db25maWctPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZUVsZW1lbnQoJ0NOQU1FJywgJGNuYW1lKSk7CgkJaWYgKCRjb21tZW50ICE9PSAnJykgJGRpc3RyaWJ1dGlvbkNvbmZpZy0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnQ29tbWVudCcsICRjb21tZW50KSk7CgkJJGRpc3RyaWJ1dGlvbkNvbmZpZy0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgnRW5hYmxlZCcsICRlbmFibGVkID8gJ3RydWUnIDogJ2ZhbHNlJykpOwoKCQkkdHJ1c3RlZCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ1RydXN0ZWRTaWduZXJzJyk7CgkJZm9yZWFjaCAoJHRydXN0ZWRTaWduZXJzIGFzICRpZCA9PiAkdHlwZSkKCQkJJHRydXN0ZWQtPmFwcGVuZENoaWxkKCRpZCAhPT0gJycgPyAkZG9tLT5jcmVhdGVFbGVtZW50KCR0eXBlLCAkaWQpIDogJGRvbS0+Y3JlYXRlRWxlbWVudCgkdHlwZSkpOwoJCSRkaXN0cmlidXRpb25Db25maWctPmFwcGVuZENoaWxkKCR0cnVzdGVkKTsKCgkJJGRvbS0+YXBwZW5kQ2hpbGQoJGRpc3RyaWJ1dGlvbkNvbmZpZyk7CgkJLy92YXJfZHVtcCgkZG9tLT5zYXZlWE1MKCkpOwoJCXJldHVybiAkZG9tLT5zYXZlWE1MKCk7Cgl9CgoKCS8qKgoJKiBQYXJzZSBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGNvbmZpZwoJKgoJKiBTZWUgaHR0cDovL2RvY3MuYW1hem9ud2Vic2VydmljZXMuY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0FQSVJlZmVyZW5jZS9pbmRleC5odG1sP0dldERpc3RyaWJ1dGlvbi5odG1sCgkqCgkqIEBpbnRlcm5hbCBVc2VkIHRvIHBhcnNlIHRoZSBDbG91ZEZyb250IERpc3RyaWJ1dGlvbkNvbmZpZyBub2RlIHRvIGFuIGFycmF5CgkqIEBwYXJhbSBvYmplY3QgJiRub2RlIERPTU5vZGUKCSogQHJldHVybiBhcnJheQoJKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9fcGFyc2VDbG91ZEZyb250RGlzdHJpYnV0aW9uQ29uZmlnKCYkbm9kZSkKCXsKCQlpZiAoaXNzZXQoJG5vZGUtPkRpc3RyaWJ1dGlvbkNvbmZpZykpCgkJCXJldHVybiBzZWxmOjpfX3BhcnNlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbkNvbmZpZygkbm9kZS0+RGlzdHJpYnV0aW9uQ29uZmlnKTsKCgkJJGRpc3QgPSBhcnJheSgpOwoJCWlmIChpc3NldCgkbm9kZS0+SWQsICRub2RlLT5TdGF0dXMsICRub2RlLT5MYXN0TW9kaWZpZWRUaW1lLCAkbm9kZS0+RG9tYWluTmFtZSkpCgkJewoJCQkkZGlzdFsnaWQnXSA9IChzdHJpbmcpJG5vZGUtPklkOwoJCQkkZGlzdFsnc3RhdHVzJ10gPSAoc3RyaW5nKSRub2RlLT5TdGF0dXM7CgkJCSRkaXN0Wyd0aW1lJ10gPSBzdHJ0b3RpbWUoKHN0cmluZykkbm9kZS0+TGFzdE1vZGlmaWVkVGltZSk7CgkJCSRkaXN0Wydkb21haW4nXSA9IChzdHJpbmcpJG5vZGUtPkRvbWFpbk5hbWU7CgkJfQoKCQlpZiAoaXNzZXQoJG5vZGUtPkNhbGxlclJlZmVyZW5jZSkpCgkJCSRkaXN0WydjYWxsZXJSZWZlcmVuY2UnXSA9IChzdHJpbmcpJG5vZGUtPkNhbGxlclJlZmVyZW5jZTsKCgkJaWYgKGlzc2V0KCRub2RlLT5FbmFibGVkKSkKCQkJJGRpc3RbJ2VuYWJsZWQnXSA9IChzdHJpbmcpJG5vZGUtPkVuYWJsZWQgPT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlOwoKCQlpZiAoaXNzZXQoJG5vZGUtPlMzT3JpZ2luKSkKCQl7CgkJCWlmIChpc3NldCgkbm9kZS0+UzNPcmlnaW4tPkROU05hbWUpKQoJCQkJJGRpc3RbJ29yaWdpbiddID0gKHN0cmluZykkbm9kZS0+UzNPcmlnaW4tPkROU05hbWU7CgoJCQkkZGlzdFsnb3JpZ2luQWNjZXNzSWRlbnRpdHknXSA9IGlzc2V0KCRub2RlLT5TM09yaWdpbi0+T3JpZ2luQWNjZXNzSWRlbnRpdHkpID8KCQkJKHN0cmluZykkbm9kZS0+UzNPcmlnaW4tPk9yaWdpbkFjY2Vzc0lkZW50aXR5IDogbnVsbDsKCQl9CgoJCSRkaXN0WydkZWZhdWx0Um9vdE9iamVjdCddID0gaXNzZXQoJG5vZGUtPkRlZmF1bHRSb290T2JqZWN0KSA/IChzdHJpbmcpJG5vZGUtPkRlZmF1bHRSb290T2JqZWN0IDogbnVsbDsKCgkJJGRpc3RbJ2NuYW1lcyddID0gYXJyYXkoKTsKCQlpZiAoaXNzZXQoJG5vZGUtPkNOQU1FKSkKCQkJZm9yZWFjaCAoJG5vZGUtPkNOQU1FIGFzICRjbmFtZSkKCQkJCSRkaXN0WydjbmFtZXMnXVsoc3RyaW5nKSRjbmFtZV0gPSAoc3RyaW5nKSRjbmFtZTsKCgkJJGRpc3RbJ3RydXN0ZWRTaWduZXJzJ10gPSBhcnJheSgpOwoJCWlmIChpc3NldCgkbm9kZS0+VHJ1c3RlZFNpZ25lcnMpKQoJCQlmb3JlYWNoICgkbm9kZS0+VHJ1c3RlZFNpZ25lcnMgYXMgJHNpZ25lcikKCQkJewoJCQkJaWYgKGlzc2V0KCRzaWduZXItPlNlbGYpKQoJCQkJCSRkaXN0Wyd0cnVzdGVkU2lnbmVycyddWycnXSA9ICdTZWxmJzsKCQkJCWVsc2VpZiAoaXNzZXQoJHNpZ25lci0+S2V5UGFpcklkKSkKCQkJCQkkZGlzdFsndHJ1c3RlZFNpZ25lcnMnXVsoc3RyaW5nKSRzaWduZXItPktleVBhaXJJZF0gPSAnS2V5UGFpcklkJzsKCQkJCWVsc2VpZiAoaXNzZXQoJHNpZ25lci0+QXdzQWNjb3VudE51bWJlcikpCgkJCQkJJGRpc3RbJ3RydXN0ZWRTaWduZXJzJ11bKHN0cmluZykkc2lnbmVyLT5Bd3NBY2NvdW50TnVtYmVyXSA9ICdBd3NBY2NvdW50TnVtYmVyJzsKCQkJfQoKCQkkZGlzdFsnY29tbWVudCddID0gaXNzZXQoJG5vZGUtPkNvbW1lbnQpID8gKHN0cmluZykkbm9kZS0+Q29tbWVudCA6IG51bGw7CgkJcmV0dXJuICRkaXN0OwoJfQoKCgkvKioKCSogR3JhYiBDbG91ZEZyb250IHJlc3BvbnNlCgkqCgkqIEBpbnRlcm5hbCBVc2VkIHRvIHBhcnNlIHRoZSBDbG91ZEZyb250IFMzUmVxdWVzdDo6Z2V0UmVzcG9uc2UoKSBvdXRwdXQKCSogQHBhcmFtIG9iamVjdCAmJHJlc3QgUzNSZXF1ZXN0IGluc3RhbmNlCgkqIEByZXR1cm4gb2JqZWN0CgkqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX19nZXRDbG91ZEZyb250UmVzcG9uc2UoJiRyZXN0KQoJewoJCSRyZXN0LT5nZXRSZXNwb25zZSgpOwoJCWlmICgkcmVzdC0+cmVzcG9uc2UtPmVycm9yID09PSBmYWxzZSAmJiBpc3NldCgkcmVzdC0+cmVzcG9uc2UtPmJvZHkpICYmCgkJaXNfc3RyaW5nKCRyZXN0LT5yZXNwb25zZS0+Ym9keSkgJiYgc3Vic3RyKCRyZXN0LT5yZXNwb25zZS0+Ym9keSwgMCwgNSkgPT0gJzw/eG1sJykKCQl7CgkJCSRyZXN0LT5yZXNwb25zZS0+Ym9keSA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkcmVzdC0+cmVzcG9uc2UtPmJvZHkpOwoJCQkvLyBHcmFiIENsb3VkRnJvbnQgZXJyb3JzCgkJCWlmIChpc3NldCgkcmVzdC0+cmVzcG9uc2UtPmJvZHktPkVycm9yLCAkcmVzdC0+cmVzcG9uc2UtPmJvZHktPkVycm9yLT5Db2RlLAoJCQkkcmVzdC0+cmVzcG9uc2UtPmJvZHktPkVycm9yLT5NZXNzYWdlKSkKCQkJewoJCQkJJHJlc3QtPnJlc3BvbnNlLT5lcnJvciA9IGFycmF5KAoJCQkJCSdjb2RlJyA9PiAoc3RyaW5nKSRyZXN0LT5yZXNwb25zZS0+Ym9keS0+RXJyb3ItPkNvZGUsCgkJCQkJJ21lc3NhZ2UnID0+IChzdHJpbmcpJHJlc3QtPnJlc3BvbnNlLT5ib2R5LT5FcnJvci0+TWVzc2FnZQoJCQkJKTsKCQkJCXVuc2V0KCRyZXN0LT5yZXNwb25zZS0+Ym9keSk7CgkJCX0KCQl9CgkJcmV0dXJuICRyZXN0LT5yZXNwb25zZTsKCX0KCgoJLyoqCgkqIEdldCBNSU1FIHR5cGUgZm9yIGZpbGUKCSoKCSogVG8gb3ZlcnJpZGUgdGhlIHB1dE9iamVjdCgpIENvbnRlbnQtVHlwZSwgYWRkIGl0IHRvICRyZXF1ZXN0SGVhZGVycwoJKgoJKiBUbyB1c2UgZmlsZWluZm8sIGVuc3VyZSB0aGUgTUFHSUMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0CgkqCgkqIEBpbnRlcm5hbCBVc2VkIHRvIGdldCBtaW1lIHR5cGVzCgkqIEBwYXJhbSBzdHJpbmcgJiRmaWxlIEZpbGUgcGF0aAoJKiBAcmV0dXJuIHN0cmluZwoJKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9fZ2V0TWltZVR5cGUoJiRmaWxlKQoJewoJCS8vIFVzZSBmaWxlaW5mbyBpZiBhdmFpbGFibGUKCQlpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnZmlsZWluZm8nKSAmJiBpc3NldCgkX0VOVlsnTUFHSUMnXSkgJiYKCQkoJGZpbmZvID0gZmluZm9fb3BlbihGSUxFSU5GT19NSU1FLCAkX0VOVlsnTUFHSUMnXSkpICE9PSBmYWxzZSkKCQl7CgkJCWlmICgoJHR5cGUgPSBmaW5mb19maWxlKCRmaW5mbywgJGZpbGUpKSAhPT0gZmFsc2UpCgkJCXsKCQkJCS8vIFJlbW92ZSB0aGUgY2hhcnNldCBhbmQgZ3JhYiB0aGUgbGFzdCBjb250ZW50LXR5cGUKCQkJCSR0eXBlID0gZXhwbG9kZSgnICcsIHN0cl9yZXBsYWNlKCc7IGNoYXJzZXQ9JywgJztjaGFyc2V0PScsICR0eXBlKSk7CgkJCQkkdHlwZSA9IGFycmF5X3BvcCgkdHlwZSk7CgkJCQkkdHlwZSA9IGV4cGxvZGUoJzsnLCAkdHlwZSk7CgkJCQkkdHlwZSA9IHRyaW0oYXJyYXlfc2hpZnQoJHR5cGUpKTsKCQkJfQoJCQlmaW5mb19jbG9zZSgkZmluZm8pOwoJCQlpZiAoJHR5cGUgIT09IGZhbHNlICYmIHN0cmxlbigkdHlwZSkgPiAwKSByZXR1cm4gJHR5cGU7CgkJfQoKCQlzdGF0aWMgJGV4dHMgPSBhcnJheSgKCQkJJ2pwZycgPT4gJ2ltYWdlL2pwZWcnLCAnanBlZycgPT4gJ2ltYWdlL2pwZWcnLCAnZ2lmJyA9PiAnaW1hZ2UvZ2lmJywKCQkJJ3BuZycgPT4gJ2ltYWdlL3BuZycsICdpY28nID0+ICdpbWFnZS94LWljb24nLCAncGRmJyA9PiAnYXBwbGljYXRpb24vcGRmJywKCQkJJ3RpZicgPT4gJ2ltYWdlL3RpZmYnLCAndGlmZicgPT4gJ2ltYWdlL3RpZmYnLCAnc3ZnJyA9PiAnaW1hZ2Uvc3ZnK3htbCcsCgkJCSdzdmd6JyA9PiAnaW1hZ2Uvc3ZnK3htbCcsICdzd2YnID0+ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsIAoJCQknemlwJyA9PiAnYXBwbGljYXRpb24vemlwJywgJ2d6JyA9PiAnYXBwbGljYXRpb24veC1nemlwJywKCQkJJ3RhcicgPT4gJ2FwcGxpY2F0aW9uL3gtdGFyJywgJ2J6JyA9PiAnYXBwbGljYXRpb24veC1iemlwJywKCQkJJ2J6MicgPT4gJ2FwcGxpY2F0aW9uL3gtYnppcDInLCAgJ3JhcicgPT4gJ2FwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQnLAoJCQknZXhlJyA9PiAnYXBwbGljYXRpb24veC1tc2Rvd25sb2FkJywgJ21zaScgPT4gJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcsCgkJCSdjYWInID0+ICdhcHBsaWNhdGlvbi92bmQubXMtY2FiLWNvbXByZXNzZWQnLCAndHh0JyA9PiAndGV4dC9wbGFpbicsCgkJCSdhc2MnID0+ICd0ZXh0L3BsYWluJywgJ2h0bScgPT4gJ3RleHQvaHRtbCcsICdodG1sJyA9PiAndGV4dC9odG1sJywKCQkJJ2NzcycgPT4gJ3RleHQvY3NzJywgJ2pzJyA9PiAndGV4dC9qYXZhc2NyaXB0JywKCQkJJ3htbCcgPT4gJ3RleHQveG1sJywgJ3hzbCcgPT4gJ2FwcGxpY2F0aW9uL3hzbCt4bWwnLAoJCQknb2dnJyA9PiAnYXBwbGljYXRpb24vb2dnJywgJ21wMycgPT4gJ2F1ZGlvL21wZWcnLCAnd2F2JyA9PiAnYXVkaW8veC13YXYnLAoJCQknYXZpJyA9PiAndmlkZW8veC1tc3ZpZGVvJywgJ21wZycgPT4gJ3ZpZGVvL21wZWcnLCAnbXBlZycgPT4gJ3ZpZGVvL21wZWcnLAoJCQknbW92JyA9PiAndmlkZW8vcXVpY2t0aW1lJywgJ2ZsdicgPT4gJ3ZpZGVvL3gtZmx2JywgJ3BocCcgPT4gJ3RleHQveC1waHAnCgkJKTsKCQkkZXh0ID0gc3RydG9sb3dlcihwYXRoaW5mbygkZmlsZSwgUEFUSElORk9fRVhURU5TSU9OKSk7CgkJLy8gbWltZV9jb250ZW50X3R5cGUoKSBpcyBkZXByZWNhdGVkLCBmaWxlaW5mbyBzaG91bGQgYmUgY29uZmlndXJlZAoJCSR0eXBlID0gaXNzZXQoJGV4dHNbJGV4dF0pID8gJGV4dHNbJGV4dF0gOiB0cmltKG1pbWVfY29udGVudF90eXBlKCRmaWxlKSk7CgoJCXJldHVybiAoJHR5cGUgIT09IGZhbHNlICYmIHN0cmxlbigkdHlwZSkgPiAwKSA/ICR0eXBlIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7Cgl9CgoKCS8qKgoJKiBHZW5lcmF0ZSB0aGUgYXV0aCBzdHJpbmc6ICJBV1MgQWNjZXNzS2V5OlNpZ25hdHVyZSIKCSoKCSogQGludGVybmFsIFVzZWQgYnkgUzNSZXF1ZXN0OjpnZXRSZXNwb25zZSgpCgkqIEBwYXJhbSBzdHJpbmcgJHN0cmluZyBTdHJpbmcgdG8gc2lnbgoJKiBAcmV0dXJuIHN0cmluZwoJKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX19nZXRTaWduYXR1cmUoJHN0cmluZykKCXsKCQlyZXR1cm4gJ0FXUyAnLnNlbGY6OiRfX2FjY2Vzc0tleS4nOicuc2VsZjo6X19nZXRIYXNoKCRzdHJpbmcpOwoJfQoKCgkvKioKCSogQ3JlYXRlcyBhIEhNQUMtU0hBMSBoYXNoCgkqCgkqIFRoaXMgdXNlcyB0aGUgaGFzaCBleHRlbnNpb24gaWYgbG9hZGVkCgkqCgkqIEBpbnRlcm5hbCBVc2VkIGJ5IF9fZ2V0U2lnbmF0dXJlKCkKCSogQHBhcmFtIHN0cmluZyAkc3RyaW5nIFN0cmluZyB0byBzaWduCgkqIEByZXR1cm4gc3RyaW5nCgkqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX19nZXRIYXNoKCRzdHJpbmcpCgl7CgkJcmV0dXJuIGJhc2U2NF9lbmNvZGUoZXh0ZW5zaW9uX2xvYWRlZCgnaGFzaCcpID8KCQloYXNoX2htYWMoJ3NoYTEnLCAkc3RyaW5nLCBzZWxmOjokX19zZWNyZXRLZXksIHRydWUpIDogcGFjaygnSConLCBzaGExKAoJCShzdHJfcGFkKHNlbGY6OiRfX3NlY3JldEtleSwgNjQsIGNocigweDAwKSkgXiAoc3RyX3JlcGVhdChjaHIoMHg1YyksIDY0KSkpIC4KCQlwYWNrKCdIKicsIHNoYTEoKHN0cl9wYWQoc2VsZjo6JF9fc2VjcmV0S2V5LCA2NCwgY2hyKDB4MDApKSBeCgkJKHN0cl9yZXBlYXQoY2hyKDB4MzYpLCA2NCkpKSAuICRzdHJpbmcpKSkpKTsKCX0KCn0KCi8qKgogKiBTMyBSZXF1ZXN0IGNsYXNzIAogKgogKiBAbGluayBodHRwOi8vdW5kZXNpZ25lZC5vcmcuemEvMjAwNy8xMC8yMi9hbWF6b24tczMtcGhwLWNsYXNzCiAqIEB2ZXJzaW9uIDAuNS4wLWRldgogKi8KZmluYWwgY2xhc3MgUzNSZXF1ZXN0CnsKCS8qKgoJICogQVdTIFVSSQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaWNhdGUKCSAqLwoJcHJpdmF0ZSAkZW5kcG9pbnQ7CgkKCS8qKgoJICogVmVyYgoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSAkdmVyYjsKCQoJLyoqCgkgKiBTMyBidWNrZXQgbmFtZQoJICoKCSAqIEB2YXIgc3RyaW5nCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSAkYnVja2V0OwoJCgkvKioKCSAqIE9iamVjdCBVUkkKCSAqCgkgKiBAdmFyIHN0cmluZwoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgJHVyaTsKCQoJLyoqCgkgKiBGaW5hbCBvYmplY3QgVVJJCgkgKgoJICogQHZhciBzdHJpbmcKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlICRyZXNvdXJjZSA9ICcnOwoJCgkvKioKCSAqIEFkZGl0aW9uYWwgcmVxdWVzdCBwYXJhbWV0ZXJzCgkgKgoJICogQHZhciBhcnJheQoJICogQGFjY2VzcyBwcml2YXRlCgkgKi8KCXByaXZhdGUgJHBhcmFtZXRlcnMgPSBhcnJheSgpOwoJCgkvKioKCSAqIEFtYXpvbiBzcGVjaWZpYyByZXF1ZXN0IGhlYWRlcnMKCSAqCgkgKiBAdmFyIGFycmF5CgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqLwoJcHJpdmF0ZSAkYW16SGVhZGVycyA9IGFycmF5KCk7CgoJLyoqCgkgKiBIVFRQIHJlcXVlc3QgaGVhZGVycwoJICoKCSAqIEB2YXIgYXJyYXkKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICovCglwcml2YXRlICRoZWFkZXJzID0gYXJyYXkoCgkJJ0hvc3QnID0+ICcnLCAnRGF0ZScgPT4gJycsICdDb250ZW50LU1ENScgPT4gJycsICdDb250ZW50LVR5cGUnID0+ICcnCgkpOwoKCS8qKgoJICogVXNlIEhUVFAgUFVUPwoJICoKCSAqIEB2YXIgYm9vbAoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJcHVibGljICRmcCA9IGZhbHNlOwoKCS8qKgoJICogUFVUIGZpbGUgc2l6ZQoJICoKCSAqIEB2YXIgaW50CgkgKiBAYWNjZXNzIHB1YmxpYwoJICovCglwdWJsaWMgJHNpemUgPSAwOwoKCS8qKgoJICogUFVUIHBvc3QgZmllbGRzCgkgKgoJICogQHZhciBhcnJheQoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJcHVibGljICRkYXRhID0gZmFsc2U7CgoJLyoqCgkgKiBTMyByZXF1ZXN0IHJlc3BvbmUKCSAqCgkgKiBAdmFyIG9iamVjdAoJICogQGFjY2VzcyBwdWJsaWMKCSAqLwoJcHVibGljICRyZXNwb25zZTsKCgoJLyoqCgkqIENvbnN0cnVjdG9yCgkqCgkqIEBwYXJhbSBzdHJpbmcgJHZlcmIgVmVyYgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHBhcmFtIHN0cmluZyAkdXJpIE9iamVjdCBVUkkKCSogQHBhcmFtIHN0cmluZyAkZW5kcG9pbnQgQVdTIGVuZHBvaW50IFVSSQoJKiBAcmV0dXJuIG1peGVkCgkqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZlcmIsICRidWNrZXQgPSAnJywgJHVyaSA9ICcnLCAkZW5kcG9pbnQgPSAnczMuYW1hem9uYXdzLmNvbScpCgl7CgkJCgkJJHRoaXMtPmVuZHBvaW50ID0gJGVuZHBvaW50OwoJCSR0aGlzLT52ZXJiID0gJHZlcmI7CgkJJHRoaXMtPmJ1Y2tldCA9ICRidWNrZXQ7CgkJJHRoaXMtPnVyaSA9ICR1cmkgIT09ICcnID8gJy8nLnN0cl9yZXBsYWNlKCclMkYnLCAnLycsIHJhd3VybGVuY29kZSgkdXJpKSkgOiAnLyc7CgoJCS8vaWYgKCR0aGlzLT5idWNrZXQgIT09ICcnKQoJCS8vCSR0aGlzLT5yZXNvdXJjZSA9ICcvJy4kdGhpcy0+YnVja2V0LiR0aGlzLT51cmk7CgkJLy9lbHNlCgkJLy8JJHRoaXMtPnJlc291cmNlID0gJHRoaXMtPnVyaTsKCgkJaWYgKCR0aGlzLT5idWNrZXQgIT09ICcnKQoJCXsKCQkJaWYgKCR0aGlzLT5fX2Ruc0J1Y2tldE5hbWUoJHRoaXMtPmJ1Y2tldCkpCgkJCXsKCQkJCSR0aGlzLT5oZWFkZXJzWydIb3N0J10gPSAkdGhpcy0+YnVja2V0LicuJy4kdGhpcy0+ZW5kcG9pbnQ7CgkJCQkkdGhpcy0+cmVzb3VyY2UgPSAnLycuJHRoaXMtPmJ1Y2tldC4kdGhpcy0+dXJpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRoaXMtPmhlYWRlcnNbJ0hvc3QnXSA9ICR0aGlzLT5lbmRwb2ludDsKCQkJCSR0aGlzLT51cmkgPSAkdGhpcy0+dXJpOwoJCQkJaWYgKCR0aGlzLT5idWNrZXQgIT09ICcnKSAkdGhpcy0+dXJpID0gJy8nLiR0aGlzLT5idWNrZXQuJHRoaXMtPnVyaTsKCQkJCSR0aGlzLT5idWNrZXQgPSAnJzsKCQkJCSR0aGlzLT5yZXNvdXJjZSA9ICR0aGlzLT51cmk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPmhlYWRlcnNbJ0hvc3QnXSA9ICR0aGlzLT5lbmRwb2ludDsKCQkJJHRoaXMtPnJlc291cmNlID0gJHRoaXMtPnVyaTsKCQl9CgoKCQkkdGhpcy0+aGVhZGVyc1snRGF0ZSddID0gZ21kYXRlKCdELCBkIE0gWSBIOmk6cyBUJyk7CgkJJHRoaXMtPnJlc3BvbnNlID0gbmV3IFNURENsYXNzOwoJCSR0aGlzLT5yZXNwb25zZS0+ZXJyb3IgPSBmYWxzZTsKCQkkdGhpcy0+cmVzcG9uc2UtPmJvZHkgPSBudWxsOwoJCSR0aGlzLT5yZXNwb25zZS0+aGVhZGVycyA9IGFycmF5KCk7Cgl9CgoKCS8qKgoJKiBTZXQgcmVxdWVzdCBwYXJhbWV0ZXIKCSoKCSogQHBhcmFtIHN0cmluZyAka2V5IEtleQoJKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBWYWx1ZQoJKiBAcmV0dXJuIHZvaWQKCSovCglwdWJsaWMgZnVuY3Rpb24gc2V0UGFyYW1ldGVyKCRrZXksICR2YWx1ZSkKCXsKCQkkdGhpcy0+cGFyYW1ldGVyc1ska2V5XSA9ICR2YWx1ZTsKCX0KCgoJLyoqCgkqIFNldCByZXF1ZXN0IGhlYWRlcgoJKgoJKiBAcGFyYW0gc3RyaW5nICRrZXkgS2V5CgkqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFZhbHVlCgkqIEByZXR1cm4gdm9pZAoJKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXIoJGtleSwgJHZhbHVlKQoJewoJCSR0aGlzLT5oZWFkZXJzWyRrZXldID0gJHZhbHVlOwoJfQoKCgkvKioKCSogU2V0IHgtYW16LW1ldGEtKiBoZWFkZXIKCSoKCSogQHBhcmFtIHN0cmluZyAka2V5IEtleQoJKiBAcGFyYW0gc3RyaW5nICR2YWx1ZSBWYWx1ZQoJKiBAcmV0dXJuIHZvaWQKCSovCglwdWJsaWMgZnVuY3Rpb24gc2V0QW16SGVhZGVyKCRrZXksICR2YWx1ZSkKCXsKCQkkdGhpcy0+YW16SGVhZGVyc1ska2V5XSA9ICR2YWx1ZTsKCX0KCgoJLyoqCgkqIEdldCB0aGUgUzMgcmVzcG9uc2UKCSoKCSogQHJldHVybiBvYmplY3QgfCBmYWxzZQoJKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRSZXNwb25zZSgpCgl7CgkJJHF1ZXJ5ID0gJyc7CgkJaWYgKHNpemVvZigkdGhpcy0+cGFyYW1ldGVycykgPiAwKQoJCXsKCQkJJHF1ZXJ5ID0gc3Vic3RyKCR0aGlzLT51cmksIC0xKSAhPT0gJz8nID8gJz8nIDogJyYnOwoJCQlmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkdmFyID0+ICR2YWx1ZSkKCQkJCWlmICgkdmFsdWUgPT0gbnVsbCB8fCAkdmFsdWUgPT0gJycpICRxdWVyeSAuPSAkdmFyLicmJzsKCQkJCWVsc2UgJHF1ZXJ5IC49ICR2YXIuJz0nLnJhd3VybGVuY29kZSgkdmFsdWUpLicmJzsKCQkJJHF1ZXJ5ID0gc3Vic3RyKCRxdWVyeSwgMCwgLTEpOwoJCQkkdGhpcy0+dXJpIC49ICRxdWVyeTsKCgkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCdhY2wnLCAkdGhpcy0+cGFyYW1ldGVycykgfHwKCQkJYXJyYXlfa2V5X2V4aXN0cygnbG9jYXRpb24nLCAkdGhpcy0+cGFyYW1ldGVycykgfHwKCQkJYXJyYXlfa2V5X2V4aXN0cygndG9ycmVudCcsICR0aGlzLT5wYXJhbWV0ZXJzKSB8fAoJCQlhcnJheV9rZXlfZXhpc3RzKCd3ZWJzaXRlJywgJHRoaXMtPnBhcmFtZXRlcnMpIHx8CgkJCWFycmF5X2tleV9leGlzdHMoJ2xvZ2dpbmcnLCAkdGhpcy0+cGFyYW1ldGVycykpCgkJCQkkdGhpcy0+cmVzb3VyY2UgLj0gJHF1ZXJ5OwoJCX0KCQkkdXJsID0gKFMzOjokdXNlU1NMID8gJ2h0dHBzOi8vJyA6ICdodHRwOi8vJykgLiAoJHRoaXMtPmhlYWRlcnNbJ0hvc3QnXSAhPT0gJycgPyAkdGhpcy0+aGVhZGVyc1snSG9zdCddIDogJHRoaXMtPmVuZHBvaW50KSAuICR0aGlzLT51cmk7CgoJCS8vdmFyX2R1bXAoJ2J1Y2tldDogJyAuICR0aGlzLT5idWNrZXQsICd1cmk6ICcgLiAkdGhpcy0+dXJpLCAncmVzb3VyY2U6ICcgLiAkdGhpcy0+cmVzb3VyY2UsICd1cmw6ICcgLiAkdXJsKTsKCgkJLy8gQmFzaWMgc2V0dXAKCQkkY3VybCA9IGN1cmxfaW5pdCgpOwoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ1MzL3BocCcpOwoKCQlpZiAoUzM6OiR1c2VTU0wpCgkJewoJCQkvLyBTU0wgVmFsaWRhdGlvbiBjYW4gbm93IGJlIG9wdGlvbmFsIGZvciB0aG9zZSB3aXRoIGJyb2tlbiBPcGVuU1NMIGluc3RhbGxhdGlvbnMKCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIFMzOjokdXNlU1NMVmFsaWRhdGlvbiA/IDIgOiAwKTsKCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIFMzOjokdXNlU1NMVmFsaWRhdGlvbiA/IDEgOiAwKTsKCgkJCWlmIChTMzo6JHNzbEtleSAhPT0gbnVsbCkgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfU1NMS0VZLCBTMzo6JHNzbEtleSk7CgkJCWlmIChTMzo6JHNzbENlcnQgIT09IG51bGwpIGN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1NTTENFUlQsIFMzOjokc3NsQ2VydCk7CgkJCWlmIChTMzo6JHNzbENBQ2VydCAhPT0gbnVsbCkgY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfQ0FJTkZPLCBTMzo6JHNzbENBQ2VydCk7CgkJfQoKCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICR1cmwpOwoKCQlpZiAoUzM6OiRwcm94eSAhPSBudWxsICYmIGlzc2V0KFMzOjokcHJveHlbJ2hvc3QnXSkpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QUk9YWSwgUzM6OiRwcm94eVsnaG9zdCddKTsKCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUFJPWFlUWVBFLCBTMzo6JHByb3h5Wyd0eXBlJ10pOwoJCQlpZiAoaXNzZXQoUzM6OiRwcm94eVsndXNlciddLCBTMzo6JHByb3h5WydwYXNzJ10pICYmIFMzOjokcHJveHlbJ3VzZXInXSAhPSBudWxsICYmIFMzOjokcHJveHlbJ3Bhc3MnXSAhPSBudWxsKQoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUFJPWFlVU0VSUFdELCBzcHJpbnRmKCclczolcycsIFMzOjokcHJveHlbJ3VzZXInXSwgUzM6OiRwcm94eVsncGFzcyddKSk7CgkJfQoKCQkvLyBIZWFkZXJzCgkJJGhlYWRlcnMgPSBhcnJheSgpOyAkYW16ID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkdGhpcy0+YW16SGVhZGVycyBhcyAkaGVhZGVyID0+ICR2YWx1ZSkKCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgJGhlYWRlcnNbXSA9ICRoZWFkZXIuJzogJy4kdmFsdWU7CgkJZm9yZWFjaCAoJHRoaXMtPmhlYWRlcnMgYXMgJGhlYWRlciA9PiAkdmFsdWUpCgkJCWlmIChzdHJsZW4oJHZhbHVlKSA+IDApICRoZWFkZXJzW10gPSAkaGVhZGVyLic6ICcuJHZhbHVlOwoKCQkvLyBDb2xsZWN0IEFNWiBoZWFkZXJzIGZvciBzaWduYXR1cmUKCQlmb3JlYWNoICgkdGhpcy0+YW16SGVhZGVycyBhcyAkaGVhZGVyID0+ICR2YWx1ZSkKCQkJaWYgKHN0cmxlbigkdmFsdWUpID4gMCkgJGFteltdID0gc3RydG9sb3dlcigkaGVhZGVyKS4nOicuJHZhbHVlOwoKCQkvLyBBTVogaGVhZGVycyBtdXN0IGJlIHNvcnRlZAoJCWlmIChzaXplb2YoJGFteikgPiAwKQoJCXsKCQkJLy9zb3J0KCRhbXopOwoJCQl1c29ydCgkYW16LCBhcnJheSgmJHRoaXMsICdfX3NvcnRNZXRhSGVhZGVyc0NtcCcpKTsKCQkJJGFteiA9ICJcbiIuaW1wbG9kZSgiXG4iLCAkYW16KTsKCQl9IGVsc2UgJGFteiA9ICcnOwoKCQlpZiAoUzM6Omhhc0F1dGgoKSkKCQl7CgkJCS8vIEF1dGhvcml6YXRpb24gc3RyaW5nIChDbG91ZEZyb250IHN0cmluZ1RvU2lnbiBzaG91bGQgb25seSBjb250YWluIGEgZGF0ZSkKCQkJaWYgKCR0aGlzLT5oZWFkZXJzWydIb3N0J10gPT0gJ2Nsb3VkZnJvbnQuYW1hem9uYXdzLmNvbScpCgkJCQkkaGVhZGVyc1tdID0gJ0F1dGhvcml6YXRpb246ICcgLiBTMzo6X19nZXRTaWduYXR1cmUoJHRoaXMtPmhlYWRlcnNbJ0RhdGUnXSk7CgkJCWVsc2UKCQkJewoJCQkJJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiAnIC4gUzM6Ol9fZ2V0U2lnbmF0dXJlKAoJCQkJCSR0aGlzLT52ZXJiLiJcbiIuCgkJCQkJJHRoaXMtPmhlYWRlcnNbJ0NvbnRlbnQtTUQ1J10uIlxuIi4KCQkJCQkkdGhpcy0+aGVhZGVyc1snQ29udGVudC1UeXBlJ10uIlxuIi4KCQkJCQkkdGhpcy0+aGVhZGVyc1snRGF0ZSddLiRhbXouIlxuIi4KCQkJCQkkdGhpcy0+cmVzb3VyY2UKCQkJCSk7CgkJCX0KCQl9CgoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsKCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsKCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgZmFsc2UpOwoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGFycmF5KCYkdGhpcywgJ19fcmVzcG9uc2VXcml0ZUNhbGxiYWNrJykpOwoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0hFQURFUkZVTkNUSU9OLCBhcnJheSgmJHRoaXMsICdfX3Jlc3BvbnNlSGVhZGVyQ2FsbGJhY2snKSk7CgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOwoKCQkvLyBSZXF1ZXN0IHR5cGVzCgkJc3dpdGNoICgkdGhpcy0+dmVyYikKCQl7CgkJCWNhc2UgJ0dFVCc6IGJyZWFrOwoJCQljYXNlICdQVVQnOiBjYXNlICdQT1NUJzogLy8gUE9TVCBvbmx5IHVzZWQgZm9yIENsb3VkRnJvbnQKCQkJCWlmICgkdGhpcy0+ZnAgIT09IGZhbHNlKQoJCQkJewoJCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BVVCwgdHJ1ZSk7CgkJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfSU5GSUxFLCAkdGhpcy0+ZnApOwoJCQkJCWlmICgkdGhpcy0+c2l6ZSA+PSAwKQoJCQkJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCAkdGhpcy0+c2l6ZSk7CgkJCQl9CgkJCQllbHNlaWYgKCR0aGlzLT5kYXRhICE9PSBmYWxzZSkKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAkdGhpcy0+dmVyYik7CgkJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPmRhdGEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICR0aGlzLT52ZXJiKTsKCQkJYnJlYWs7CgkJCWNhc2UgJ0hFQUQnOgoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJ0hFQUQnKTsKCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX05PQk9EWSwgdHJ1ZSk7CgkJCWJyZWFrOwoJCQljYXNlICdERUxFVEUnOgoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJ0RFTEVURScpOwoJCQlicmVhazsKCQkJZGVmYXVsdDogYnJlYWs7CgkJfQoKCQkvLyBFeGVjdXRlLCBncmFiIGVycm9ycwoJCWlmIChjdXJsX2V4ZWMoJGN1cmwpKQoJCQkkdGhpcy0+cmVzcG9uc2UtPmNvZGUgPSBjdXJsX2dldGluZm8oJGN1cmwsIENVUkxJTkZPX0hUVFBfQ09ERSk7CgkJZWxzZQoJCQkkdGhpcy0+cmVzcG9uc2UtPmVycm9yID0gYXJyYXkoCgkJCQknY29kZScgPT4gY3VybF9lcnJubygkY3VybCksCgkJCQknbWVzc2FnZScgPT4gY3VybF9lcnJvcigkY3VybCksCgkJCQkncmVzb3VyY2UnID0+ICR0aGlzLT5yZXNvdXJjZQoJCQkpOwoKCQlAY3VybF9jbG9zZSgkY3VybCk7CgoJCS8vIFBhcnNlIGJvZHkgaW50byBYTUwKCQlpZiAoJHRoaXMtPnJlc3BvbnNlLT5lcnJvciA9PT0gZmFsc2UgJiYgaXNzZXQoJHRoaXMtPnJlc3BvbnNlLT5oZWFkZXJzWyd0eXBlJ10pICYmCgkJJHRoaXMtPnJlc3BvbnNlLT5oZWFkZXJzWyd0eXBlJ10gPT0gJ2FwcGxpY2F0aW9uL3htbCcgJiYgaXNzZXQoJHRoaXMtPnJlc3BvbnNlLT5ib2R5KSkKCQl7CgkJCSR0aGlzLT5yZXNwb25zZS0+Ym9keSA9IHNpbXBsZXhtbF9sb2FkX3N0cmluZygkdGhpcy0+cmVzcG9uc2UtPmJvZHkpOwoKCQkJLy8gR3JhYiBTMyBlcnJvcnMKCQkJaWYgKCFpbl9hcnJheSgkdGhpcy0+cmVzcG9uc2UtPmNvZGUsIGFycmF5KDIwMCwgMjA0LCAyMDYpKSAmJgoJCQlpc3NldCgkdGhpcy0+cmVzcG9uc2UtPmJvZHktPkNvZGUsICR0aGlzLT5yZXNwb25zZS0+Ym9keS0+TWVzc2FnZSkpCgkJCXsKCQkJCSR0aGlzLT5yZXNwb25zZS0+ZXJyb3IgPSBhcnJheSgKCQkJCQknY29kZScgPT4gKHN0cmluZykkdGhpcy0+cmVzcG9uc2UtPmJvZHktPkNvZGUsCgkJCQkJJ21lc3NhZ2UnID0+IChzdHJpbmcpJHRoaXMtPnJlc3BvbnNlLT5ib2R5LT5NZXNzYWdlCgkJCQkpOwoJCQkJaWYgKGlzc2V0KCR0aGlzLT5yZXNwb25zZS0+Ym9keS0+UmVzb3VyY2UpKQoJCQkJCSR0aGlzLT5yZXNwb25zZS0+ZXJyb3JbJ3Jlc291cmNlJ10gPSAoc3RyaW5nKSR0aGlzLT5yZXNwb25zZS0+Ym9keS0+UmVzb3VyY2U7CgkJCQl1bnNldCgkdGhpcy0+cmVzcG9uc2UtPmJvZHkpOwoJCQl9CgkJfQoKCQkvLyBDbGVhbiB1cCBmaWxlIHJlc291cmNlcwoJCWlmICgkdGhpcy0+ZnAgIT09IGZhbHNlICYmIGlzX3Jlc291cmNlKCR0aGlzLT5mcCkpIGZjbG9zZSgkdGhpcy0+ZnApOwoKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwoJfQoKCS8qKgoJKiBTb3J0IGNvbXBhcmUgZm9yIG1ldGEgaGVhZGVycwoJKgoJKiBAaW50ZXJuYWwgVXNlZCB0byBzb3J0IHgtYW16IG1ldGEgaGVhZGVycwoJKiBAcGFyYW0gc3RyaW5nICRhIFN0cmluZyBBCgkqIEBwYXJhbSBzdHJpbmcgJGIgU3RyaW5nIEIKCSogQHJldHVybiBpbnRlZ2VyCgkqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfX3NvcnRNZXRhSGVhZGVyc0NtcCgkYSwgJGIpCgl7CgkJJGxlbkEgPSBzdHJwb3MoJGEsICc6Jyk7CgkJJGxlbkIgPSBzdHJwb3MoJGIsICc6Jyk7CgkJJG1pbkxlbiA9IG1pbigkbGVuQSwgJGxlbkIpOwoJCSRuY21wID0gc3RybmNtcCgkYSwgJGIsICRtaW5MZW4pOwoJCWlmICgkbGVuQSA9PSAkbGVuQikgcmV0dXJuICRuY21wOwoJCWlmICgwID09ICRuY21wKSByZXR1cm4gJGxlbkEgPCAkbGVuQiA/IC0xIDogMTsKCQlyZXR1cm4gJG5jbXA7Cgl9CgoJLyoqCgkqIENVUkwgd3JpdGUgY2FsbGJhY2sKCSoKCSogQHBhcmFtIHJlc291cmNlICYkY3VybCBDVVJMIHJlc291cmNlCgkqIEBwYXJhbSBzdHJpbmcgJiRkYXRhIERhdGEKCSogQHJldHVybiBpbnRlZ2VyCgkqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfX3Jlc3BvbnNlV3JpdGVDYWxsYmFjaygmJGN1cmwsICYkZGF0YSkKCXsKCQlpZiAoaW5fYXJyYXkoJHRoaXMtPnJlc3BvbnNlLT5jb2RlLCBhcnJheSgyMDAsIDIwNikpICYmICR0aGlzLT5mcCAhPT0gZmFsc2UpCgkJCXJldHVybiBmd3JpdGUoJHRoaXMtPmZwLCAkZGF0YSk7CgkJZWxzZQoJCQkkdGhpcy0+cmVzcG9uc2UtPmJvZHkgLj0gJGRhdGE7CgkJcmV0dXJuIHN0cmxlbigkZGF0YSk7Cgl9CgoKCS8qKgoJKiBDaGVjayBETlMgY29uZm9ybWl0eQoJKgoJKiBAcGFyYW0gc3RyaW5nICRidWNrZXQgQnVja2V0IG5hbWUKCSogQHJldHVybiBib29sZWFuCgkqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfX2Ruc0J1Y2tldE5hbWUoJGJ1Y2tldCkKCXsKCQlpZiAoc3RybGVuKCRidWNrZXQpID4gNjMgfHwgcHJlZ19tYXRjaCgiL1teYS16MC05XC4tXS8iLCAkYnVja2V0KSA+IDApIHJldHVybiBmYWxzZTsKCQlpZiAoc3Ryc3RyKCRidWNrZXQsICctLicpICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoJCWlmIChzdHJzdHIoJGJ1Y2tldCwgJy4uJykgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CgkJaWYgKCFwcmVnX21hdGNoKCIvXlswLTlhLXpdLyIsICRidWNrZXQpKSByZXR1cm4gZmFsc2U7CgkJaWYgKCFwcmVnX21hdGNoKCIvWzAtOWEtel0kLyIsICRidWNrZXQpKSByZXR1cm4gZmFsc2U7CgkJcmV0dXJuIHRydWU7Cgl9CgoKCS8qKgoJKiBDVVJMIGhlYWRlciBjYWxsYmFjawoJKgoJKiBAcGFyYW0gcmVzb3VyY2UgJiRjdXJsIENVUkwgcmVzb3VyY2UKCSogQHBhcmFtIHN0cmluZyAmJGRhdGEgRGF0YQoJKiBAcmV0dXJuIGludGVnZXIKCSovCglwcml2YXRlIGZ1bmN0aW9uIF9fcmVzcG9uc2VIZWFkZXJDYWxsYmFjaygmJGN1cmwsICYkZGF0YSkKCXsKCQlpZiAoKCRzdHJsZW4gPSBzdHJsZW4oJGRhdGEpKSA8PSAyKSByZXR1cm4gJHN0cmxlbjsKCQlpZiAoc3Vic3RyKCRkYXRhLCAwLCA0KSA9PSAnSFRUUCcpCgkJCSR0aGlzLT5yZXNwb25zZS0+Y29kZSA9IChpbnQpc3Vic3RyKCRkYXRhLCA5LCAzKTsKCQllbHNlCgkJewoJCQkkZGF0YSA9IHRyaW0oJGRhdGEpOwoJCQlpZiAoc3RycG9zKCRkYXRhLCAnOiAnKSA9PT0gZmFsc2UpIHJldHVybiAkc3RybGVuOwoJCQlsaXN0KCRoZWFkZXIsICR2YWx1ZSkgPSBleHBsb2RlKCc6ICcsICRkYXRhLCAyKTsKCQkJaWYgKCRoZWFkZXIgPT0gJ0xhc3QtTW9kaWZpZWQnKQoJCQkJJHRoaXMtPnJlc3BvbnNlLT5oZWFkZXJzWyd0aW1lJ10gPSBzdHJ0b3RpbWUoJHZhbHVlKTsKCQkJZWxzZWlmICgkaGVhZGVyID09ICdDb250ZW50LUxlbmd0aCcpCgkJCQkkdGhpcy0+cmVzcG9uc2UtPmhlYWRlcnNbJ3NpemUnXSA9IChpbnQpJHZhbHVlOwoJCQllbHNlaWYgKCRoZWFkZXIgPT0gJ0NvbnRlbnQtVHlwZScpCgkJCQkkdGhpcy0+cmVzcG9uc2UtPmhlYWRlcnNbJ3R5cGUnXSA9ICR2YWx1ZTsKCQkJZWxzZWlmICgkaGVhZGVyID09ICdFVGFnJykKCQkJCSR0aGlzLT5yZXNwb25zZS0+aGVhZGVyc1snaGFzaCddID0gJHZhbHVlezB9ID09ICciJyA/IHN1YnN0cigkdmFsdWUsIDEsIC0xKSA6ICR2YWx1ZTsKCQkJZWxzZWlmIChwcmVnX21hdGNoKCcvXngtYW16LW1ldGEtLiokLycsICRoZWFkZXIpKQoJCQkJJHRoaXMtPnJlc3BvbnNlLT5oZWFkZXJzWyRoZWFkZXJdID0gJHZhbHVlOwoJCX0KCQlyZXR1cm4gJHN0cmxlbjsKCX0KCn0KCi8qKgogKiBTMyBleGNlcHRpb24gY2xhc3MKICoKICogQGxpbmsgaHR0cDovL3VuZGVzaWduZWQub3JnLnphLzIwMDcvMTAvMjIvYW1hem9uLXMzLXBocC1jbGFzcwogKiBAdmVyc2lvbiAwLjUuMC1kZXYKICovCgpjbGFzcyBTM0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CgkvKioKCSAqIENsYXNzIGNvbnN0cnVjdG9yCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSBFeGNlcHRpb24gbWVzc2FnZQoJICogQHBhcmFtIHN0cmluZyAkZmlsZSBGaWxlIGluIHdoaWNoIGV4Y2VwdGlvbiB3YXMgY3JlYXRlZAoJICogQHBhcmFtIHN0cmluZyAkbGluZSBMaW5lIG51bWJlciBvbiB3aGljaCBleGNlcHRpb24gd2FzIGNyZWF0ZWQKCSAqIEBwYXJhbSBpbnQgJGNvZGUgRXhjZXB0aW9uIGNvZGUKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRmaWxlLCAkbGluZSwgJGNvZGUgPSAwKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKCQkkdGhpcy0+ZmlsZSA9ICRmaWxlOwoJCSR0aGlzLT5saW5lID0gJGxpbmU7Cgl9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/fielddef/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fielddef/admin.AmazonS3.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRmaWVsZGRlZi0+TW9kTGFuZygnZmllbGRkZWZfQW1hem9uUzNfYWNjZXNza2V5Jyl9OjwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWN1c3RvbV9pbnB1dFthY2Nlc3NrZXldIiB2YWx1ZT0ieyRmaWVsZGRlZi0+R2V0T3B0aW9uVmFsdWUoJ2FjY2Vzc2tleScpfSIgLz4KCTwvcD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZpZWxkZGVmLT5Nb2RMYW5nKCdmaWVsZGRlZl9BbWF6b25TM19hY2Nlc3NzZWNyZXQnKX06PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y3VzdG9tX2lucHV0W2FjY2Vzc3NlY3JldF0iIHZhbHVlPSJ7JGZpZWxkZGVmLT5HZXRPcHRpb25WYWx1ZSgnYWNjZXNzc2VjcmV0Jyl9IiAvPgoJPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskZmllbGRkZWYtPk1vZExhbmcoJ2ZpZWxkZGVmX0FtYXpvblMzX2J1Y2tldCcpfTo8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ieyRhY3Rpb25pZH1jdXN0b21faW5wdXRbYnVja2V0XSIgdmFsdWU9InskZmllbGRkZWYtPkdldE9wdGlvblZhbHVlKCdidWNrZXQnKX0iIC8+Cgk8L3A+CjwvZGl2Pgp7Kgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGZpZWxkZGVmLT5Nb2RMYW5nKCdmaWVsZGRlZl9BbWF6b25TM19kaXInKX06PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9Y3VzdG9tX2lucHV0W2Rpcl0iIHZhbHVlPSJ7JGZpZWxkZGVmLT5HZXRPcHRpb25WYWx1ZSgnZGlyJyl9IiAvPgoJPC9wPgo8L2Rpdj4KKn0=]]></data>
	</file>
	<file>
	  <filename>/lib/fielddef/input.AmazonS3.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRmaWVsZGRlZi0+R2V0TmFtZSgpfXtpZiAkZmllbGRkZWYtPklzUmVxdWlyZWQoKX0qey9pZn06PC9wPgoJPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJe2lmICRmaWVsZGRlZi0+R2V0RmlsZXMoKX0KCgkJCXtodG1sX29wdGlvbnMgbmFtZT0iYCRhY3Rpb25pZGBjdXN0b21maWVsZFtgJGZpZWxkZGVmLT5HZXRJZCgpYF0iIG9wdGlvbnM9JGZpZWxkZGVmLT5HZXRGaWxlcygpIHNlbGVjdGVkPSRmaWVsZGRlZi0+R2V0VmFsdWUoKX0KCQkJPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InskYWN0aW9uaWR9Y3VzdG9tZmllbGRbeyRmaWVsZGRlZi0+R2V0SWQoKX1dIj4KCQl7ZWxzZX0KCQkKCQkJPGRpdiBjbGFzcz0icmVkIj4KCQkJCTxwPnskZmllbGRkZWYtPk1vZExhbmcoJ2Nvbm5lY3RfZXJyb3InKX08L3A+CgkJCTwvZGl2PgoJCXsvaWZ9Cgk8L3A+CjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/fielddef/listit2eh.AmazonS3.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIE9saXZlciBTZWRkb24sIDxvbGl2ZXJAdGhyZWVmb2xkLmNvLnVrPgojIFdlYjogd3d3LnRocmVlZm9sZC5jby51awojCiMgVGFwaW8gTPZ5dHR5LCA8dGFwc2FAb3JhbmdlLW1lZGlhLmZpPgojIFdlYjogd3d3Lm9yYW5nZS1tZWRpYS5maQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIGxpc3RpdDJlaF9BbWF6b25TMyBleHRlbmRzIExpc3RJdDJFdmVudEhhbmRsZXJCYXNlCnsKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgVmFyaWFibGVzCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQoKCXByaXZhdGUgJF9kYXRhOwoKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgTWFnaWMgbWV0aG9kcwoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJCgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMaXN0SXQyRmllbGRkZWZCYXNlICYkZmllbGQpCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkZmllbGQpOwoJfQoJCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkjIE92ZXJ3cml0YWJsZSBldmVudHMKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0JCgoJcHVibGljIGZ1bmN0aW9uIEl0ZW1TYXZlUHJlUHJvY2VzcygmJGVycm9ycywgJiRwYXJhbXMpIAoJewkJCQoJCS8vIEZpbGwgX2RhdGEgZnJvbSAkX0ZJTEVTCgkJJGZpbGVzID0gc2VsZjo6X2RpdmVyc2VfYXJyYXkoJF9GSUxFU1snbTFfY3VzdG9tZmllbGQnXSk7IC8vIDwtICRpZCBpcyBzdGF0aWNhbGx5IHBhcnQgb2Yga2V5LCBub3QgaWRlYWwuCgkJaWYoaXNzZXQoJGZpbGVzWyR0aGlzLT5HZXRJZCgpXSkpCgkJCSR0aGlzLT5fZGF0YSA9ICRmaWxlc1skdGhpcy0+R2V0SWQoKV07IC8vIDwtIE15IGFzc3VtcHRpb24gaXMgdGhhdCAkX0ZJTEVTIGNvbnRhaW5zIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCB0aGVyZSBmb3JlIGFycmF5IGlzIGNvbXBsZXRlLiBBbSBpIHdyb25nPyAxICsgMSA9IDIhCgoJCS8vIENoZWNrIHRoYXQgX2RhdGEgaXMgdmFsaWQKCQlpZihpc3NldCgkdGhpcy0+X2RhdGEpICYmICR0aGlzLT5fZGF0YVsnZXJyb3InXSA9PT0gMCkgewkJCQkKCgkJCSRidWNrZXQgPSAkdGhpcy0+R2V0T3B0aW9uVmFsdWUoJ2J1Y2tldCcpOwoJCQkKCQkJLy9jcmVhdGUgYSBuZXcgYnVja2V0CgkJCSR0aGlzLT5HZXRTMygpLT5wdXRCdWNrZXQoJGJ1Y2tldCwgUzM6OkFDTF9QVUJMSUNfUkVBRCk7CgkJCQkKCQkJLy9tb3ZlIHRoZSBmaWxlCgkJCWlmICghJHRoaXMtPkdldFMzKCktPnB1dE9iamVjdEZpbGUoJHRoaXMtPl9kYXRhWyd0bXBfbmFtZSddLCAkYnVja2V0LCAkdGhpcy0+X2RhdGFbJ25hbWUnXSwgUzM6OkFDTF9QVUJMSUNfUkVBRCkpIHsKCQkJCQoJCQkJJGVycm9yc1tdID0gJHRoaXMtPk1vZExhbmcoJ2Vycm9yX2ZhaWxlZF90b191cGxvYWQnKSAuICcgKCcgLiAkdGhpcy0+R2V0TmFtZSgpIC4gJyknOwoJCQl9CQkJCgkJCQoJCQkvLyBTZXQgVmFsdWUgZnJvbSBfZGF0YQoJCQlpZihlbXB0eSgkZXJyb3JzKSkgewoJCQkJCgkJCQkkdGhpcy0+U2V0VmFsdWUoJHRoaXMtPl9kYXRhWyduYW1lJ10pOwoJCQl9CQkJCgkJfQoJCgkJcGFyZW50OjpJdGVtU2F2ZVByZVByb2Nlc3MoJGVycm9ycywgJHBhcmFtcyk7Cgl9CQoKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgUHJpdmF0ZSBtZXRob2RzCgkjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfZGl2ZXJzZV9hcnJheSgkdmVjdG9yKSB7CgkJCgkJJHJlc3VsdCA9IGFycmF5KCk7CgkJZm9yZWFjaCgkdmVjdG9yIGFzICRrZXkxID0+ICR2YWx1ZTEpIHsKCQkKCQkJZm9yZWFjaCgkdmFsdWUxIGFzICRrZXkyID0+ICR2YWx1ZTIpIHsKCQkKCQkJCSRyZXN1bHRbJGtleTJdWyRrZXkxXSA9ICR2YWx1ZTI7CgkJCX0KCQl9CgkJCgkJcmV0dXJuICRyZXN1bHQ7Cgl9IAkKCQp9IC8vIGVuZCBvZiBjbGFzcwoKPz4J]]></data>
	</file>
	<file>
	  <filename>/lib/fielddef/listit2fd.AmazonS3.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIE9saXZlciBTZWRkb24sIDxvbGl2ZXJAdGhyZWVmb2xkLmNvLnVrPg0KIyBXZWI6IHd3dy50aHJlZWZvbGQuY28udWsNCiMNCiMgVGFwaW8gTPZ5dHR5LCA8dGFwc2FAb3JhbmdlLW1lZGlhLmZpPg0KIyBXZWI6IHd3dy5vcmFuZ2UtbWVkaWEuZmkNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBDQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwNCiMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNsYXNzIGxpc3RpdDJmZF9BbWF6b25TMyBleHRlbmRzIExpc3RJdDJGaWVsZGRlZkJhc2UNCnsNCglwcml2YXRlICRfczM7DQoNCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJiRkYl9pbmZvKSANCgl7CQ0KCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCRkYl9pbmZvKTsNCgkJDQoJCSR0aGlzLT5TZXRGcmllbmRseVR5cGUoJHRoaXMtPk1vZExhbmcoJ2ZpZWxkZGVmXycuJHRoaXMtPkdldFR5cGUoKSkpOw0KCX0NCgkNCglwdWJsaWMgZnVuY3Rpb24gR2V0UzMoKQ0KCXsNCgkJaWYoaXNzZXQoJHRoaXMtPl9zMykpDQoJCQlyZXR1cm4gJHRoaXMtPl9zMzsNCg0KCQkkYWNjZXNza2V5ID0gJHRoaXMtPkdldE9wdGlvblZhbHVlKCdhY2Nlc3NrZXknKTsNCgkJJGFjY2Vzc3NlY3JldCA9ICR0aGlzLT5HZXRPcHRpb25WYWx1ZSgnYWNjZXNzc2VjcmV0Jyk7DQoJCQkNCgkJJHRoaXMtPl9zMyA9IG5ldyBTMygkYWNjZXNza2V5LCAkYWNjZXNzc2VjcmV0KTsNCgkJDQoJCXJldHVybiAkdGhpcy0+R2V0UzMoKTsJDQoJfQ0KDQoJcHVibGljIGZ1bmN0aW9uIEdldEZpbGVzKCkNCgl7CQ0KCQkkYnVja2V0ID0gJHRoaXMtPkdldE9wdGlvblZhbHVlKCdidWNrZXQnKTsNCgkJJGNvbnRlbnRzID0gQCR0aGlzLT5HZXRTMygpLT5nZXRCdWNrZXQoJGJ1Y2tldCk7DQoNCgkJaWYoISRjb250ZW50cykNCgkJCXJldHVybiBGQUxTRTsNCgkJDQoJCSRvdXRwdXQgPSBhcnJheSgpOw0KCQlmb3JlYWNoKCRjb250ZW50cyBhcyAkZmlsZSkgew0KCQkNCgkJCSRmbmFtZSA9ICRmaWxlWyduYW1lJ107DQoJCQkkb3V0cHV0W3RyaW0oJGZuYW1lKV0gPSB0cmltKCRmbmFtZSk7DQoJCX0NCgkJDQoJCXJldHVybiAkb3V0cHV0Ow0KCX0NCgkNCglwdWJsaWMgZnVuY3Rpb24gR2V0VVJMVmFsdWUoKQ0KCXsNCgkJJGJ1Y2tldCA9ICR0aGlzLT5HZXRPcHRpb25WYWx1ZSgnYnVja2V0Jyk7DQoJCQ0KCQlyZXR1cm4gImh0dHA6Ly8iLiAkYnVja2V0IC4gIi4iIC4gUzM6OiRlbmRwb2ludCAuICIvIi4gJHRoaXMtPkdldFZhbHVlKCk7DQoJfQ0KDQp9IC8vIGVuZCBvZiBjbGFzcw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/ListIt2Amazon.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIE9saXZlciBTZWRkb24sIDxvbGl2ZXJAdGhyZWVmb2xkLmNvLnVrPgojIFdlYjogd3d3LnRocmVlZm9sZC5jby51awojCiMgVGFwaW8gTPZ5dHR5LCA8dGFwc2FAb3JhbmdlLW1lZGlhLmZpPgojIFdlYjogd3d3Lm9yYW5nZS1tZWRpYS5maQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIExpc3RJdDJBbWF6b24gZXh0ZW5kcyBDTVNNb2R1bGUgewogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIAoJewogICAgICAgIHJldHVybiBnZXRfY2xhc3MoJHRoaXMpOwogICAgfQogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgCgl7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2R1bGVfZnJpZW5kbHluYW1lJyk7CiAgICB9CgkKICAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgCgl7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2R1bGVfZGVzY3JpcHRpb24nKTsKICAgIH0gIAkKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSAKCXsKICAgICAgICByZXR1cm4gJzEuMCc7CiAgICB9CgkKCXB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpCgl7CgkJcmV0dXJuICcxLjExJzsKCX0KCglmdW5jdGlvbiBHZXRIZWxwKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKCX0JCgkKCXB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKQoJewoJCXJldHVybiAnT2xpdmVyIFNlZGRvbic7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkKCXsKCQlyZXR1cm4gJ29saXZlckB0aHJlZWZvbGQuY28udWsnOwoJfQkgCgkKCXB1YmxpYyBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKQoJewoJCXJldHVybiBAZmlsZV9nZXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9jaGFuZ2Vsb2cuaHRtbCcpOwoJfQkKfSAvL2VuZCBvZiBjbGFzcwo/Pg==]]></data>
	</file>
</module>
